mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
Add link-time detection of LLVM_ABI_BREAKING_CHECKS mismatch
The macro LLVM_ENABLE_ABI_BREAKING_CHECKS is moved to a new header abi-breaking.h, from llvm-config.h. Only headers that are using the macro are including this new header. LLVM will define a symbol, either EnableABIBreakingChecks or DisableABIBreakingChecks depending on the configuration setting for LLVM_ABI_BREAKING_CHECKS. The abi-breaking.h header will add weak references to these symbols in every clients that includes this header. This should ensure that a mismatch triggers a link failure (or a load time failure for DSO). On MSVC, the pragma "detect_mismatch" is used instead. Differential Revision: https://reviews.llvm.org/D26876 llvm-svn: 288082
This commit is contained in:
parent
84780666b4
commit
cfa184f7d2
@ -714,6 +714,9 @@ configure_file(
|
||||
configure_file(
|
||||
${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/llvm-config.h.cmake
|
||||
${LLVM_INCLUDE_DIR}/llvm/Config/llvm-config.h)
|
||||
configure_file(
|
||||
${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/abi-breaking.h.cmake
|
||||
${LLVM_INCLUDE_DIR}/llvm/Config/abi-breaking.h)
|
||||
configure_file(
|
||||
${LLVM_MAIN_INCLUDE_DIR}/llvm/Support/DataTypes.h.cmake
|
||||
${LLVM_INCLUDE_DIR}/llvm/Support/DataTypes.h)
|
||||
|
@ -16,6 +16,7 @@
|
||||
#ifndef LLVM_ADT_EPOCH_TRACKER_H
|
||||
#define LLVM_ADT_EPOCH_TRACKER_H
|
||||
|
||||
#include "llvm/Config/abi-breaking.h"
|
||||
#include "llvm/Config/llvm-config.h"
|
||||
|
||||
#include <cstdint>
|
||||
|
@ -10,6 +10,7 @@
|
||||
#ifndef LLVM_ADT_ILIST_NODE_OPTIONS_H
|
||||
#define LLVM_ADT_ILIST_NODE_OPTIONS_H
|
||||
|
||||
#include "llvm/Config/abi-breaking.h"
|
||||
#include "llvm/Config/llvm-config.h"
|
||||
|
||||
#include <type_traits>
|
||||
|
39
include/llvm/Config/abi-breaking.h.cmake
Normal file
39
include/llvm/Config/abi-breaking.h.cmake
Normal file
@ -0,0 +1,39 @@
|
||||
/*===------- llvm/Config/abi-breaking.h - llvm configuration -------*- C -*-===*/
|
||||
/* */
|
||||
/* The LLVM Compiler Infrastructure */
|
||||
/* */
|
||||
/* This file is distributed under the University of Illinois Open Source */
|
||||
/* License. See LICENSE.TXT for details. */
|
||||
/* */
|
||||
/*===----------------------------------------------------------------------===*/
|
||||
|
||||
/* This file controls the C++ ABI break introduced in LLVM public header. */
|
||||
|
||||
#ifndef LLVM_ABI_BREAKING_CHECKS_H
|
||||
#define LLVM_ABI_BREAKING_CHECKS_H
|
||||
|
||||
/* Define to enable checks that alter the LLVM C++ ABI */
|
||||
#cmakedefine01 LLVM_ENABLE_ABI_BREAKING_CHECKS
|
||||
|
||||
// ABI_BREAKING_CHECKS protection: provides link-time failure when clients build
|
||||
// mismatch with LLVM
|
||||
#if defined(_MSC_VER)
|
||||
// Use pragma with MSVC
|
||||
#define LLVM_XSTR(s) LLVM_STR(s)
|
||||
#define LLVM_STR(s) #s
|
||||
#pragma detect_mismatch("LLVM_ENABLE_ABI_BREAKING_CHECKS", LLVM_XSTR(LLVM_ENABLE_ABI_BREAKING_CHECKS))
|
||||
#undef LLVM_XSTR
|
||||
#undef LLVM_STR
|
||||
#elif defined(__cplusplus)
|
||||
namespace llvm {
|
||||
#if LLVM_ENABLE_ABI_BREAKING_CHECKS
|
||||
extern int EnableABIBreakingChecks;
|
||||
__attribute__((weak, visibility ("hidden"))) int *VerifyEnableABIBreakingChecks = &EnableABIBreakingChecks;
|
||||
#else
|
||||
extern int DisableABIBreakingChecks;
|
||||
__attribute__((weak, visibility ("hidden"))) int *VerifyDisableABIBreakingChecks = &DisableABIBreakingChecks;
|
||||
#endif
|
||||
}
|
||||
#endif // _MSC_VER
|
||||
|
||||
#endif
|
@ -333,9 +333,6 @@
|
||||
/* Doesn't use `cmakedefine` because it is allowed to be empty. */
|
||||
#define LLVM_DEFAULT_TARGET_TRIPLE "${LLVM_DEFAULT_TARGET_TRIPLE}"
|
||||
|
||||
/* Define to enable checks that alter the LLVM C++ ABI */
|
||||
#cmakedefine01 LLVM_ENABLE_ABI_BREAKING_CHECKS
|
||||
|
||||
/* Define if threads enabled */
|
||||
#cmakedefine01 LLVM_ENABLE_THREADS
|
||||
|
||||
|
@ -20,9 +20,6 @@
|
||||
/* Target triple LLVM will generate code for by default */
|
||||
#cmakedefine LLVM_DEFAULT_TARGET_TRIPLE "${LLVM_DEFAULT_TARGET_TRIPLE}"
|
||||
|
||||
/* Define to enable checks that alter the LLVM C++ ABI */
|
||||
#cmakedefine01 LLVM_ENABLE_ABI_BREAKING_CHECKS
|
||||
|
||||
/* Define if threads enabled */
|
||||
#cmakedefine01 LLVM_ENABLE_THREADS
|
||||
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include "llvm/ADT/Twine.h"
|
||||
#include "llvm/Config/abi-breaking.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorOr.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
|
@ -112,3 +112,18 @@ void report_fatal_error(Error Err, bool GenCrashDiag) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#ifndef _MSC_VER
|
||||
namespace llvm {
|
||||
|
||||
// One of these two variables will be referenced by a symbol defined in
|
||||
// llvm-config.h. We provide a link-time (or load time for DSO) failure when
|
||||
// there is a mismatch in the build configuration of the API client and LLVM.
|
||||
#if LLVM_ENABLE_ABI_BREAKING_CHECKS
|
||||
int EnableABIBreakingChecks;
|
||||
#else
|
||||
int DisableABIBreakingChecks;
|
||||
#endif
|
||||
|
||||
} // end namespace llvm
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user