comparison src/share/vm/asm/codeBuffer.hpp @ 8767:a5de0cc2f91c

8008555: Debugging code in compiled method sometimes leaks memory Summary: support for strings that have same life-time as code that uses them. Reviewed-by: kvn, twisti
author roland
date Mon, 18 Mar 2013 13:19:06 +0100
parents cd3d6a6b95d9
children 9758d9f36299
comparison
equal deleted inserted replaced
8765:592f9722c72e 8767:a5de0cc2f91c
26 #define SHARE_VM_ASM_CODEBUFFER_HPP 26 #define SHARE_VM_ASM_CODEBUFFER_HPP
27 27
28 #include "code/oopRecorder.hpp" 28 #include "code/oopRecorder.hpp"
29 #include "code/relocInfo.hpp" 29 #include "code/relocInfo.hpp"
30 30
31 class CodeComments; 31 class CodeStrings;
32 class PhaseCFG; 32 class PhaseCFG;
33 class Compile; 33 class Compile;
34 class BufferBlob; 34 class BufferBlob;
35 class CodeBuffer; 35 class CodeBuffer;
36 class Label; 36 class Label;
238 void dump(); 238 void dump();
239 void print(const char* name); 239 void print(const char* name);
240 #endif //PRODUCT 240 #endif //PRODUCT
241 }; 241 };
242 242
243 class CodeComment; 243 class CodeString;
244 class CodeComments VALUE_OBJ_CLASS_SPEC { 244 class CodeStrings VALUE_OBJ_CLASS_SPEC {
245 private: 245 private:
246 #ifndef PRODUCT 246 #ifndef PRODUCT
247 CodeComment* _comments; 247 CodeString* _strings;
248 #endif 248 #endif
249
250 CodeString* find(intptr_t offset) const;
251 CodeString* find_last(intptr_t offset) const;
249 252
250 public: 253 public:
251 CodeComments() { 254 CodeStrings() {
252 #ifndef PRODUCT 255 #ifndef PRODUCT
253 _comments = NULL; 256 _strings = NULL;
254 #endif 257 #endif
255 } 258 }
259
260 const char* add_string(const char * string) PRODUCT_RETURN_(return NULL;);
256 261
257 void add_comment(intptr_t offset, const char * comment) PRODUCT_RETURN; 262 void add_comment(intptr_t offset, const char * comment) PRODUCT_RETURN;
258 void print_block_comment(outputStream* stream, intptr_t offset) const PRODUCT_RETURN; 263 void print_block_comment(outputStream* stream, intptr_t offset) const PRODUCT_RETURN;
259 void assign(CodeComments& other) PRODUCT_RETURN; 264 void assign(CodeStrings& other) PRODUCT_RETURN;
260 void free() PRODUCT_RETURN; 265 void free() PRODUCT_RETURN;
261 }; 266 };
262
263 267
264 // A CodeBuffer describes a memory space into which assembly 268 // A CodeBuffer describes a memory space into which assembly
265 // code is generated. This memory space usually occupies the 269 // code is generated. This memory space usually occupies the
266 // interior of a single BufferBlob, but in some cases it may be 270 // interior of a single BufferBlob, but in some cases it may be
267 // an arbitrary span of memory, even outside the code cache. 271 // an arbitrary span of memory, even outside the code cache.
324 BufferBlob* _blob; // optional buffer in CodeCache for generated code 328 BufferBlob* _blob; // optional buffer in CodeCache for generated code
325 address _total_start; // first address of combined memory buffer 329 address _total_start; // first address of combined memory buffer
326 csize_t _total_size; // size in bytes of combined memory buffer 330 csize_t _total_size; // size in bytes of combined memory buffer
327 331
328 OopRecorder* _oop_recorder; 332 OopRecorder* _oop_recorder;
329 CodeComments _comments; 333 CodeStrings _strings;
330 OopRecorder _default_oop_recorder; // override with initialize_oop_recorder 334 OopRecorder _default_oop_recorder; // override with initialize_oop_recorder
331 Arena* _overflow_arena; 335 Arena* _overflow_arena;
332 336
333 address _decode_begin; // start address for decode 337 address _decode_begin; // start address for decode
334 address decode_begin(); 338 address decode_begin();
525 void initialize_stubs_size(csize_t size) { initialize_section_size(&_stubs, size); } 529 void initialize_stubs_size(csize_t size) { initialize_section_size(&_stubs, size); }
526 // Override default oop recorder. 530 // Override default oop recorder.
527 void initialize_oop_recorder(OopRecorder* r); 531 void initialize_oop_recorder(OopRecorder* r);
528 532
529 OopRecorder* oop_recorder() const { return _oop_recorder; } 533 OopRecorder* oop_recorder() const { return _oop_recorder; }
530 CodeComments& comments() { return _comments; } 534 CodeStrings& strings() { return _strings; }
531 535
532 // Code generation 536 // Code generation
533 void relocate(address at, RelocationHolder const& rspec, int format = 0) { 537 void relocate(address at, RelocationHolder const& rspec, int format = 0) {
534 _insts.relocate(at, rspec, format); 538 _insts.relocate(at, rspec, format);
535 } 539 }
554 558
555 // Transform an address from the code in this code buffer to a specified code buffer 559 // Transform an address from the code in this code buffer to a specified code buffer
556 address transform_address(const CodeBuffer &cb, address addr) const; 560 address transform_address(const CodeBuffer &cb, address addr) const;
557 561
558 void block_comment(intptr_t offset, const char * comment) PRODUCT_RETURN; 562 void block_comment(intptr_t offset, const char * comment) PRODUCT_RETURN;
563 const char* code_string(const char* str) PRODUCT_RETURN_(return NULL;);
559 564
560 // Log a little info about section usage in the CodeBuffer 565 // Log a little info about section usage in the CodeBuffer
561 void log_section_sizes(const char* name); 566 void log_section_sizes(const char* name);
562 567
563 #ifndef PRODUCT 568 #ifndef PRODUCT