summaryrefslogtreecommitdiff
path: root/contrib/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyWasmObjectWriter.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2019-12-20 19:53:05 +0000
committerDimitry Andric <dim@FreeBSD.org>2019-12-20 19:53:05 +0000
commit0b57cec536236d46e3dba9bd041533462f33dbb7 (patch)
tree56229dbdbbf76d18580f72f789003db17246c8d9 /contrib/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyWasmObjectWriter.cpp
parent718ef55ec7785aae63f98f8ca05dc07ed399c16d (diff)
Notes
Diffstat (limited to 'contrib/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyWasmObjectWriter.cpp')
-rw-r--r--contrib/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyWasmObjectWriter.cpp121
1 files changed, 0 insertions, 121 deletions
diff --git a/contrib/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyWasmObjectWriter.cpp b/contrib/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyWasmObjectWriter.cpp
deleted file mode 100644
index a1cc3e268e8f..000000000000
--- a/contrib/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyWasmObjectWriter.cpp
+++ /dev/null
@@ -1,121 +0,0 @@
-//===-- WebAssemblyWasmObjectWriter.cpp - WebAssembly Wasm Writer ---------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// This file handles Wasm-specific object emission, converting LLVM's
-/// internal fixups into the appropriate relocations.
-///
-//===----------------------------------------------------------------------===//
-
-#include "MCTargetDesc/WebAssemblyFixupKinds.h"
-#include "MCTargetDesc/WebAssemblyMCTargetDesc.h"
-#include "llvm/BinaryFormat/Wasm.h"
-#include "llvm/MC/MCAsmBackend.h"
-#include "llvm/MC/MCFixup.h"
-#include "llvm/MC/MCFixupKindInfo.h"
-#include "llvm/MC/MCObjectWriter.h"
-#include "llvm/MC/MCSectionWasm.h"
-#include "llvm/MC/MCSymbolWasm.h"
-#include "llvm/MC/MCValue.h"
-#include "llvm/MC/MCWasmObjectWriter.h"
-#include "llvm/Support/Casting.h"
-#include "llvm/Support/ErrorHandling.h"
-
-using namespace llvm;
-
-namespace {
-class WebAssemblyWasmObjectWriter final : public MCWasmObjectTargetWriter {
-public:
- explicit WebAssemblyWasmObjectWriter(bool Is64Bit);
-
-private:
- unsigned getRelocType(const MCValue &Target,
- const MCFixup &Fixup) const override;
-};
-} // end anonymous namespace
-
-WebAssemblyWasmObjectWriter::WebAssemblyWasmObjectWriter(bool Is64Bit)
- : MCWasmObjectTargetWriter(Is64Bit) {}
-
-static const MCSection *getFixupSection(const MCExpr *Expr) {
- if (auto SyExp = dyn_cast<MCSymbolRefExpr>(Expr)) {
- if (SyExp->getSymbol().isInSection())
- return &SyExp->getSymbol().getSection();
- return nullptr;
- }
-
- if (auto BinOp = dyn_cast<MCBinaryExpr>(Expr)) {
- auto SectionLHS = getFixupSection(BinOp->getLHS());
- auto SectionRHS = getFixupSection(BinOp->getRHS());
- return SectionLHS == SectionRHS ? nullptr : SectionLHS;
- }
-
- if (auto UnOp = dyn_cast<MCUnaryExpr>(Expr))
- return getFixupSection(UnOp->getSubExpr());
-
- return nullptr;
-}
-
-unsigned WebAssemblyWasmObjectWriter::getRelocType(const MCValue &Target,
- const MCFixup &Fixup) const {
- const MCSymbolRefExpr *RefA = Target.getSymA();
- assert(RefA);
- auto& SymA = cast<MCSymbolWasm>(RefA->getSymbol());
-
- MCSymbolRefExpr::VariantKind Modifier = Target.getAccessVariant();
-
- switch (Modifier) {
- case MCSymbolRefExpr::VK_GOT:
- return wasm::R_WASM_GLOBAL_INDEX_LEB;
- case MCSymbolRefExpr::VK_WASM_TBREL:
- assert(SymA.isFunction());
- return wasm::R_WASM_TABLE_INDEX_REL_SLEB;
- case MCSymbolRefExpr::VK_WASM_MBREL:
- assert(SymA.isData());
- return wasm::R_WASM_MEMORY_ADDR_REL_SLEB;
- case MCSymbolRefExpr::VK_WASM_TYPEINDEX:
- return wasm::R_WASM_TYPE_INDEX_LEB;
- default:
- break;
- }
-
- switch (unsigned(Fixup.getKind())) {
- case WebAssembly::fixup_sleb128_i32:
- if (SymA.isFunction())
- return wasm::R_WASM_TABLE_INDEX_SLEB;
- return wasm::R_WASM_MEMORY_ADDR_SLEB;
- case WebAssembly::fixup_sleb128_i64:
- llvm_unreachable("fixup_sleb128_i64 not implemented yet");
- case WebAssembly::fixup_uleb128_i32:
- if (SymA.isGlobal())
- return wasm::R_WASM_GLOBAL_INDEX_LEB;
- if (SymA.isFunction())
- return wasm::R_WASM_FUNCTION_INDEX_LEB;
- if (SymA.isEvent())
- return wasm::R_WASM_EVENT_INDEX_LEB;
- return wasm::R_WASM_MEMORY_ADDR_LEB;
- case FK_Data_4:
- if (SymA.isFunction())
- return wasm::R_WASM_TABLE_INDEX_I32;
- if (auto Section = static_cast<const MCSectionWasm *>(
- getFixupSection(Fixup.getValue()))) {
- if (Section->getKind().isText())
- return wasm::R_WASM_FUNCTION_OFFSET_I32;
- else if (!Section->isWasmData())
- return wasm::R_WASM_SECTION_OFFSET_I32;
- }
- return wasm::R_WASM_MEMORY_ADDR_I32;
- default:
- llvm_unreachable("unimplemented fixup kind");
- }
-}
-
-std::unique_ptr<MCObjectTargetWriter>
-llvm::createWebAssemblyWasmObjectWriter(bool Is64Bit) {
- return llvm::make_unique<WebAssemblyWasmObjectWriter>(Is64Bit);
-}