[llvm] r291326 - [WebAssembly] Don't abort on code with UB.
Dan Gohman via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 6 17:50:01 PST 2017
Author: djg
Date: Fri Jan 6 19:50:01 2017
New Revision: 291326
URL: http://llvm.org/viewvc/llvm-project?rev=291326&view=rev
Log:
[WebAssembly] Don't abort on code with UB.
Gracefully leave code that performs function-pointer bitcasts implying
non-trivial pointer conversions alone, rather than aborting, since it's
just undefined behavior.
Added:
llvm/trunk/test/CodeGen/WebAssembly/unsupported-function-bitcasts.ll
Modified:
llvm/trunk/lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp
llvm/trunk/test/CodeGen/WebAssembly/function-bitcasts.ll
Modified: llvm/trunk/lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp?rev=291326&r1=291325&r2=291326&view=diff
==============================================================================
--- llvm/trunk/lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp (original)
+++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp Fri Jan 6 19:50:01 2017
@@ -77,6 +77,9 @@ static void FindUses(Value *V, Function
// - Call with fewer arguments than needed: arguments are filled in with undef
// - Return value is not needed: drop it
// - Return value needed but not present: supply an undef
+//
+// For now, return nullptr without creating a wrapper if the wrapper cannot
+// be generated due to incompatible types.
static Function *CreateWrapper(Function *F, FunctionType *Ty) {
Module *M = F->getParent();
@@ -90,8 +93,10 @@ static Function *CreateWrapper(Function
FunctionType::param_iterator PI = F->getFunctionType()->param_begin();
FunctionType::param_iterator PE = F->getFunctionType()->param_end();
for (; AI != Wrapper->arg_end() && PI != PE; ++AI, ++PI) {
- assert(AI->getType() == *PI &&
- "mismatched argument types not supported yet");
+ if (AI->getType() != *PI) {
+ Wrapper->eraseFromParent();
+ return nullptr;
+ }
Args.push_back(&*AI);
}
for (; PI != PE; ++PI)
@@ -107,8 +112,10 @@ static Function *CreateWrapper(Function
BB);
else if (F->getFunctionType()->getReturnType() == Ty->getReturnType())
ReturnInst::Create(M->getContext(), Call, BB);
- else
- llvm_unreachable("mismatched return types not supported yet");
+ else {
+ Wrapper->eraseFromParent();
+ return nullptr;
+ }
return Wrapper;
}
@@ -138,10 +145,14 @@ bool FixFunctionBitcasts::runOnModule(Mo
if (Pair.second)
Pair.first->second = CreateWrapper(F, Ty);
+ Function *Wrapper = Pair.first->second;
+ if (!Wrapper)
+ continue;
+
if (isa<Constant>(U->get()))
- U->get()->replaceAllUsesWith(Pair.first->second);
+ U->get()->replaceAllUsesWith(Wrapper);
else
- U->set(Pair.first->second);
+ U->set(Wrapper);
}
return true;
Modified: llvm/trunk/test/CodeGen/WebAssembly/function-bitcasts.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/WebAssembly/function-bitcasts.ll?rev=291326&r1=291325&r2=291326&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/WebAssembly/function-bitcasts.ll (original)
+++ llvm/trunk/test/CodeGen/WebAssembly/function-bitcasts.ll Fri Jan 6 19:50:01 2017
@@ -8,7 +8,7 @@ target triple = "wasm32-unknown-unknown"
; CHECK-LABEL: test:
; CHECK-NEXT: call .Lbitcast at FUNCTION{{$}}
; CHECK-NEXT: call .Lbitcast.1 at FUNCTION{{$}}
-; CHECK-NEXT: i32.const $push[[L0:[0-9]*]]=, 0
+; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 0
; CHECK-NEXT: call .Lbitcast.2 at FUNCTION, $pop[[L0]]{{$}}
; CHECK-NEXT: i32.call $drop=, .Lbitcast.3 at FUNCTION{{$}}
; CHECK-NEXT: call foo2 at FUNCTION{{$}}
Added: llvm/trunk/test/CodeGen/WebAssembly/unsupported-function-bitcasts.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/WebAssembly/unsupported-function-bitcasts.ll?rev=291326&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/WebAssembly/unsupported-function-bitcasts.ll (added)
+++ llvm/trunk/test/CodeGen/WebAssembly/unsupported-function-bitcasts.ll Fri Jan 6 19:50:01 2017
@@ -0,0 +1,26 @@
+; 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.
+
+target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
+target triple = "wasm32-unknown-unknown"
+
+; CHECK-LABEL: test:
+; CHECK-NEXT: i32.const $push[[L0:[0-9]+]]=, 0{{$}}
+; CHECK-NEXT: call has_i64_arg at FUNCTION, $pop[[L0]]{{$}}
+; CHECK-NEXT: i32.call $drop=, has_i64_ret at FUNCTION{{$}}
+; CHECK-NEXT: .endfunc
+
+; CHECK-NOT: .Lbitcast
+
+declare void @has_i64_arg(i64)
+declare i64 @has_i64_ret()
+
+define void @test() {
+entry:
+ call void bitcast (void (i64)* @has_i64_arg to void (i32)*)(i32 0)
+ %t = call i32 bitcast (i64 ()* @has_i64_ret to i32 ()*)()
+ ret void
+}
More information about the llvm-commits
mailing list