diff options
| author | Sam Clegg <sbc@chromium.org> | 2017-12-20 01:17:45 +0000 |
|---|---|---|
| committer | Sam Clegg <sbc@chromium.org> | 2017-12-20 01:17:45 +0000 |
| commit | 7075d3fc1c042b7c75d63abb4f365ae39278b15d (patch) | |
| tree | bf5a01d423fadb3a968855bd09fe83f575cef54c | |
| parent | fee10106d97a5e06f5210e01266b423747f30719 (diff) | |
| download | bcm5719-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.ll | 24 |
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 |

