10e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens/*===------- llvm/Config/abi-breaking.h - llvm configuration -------*- C -*-===*/
20e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens/*                                                                            */
30e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens/*                     The LLVM Compiler Infrastructure                       */
40e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens/*                                                                            */
50e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens/* This file is distributed under the University of Illinois Open Source      */
60e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens/* License. See LICENSE.TXT for details.                                      */
70e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens/*                                                                            */
80e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens/*===----------------------------------------------------------------------===*/
90e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
100e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens/* This file controls the C++ ABI break introduced in LLVM public header. */
110e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
120e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#ifndef LLVM_ABI_BREAKING_CHECKS_H
130e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#define LLVM_ABI_BREAKING_CHECKS_H
140e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
150e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens/* Define to enable checks that alter the LLVM C++ ABI */
16cefd0f7f7b923ef131d6d64f9cad7d2add41c63aNicolas Capens#define LLVM_ENABLE_ABI_BREAKING_CHECKS 1
170e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
180e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens/* Define to disable the link-time checking of mismatch for
190e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens   LLVM_ENABLE_ABI_BREAKING_CHECKS */
20cefd0f7f7b923ef131d6d64f9cad7d2add41c63aNicolas Capens#define LLVM_DISABLE_ABI_BREAKING_CHECKS_ENFORCING 1
210e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#if !LLVM_DISABLE_ABI_BREAKING_CHECKS_ENFORCING
220e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
230e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens// ABI_BREAKING_CHECKS protection: provides link-time failure when clients build
240e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens// mismatch with LLVM
250e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#if defined(_MSC_VER)
260e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens// Use pragma with MSVC
270e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#define LLVM_XSTR(s) LLVM_STR(s)
280e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#define LLVM_STR(s) #s
290e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#pragma detect_mismatch("LLVM_ENABLE_ABI_BREAKING_CHECKS", LLVM_XSTR(LLVM_ENABLE_ABI_BREAKING_CHECKS))
300e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#undef LLVM_XSTR
310e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#undef LLVM_STR
320e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#elif defined(_WIN32) || defined(__CYGWIN__) // Win32 w/o #pragma detect_mismatch
330e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens// FIXME: Implement checks without weak.
340e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#elif defined(__cplusplus)
350e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capensnamespace llvm {
360e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#if LLVM_ENABLE_ABI_BREAKING_CHECKS
370e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capensextern int EnableABIBreakingChecks;
380e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens__attribute__((weak, visibility ("hidden"))) int *VerifyEnableABIBreakingChecks = &EnableABIBreakingChecks;
390e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#else
400e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capensextern int DisableABIBreakingChecks;
410e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens__attribute__((weak, visibility ("hidden"))) int *VerifyDisableABIBreakingChecks = &DisableABIBreakingChecks;
420e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#endif
430e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens}
440e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#endif // _MSC_VER
450e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
460e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#endif // LLVM_DISABLE_ABI_BREAKING_CHECKS_ENFORCING
470e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
480e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#endif
49