diff options
Diffstat (limited to 'runtime/art_method-inl.h')
-rw-r--r-- | runtime/art_method-inl.h | 154 |
1 files changed, 0 insertions, 154 deletions
diff --git a/runtime/art_method-inl.h b/runtime/art_method-inl.h index d8da9129ed..f2541160ff 100644 --- a/runtime/art_method-inl.h +++ b/runtime/art_method-inl.h @@ -367,160 +367,6 @@ inline bool ArtMethod::HasSingleImplementation() { return (GetAccessFlags() & kAccSingleImplementation) != 0; } -inline hiddenapi::ApiList ArtMethod::GetHiddenApiAccessFlags() - REQUIRES_SHARED(Locks::mutator_lock_) { - if (UNLIKELY(IsIntrinsic())) { - switch (static_cast<Intrinsics>(GetIntrinsic())) { - case Intrinsics::kSystemArrayCopyChar: - case Intrinsics::kStringGetCharsNoCheck: - case Intrinsics::kReferenceGetReferent: - case Intrinsics::kMemoryPeekByte: - case Intrinsics::kMemoryPokeByte: - case Intrinsics::kUnsafeCASInt: - case Intrinsics::kUnsafeCASLong: - case Intrinsics::kUnsafeCASObject: - case Intrinsics::kUnsafeGet: - case Intrinsics::kUnsafeGetAndAddInt: - case Intrinsics::kUnsafeGetAndAddLong: - case Intrinsics::kUnsafeGetAndSetInt: - case Intrinsics::kUnsafeGetAndSetLong: - case Intrinsics::kUnsafeGetAndSetObject: - case Intrinsics::kUnsafeGetLong: - case Intrinsics::kUnsafeGetLongVolatile: - case Intrinsics::kUnsafeGetObject: - case Intrinsics::kUnsafeGetObjectVolatile: - case Intrinsics::kUnsafeGetVolatile: - case Intrinsics::kUnsafePut: - case Intrinsics::kUnsafePutLong: - case Intrinsics::kUnsafePutLongOrdered: - case Intrinsics::kUnsafePutLongVolatile: - case Intrinsics::kUnsafePutObject: - case Intrinsics::kUnsafePutObjectOrdered: - case Intrinsics::kUnsafePutObjectVolatile: - case Intrinsics::kUnsafePutOrdered: - case Intrinsics::kUnsafePutVolatile: - case Intrinsics::kUnsafeLoadFence: - case Intrinsics::kUnsafeStoreFence: - case Intrinsics::kUnsafeFullFence: - case Intrinsics::kCRC32Update: - // These intrinsics are on the light greylist and will fail a DCHECK in - // SetIntrinsic() if their flags change on the respective dex methods. - // Note that the DCHECK currently won't fail if the dex methods are - // whitelisted, e.g. in the core image (b/77733081). As a result, we - // might print warnings but we won't change the semantics. - return hiddenapi::ApiList::kLightGreylist; - case Intrinsics::kStringNewStringFromBytes: - case Intrinsics::kStringNewStringFromChars: - case Intrinsics::kStringNewStringFromString: - case Intrinsics::kMemoryPeekIntNative: - case Intrinsics::kMemoryPeekLongNative: - case Intrinsics::kMemoryPeekShortNative: - case Intrinsics::kMemoryPokeIntNative: - case Intrinsics::kMemoryPokeLongNative: - case Intrinsics::kMemoryPokeShortNative: - return hiddenapi::ApiList::kDarkGreylist; - case Intrinsics::kVarHandleFullFence: - case Intrinsics::kVarHandleAcquireFence: - case Intrinsics::kVarHandleReleaseFence: - case Intrinsics::kVarHandleLoadLoadFence: - case Intrinsics::kVarHandleStoreStoreFence: - case Intrinsics::kVarHandleCompareAndExchange: - case Intrinsics::kVarHandleCompareAndExchangeAcquire: - case Intrinsics::kVarHandleCompareAndExchangeRelease: - case Intrinsics::kVarHandleCompareAndSet: - case Intrinsics::kVarHandleGet: - case Intrinsics::kVarHandleGetAcquire: - case Intrinsics::kVarHandleGetAndAdd: - case Intrinsics::kVarHandleGetAndAddAcquire: - case Intrinsics::kVarHandleGetAndAddRelease: - case Intrinsics::kVarHandleGetAndBitwiseAnd: - case Intrinsics::kVarHandleGetAndBitwiseAndAcquire: - case Intrinsics::kVarHandleGetAndBitwiseAndRelease: - case Intrinsics::kVarHandleGetAndBitwiseOr: - case Intrinsics::kVarHandleGetAndBitwiseOrAcquire: - case Intrinsics::kVarHandleGetAndBitwiseOrRelease: - case Intrinsics::kVarHandleGetAndBitwiseXor: - case Intrinsics::kVarHandleGetAndBitwiseXorAcquire: - case Intrinsics::kVarHandleGetAndBitwiseXorRelease: - case Intrinsics::kVarHandleGetAndSet: - case Intrinsics::kVarHandleGetAndSetAcquire: - case Intrinsics::kVarHandleGetAndSetRelease: - case Intrinsics::kVarHandleGetOpaque: - case Intrinsics::kVarHandleGetVolatile: - case Intrinsics::kVarHandleSet: - case Intrinsics::kVarHandleSetOpaque: - case Intrinsics::kVarHandleSetRelease: - case Intrinsics::kVarHandleSetVolatile: - case Intrinsics::kVarHandleWeakCompareAndSet: - case Intrinsics::kVarHandleWeakCompareAndSetAcquire: - case Intrinsics::kVarHandleWeakCompareAndSetPlain: - case Intrinsics::kVarHandleWeakCompareAndSetRelease: - // These intrinsics are on the blacklist and will fail a DCHECK in - // SetIntrinsic() if their flags change on the respective dex methods. - // Note that the DCHECK currently won't fail if the dex methods are - // whitelisted, e.g. in the core image (b/77733081). Given that they are - // exclusively VarHandle intrinsics, they should not be used outside - // tests that do not enable hidden API checks. - return hiddenapi::ApiList::kBlacklist; - default: - // Remaining intrinsics are public API. We DCHECK that in SetIntrinsic(). - return hiddenapi::ApiList::kWhitelist; - } - } else { - return hiddenapi::DecodeFromRuntime(GetAccessFlags()); - } -} - -inline void ArtMethod::SetIntrinsic(uint32_t intrinsic) { - // Currently we only do intrinsics for static/final methods or methods of final - // classes. We don't set kHasSingleImplementation for those methods. - DCHECK(IsStatic() || IsFinal() || GetDeclaringClass()->IsFinal()) << - "Potential conflict with kAccSingleImplementation"; - static const int kAccFlagsShift = CTZ(kAccIntrinsicBits); - DCHECK_LE(intrinsic, kAccIntrinsicBits >> kAccFlagsShift); - uint32_t intrinsic_bits = intrinsic << kAccFlagsShift; - uint32_t new_value = (GetAccessFlags() & ~kAccIntrinsicBits) | kAccIntrinsic | intrinsic_bits; - if (kIsDebugBuild) { - uint32_t java_flags = (GetAccessFlags() & kAccJavaFlagsMask); - bool is_constructor = IsConstructor(); - bool is_synchronized = IsSynchronized(); - bool skip_access_checks = SkipAccessChecks(); - bool is_fast_native = IsFastNative(); - bool is_critical_native = IsCriticalNative(); - bool is_copied = IsCopied(); - bool is_miranda = IsMiranda(); - bool is_default = IsDefault(); - bool is_default_conflict = IsDefaultConflicting(); - bool is_compilable = IsCompilable(); - bool must_count_locks = MustCountLocks(); - hiddenapi::ApiList hidden_api_flags = GetHiddenApiAccessFlags(); - SetAccessFlags(new_value); - DCHECK_EQ(java_flags, (GetAccessFlags() & kAccJavaFlagsMask)); - DCHECK_EQ(is_constructor, IsConstructor()); - DCHECK_EQ(is_synchronized, IsSynchronized()); - DCHECK_EQ(skip_access_checks, SkipAccessChecks()); - DCHECK_EQ(is_fast_native, IsFastNative()); - DCHECK_EQ(is_critical_native, IsCriticalNative()); - DCHECK_EQ(is_copied, IsCopied()); - DCHECK_EQ(is_miranda, IsMiranda()); - DCHECK_EQ(is_default, IsDefault()); - DCHECK_EQ(is_default_conflict, IsDefaultConflicting()); - DCHECK_EQ(is_compilable, IsCompilable()); - DCHECK_EQ(must_count_locks, MustCountLocks()); - // Only DCHECK that we have preserved the hidden API access flags if the - // original method was not on the whitelist. This is because the core image - // does not have the access flags set (b/77733081). It is fine to hard-code - // these because (a) warnings on greylist do not change semantics, and - // (b) only VarHandle intrinsics are blacklisted at the moment and they - // should not be used outside tests with disabled API checks. - if (hidden_api_flags != hiddenapi::ApiList::kWhitelist) { - DCHECK_EQ(hidden_api_flags, GetHiddenApiAccessFlags()) << PrettyMethod(); - } - } else { - SetAccessFlags(new_value); - } -} - template<ReadBarrierOption kReadBarrierOption, typename RootVisitorType> void ArtMethod::VisitRoots(RootVisitorType& visitor, PointerSize pointer_size) { if (LIKELY(!declaring_class_.IsNull())) { |