8335536: Fix assertion failure in IdealGraphPrinter when append is true

Backport-of: 6db4c6a772
This commit is contained in:
Qizheng Xing
2024-07-09 09:56:07 +00:00
committed by Vitaly Provodin
parent 193884a6a5
commit 2cf022bf75
2 changed files with 22 additions and 11 deletions

View File

@@ -143,21 +143,24 @@ void IdealGraphPrinter::init(const char* file_name, bool use_multiple_files, boo
_depth = 0;
_current_method = nullptr;
_network_stream = nullptr;
_append = append;
if (file_name != nullptr) {
init_file_stream(file_name, use_multiple_files, append);
init_file_stream(file_name, use_multiple_files);
} else {
init_network_stream();
}
_xml = new (mtCompiler) xmlStream(_output);
if (!append) {
if (!_append) {
head(TOP_ELEMENT);
}
}
// Destructor, close file or network stream
IdealGraphPrinter::~IdealGraphPrinter() {
tail(TOP_ELEMENT);
if (!_append) {
tail(TOP_ELEMENT);
}
// tty->print_cr("Walk time: %d", (int)_walk_time.milliseconds());
// tty->print_cr("Output time: %d", (int)_output_time.milliseconds());
@@ -830,10 +833,10 @@ void IdealGraphPrinter::print(const char *name, Node *node) {
_xml->flush();
}
void IdealGraphPrinter::init_file_stream(const char* file_name, bool use_multiple_files, bool append) {
void IdealGraphPrinter::init_file_stream(const char* file_name, bool use_multiple_files) {
ThreadCritical tc;
if (use_multiple_files && _file_count != 0) {
assert(!append, "append should only be used for debugging with a single file");
assert(!_append, "append should only be used for debugging with a single file");
ResourceMark rm;
stringStream st;
const char* dot = strrchr(file_name, '.');
@@ -845,10 +848,10 @@ void IdealGraphPrinter::init_file_stream(const char* file_name, bool use_multipl
}
_output = new (mtCompiler) fileStream(st.as_string(), "w");
} else {
_output = new (mtCompiler) fileStream(file_name, append ? "a" : "w");
_output = new (mtCompiler) fileStream(file_name, _append ? "a" : "w");
}
if (use_multiple_files) {
assert(!append, "append should only be used for debugging with a single file");
assert(!_append, "append should only be used for debugging with a single file");
_file_count++;
}
}
@@ -879,9 +882,16 @@ void IdealGraphPrinter::update_compiled_method(ciMethod* current_method) {
assert(C != nullptr, "must already be set");
if (current_method != _current_method) {
// If a different method, end the old and begin with the new one.
end_method();
_current_method = nullptr;
begin_method();
if (_append) {
// Do not call `end_method` if we are appending, just update `_current_method`,
// because `begin_method` is not called in the constructor in append mode.
_current_method = current_method;
} else {
// End the old method and begin a new one.
// Don't worry about `_current_method`, `end_method` will clear it.
end_method();
begin_method();
}
}
}

View File

@@ -95,6 +95,7 @@ class IdealGraphPrinter : public CHeapObj<mtCompiler> {
bool _traverse_outs;
Compile *C;
double _max_freq;
bool _append;
void print_method(ciMethod *method, int bci, InlineTree *tree);
void print_inline_tree(InlineTree *tree);
@@ -116,7 +117,7 @@ class IdealGraphPrinter : public CHeapObj<mtCompiler> {
void head(const char *name);
void text(const char *s);
void init(const char* file_name, bool use_multiple_files, bool append);
void init_file_stream(const char* file_name, bool use_multiple_files, bool append);
void init_file_stream(const char* file_name, bool use_multiple_files);
void init_network_stream();
IdealGraphPrinter();
~IdealGraphPrinter();