diff options
Diffstat (limited to 'llvm/test/Transforms')
9 files changed, 143 insertions, 32 deletions
diff --git a/llvm/test/Transforms/LowerTypeTests/Inputs/export-icall.yaml b/llvm/test/Transforms/LowerTypeTests/Inputs/export-icall.yaml new file mode 100644 index 00000000000..b85cfd2eb00 --- /dev/null +++ b/llvm/test/Transforms/LowerTypeTests/Inputs/export-icall.yaml @@ -0,0 +1,29 @@ +--- +GlobalValueMap: + 42: + - Live: true + # guid("f"), guid("f2"), guid("f3"), guid("g"), guid("h"), guid("external"), guid("external_weak") + Refs: [14740650423002898831, 8471399308421654326, 4197650231481825559, 13146401226427987378, 8124147457056772133, 5224464028922159466, 5227079976482001346] + TypeTests: [14276520915468743435, 15427464259790519041] # guid("typeid1"), guid("typeid2") + 14740650423002898831: # guid("f") + - Linkage: 0 # external + Live: true + 8471399308421654326: # guid("f2") + - Linkage: 0 # external + Live: true + 4197650231481825559: # guid("f3") + - Linkage: 0 # external + Live: true + 13146401226427987378: # guid("g") + - Linkage: 0 # external + Live: true + 8124147457056772133: # guid("h") + - Linkage: 0 # external + Live: true + 5224464028922159466: # guid("external") + - Linkage: 0 # external + Live: true + 5227079976482001346: # guid("external_weak") + - Linkage: 9 # extern_weak + Live: true +... diff --git a/llvm/test/Transforms/LowerTypeTests/Inputs/exported-funcs.yaml b/llvm/test/Transforms/LowerTypeTests/Inputs/exported-funcs.yaml new file mode 100644 index 00000000000..5457e36573b --- /dev/null +++ b/llvm/test/Transforms/LowerTypeTests/Inputs/exported-funcs.yaml @@ -0,0 +1,22 @@ +--- +GlobalValueMap: + 42: + - Live: true + Refs: [16594175687743574550, 2415377257478301385] # guid("external_addrtaken"), guid("external_addrtaken2") + TypeTests: [14276520915468743435, 15427464259790519041] # guid("typeid1"), guid("typeid2") + 5224464028922159466: # guid("external") + - Linkage: 0 # external + Live: true + 16430208882958242304: # guid("external2") + - Linkage: 0 # external + Live: true + 16594175687743574550: # guid("external_addrtaken") + - Linkage: 0 # external + Live: true + 2415377257478301385: # guid("external_addrtaken2") + - Linkage: 0 # external + Live: true + 15859245615183425489: # guid("internal") + - Linkage: 7 # internal + Live: true +... diff --git a/llvm/test/Transforms/LowerTypeTests/export-alias.ll b/llvm/test/Transforms/LowerTypeTests/export-alias.ll index 6e9c074068d..2ad8835475b 100644 --- a/llvm/test/Transforms/LowerTypeTests/export-alias.ll +++ b/llvm/test/Transforms/LowerTypeTests/export-alias.ll @@ -1,21 +1,21 @@ -; RUN: opt -S %s -lowertypetests -lowertypetests-summary-action=export -lowertypetests-read-summary=%S/Inputs/use-typeid1-typeid2.yaml | FileCheck %s +; RUN: opt -S %s -lowertypetests -lowertypetests-summary-action=export -lowertypetests-read-summary=%S/Inputs/exported-funcs.yaml | FileCheck %s ; -; CHECK: @alias1 = weak alias void (), void ()* @f -; CHECK: @alias2 = hidden alias void (), void ()* @f -; CHECK: declare !type !1 void @alias3() +; CHECK: @alias1 = weak alias void (), void ()* @external_addrtaken +; CHECK: @alias2 = hidden alias void (), void ()* @external_addrtaken ; CHECK-NOT: @alias3 = alias +; CHECK-NOT: @not_present target triple = "x86_64-unknown-linux" !cfi.functions = !{!0, !2, !3} !aliases = !{!4, !5, !6} -!0 = !{!"f", i8 0, !1} +!0 = !{!"external_addrtaken", i8 0, !1} !1 = !{i64 0, !"typeid1"} !2 = !{!"alias1", i8 1, !1} ; alias2 not included here, this could happen if the only reference to alias2 ; is in a module compiled without cfi-icall !3 = !{!"alias3", i8 1, !1} -!4 = !{!"alias1", !"f", i8 0, i8 1} -!5 = !{!"alias2", !"f", i8 1, i8 0} +!4 = !{!"alias1", !"external_addrtaken", i8 0, i8 1} +!5 = !{!"alias2", !"external_addrtaken", i8 1, i8 0} !6 = !{!"alias3", !"not_present", i8 0, i8 0} diff --git a/llvm/test/Transforms/LowerTypeTests/export-cross-dso-cfi.ll b/llvm/test/Transforms/LowerTypeTests/export-cross-dso-cfi.ll new file mode 100644 index 00000000000..c3b01ffda21 --- /dev/null +++ b/llvm/test/Transforms/LowerTypeTests/export-cross-dso-cfi.ll @@ -0,0 +1,39 @@ +; Test that external functions have jumptable entries emitted even if they are +; not address-taken when Cross-DSO CFI is used, but not otherwise. + +; RUN: opt -S -lowertypetests -lowertypetests-summary-action=export -lowertypetests-read-summary=%S/Inputs/exported-funcs.yaml < %s | FileCheck --check-prefixes=CHECK,CROSSDSO %s +; RUN: cat %s | grep -v "llvm.module.flags" | opt -S -lowertypetests -lowertypetests-summary-action=export -lowertypetests-read-summary=%S/Inputs/exported-funcs.yaml | FileCheck --check-prefixes=CHECK,NORMAL %s + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +;;; Defined in the ThinLTO portion of the build (e.g. the summary) +; CROSSDSO: declare !type !1 !type !2 hidden void @external.cfi() +; NORMAL: declare !type !1 !type !2 void @external() +declare !type !1 !type !2 void @external() + +; Don't emit jumptable entries for external declarations/non-external definitions +; CHECK-NOT: @external2 +; CHECK-NOT: @internal + +;;; Defined in the regular LTO portion of the build +; CROSSDSO: define hidden void @regularlto_external.cfi() +; NORMAL: define void @regularlto_external() +define void @regularlto_external() !type !1 !type !2 { + ret void +} + +; CHECK: define internal void @regularlto_internal() +define internal void @regularlto_internal() !type !1 !type !2 { + ret void +} + +!cfi.functions = !{!0, !3, !4} +!llvm.module.flags = !{!5} + +!0 = !{!"external", i8 0, !1, !2} +!1 = !{i64 0, !"typeid1"} +!2 = !{i64 0, i64 1234} +!3 = !{!"external2", i8 1, !1, !2} +!4 = !{!"internal", i8 0, !1, !2} +!5 = !{i32 4, !"Cross-DSO CFI", i32 1} diff --git a/llvm/test/Transforms/LowerTypeTests/export-icall.ll b/llvm/test/Transforms/LowerTypeTests/export-icall.ll index 35971809deb..54c2f568b60 100644 --- a/llvm/test/Transforms/LowerTypeTests/export-icall.ll +++ b/llvm/test/Transforms/LowerTypeTests/export-icall.ll @@ -1,4 +1,4 @@ -; RUN: opt -S -lowertypetests -lowertypetests-summary-action=export -lowertypetests-read-summary=%S/Inputs/use-typeid1-typeid2.yaml -lowertypetests-write-summary=%t < %s | FileCheck %s +; RUN: opt -S -lowertypetests -lowertypetests-summary-action=export -lowertypetests-read-summary=%S/Inputs/export-icall.yaml -lowertypetests-write-summary=%t < %s | FileCheck %s ; RUN: FileCheck --check-prefix=SUMMARY %s < %t target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" diff --git a/llvm/test/Transforms/LowerTypeTests/export-symver.ll b/llvm/test/Transforms/LowerTypeTests/export-symver.ll index e2b58fcbb44..82ec9a9109a 100644 --- a/llvm/test/Transforms/LowerTypeTests/export-symver.ll +++ b/llvm/test/Transforms/LowerTypeTests/export-symver.ll @@ -1,16 +1,16 @@ -; RUN: opt -S %s -lowertypetests -lowertypetests-summary-action=export -lowertypetests-read-summary=%S/Inputs/use-typeid1-typeid2.yaml | FileCheck %s +; RUN: opt -S %s -lowertypetests -lowertypetests-summary-action=export -lowertypetests-read-summary=%S/Inputs/exported-funcs.yaml | FileCheck %s ; -; CHECK: module asm ".symver exported_and_symver, alias1" -; CHECK-NOT: .symver exported -; CHECK-NOT: .symver symver +; CHECK: module asm ".symver external_addrtaken, alias1" +; CHECK-NOT: .symver external_addrtaken2 +; CHECK-NOT: .symver not_exported target triple = "x86_64-unknown-linux" !cfi.functions = !{!0, !1} !symvers = !{!3, !4} -!0 = !{!"exported_and_symver", i8 2, !2} -!1 = !{!"exported", i8 2, !2} +!0 = !{!"external_addrtaken", i8 0, !2} +!1 = !{!"external_addrtaken2", i8 0, !2} !2 = !{i64 0, !"typeid1"} -!3 = !{!"exported_and_symver", !"alias1"} -!4 = !{!"symver", !"alias2"} +!3 = !{!"external_addrtaken", !"alias1"} +!4 = !{!"not_exported", !"alias2"} diff --git a/llvm/test/Transforms/LowerTypeTests/function-arm-thumb.ll b/llvm/test/Transforms/LowerTypeTests/function-arm-thumb.ll index 0e92207a27f..8a205f4e683 100644 --- a/llvm/test/Transforms/LowerTypeTests/function-arm-thumb.ll +++ b/llvm/test/Transforms/LowerTypeTests/function-arm-thumb.ll @@ -22,6 +22,12 @@ define void @h2() "target-features"="-thumb-mode" !type !1 { ret void } +declare void @takeaddr(void()*, void()*, void()*, void()*, void()*) +define void @addrtaken() { + call void @takeaddr(void()* @f1, void()* @g1, void()* @f2, void()* @g2, void()* @h2) + ret void +} + !0 = !{i32 0, !"typeid1"} !1 = !{i32 0, !"typeid2"} diff --git a/llvm/test/Transforms/LowerTypeTests/function-ext.ll b/llvm/test/Transforms/LowerTypeTests/function-ext.ll index f6191e9e09a..3b256e3d8a9 100644 --- a/llvm/test/Transforms/LowerTypeTests/function-ext.ll +++ b/llvm/test/Transforms/LowerTypeTests/function-ext.ll @@ -1,26 +1,41 @@ -; RUN: opt -S -lowertypetests -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck --check-prefix=X64 %s -; RUN: opt -S -lowertypetests -mtriple=wasm32-unknown-unknown < %s | FileCheck --check-prefix=WASM32 %s +; RUN: opt -S -lowertypetests -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck --check-prefixes=CHECK,X64 %s +; RUN: opt -S -lowertypetests -mtriple=wasm32-unknown-unknown < %s | FileCheck --check-prefixes=CHECK,WASM32 %s ; Tests that we correctly handle external references, including the case where ; all functions in a bitset are external references. ; WASM32: private constant [0 x i8] zeroinitializer -; WASM32: declare !type !{{[0-9]+}} void @foo() -declare !type !0 void @foo() +; WASM32: declare !type !{{[0-9]+}} !wasm.index !{{[0-9]+}} void @foo1() +declare !type !0 void @foo1() +; WASM32: declare !type !{{[0-9]+}} void @foo2() +declare !type !1 void @foo2() +; CHECK-LABEL: @bar define i1 @bar(i8* %ptr) { - ; X64: icmp eq i64 {{.*}}, ptrtoint (void ()* @[[JT:.*]] to i64) - ; WASM32: ret i1 false - %p = call i1 @llvm.type.test(i8* %ptr, metadata !"void") + ; CHECK: %[[ICMP:[0-9]+]] = icmp eq + ; CHECK: ret i1 %[[ICMP]] + %p = call i1 @llvm.type.test(i8* %ptr, metadata !"type1") ret i1 %p } +; CHECK-LABEL: @baz +define i1 @baz(i8* %ptr) { + ; CHECK: ret i1 false + %p = call i1 @llvm.type.test(i8* %ptr, metadata !"type2") + ret i1 %p +} + +; CHECK-LABEL: @addrtaken +define void()* @addrtaken() { + ; X64: ret void ()* @[[JT:.*]] + ret void()* @foo1 +} + declare i1 @llvm.type.test(i8* %ptr, metadata %bitset) nounwind readnone -!0 = !{i64 0, !"void"} -; WASM-NOT: !{i64 0} -; WASM-NOT: !{i64 1} +!0 = !{i64 0, !"type1"} +!1 = !{i64 0, !"type2"} ; X64: define private void @[[JT]]() #{{.*}} align {{.*}} { -; X64: call void asm sideeffect "jmp ${0:c}@plt\0Aint3\0Aint3\0Aint3\0A", "s"(void ()* @foo) +; X64: call void asm sideeffect "jmp ${0:c}@plt\0Aint3\0Aint3\0Aint3\0A", "s"(void ()* @foo1) diff --git a/llvm/test/Transforms/LowerTypeTests/pr37625.ll b/llvm/test/Transforms/LowerTypeTests/pr37625.ll index e4b704eadb3..04952ed2b6d 100644 --- a/llvm/test/Transforms/LowerTypeTests/pr37625.ll +++ b/llvm/test/Transforms/LowerTypeTests/pr37625.ll @@ -1,14 +1,14 @@ -; RUN: opt -S -lowertypetests -lowertypetests-summary-action=export -lowertypetests-read-summary=%S/Inputs/use-typeid1-typeid2.yaml -lowertypetests-write-summary=%t < %s | FileCheck %s +; RUN: opt -S -lowertypetests -lowertypetests-summary-action=export -lowertypetests-read-summary=%S/Inputs/exported-funcs.yaml -lowertypetests-write-summary=%t < %s | FileCheck %s target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" -declare !type !2 extern_weak void @h(i8) +declare !type !2 extern_weak void @external_addrtaken(i8) !cfi.functions = !{!0, !1} -!0 = !{!"h", i8 2, !2} -!1 = !{!"h", i8 0, !2} +!0 = !{!"external_addrtaken", i8 2, !2} +!1 = !{!"external_addrtaken", i8 0, !2} !2 = !{i64 0, !"typeid1"} -; CHECK-DAG: @h = alias void (i8), bitcast +; CHECK-DAG: @external_addrtaken = alias void (i8), bitcast |

