diff options
author | Dmitry Polukhin <dmitry.polukhin@gmail.com> | 2016-04-07 12:32:19 +0000 |
---|---|---|
committer | Dmitry Polukhin <dmitry.polukhin@gmail.com> | 2016-04-07 12:32:19 +0000 |
commit | a1feff7024b552b579f302fea0030aaaa14624b3 (patch) | |
tree | bc5cbda70333854512705e91da81598e4368a052 /llvm/test | |
parent | 79cb643b201bfa1acba9a1afef7395f3be3f60e6 (diff) | |
download | bcm5719-llvm-a1feff7024b552b579f302fea0030aaaa14624b3.tar.gz bcm5719-llvm-a1feff7024b552b579f302fea0030aaaa14624b3.zip |
[GCC] Attribute ifunc support in llvm
This patch add support for GCC attribute((ifunc("resolver"))) for
targets that use ELF as object file format. In general ifunc is a
special kind of function alias with type @gnu_indirect_function. Patch
for Clang http://reviews.llvm.org/D15524
Differential Revision: http://reviews.llvm.org/D15525
llvm-svn: 265667
Diffstat (limited to 'llvm/test')
-rw-r--r-- | llvm/test/Assembler/ifunc-asm.ll | 14 | ||||
-rw-r--r-- | llvm/test/Assembler/ifunc-use-list-order.ll | 42 | ||||
-rw-r--r-- | llvm/test/Bitcode/compatibility.ll | 25 |
3 files changed, 81 insertions, 0 deletions
diff --git a/llvm/test/Assembler/ifunc-asm.ll b/llvm/test/Assembler/ifunc-asm.ll new file mode 100644 index 00000000000..7c30a35613a --- /dev/null +++ b/llvm/test/Assembler/ifunc-asm.ll @@ -0,0 +1,14 @@ +; RUN: llvm-as < %s | llvm-dis | FileCheck %s --check-prefix=CHECK-LLVM +; RUN: llvm-as < %s -o - | llc -filetype=asm | FileCheck %s --check-prefix=CHECK-ASM + +target triple = "x86_64-unknown-linux-gnu" + +@foo = ifunc i32 (i32), i64 ()* @foo_ifunc +; CHECK-LLVM: @foo = ifunc i32 (i32), i64 ()* @foo_ifunc +; CHECK-ASM: .type foo,@gnu_indirect_function + +define internal i64 @foo_ifunc() { +entry: + ret i64 0 +} +; CHECK-LLVM: define internal i64 @foo_ifunc() diff --git a/llvm/test/Assembler/ifunc-use-list-order.ll b/llvm/test/Assembler/ifunc-use-list-order.ll new file mode 100644 index 00000000000..efd8dcc3f87 --- /dev/null +++ b/llvm/test/Assembler/ifunc-use-list-order.ll @@ -0,0 +1,42 @@ +; RUN: verify-uselistorder < %s + +; Global referencing ifunc. +@ptr_foo = global void ()* @foo_ifunc + +; Alias for ifunc. +@alias_foo = alias void (), void ()* @foo_ifunc + +@foo_ifunc = ifunc void (), i8* ()* @foo_resolver + +define i8* @foo_resolver() { +entry: + ret i8* null +} + +; Function referencing ifunc. +define void @bar() { +entry: + call void @foo_ifunc() + ret void +} + +; Global referencing function. +@ptr_bar = global void ()* @bar + +; Alias for function. +@alias_bar = alias void (), void ()* @bar + +@bar_ifunc = ifunc void (), i8* ()* @bar2_ifunc +@bar2_ifunc = ifunc i8* (), i8* ()* @bar_resolver + +define i8* @bar_resolver() { +entry: + ret i8* null +} + +; Function referencing bar. +define void @bar2() { +entry: + call void @bar() + ret void +} diff --git a/llvm/test/Bitcode/compatibility.ll b/llvm/test/Bitcode/compatibility.ll index ae12a24ede4..d1f249114d5 100644 --- a/llvm/test/Bitcode/compatibility.ll +++ b/llvm/test/Bitcode/compatibility.ll @@ -249,6 +249,31 @@ declare void @g.f1() @a.unnamed_addr = unnamed_addr alias i32, i32* @g.unnamed_addr ; CHECK: @a.unnamed_addr = unnamed_addr alias i32, i32* @g.unnamed_addr +;; IFunc +; Format @<Name> = [Linkage] [Visibility] ifunc <IFuncTy>, +; <ResolverTy>* @<Resolver> + +; IFunc -- Linkage +@ifunc.external = external ifunc void (), i8* ()* @ifunc_resolver +; CHECK: @ifunc.external = ifunc void (), i8* ()* @ifunc_resolver +@ifunc.private = private ifunc void (), i8* ()* @ifunc_resolver +; CHECK: @ifunc.private = private ifunc void (), i8* ()* @ifunc_resolver +@ifunc.internal = internal ifunc void (), i8* ()* @ifunc_resolver +; CHECK: @ifunc.internal = internal ifunc void (), i8* ()* @ifunc_resolver + +; IFunc -- Visibility +@ifunc.default = default ifunc void (), i8* ()* @ifunc_resolver +; CHECK: @ifunc.default = ifunc void (), i8* ()* @ifunc_resolver +@ifunc.hidden = hidden ifunc void (), i8* ()* @ifunc_resolver +; CHECK: @ifunc.hidden = hidden ifunc void (), i8* ()* @ifunc_resolver +@ifunc.protected = protected ifunc void (), i8* ()* @ifunc_resolver +; CHECK: @ifunc.protected = protected ifunc void (), i8* ()* @ifunc_resolver + +define i8* @ifunc_resolver() { +entry: + ret i8* null +} + ;; Functions ; Format: define [linkage] [visibility] [DLLStorageClass] ; [cconv] [ret attrs] |