1 /* 2 * Copyright (c) 2003, 2015, 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_VM_RUNTIME_GLOBALS_EXTENSION_HPP 26 #define SHARE_VM_RUNTIME_GLOBALS_EXTENSION_HPP 27 28 #include "runtime/globals.hpp" 29 #include "utilities/macros.hpp" 30 #include "utilities/top.hpp" 31 32 // Construct enum of Flag_<cmdline-arg> constants. 33 34 // Parenthesis left off in the following for the enum decl below. 35 #define FLAG_MEMBER(flag) Flag_##flag 36 37 #define RUNTIME_PRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), 38 #define RUNTIME_PD_PRODUCT_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name), 39 #define RUNTIME_DIAGNOSTIC_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), 40 #define RUNTIME_EXPERIMENTAL_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), 41 #define RUNTIME_MANAGEABLE_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), 42 #define RUNTIME_PRODUCT_RW_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), 43 #define RUNTIME_DEVELOP_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), 44 #define RUNTIME_PD_DEVELOP_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name), 45 #define RUNTIME_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), 46 47 #ifdef _LP64 48 #define RUNTIME_LP64_PRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), 49 #else 50 #define RUNTIME_LP64_PRODUCT_FLAG_MEMBER(type, name, value, doc) /* flag is constant */ 51 #endif // _LP64 52 53 #define C1_PRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), 54 #define C1_PD_PRODUCT_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name), 55 #define C1_DIAGNOSTIC_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), 56 #define C1_DEVELOP_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), 57 #define C1_PD_DEVELOP_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name), 58 #define C1_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), 59 60 #define C2_PRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), 61 #define C2_PD_PRODUCT_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name), 62 #define C2_DIAGNOSTIC_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), 63 #define C2_EXPERIMENTAL_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), 64 #define C2_DEVELOP_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), 65 #define C2_PD_DEVELOP_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name), 66 #define C2_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), 67 68 #define ARCH_PRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), 69 #define ARCH_DIAGNOSTIC_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), 70 #define ARCH_EXPERIMENTAL_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), 71 #define ARCH_DEVELOP_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), 72 #define ARCH_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), 73 74 typedef enum { 75 RUNTIME_FLAGS(RUNTIME_DEVELOP_FLAG_MEMBER, \ 76 RUNTIME_PD_DEVELOP_FLAG_MEMBER, \ 77 RUNTIME_PRODUCT_FLAG_MEMBER, \ 78 RUNTIME_PD_PRODUCT_FLAG_MEMBER, \ 79 RUNTIME_DIAGNOSTIC_FLAG_MEMBER, \ 80 RUNTIME_EXPERIMENTAL_FLAG_MEMBER, \ 81 RUNTIME_NOTPRODUCT_FLAG_MEMBER, \ 82 RUNTIME_MANAGEABLE_FLAG_MEMBER, \ 83 RUNTIME_PRODUCT_RW_FLAG_MEMBER, \ 84 RUNTIME_LP64_PRODUCT_FLAG_MEMBER, \ 85 IGNORE_RANGE, \ 86 IGNORE_CONSTRAINT) 87 RUNTIME_OS_FLAGS(RUNTIME_DEVELOP_FLAG_MEMBER, \ 88 RUNTIME_PD_DEVELOP_FLAG_MEMBER, \ 89 RUNTIME_PRODUCT_FLAG_MEMBER, \ 90 RUNTIME_PD_PRODUCT_FLAG_MEMBER, \ 91 RUNTIME_DIAGNOSTIC_FLAG_MEMBER, \ 92 RUNTIME_NOTPRODUCT_FLAG_MEMBER, \ 93 IGNORE_RANGE, \ 94 IGNORE_CONSTRAINT) 95 #if INCLUDE_ALL_GCS 96 G1_FLAGS(RUNTIME_DEVELOP_FLAG_MEMBER, \ 97 RUNTIME_PD_DEVELOP_FLAG_MEMBER, \ 98 RUNTIME_PRODUCT_FLAG_MEMBER, \ 99 RUNTIME_PD_PRODUCT_FLAG_MEMBER, \ 100 RUNTIME_DIAGNOSTIC_FLAG_MEMBER, \ 101 RUNTIME_EXPERIMENTAL_FLAG_MEMBER, \ 102 RUNTIME_NOTPRODUCT_FLAG_MEMBER, \ 103 RUNTIME_MANAGEABLE_FLAG_MEMBER, \ 104 RUNTIME_PRODUCT_RW_FLAG_MEMBER, \ 105 IGNORE_RANGE, \ 106 IGNORE_CONSTRAINT) 107 #endif // INCLUDE_ALL_GCS 108 #ifdef COMPILER1 109 C1_FLAGS(C1_DEVELOP_FLAG_MEMBER, \ 110 C1_PD_DEVELOP_FLAG_MEMBER, \ 111 C1_PRODUCT_FLAG_MEMBER, \ 112 C1_PD_PRODUCT_FLAG_MEMBER, \ 113 C1_DIAGNOSTIC_FLAG_MEMBER, \ 114 C1_NOTPRODUCT_FLAG_MEMBER, \ 115 IGNORE_RANGE, \ 116 IGNORE_CONSTRAINT) 117 #endif 118 #ifdef COMPILER2 119 C2_FLAGS(C2_DEVELOP_FLAG_MEMBER, \ 120 C2_PD_DEVELOP_FLAG_MEMBER, \ 121 C2_PRODUCT_FLAG_MEMBER, \ 122 C2_PD_PRODUCT_FLAG_MEMBER, \ 123 C2_DIAGNOSTIC_FLAG_MEMBER, \ 124 C2_EXPERIMENTAL_FLAG_MEMBER, \ 125 C2_NOTPRODUCT_FLAG_MEMBER, \ 126 IGNORE_RANGE, \ 127 IGNORE_CONSTRAINT) 128 #endif 129 ARCH_FLAGS(ARCH_DEVELOP_FLAG_MEMBER, \ 130 ARCH_PRODUCT_FLAG_MEMBER, \ 131 ARCH_DIAGNOSTIC_FLAG_MEMBER, \ 132 ARCH_EXPERIMENTAL_FLAG_MEMBER, \ 133 ARCH_NOTPRODUCT_FLAG_MEMBER, \ 134 IGNORE_RANGE, \ 135 IGNORE_CONSTRAINT) 136 COMMANDLINEFLAG_EXT 137 NUM_CommandLineFlag 138 } CommandLineFlag; 139 140 // Construct enum of Flag_<cmdline-arg>_<type> constants. 141 142 #define FLAG_MEMBER_WITH_TYPE(flag,type) Flag_##flag##_##type 143 144 #define RUNTIME_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), 145 #define RUNTIME_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type), 146 #define RUNTIME_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), 147 #define RUNTIME_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), 148 #define RUNTIME_MANAGEABLE_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), 149 #define RUNTIME_PRODUCT_RW_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), 150 #define RUNTIME_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), 151 #define RUNTIME_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type), 152 #define RUNTIME_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), 153 154 #define C1_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), 155 #define C1_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type), 156 #define C1_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), 157 #define C1_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), 158 #define C1_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type), 159 #define C1_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), 160 161 #ifdef _LP64 162 #define RUNTIME_LP64_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), 163 #else 164 #define RUNTIME_LP64_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) /* flag is constant */ 165 #endif // _LP64 166 167 #define C2_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), 168 #define C2_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type), 169 #define C2_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), 170 #define C2_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), 171 #define C2_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), 172 #define C2_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type), 173 #define C2_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), 174 175 #define ARCH_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), 176 #define ARCH_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), 177 #define ARCH_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), 178 #define ARCH_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), 179 #define ARCH_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), 180 181 typedef enum { 182 RUNTIME_FLAGS(RUNTIME_DEVELOP_FLAG_MEMBER_WITH_TYPE, 183 RUNTIME_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE, 184 RUNTIME_PRODUCT_FLAG_MEMBER_WITH_TYPE, 185 RUNTIME_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE, 186 RUNTIME_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE, 187 RUNTIME_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE, 188 RUNTIME_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE, 189 RUNTIME_MANAGEABLE_FLAG_MEMBER_WITH_TYPE, 190 RUNTIME_PRODUCT_RW_FLAG_MEMBER_WITH_TYPE, 191 RUNTIME_LP64_PRODUCT_FLAG_MEMBER_WITH_TYPE, 192 IGNORE_RANGE, 193 IGNORE_CONSTRAINT) 194 RUNTIME_OS_FLAGS(RUNTIME_DEVELOP_FLAG_MEMBER_WITH_TYPE, 195 RUNTIME_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE, 196 RUNTIME_PRODUCT_FLAG_MEMBER_WITH_TYPE, 197 RUNTIME_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE, 198 RUNTIME_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE, 199 RUNTIME_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE, 200 IGNORE_RANGE, 201 IGNORE_CONSTRAINT) 202 #if INCLUDE_ALL_GCS 203 G1_FLAGS(RUNTIME_DEVELOP_FLAG_MEMBER_WITH_TYPE, 204 RUNTIME_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE, 205 RUNTIME_PRODUCT_FLAG_MEMBER_WITH_TYPE, 206 RUNTIME_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE, 207 RUNTIME_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE, 208 RUNTIME_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE, 209 RUNTIME_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE, 210 RUNTIME_MANAGEABLE_FLAG_MEMBER_WITH_TYPE, 211 RUNTIME_PRODUCT_RW_FLAG_MEMBER_WITH_TYPE, 212 IGNORE_RANGE, 213 IGNORE_CONSTRAINT) 214 #endif // INCLUDE_ALL_GCS 215 #ifdef COMPILER1 216 C1_FLAGS(C1_DEVELOP_FLAG_MEMBER_WITH_TYPE, 217 C1_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE, 218 C1_PRODUCT_FLAG_MEMBER_WITH_TYPE, 219 C1_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE, 220 C1_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE, 221 C1_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE, 222 IGNORE_RANGE, 223 IGNORE_CONSTRAINT) 224 #endif 225 #ifdef COMPILER2 226 C2_FLAGS(C2_DEVELOP_FLAG_MEMBER_WITH_TYPE, 227 C2_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE, 228 C2_PRODUCT_FLAG_MEMBER_WITH_TYPE, 229 C2_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE, 230 C2_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE, 231 C2_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE, 232 C2_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE, 233 IGNORE_RANGE, 234 IGNORE_CONSTRAINT) 235 #endif 236 ARCH_FLAGS(ARCH_DEVELOP_FLAG_MEMBER_WITH_TYPE, 237 ARCH_PRODUCT_FLAG_MEMBER_WITH_TYPE, 238 ARCH_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE, 239 ARCH_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE, 240 ARCH_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE, 241 IGNORE_RANGE, 242 IGNORE_CONSTRAINT) 243 COMMANDLINEFLAGWITHTYPE_EXT 244 NUM_CommandLineFlagWithType 245 } CommandLineFlagWithType; 246 247 #define FLAG_IS_DEFAULT(name) (CommandLineFlagsEx::is_default(FLAG_MEMBER(name))) 248 #define FLAG_IS_ERGO(name) (CommandLineFlagsEx::is_ergo(FLAG_MEMBER(name))) 249 #define FLAG_IS_CMDLINE(name) (CommandLineFlagsEx::is_cmdline(FLAG_MEMBER(name))) 250 251 #define FLAG_SET_DEFAULT(name, value) ((name) = (value)) 252 253 #define FLAG_SET_CMDLINE(type, name, value) (CommandLineFlagsEx::type##AtPut(FLAG_MEMBER_WITH_TYPE(name,type), (type)(value), Flag::COMMAND_LINE)) 254 #define FLAG_SET_ERGO(type, name, value) (CommandLineFlagsEx::type##AtPut(FLAG_MEMBER_WITH_TYPE(name,type), (type)(value), Flag::ERGONOMIC)) 255 256 // Can't put the following in CommandLineFlags because 257 // of a circular dependency on the enum definition. 258 class CommandLineFlagsEx : CommandLineFlags { 259 public: 260 static Flag::Error boolAtPut(CommandLineFlagWithType flag, bool value, Flag::Flags origin); 261 static Flag::Error intAtPut(CommandLineFlagWithType flag, int value, Flag::Flags origin); 262 static Flag::Error uintAtPut(CommandLineFlagWithType flag, uint value, Flag::Flags origin); 263 static Flag::Error intxAtPut(CommandLineFlagWithType flag, intx value, Flag::Flags origin); 264 static Flag::Error uintxAtPut(CommandLineFlagWithType flag, uintx value, Flag::Flags origin); 265 static Flag::Error uint64_tAtPut(CommandLineFlagWithType flag, uint64_t value, Flag::Flags origin); 266 static Flag::Error size_tAtPut(CommandLineFlagWithType flag, size_t value, Flag::Flags origin); 267 static Flag::Error doubleAtPut(CommandLineFlagWithType flag, double value, Flag::Flags origin); 268 // Contract: Flag will make private copy of the incoming value 269 static Flag::Error ccstrAtPut(CommandLineFlagWithType flag, ccstr value, Flag::Flags origin); 270 271 static bool is_default(CommandLineFlag flag); 272 static bool is_ergo(CommandLineFlag flag); 273 static bool is_cmdline(CommandLineFlag flag); 274 }; 275 276 #endif // SHARE_VM_RUNTIME_GLOBALS_EXTENSION_HPP --- EOF ---