1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

[WebAssembly] Handle aliases in WebAssemblyFixFunctionBitcasts

Fixes: https://github.com/emscripten-core/emscripten/issues/8770

Differential Revision: https://reviews.llvm.org/D66508

llvm-svn: 369566
This commit is contained in:
Sam Clegg 2019-08-21 19:52:33 +00:00
parent 5ce1fd7dca
commit f2a0708d5e
2 changed files with 20 additions and 1 deletions

View File

@ -70,6 +70,8 @@ static void findUses(Value *V, Function &F,
for (Use &U : V->uses()) {
if (auto *BC = dyn_cast<BitCastOperator>(U.getUser()))
findUses(BC, F, Uses, ConstantBCs);
else if (auto *A = dyn_cast<GlobalAlias>(U.getUser()))
findUses(A, F, Uses, ConstantBCs);
else if (U.get()->getType() != F.getType()) {
CallSite CS(U.getUser());
if (!CS)

View File

@ -5,7 +5,11 @@
target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
target triple = "wasm32-unknown-unknown"
declare void @has_i32_arg(i32)
define void @has_i32_arg(i32) {
entry:
ret void
}
declare void @has_struct_arg({i32})
declare i32 @has_i32_ret()
declare void @vararg(...)
@ -54,6 +58,19 @@ entry:
ret void
}
; Calling aliases should also generate a wrapper
@alias_i32_arg = weak hidden alias void (i32), void (i32)* @has_i32_arg
; CHECK-LABEL: test_alias:
; CHECK: call .Lhas_i32_arg_bitcast.2
define void @test_alias() {
entry:
call void bitcast (void (i32)* @alias_i32_arg to void ()*)()
ret void
}
; CHECK-LABEL: test_structs:
; CHECK: call .Lhas_i32_arg_bitcast.1, $pop{{[0-9]+}}, $pop{{[0-9]+$}}
; CHECK: call .Lhas_i32_arg_bitcast, $0, $pop2