diff options
author | Reid Kleckner <rnk@google.com> | 2019-04-29 23:05:47 +0000 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2019-04-29 23:05:47 +0000 |
commit | 1808c02c155eb562e6cc7bcc43cb04ee225cf1d5 (patch) | |
tree | b90f3de7d039b92c40111ada0318cab601de9189 /clang/test/CodeGenCXX | |
parent | 2ac6aca8af70ee4496667587df58f467f5240252 (diff) | |
download | bcm5719-llvm-1808c02c155eb562e6cc7bcc43cb04ee225cf1d5.tar.gz bcm5719-llvm-1808c02c155eb562e6cc7bcc43cb04ee225cf1d5.zip |
Re-land r359250, [COFF] Statically link certain runtime library functions
Reverts the revert of r359251, this time with fixed tests.
Differential Revision: https://reviews.llvm.org/D55229
llvm-svn: 359513
Diffstat (limited to 'clang/test/CodeGenCXX')
-rw-r--r-- | clang/test/CodeGenCXX/dllimport-runtime-fns.cpp | 63 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/runtime-dllstorage.cpp | 4 |
2 files changed, 65 insertions, 2 deletions
diff --git a/clang/test/CodeGenCXX/dllimport-runtime-fns.cpp b/clang/test/CodeGenCXX/dllimport-runtime-fns.cpp new file mode 100644 index 00000000000..a42fcce8bbf --- /dev/null +++ b/clang/test/CodeGenCXX/dllimport-runtime-fns.cpp @@ -0,0 +1,63 @@ +// RUN: %clang_cc1 -fms-extensions -fms-compatibility-version=19.20 -triple x86_64-windows-msvc -fexceptions -fcxx-exceptions -emit-llvm -o - %s | FileCheck %s --check-prefix=MSVC +// RUN: %clang_cc1 -fms-extensions -fms-compatibility-version=19.20 -triple aarch64-windows-msvc -fexceptions -fcxx-exceptions -emit-llvm -o - %s | FileCheck %s --check-prefix=MSVC +// RUN: %clang_cc1 -triple x86_64-windows-itanium -fexceptions -fcxx-exceptions -emit-llvm -o - %s | FileCheck %s --check-prefix=ITANIUM +// RUN: %clang_cc1 -triple aarch64-windows-gnu -fexceptions -fcxx-exceptions -emit-llvm -o - %s | FileCheck %s --check-prefix=GNU + +void foo1() { throw 1; } +// _CxxThrowException should not be marked dllimport. +// MSVC-LABEL: define dso_local void @"?foo1@@YAXXZ" +// MSVC: call void @_CxxThrowException +// MSVC: declare dso_local void @_CxxThrowException(i8*, %eh.ThrowInfo*) + +// __cxa_throw should be marked dllimport for *-windows-itanium. +// ITANIUM-LABEL: define dso_local void @_Z4foo1v() +// ITANIUM: call void @__cxa_throw({{.*}}) +// ITANIUM: declare dllimport void @__cxa_throw({{.*}}) + +// ... but not for *-windows-gnu. +// GNU-LABEL: define dso_local void @_Z4foo1v() +// GNU: call void @__cxa_throw({{.*}}) +// GNU: declare dso_local void @__cxa_throw({{.*}}) + + +void bar(); +void foo2() noexcept(true) { bar(); } +// __std_terminate should not be marked dllimport. +// MSVC-LABEL: define dso_local void @"?foo2@@YAXXZ" +// MSVC: call void @__std_terminate() +// MSVC: declare dso_local void @__std_terminate() + +// _ZSt9terminatev and __cxa_begin_catch should be marked dllimport. +// ITANIUM-LABEL: define linkonce_odr hidden void @__clang_call_terminate(i8*) +// ITANIUM: call i8* @__cxa_begin_catch({{.*}}) +// ITANIUM: call void @_ZSt9terminatev() +// ITANIUM: declare dllimport i8* @__cxa_begin_catch(i8*) +// ITANIUM: declare dllimport void @_ZSt9terminatev() + +// .. not for mingw. +// GNU-LABEL: define linkonce_odr hidden void @__clang_call_terminate(i8*) +// GNU: call i8* @__cxa_begin_catch({{.*}}) +// GNU: call void @_ZSt9terminatev() +// GNU: declare dso_local i8* @__cxa_begin_catch(i8*) +// GNU: declare dso_local void @_ZSt9terminatev() + + +struct A {}; +struct B { virtual void f(); }; +struct C : A, virtual B {}; +struct T {}; +T *foo3() { return dynamic_cast<T *>((C *)0); } +// __RTDynamicCast should not be marked dllimport. +// MSVC-LABEL: define dso_local %struct.T* @"?foo3@@YAPEAUT@@XZ" +// MSVC: call i8* @__RTDynamicCast({{.*}}) +// MSVC: declare dso_local i8* @__RTDynamicCast(i8*, i32, i8*, i8*, i32) + +// Again, imported +// ITANIUM-LABEL: define dso_local %struct.T* @_Z4foo3v() +// ITANIUM: call i8* @__dynamic_cast({{.*}}) +// ITANIUM: declare dllimport i8* @__dynamic_cast({{.*}}) + +// Not imported +// GNU-LABEL: define dso_local %struct.T* @_Z4foo3v() +// GNU: call i8* @__dynamic_cast({{.*}}) +// GNU: declare dso_local i8* @__dynamic_cast({{.*}}) diff --git a/clang/test/CodeGenCXX/runtime-dllstorage.cpp b/clang/test/CodeGenCXX/runtime-dllstorage.cpp index 7220fa50b0e..d89b5089dd7 100644 --- a/clang/test/CodeGenCXX/runtime-dllstorage.cpp +++ b/clang/test/CodeGenCXX/runtime-dllstorage.cpp @@ -14,7 +14,7 @@ // RUN: %clang_cc1 -triple i686-windows-gnu -std=c++11 -fdeclspec -fms-compatibility -fexceptions -fcxx-exceptions -emit-llvm -o - %s | FileCheck -allow-deprecated-dag-overlap %s -check-prefix CHECK-IA -check-prefix CHECK-STATIC-IA // RUN: %clang_cc1 -triple i686-windows-gnu -std=c++11 -fdeclspec -fms-compatibility -fexceptions -fcxx-exceptions -flto-visibility-public-std -emit-llvm -o - %s | FileCheck -allow-deprecated-dag-overlap %s -check-prefix CHECK-IA -check-prefix CHECK-STATIC-IA -// RUN: %clang_cc1 -triple i686-windows-cygnus -std=c++11 -fdeclspec -fms-compatibility -fexceptions -fcxx-exceptions -emit-llvm -o - %s | FileCheck -allow-deprecated-dag-overlap %s -check-prefix CHECK-IA -check-prefix CHECK-DYNAMIC-IA +// RUN: %clang_cc1 -triple i686-windows-cygnus -std=c++11 -fdeclspec -fms-compatibility -fexceptions -fcxx-exceptions -emit-llvm -o - %s | FileCheck -allow-deprecated-dag-overlap %s -check-prefix CHECK-IA -check-prefix CHECK-STATIC-IA // RUN: %clang_cc1 -triple i686-windows-cygnus -std=c++11 -fdeclspec -fms-compatibility -fexceptions -fcxx-exceptions -flto-visibility-public-std -emit-llvm -o - %s | FileCheck -allow-deprecated-dag-overlap %s -check-prefix CHECK-IA -check-prefix CHECK-STATIC-IA #if defined(IMPORT_DECLARATIONS) @@ -108,7 +108,7 @@ void l() { // CHECK-MS-DAG: @_Init_thread_epoch = external thread_local global i32 // CHECK-MS-DAG: declare dso_local i32 @__tlregdtor(void ()*) // CHECK-MS-DAG: declare dso_local i32 @atexit(void ()*) -// CHECK-MS-DYNAMIC-DAG: declare dllimport {{.*}} void @_CxxThrowException +// CHECK-MS-DYNAMIC-DAG: declare {{.*}} void @_CxxThrowException // CHECK-MS-STATIC-DAG: declare {{.*}} void @_CxxThrowException // CHECK-MS-DAG: declare dso_local noalias i8* @"??2@YAPAXI@Z" // CHECK-MS-DAG: declare dso_local void @_Init_thread_header(i32*) |