< prev index next >

src/hotspot/share/classfile/classFileParser.cpp

Print this page

        

@@ -19,10 +19,11 @@
  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  *
  */
+#include <classfile/fieldLayoutBuilder.hpp>
 #include "precompiled.hpp"
 #include "jvm.h"
 #include "aot/aotLoader.hpp"
 #include "classfile/classFileParser.hpp"
 #include "classfile/classFileStream.hpp"

@@ -58,10 +59,11 @@
 #include "oops/symbol.hpp"
 #include "oops/valueKlass.hpp"
 #include "prims/jvmtiExport.hpp"
 #include "prims/jvmtiThreadState.hpp"
 #include "runtime/arguments.hpp"
+#include "runtime/fieldDescriptor.inline.hpp"
 #include "runtime/handles.inline.hpp"
 #include "runtime/javaCalls.hpp"
 #include "runtime/os.hpp"
 #include "runtime/perfData.hpp"
 #include "runtime/reflection.hpp"

@@ -1082,62 +1084,10 @@
                              CHECK);
     }
   }
 }
 
-class AnnotationCollector : public ResourceObj{
-public:
-  enum Location { _in_field, _in_method, _in_class };
-  enum ID {
-    _unknown = 0,
-    _method_CallerSensitive,
-    _method_ForceInline,
-    _method_DontInline,
-    _method_InjectedProfile,
-    _method_LambdaForm_Compiled,
-    _method_Hidden,
-    _method_HotSpotIntrinsicCandidate,
-    _jdk_internal_vm_annotation_Contended,
-    _field_Stable,
-    _jdk_internal_vm_annotation_ReservedStackAccess,
-    _annotation_LIMIT
-  };
-  const Location _location;
-  int _annotations_present;
-  u2 _contended_group;
-
-  AnnotationCollector(Location location)
-    : _location(location), _annotations_present(0)
-  {
-    assert((int)_annotation_LIMIT <= (int)sizeof(_annotations_present) * BitsPerByte, "");
-  }
-  // If this annotation name has an ID, report it (or _none).
-  ID annotation_index(const ClassLoaderData* loader_data, const Symbol* name);
-  // Set the annotation name:
-  void set_annotation(ID id) {
-    assert((int)id >= 0 && (int)id < (int)_annotation_LIMIT, "oob");
-    _annotations_present |= nth_bit((int)id);
-  }
-
-  void remove_annotation(ID id) {
-    assert((int)id >= 0 && (int)id < (int)_annotation_LIMIT, "oob");
-    _annotations_present &= ~nth_bit((int)id);
-  }
-
-  // Report if the annotation is present.
-  bool has_any_annotations() const { return _annotations_present != 0; }
-  bool has_annotation(ID id) const { return (nth_bit((int)id) & _annotations_present) != 0; }
-
-  void set_contended_group(u2 group) { _contended_group = group; }
-  u2 contended_group() const { return _contended_group; }
-
-  bool is_contended() const { return has_annotation(_jdk_internal_vm_annotation_Contended); }
-
-  void set_stable(bool stable) { set_annotation(_field_Stable); }
-  bool is_stable() const { return has_annotation(_field_Stable); }
-};
-
 // This class also doubles as a holder for metadata cleanup.
 class ClassFileParser::FieldAnnotationCollector : public AnnotationCollector {
 private:
   ClassLoaderData* _loader_data;
   AnnotationArray* _field_annotations;

@@ -1161,16 +1111,10 @@
 public:
   MethodAnnotationCollector() : AnnotationCollector(_in_method) { }
   void apply_to(const methodHandle& m);
 };
 
-class ClassFileParser::ClassAnnotationCollector : public AnnotationCollector{
-public:
-  ClassAnnotationCollector() : AnnotationCollector(_in_class) { }
-  void apply_to(InstanceKlass* ik);
-};
-
 
 static int skip_annotation_value(const u1*, int, int); // fwd decl
 
 // Safely increment index by val if does not pass limit
 #define SAFE_ADD(index, limit, val) \

@@ -3884,56 +3828,38 @@
   tty->print("  @%3d %s\n", static_fields_end, "--- static fields end ---");
   tty->print("\n");
 }
 #endif
 
-// Values needed for oopmap and InstanceKlass creation
-class ClassFileParser::FieldLayoutInfo : public ResourceObj {
- public:
-  OopMapBlocksBuilder* oop_map_blocks;
-  int           instance_size;
-  int           nonstatic_field_size;
-  int           static_field_size;
-  bool          has_nonstatic_fields;
-};
-
-// Utility to collect and compact oop maps during layout
-class ClassFileParser::OopMapBlocksBuilder : public ResourceObj {
- public:
-  OopMapBlock*  nonstatic_oop_maps;
-  unsigned int  nonstatic_oop_map_count;
-  unsigned int  max_nonstatic_oop_maps;
-
- public:
-  OopMapBlocksBuilder(unsigned int  max_blocks, TRAPS) {
+OopMapBlocksBuilder::OopMapBlocksBuilder(unsigned int  max_blocks, TRAPS) {
     max_nonstatic_oop_maps = max_blocks;
     nonstatic_oop_map_count = 0;
     if (max_blocks == 0) {
       nonstatic_oop_maps = NULL;
     } else {
       nonstatic_oop_maps = NEW_RESOURCE_ARRAY_IN_THREAD(
         THREAD, OopMapBlock, max_nonstatic_oop_maps);
       memset(nonstatic_oop_maps, 0, sizeof(OopMapBlock) * max_blocks);
     }
-  }
+}
 
-  OopMapBlock* last_oop_map() const {
+OopMapBlock* OopMapBlocksBuilder::last_oop_map() const {
     assert(nonstatic_oop_map_count > 0, "Has no oop maps");
     return nonstatic_oop_maps + (nonstatic_oop_map_count - 1);
-  }
+}
 
-  // addition of super oop maps
-  void initialize_inherited_blocks(OopMapBlock* blocks, unsigned int nof_blocks) {
+// addition of super oop maps
+void OopMapBlocksBuilder::initialize_inherited_blocks(OopMapBlock* blocks, unsigned int nof_blocks) {
     assert(nof_blocks && nonstatic_oop_map_count == 0 &&
         nof_blocks <= max_nonstatic_oop_maps, "invariant");
 
     memcpy(nonstatic_oop_maps, blocks, sizeof(OopMapBlock) * nof_blocks);
     nonstatic_oop_map_count += nof_blocks;
-  }
+}
 
-  // collection of oops
-  void add(int offset, int count) {
+// collection of oops
+void OopMapBlocksBuilder::add(int offset, int count) {
     if (nonstatic_oop_map_count == 0) {
       nonstatic_oop_map_count++;
     }
     OopMapBlock*  nonstatic_oop_map = last_oop_map();
     if (nonstatic_oop_map->count() == 0) {  // Unused map, set it up

@@ -3946,21 +3872,21 @@
       assert(nonstatic_oop_map_count <= max_nonstatic_oop_maps, "range check");
       nonstatic_oop_map = last_oop_map();
       nonstatic_oop_map->set_offset(offset);
       nonstatic_oop_map->set_count(count);
     }
-  }
+}
 
-  // general purpose copy, e.g. into allocated instanceKlass
-  void copy(OopMapBlock* dst) {
+// general purpose copy, e.g. into allocated instanceKlass
+void OopMapBlocksBuilder::copy(OopMapBlock* dst) {
     if (nonstatic_oop_map_count != 0) {
       memcpy(dst, nonstatic_oop_maps, sizeof(OopMapBlock) * nonstatic_oop_map_count);
     }
-  }
+}
 
-  // Sort and compact adjacent blocks
-  void compact(TRAPS) {
+// Sort and compact adjacent blocks
+void OopMapBlocksBuilder::compact(TRAPS) {
     if (nonstatic_oop_map_count <= 1) {
       return;
     }
     /*
      * Since field layout sneeks in oops before values, we will be able to condense

@@ -3998,13 +3924,13 @@
       }
       oop_maps_copy++;
     }
     assert(new_count <= nonstatic_oop_map_count, "end up with more maps after compact() ?");
     nonstatic_oop_map_count = new_count;
-  }
+}
 
-  void print_on(outputStream* st) const {
+void OopMapBlocksBuilder::print_on(outputStream* st) const {
     st->print_cr("  OopMapBlocks: %3d  /%3d", nonstatic_oop_map_count, max_nonstatic_oop_maps);
     if (nonstatic_oop_map_count > 0) {
       OopMapBlock* map = nonstatic_oop_maps;
       OopMapBlock* last_map = last_oop_map();
       assert(map <= last_map, "Last less than first");

@@ -4012,17 +3938,15 @@
         st->print_cr("    Offset: %3d  -%3d Count: %3d", map->offset(),
             map->offset() + map->offset_span() - heapOopSize, map->count());
         map++;
       }
     }
-  }
+}
 
-  void print_value_on(outputStream* st) const {
+void OopMapBlocksBuilder::print_value_on(outputStream* st) const {
     print_on(st);
-  }
-
-};
+}
 
 void ClassFileParser::throwValueTypeLimitation(THREAD_AND_LOCATION_DECL,
                                                const char* msg,
                                                const Symbol* name,
                                                const Symbol* sig) const {

@@ -4666,10 +4590,15 @@
           nonstatic_fields_start,
           nonstatic_fields_end,
           static_fields_end);
     nonstatic_oop_maps->print_on(tty);
     tty->print("\n");
+    tty->print_cr("Instance size = %d", instance_size);
+    tty->print_cr("Nonstatic_field_size = %d", nonstatic_field_size);
+    tty->print_cr("Static_field_size = %d", static_field_size);
+    tty->print_cr("Has nonstatic fields = %d", has_nonstatic_fields);
+    tty->print_cr("---");
   }
 
 #endif
   // Pass back information needed for InstanceKlass creation
   info->oop_map_blocks = nonstatic_oop_maps;

@@ -6040,10 +5969,13 @@
       ValueKlass::cast(ik)->set_default_value_offset(ik->field_offset(i));
     }
   }
 
   if (is_value_type()) {
+    ValueKlass::cast(ik)->set_alignment(_alignment);
+    ValueKlass::cast(ik)->set_first_field_offset(_first_field_offset);
+    ValueKlass::cast(ik)->set_exact_size_in_bytes(_exact_size_in_bytes);
     ValueKlass::cast(ik)->initialize_calling_convention(CHECK);
   }
 
   ClassLoadingService::notify_class_loaded(ik, false /* not shared class */);
 

@@ -6732,13 +6664,25 @@
       _has_flattenable_fields = true;
     }
   }
 
   _field_info = new FieldLayoutInfo();
+  if (UseNewLayout) {
+    FieldLayoutBuilder lb(this, _field_info);
+    if (this->is_value_type()) {
+      lb.compute_inline_class_layout(CHECK);
+      _alignment = lb.get_alignment();
+      _first_field_offset = lb.get_first_field_offset();
+      _exact_size_in_bytes = lb.get_exact_size_in_byte();
+    } else {
+      lb.compute_regular_layout(CHECK);
+    }
+  } else {
   layout_fields(cp, _fac, _parsed_annotations, _field_info, CHECK);
+}
 
-  // Compute reference typ
+  // Compute reference type
   _rt = (NULL ==_super_klass) ? REF_NONE : _super_klass->reference_type();
 
 }
 
 void ClassFileParser::set_klass(InstanceKlass* klass) {
< prev index next >