| 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 | |