Index: lib/xray/xray_init.cc =================================================================== --- lib/xray/xray_init.cc +++ lib/xray/xray_init.cc @@ -29,6 +29,10 @@ extern const XRayFunctionSledIndex __stop_xray_fn_idx[] __attribute__((weak)); } +namespace __xray { +XRayDSOContext *DSOContext; +} + using namespace __xray; // When set to 'true' this means the XRay runtime has been initialised. We use @@ -41,8 +45,7 @@ __sanitizer::atomic_uint8_t XRayInitialized{0}; // This should always be updated before XRayInitialized is updated. -__sanitizer::SpinMutex XRayInstrMapMutex; -XRaySledMap XRayInstrMap; +XRayDSOContext MainBinaryContext; // Global flag to determine whether the flags have been initialized. __sanitizer::atomic_uint8_t XRayFlagsInitialized{0}; @@ -73,12 +76,14 @@ } { - __sanitizer::SpinMutexLock Guard(&XRayInstrMapMutex); - XRayInstrMap.Sleds = __start_xray_instr_map; - XRayInstrMap.Entries = __stop_xray_instr_map - __start_xray_instr_map; - XRayInstrMap.SledsIndex = __start_xray_fn_idx; - XRayInstrMap.Functions = __stop_xray_fn_idx - __start_xray_fn_idx; + __sanitizer::SpinMutexLock Guard(&MainBinaryContext.Lock); + XRaySledMap &Map = MainBinaryContext.Map; + Map.Sleds = __start_xray_instr_map; + Map.Entries = __stop_xray_instr_map - __start_xray_instr_map; + Map.SledsIndex = __start_xray_fn_idx; + Map.Functions = __stop_xray_fn_idx - __start_xray_fn_idx; } + DSOContext = &MainBinaryContext; __sanitizer::atomic_store(&XRayInitialized, true, __sanitizer::memory_order_release); Index: lib/xray/xray_interface.cc =================================================================== --- lib/xray/xray_interface.cc +++ lib/xray/xray_interface.cc @@ -90,9 +90,7 @@ } // namespace __xray -extern __sanitizer::SpinMutex XRayInstrMapMutex; extern __sanitizer::atomic_uint8_t XRayInitialized; -extern __xray::XRaySledMap XRayInstrMap; int __xray_set_handler(void (*entry)(int32_t, XRayEntryType)) XRAY_NEVER_INSTRUMENT { @@ -215,8 +213,8 @@ // instrumentation map. XRaySledMap InstrMap; { - __sanitizer::SpinMutexLock Guard(&XRayInstrMapMutex); - InstrMap = XRayInstrMap; + __sanitizer::SpinMutexLock Guard(&__xray::DSOContext->Lock); + InstrMap = __xray::DSOContext->Map; } if (InstrMap.Entries == 0) return XRayPatchingStatus::NOT_INITIALIZED; @@ -268,8 +266,8 @@ // Next, we look for the function index. XRaySledMap InstrMap; { - __sanitizer::SpinMutexLock Guard(&XRayInstrMapMutex); - InstrMap = XRayInstrMap; + __sanitizer::SpinMutexLock Guard(&__xray::DSOContext->Lock); + InstrMap = __xray::DSOContext->Map; } // If we don't have an index, we can't patch individual functions. @@ -328,10 +326,11 @@ int __xray_remove_handler_arg1() { return __xray_set_handler_arg1(nullptr); } uintptr_t __xray_function_address(int32_t FuncId) XRAY_NEVER_INSTRUMENT { - __sanitizer::SpinMutexLock Guard(&XRayInstrMapMutex); - if (FuncId <= 0 || static_cast(FuncId) > XRayInstrMap.Functions) + __sanitizer::SpinMutexLock Guard(&__xray::DSOContext->Lock); + XRaySledMap &Map = __xray::DSOContext->Map; + if (FuncId <= 0 || static_cast(FuncId) > Map.Functions) return 0; - return XRayInstrMap.SledsIndex[FuncId - 1].Begin->Function + return Map.SledsIndex[FuncId - 1].Begin->Function // On PPC, function entries are always aligned to 16 bytes. The beginning of a // sled might be a local entry, which is always +8 based on the global entry. // Always return the global entry. @@ -342,6 +341,6 @@ } size_t __xray_max_function_id() XRAY_NEVER_INSTRUMENT { - __sanitizer::SpinMutexLock Guard(&XRayInstrMapMutex); - return XRayInstrMap.Functions; + __sanitizer::SpinMutexLock Guard(&__xray::DSOContext->Lock); + return __xray::DSOContext->Map.Functions; } Index: lib/xray/xray_interface_internal.h =================================================================== --- lib/xray/xray_interface_internal.h +++ lib/xray/xray_interface_internal.h @@ -15,6 +15,7 @@ #ifndef XRAY_INTERFACE_INTERNAL_H #define XRAY_INTERFACE_INTERNAL_H +#include "sanitizer_common/sanitizer_mutex.h" #include "sanitizer_common/sanitizer_platform.h" #include "xray/xray_interface.h" #include @@ -57,6 +58,13 @@ size_t Functions; }; +struct XRayDSOContext { + __sanitizer::SpinMutex Lock; + XRaySledMap Map; +}; + +extern XRayDSOContext *DSOContext; + bool patchFunctionEntry(bool Enable, uint32_t FuncId, const XRaySledEntry &Sled, void (*Trampoline)()); bool patchFunctionExit(bool Enable, uint32_t FuncId, const XRaySledEntry &Sled);