diff options
author | Derek Schuff <dschuff@google.com> | 2015-11-10 00:30:57 +0000 |
---|---|---|
committer | Derek Schuff <dschuff@google.com> | 2015-11-10 00:30:57 +0000 |
commit | ffa143ce814101fb1277ba65b20bdf86775d0b32 (patch) | |
tree | 99d79c8b7ff474be111642d8722dd9217089ea17 /llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp | |
parent | 6d87f28afd467df3370d43af37760ce9b3d1a179 (diff) | |
download | llvm-ffa143ce814101fb1277ba65b20bdf86775d0b32.zip llvm-ffa143ce814101fb1277ba65b20bdf86775d0b32.tar.gz llvm-ffa143ce814101fb1277ba65b20bdf86775d0b32.tar.bz2 |
[WebAssembly] Support 'unreachable' expression
Lower LLVM's 'unreachable' terminator to ISD::TRAP, and lower ISD::TRAP to
wasm's 'unreachable' expression.
WebAssembly type-checks expressions, but a noreturn function with a
return type that doesn't match the context will cause a check
failure. So we lower LLVM 'unreachable' to ISD::TRAP and then lower that
to WebAssembly's 'unreachable' expression, which typechecks in any
context and causes a trap if executed.
Differential Revision: http://reviews.llvm.org/D14515
llvm-svn: 252566
Diffstat (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp')
-rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp index 18e2e50..99a2426 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp @@ -50,6 +50,12 @@ WebAssemblyTargetMachine::WebAssemblyTargetMachine( : "e-p:32:32-i64:64-n32:64-S128", TT, CPU, FS, Options, RM, CM, OL), TLOF(make_unique<WebAssemblyTargetObjectFile>()) { + // WebAssembly type-checks expressions, but a noreturn function with a return + // type that doesn't match the context will cause a check failure. So we lower + // LLVM 'unreachable' to ISD::TRAP and then lower that to WebAssembly's + // 'unreachable' expression which is meant for that case. + this->Options.TrapUnreachable = true; + initAsmInfo(); // We need a reducible CFG, so disable some optimizations which tend to |