8358330: AsmRemarks and DbgStrings clear() method may not get called before their destructor
Reviewed-by: kvn
This commit is contained in:
parent
8a79ac8863
commit
fd0ab04367
@ -1099,7 +1099,8 @@ CHeapString::~CHeapString() {
|
|||||||
// offset is a byte offset into an instruction stream (CodeBuffer, CodeBlob or
|
// offset is a byte offset into an instruction stream (CodeBuffer, CodeBlob or
|
||||||
// other memory buffer) and remark is a string (comment).
|
// other memory buffer) and remark is a string (comment).
|
||||||
//
|
//
|
||||||
AsmRemarks::AsmRemarks() : _remarks(new AsmRemarkCollection()) {
|
AsmRemarks::AsmRemarks() {
|
||||||
|
init();
|
||||||
assert(_remarks != nullptr, "Allocation failure!");
|
assert(_remarks != nullptr, "Allocation failure!");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1107,6 +1108,10 @@ AsmRemarks::~AsmRemarks() {
|
|||||||
assert(_remarks == nullptr, "Must 'clear()' before deleting!");
|
assert(_remarks == nullptr, "Must 'clear()' before deleting!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AsmRemarks::init() {
|
||||||
|
_remarks = new AsmRemarkCollection();
|
||||||
|
}
|
||||||
|
|
||||||
const char* AsmRemarks::insert(uint offset, const char* remstr) {
|
const char* AsmRemarks::insert(uint offset, const char* remstr) {
|
||||||
precond(remstr != nullptr);
|
precond(remstr != nullptr);
|
||||||
return _remarks->insert(offset, remstr);
|
return _remarks->insert(offset, remstr);
|
||||||
@ -1151,7 +1156,8 @@ uint AsmRemarks::print(uint offset, outputStream* strm) const {
|
|||||||
// Acting as interface to reference counted collection of (debug) strings used
|
// Acting as interface to reference counted collection of (debug) strings used
|
||||||
// in the code generated, and thus requiring a fixed address.
|
// in the code generated, and thus requiring a fixed address.
|
||||||
//
|
//
|
||||||
DbgStrings::DbgStrings() : _strings(new DbgStringCollection()) {
|
DbgStrings::DbgStrings() {
|
||||||
|
init();
|
||||||
assert(_strings != nullptr, "Allocation failure!");
|
assert(_strings != nullptr, "Allocation failure!");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1159,6 +1165,10 @@ DbgStrings::~DbgStrings() {
|
|||||||
assert(_strings == nullptr, "Must 'clear()' before deleting!");
|
assert(_strings == nullptr, "Must 'clear()' before deleting!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DbgStrings::init() {
|
||||||
|
_strings = new DbgStringCollection();
|
||||||
|
}
|
||||||
|
|
||||||
const char* DbgStrings::insert(const char* dbgstr) {
|
const char* DbgStrings::insert(const char* dbgstr) {
|
||||||
const char* str = _strings->lookup(dbgstr);
|
const char* str = _strings->lookup(dbgstr);
|
||||||
return str != nullptr ? str : _strings->insert(dbgstr);
|
return str != nullptr ? str : _strings->insert(dbgstr);
|
||||||
|
@ -426,6 +426,8 @@ class AsmRemarks {
|
|||||||
AsmRemarks();
|
AsmRemarks();
|
||||||
~AsmRemarks();
|
~AsmRemarks();
|
||||||
|
|
||||||
|
void init();
|
||||||
|
|
||||||
const char* insert(uint offset, const char* remstr);
|
const char* insert(uint offset, const char* remstr);
|
||||||
|
|
||||||
bool is_empty() const;
|
bool is_empty() const;
|
||||||
@ -452,6 +454,8 @@ class DbgStrings {
|
|||||||
DbgStrings();
|
DbgStrings();
|
||||||
~DbgStrings();
|
~DbgStrings();
|
||||||
|
|
||||||
|
void init();
|
||||||
|
|
||||||
const char* insert(const char* dbgstr);
|
const char* insert(const char* dbgstr);
|
||||||
|
|
||||||
bool is_empty() const;
|
bool is_empty() const;
|
||||||
|
@ -915,26 +915,22 @@ CodeBlob* AOTCodeReader::compile_code_blob(const char* name, int entry_offset_co
|
|||||||
oop_maps = read_oop_map_set();
|
oop_maps = read_oop_map_set();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef PRODUCT
|
|
||||||
AsmRemarks asm_remarks;
|
|
||||||
read_asm_remarks(asm_remarks);
|
|
||||||
DbgStrings dbg_strings;
|
|
||||||
read_dbg_strings(dbg_strings);
|
|
||||||
#endif // PRODUCT
|
|
||||||
|
|
||||||
CodeBlob* code_blob = CodeBlob::create(archived_blob,
|
CodeBlob* code_blob = CodeBlob::create(archived_blob,
|
||||||
stored_name,
|
stored_name,
|
||||||
reloc_data,
|
reloc_data,
|
||||||
oop_maps
|
oop_maps
|
||||||
#ifndef PRODUCT
|
|
||||||
, asm_remarks
|
|
||||||
, dbg_strings
|
|
||||||
#endif
|
|
||||||
);
|
);
|
||||||
if (code_blob == nullptr) { // no space left in CodeCache
|
if (code_blob == nullptr) { // no space left in CodeCache
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef PRODUCT
|
||||||
|
code_blob->asm_remarks().init();
|
||||||
|
read_asm_remarks(code_blob->asm_remarks());
|
||||||
|
code_blob->dbg_strings().init();
|
||||||
|
read_dbg_strings(code_blob->dbg_strings());
|
||||||
|
#endif // PRODUCT
|
||||||
|
|
||||||
fix_relocations(code_blob);
|
fix_relocations(code_blob);
|
||||||
|
|
||||||
// Read entries offsets
|
// Read entries offsets
|
||||||
|
@ -281,10 +281,6 @@ CodeBlob* CodeBlob::create(CodeBlob* archived_blob,
|
|||||||
const char* name,
|
const char* name,
|
||||||
address archived_reloc_data,
|
address archived_reloc_data,
|
||||||
ImmutableOopMapSet* archived_oop_maps
|
ImmutableOopMapSet* archived_oop_maps
|
||||||
#ifndef PRODUCT
|
|
||||||
, AsmRemarks& archived_asm_remarks
|
|
||||||
, DbgStrings& archived_dbg_strings
|
|
||||||
#endif // PRODUCT
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
|
ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
|
||||||
@ -303,13 +299,6 @@ CodeBlob* CodeBlob::create(CodeBlob* archived_blob,
|
|||||||
archived_oop_maps);
|
archived_oop_maps);
|
||||||
assert(blob != nullptr, "sanity check");
|
assert(blob != nullptr, "sanity check");
|
||||||
|
|
||||||
#ifndef PRODUCT
|
|
||||||
blob->use_remarks(archived_asm_remarks);
|
|
||||||
archived_asm_remarks.clear();
|
|
||||||
blob->use_strings(archived_dbg_strings);
|
|
||||||
archived_dbg_strings.clear();
|
|
||||||
#endif // PRODUCT
|
|
||||||
|
|
||||||
// Flush the code block
|
// Flush the code block
|
||||||
ICache::invalidate_range(blob->code_begin(), blob->code_size());
|
ICache::invalidate_range(blob->code_begin(), blob->code_size());
|
||||||
CodeCache::commit(blob); // Count adapters
|
CodeCache::commit(blob); // Count adapters
|
||||||
|
@ -318,12 +318,7 @@ public:
|
|||||||
static CodeBlob* create(CodeBlob* archived_blob,
|
static CodeBlob* create(CodeBlob* archived_blob,
|
||||||
const char* name,
|
const char* name,
|
||||||
address archived_reloc_data,
|
address archived_reloc_data,
|
||||||
ImmutableOopMapSet* archived_oop_maps
|
ImmutableOopMapSet* archived_oop_maps);
|
||||||
#ifndef PRODUCT
|
|
||||||
, AsmRemarks& archived_asm_remarks
|
|
||||||
, DbgStrings& archived_dbg_strings
|
|
||||||
#endif // PRODUCT
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
|
Loading…
x
Reference in New Issue
Block a user