mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-25 14:28:54 -04:00

Since MinGW supports automatically importing external variables from DLLs even without the DLLImport attribute, we shouldn't mark them as DSO local unless we actually know them to be local for sure. Keep marking thread local variables as DSO local. Differential Revision: https://reviews.llvm.org/D51382 llvm-svn: 340941
134 lines
5.4 KiB
C
134 lines
5.4 KiB
C
// RUN: %clang_cc1 -triple i686-windows-msvc -fms-extensions -emit-llvm -std=c11 -O0 -o - %s | FileCheck --check-prefix=CHECK --check-prefix=MS %s
|
|
// RUN: %clang_cc1 -triple x86_64-windows-msvc -fms-extensions -emit-llvm -std=c11 -O0 -o - %s | FileCheck --check-prefix=CHECK --check-prefix=MS %s
|
|
// RUN: %clang_cc1 -triple i686-windows-gnu -fms-extensions -emit-llvm -std=c11 -O0 -o - %s | FileCheck --check-prefix=CHECK --check-prefix=GNU %s
|
|
// RUN: %clang_cc1 -triple x86_64-windows-gnu -fms-extensions -emit-llvm -std=c11 -O0 -o - %s | FileCheck --check-prefix=CHECK --check-prefix=GNU %s
|
|
// RUN: %clang_cc1 -triple i686-windows-msvc -fms-extensions -emit-llvm -std=c11 -O1 -o - %s | FileCheck --check-prefix=O1 --check-prefix=MO1 %s
|
|
// RUN: %clang_cc1 -triple i686-windows-gnu -fms-extensions -emit-llvm -std=c11 -O1 -o - %s | FileCheck --check-prefix=O1 --check-prefix=GO1 %s
|
|
|
|
#define JOIN2(x, y) x##y
|
|
#define JOIN(x, y) JOIN2(x, y)
|
|
#define USEVAR(var) int JOIN(use, __LINE__)() { return var; }
|
|
#define USE(func) void JOIN(use, __LINE__)() { func(); }
|
|
|
|
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Globals
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// Import declaration.
|
|
// CHECK: @ExternGlobalDecl = external dllimport global i32
|
|
__declspec(dllimport) extern int ExternGlobalDecl;
|
|
USEVAR(ExternGlobalDecl)
|
|
|
|
// dllimport implies a declaration.
|
|
// CHECK: @GlobalDecl = external dllimport global i32
|
|
__declspec(dllimport) int GlobalDecl;
|
|
USEVAR(GlobalDecl)
|
|
|
|
// Redeclarations
|
|
// CHECK: @GlobalRedecl1 = external dllimport global i32
|
|
__declspec(dllimport) extern int GlobalRedecl1;
|
|
__declspec(dllimport) extern int GlobalRedecl1;
|
|
USEVAR(GlobalRedecl1)
|
|
|
|
// CHECK: @GlobalRedecl2 = external dllimport global i32
|
|
__declspec(dllimport) int GlobalRedecl2;
|
|
__declspec(dllimport) int GlobalRedecl2;
|
|
USEVAR(GlobalRedecl2)
|
|
|
|
// NB: MSVC issues a warning and makes GlobalRedecl3 dllexport. We follow GCC
|
|
// and drop the dllimport with a warning.
|
|
// MS: @GlobalRedecl3 = external dso_local global i32
|
|
// GNU: @GlobalRedecl3 = external global i32
|
|
__declspec(dllimport) extern int GlobalRedecl3;
|
|
extern int GlobalRedecl3; // dllimport ignored
|
|
USEVAR(GlobalRedecl3)
|
|
|
|
// Make sure this works even if the decl has been used before it's defined (PR20792).
|
|
// MS: @GlobalRedecl4 = common dso_local dllexport global i32
|
|
// GNU: @GlobalRedecl4 = common dso_local global i32
|
|
__declspec(dllimport) extern int GlobalRedecl4;
|
|
USEVAR(GlobalRedecl4)
|
|
int GlobalRedecl4; // dllimport ignored
|
|
|
|
// FIXME: dllimport is dropped in the AST; this should be reflected in codegen (PR02803).
|
|
// CHECK: @GlobalRedecl5 = external dllimport global i32
|
|
__declspec(dllimport) extern int GlobalRedecl5;
|
|
USEVAR(GlobalRedecl5)
|
|
extern int GlobalRedecl5; // dllimport ignored
|
|
|
|
// Redeclaration in local context.
|
|
// CHECK: @GlobalRedecl6 = external dllimport global i32
|
|
__declspec(dllimport) int GlobalRedecl6;
|
|
int functionScope() {
|
|
extern int GlobalRedecl6; // still dllimport
|
|
return GlobalRedecl6;
|
|
}
|
|
|
|
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Functions
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// Import function declaration.
|
|
// CHECK-DAG: declare dllimport void @decl()
|
|
__declspec(dllimport) void decl(void);
|
|
|
|
// Initialize use_decl with the address of the thunk.
|
|
// CHECK-DAG: @use_decl = dso_local global void ()* @decl
|
|
void (*use_decl)(void) = &decl;
|
|
|
|
// Import inline function.
|
|
// MS-DAG: declare dllimport void @inlineFunc()
|
|
// MO1-DAG: define available_externally dllimport void @inlineFunc()
|
|
// GNU-DAG: declare dso_local void @inlineFunc()
|
|
// GO1-DAG: define available_externally dso_local void @inlineFunc()
|
|
__declspec(dllimport) inline void inlineFunc(void) {}
|
|
USE(inlineFunc)
|
|
|
|
// inline attributes
|
|
// MS-DAG: declare dllimport void @noinline()
|
|
// MO1-DAG: define available_externally dllimport void @noinline()
|
|
// GNU-DAG: declare dso_local void @noinline()
|
|
// GO1-DAG: define available_externally dso_local void @noinline()
|
|
// CHECK-NOT: @alwaysInline()
|
|
// O1-NOT: @alwaysInline()
|
|
__declspec(dllimport) __attribute__((noinline)) inline void noinline(void) {}
|
|
__declspec(dllimport) __attribute__((always_inline)) inline void alwaysInline(void) {}
|
|
USE(noinline)
|
|
USE(alwaysInline)
|
|
|
|
// Redeclarations
|
|
// CHECK-DAG: declare dllimport void @redecl1()
|
|
__declspec(dllimport) void redecl1(void);
|
|
__declspec(dllimport) void redecl1(void);
|
|
USE(redecl1)
|
|
|
|
// NB: MSVC issues a warning and makes redecl2/redecl3 dllexport. We follow GCC
|
|
// and drop the dllimport with a warning.
|
|
// CHECK-DAG: declare dso_local void @redecl2()
|
|
__declspec(dllimport) void redecl2(void);
|
|
void redecl2(void);
|
|
USE(redecl2)
|
|
|
|
// MS: define dso_local dllexport void @redecl3()
|
|
// GNU: define dso_local void @redecl3()
|
|
__declspec(dllimport) void redecl3(void);
|
|
void redecl3(void) {} // dllimport ignored
|
|
USE(redecl3)
|
|
|
|
// Make sure this works even if the decl is used before it's defined (PR20792).
|
|
// MS: define dso_local dllexport void @redecl4()
|
|
// GNU: define dso_local void @redecl4()
|
|
__declspec(dllimport) void redecl4(void);
|
|
USE(redecl4)
|
|
void redecl4(void) {} // dllimport ignored
|
|
|
|
// FIXME: dllimport is dropped in the AST; this should be reflected in codegen (PR20803).
|
|
// CHECK-DAG: declare dllimport
|
|
__declspec(dllimport) void redecl5(void);
|
|
USE(redecl5)
|
|
void redecl5(void); // dllimport ignored
|