diff src/os/solaris/dtrace/libjvm_db.c @ 6725:da91efe96a93

6964458: Reimplement class meta-data storage to use native memory Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author coleenp
date Sat, 01 Sep 2012 13:25:18 -0400
parents d68b1274b9ba
children fd94cbe7c5da
line wrap: on
line diff
--- a/src/os/solaris/dtrace/libjvm_db.c	Fri Aug 31 16:39:35 2012 -0700
+++ b/src/os/solaris/dtrace/libjvm_db.c	Sat Sep 01 13:25:18 2012 -0400
@@ -101,7 +101,7 @@
 #define MAX_VFRAMES_CNT 256
 
 typedef struct vframe {
-  uint64_t methodOop;
+  uint64_t method;
   int32_t  sender_decode_offset;
   int32_t  methodIdx;
   int32_t  bci;
@@ -129,8 +129,8 @@
   int32_t  deopt_beg;           /* _deoptimize_offset */
   int32_t  scopes_data_beg;     /* _scopes_data_offset */
   int32_t  scopes_data_end;
-  int32_t  oops_beg;            /* _oops_offset */
-  int32_t  oops_end;
+  int32_t  metadata_beg;        /* _metadata_offset */
+  int32_t  metadata_end;
   int32_t  scopes_pcs_beg;      /* _scopes_pcs_offset */
   int32_t  scopes_pcs_end;
 
@@ -145,16 +145,15 @@
   uint64_t CodeBlob_vtbl;
   uint64_t BufferBlob_vtbl;
   uint64_t RuntimeStub_vtbl;
+  uint64_t Method_vtbl;
 
   uint64_t Use_Compressed_Oops_address;
-  uint64_t Universe_methodKlassObj_address;
   uint64_t Universe_narrow_oop_base_address;
   uint64_t Universe_narrow_oop_shift_address;
   uint64_t CodeCache_heap_address;
 
   /* Volatiles */
   uint8_t  Use_Compressed_Oops;
-  uint64_t Universe_methodKlassObj;
   uint64_t Universe_narrow_oop_base;
   uint32_t Universe_narrow_oop_shift;
   uint64_t CodeCache_low;
@@ -164,7 +163,7 @@
 
   int32_t  SIZE_CodeCache_log2_segment;
 
-  uint64_t methodOopPtr;
+  uint64_t methodPtr;
   uint64_t bcx;
 
   Nmethod_t *N;                 /*Inlined methods support */
@@ -280,9 +279,6 @@
         err = read_pointer(J, vmp->address, &J->CodeCache_heap_address);
       }
     } else if (vmp->typeName[0] == 'U' && strcmp("Universe", vmp->typeName) == 0) {
-      if (strcmp("_methodKlassObj", vmp->fieldName) == 0) {
-        J->Universe_methodKlassObj_address = vmp->address;
-      }
       if (strcmp("_narrow_oop._base", vmp->fieldName) == 0) {
         J->Universe_narrow_oop_base_address = vmp->address;
       }
@@ -330,9 +326,6 @@
     J->Use_Compressed_Oops = 0;
   }
 
-  err = read_pointer(J, J->Universe_methodKlassObj_address, &J->Universe_methodKlassObj);
-  CHECK_FAIL(err);
-
   err = read_pointer(J, J->Universe_narrow_oop_base_address, &J->Universe_narrow_oop_base);
   CHECK_FAIL(err);
   err = ps_pread(J->P,  J->Universe_narrow_oop_shift_address, &J->Universe_narrow_oop_shift, sizeof(uint32_t));
@@ -455,6 +448,8 @@
   CHECK_FAIL(err);
   err = find_symbol(J, "__1cLRuntimeStubG__vtbl_", &J->RuntimeStub_vtbl);
   CHECK_FAIL(err);
+  err = find_symbol(J, "__1cGMethodG__vtbl_", &J->Method_vtbl);
+  CHECK_FAIL(err);
 
   err = parse_vmstructs(J);
   CHECK_FAIL(err);
@@ -474,29 +469,18 @@
   }
 }
 
-static int is_methodOop(jvm_agent_t* J, uint64_t methodOopPtr) {
+static int is_method(jvm_agent_t* J, uint64_t methodPtr) {
   uint64_t klass;
-  int err;
-  // If UseCompressedOops, this was a compressed oop.
-  if (J->Use_Compressed_Oops != 0) {
-    uint32_t cklass;
-    err = read_compressed_pointer(J, methodOopPtr + OFFSET_oopDesc_metadata,
-          &cklass);
-    // decode heap oop, same as oop.inline.hpp
-    klass = (uint64_t)((uintptr_t)J->Universe_narrow_oop_base +
-            ((uintptr_t)cklass << J->Universe_narrow_oop_shift));
-  } else {
-    err = read_pointer(J, methodOopPtr + OFFSET_oopDesc_metadata, &klass);
-  }
+  int err = read_pointer(J, methodPtr, &klass);
   if (err != PS_OK) goto fail;
-  return klass == J->Universe_methodKlassObj;
+  return klass == J->Method_vtbl;
 
  fail:
   return 0;
 }
 
 static int
-name_for_methodOop(jvm_agent_t* J, uint64_t methodOopPtr, char * result, size_t size)
+name_for_methodPtr(jvm_agent_t* J, uint64_t methodPtr, char * result, size_t size)
 {
   short nameIndex;
   short signatureIndex;
@@ -514,15 +498,15 @@
   char * signatureString = NULL;
   int err;
 
-  err = read_pointer(J, methodOopPtr + OFFSET_methodOopDesc_constMethod, &constMethod);
+  err = read_pointer(J, methodPtr + OFFSET_Method_constMethod, &constMethod);
   CHECK_FAIL(err);
-  err = read_pointer(J, constMethod + OFFSET_constMethodOopDesc_constants, &constantPool);
+  err = read_pointer(J, constMethod + OFFSET_ConstMethod_constants, &constantPool);
   CHECK_FAIL(err);
 
   /* To get name string */
-  err = ps_pread(J->P, constMethod + OFFSET_constMethodOopDesc_name_index, &nameIndex, 2);
+  err = ps_pread(J->P, constMethod + OFFSET_ConstMethod_name_index, &nameIndex, 2);
   CHECK_FAIL(err);
-  err = read_pointer(J, constantPool + nameIndex * POINTER_SIZE + SIZE_constantPoolOopDesc, &nameSymbol);
+  err = read_pointer(J, constantPool + nameIndex * POINTER_SIZE + SIZE_ConstantPool, &nameSymbol);
   CHECK_FAIL(err);
   // The symbol is a CPSlot and has lower bit set to indicate metadata
   nameSymbol &= (~1); // remove metadata lsb
@@ -533,9 +517,9 @@
   CHECK_FAIL(err);
 
   /* To get signature string */
-  err = ps_pread(J->P, constMethod + OFFSET_constMethodOopDesc_signature_index, &signatureIndex, 2);
+  err = ps_pread(J->P, constMethod + OFFSET_ConstMethod_signature_index, &signatureIndex, 2);
   CHECK_FAIL(err);
-  err = read_pointer(J, constantPool + signatureIndex * POINTER_SIZE + SIZE_constantPoolOopDesc, &signatureSymbol);
+  err = read_pointer(J, constantPool + signatureIndex * POINTER_SIZE + SIZE_ConstantPool, &signatureSymbol);
   CHECK_FAIL(err);
   signatureSymbol &= (~1);  // remove metadata lsb
   err = ps_pread(J->P, signatureSymbol + OFFSET_Symbol_length, &signatureSymbolLength, 2);
@@ -545,9 +529,9 @@
   CHECK_FAIL(err);
 
   /* To get klass string */
-  err = read_pointer(J, constantPool + OFFSET_constantPoolOopDesc_pool_holder, &klassPtr);
+  err = read_pointer(J, constantPool + OFFSET_ConstantPool_pool_holder, &klassPtr);
   CHECK_FAIL(err);
-  err = read_pointer(J, klassPtr + OFFSET_Klass_name + SIZE_oopDesc, &klassSymbol);
+  err = read_pointer(J, klassPtr + OFFSET_Klass_name, &klassSymbol);
   CHECK_FAIL(err);
   err = ps_pread(J->P, klassSymbol + OFFSET_Symbol_length, &klassSymbolLength, 2);
   CHECK_FAIL(err);
@@ -572,7 +556,7 @@
 
  fail:
   if (debug) {
-      fprintf(stderr, "name_for_methodOop: FAIL \n\n");
+      fprintf(stderr, "name_for_methodPtr: FAIL \n\n");
   }
   if (nameString != NULL) free(nameString);
   if (klassString != NULL) free(klassString);
@@ -599,10 +583,10 @@
   err = ps_pread(J->P, nm + OFFSET_nmethod_orig_pc_offset, &N->orig_pc_offset, SZ32);
   CHECK_FAIL(err);
 
-  /* Oops */
-  err = ps_pread(J->P, nm + OFFSET_nmethod_oops_offset, &N->oops_beg, SZ32);
+  /* Metadata */
+  err = ps_pread(J->P, nm + OFFSET_nmethod_metadata_offset, &N->metadata_beg, SZ32);
   CHECK_FAIL(err);
-  err = ps_pread(J->P, nm + OFFSET_nmethod_scopes_data_offset, &N->oops_end, SZ32);
+  err = ps_pread(J->P, nm + OFFSET_nmethod_scopes_data_offset, &N->metadata_end, SZ32);
   CHECK_FAIL(err);
 
   /* scopes_pcs */
@@ -627,8 +611,8 @@
       fprintf(stderr, "\t nmethod_info: orig_pc_offset: %#x \n",
                        N->orig_pc_offset);
 
-      fprintf(stderr, "\t nmethod_info: oops_beg: %#x, oops_end: %#x\n",
-                       N->oops_beg, N->oops_end);
+      fprintf(stderr, "\t nmethod_info: metadata_beg: %#x, metadata_end: %#x\n",
+                       N->metadata_beg, N->metadata_end);
 
       fprintf(stderr, "\t nmethod_info: scopes_data_beg: %#x, scopes_data_end: %#x\n",
                        N->scopes_data_beg, N->scopes_data_end);
@@ -766,20 +750,20 @@
 
   if (debug > 2) {
       char name[256];
-      err = name_for_methodOop(J, vf->methodOop, name, 256);
+      err = name_for_methodPtr(J, vf->method, name, 256);
       CHECK_FAIL(err);
       fprintf(stderr, "\t line_number_from_bci: BEGIN, method name: %s, targ bci: %d\n",
                        name, vf->bci);
   }
 
-  err = read_pointer(J, vf->methodOop + OFFSET_methodOopDesc_constMethod, &constMethod);
+  err = read_pointer(J, vf->method + OFFSET_Method_constMethod, &constMethod);
   CHECK_FAIL(err);
 
   vf->line = 0;
-  err = ps_pread(J->P, constMethod + OFFSET_constMethodOopDesc_flags, &access_flags, sizeof(int8_t));
+  err = ps_pread(J->P, constMethod + OFFSET_ConstMethod_flags, &access_flags, sizeof(int8_t));
   CHECK_FAIL(err);
 
-  if (!(access_flags & constMethodOopDesc_has_linenumber_table)) {
+  if (!(access_flags & ConstMethod_has_linenumber_table)) {
       if (debug > 2)
           fprintf(stderr, "\t line_number_from_bci: END: !HAS_LINE_NUMBER_TABLE \n\n");
       return PS_OK;
@@ -789,16 +773,16 @@
    *  Not necessarily sorted and not necessarily one-to-one.
    */
 
-  err = ps_pread(J->P, constMethod + OFFSET_constMethodOopDesc_code_size, &code_size, SZ16);
+  err = ps_pread(J->P, constMethod + OFFSET_ConstMethod_code_size, &code_size, SZ16);
   CHECK_FAIL(err);
 
   /* inlined_table_start() */
   code_end_delta = (uint64_t) (access_flags & AccessFlags_NATIVE) ? 2*POINTER_SIZE : 0;
-  buffer = constMethod + (uint64_t) SIZE_constMethodOopDesc + (uint64_t) code_size + code_end_delta;
+  buffer = constMethod + (uint64_t) SIZE_ConstMethod + (uint64_t) code_size + code_end_delta;
 
   if (debug > 2) {
-      fprintf(stderr, "\t\t line_number_from_bci: methodOop: %#llx, native: %d\n",
-                      vf->methodOop, (access_flags & AccessFlags_NATIVE));
+      fprintf(stderr, "\t\t line_number_from_bci: method: %#llx, native: %d\n",
+                      vf->method, (access_flags & AccessFlags_NATIVE));
       fprintf(stderr, "\t\t line_number_from_bci: buffer: %#llx, code_size: %d\n",
                       buffer, (int) code_size);
   }
@@ -962,21 +946,21 @@
     err = scope_desc_at(N, decode_offset, vf);
     CHECK_FAIL(err);
 
-    if (vf->methodIdx > ((N->oops_end - N->oops_beg) / POINTER_SIZE)) {
-      fprintf(stderr, "\t scopeDesc_chain: (methodIdx > oops length) !\n");
+    if (vf->methodIdx > ((N->metadata_end - N->metadata_beg) / POINTER_SIZE)) {
+      fprintf(stderr, "\t scopeDesc_chain: (methodIdx > metadata length) !\n");
       return -1;
     }
-    err = read_pointer(N->J, N->nm + N->oops_beg + (vf->methodIdx-1)*POINTER_SIZE,
-                       &vf->methodOop);
+    err = read_pointer(N->J, N->nm + N->metadata_beg + (vf->methodIdx-1)*POINTER_SIZE,
+                       &vf->method);
     CHECK_FAIL(err);
 
-    if (vf->methodOop) {
+    if (vf->method) {
       N->vf_cnt++;
       err = line_number_from_bci(N->J, vf);
       CHECK_FAIL(err);
       if (debug > 2) {
-        fprintf(stderr, "\t scopeDesc_chain: methodOop: %#8llx, line: %ld\n",
-                vf->methodOop, vf->line);
+        fprintf(stderr, "\t scopeDesc_chain: method: %#8llx, line: %ld\n",
+                vf->method, vf->line);
       }
     }
     decode_offset = vf->sender_decode_offset;
@@ -998,7 +982,7 @@
 name_for_nmethod(jvm_agent_t* J,
                  uint64_t nm,
                  uint64_t pc,
-                 uint64_t methodOop,
+                 uint64_t method,
                  char *result,
                  size_t size,
                  Jframe_t *jframe
@@ -1062,10 +1046,10 @@
       jframe->vf_cnt = N->vf_cnt;
       jframe->bci  = vf->bci;
       jframe->line = vf->line;
-      err = name_for_methodOop(J, N->vframes[0].methodOop, result+1, size-1);
+      err = name_for_methodPtr(J, N->vframes[0].method, result+1, size-1);
       CHECK_FAIL(err);
   } else {
-      err = name_for_methodOop(J, methodOop, result+1, size-1);
+      err = name_for_methodPtr(J, method, result+1, size-1);
       CHECK_FAIL(err);
   }
   if (deoptimized) {
@@ -1097,7 +1081,7 @@
 static int
 name_for_imethod(jvm_agent_t* J,
                  uint64_t bcx,
-                 uint64_t methodOop,
+                 uint64_t method,
                  char *result,
                  size_t size,
                  Jframe_t *jframe
@@ -1108,21 +1092,21 @@
   Vframe_t *vf = &vframe;
   int32_t   err;
 
-  err = read_pointer(J, methodOop + OFFSET_methodOopDesc_constMethod, &constMethod);
+  err = read_pointer(J, method + OFFSET_Method_constMethod, &constMethod);
   CHECK_FAIL(err);
 
-  bci = is_bci(bcx) ? bcx : bcx - (constMethod + (uint64_t) SIZE_constMethodOopDesc);
+  bci = is_bci(bcx) ? bcx : bcx - (constMethod + (uint64_t) SIZE_ConstMethod);
 
   if (debug)
-      fprintf(stderr, "\t name_for_imethod: BEGIN: methodOop: %#llx\n", methodOop);
+      fprintf(stderr, "\t name_for_imethod: BEGIN: method: %#llx\n", method);
 
-  err = name_for_methodOop(J, methodOop, result, size);
+  err = name_for_methodPtr(J, method, result, size);
   CHECK_FAIL(err);
   if (debug)
       fprintf(stderr, "\t name_for_imethod: method name: %s\n", result);
 
   if (bci > 0) {
-      vf->methodOop = methodOop;
+      vf->method = method;
       vf->bci       = bci;
       err = line_number_from_bci(J, vf);
       CHECK_FAIL(err);
@@ -1161,16 +1145,16 @@
   CHECK_FAIL(err);
 
   if (vtbl == J->nmethod_vtbl) {
-    uint64_t methodOop;
+    uint64_t method;
 
-    err = read_pointer(J, start + OFFSET_nmethod_method, &methodOop);
+    err = read_pointer(J, start + OFFSET_nmethod_method, &method);
     CHECK_FAIL(err);
 
     if (debug) {
-        fprintf(stderr, "name_for_codecache: start: %#8llx, pc: %#8llx, methodOop: %#8llx \n",
-                        start, pc, methodOop);
+        fprintf(stderr, "name_for_codecache: start: %#8llx, pc: %#8llx, method: %#8llx \n",
+                        start, pc, method);
     }
-    err = name_for_nmethod(J, start, pc, methodOop, result, size, jframe);
+    err = name_for_nmethod(J, start, pc, method, result, size, jframe);
     CHECK_FAIL(err);
   } else if (vtbl == J->BufferBlob_vtbl) {
     const char * name;
@@ -1184,8 +1168,8 @@
      */
     if (err == PS_OK && strncmp(name, "Interpreter", 11) == 0) {
       *is_interpreted = 1;
-      if (is_methodOop(J, J->methodOopPtr)) {
-        return name_for_imethod(J, J->bcx, J->methodOopPtr, result, size, jframe);
+      if (is_method(J, J->methodPtr)) {
+        return name_for_imethod(J, J->bcx, J->methodPtr, result, size, jframe);
       }
     }
 
@@ -1315,7 +1299,7 @@
   }
   vf = N->vframes + vframe_no;
   name[0] = COMP_METHOD_SIGN;
-  err = name_for_methodOop(J, vf->methodOop, name + 1, size);
+  err = name_for_methodPtr(J, vf->method, name + 1, size);
   CHECK_FAIL(err);
 
   jframe->bci = vf->bci;
@@ -1340,7 +1324,7 @@
   uintptr_t fp;
   uintptr_t pc;
   /* arguments given to read_pointer need to be worst case sized */
-  uint64_t methodOopPtr = 0;
+  uint64_t methodPtr = 0;
   uint64_t sender_sp;
   uint64_t bcx = 0;
   int is_interpreted = 0;
@@ -1374,7 +1358,7 @@
      */
     pc += 8;
     bcx          = (uintptr_t) regs[R_L1];
-    methodOopPtr = (uintptr_t) regs[R_L2];
+    methodPtr = (uintptr_t) regs[R_L2];
     sender_sp = regs[R_I5];
     if (debug > 2) {
         fprintf(stderr, "\nregs[R_I1]=%lx, regs[R_I2]=%lx, regs[R_I5]=%lx, regs[R_L1]=%lx, regs[R_L2]=%lx\n",
@@ -1395,8 +1379,8 @@
         printf("Jlookup_by_regs: J->prev_fr.fp = %#lx\n", J->prev_fr.fp);
     }
 
-    if (read_pointer(J,  fp + OFFSET_interpreter_frame_method, &methodOopPtr) != PS_OK) {
-      methodOopPtr = 0;
+    if (read_pointer(J,  fp + OFFSET_interpreter_frame_method, &methodPtr) != PS_OK) {
+      methodPtr = 0;
     }
     if (read_pointer(J,  fp + OFFSET_interpreter_frame_sender_sp, &sender_sp) != PS_OK) {
       sender_sp = 0;
@@ -1406,20 +1390,20 @@
     }
 #endif /* i386 */
 
-  J->methodOopPtr = methodOopPtr;
+  J->methodPtr = methodPtr;
   J->bcx = bcx;
 
   /* On x86 with C2 JVM: native frame may have wrong regs[R_FP]
    * For example: JVM_SuspendThread frame poins to the top interpreted frame.
-   * If we call is_methodOop(J, methodOopPtr) before codecache_contains(J, pc)
+   * If we call is_method(J, methodPtr) before codecache_contains(J, pc)
    * then we go over and omit both: nmethod and I2CAdapter frames.
    * Note, that regs[R_PC] is always correct if frame defined correctly.
    * So it is better to call codecache_contains(J, pc) from the beginning.
    */
 #ifndef X86_COMPILER2
-  if (is_methodOop(J, J->methodOopPtr)) {
-    result = name_for_imethod(J, bcx, J->methodOopPtr, name, size, jframe);
-    /* If the methodOopPtr is a method then this is highly likely to be
+  if (is_method(J, J->methodPtr)) {
+    result = name_for_imethod(J, bcx, J->methodPtr, name, size, jframe);
+    /* If the methodPtr is a method then this is highly likely to be
        an interpreter frame */
     if (result >= 0) {
       is_interpreted = 1;
@@ -1431,9 +1415,9 @@
     result = name_for_codecache(J, fp, pc, name, size, jframe, &is_interpreted);
   }
 #ifdef X86_COMPILER2
-  else if (is_methodOop(J, J->methodOopPtr)) {
-    result = name_for_imethod(J, bcx, J->methodOopPtr, name, size, jframe);
-    /* If the methodOopPtr is a method then this is highly likely to be
+  else if (is_method(J, J->methodPtr)) {
+    result = name_for_imethod(J, bcx, J->methodPtr, name, size, jframe);
+    /* If the methodPtr is a method then this is highly likely to be
        an interpreter frame */
     if (result >= 0) {
       is_interpreted = 1;