Add a check that we do not set intrinsic type `kNone`.
Bug: 228049006
Test: art/test.py --host
Change-Id: I9cb36954d6f3215d5c9c8aab9f23cae4c66fa6b7
diff --git a/runtime/art_method.h b/runtime/art_method.h
index d3005cd..9b11c26 100644
--- a/runtime/art_method.h
+++ b/runtime/art_method.h
@@ -27,6 +27,7 @@
#include "base/bit_utils.h"
#include "base/casts.h"
#include "base/enums.h"
+#include "base/logging.h"
#include "base/macros.h"
#include "base/runtime_debug.h"
#include "dex/dex_file_structs.h"
@@ -115,6 +116,9 @@
// concurrency so there is no need to guarantee atomicity. For example,
// before the method is linked.
void SetAccessFlags(uint32_t new_access_flags) REQUIRES_SHARED(Locks::mutator_lock_) {
+ // The following check ensures that we do not set `Intrinsics::kNone` (see b/228049006).
+ DCHECK_IMPLIES((new_access_flags & kAccIntrinsic) != 0,
+ (new_access_flags & kAccIntrinsicBits) != 0);
access_flags_.store(new_access_flags, std::memory_order_relaxed);
}
@@ -882,7 +886,8 @@
static inline bool IsValidIntrinsicUpdate(uint32_t modifier) {
return (((modifier & kAccIntrinsic) == kAccIntrinsic) &&
- (((modifier & ~(kAccIntrinsic | kAccIntrinsicBits)) == 0)));
+ ((modifier & ~(kAccIntrinsic | kAccIntrinsicBits)) == 0) &&
+ ((modifier & kAccIntrinsicBits) != 0)); // b/228049006: ensure intrinsic is not `kNone`
}
static inline bool OverlapsIntrinsicBits(uint32_t modifier) {
@@ -891,14 +896,14 @@
// This setter guarantees atomicity.
void AddAccessFlags(uint32_t flag) REQUIRES_SHARED(Locks::mutator_lock_) {
- DCHECK(!IsIntrinsic() || !OverlapsIntrinsicBits(flag) || IsValidIntrinsicUpdate(flag));
+ DCHECK_IMPLIES(IsIntrinsic(), !OverlapsIntrinsicBits(flag) || IsValidIntrinsicUpdate(flag));
// None of the readers rely ordering.
access_flags_.fetch_or(flag, std::memory_order_relaxed);
}
// This setter guarantees atomicity.
void ClearAccessFlags(uint32_t flag) REQUIRES_SHARED(Locks::mutator_lock_) {
- DCHECK(!IsIntrinsic() || !OverlapsIntrinsicBits(flag) || IsValidIntrinsicUpdate(flag));
+ DCHECK_IMPLIES(IsIntrinsic(), !OverlapsIntrinsicBits(flag) || IsValidIntrinsicUpdate(flag));
access_flags_.fetch_and(~flag, std::memory_order_relaxed);
}