1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2011 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker #include "runtime_debug.h" 18*795d594fSAndroid Build Coastguard Worker 19*795d594fSAndroid Build Coastguard Worker #include <vector> 20*795d594fSAndroid Build Coastguard Worker 21*795d594fSAndroid Build Coastguard Worker #include "globals.h" 22*795d594fSAndroid Build Coastguard Worker 23*795d594fSAndroid Build Coastguard Worker namespace art { 24*795d594fSAndroid Build Coastguard Worker 25*795d594fSAndroid Build Coastguard Worker // We test here that the runtime-debug-checks are actually a no-op constexpr false in release 26*795d594fSAndroid Build Coastguard Worker // builds, as we can't check that in gtests (which are always debug). 27*795d594fSAndroid Build Coastguard Worker 28*795d594fSAndroid Build Coastguard Worker #ifdef NDEBUG 29*795d594fSAndroid Build Coastguard Worker namespace { 30*795d594fSAndroid Build Coastguard Worker DECLARE_RUNTIME_DEBUG_FLAG(kTestForConstexpr); 31*795d594fSAndroid Build Coastguard Worker static_assert(!kTestForConstexpr, "Issue with DECLARE_RUNTIME_DEBUG_FLAG in NDEBUG."); 32*795d594fSAndroid Build Coastguard Worker } 33*795d594fSAndroid Build Coastguard Worker #endif 34*795d594fSAndroid Build Coastguard Worker 35*795d594fSAndroid Build Coastguard Worker // Implementation of runtime debug flags. This should be compile-time optimized away in release 36*795d594fSAndroid Build Coastguard Worker // builds. 37*795d594fSAndroid Build Coastguard Worker namespace { 38*795d594fSAndroid Build Coastguard Worker bool gSlowEnabled = false; // Default for slow flags is "off." 39*795d594fSAndroid Build Coastguard Worker 40*795d594fSAndroid Build Coastguard Worker // Use a function with a static to ensure our vector storage doesn't have initialization order 41*795d594fSAndroid Build Coastguard Worker // issues. GetFlagPtrs()42*795d594fSAndroid Build Coastguard Workerstd::vector<bool*>& GetFlagPtrs() { 43*795d594fSAndroid Build Coastguard Worker static std::vector<bool*> g_flag_ptrs; 44*795d594fSAndroid Build Coastguard Worker return g_flag_ptrs; 45*795d594fSAndroid Build Coastguard Worker } 46*795d594fSAndroid Build Coastguard Worker RegisterRuntimeDebugFlagImpl(bool * flag_ptr)47*795d594fSAndroid Build Coastguard Workerbool RegisterRuntimeDebugFlagImpl(bool* flag_ptr) { 48*795d594fSAndroid Build Coastguard Worker GetFlagPtrs().push_back(flag_ptr); 49*795d594fSAndroid Build Coastguard Worker return gSlowEnabled; 50*795d594fSAndroid Build Coastguard Worker } 51*795d594fSAndroid Build Coastguard Worker SetRuntimeDebugFlagsEnabledImpl(bool enabled)52*795d594fSAndroid Build Coastguard Workervoid SetRuntimeDebugFlagsEnabledImpl(bool enabled) { 53*795d594fSAndroid Build Coastguard Worker gSlowEnabled = enabled; 54*795d594fSAndroid Build Coastguard Worker for (bool* flag_ptr : GetFlagPtrs()) { 55*795d594fSAndroid Build Coastguard Worker *flag_ptr = enabled; 56*795d594fSAndroid Build Coastguard Worker } 57*795d594fSAndroid Build Coastguard Worker } 58*795d594fSAndroid Build Coastguard Worker 59*795d594fSAndroid Build Coastguard Worker } // namespace 60*795d594fSAndroid Build Coastguard Worker RegisterRuntimeDebugFlag(bool * flag_ptr)61*795d594fSAndroid Build Coastguard Workerbool RegisterRuntimeDebugFlag(bool* flag_ptr) { 62*795d594fSAndroid Build Coastguard Worker if (kIsDebugBuild) { 63*795d594fSAndroid Build Coastguard Worker return RegisterRuntimeDebugFlagImpl(flag_ptr); 64*795d594fSAndroid Build Coastguard Worker } 65*795d594fSAndroid Build Coastguard Worker return false; 66*795d594fSAndroid Build Coastguard Worker } 67*795d594fSAndroid Build Coastguard Worker SetRuntimeDebugFlagsEnabled(bool enabled)68*795d594fSAndroid Build Coastguard Workervoid SetRuntimeDebugFlagsEnabled(bool enabled) { 69*795d594fSAndroid Build Coastguard Worker if (kIsDebugBuild) { 70*795d594fSAndroid Build Coastguard Worker SetRuntimeDebugFlagsEnabledImpl(enabled); 71*795d594fSAndroid Build Coastguard Worker } 72*795d594fSAndroid Build Coastguard Worker } 73*795d594fSAndroid Build Coastguard Worker 74*795d594fSAndroid Build Coastguard Worker } // namespace art 75