Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[WebAssembly] Ensure bitcasts that would result in invalid wasm are r…
…emoved by FixFunctionBitcasts Rather than allowing invalid bitcasts to be lowered to wasm call instructions that won't validate, generate wrappers that contain unreachable thereby delaying the error until runtime. Differential Revision: https://reviews.llvm.org/D49517 llvm-svn: 338744
- Loading branch information
Showing
5 changed files
with
150 additions
and
61 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
62 changes: 47 additions & 15 deletions
62
llvm/test/CodeGen/WebAssembly/unsupported-function-bitcasts.ll
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,27 +1,59 @@ | ||
; RUN: llc < %s -asm-verbose=false | FileCheck %s | ||
|
||
; Test that function pointer casts that require conversions are not converted | ||
; to wrappers. In theory some conversions could be supported, but currently no | ||
; conversions are implemented. | ||
; Test that function pointer casts that require conversions of arguments or | ||
; return types are converted to unreachable. | ||
|
||
target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" | ||
target triple = "wasm32-unknown-unknown" | ||
|
||
; CHECK-LABEL: test: | ||
declare i32 @has_i64_arg(i64) | ||
declare i32 @has_ptr_arg(i8*) | ||
|
||
define void @test_invalid_rtn() { | ||
entry: | ||
call i32 bitcast (i32 (i64)* @has_i64_arg to i32 (i32)*)(i32 0) | ||
ret void | ||
} | ||
; CHECK-LABEL: test_invalid_rtn: | ||
; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 0{{$}} | ||
; CHECK-NEXT: call has_i64_arg@FUNCTION, $pop[[L0]]{{$}} | ||
; CHECK-NEXT: i32.call $push{{[0-9]+}}=, has_i64_ret@FUNCTION{{$}} | ||
; CHECK-NEXT: drop | ||
; CHECK-NEXT: i32.call $push1=, .Lhas_i64_arg_bitcast_invalid@FUNCTION, $pop[[L0]]{{$}} | ||
; CHECK-NEXT: drop $pop1 | ||
; CHECK-NEXT: end_function | ||
|
||
; CHECK-NOT: .Lbitcast | ||
|
||
declare void @has_i64_arg(i64) | ||
declare i64 @has_i64_ret() | ||
|
||
define void @test() { | ||
define void @test_invalid_arg() { | ||
entry: | ||
call void bitcast (void (i64)* @has_i64_arg to void (i32)*)(i32 0) | ||
%t = call i32 bitcast (i64 ()* @has_i64_ret to i32 ()*)() | ||
call i32 bitcast (i32 (i8*)* @has_ptr_arg to i32 (i8)*)(i8 2) | ||
call i32 bitcast (i32 (i8*)* @has_ptr_arg to i32 (i32)*)(i32 2) | ||
call i32 bitcast (i32 (i8*)* @has_ptr_arg to i32 (i64)*)(i64 3) | ||
ret void | ||
} | ||
|
||
; CHECK-LABEL: test_invalid_arg: | ||
; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 2{{$}} | ||
; CHECK-NEXT: i32.call $push[[L1:[0-9]+]]=, .Lhas_ptr_arg_bitcast_invalid.1@FUNCTION, $pop[[L0]]{{$}} | ||
; CHECK-NEXT: drop $pop[[L1]]{{$}} | ||
; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 2{{$}} | ||
; CHECK-NEXT: i32.call $push[[L1:[0-9]+]]=, has_ptr_arg@FUNCTION, $pop[[L0]]{{$}} | ||
; CHECK-NEXT: drop $pop[[L1]]{{$}} | ||
; CHECK-NEXT: i64.const $push[[L0:[0-9]+]]=, 3{{$}} | ||
; CHECK-NEXT: i32.call $push[[L1:[0-9]+]]=, .Lhas_ptr_arg_bitcast_invalid@FUNCTION, $pop[[L0]]{{$}} | ||
; CHECK-NEXT: drop $pop[[L1]]{{$}} | ||
; CHECK-NEXT: end_function | ||
|
||
; CHECK-LABEL: .Lhas_i64_arg_bitcast_invalid: | ||
; CHECK-NEXT: .param i32 | ||
; CHECK-NEXT: .result i32 | ||
; CHECK-NEXT: unreachable | ||
; CHECK-NEXT: end_function | ||
|
||
; CHECK-LABEL: .Lhas_ptr_arg_bitcast_invalid: | ||
; CHECK-NEXT: .param i64 | ||
; CHECK-NEXT: .result i32 | ||
; CHECK-NEXT: unreachable | ||
; CHECK-NEXT: end_function | ||
|
||
; CHECK-LABEL: .Lhas_ptr_arg_bitcast_invalid.1: | ||
; CHECK-NEXT: .param i32 | ||
; CHECK-NEXT: .result i32 | ||
; CHECK-NEXT: unreachable | ||
; CHECK-NEXT: end_function |