]> granicus.if.org Git - llvm/commitdiff
[WebAssembly] Handle aliases in WebAssemblyFixFunctionBitcasts
authorSam Clegg <sbc@chromium.org>
Wed, 21 Aug 2019 19:52:33 +0000 (19:52 +0000)
committerSam Clegg <sbc@chromium.org>
Wed, 21 Aug 2019 19:52:33 +0000 (19:52 +0000)
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

lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp
test/CodeGen/WebAssembly/function-bitcasts.ll

index b7fc65401fc48594c3830bb863d7d790b0094a3a..6b1bbd7a2b0794725d86c2a8f3361db9ad6799e5 100644 (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)
index eff69ebfec2c03ab0753f84c7fb55f15304cbe0f..91bb1b6dbc307ea371d4ad47c9e6b4e4f6ecfff9 100644 (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