Skip to content
Snippets Groups Projects
Commit ae7be19a authored by Qizheng Xing's avatar Qizheng Xing Committed by Paul Hohensee
Browse files

8335536: Fix assertion failure in IdealGraphPrinter when append is true

Reviewed-by: phh
Backport-of: 6db4c6a772df856fc3099c32a5b2c102a30d360c
parent 1f14f860
No related branches found
No related tags found
No related merge requests found
......@@ -141,21 +141,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 (ResourceObj::C_HEAP, mtCompiler) xmlStream(_output);
if (!append) {
if (!_append) {
head(TOP_ELEMENT);
}
}
// Destructor, close file or network stream
IdealGraphPrinter::~IdealGraphPrinter() {
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());
......@@ -729,10 +732,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, '.');
......@@ -744,10 +747,10 @@ void IdealGraphPrinter::init_file_stream(const char* file_name, bool use_multipl
}
_output = new (ResourceObj::C_HEAP, mtCompiler) fileStream(st.as_string(), "w");
} else {
_output = new (ResourceObj::C_HEAP, mtCompiler) fileStream(file_name, append ? "a" : "w");
_output = new (ResourceObj::C_HEAP, 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++;
}
}
......@@ -778,11 +781,18 @@ 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.
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();
_current_method = nullptr;
begin_method();
}
}
}
extern const char *NodeClassNames[];
......
......@@ -93,6 +93,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);
......@@ -110,7 +111,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();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment