hotspot/src/share/vm/asm/codeBuffer.cpp
changeset 6432 d36e09b60939
parent 6418 6671edbd230e
child 7397 5b173b4ca846
equal deleted inserted replaced
6431:d76212f83824 6432:d36e09b60939
   141   _oop_recorder = r;
   141   _oop_recorder = r;
   142 }
   142 }
   143 
   143 
   144 void CodeBuffer::initialize_section_size(CodeSection* cs, csize_t size) {
   144 void CodeBuffer::initialize_section_size(CodeSection* cs, csize_t size) {
   145   assert(cs != &_insts, "insts is the memory provider, not the consumer");
   145   assert(cs != &_insts, "insts is the memory provider, not the consumer");
   146 #ifdef ASSERT
       
   147   for (int n = (int)SECT_INSTS+1; n < (int)SECT_LIMIT; n++) {
       
   148     CodeSection* prevCS = code_section(n);
       
   149     if (prevCS == cs)  break;
       
   150     assert(!prevCS->is_allocated(), "section allocation must be in reverse order");
       
   151   }
       
   152 #endif
       
   153   csize_t slop = CodeSection::end_slop();  // margin between sections
   146   csize_t slop = CodeSection::end_slop();  // margin between sections
   154   int align = cs->alignment();
   147   int align = cs->alignment();
   155   assert(is_power_of_2(align), "sanity");
   148   assert(is_power_of_2(align), "sanity");
   156   address start  = _insts._start;
   149   address start  = _insts._start;
   157   address limit  = _insts._limit;
   150   address limit  = _insts._limit;
   197     int align = _insts.alignment();
   190     int align = _insts.alignment();
   198     start += (-(intptr_t)start) & (align-1);
   191     start += (-(intptr_t)start) & (align-1);
   199     _total_start = start;
   192     _total_start = start;
   200     _total_size  = end - start;
   193     _total_size  = end - start;
   201   } else {
   194   } else {
   202     #ifdef ASSERT
   195 #ifdef ASSERT
   203     // Clean out dangling pointers.
   196     // Clean out dangling pointers.
   204     _total_start    = badAddress;
   197     _total_start    = badAddress;
       
   198     _consts._start  = _consts._end  = badAddress;
   205     _insts._start   = _insts._end   = badAddress;
   199     _insts._start   = _insts._end   = badAddress;
   206     _stubs._start   = _stubs._end   = badAddress;
   200     _stubs._start   = _stubs._end   = badAddress;
   207     _consts._start  = _consts._end  = badAddress;
   201 #endif //ASSERT
   208     #endif //ASSERT
       
   209   }
   202   }
   210 }
   203 }
   211 
   204 
   212 void CodeBuffer::free_blob() {
   205 void CodeBuffer::free_blob() {
   213   if (_blob != NULL) {
   206   if (_blob != NULL) {
   219 const char* CodeBuffer::code_section_name(int n) {
   212 const char* CodeBuffer::code_section_name(int n) {
   220 #ifdef PRODUCT
   213 #ifdef PRODUCT
   221   return NULL;
   214   return NULL;
   222 #else //PRODUCT
   215 #else //PRODUCT
   223   switch (n) {
   216   switch (n) {
       
   217   case SECT_CONSTS:            return "consts";
   224   case SECT_INSTS:             return "insts";
   218   case SECT_INSTS:             return "insts";
   225   case SECT_STUBS:             return "stubs";
   219   case SECT_STUBS:             return "stubs";
   226   case SECT_CONSTS:            return "consts";
       
   227   default:                     return NULL;
   220   default:                     return NULL;
   228   }
   221   }
   229 #endif //PRODUCT
   222 #endif //PRODUCT
   230 }
   223 }
   231 
   224 
   443     assert( (dest->_total_start - _insts.start()) % alignSize == 0, "copy must preserve alignment");
   436     assert( (dest->_total_start - _insts.start()) % alignSize == 0, "copy must preserve alignment");
   444   }
   437   }
   445 
   438 
   446   const CodeSection* prev_cs      = NULL;
   439   const CodeSection* prev_cs      = NULL;
   447   CodeSection*       prev_dest_cs = NULL;
   440   CodeSection*       prev_dest_cs = NULL;
   448   for (int n = 0; n < (int)SECT_LIMIT; n++) {
   441 
       
   442   for (int n = (int) SECT_FIRST; n < (int) SECT_LIMIT; n++) {
   449     // figure compact layout of each section
   443     // figure compact layout of each section
   450     const CodeSection* cs = code_section(n);
   444     const CodeSection* cs = code_section(n);
   451     address cstart = cs->start();
   445     csize_t csize = cs->size();
   452     address cend   = cs->end();
       
   453     csize_t csize  = cend - cstart;
       
   454 
   446 
   455     CodeSection* dest_cs = dest->code_section(n);
   447     CodeSection* dest_cs = dest->code_section(n);
   456     if (!cs->is_empty()) {
   448     if (!cs->is_empty()) {
   457       // Compute initial padding; assign it to the previous non-empty guy.
   449       // Compute initial padding; assign it to the previous non-empty guy.
   458       // Cf. figure_expanded_capacities.
   450       // Cf. figure_expanded_capacities.
   461         buf_offset += padding;
   453         buf_offset += padding;
   462         assert(prev_dest_cs != NULL, "sanity");
   454         assert(prev_dest_cs != NULL, "sanity");
   463         prev_dest_cs->_limit += padding;
   455         prev_dest_cs->_limit += padding;
   464       }
   456       }
   465       #ifdef ASSERT
   457       #ifdef ASSERT
   466       if (prev_cs != NULL && prev_cs->is_frozen() && n < SECT_CONSTS) {
   458       if (prev_cs != NULL && prev_cs->is_frozen() && n < (SECT_LIMIT - 1)) {
   467         // Make sure the ends still match up.
   459         // Make sure the ends still match up.
   468         // This is important because a branch in a frozen section
   460         // This is important because a branch in a frozen section
   469         // might target code in a following section, via a Label,
   461         // might target code in a following section, via a Label,
   470         // and without a relocation record.  See Label::patch_instructions.
   462         // and without a relocation record.  See Label::patch_instructions.
   471         address dest_start = buf+buf_offset;
   463         address dest_start = buf+buf_offset;
   490   // Done calculating sections; did it come out to the right end?
   482   // Done calculating sections; did it come out to the right end?
   491   assert(buf_offset == total_content_size(), "sanity");
   483   assert(buf_offset == total_content_size(), "sanity");
   492   assert(dest->verify_section_allocation(), "final configuration works");
   484   assert(dest->verify_section_allocation(), "final configuration works");
   493 }
   485 }
   494 
   486 
   495 csize_t CodeBuffer::total_offset_of(address addr) const {
   487 csize_t CodeBuffer::total_offset_of(CodeSection* cs) const {
   496   csize_t code_size_so_far = 0;
   488   csize_t size_so_far = 0;
   497   for (int n = 0; n < (int)SECT_LIMIT; n++) {
   489   for (int n = (int) SECT_FIRST; n < (int) SECT_LIMIT; n++) {
   498     const CodeSection* cs = code_section(n);
   490     const CodeSection* cur_cs = code_section(n);
   499     if (!cs->is_empty()) {
   491     if (!cur_cs->is_empty()) {
   500       code_size_so_far = cs->align_at_start(code_size_so_far);
   492       size_so_far = cur_cs->align_at_start(size_so_far);
   501     }
   493     }
   502     if (cs->contains2(addr)) {
   494     if (cur_cs->index() == cs->index()) {
   503       return code_size_so_far + (addr - cs->start());
   495       return size_so_far;
   504     }
   496     }
   505     code_size_so_far += cs->size();
   497     size_so_far += cur_cs->size();
   506   }
   498   }
   507 #ifndef PRODUCT
       
   508   tty->print_cr("Dangling address " PTR_FORMAT " in:", addr);
       
   509   ((CodeBuffer*)this)->print();
       
   510 #endif
       
   511   ShouldNotReachHere();
   499   ShouldNotReachHere();
   512   return -1;
   500   return -1;
   513 }
   501 }
   514 
   502 
   515 csize_t CodeBuffer::total_relocation_size() const {
   503 csize_t CodeBuffer::total_relocation_size() const {
   531   }
   519   }
   532   // if dest == NULL, this is just the sizing pass
   520   // if dest == NULL, this is just the sizing pass
   533 
   521 
   534   csize_t code_end_so_far = 0;
   522   csize_t code_end_so_far = 0;
   535   csize_t code_point_so_far = 0;
   523   csize_t code_point_so_far = 0;
   536   for (int n = 0; n < (int)SECT_LIMIT; n++) {
   524   for (int n = (int) SECT_FIRST; n < (int)SECT_LIMIT; n++) {
   537     // pull relocs out of each section
   525     // pull relocs out of each section
   538     const CodeSection* cs = code_section(n);
   526     const CodeSection* cs = code_section(n);
   539     assert(!(cs->is_empty() && cs->locs_count() > 0), "sanity");
   527     assert(!(cs->is_empty() && cs->locs_count() > 0), "sanity");
   540     if (cs->is_empty())  continue;  // skip trivial section
   528     if (cs->is_empty())  continue;  // skip trivial section
   541     relocInfo* lstart = cs->locs_start();
   529     relocInfo* lstart = cs->locs_start();
   633 
   621 
   634   // Flush generated code
   622   // Flush generated code
   635   ICache::invalidate_range(dest_blob->code_begin(), dest_blob->code_size());
   623   ICache::invalidate_range(dest_blob->code_begin(), dest_blob->code_size());
   636 }
   624 }
   637 
   625 
   638 // Move all my code into another code buffer.
   626 // Move all my code into another code buffer.  Consult applicable
   639 // Consult applicable relocs to repair embedded addresses.
   627 // relocs to repair embedded addresses.  The layout in the destination
       
   628 // CodeBuffer is different to the source CodeBuffer: the destination
       
   629 // CodeBuffer gets the final layout (consts, insts, stubs in order of
       
   630 // ascending address).
   640 void CodeBuffer::relocate_code_to(CodeBuffer* dest) const {
   631 void CodeBuffer::relocate_code_to(CodeBuffer* dest) const {
   641   DEBUG_ONLY(address dest_end = dest->_total_start + dest->_total_size);
   632   DEBUG_ONLY(address dest_end = dest->_total_start + dest->_total_size);
   642   for (int n = 0; n < (int)SECT_LIMIT; n++) {
   633   for (int n = (int) SECT_FIRST; n < (int) SECT_LIMIT; n++) {
   643     // pull code out of each section
   634     // pull code out of each section
   644     const CodeSection* cs = code_section(n);
   635     const CodeSection* cs = code_section(n);
   645     if (cs->is_empty())  continue;  // skip trivial section
   636     if (cs->is_empty())  continue;  // skip trivial section
   646     CodeSection* dest_cs = dest->code_section(n);
   637     CodeSection* dest_cs = dest->code_section(n);
   647     assert(cs->size() == dest_cs->size(), "sanity");
   638     assert(cs->size() == dest_cs->size(), "sanity");
   679 csize_t CodeBuffer::figure_expanded_capacities(CodeSection* which_cs,
   670 csize_t CodeBuffer::figure_expanded_capacities(CodeSection* which_cs,
   680                                                csize_t amount,
   671                                                csize_t amount,
   681                                                csize_t* new_capacity) {
   672                                                csize_t* new_capacity) {
   682   csize_t new_total_cap = 0;
   673   csize_t new_total_cap = 0;
   683 
   674 
   684   int prev_n = -1;
   675   for (int n = (int) SECT_FIRST; n < (int) SECT_LIMIT; n++) {
   685   for (int n = 0; n < (int)SECT_LIMIT; n++) {
       
   686     const CodeSection* sect = code_section(n);
   676     const CodeSection* sect = code_section(n);
   687 
   677 
   688     if (!sect->is_empty()) {
   678     if (!sect->is_empty()) {
   689       // Compute initial padding; assign it to the previous non-empty guy.
   679       // Compute initial padding; assign it to the previous section,
   690       // Cf. compute_final_layout.
   680       // even if it's empty (e.g. consts section can be empty).
       
   681       // Cf. compute_final_layout
   691       csize_t padding = sect->align_at_start(new_total_cap) - new_total_cap;
   682       csize_t padding = sect->align_at_start(new_total_cap) - new_total_cap;
   692       if (padding != 0) {
   683       if (padding != 0) {
   693         new_total_cap += padding;
   684         new_total_cap += padding;
   694         assert(prev_n >= 0, "sanity");
   685         assert(n - 1 >= SECT_FIRST, "sanity");
   695         new_capacity[prev_n] += padding;
   686         new_capacity[n - 1] += padding;
   696       }
   687       }
   697       prev_n = n;
       
   698     }
   688     }
   699 
   689 
   700     csize_t exp = sect->size();  // 100% increase
   690     csize_t exp = sect->size();  // 100% increase
   701     if ((uint)exp < 4*K)  exp = 4*K;       // minimum initial increase
   691     if ((uint)exp < 4*K)  exp = 4*K;       // minimum initial increase
   702     if (sect == which_cs) {
   692     if (sect == which_cs) {
   772   DEBUG_ONLY(this->_blob = NULL);  // silence a later assert
   762   DEBUG_ONLY(this->_blob = NULL);  // silence a later assert
   773   bxp->_before_expand = this->_before_expand;
   763   bxp->_before_expand = this->_before_expand;
   774   this->_before_expand = bxp;
   764   this->_before_expand = bxp;
   775 
   765 
   776   // Give each section its required (expanded) capacity.
   766   // Give each section its required (expanded) capacity.
   777   for (int n = (int)SECT_LIMIT-1; n >= SECT_INSTS; n--) {
   767   for (int n = (int)SECT_LIMIT-1; n >= SECT_FIRST; n--) {
   778     CodeSection* cb_sect   = cb.code_section(n);
   768     CodeSection* cb_sect   = cb.code_section(n);
   779     CodeSection* this_sect = code_section(n);
   769     CodeSection* this_sect = code_section(n);
   780     if (new_capacity[n] == 0)  continue;  // already nulled out
   770     if (new_capacity[n] == 0)  continue;  // already nulled out
   781     if (n > SECT_INSTS) {
   771     if (n != SECT_INSTS) {
   782       cb.initialize_section_size(cb_sect, new_capacity[n]);
   772       cb.initialize_section_size(cb_sect, new_capacity[n]);
   783     }
   773     }
   784     assert(cb_sect->capacity() >= new_capacity[n], "big enough");
   774     assert(cb_sect->capacity() >= new_capacity[n], "big enough");
   785     address cb_start = cb_sect->start();
   775     address cb_start = cb_sect->start();
   786     cb_sect->set_end(cb_start + this_sect->size());
   776     cb_sect->set_end(cb_start + this_sect->size());
   842   address tend   = tstart + _total_size;
   832   address tend   = tstart + _total_size;
   843   if (_blob != NULL) {
   833   if (_blob != NULL) {
   844     assert(tstart >= _blob->content_begin(), "sanity");
   834     assert(tstart >= _blob->content_begin(), "sanity");
   845     assert(tend   <= _blob->content_end(),   "sanity");
   835     assert(tend   <= _blob->content_end(),   "sanity");
   846   }
   836   }
   847   address tcheck = tstart;  // advancing pointer to verify disjointness
   837   // Verify disjointness.
   848   for (int n = 0; n < (int)SECT_LIMIT; n++) {
   838   for (int n = (int) SECT_FIRST; n < (int) SECT_LIMIT; n++) {
   849     CodeSection* sect = code_section(n);
   839     CodeSection* sect = code_section(n);
   850     if (!sect->is_allocated())  continue;
   840     if (!sect->is_allocated() || sect->is_empty())  continue;
   851     assert(sect->start() >= tcheck, "sanity");
   841     assert((intptr_t)sect->start() % sect->alignment() == 0
   852     tcheck = sect->start();
       
   853     assert((intptr_t)tcheck % sect->alignment() == 0
       
   854            || sect->is_empty() || _blob == NULL,
   842            || sect->is_empty() || _blob == NULL,
   855            "start is aligned");
   843            "start is aligned");
   856     assert(sect->end()   >= tcheck, "sanity");
   844     for (int m = (int) SECT_FIRST; m < (int) SECT_LIMIT; m++) {
   857     assert(sect->end()   <= tend,   "sanity");
   845       CodeSection* other = code_section(m);
       
   846       if (!other->is_allocated() || other == sect)  continue;
       
   847       assert(!other->contains(sect->start()    ), "sanity");
       
   848       // limit is an exclusive address and can be the start of another
       
   849       // section.
       
   850       assert(!other->contains(sect->limit() - 1), "sanity");
       
   851     }
       
   852     assert(sect->end() <= tend, "sanity");
   858   }
   853   }
   859   return true;
   854   return true;
   860 }
   855 }
   861 #endif //ASSERT
   856 #endif //ASSERT
   862 
   857