< prev index next >

src/hotspot/cpu/arm/stubGenerator_arm.cpp

Print this page
@@ -3124,10 +3124,21 @@
    }
  
    //---------------------------------------------------------------------------
    // Initialization
  
+   void generate_preuniverse_stubs() {
+     // Atomics are used in universe initialization code (e.g. CDS relocation),
+     // therefore we need to generate real stubs very early on.
+     StubRoutines::_atomic_add_entry = generate_atomic_add();
+     StubRoutines::_atomic_xchg_entry = generate_atomic_xchg();
+     StubRoutines::_atomic_cmpxchg_entry = generate_atomic_cmpxchg();
+     StubRoutines::_atomic_cmpxchg_long_entry = generate_atomic_cmpxchg_long();
+     StubRoutines::Arm::_atomic_load_long_entry = generate_atomic_load_long();
+     StubRoutines::Arm::_atomic_store_long_entry = generate_atomic_store_long();
+   }
+ 
    void generate_initial_stubs() {
      // Generates all stubs and initializes the entry points
  
      //------------------------------------------------------------------------------------------------------------------------
      // entry points that exist in all platforms

@@ -3145,18 +3156,10 @@
        UnsafeMemoryAccess::create_table(32 + 4); // 32 for copyMemory; 4 for setMemory
      }
  
      // integer division used both by interpreter and compiler
      StubRoutines::Arm::_idiv_irem_entry = generate_idiv_irem();
- 
-     StubRoutines::_atomic_add_entry = generate_atomic_add();
-     StubRoutines::_atomic_xchg_entry = generate_atomic_xchg();
-     StubRoutines::_atomic_cmpxchg_entry = generate_atomic_cmpxchg();
-     StubRoutines::_atomic_cmpxchg_long_entry = generate_atomic_cmpxchg_long();
-     StubRoutines::Arm::_atomic_load_long_entry = generate_atomic_load_long();
-     StubRoutines::Arm::_atomic_store_long_entry = generate_atomic_store_long();
- 
    }
  
    void generate_continuation_stubs() {
      // Continuation stubs:
      StubRoutines::_cont_thaw          = generate_cont_thaw();

@@ -3199,10 +3202,13 @@
    }
  
   public:
    StubGenerator(CodeBuffer* code, StubGenBlobId blob_id) : StubCodeGenerator(code, blob_id) {
      switch(blob_id) {
+     case preuniverse_id:
+       generate_preuniverse_stubs();
+       break;
      case initial_id:
        generate_initial_stubs();
        break;
       case continuation_id:
        generate_continuation_stubs();
< prev index next >