From b0b789435f8f3089660192e0852ec45ac6185283 Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Wed, 21 Aug 2019 19:52:33 +0000 Subject: [PATCH] [WebAssembly] Handle aliases in WebAssemblyFixFunctionBitcasts Fixes: https://github.com/emscripten-core/emscripten/issues/8770 Differential Revision: https://reviews.llvm.org/D66508 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@369566 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../WebAssemblyFixFunctionBitcasts.cpp | 2 ++ test/CodeGen/WebAssembly/function-bitcasts.ll | 19 ++++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp b/lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp index b7fc65401fc..6b1bbd7a2b0 100644 --- a/lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp +++ b/lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp @@ -70,6 +70,8 @@ static void findUses(Value *V, Function &F, for (Use &U : V->uses()) { if (auto *BC = dyn_cast(U.getUser())) findUses(BC, F, Uses, ConstantBCs); + else if (auto *A = dyn_cast(U.getUser())) + findUses(A, F, Uses, ConstantBCs); else if (U.get()->getType() != F.getType()) { CallSite CS(U.getUser()); if (!CS) diff --git a/test/CodeGen/WebAssembly/function-bitcasts.ll b/test/CodeGen/WebAssembly/function-bitcasts.ll index eff69ebfec2..91bb1b6dbc3 100644 --- a/test/CodeGen/WebAssembly/function-bitcasts.ll +++ b/test/CodeGen/WebAssembly/function-bitcasts.ll @@ -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 -- 2.50.1