1 /* 2 * Copyright 2017 The Abseil Authors. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * https://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 16 * Defines ABSL_STACKTRACE_INL_HEADER to the *-inl.h containing 17 * actual unwinder implementation. 18 * This header is "private" to stacktrace.cc. 19 * DO NOT include it into any other files. 20 */ 21 #ifndef ABSL_DEBUGGING_INTERNAL_STACKTRACE_CONFIG_H_ 22 #define ABSL_DEBUGGING_INTERNAL_STACKTRACE_CONFIG_H_ 23 24 #include "absl/base/config.h" 25 26 #if defined(ABSL_STACKTRACE_INL_HEADER) 27 #error ABSL_STACKTRACE_INL_HEADER cannot be directly set 28 29 #elif defined(_WIN32) 30 #define ABSL_STACKTRACE_INL_HEADER \ 31 "absl/debugging/internal/stacktrace_win32-inl.inc" 32 33 #elif defined(__APPLE__) 34 #ifdef ABSL_HAVE_THREAD_LOCAL 35 // Thread local support required for UnwindImpl. 36 #define ABSL_STACKTRACE_INL_HEADER \ 37 "absl/debugging/internal/stacktrace_generic-inl.inc" 38 #endif // defined(ABSL_HAVE_THREAD_LOCAL) 39 40 // Emscripten stacktraces rely on JS. Do not use them in standalone mode. 41 #elif defined(__EMSCRIPTEN__) && !defined(STANDALONE_WASM) 42 #define ABSL_STACKTRACE_INL_HEADER \ 43 "absl/debugging/internal/stacktrace_emscripten-inl.inc" 44 45 #elif defined(__linux__) && !defined(__ANDROID__) 46 47 #if defined(NO_FRAME_POINTER) && \ 48 (defined(__i386__) || defined(__x86_64__) || defined(__aarch64__)) 49 // Note: The libunwind-based implementation is not available to open-source 50 // users. 51 #define ABSL_STACKTRACE_INL_HEADER \ 52 "absl/debugging/internal/stacktrace_libunwind-inl.inc" 53 #define STACKTRACE_USES_LIBUNWIND 1 54 #elif defined(NO_FRAME_POINTER) && defined(__has_include) 55 #if __has_include(<execinfo.h>) 56 // Note: When using glibc this may require -funwind-tables to function properly. 57 #define ABSL_STACKTRACE_INL_HEADER \ 58 "absl/debugging/internal/stacktrace_generic-inl.inc" 59 #endif // __has_include(<execinfo.h>) 60 #elif defined(__i386__) || defined(__x86_64__) 61 #define ABSL_STACKTRACE_INL_HEADER \ 62 "absl/debugging/internal/stacktrace_x86-inl.inc" 63 #elif defined(__ppc__) || defined(__PPC__) 64 #define ABSL_STACKTRACE_INL_HEADER \ 65 "absl/debugging/internal/stacktrace_powerpc-inl.inc" 66 #elif defined(__aarch64__) 67 #define ABSL_STACKTRACE_INL_HEADER \ 68 "absl/debugging/internal/stacktrace_aarch64-inl.inc" 69 #elif defined(__riscv) 70 #define ABSL_STACKTRACE_INL_HEADER \ 71 "absl/debugging/internal/stacktrace_riscv-inl.inc" 72 #elif defined(__has_include) 73 #if __has_include(<execinfo.h>) 74 // Note: When using glibc this may require -funwind-tables to function properly. 75 #define ABSL_STACKTRACE_INL_HEADER \ 76 "absl/debugging/internal/stacktrace_generic-inl.inc" 77 #endif // __has_include(<execinfo.h>) 78 #endif // defined(__has_include) 79 80 #endif // defined(__linux__) && !defined(__ANDROID__) 81 82 // Fallback to the empty implementation. 83 #if !defined(ABSL_STACKTRACE_INL_HEADER) 84 #define ABSL_STACKTRACE_INL_HEADER \ 85 "absl/debugging/internal/stacktrace_unimplemented-inl.inc" 86 #endif 87 88 #endif // ABSL_DEBUGGING_INTERNAL_STACKTRACE_CONFIG_H_ 89