
Initialisation Guard Variables should take their DLL storage class from the guarded variable. Otherwise, there will be a link error if the compiler inlines a reference to the guard variable into another module but that guard variable is not exported from the defining module. This is required for platforms such as PlayStation and windows-itanium, that are aiming for source compatibility with MSVC w.r.t. dllimport/export annotations, given Clang's existing design which allows for inlining of a dllimport function as long as all the variables/functions referenced are also marked dllimport. A similar change exists for the MSVC ABI: https://reviews.llvm.org/D4136. I have added a run test for windows-itanium for this issue to the build recipe: https://reviews.llvm.org/D88124. Differential Revision: https://reviews.llvm.org/D138463
33 lines
2.3 KiB
C++
33 lines
2.3 KiB
C++
// Initialisation Guard Variables should take their DLL storage class from
|
|
// the guarded variable. Otherwise, there will be a link error if the compiler
|
|
// inlines a reference to the guard variable into another module but that
|
|
// guard variable is not exported from the defining module.
|
|
|
|
// RUN: %clang_cc1 -emit-llvm -triple i686-windows-itanium -fdeclspec %s -O1 -disable-llvm-passes -o - -DAPI= | FileCheck %s --check-prefixes=NONE
|
|
// RUN: %clang_cc1 -emit-llvm -triple i686-windows-itanium -fdeclspec %s -O1 -disable-llvm-passes -o - -DAPI="__declspec(dllexport)" | FileCheck %s --check-prefixes=EXPORT
|
|
// RUN: %clang_cc1 -emit-llvm -triple i686-windows-itanium -fdeclspec %s -O1 -disable-llvm-passes -o - -DAPI="__declspec(dllimport)" | FileCheck %s --check-prefixes=IMPORT
|
|
|
|
// RUN: %clang_cc1 -emit-llvm -triple x86_64-scei-ps4 -fdeclspec %s -O1 -disable-llvm-passes -o - -DAPI= | FileCheck %s --check-prefixes=NONE
|
|
// RUN: %clang_cc1 -emit-llvm -triple x86_64-scei-ps4 -fdeclspec %s -O1 -disable-llvm-passes -o - -DAPI="__declspec(dllexport)" | FileCheck %s --check-prefixes=EXPORT
|
|
// RUN: %clang_cc1 -emit-llvm -triple x86_64-scei-ps4 -fdeclspec %s -O1 -disable-llvm-passes -o - -DAPI="__declspec(dllimport)" | FileCheck %s --check-prefixes=IMPORT
|
|
|
|
// RUN: %clang_cc1 -emit-llvm -triple x86_64-scei-ps5 -fdeclspec %s -O1 -disable-llvm-passes -o - -DAPI= | FileCheck %s --check-prefixes=NONE
|
|
// RUN: %clang_cc1 -emit-llvm -triple x86_64-scei-ps5 -fdeclspec %s -O1 -disable-llvm-passes -o - -DAPI="__declspec(dllexport)" | FileCheck %s --check-prefixes=EXPORT
|
|
// RUN: %clang_cc1 -emit-llvm -triple x86_64-scei-ps5 -fdeclspec %s -O1 -disable-llvm-passes -o - -DAPI="__declspec(dllimport)" | FileCheck %s --check-prefixes=IMPORT
|
|
|
|
//NONE: @_ZZN3foo3GetEvE9Singleton = linkonce_odr {{(dso_local )?}}global
|
|
//NONE: @_ZGVZN3foo3GetEvE9Singleton = linkonce_odr {{(dso_local )?}}global
|
|
|
|
//EXPORT: @_ZZN3foo3GetEvE9Singleton = weak_odr {{(dso_local )?}}dllexport global
|
|
//EXPORT: @_ZGVZN3foo3GetEvE9Singleton = weak_odr {{(dso_local )?}}dllexport global
|
|
|
|
//IMPORT: @_ZZN3foo3GetEvE9Singleton = available_externally dllimport global
|
|
//IMPORT: @_ZGVZN3foo3GetEvE9Singleton = available_externally dllimport global
|
|
|
|
struct API foo {
|
|
foo() {}
|
|
static void Get() { static foo Singleton; }
|
|
};
|
|
|
|
void f() { foo::Get(); }
|