duke@435: /* duke@435: * Copyright 2003-2006 Sun Microsystems, Inc. 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: * duke@435: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, duke@435: * CA 95054 USA or visit www.sun.com if you need additional information or duke@435: * have any questions. duke@435: * duke@435: */ duke@435: 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), 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 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: 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), 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: duke@435: typedef enum { duke@435: RUNTIME_FLAGS(RUNTIME_DEVELOP_FLAG_MEMBER, RUNTIME_PD_DEVELOP_FLAG_MEMBER, RUNTIME_PRODUCT_FLAG_MEMBER, duke@435: RUNTIME_PD_PRODUCT_FLAG_MEMBER, RUNTIME_DIAGNOSTIC_FLAG_MEMBER, duke@435: RUNTIME_NOTPRODUCT_FLAG_MEMBER, RUNTIME_MANAGEABLE_FLAG_MEMBER, RUNTIME_PRODUCT_RW_FLAG_MEMBER) duke@435: RUNTIME_OS_FLAGS(RUNTIME_DEVELOP_FLAG_MEMBER, RUNTIME_PD_DEVELOP_FLAG_MEMBER, RUNTIME_PRODUCT_FLAG_MEMBER, duke@435: RUNTIME_PD_PRODUCT_FLAG_MEMBER, RUNTIME_DIAGNOSTIC_FLAG_MEMBER, duke@435: RUNTIME_NOTPRODUCT_FLAG_MEMBER) duke@435: #ifdef COMPILER1 duke@435: C1_FLAGS(C1_DEVELOP_FLAG_MEMBER, C1_PD_DEVELOP_FLAG_MEMBER, C1_PRODUCT_FLAG_MEMBER, C1_PD_PRODUCT_FLAG_MEMBER, duke@435: C1_NOTPRODUCT_FLAG_MEMBER) duke@435: #endif duke@435: #ifdef COMPILER2 duke@435: C2_FLAGS(C2_DEVELOP_FLAG_MEMBER, C2_PD_DEVELOP_FLAG_MEMBER, C2_PRODUCT_FLAG_MEMBER, C2_PD_PRODUCT_FLAG_MEMBER, duke@435: C2_DIAGNOSTIC_FLAG_MEMBER, C2_NOTPRODUCT_FLAG_MEMBER) duke@435: #endif 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), 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 duke@435: 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), 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: duke@435: typedef enum { duke@435: RUNTIME_FLAGS(RUNTIME_DEVELOP_FLAG_MEMBER_WITH_TYPE, RUNTIME_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE, duke@435: RUNTIME_PRODUCT_FLAG_MEMBER_WITH_TYPE, RUNTIME_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE, duke@435: RUNTIME_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE, duke@435: RUNTIME_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE, duke@435: RUNTIME_MANAGEABLE_FLAG_MEMBER_WITH_TYPE, duke@435: RUNTIME_PRODUCT_RW_FLAG_MEMBER_WITH_TYPE) duke@435: RUNTIME_OS_FLAGS(RUNTIME_DEVELOP_FLAG_MEMBER_WITH_TYPE, RUNTIME_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE, duke@435: RUNTIME_PRODUCT_FLAG_MEMBER_WITH_TYPE, RUNTIME_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE, duke@435: RUNTIME_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE, duke@435: RUNTIME_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE) duke@435: #ifdef COMPILER1 duke@435: C1_FLAGS(C1_DEVELOP_FLAG_MEMBER_WITH_TYPE, C1_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE, C1_PRODUCT_FLAG_MEMBER_WITH_TYPE, duke@435: C1_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE, C1_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE) duke@435: #endif duke@435: #ifdef COMPILER2 duke@435: C2_FLAGS(C2_DEVELOP_FLAG_MEMBER_WITH_TYPE, C2_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE, C2_PRODUCT_FLAG_MEMBER_WITH_TYPE, duke@435: C2_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE, C2_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE, C2_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE) duke@435: #endif duke@435: NUM_CommandLineFlagWithType duke@435: } CommandLineFlagWithType; duke@435: duke@435: #define FLAG_IS_DEFAULT(name) (CommandLineFlagsEx::is_default(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); 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); duke@435: };