Merge changes I295c7876,Ib4b84b7b
* changes:
ART: Remove PACKED from ArtMethod's ptr_sized_fields_
ART: Rename ArtMethod JNI field
diff --git a/imgdiag/imgdiag.cc b/imgdiag/imgdiag.cc
index 214222d..f5669d7 100644
--- a/imgdiag/imgdiag.cc
+++ b/imgdiag/imgdiag.cc
@@ -729,7 +729,7 @@
os << " " << reinterpret_cast<void*>(obj) << " ";
os << " entryPointFromJni: "
<< reinterpret_cast<const void*>(
- art_method->GetEntryPointFromJniPtrSize(pointer_size)) << ", ";
+ art_method->GetDataPtrSize(pointer_size)) << ", ";
os << " entryPointFromQuickCompiledCode: "
<< reinterpret_cast<const void*>(
art_method->GetEntryPointFromQuickCompiledCodePtrSize(pointer_size))
@@ -810,7 +810,7 @@
os << " " << reinterpret_cast<void*>(obj) << " ";
os << " entryPointFromJni: "
<< reinterpret_cast<const void*>(
- art_method->GetEntryPointFromJniPtrSize(pointer_size)) << ", ";
+ art_method->GetDataPtrSize(pointer_size)) << ", ";
os << " entryPointFromQuickCompiledCode: "
<< reinterpret_cast<const void*>(
art_method->GetEntryPointFromQuickCompiledCodePtrSize(pointer_size))
diff --git a/patchoat/patchoat.cc b/patchoat/patchoat.cc
index 5bb61bb..569c5e9 100644
--- a/patchoat/patchoat.cc
+++ b/patchoat/patchoat.cc
@@ -748,8 +748,8 @@
copy->SetEntryPointFromQuickCompiledCodePtrSize(RelocatedAddressOfPointer(
object->GetEntryPointFromQuickCompiledCodePtrSize(pointer_size)), pointer_size);
// No special handling for IMT conflict table since all pointers are moved by the same offset.
- copy->SetEntryPointFromJniPtrSize(RelocatedAddressOfPointer(
- object->GetEntryPointFromJniPtrSize(pointer_size)), pointer_size);
+ copy->SetDataPtrSize(RelocatedAddressOfPointer(
+ object->GetDataPtrSize(pointer_size)), pointer_size);
}
bool PatchOat::Patch(File* input_oat, off_t delta, File* output_oat, TimingLogger* timings,
diff --git a/runtime/art_method-inl.h b/runtime/art_method-inl.h
index 32ae6ff..32425d8 100644
--- a/runtime/art_method-inl.h
+++ b/runtime/art_method-inl.h
@@ -507,7 +507,7 @@
SetEntryPointFromJniPtrSize(new_native_code, pointer_size);
}
} else {
- DCHECK(GetEntryPointFromJniPtrSize(pointer_size) == nullptr);
+ DCHECK(GetDataPtrSize(pointer_size) == nullptr);
}
const void* old_code = GetEntryPointFromQuickCompiledCodePtrSize(pointer_size);
const void* new_code = visitor(old_code);
diff --git a/runtime/art_method.cc b/runtime/art_method.cc
index f86cb13..113827a 100644
--- a/runtime/art_method.cc
+++ b/runtime/art_method.cc
@@ -16,6 +16,8 @@
#include "art_method.h"
+#include <cstddef>
+
#include "arch/context.h"
#include "art_field-inl.h"
#include "art_method-inl.h"
@@ -497,4 +499,24 @@
hotness_count_ = 0;
}
+bool ArtMethod::IsImagePointerSize(size_t pointer_size) {
+ // Hijack this function to get access to PtrSizedFieldsOffset.
+ //
+ // Ensure that PrtSizedFieldsOffset is correct. We rely here on usually having both 32-bit and
+ // 64-bit builds.
+ static_assert(std::is_standard_layout<ArtMethod>::value, "ArtMethod is not standard layout.");
+ static_assert((sizeof(void*) != 4) ||
+ (offsetof(ArtMethod, ptr_sized_fields_) == PtrSizedFieldsOffset(4)),
+ "Unexpected 32-bit class layout.");
+ static_assert((sizeof(void*) != 8) ||
+ (offsetof(ArtMethod, ptr_sized_fields_) == PtrSizedFieldsOffset(8)),
+ "Unexpected 64-bit class layout.");
+
+ Runtime* runtime = Runtime::Current();
+ if (runtime == nullptr) {
+ return true;
+ }
+ return runtime->GetClassLinker()->GetImagePointerSize() == pointer_size;
+}
+
} // namespace art
diff --git a/runtime/art_method.h b/runtime/art_method.h
index 849af97..1d14203 100644
--- a/runtime/art_method.h
+++ b/runtime/art_method.h
@@ -17,6 +17,8 @@
#ifndef ART_RUNTIME_ART_METHOD_H_
#define ART_RUNTIME_ART_METHOD_H_
+#include <cstddef>
+
#include "base/bit_utils.h"
#include "base/casts.h"
#include "dex_file.h"
@@ -219,7 +221,7 @@
class ArtMethod FINAL {
public:
ArtMethod() : access_flags_(0), dex_code_item_offset_(0), dex_method_index_(0),
- method_index_(0) { }
+ method_index_(0), hotness_count_(0) { }
ArtMethod(ArtMethod* src, size_t image_pointer_size) {
CopyFrom(src, image_pointer_size);
@@ -508,9 +510,13 @@
PtrSizedFields, dex_cache_resolved_types_) / sizeof(void*) * pointer_size);
}
- static MemberOffset EntryPointFromJniOffset(size_t pointer_size) {
+ static MemberOffset DataOffset(size_t pointer_size) {
return MemberOffset(PtrSizedFieldsOffset(pointer_size) + OFFSETOF_MEMBER(
- PtrSizedFields, entry_point_from_jni_) / sizeof(void*) * pointer_size);
+ PtrSizedFields, data_) / sizeof(void*) * pointer_size);
+ }
+
+ static MemberOffset EntryPointFromJniOffset(size_t pointer_size) {
+ return DataOffset(pointer_size);
}
static MemberOffset EntryPointFromQuickCompiledCodeOffset(size_t pointer_size) {
@@ -518,37 +524,40 @@
PtrSizedFields, entry_point_from_quick_compiled_code_) / sizeof(void*) * pointer_size);
}
- ProfilingInfo* GetProfilingInfo(size_t pointer_size) {
- return reinterpret_cast<ProfilingInfo*>(GetEntryPointFromJniPtrSize(pointer_size));
- }
-
ImtConflictTable* GetImtConflictTable(size_t pointer_size) {
DCHECK(IsRuntimeMethod());
- return reinterpret_cast<ImtConflictTable*>(GetEntryPointFromJniPtrSize(pointer_size));
+ return reinterpret_cast<ImtConflictTable*>(GetDataPtrSize(pointer_size));
}
ALWAYS_INLINE void SetImtConflictTable(ImtConflictTable* table, size_t pointer_size) {
- SetEntryPointFromJniPtrSize(table, pointer_size);
+ DCHECK(IsRuntimeMethod());
+ SetDataPtrSize(table, pointer_size);
+ }
+
+ ProfilingInfo* GetProfilingInfo(size_t pointer_size) {
+ return reinterpret_cast<ProfilingInfo*>(GetDataPtrSize(pointer_size));
}
ALWAYS_INLINE void SetProfilingInfo(ProfilingInfo* info) {
- SetEntryPointFromJniPtrSize(info, sizeof(void*));
+ SetDataPtrSize(info, sizeof(void*));
}
ALWAYS_INLINE void SetProfilingInfoPtrSize(ProfilingInfo* info, size_t pointer_size) {
- SetEntryPointFromJniPtrSize(info, pointer_size);
+ SetDataPtrSize(info, pointer_size);
}
static MemberOffset ProfilingInfoOffset() {
- return EntryPointFromJniOffset(sizeof(void*));
+ DCHECK(IsImagePointerSize(sizeof(void*)));
+ return DataOffset(sizeof(void*));
}
void* GetEntryPointFromJni() {
+ DCHECK(IsNative());
return GetEntryPointFromJniPtrSize(sizeof(void*));
}
ALWAYS_INLINE void* GetEntryPointFromJniPtrSize(size_t pointer_size) {
- return GetNativePointer<void*>(EntryPointFromJniOffset(pointer_size), pointer_size);
+ return GetDataPtrSize(pointer_size);
}
void SetEntryPointFromJni(const void* entrypoint) {
@@ -557,7 +566,17 @@
}
ALWAYS_INLINE void SetEntryPointFromJniPtrSize(const void* entrypoint, size_t pointer_size) {
- SetNativePointer(EntryPointFromJniOffset(pointer_size), entrypoint, pointer_size);
+ SetDataPtrSize(entrypoint, pointer_size);
+ }
+
+ ALWAYS_INLINE void* GetDataPtrSize(size_t pointer_size) {
+ DCHECK(IsImagePointerSize(pointer_size));
+ return GetNativePointer<void*>(DataOffset(pointer_size), pointer_size);
+ }
+
+ ALWAYS_INLINE void SetDataPtrSize(const void* data, size_t pointer_size) {
+ DCHECK(IsImagePointerSize(pointer_size));
+ SetNativePointer(DataOffset(pointer_size), data, pointer_size);
}
// Is this a CalleSaveMethod or ResolutionMethod and therefore doesn't adhere to normal
@@ -642,7 +661,7 @@
// Size of an instance of this native class.
static size_t Size(size_t pointer_size) {
- return RoundUp(OFFSETOF_MEMBER(ArtMethod, ptr_sized_fields_), pointer_size) +
+ return PtrSizedFieldsOffset(pointer_size) +
(sizeof(PtrSizedFields) / sizeof(void*)) * pointer_size;
}
@@ -729,9 +748,7 @@
// Fake padding field gets inserted here.
// Must be the last fields in the method.
- // PACKED(4) is necessary for the correctness of
- // RoundUp(OFFSETOF_MEMBER(ArtMethod, ptr_sized_fields_), pointer_size).
- struct PACKED(4) PtrSizedFields {
+ struct PtrSizedFields {
// Short cuts to declaring_class_->dex_cache_ member for fast compiled code access.
ArtMethod** dex_cache_resolved_methods_;
@@ -740,7 +757,7 @@
// Pointer to JNI function registered to this method, or a function to resolve the JNI function,
// or the profiling data for non-native methods, or an ImtConflictTable.
- void* entry_point_from_jni_;
+ void* data_;
// Method dispatch from quick compiled code invokes this pointer which may cause bridging into
// the interpreter.
@@ -748,11 +765,14 @@
} ptr_sized_fields_;
private:
- static size_t PtrSizedFieldsOffset(size_t pointer_size) {
- // Round up to pointer size for padding field.
- return RoundUp(OFFSETOF_MEMBER(ArtMethod, ptr_sized_fields_), pointer_size);
+ static constexpr size_t PtrSizedFieldsOffset(size_t pointer_size) {
+ // Round up to pointer size for padding field. Tested in art_method.cc.
+ return RoundUp(offsetof(ArtMethod, hotness_count_) + sizeof(hotness_count_), pointer_size);
}
+ // Compare given pointer size to the image pointer size.
+ static bool IsImagePointerSize(size_t pointer_size);
+
template<typename T>
ALWAYS_INLINE T GetNativePointer(MemberOffset offset, size_t pointer_size) const {
static_assert(std::is_pointer<T>::value, "T must be a pointer type");