changeset 9234:9148fcba5de9

8206173: MallocSiteTable::initialize() doesn't take function descriptors into account Reviewed-by: stuefe, zgu
author simonis
date Thu, 07 Nov 2019 17:56:14 -0500
parents ac3466ed5cb5
children 1bbf10267ee0
files src/share/vm/services/mallocSiteTable.cpp src/share/vm/utilities/macros.hpp
diffstat 2 files changed, 17 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/services/mallocSiteTable.cpp	Mon Nov 11 17:23:50 2019 +0000
+++ b/src/share/vm/services/mallocSiteTable.cpp	Thu Nov 07 17:56:14 2019 -0500
@@ -84,12 +84,18 @@
   // Create pseudo call stack for hashtable entry allocation
   address pc[3];
   if (NMT_TrackingStackDepth >= 3) {
-    pc[2] = (address)MallocSiteTable::allocation_at;
+    uintx *fp = (uintx*)MallocSiteTable::allocation_at;
+    // On ppc64, 'fp' is a pointer to a function descriptor which is a struct  of
+    // three native pointers where the first pointer is the real function address.
+    // See: http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi-1.9.html#FUNC-DES
+    pc[2] = (address)(fp PPC64_ONLY(BIG_ENDIAN_ONLY([0])));
   }
   if (NMT_TrackingStackDepth >= 2) {
-    pc[1] = (address)MallocSiteTable::lookup_or_add;
+    uintx *fp = (uintx*)MallocSiteTable::lookup_or_add;
+    pc[1] = (address)(fp PPC64_ONLY(BIG_ENDIAN_ONLY([0])));
   }
-  pc[0] = (address)MallocSiteTable::new_entry;
+  uintx *fp = (uintx*)MallocSiteTable::new_entry;
+  pc[0] = (address)(fp PPC64_ONLY(BIG_ENDIAN_ONLY([0])));
 
   // Instantiate NativeCallStack object, have to use placement new operator. (see comments above)
   NativeCallStack* stack = ::new ((void*)_hash_entry_allocation_stack)
--- a/src/share/vm/utilities/macros.hpp	Mon Nov 11 17:23:50 2019 +0000
+++ b/src/share/vm/utilities/macros.hpp	Thu Nov 07 17:56:14 2019 -0500
@@ -416,6 +416,14 @@
 #define NOT_EMBEDDED(code) code
 #endif
 
+#ifdef VM_LITTLE_ENDIAN
+#define LITTLE_ENDIAN_ONLY(code) code
+#define BIG_ENDIAN_ONLY(code)
+#else
+#define LITTLE_ENDIAN_ONLY(code)
+#define BIG_ENDIAN_ONLY(code) code
+#endif
+
 #define define_pd_global(type, name, value) const type pd_##name = value;
 
 #endif // SHARE_VM_UTILITIES_MACROS_HPP