diff options
Diffstat (limited to 'clang/test/CodeGen')
| -rw-r--r-- | clang/test/CodeGen/dllexport.c | 117 | ||||
| -rw-r--r-- | clang/test/CodeGen/dllimport-dllexport.c | 22 | ||||
| -rw-r--r-- | clang/test/CodeGen/dllimport.c | 90 |
3 files changed, 202 insertions, 27 deletions
diff --git a/clang/test/CodeGen/dllexport.c b/clang/test/CodeGen/dllexport.c index 10f8546bcc3..43899949437 100644 --- a/clang/test/CodeGen/dllexport.c +++ b/clang/test/CodeGen/dllexport.c @@ -1,8 +1,115 @@ -// RUN: %clang_cc1 -triple i686-pc-win32 -std=c99 -emit-llvm < %s | FileCheck %s +// RUN: %clang_cc1 -triple i686-windows-msvc -emit-llvm -std=c11 -O0 -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-windows-msvc -emit-llvm -std=c11 -O0 -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple i686-windows-gnu -emit-llvm -std=c11 -O0 -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-windows-gnu -emit-llvm -std=c11 -O0 -o - %s | FileCheck %s -#define DLLEXPORT __declspec(dllexport) -inline void DLLEXPORT f() {} -extern void DLLEXPORT f(); -// CHECK: define weak_odr dllexport void @f() +//===----------------------------------------------------------------------===// +// Globals +//===----------------------------------------------------------------------===// + +// Declarations are not exported. +// CHECK-NOT: @ExternGlobalDecl +__declspec(dllexport) extern int ExternGlobalDecl; + +// dllexport implies a definition. +// CHECK-DAG: @GlobalDef = common dllexport global i32 0, align 4 +__declspec(dllexport) int GlobalDef; + +// Export definition. +// CHECK-DAG: @GlobalInit = dllexport global i32 1, align 4 +__declspec(dllexport) int GlobalInit = 1; + +// Declare, then export definition. +// CHECK-DAG: @GlobalDeclInit = dllexport global i32 1, align 4 +__declspec(dllexport) extern int GlobalDeclInit; +int GlobalDeclInit = 1; + +// Redeclarations +// CHECK-DAG: @GlobalRedecl1 = common dllexport global i32 0, align 4 +__declspec(dllexport) extern int GlobalRedecl1; +__declspec(dllexport) int GlobalRedecl1; + +// CHECK-DAG: @GlobalRedecl2 = common dllexport global i32 0, align 4 +__declspec(dllexport) extern int GlobalRedecl2; + int GlobalRedecl2; + + + +//===----------------------------------------------------------------------===// +// Functions +//===----------------------------------------------------------------------===// + +// Declarations are not exported. + +// Export function definition. +// CHECK-DAG: define dllexport void @def() +__declspec(dllexport) void def(void) {} + +// Export inline function. +// CHECK-DAG: define weak_odr dllexport void @inlineFunc() +// CHECK-DAG: define weak_odr dllexport void @externInlineFunc() +__declspec(dllexport) inline void inlineFunc(void) {} +__declspec(dllexport) inline void externInlineFunc(void) {} +extern void externInlineFunc(void); + +// Redeclarations +// CHECK-DAG: define dllexport void @redecl1() +__declspec(dllexport) void redecl1(void); +__declspec(dllexport) void redecl1(void) {} + +// CHECK-DAG: define dllexport void @redecl2() +__declspec(dllexport) void redecl2(void); + void redecl2(void) {} + + + +//===----------------------------------------------------------------------===// +// Precedence +//===----------------------------------------------------------------------===// + +// dllexport takes precedence over the dllimport if both are specified. +// CHECK-DAG: @PrecedenceGlobal1A = common dllexport global i32 0, align 4 +// CHECK-DAG: @PrecedenceGlobal1B = common dllexport global i32 0, align 4 +__attribute__((dllimport, dllexport)) int PrecedenceGlobal1A; +__declspec(dllimport) __declspec(dllexport) int PrecedenceGlobal1B; + +// CHECK-DAG: @PrecedenceGlobal2A = common dllexport global i32 0, align 4 +// CHECK-DAG: @PrecedenceGlobal2B = common dllexport global i32 0, align 4 +__attribute__((dllexport, dllimport)) int PrecedenceGlobal2A; +__declspec(dllexport) __declspec(dllimport) int PrecedenceGlobal2B; + +// CHECK-DAG: @PrecedenceGlobalRedecl1 = dllexport global i32 0, align 4 +__declspec(dllexport) extern int PrecedenceGlobalRedecl1; +__declspec(dllimport) int PrecedenceGlobalRedecl1 = 0; + +// CHECK-DAG: @PrecedenceGlobalRedecl2 = common dllexport global i32 0, align 4 +__declspec(dllimport) extern int PrecedenceGlobalRedecl2; +__declspec(dllexport) int PrecedenceGlobalRedecl2; + +// CHECK-DAG: @PrecedenceGlobalMixed1 = dllexport global i32 1, align 4 +__attribute__((dllexport)) extern int PrecedenceGlobalMixed1; +__declspec(dllimport) int PrecedenceGlobalMixed1 = 1; + +// CHECK-DAG: @PrecedenceGlobalMixed2 = common dllexport global i32 0, align 4 +__attribute__((dllimport)) extern int PrecedenceGlobalMixed2; +__declspec(dllexport) int PrecedenceGlobalMixed2; + +// CHECK-DAG: define dllexport void @precedence1A() +// CHECK-DAG: define dllexport void @precedence1B() +void __attribute__((dllimport, dllexport)) precedence1A(void) {} +void __declspec(dllimport) __declspec(dllexport) precedence1B(void) {} + +// CHECK-DAG: define dllexport void @precedence2A() +// CHECK-DAG: define dllexport void @precedence2B() +void __attribute__((dllexport, dllimport)) precedence2A(void) {} +void __declspec(dllexport) __declspec(dllimport) precedence2B(void) {} + +// CHECK-DAG: define dllexport void @precedenceRedecl1() +void __declspec(dllimport) precedenceRedecl1(void); +void __declspec(dllexport) precedenceRedecl1(void) {} + +// CHECK-DAG: define dllexport void @precedenceRedecl2() +void __declspec(dllexport) precedenceRedecl2(void); +void __declspec(dllimport) precedenceRedecl2(void) {} diff --git a/clang/test/CodeGen/dllimport-dllexport.c b/clang/test/CodeGen/dllimport-dllexport.c deleted file mode 100644 index b005e34b788..00000000000 --- a/clang/test/CodeGen/dllimport-dllexport.c +++ /dev/null @@ -1,22 +0,0 @@ -// RUN: %clang_cc1 -triple i386-mingw32 -emit-llvm < %s | FileCheck %s - -__attribute__((dllexport)) int bar1 = 2; -// CHECK-LABEL: @bar1 = dllexport global i32 2 -__attribute__((dllimport)) extern int bar2; -// CHECK-LABEL: @bar2 = external dllimport global i32 - -void __attribute__((dllimport)) foo1(); -void __attribute__((dllexport)) foo1(){} -// CHECK-LABEL: define dllexport void @foo1 -void __attribute__((dllexport)) foo2(); - -// PR6269 -__declspec(dllimport) void foo3(); -__declspec(dllexport) void foo3(){} -// CHECK-LABEL: define dllexport void @foo3 -__declspec(dllexport) void foo4(); - -__declspec(dllimport) void foo5(); -// CHECK-LABEL: declare dllimport void @foo5 - -int use() { foo5(); return bar2; } diff --git a/clang/test/CodeGen/dllimport.c b/clang/test/CodeGen/dllimport.c new file mode 100644 index 00000000000..485f6e21b2a --- /dev/null +++ b/clang/test/CodeGen/dllimport.c @@ -0,0 +1,90 @@ +// RUN: %clang_cc1 -triple i686-windows-msvc -emit-llvm -std=c11 -O0 -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-windows-msvc -emit-llvm -std=c11 -O0 -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple i686-windows-gnu -emit-llvm -std=c11 -O0 -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-windows-gnu -emit-llvm -std=c11 -O0 -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple i686-windows-msvc -emit-llvm -std=c11 -O1 -o - %s | FileCheck --check-prefix=O1 %s +// RUN: %clang_cc1 -triple i686-windows-gnu -emit-llvm -std=c11 -O1 -o - %s | FileCheck --check-prefix=O1 %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. +// CHECK: @GlobalRedecl3 = external global i32 +__declspec(dllimport) extern int GlobalRedecl3; + extern int GlobalRedecl3; // dllimport ignored +USEVAR(GlobalRedecl3) + + + +//===----------------------------------------------------------------------===// +// Functions +//===----------------------------------------------------------------------===// + +// Import function declaration. +// CHECK-DAG: declare dllimport void @decl() +__declspec(dllimport) void decl(void); +USE(decl) + +// Import inline function. +// CHECK-DAG: declare dllimport void @inlineFunc() +// O1-DAG: define available_externally dllimport void @inlineFunc() +__declspec(dllimport) inline void inlineFunc(void) {} +USE(inlineFunc) + +// inline attributes +// CHECK-DAG: declare dllimport void @noinline() +// O1-DAG: define available_externally dllimport 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 void @redecl2() +__declspec(dllimport) void redecl2(void); + void redecl2(void); +USE(redecl2) + +// CHECK-DAG: define void @redecl3() +__declspec(dllimport) void redecl3(void); + void redecl3(void) {} // dllimport ignored +USE(redecl3) |

