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