| //===-- xray_init.cpp -------------------------------------------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file is a part of XRay, a dynamic runtime instrumentation system. |
| // |
| // XRay initialisation logic for DSOs. |
| //===----------------------------------------------------------------------===// |
| |
| #include "sanitizer_common/sanitizer_atomic.h" |
| #include "xray_defs.h" |
| #include "xray_flags.h" |
| #include "xray_interface_internal.h" |
| |
| using namespace __sanitizer; |
| |
| extern "C" { |
| extern const XRaySledEntry __start_xray_instr_map[] __attribute__((weak)) |
| __attribute__((visibility("hidden"))); |
| extern const XRaySledEntry __stop_xray_instr_map[] __attribute__((weak)) |
| __attribute__((visibility("hidden"))); |
| extern const XRayFunctionSledIndex __start_xray_fn_idx[] __attribute__((weak)) |
| __attribute__((visibility("hidden"))); |
| extern const XRayFunctionSledIndex __stop_xray_fn_idx[] __attribute__((weak)) |
| __attribute__((visibility("hidden"))); |
| |
| #if SANITIZER_APPLE |
| // HACK: This is a temporary workaround to make XRay build on |
| // Darwin, but it will probably not work at runtime. |
| extern const XRaySledEntry __start_xray_instr_map[] = {}; |
| extern const XRaySledEntry __stop_xray_instr_map[] = {}; |
| extern const XRayFunctionSledIndex __start_xray_fn_idx[] = {}; |
| extern const XRayFunctionSledIndex __stop_xray_fn_idx[] = {}; |
| #endif |
| } |
| |
| // Handler functions to call in the patched entry/exit sled. |
| extern atomic_uintptr_t XRayPatchedFunction; |
| extern atomic_uintptr_t XRayArgLogger; |
| extern atomic_uintptr_t XRayPatchedCustomEvent; |
| extern atomic_uintptr_t XRayPatchedTypedEvent; |
| |
| static int __xray_object_id{-1}; |
| |
| // Note: .preinit_array initialization does not work for DSOs |
| __attribute__((constructor(0))) static void |
| __xray_init_dso() XRAY_NEVER_INSTRUMENT { |
| // Register sleds in main XRay runtime. |
| __xray_object_id = |
| __xray_register_dso(__start_xray_instr_map, __stop_xray_instr_map, |
| __start_xray_fn_idx, __stop_xray_fn_idx, {}); |
| } |
| |
| __attribute__((destructor(0))) static void |
| __xray_finalize_dso() XRAY_NEVER_INSTRUMENT { |
| // Inform the main runtime that this DSO is no longer used. |
| __xray_deregister_dso(__xray_object_id); |
| } |