diff options
author | Derek Schuff <dschuff@google.com> | 2016-08-01 22:25:02 +0000 |
---|---|---|
committer | Derek Schuff <dschuff@google.com> | 2016-08-01 22:25:02 +0000 |
commit | c64d7655b231c88d1c9fa3f482725cd70f7b2e92 (patch) | |
tree | 9552eb9adca7e5366d90369b30dcbc26dc9648ef /llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp | |
parent | 7643d98d8685fc9159b0221a6910b8f4ef872df5 (diff) | |
download | bcm5719-llvm-c64d7655b231c88d1c9fa3f482725cd70f7b2e92.tar.gz bcm5719-llvm-c64d7655b231c88d1c9fa3f482725cd70f7b2e92.zip |
[WebAssembly] Support CFI for WebAssembly target
Summary: This patch implements CFI for WebAssembly. It modifies the
LowerTypeTest pass to pre-assign table indexes to functions that are
called indirectly, and lowers type checks to test against the
appropriate table indexes. It also modifies the WebAssembly backend to
support a special ".indidx" assembly directive that propagates the table
index assignments out to the linker.
Patch by Dominic Chen
Differential Revision: https://reviews.llvm.org/D21768
llvm-svn: 277398
Diffstat (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp')
-rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp index 54e9f7f5290..b95d77b770a 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp @@ -14,10 +14,10 @@ /// //===----------------------------------------------------------------------===// -#include "WebAssembly.h" #include "InstPrinter/WebAssemblyInstPrinter.h" #include "MCTargetDesc/WebAssemblyMCTargetDesc.h" #include "MCTargetDesc/WebAssemblyTargetStreamer.h" +#include "WebAssembly.h" #include "WebAssemblyMCInstLower.h" #include "WebAssemblyMachineFunctionInfo.h" #include "WebAssemblyRegisterInfo.h" @@ -183,6 +183,15 @@ void WebAssemblyAsmPrinter::EmitFunctionBodyStart() { SmallVector<MVT, 4> ResultVTs; const Function &F(*MF->getFunction()); + + // Emit the function index. + if (MDNode *Idx = F.getMetadata("wasm.index")) { + assert(Idx->getNumOperands() == 1); + + getTargetStreamer()->emitIndIdx(AsmPrinter::lowerConstant( + cast<ConstantAsMetadata>(Idx->getOperand(0))->getValue())); + } + ComputeLegalValueVTs(F, TM, F.getReturnType(), ResultVTs); // If the return type needs to be legalized it will get converted into |