1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2014 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 #ifndef ART_RUNTIME_READ_BARRIER_CONFIG_H_ 18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_READ_BARRIER_CONFIG_H_ 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker // This is a mixed C-C++ header file that has a global section at the start 21*795d594fSAndroid Build Coastguard Worker // and a C++ section at the end, because asm_support.h is a C header file and 22*795d594fSAndroid Build Coastguard Worker // cannot include any C++ syntax. 23*795d594fSAndroid Build Coastguard Worker 24*795d594fSAndroid Build Coastguard Worker // Global (C) part. 25*795d594fSAndroid Build Coastguard Worker 26*795d594fSAndroid Build Coastguard Worker // Uncomment one of the following two and the two fields in 27*795d594fSAndroid Build Coastguard Worker // Object.java (libcore) to enable baker, or 28*795d594fSAndroid Build Coastguard Worker // table-lookup read barriers. 29*795d594fSAndroid Build Coastguard Worker 30*795d594fSAndroid Build Coastguard Worker #ifdef ART_USE_READ_BARRIER 31*795d594fSAndroid Build Coastguard Worker #if ART_READ_BARRIER_TYPE_IS_BAKER 32*795d594fSAndroid Build Coastguard Worker #define USE_BAKER_READ_BARRIER 33*795d594fSAndroid Build Coastguard Worker #elif ART_READ_BARRIER_TYPE_IS_TABLELOOKUP 34*795d594fSAndroid Build Coastguard Worker #define USE_TABLE_LOOKUP_READ_BARRIER 35*795d594fSAndroid Build Coastguard Worker #else 36*795d594fSAndroid Build Coastguard Worker #error "ART read barrier type must be set" 37*795d594fSAndroid Build Coastguard Worker #endif 38*795d594fSAndroid Build Coastguard Worker #endif // ART_USE_READ_BARRIER 39*795d594fSAndroid Build Coastguard Worker 40*795d594fSAndroid Build Coastguard Worker #if defined(USE_BAKER_READ_BARRIER) || defined(USE_TABLE_LOOKUP_READ_BARRIER) 41*795d594fSAndroid Build Coastguard Worker #define USE_READ_BARRIER 42*795d594fSAndroid Build Coastguard Worker #endif 43*795d594fSAndroid Build Coastguard Worker 44*795d594fSAndroid Build Coastguard Worker // Reserve marking register (and its refreshing logic) for all GCs as nterp 45*795d594fSAndroid Build Coastguard Worker // requires it. In the future if and when nterp is made independent of 46*795d594fSAndroid Build Coastguard Worker // read-barrier, we can switch back to the current behavior by making this 47*795d594fSAndroid Build Coastguard Worker // definition conditional on USE_BAKER_READ_BARRIER and setting 48*795d594fSAndroid Build Coastguard Worker // kReserveMarkingRegister to kUseBakerReadBarrier. 49*795d594fSAndroid Build Coastguard Worker #define RESERVE_MARKING_REGISTER 50*795d594fSAndroid Build Coastguard Worker 51*795d594fSAndroid Build Coastguard Worker // C++-specific configuration part.. 52*795d594fSAndroid Build Coastguard Worker 53*795d594fSAndroid Build Coastguard Worker #ifdef __cplusplus 54*795d594fSAndroid Build Coastguard Worker 55*795d594fSAndroid Build Coastguard Worker #include "base/globals.h" 56*795d594fSAndroid Build Coastguard Worker #include "base/macros.h" 57*795d594fSAndroid Build Coastguard Worker 58*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN { 59*795d594fSAndroid Build Coastguard Worker 60*795d594fSAndroid Build Coastguard Worker #ifdef USE_BAKER_READ_BARRIER 61*795d594fSAndroid Build Coastguard Worker static constexpr bool kUseBakerReadBarrier = true; 62*795d594fSAndroid Build Coastguard Worker #else 63*795d594fSAndroid Build Coastguard Worker static constexpr bool kUseBakerReadBarrier = false; 64*795d594fSAndroid Build Coastguard Worker #endif 65*795d594fSAndroid Build Coastguard Worker 66*795d594fSAndroid Build Coastguard Worker // Read comment for RESERVE_MARKING_REGISTER above 67*795d594fSAndroid Build Coastguard Worker static constexpr bool kReserveMarkingRegister = true; 68*795d594fSAndroid Build Coastguard Worker 69*795d594fSAndroid Build Coastguard Worker #ifdef USE_TABLE_LOOKUP_READ_BARRIER 70*795d594fSAndroid Build Coastguard Worker static constexpr bool kUseTableLookupReadBarrier = true; 71*795d594fSAndroid Build Coastguard Worker #else 72*795d594fSAndroid Build Coastguard Worker static constexpr bool kUseTableLookupReadBarrier = false; 73*795d594fSAndroid Build Coastguard Worker #endif 74*795d594fSAndroid Build Coastguard Worker 75*795d594fSAndroid Build Coastguard Worker // Only if read-barrier isn't forced (see build/art.go) but is selected, that we need 76*795d594fSAndroid Build Coastguard Worker // to see if we support userfaultfd GC. All the other cases can be constexpr here. 77*795d594fSAndroid Build Coastguard Worker #ifdef ART_FORCE_USE_READ_BARRIER 78*795d594fSAndroid Build Coastguard Worker constexpr bool gUseReadBarrier = kUseBakerReadBarrier || kUseTableLookupReadBarrier; 79*795d594fSAndroid Build Coastguard Worker constexpr bool gUseUserfaultfd = !gUseReadBarrier; 80*795d594fSAndroid Build Coastguard Worker static_assert(!gUseUserfaultfd); 81*795d594fSAndroid Build Coastguard Worker #else 82*795d594fSAndroid Build Coastguard Worker #ifndef ART_USE_READ_BARRIER 83*795d594fSAndroid Build Coastguard Worker constexpr bool gUseReadBarrier = false; 84*795d594fSAndroid Build Coastguard Worker #ifdef ART_DEFAULT_GC_TYPE_IS_CMC 85*795d594fSAndroid Build Coastguard Worker constexpr bool gUseUserfaultfd = true; 86*795d594fSAndroid Build Coastguard Worker #else 87*795d594fSAndroid Build Coastguard Worker constexpr bool gUseUserfaultfd = false; 88*795d594fSAndroid Build Coastguard Worker #endif 89*795d594fSAndroid Build Coastguard Worker #else 90*795d594fSAndroid Build Coastguard Worker EXPORT extern const bool gUseReadBarrier; 91*795d594fSAndroid Build Coastguard Worker EXPORT extern const bool gUseUserfaultfd; 92*795d594fSAndroid Build Coastguard Worker #endif 93*795d594fSAndroid Build Coastguard Worker #endif 94*795d594fSAndroid Build Coastguard Worker 95*795d594fSAndroid Build Coastguard Worker // Disabled for performance reasons. 96*795d594fSAndroid Build Coastguard Worker static constexpr bool kCheckDebugDisallowReadBarrierCount = kIsDebugBuild; 97*795d594fSAndroid Build Coastguard Worker 98*795d594fSAndroid Build Coastguard Worker } // namespace art 99*795d594fSAndroid Build Coastguard Worker 100*795d594fSAndroid Build Coastguard Worker #endif // __cplusplus 101*795d594fSAndroid Build Coastguard Worker 102*795d594fSAndroid Build Coastguard Worker #endif // ART_RUNTIME_READ_BARRIER_CONFIG_H_ 103