1 /* 2 * Copyright (c) 1998, 2025, 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_COMPILERORACLE_HPP 26 #define SHARE_COMPILER_COMPILERORACLE_HPP 27 28 #include "memory/allStatic.hpp" 29 #include "oops/oopsHierarchy.hpp" 30 #include "utilities/istream.hpp" 31 32 class methodHandle; 33 34 35 // CompilerOracle is an interface for turning on and off compilation 36 // for some methods 37 38 // OPTION_TYPES: type, name 39 #define OPTION_TYPES(type) \ 40 type(Intx, "intx") \ 41 type(Uintx, "uintx") \ 42 type(Bool, "bool") \ 43 type(Ccstr, "ccstr") \ 44 type(Ccstrlist, "ccstrlist") \ 45 type(Double, "double") 46 47 // COMPILECOMMAND_OPTIONS: option, name, variant, type 48 #define COMPILECOMMAND_OPTIONS(option) \ 49 option(Help, "help", Unknown) \ 50 option(Quiet, "quiet", Unknown) \ 51 option(Log, "log", Bool) \ 52 option(Print, "print", Bool) \ 53 option(Inline, "inline", Bool) \ 54 option(DelayInline, "delayinline", Bool) \ 55 option(DontInline, "dontinline", Bool) \ 56 option(Blackhole, "blackhole", Bool) \ 57 option(CompileOnly, "compileonly", Bool)\ 58 option(Exclude, "exclude", Bool) \ 59 option(Break, "break", Bool) \ 60 option(BreakAtExecute, "BreakAtExecute", Bool) \ 61 option(BreakAtCompile, "BreakAtCompile", Bool) \ 62 option(MemLimit, "MemLimit", Intx) \ 63 option(MemStat, "MemStat", Uintx) \ 64 option(PrintAssembly, "PrintAssembly", Bool) \ 65 option(PrintCompilation, "PrintCompilation", Bool) \ 66 option(PrintInlining, "PrintInlining", Bool) \ 67 option(PrintIntrinsics, "PrintIntrinsics", Bool) \ 68 option(PrintNMethods, "PrintNMethods", Bool) \ 69 option(PrintOptoAssembly, "PrintOptoAssembly", Bool) \ 70 option(PrintDebugInfo, "PrintDebugInfo", Bool) \ 71 option(PrintRelocations, "PrintRelocations", Bool) \ 72 option(PrintDependencies, "PrintDependencies", Bool) \ 73 option(BackgroundCompilation, "BackgroundCompilation", Bool) \ 74 option(RepeatCompilation, "RepeatCompilation", Intx) \ 75 option(ReplayInline, "ReplayInline", Bool) \ 76 option(DumpReplay, "DumpReplay", Bool) \ 77 option(DumpInline, "DumpInline", Bool) \ 78 option(CompileThresholdScaling, "CompileThresholdScaling", Double) \ 79 option(ControlIntrinsic, "ControlIntrinsic", Ccstrlist) \ 80 option(DisableIntrinsic, "DisableIntrinsic", Ccstrlist) \ 81 option(BlockLayoutByFrequency, "BlockLayoutByFrequency", Bool) \ 82 option(TraceOptoPipelining, "TraceOptoPipelining", Bool) \ 83 option(TraceOptoOutput, "TraceOptoOutput", Bool) \ 84 option(TraceSpilling, "TraceSpilling", Bool) \ 85 NOT_PRODUCT(option(TraceEscapeAnalysis, "TraceEscapeAnalysis", Bool)) \ 86 NOT_PRODUCT(option(PrintIdeal, "PrintIdeal", Bool)) \ 87 NOT_PRODUCT(option(PrintIdealPhase, "PrintIdealPhase", Ccstrlist)) \ 88 NOT_PRODUCT(option(PhasePrintLevel, "PhasePrintLevel", Intx)) \ 89 NOT_PRODUCT(option(IGVPrintLevel, "IGVPrintLevel", Intx)) \ 90 NOT_PRODUCT(option(TraceAutoVectorization, "TraceAutoVectorization", Ccstrlist)) \ 91 NOT_PRODUCT(option(TraceMergeStores, "TraceMergeStores", Ccstrlist)) \ 92 option(Vectorize, "Vectorize", Bool) \ 93 option(CloneMapDebug, "CloneMapDebug", Bool) \ 94 option(IncrementalInlineForceCleanup, "IncrementalInlineForceCleanup", Bool) \ 95 option(MaxNodeLimit, "MaxNodeLimit", Intx) \ 96 option(AOTCompileRecorded, "AOTCompileRecorded", Uintx) \ 97 option(DontAOTCompile, "DontAOTCompile", Bool) \ 98 option(DontPreload, "DontPreload", Bool) \ 99 option(IgnoreAOTCompiled, "IgnoreAOTCompiled", Bool) \ 100 option(IgnoreRecordedProfile, "IgnoreRecordedProfile", Bool) \ 101 option(TooManyTrapsAtBCI, "TooManyTrapsAtBCI", Ccstrlist) \ 102 NOT_PRODUCT(option(TestOptionInt, "TestOptionInt", Intx)) \ 103 NOT_PRODUCT(option(TestOptionUint, "TestOptionUint", Uintx)) \ 104 NOT_PRODUCT(option(TestOptionBool, "TestOptionBool", Bool)) \ 105 NOT_PRODUCT(option(TestOptionBool2, "TestOptionBool2", Bool)) \ 106 NOT_PRODUCT(option(TestOptionStr, "TestOptionStr", Ccstr)) \ 107 NOT_PRODUCT(option(TestOptionList, "TestOptionList", Ccstrlist)) \ 108 NOT_PRODUCT(option(TestOptionDouble, "TestOptionDouble", Double)) \ 109 option(Option, "option", Unknown) \ 110 option(Unknown, "unknown", Unknown) 111 112 enum class CompileCommandEnum : int { 113 #define enum_of_options(option, name, ctype) option, 114 COMPILECOMMAND_OPTIONS(enum_of_options) 115 #undef enum_of_options 116 Count 117 }; 118 119 enum class OptionType { 120 #define enum_of_types(type, name) type, 121 OPTION_TYPES(enum_of_types) 122 #undef enum_of_types 123 Unknown 124 }; 125 126 enum class MemStatAction { 127 collect = 1, print = 2 128 }; 129 130 class CompilerOracle : AllStatic { 131 public: 132 typedef bool parse_from_line_fn_t(char*); 133 134 private: 135 static bool _quiet; 136 static void print_parse_error(char* error_msg, char* original_line); 137 static void print_command(CompileCommandEnum option, const char* name, enum OptionType type); 138 139 // The core parser. 140 static bool parse_from_input(inputStream::Input* input, 141 parse_from_line_fn_t* parse_from_line); 142 143 public: 144 // True if the command file has been specified or is implicit 145 static bool has_command_file(); 146 147 // Reads from file and adds to lists 148 static bool parse_from_file(); 149 150 // Tells whether we to exclude compilation of method 151 static bool should_exclude(const methodHandle& method); 152 static bool be_quiet() { return _quiet; } 153 154 // Tells whether we want to inline this method 155 static bool should_inline(const methodHandle& method); 156 157 // Tells whether we want to disallow inlining of this method 158 static bool should_not_inline(const methodHandle& method); 159 160 // Tells whether we want to delay inlining of this method 161 static bool should_delay_inline(const methodHandle& method); 162 163 // Tells whether this method changes Thread.currentThread() 164 static bool changes_current_thread(const methodHandle& method); 165 166 // Tells whether we should print the assembly for this method 167 static bool should_print(const methodHandle& method); 168 169 // Tells whether we should log the compilation data for this method 170 static bool should_log(const methodHandle& method); 171 172 // Tells whether to break when compiling method 173 static bool should_break_at(const methodHandle& method); 174 175 // Tells whether there are any methods to print for print_method_statistics() 176 static bool should_print_methods(); 177 178 // Tells whether there are any methods to (collect|collect+print) memory statistics for 179 static bool should_collect_memstat(); 180 181 // Tags the method as blackhole candidate, if possible. 182 static void tag_blackhole_if_possible(const methodHandle& method); 183 184 // A wrapper for checking bool options 185 static bool has_option(const methodHandle& method, CompileCommandEnum option); 186 187 // Check if method has option and value set. If yes, overwrite value and return true, 188 // otherwise leave value unchanged and return false. 189 template<typename T> 190 static bool has_option_value(const methodHandle& method, CompileCommandEnum option, T& value); 191 192 // This check is currently only needed by whitebox API 193 template<typename T> 194 static bool option_matches_type(CompileCommandEnum option, T& value); 195 196 // Reads from string instead of file 197 static bool parse_from_string(const char* option_string, 198 parse_from_line_fn_t* parser); 199 static bool parse_from_line(char* line); 200 static bool parse_from_line_quietly(char* line); 201 static bool parse_compile_only(char* line); 202 203 // Fast check if there is any option set that compile control needs to know about 204 static bool has_any_command_set(); 205 206 // convert a string to a proper compilecommand option - used from whitebox. 207 // returns CompileCommandEnum::Unknown on names not matching an option. 208 static CompileCommandEnum string_to_option(const char* name); 209 210 // convert a string to a proper compilecommand option 211 // returns CompileCommandEnum::Unknown if name is not an option. 212 static CompileCommandEnum parse_option_name(const char* name); 213 214 // convert a string to a proper option type 215 // returns OptionType::Unknown on strings not matching an option type. 216 static enum OptionType parse_option_type(const char* type_str); 217 }; 218 219 #endif // SHARE_COMPILER_COMPILERORACLE_HPP --- EOF ---