118 lines · c
1// RUN: %clang_cc1 -triple i686-windows-msvc -fms-extensions -emit-llvm -std=c11 -O0 -o - %s | FileCheck %s2// RUN: %clang_cc1 -triple x86_64-windows-msvc -fms-extensions -emit-llvm -std=c11 -O0 -o - %s | FileCheck %s3// RUN: %clang_cc1 -triple i686-windows-gnu -fms-extensions -emit-llvm -std=c11 -O0 -o - %s | FileCheck %s4// RUN: %clang_cc1 -triple x86_64-windows-gnu -fms-extensions -emit-llvm -std=c11 -O0 -o - %s | FileCheck %s5// RUN: %clang_cc1 -triple i686-pc-cygwin -fms-extensions -emit-llvm -std=c11 -O0 -o - %s | FileCheck %s6// RUN: %clang_cc1 -triple x86_64-pc-cygwin -fms-extensions -emit-llvm -std=c11 -O0 -o - %s | FileCheck %s7 8 9 10//===----------------------------------------------------------------------===//11// Globals12//===----------------------------------------------------------------------===//13 14// Declarations are not exported.15// CHECK-NOT: @ExternGlobalDecl16__declspec(dllexport) extern int ExternGlobalDecl;17 18// dllexport implies a definition.19// CHECK-DAG: @GlobalDef = dso_local dllexport global i32 0, align 420__declspec(dllexport) int GlobalDef;21 22// Export definition.23// CHECK-DAG: @GlobalInit = dso_local dllexport global i32 1, align 424__declspec(dllexport) int GlobalInit = 1;25 26// Declare, then export definition.27// CHECK-DAG: @GlobalDeclInit = dso_local dllexport global i32 1, align 428__declspec(dllexport) extern int GlobalDeclInit;29int GlobalDeclInit = 1;30 31// Redeclarations32// CHECK-DAG: @GlobalRedecl1 = dso_local dllexport global i32 0, align 433__declspec(dllexport) extern int GlobalRedecl1;34__declspec(dllexport) int GlobalRedecl1;35 36// CHECK-DAG: @GlobalRedecl2 = dso_local dllexport global i32 0, align 437__declspec(dllexport) extern int GlobalRedecl2;38 int GlobalRedecl2;39 40 41 42//===----------------------------------------------------------------------===//43// Functions44//===----------------------------------------------------------------------===//45 46// Declarations are not exported.47 48// Export function definition.49// CHECK-DAG: define dso_local dllexport void @def()50__declspec(dllexport) void def(void) {}51 52// Export inline function.53// CHECK-DAG: define weak_odr dso_local dllexport void @inlineFunc()54// CHECK-DAG: define weak_odr dso_local dllexport void @externInlineFunc()55__declspec(dllexport) inline void inlineFunc(void) {}56__declspec(dllexport) inline void externInlineFunc(void) {}57extern void externInlineFunc(void);58 59// Redeclarations60// CHECK-DAG: define dso_local dllexport void @redecl1()61__declspec(dllexport) void redecl1(void);62__declspec(dllexport) void redecl1(void) {}63 64// CHECK-DAG: define dso_local dllexport void @redecl2()65__declspec(dllexport) void redecl2(void);66 void redecl2(void) {}67 68 69 70//===----------------------------------------------------------------------===//71// Precedence72//===----------------------------------------------------------------------===//73 74// dllexport takes precedence over the dllimport if both are specified.75// CHECK-DAG: @PrecedenceGlobal1A = dso_local dllexport global i32 0, align 476// CHECK-DAG: @PrecedenceGlobal1B = dso_local dllexport global i32 0, align 477__attribute__((dllimport, dllexport)) int PrecedenceGlobal1A;78__declspec(dllimport) __declspec(dllexport) int PrecedenceGlobal1B;79 80// CHECK-DAG: @PrecedenceGlobal2A = dso_local dllexport global i32 0, align 481// CHECK-DAG: @PrecedenceGlobal2B = dso_local dllexport global i32 0, align 482__attribute__((dllexport, dllimport)) int PrecedenceGlobal2A;83__declspec(dllexport) __declspec(dllimport) int PrecedenceGlobal2B;84 85// CHECK-DAG: @PrecedenceGlobalRedecl1 = dso_local dllexport global i32 0, align 486__declspec(dllexport) extern int PrecedenceGlobalRedecl1;87__declspec(dllimport) int PrecedenceGlobalRedecl1 = 0;88 89// CHECK-DAG: @PrecedenceGlobalRedecl2 = dso_local dllexport global i32 0, align 490__declspec(dllimport) extern int PrecedenceGlobalRedecl2;91__declspec(dllexport) int PrecedenceGlobalRedecl2;92 93// CHECK-DAG: @PrecedenceGlobalMixed1 = dso_local dllexport global i32 1, align 494__attribute__((dllexport)) extern int PrecedenceGlobalMixed1;95__declspec(dllimport) int PrecedenceGlobalMixed1 = 1;96 97// CHECK-DAG: @PrecedenceGlobalMixed2 = dso_local dllexport global i32 0, align 498__attribute__((dllimport)) extern int PrecedenceGlobalMixed2;99__declspec(dllexport) int PrecedenceGlobalMixed2;100 101// CHECK-DAG: define dso_local dllexport void @precedence1A()102// CHECK-DAG: define dso_local dllexport void @precedence1B()103void __attribute__((dllimport, dllexport)) precedence1A(void) {}104void __declspec(dllimport) __declspec(dllexport) precedence1B(void) {}105 106// CHECK-DAG: define dso_local dllexport void @precedence2A()107// CHECK-DAG: define dso_local dllexport void @precedence2B()108void __attribute__((dllexport, dllimport)) precedence2A(void) {}109void __declspec(dllexport) __declspec(dllimport) precedence2B(void) {}110 111// CHECK-DAG: define dso_local dllexport void @precedenceRedecl1()112void __declspec(dllimport) precedenceRedecl1(void);113void __declspec(dllexport) precedenceRedecl1(void) {}114 115// CHECK-DAG: define dso_local dllexport void @precedenceRedecl2()116void __declspec(dllexport) precedenceRedecl2(void);117void __declspec(dllimport) precedenceRedecl2(void) {}118