1 | /* |
2 | * Copyright (c) 2015, 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 | #ifndef SHARE_LOGGING_LOGTAG_HPP |
25 | #define SHARE_LOGGING_LOGTAG_HPP |
26 | |
27 | #include "logging/logTag_ext.hpp" |
28 | #include "memory/allocation.hpp" |
29 | #include "utilities/globalDefinitions.hpp" |
30 | |
31 | // List of available logging tags. New tags should be added here. |
32 | // (The tags 'all', 'disable' and 'help' are special tags that can |
33 | // not be used in log calls, and should not be listed below.) |
34 | #define LOG_TAG_LIST \ |
35 | LOG_TAG(add) \ |
36 | LOG_TAG(age) \ |
37 | LOG_TAG(alloc) \ |
38 | LOG_TAG(aot) \ |
39 | LOG_TAG(annotation) \ |
40 | LOG_TAG(arguments) \ |
41 | LOG_TAG(attach) \ |
42 | LOG_TAG(barrier) \ |
43 | LOG_TAG(biasedlocking) \ |
44 | LOG_TAG(blocks) \ |
45 | LOG_TAG(bot) \ |
46 | LOG_TAG(breakpoint) \ |
47 | LOG_TAG(bytecode) \ |
48 | LOG_TAG(cds) \ |
49 | LOG_TAG(census) \ |
50 | LOG_TAG(class) \ |
51 | LOG_TAG(classhisto) \ |
52 | LOG_TAG(cleanup) \ |
53 | LOG_TAG(codecache) \ |
54 | LOG_TAG(compaction) \ |
55 | LOG_TAG(compilation) \ |
56 | LOG_TAG(constraints) \ |
57 | LOG_TAG(constantpool) \ |
58 | LOG_TAG(container) \ |
59 | LOG_TAG(coops) \ |
60 | LOG_TAG(cpu) \ |
61 | LOG_TAG(cset) \ |
62 | LOG_TAG(data) \ |
63 | LOG_TAG(datacreation) \ |
64 | LOG_TAG(dcmd) \ |
65 | LOG_TAG(decoder) \ |
66 | LOG_TAG(defaultmethods) \ |
67 | LOG_TAG(director) \ |
68 | LOG_TAG(dump) \ |
69 | LOG_TAG(dynamic) \ |
70 | LOG_TAG(ergo) \ |
71 | LOG_TAG(event) \ |
72 | LOG_TAG(exceptions) \ |
73 | LOG_TAG(exit) \ |
74 | LOG_TAG(fingerprint) \ |
75 | LOG_TAG(free) \ |
76 | LOG_TAG(freelist) \ |
77 | LOG_TAG(gc) \ |
78 | LOG_TAG(handshake) \ |
79 | LOG_TAG(hashtables) \ |
80 | LOG_TAG(heap) \ |
81 | LOG_TAG(humongous) \ |
82 | LOG_TAG(ihop) \ |
83 | LOG_TAG(iklass) \ |
84 | LOG_TAG(init) \ |
85 | LOG_TAG(inlining) \ |
86 | LOG_TAG(install) \ |
87 | LOG_TAG(interpreter) \ |
88 | LOG_TAG(itables) \ |
89 | LOG_TAG(jfr) \ |
90 | LOG_TAG(jit) \ |
91 | LOG_TAG(jni) \ |
92 | LOG_TAG(jvmti) \ |
93 | LOG_TAG(liveness) \ |
94 | LOG_TAG(load) /* Trace all classes loaded */ \ |
95 | LOG_TAG(loader) \ |
96 | LOG_TAG(logging) \ |
97 | LOG_TAG(malloc) \ |
98 | LOG_TAG(mark) \ |
99 | LOG_TAG(marking) \ |
100 | LOG_TAG(membername) \ |
101 | LOG_TAG(memops) \ |
102 | LOG_TAG(methodcomparator) \ |
103 | LOG_TAG(metadata) \ |
104 | LOG_TAG(metaspace) \ |
105 | LOG_TAG(mmu) \ |
106 | LOG_TAG(module) \ |
107 | LOG_TAG(monitorinflation) \ |
108 | LOG_TAG(monitormismatch) \ |
109 | LOG_TAG(nestmates) \ |
110 | LOG_TAG(nmethod) \ |
111 | LOG_TAG(normalize) \ |
112 | LOG_TAG(objecttagging) \ |
113 | LOG_TAG(obsolete) \ |
114 | LOG_TAG(oldobject) \ |
115 | LOG_TAG(oom) \ |
116 | LOG_TAG(oopmap) \ |
117 | LOG_TAG(oops) \ |
118 | LOG_TAG(oopstorage) \ |
119 | LOG_TAG(os) \ |
120 | LOG_TAG(pagesize) \ |
121 | LOG_TAG(patch) \ |
122 | LOG_TAG(path) \ |
123 | LOG_TAG(perf) \ |
124 | LOG_TAG(periodic) \ |
125 | LOG_TAG(phases) \ |
126 | LOG_TAG(plab) \ |
127 | LOG_TAG(preview) /* Trace loading of preview feature types */ \ |
128 | LOG_TAG(promotion) \ |
129 | LOG_TAG(preorder) /* Trace all classes loaded in order referenced (not loaded) */ \ |
130 | LOG_TAG(protectiondomain) /* "Trace protection domain verification" */ \ |
131 | LOG_TAG(ref) \ |
132 | LOG_TAG(redefine) \ |
133 | LOG_TAG(refine) \ |
134 | LOG_TAG(region) \ |
135 | LOG_TAG(reloc) \ |
136 | LOG_TAG(remset) \ |
137 | LOG_TAG(parser) \ |
138 | LOG_TAG(ptrqueue) \ |
139 | LOG_TAG(purge) \ |
140 | LOG_TAG(resolve) \ |
141 | LOG_TAG(safepoint) \ |
142 | LOG_TAG(sampling) \ |
143 | LOG_TAG(scavenge) \ |
144 | LOG_TAG(setting) \ |
145 | LOG_TAG(smr) \ |
146 | LOG_TAG(stacktrace) \ |
147 | LOG_TAG(stackwalk) \ |
148 | LOG_TAG(start) \ |
149 | LOG_TAG(startuptime) \ |
150 | LOG_TAG(state) \ |
151 | LOG_TAG(stats) \ |
152 | LOG_TAG(stringdedup) \ |
153 | LOG_TAG(stringtable) \ |
154 | LOG_TAG(symboltable) \ |
155 | LOG_TAG(stackmap) \ |
156 | LOG_TAG(subclass) \ |
157 | LOG_TAG(survivor) \ |
158 | LOG_TAG(sweep) \ |
159 | LOG_TAG(system) \ |
160 | LOG_TAG(table) \ |
161 | LOG_TAG(task) \ |
162 | DEBUG_ONLY(LOG_TAG(test)) \ |
163 | LOG_TAG(thread) \ |
164 | LOG_TAG(tlab) \ |
165 | LOG_TAG(time) \ |
166 | LOG_TAG(timer) \ |
167 | LOG_TAG(tracking) \ |
168 | LOG_TAG(update) \ |
169 | LOG_TAG(unload) /* Trace unloading of classes */ \ |
170 | LOG_TAG(unshareable) \ |
171 | LOG_TAG(mirror) \ |
172 | LOG_TAG(verification) \ |
173 | LOG_TAG(verify) \ |
174 | LOG_TAG(vmmonitor) \ |
175 | LOG_TAG(vmoperation) \ |
176 | LOG_TAG(vmthread) \ |
177 | LOG_TAG(vtables) \ |
178 | LOG_TAG(vtablestubs) \ |
179 | LOG_TAG(workgang) \ |
180 | LOG_TAG_LIST_EXT |
181 | |
182 | #define PREFIX_LOG_TAG(T) (LogTag::_##T) |
183 | |
184 | // Expand a set of log tags to their prefixed names. |
185 | // For error detection purposes, the macro passes one more tag than what is supported. |
186 | // If too many tags are given, a static assert in the log class will fail. |
187 | #define LOG_TAGS_EXPANDED(T0, T1, T2, T3, T4, T5, ...) PREFIX_LOG_TAG(T0), PREFIX_LOG_TAG(T1), PREFIX_LOG_TAG(T2), \ |
188 | PREFIX_LOG_TAG(T3), PREFIX_LOG_TAG(T4), PREFIX_LOG_TAG(T5) |
189 | // The EXPAND_VARARGS macro is required for MSVC, or it will resolve the LOG_TAGS_EXPANDED macro incorrectly. |
190 | #define EXPAND_VARARGS(x) x |
191 | #define LOG_TAGS(...) EXPAND_VARARGS(LOG_TAGS_EXPANDED(__VA_ARGS__, _NO_TAG, _NO_TAG, _NO_TAG, _NO_TAG, _NO_TAG, _NO_TAG)) |
192 | |
193 | // Log tags are used to classify log messages. |
194 | // Each log message can be assigned between 1 to LogTag::MaxTags number of tags. |
195 | // Specifying multiple tags for a log message means that only outputs configured |
196 | // for those exact tags, or a subset of the tags with a wildcard, will see the logging. |
197 | // Multiple tags should be comma separated, e.g. log_error(tag1, tag2)("msg"). |
198 | class LogTag : public AllStatic { |
199 | public: |
200 | // The maximum number of tags that a single log message can have. |
201 | // E.g. there might be hundreds of different tags available, |
202 | // but a specific log message can only be tagged with up to MaxTags of those. |
203 | static const size_t MaxTags = 5; |
204 | |
205 | enum type { |
206 | __NO_TAG, |
207 | #define LOG_TAG(name) _##name, |
208 | LOG_TAG_LIST |
209 | #undef LOG_TAG |
210 | Count |
211 | }; |
212 | |
213 | static const char* name(LogTag::type tag) { |
214 | return _name[tag]; |
215 | } |
216 | |
217 | static LogTag::type from_string(const char *str); |
218 | static LogTag::type fuzzy_match(const char *tag); |
219 | static void list_tags(outputStream* out); |
220 | |
221 | private: |
222 | static const char* _name[]; |
223 | }; |
224 | |
225 | typedef LogTag::type LogTagType; |
226 | |
227 | #endif // SHARE_LOGGING_LOGTAG_HPP |
228 | |