106f32e7eSjoerg/*===------- llvm/Config/abi-breaking.h - llvm configuration -------*- C -*-===*/
206f32e7eSjoerg/*                                                                            */
306f32e7eSjoerg/* Part of the LLVM Project, under the Apache License v2.0 with LLVM          */
406f32e7eSjoerg/* Exceptions.                                                                */
506f32e7eSjoerg/* See https://llvm.org/LICENSE.txt for license information.                  */
606f32e7eSjoerg/* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    */
706f32e7eSjoerg/*                                                                            */
806f32e7eSjoerg/*===----------------------------------------------------------------------===*/
906f32e7eSjoerg
1006f32e7eSjoerg/* This file controls the C++ ABI break introduced in LLVM public header. */
1106f32e7eSjoerg
1206f32e7eSjoerg#ifndef LLVM_ABI_BREAKING_CHECKS_H
1306f32e7eSjoerg#define LLVM_ABI_BREAKING_CHECKS_H
1406f32e7eSjoerg
1506f32e7eSjoerg/* Define to enable checks that alter the LLVM C++ ABI */
1606f32e7eSjoerg#cmakedefine01 LLVM_ENABLE_ABI_BREAKING_CHECKS
1706f32e7eSjoerg
1806f32e7eSjoerg/* Define to enable reverse iteration of unordered llvm containers */
1906f32e7eSjoerg#cmakedefine01 LLVM_ENABLE_REVERSE_ITERATION
2006f32e7eSjoerg
2106f32e7eSjoerg/* Allow selectively disabling link-time mismatch checking so that header-only
2206f32e7eSjoerg   ADT content from LLVM can be used without linking libSupport. */
23*da58b97aSjoerg#if !defined(LLVM_DISABLE_ABI_BREAKING_CHECKS_ENFORCING) || !LLVM_DISABLE_ABI_BREAKING_CHECKS_ENFORCING
2406f32e7eSjoerg
2506f32e7eSjoerg// ABI_BREAKING_CHECKS protection: provides link-time failure when clients build
2606f32e7eSjoerg// mismatch with LLVM
2706f32e7eSjoerg#if defined(_MSC_VER)
2806f32e7eSjoerg// Use pragma with MSVC
2906f32e7eSjoerg#define LLVM_XSTR(s) LLVM_STR(s)
3006f32e7eSjoerg#define LLVM_STR(s) #s
3106f32e7eSjoerg#pragma detect_mismatch("LLVM_ENABLE_ABI_BREAKING_CHECKS", LLVM_XSTR(LLVM_ENABLE_ABI_BREAKING_CHECKS))
3206f32e7eSjoerg#undef LLVM_XSTR
3306f32e7eSjoerg#undef LLVM_STR
3406f32e7eSjoerg#elif defined(_WIN32) || defined(__CYGWIN__) // Win32 w/o #pragma detect_mismatch
3506f32e7eSjoerg// FIXME: Implement checks without weak.
3606f32e7eSjoerg#elif defined(__cplusplus)
3706f32e7eSjoerg#if !(defined(_AIX) && defined(__GNUC__) && !defined(__clang__))
3806f32e7eSjoerg#define LLVM_HIDDEN_VISIBILITY __attribute__ ((visibility("hidden")))
3906f32e7eSjoerg#else
4006f32e7eSjoerg// GCC on AIX does not support visibility attributes. Symbols are not
4106f32e7eSjoerg// exported by default on AIX.
4206f32e7eSjoerg#define LLVM_HIDDEN_VISIBILITY
4306f32e7eSjoerg#endif
4406f32e7eSjoergnamespace llvm {
4506f32e7eSjoerg#if LLVM_ENABLE_ABI_BREAKING_CHECKS
4606f32e7eSjoergextern int EnableABIBreakingChecks;
4706f32e7eSjoergLLVM_HIDDEN_VISIBILITY
4806f32e7eSjoerg__attribute__((weak)) int *VerifyEnableABIBreakingChecks =
4906f32e7eSjoerg    &EnableABIBreakingChecks;
5006f32e7eSjoerg#else
5106f32e7eSjoergextern int DisableABIBreakingChecks;
5206f32e7eSjoergLLVM_HIDDEN_VISIBILITY
5306f32e7eSjoerg__attribute__((weak)) int *VerifyDisableABIBreakingChecks =
5406f32e7eSjoerg    &DisableABIBreakingChecks;
5506f32e7eSjoerg#endif
5606f32e7eSjoerg}
5706f32e7eSjoerg#undef LLVM_HIDDEN_VISIBILITY
5806f32e7eSjoerg#endif // _MSC_VER
5906f32e7eSjoerg
6006f32e7eSjoerg#endif // LLVM_DISABLE_ABI_BREAKING_CHECKS_ENFORCING
6106f32e7eSjoerg
6206f32e7eSjoerg#endif
63