summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Clegg <sbc@chromium.org>2017-12-20 01:17:45 +0000
committerSam Clegg <sbc@chromium.org>2017-12-20 01:17:45 +0000
commit7075d3fc1c042b7c75d63abb4f365ae39278b15d (patch)
treebf5a01d423fadb3a968855bd09fe83f575cef54c
parentfee10106d97a5e06f5210e01266b423747f30719 (diff)
downloadbcm5719-llvm-7075d3fc1c042b7c75d63abb4f365ae39278b15d.tar.gz
bcm5719-llvm-7075d3fc1c042b7c75d63abb4f365ae39278b15d.zip
[WebAssembly] Add test of indirect call to an otherwise unused type
In this case we are calling a function pointer which a type that doesn't otherwise exist in the code. Clearly this code can't would trap if it was ever called (because there is not such function that the pointer can resolve to). But it should valid and compile and link and validation time. llvm-svn: 321134
-rw-r--r--lld/test/wasm/call-indirect.ll24
1 files changed, 22 insertions, 2 deletions
diff --git a/lld/test/wasm/call-indirect.ll b/lld/test/wasm/call-indirect.ll
index 563c9858827..2b838a8efa4 100644
--- a/lld/test/wasm/call-indirect.ll
+++ b/lld/test/wasm/call-indirect.ll
@@ -20,10 +20,17 @@ entry:
define i32 @_start() local_unnamed_addr #1 {
entry:
%0 = load i32 ()*, i32 ()** @indirect_func, align 4
- %call = tail call i32 %0() #2
+ %call = call i32 %0() #2
ret i32 0
}
+; Indirect function call where no function actually has this type.
+; Ensures that the type entry is still created in this case.
+define void @call_ptr(i64 (i64)* %arg) {
+ %1 = call i64 %arg(i64 1)
+ ret void
+}
+
; CHECK: !WASM
; CHECK-NEXT: FileHeader:
; CHECK-NEXT: Version: 0x00000001
@@ -36,8 +43,16 @@ entry:
; CHECK-NEXT: - Index: 1
; CHECK-NEXT: ReturnType: NORESULT
; CHECK-NEXT: ParamTypes:
+; CHECK-NEXT: - Index: 2
+; CHECK-NEXT: ReturnType: NORESULT
+; CHECK-NEXT: ParamTypes:
+; CHECK-NEXT: - I32
+; CHECK-NEXT: - Index: 3
+; CHECK-NEXT: ReturnType: I64
+; CHECK-NEXT: ParamTypes:
+; CHECK-NEXT: - I64
; CHECK-NEXT: - Type: FUNCTION
-; CHECK-NEXT: FunctionTypes: [ 0, 1, 0, 0 ]
+; CHECK-NEXT: FunctionTypes: [ 0, 1, 0, 0, 2 ]
; CHECK-NEXT: - Type: TABLE
; CHECK-NEXT: Tables:
; CHECK-NEXT: - ElemType: ANYFUNC
@@ -72,6 +87,9 @@ entry:
; CHECK-NEXT: - Name: call_bar_indirect
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Index: 1
+; CHECK-NEXT: - Name: call_ptr
+; CHECK-NEXT: Kind: FUNCTION
+; CHECK-NEXT: Index: 4
; CHECK-NEXT: - Type: ELEM
; CHECK-NEXT: Segments:
; CHECK-NEXT: - Offset:
@@ -88,6 +106,8 @@ entry:
; CHECK-NEXT: Body: 41020B
; CHECK-NEXT: - Locals:
; CHECK-NEXT: Body: 410028028888808000118080808000001A41000B
+; CHECK-NEXT: - Locals:
+; CHECK-NEXT: Body: 42012000118380808000001A0B
; CHECK-NEXT: - Type: DATA
; CHECK-NEXT: Segments:
; CHECK-NEXT: - SectionOffset: 7
OpenPOWER on IntegriCloud