duke@435: /* twisti@4020: * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. duke@435: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@435: * duke@435: * This code is free software; you can redistribute it and/or modify it duke@435: * under the terms of the GNU General Public License version 2 only, as duke@435: * published by the Free Software Foundation. duke@435: * duke@435: * This code is distributed in the hope that it will be useful, but WITHOUT duke@435: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@435: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@435: * version 2 for more details (a copy is included in the LICENSE file that duke@435: * accompanied this code). duke@435: * duke@435: * You should have received a copy of the GNU General Public License version duke@435: * 2 along with this work; if not, write to the Free Software Foundation, duke@435: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@435: * trims@1907: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA trims@1907: * or visit www.oracle.com if you need additional information or have any trims@1907: * questions. duke@435: * duke@435: */ duke@435: stefank@2314: #ifndef SHARE_VM_RUNTIME_GLOBALS_EXTENSION_HPP stefank@2314: #define SHARE_VM_RUNTIME_GLOBALS_EXTENSION_HPP stefank@2314: stefank@2314: #include "runtime/globals.hpp" jprovino@4542: #include "utilities/macros.hpp" stefank@2314: #include "utilities/top.hpp" stefank@2314: duke@435: // Construct enum of Flag_ constants. duke@435: duke@435: // Parens left off in the following for the enum decl below. duke@435: #define FLAG_MEMBER(flag) Flag_##flag duke@435: duke@435: #define RUNTIME_PRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), duke@435: #define RUNTIME_PD_PRODUCT_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name), duke@435: #define RUNTIME_DIAGNOSTIC_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), ysr@785: #define RUNTIME_EXPERIMENTAL_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), duke@435: #define RUNTIME_MANAGEABLE_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), duke@435: #define RUNTIME_PRODUCT_RW_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), duke@435: #ifdef PRODUCT duke@435: #define RUNTIME_DEVELOP_FLAG_MEMBER(type, name, value, doc) /* flag is constant */ duke@435: #define RUNTIME_PD_DEVELOP_FLAG_MEMBER(type, name, doc) /* flag is constant */ duke@435: #define RUNTIME_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc) duke@435: #else duke@435: #define RUNTIME_DEVELOP_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), duke@435: #define RUNTIME_PD_DEVELOP_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name), duke@435: #define RUNTIME_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), duke@435: #endif coleenp@548: #ifdef _LP64 coleenp@548: #define RUNTIME_LP64_PRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), coleenp@548: #else coleenp@548: #define RUNTIME_LP64_PRODUCT_FLAG_MEMBER(type, name, value, doc) /* flag is constant */ coleenp@548: #endif // _LP64 duke@435: duke@435: #define C1_PRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), duke@435: #define C1_PD_PRODUCT_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name), duke@435: #ifdef PRODUCT duke@435: #define C1_DEVELOP_FLAG_MEMBER(type, name, value, doc) /* flag is constant */ duke@435: #define C1_PD_DEVELOP_FLAG_MEMBER(type, name, doc) /* flag is constant */ duke@435: #define C1_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc) duke@435: #else duke@435: #define C1_DEVELOP_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), duke@435: #define C1_PD_DEVELOP_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name), duke@435: #define C1_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), duke@435: #endif duke@435: duke@435: #define C2_PRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), duke@435: #define C2_PD_PRODUCT_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name), duke@435: #define C2_DIAGNOSTIC_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), never@1515: #define C2_EXPERIMENTAL_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), duke@435: #ifdef PRODUCT duke@435: #define C2_DEVELOP_FLAG_MEMBER(type, name, value, doc) /* flag is constant */ duke@435: #define C2_PD_DEVELOP_FLAG_MEMBER(type, name, doc) /* flag is constant */ duke@435: #define C2_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc) duke@435: #else duke@435: #define C2_DEVELOP_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), duke@435: #define C2_PD_DEVELOP_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name), duke@435: #define C2_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), duke@435: #endif duke@435: twisti@4020: #define ARCH_PRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), twisti@4020: #define ARCH_DIAGNOSTIC_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), twisti@4020: #define ARCH_EXPERIMENTAL_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), twisti@4020: #ifdef PRODUCT twisti@4020: #define ARCH_DEVELOP_FLAG_MEMBER(type, name, value, doc) /* flag is constant */ twisti@4020: #define ARCH_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc) twisti@4020: #else twisti@4020: #define ARCH_DEVELOP_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), twisti@4020: #define ARCH_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name), twisti@4020: #endif twisti@4020: duke@435: typedef enum { phh@3287: RUNTIME_FLAGS(RUNTIME_DEVELOP_FLAG_MEMBER, RUNTIME_PD_DEVELOP_FLAG_MEMBER, RUNTIME_PRODUCT_FLAG_MEMBER, RUNTIME_PD_PRODUCT_FLAG_MEMBER, RUNTIME_DIAGNOSTIC_FLAG_MEMBER, RUNTIME_EXPERIMENTAL_FLAG_MEMBER, RUNTIME_NOTPRODUCT_FLAG_MEMBER, RUNTIME_MANAGEABLE_FLAG_MEMBER, RUNTIME_PRODUCT_RW_FLAG_MEMBER, RUNTIME_LP64_PRODUCT_FLAG_MEMBER) ysr@777: RUNTIME_OS_FLAGS(RUNTIME_DEVELOP_FLAG_MEMBER, RUNTIME_PD_DEVELOP_FLAG_MEMBER, RUNTIME_PRODUCT_FLAG_MEMBER, RUNTIME_PD_PRODUCT_FLAG_MEMBER, RUNTIME_DIAGNOSTIC_FLAG_MEMBER, RUNTIME_NOTPRODUCT_FLAG_MEMBER) jprovino@4542: #if INCLUDE_ALL_GCS ysr@785: G1_FLAGS(RUNTIME_DEVELOP_FLAG_MEMBER, RUNTIME_PD_DEVELOP_FLAG_MEMBER, RUNTIME_PRODUCT_FLAG_MEMBER, RUNTIME_PD_PRODUCT_FLAG_MEMBER, RUNTIME_DIAGNOSTIC_FLAG_MEMBER, RUNTIME_EXPERIMENTAL_FLAG_MEMBER, RUNTIME_NOTPRODUCT_FLAG_MEMBER, RUNTIME_MANAGEABLE_FLAG_MEMBER, RUNTIME_PRODUCT_RW_FLAG_MEMBER) jprovino@4542: #endif // INCLUDE_ALL_GCS duke@435: #ifdef COMPILER1 ysr@777: C1_FLAGS(C1_DEVELOP_FLAG_MEMBER, C1_PD_DEVELOP_FLAG_MEMBER, C1_PRODUCT_FLAG_MEMBER, C1_PD_PRODUCT_FLAG_MEMBER, C1_NOTPRODUCT_FLAG_MEMBER) duke@435: #endif duke@435: #ifdef COMPILER2 never@1515: C2_FLAGS(C2_DEVELOP_FLAG_MEMBER, C2_PD_DEVELOP_FLAG_MEMBER, C2_PRODUCT_FLAG_MEMBER, C2_PD_PRODUCT_FLAG_MEMBER, C2_DIAGNOSTIC_FLAG_MEMBER, C2_EXPERIMENTAL_FLAG_MEMBER, C2_NOTPRODUCT_FLAG_MEMBER) duke@435: #endif twisti@4020: ARCH_FLAGS(ARCH_DEVELOP_FLAG_MEMBER, ARCH_PRODUCT_FLAG_MEMBER, ARCH_DIAGNOSTIC_FLAG_MEMBER, ARCH_EXPERIMENTAL_FLAG_MEMBER, ARCH_NOTPRODUCT_FLAG_MEMBER) phh@3303: COMMANDLINEFLAG_EXT duke@435: NUM_CommandLineFlag duke@435: } CommandLineFlag; duke@435: duke@435: // Construct enum of Flag__ constants. duke@435: duke@435: #define FLAG_MEMBER_WITH_TYPE(flag,type) Flag_##flag##_##type duke@435: duke@435: #define RUNTIME_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), duke@435: #define RUNTIME_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type), duke@435: #define RUNTIME_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), ysr@785: #define RUNTIME_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), duke@435: #define RUNTIME_MANAGEABLE_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), duke@435: #define RUNTIME_PRODUCT_RW_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), duke@435: #ifdef PRODUCT duke@435: #define RUNTIME_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) /* flag is constant */ duke@435: #define RUNTIME_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, doc) /* flag is constant */ duke@435: #define RUNTIME_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) duke@435: #else duke@435: #define RUNTIME_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), duke@435: #define RUNTIME_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type), duke@435: #define RUNTIME_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), duke@435: #endif duke@435: duke@435: #define C1_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), duke@435: #define C1_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type), duke@435: #ifdef PRODUCT duke@435: #define C1_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) /* flag is constant */ duke@435: #define C1_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, doc) /* flag is constant */ duke@435: #define C1_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) duke@435: #else duke@435: #define C1_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), duke@435: #define C1_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type), duke@435: #define C1_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), duke@435: #endif coleenp@548: #ifdef _LP64 coleenp@548: #define RUNTIME_LP64_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), coleenp@548: #else coleenp@548: #define RUNTIME_LP64_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) /* flag is constant */ coleenp@548: #endif // _LP64 duke@435: duke@435: #define C2_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), duke@435: #define C2_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type), duke@435: #define C2_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), never@1515: #define C2_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), duke@435: #ifdef PRODUCT duke@435: #define C2_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) /* flag is constant */ duke@435: #define C2_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, doc) /* flag is constant */ duke@435: #define C2_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) duke@435: #else duke@435: #define C2_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), duke@435: #define C2_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type), duke@435: #define C2_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), duke@435: #endif duke@435: twisti@4020: #define ARCH_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), twisti@4020: #define ARCH_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), twisti@4020: #define ARCH_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), twisti@4020: #ifdef PRODUCT twisti@4020: #define ARCH_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) /* flag is constant */ twisti@4020: #define ARCH_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) twisti@4020: #else twisti@4020: #define ARCH_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), twisti@4020: #define ARCH_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type), twisti@4020: #endif twisti@4020: duke@435: typedef enum { ysr@777: RUNTIME_FLAGS(RUNTIME_DEVELOP_FLAG_MEMBER_WITH_TYPE, ysr@777: RUNTIME_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE, ysr@777: RUNTIME_PRODUCT_FLAG_MEMBER_WITH_TYPE, ysr@777: RUNTIME_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE, duke@435: RUNTIME_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE, ysr@785: RUNTIME_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE, duke@435: RUNTIME_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE, duke@435: RUNTIME_MANAGEABLE_FLAG_MEMBER_WITH_TYPE, coleenp@548: RUNTIME_PRODUCT_RW_FLAG_MEMBER_WITH_TYPE, coleenp@548: RUNTIME_LP64_PRODUCT_FLAG_MEMBER_WITH_TYPE) ysr@777: RUNTIME_OS_FLAGS(RUNTIME_DEVELOP_FLAG_MEMBER_WITH_TYPE, ysr@777: RUNTIME_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE, ysr@777: RUNTIME_PRODUCT_FLAG_MEMBER_WITH_TYPE, ysr@777: RUNTIME_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE, ysr@777: RUNTIME_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE, ysr@777: RUNTIME_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE) jprovino@4542: #if INCLUDE_ALL_GCS ysr@777: G1_FLAGS(RUNTIME_DEVELOP_FLAG_MEMBER_WITH_TYPE, ysr@777: RUNTIME_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE, ysr@777: RUNTIME_PRODUCT_FLAG_MEMBER_WITH_TYPE, ysr@777: RUNTIME_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE, ysr@777: RUNTIME_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE, ysr@785: RUNTIME_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE, ysr@777: RUNTIME_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE, ysr@777: RUNTIME_MANAGEABLE_FLAG_MEMBER_WITH_TYPE, ysr@777: RUNTIME_PRODUCT_RW_FLAG_MEMBER_WITH_TYPE) jprovino@4542: #endif // INCLUDE_ALL_GCS duke@435: #ifdef COMPILER1 ysr@777: C1_FLAGS(C1_DEVELOP_FLAG_MEMBER_WITH_TYPE, ysr@777: C1_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE, ysr@777: C1_PRODUCT_FLAG_MEMBER_WITH_TYPE, ysr@777: C1_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE, ysr@777: C1_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE) duke@435: #endif duke@435: #ifdef COMPILER2 ysr@777: C2_FLAGS(C2_DEVELOP_FLAG_MEMBER_WITH_TYPE, ysr@777: C2_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE, ysr@777: C2_PRODUCT_FLAG_MEMBER_WITH_TYPE, ysr@777: C2_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE, ysr@777: C2_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE, never@1515: C2_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE, ysr@777: C2_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE) duke@435: #endif twisti@4020: ARCH_FLAGS(ARCH_DEVELOP_FLAG_MEMBER_WITH_TYPE, twisti@4020: ARCH_PRODUCT_FLAG_MEMBER_WITH_TYPE, twisti@4020: ARCH_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE, twisti@4020: ARCH_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE, twisti@4020: ARCH_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE) phh@3303: COMMANDLINEFLAGWITHTYPE_EXT duke@435: NUM_CommandLineFlagWithType duke@435: } CommandLineFlagWithType; duke@435: duke@435: #define FLAG_IS_DEFAULT(name) (CommandLineFlagsEx::is_default(FLAG_MEMBER(name))) jmasa@448: #define FLAG_IS_ERGO(name) (CommandLineFlagsEx::is_ergo(FLAG_MEMBER(name))) jmasa@448: #define FLAG_IS_CMDLINE(name) (CommandLineFlagsEx::is_cmdline(FLAG_MEMBER(name))) duke@435: duke@435: #define FLAG_SET_DEFAULT(name, value) ((name) = (value)) duke@435: duke@435: #define FLAG_SET_CMDLINE(type, name, value) (CommandLineFlagsEx::type##AtPut(FLAG_MEMBER_WITH_TYPE(name,type), (type)(value), COMMAND_LINE)) duke@435: #define FLAG_SET_ERGO(type, name, value) (CommandLineFlagsEx::type##AtPut(FLAG_MEMBER_WITH_TYPE(name,type), (type)(value), ERGONOMIC)) duke@435: duke@435: // Can't put the following in CommandLineFlags because duke@435: // of a circular dependency on the enum definition. duke@435: class CommandLineFlagsEx : CommandLineFlags { duke@435: public: duke@435: static void boolAtPut(CommandLineFlagWithType flag, bool value, FlagValueOrigin origin); duke@435: static void intxAtPut(CommandLineFlagWithType flag, intx value, FlagValueOrigin origin); duke@435: static void uintxAtPut(CommandLineFlagWithType flag, uintx value, FlagValueOrigin origin); phh@1499: static void uint64_tAtPut(CommandLineFlagWithType flag, uint64_t value, FlagValueOrigin origin); duke@435: static void doubleAtPut(CommandLineFlagWithType flag, double value, FlagValueOrigin origin); duke@435: static void ccstrAtPut(CommandLineFlagWithType flag, ccstr value, FlagValueOrigin origin); duke@435: duke@435: static bool is_default(CommandLineFlag flag); jmasa@448: static bool is_ergo(CommandLineFlag flag); jmasa@448: static bool is_cmdline(CommandLineFlag flag); duke@435: }; stefank@2314: stefank@2314: #endif // SHARE_VM_RUNTIME_GLOBALS_EXTENSION_HPP