1 | /* |
2 | * Copyright (c) 2002, 2019, Oracle and/or its affiliates. All rights reserved. |
3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 | * |
5 | * This code is free software; you can redistribute it and/or modify it |
6 | * under the terms of the GNU General Public License version 2 only, as |
7 | * published by the Free Software Foundation. |
8 | * |
9 | * This code is distributed in the hope that it will be useful, but WITHOUT |
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
12 | * version 2 for more details (a copy is included in the LICENSE file that |
13 | * accompanied this code). |
14 | * |
15 | * You should have received a copy of the GNU General Public License version |
16 | * 2 along with this work; if not, write to the Free Software Foundation, |
17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
18 | * |
19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
20 | * or visit www.oracle.com if you need additional information or have any |
21 | * questions. |
22 | * |
23 | */ |
24 | |
25 | #ifndef SHARE_COMPILER_COMPILELOG_HPP |
26 | #define SHARE_COMPILER_COMPILELOG_HPP |
27 | |
28 | #include "utilities/xmlstream.hpp" |
29 | |
30 | class ciBaseObject; |
31 | class ciKlass; |
32 | class ciObject; |
33 | class ciMetadata; |
34 | class ciSymbol; |
35 | |
36 | // CompileLog |
37 | // |
38 | // An open stream for logging information about activities in a |
39 | // compiler thread. There is exactly one per CompilerThread, |
40 | // if the +LogCompilation switch is enabled. |
41 | class CompileLog : public xmlStream { |
42 | private: |
43 | const char* _file; // name of file where XML goes |
44 | julong _file_end; // last good end of file |
45 | intx _thread_id; // which compile thread |
46 | |
47 | stringStream _context; // optional, killable context marker |
48 | char _context_buffer[100]; |
49 | |
50 | char* _identities; // array of boolean |
51 | int _identities_limit; |
52 | int _identities_capacity; |
53 | |
54 | CompileLog* _next; // static chain of all logs |
55 | |
56 | static CompileLog* _first; // head of static chain |
57 | |
58 | void va_tag(bool push, const char* format, va_list ap) ATTRIBUTE_PRINTF(3, 0); |
59 | |
60 | public: |
61 | CompileLog(const char* file_name, FILE* fp, intx thread_id); |
62 | ~CompileLog(); |
63 | |
64 | intx thread_id() { return _thread_id; } |
65 | const char* file() { return _file; } |
66 | |
67 | // Optional context marker, to help place actions that occur during |
68 | // parsing. If there is no log output until the next context string |
69 | // or reset, context string will be silently ignored |
70 | stringStream* context() { return &_context; } |
71 | void clear_context() { context()->reset(); } |
72 | void set_context(const char* format, ...) ATTRIBUTE_PRINTF(2, 3); |
73 | |
74 | void name(ciSymbol* s); // name='s' |
75 | void name(Symbol* s) { xmlStream::name(s); } |
76 | void name(ciKlass* k); |
77 | |
78 | // Output an object description, return obj->ident(). |
79 | int identify(ciBaseObject* obj); |
80 | void clear_identities(); |
81 | |
82 | void inline_fail (const char* reason); |
83 | void inline_success(const char* reason); |
84 | |
85 | // virtuals |
86 | virtual void see_tag(const char* tag, bool push); |
87 | virtual void pop_tag(const char* tag); |
88 | |
89 | // make a provisional end of log mark |
90 | void mark_file_end() { _file_end = out()->count(); } |
91 | |
92 | // Print code cache statistics |
93 | void code_cache_state(); |
94 | |
95 | // copy all logs to the given stream |
96 | static void finish_log(outputStream* out); |
97 | static void finish_log_on_error(outputStream* out, char *buf, int buflen); |
98 | }; |
99 | |
100 | #endif // SHARE_COMPILER_COMPILELOG_HPP |
101 | |