8081406: cleanup and minor extensions of the debugging facilities in CodeStrings

Avoid issues around _defunct CodeStrings

Reviewed-by: dholmes, coleenp
This commit is contained in:
Bertrand Delsart 2015-06-25 08:17:52 +02:00
parent d60d6fdf40
commit 2a01bb6dda
3 changed files with 20 additions and 5 deletions

View File

@ -1093,9 +1093,11 @@ void CodeStrings::add_comment(intptr_t offset, const char * comment) {
void CodeStrings::assign(CodeStrings& other) { void CodeStrings::assign(CodeStrings& other) {
other.check_valid(); other.check_valid();
// Cannot do following because CodeStrings constructor is not alway run!
assert(is_null(), "Cannot assign onto non-empty CodeStrings"); assert(is_null(), "Cannot assign onto non-empty CodeStrings");
_strings = other._strings; _strings = other._strings;
#ifdef ASSERT
_defunct = false;
#endif
other.set_null_and_invalidate(); other.set_null_and_invalidate();
} }
@ -1115,13 +1117,15 @@ void CodeStrings::copy(CodeStrings& other) {
} }
} }
const char* CodeStrings::_prefix = " ;; "; // default: can be changed via set_prefix
void CodeStrings::print_block_comment(outputStream* stream, intptr_t offset) const { void CodeStrings::print_block_comment(outputStream* stream, intptr_t offset) const {
check_valid(); check_valid();
if (_strings != NULL) { if (_strings != NULL) {
CodeString* c = find(offset); CodeString* c = find(offset);
while (c && c->offset() == offset) { while (c && c->offset() == offset) {
stream->bol(); stream->bol();
stream->print(" ;; "); stream->print("%s", _prefix);
stream->print_cr("%s", c->string()); stream->print_cr("%s", c->string());
c = c->next_comment(); c = c->next_comment();
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -249,6 +249,7 @@ private:
// Becomes true after copy-out, forbids further use. // Becomes true after copy-out, forbids further use.
bool _defunct; // Zero bit pattern is "valid", see memset call in decode_env::decode_env bool _defunct; // Zero bit pattern is "valid", see memset call in decode_env::decode_env
#endif #endif
static const char* _prefix; // defaults to " ;; "
#endif #endif
CodeString* find(intptr_t offset) const; CodeString* find(intptr_t offset) const;
@ -289,11 +290,18 @@ public:
void assign(CodeStrings& other) PRODUCT_RETURN; void assign(CodeStrings& other) PRODUCT_RETURN;
// COPY strings from other to this; leave other valid. // COPY strings from other to this; leave other valid.
void copy(CodeStrings& other) PRODUCT_RETURN; void copy(CodeStrings& other) PRODUCT_RETURN;
// FREE strings; invalidate this.
void free() PRODUCT_RETURN; void free() PRODUCT_RETURN;
// Guarantee that _strings are used at most once; assign invalidates a buffer. // Guarantee that _strings are used at most once; assign and free invalidate a buffer.
inline void check_valid() const { inline void check_valid() const {
#ifdef ASSERT #ifdef ASSERT
assert(!_defunct, "Use of invalid CodeStrings"); assert(!_defunct, "Use of invalid CodeStrings");
#endif
}
static void set_prefix(const char *prefix) {
#ifndef PRODUCT
_prefix = prefix;
#endif #endif
} }
}; };
@ -379,6 +387,7 @@ class CodeBuffer: public StackObj {
_oop_recorder = NULL; _oop_recorder = NULL;
_decode_begin = NULL; _decode_begin = NULL;
_overflow_arena = NULL; _overflow_arena = NULL;
_code_strings = CodeStrings();
} }
void initialize(address code_start, csize_t code_size) { void initialize(address code_start, csize_t code_size) {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -88,6 +88,7 @@ CodeBlob::CodeBlob(const char* name, int header_size, int size, int frame_comple
_data_offset = size; _data_offset = size;
_frame_size = 0; _frame_size = 0;
set_oop_maps(NULL); set_oop_maps(NULL);
_strings = CodeStrings();
} }
@ -114,6 +115,7 @@ CodeBlob::CodeBlob(
_code_offset = _content_offset + cb->total_offset_of(cb->insts()); _code_offset = _content_offset + cb->total_offset_of(cb->insts());
_data_offset = _content_offset + round_to(cb->total_content_size(), oopSize); _data_offset = _content_offset + round_to(cb->total_content_size(), oopSize);
assert(_data_offset <= size, "codeBlob is too small"); assert(_data_offset <= size, "codeBlob is too small");
_strings = CodeStrings();
cb->copy_code_and_locs_to(this); cb->copy_code_and_locs_to(this);
set_oop_maps(oop_maps); set_oop_maps(oop_maps);