diff options
author | David Chisnall <csdavec@swan.ac.uk> | 2018-08-09 08:02:42 +0000 |
---|---|---|
committer | David Chisnall <csdavec@swan.ac.uk> | 2018-08-09 08:02:42 +0000 |
commit | c5a458cc53bc0cba359abc49f2b1fcf8f940669c (patch) | |
tree | a636059057ded3d6262aae1300001ff5b1d8a2e0 /clang/test/CodeGen/global-blocks-win32.c | |
parent | 20526bf48310b6a8ff5b655582545d4b79a06c2d (diff) | |
download | bcm5719-llvm-c5a458cc53bc0cba359abc49f2b1fcf8f940669c.tar.gz bcm5719-llvm-c5a458cc53bc0cba359abc49f2b1fcf8f940669c.zip |
Correctly initialise global blocks on Windows.
Summary:
Windows does not allow globals to be initialised to point to globals in
another DLL. Exported globals may be referenced only from code. Work
around this by creating an initialiser that runs in early library
initialisation and sets the isa pointer.
Reviewers: rjmccall
Reviewed By: rjmccall
Subscribers: cfe-commits
Differential Revision: https://reviews.llvm.org/D50436
llvm-svn: 339317
Diffstat (limited to 'clang/test/CodeGen/global-blocks-win32.c')
-rw-r--r-- | clang/test/CodeGen/global-blocks-win32.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/clang/test/CodeGen/global-blocks-win32.c b/clang/test/CodeGen/global-blocks-win32.c new file mode 100644 index 00000000000..7a66c924b42 --- /dev/null +++ b/clang/test/CodeGen/global-blocks-win32.c @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 -fblocks -triple i386-pc-windows-msvc %s -emit-llvm -o - -fblocks | FileCheck %s + + +int (^x)(void) = ^() { return 21; }; + + +// Check that the block literal is emitted with a null isa pointer +// CHECK: @__block_literal_global = internal global { i8**, i32, i32, i8*, %struct.__block_descriptor* } { i8** null, + +// Check that _NSConcreteGlobalBlock has the correct dllimport specifier. +// CHECK: @_NSConcreteGlobalBlock = external dllimport global i8* +// Check that we create an initialiser pointer in the correct section (early library initialisation). +// CHECK: @.block_isa_init_ptr = internal constant void ()* @.block_isa_init, section ".CRT$XCLa" + +// Check that we emit an initialiser for it. +// CHECK: define internal void @.block_isa_init() { +// CHECK: store i8** @_NSConcreteGlobalBlock, i8*** getelementptr inbounds ({ i8**, i32, i32, i8*, %struct.__block_descriptor* }, { i8**, i32, i32, i8*, %struct.__block_descriptor* }* @__block_literal_global, i32 0, i32 0), align 4 + |