diff options
author | Sam Clegg <sbc@chromium.org> | 2019-04-04 17:43:50 +0000 |
---|---|---|
committer | Sam Clegg <sbc@chromium.org> | 2019-04-04 17:43:50 +0000 |
commit | 2a7cac932bbca5492e5a42d9dac33e0cb76d0f83 (patch) | |
tree | 64e21da525922e0a2d7fc39421ecd1d879f963d6 /llvm/lib/Target/WebAssembly/WebAssemblyMCInstLower.cpp | |
parent | 98e3954fe9d6ab74888c8757284136134330e475 (diff) | |
download | llvm-2a7cac932bbca5492e5a42d9dac33e0cb76d0f83.zip llvm-2a7cac932bbca5492e5a42d9dac33e0cb76d0f83.tar.gz llvm-2a7cac932bbca5492e5a42d9dac33e0cb76d0f83.tar.bz2 |
[WebAssembly] Add new explicit relocation types for PIC relocations
See https://github.com/WebAssembly/tool-conventions/pull/106
Differential Revision: https://reviews.llvm.org/D59907
llvm-svn: 357710
Diffstat (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyMCInstLower.cpp')
-rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyMCInstLower.cpp | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyMCInstLower.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyMCInstLower.cpp index fd09b74..27f13d9 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyMCInstLower.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyMCInstLower.cpp @@ -122,16 +122,31 @@ MCSymbol *WebAssemblyMCInstLower::GetExternalSymbolSymbol( MCOperand WebAssemblyMCInstLower::lowerSymbolOperand(const MachineOperand &MO, MCSymbol *Sym) const { - bool isGOT = MO.getTargetFlags() == WebAssemblyII::MO_GOT; - MCSymbolRefExpr::VariantKind Kind = - isGOT ? MCSymbolRefExpr::VK_GOT : MCSymbolRefExpr::VK_None; + MCSymbolRefExpr::VariantKind Kind = MCSymbolRefExpr::VK_None; + unsigned TargetFlags = MO.getTargetFlags(); + + switch (TargetFlags) { + case WebAssemblyII::MO_NO_FLAG: + break; + case WebAssemblyII::MO_GOT: + Kind = MCSymbolRefExpr::VK_GOT; + break; + case WebAssemblyII::MO_MEMORY_BASE_REL: + Kind = MCSymbolRefExpr::VK_WASM_MBREL; + break; + case WebAssemblyII::MO_TABLE_BASE_REL: + Kind = MCSymbolRefExpr::VK_WASM_TBREL; + break; + default: + llvm_unreachable("Unknown target flag on GV operand"); + } + const MCExpr *Expr = MCSymbolRefExpr::create(Sym, Kind, Ctx); if (MO.getOffset() != 0) { const auto *WasmSym = cast<MCSymbolWasm>(Sym); - if (isGOT) + if (TargetFlags == WebAssemblyII::MO_GOT) report_fatal_error("GOT symbol references do not support offsets"); - if (WasmSym->isFunction()) report_fatal_error("Function addresses with offsets not supported"); if (WasmSym->isGlobal()) @@ -217,7 +232,7 @@ void WebAssemblyMCInstLower::lower(const MachineInstr *MI, WasmSym->setType(wasm::WASM_SYMBOL_TYPE_FUNCTION); const MCExpr *Expr = MCSymbolRefExpr::create( - WasmSym, MCSymbolRefExpr::VK_WebAssembly_TYPEINDEX, Ctx); + WasmSym, MCSymbolRefExpr::VK_WASM_TYPEINDEX, Ctx); MCOp = MCOperand::createExpr(Expr); break; } |