LCOV - code coverage report
Current view: top level - lib/Target/WebAssembly/MCTargetDesc - WebAssemblyELFObjectWriter.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 5 11 45.5 %
Date: 2018-07-13 00:08:38 Functions: 2 4 50.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===-- WebAssemblyELFObjectWriter.cpp - WebAssembly ELF Writer -----------===//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : ///
      10             : /// \file
      11             : /// This file handles ELF-specific object emission, converting LLVM's
      12             : /// internal fixups into the appropriate relocations.
      13             : ///
      14             : //===----------------------------------------------------------------------===//
      15             : 
      16             : #include "MCTargetDesc/WebAssemblyMCTargetDesc.h"
      17             : #include "llvm/MC/MCELFObjectWriter.h"
      18             : #include "llvm/MC/MCFixup.h"
      19             : #include "llvm/MC/MCObjectWriter.h"
      20             : #include "llvm/Support/ErrorHandling.h"
      21             : using namespace llvm;
      22             : 
      23             : namespace {
      24           1 : class WebAssemblyELFObjectWriter final : public MCELFObjectTargetWriter {
      25             : public:
      26             :   WebAssemblyELFObjectWriter(bool Is64Bit, uint8_t OSABI);
      27             : 
      28             : protected:
      29             :   unsigned getRelocType(MCContext &Ctx, const MCValue &Target,
      30             :                         const MCFixup &Fixup, bool IsPCRel) const override;
      31             : };
      32             : } // end anonymous namespace
      33             : 
      34             : WebAssemblyELFObjectWriter::WebAssemblyELFObjectWriter(bool Is64Bit,
      35           1 :                                                        uint8_t OSABI)
      36             :     : MCELFObjectTargetWriter(Is64Bit, OSABI, ELF::EM_WEBASSEMBLY,
      37           1 :                               /*HasRelocationAddend=*/false) {}
      38             : 
      39           0 : unsigned WebAssemblyELFObjectWriter::getRelocType(MCContext &Ctx,
      40             :                                                   const MCValue &Target,
      41             :                                                   const MCFixup &Fixup,
      42             :                                                   bool IsPCRel) const {
      43             :   // WebAssembly functions are not allocated in the address space. To resolve a
      44             :   // pointer to a function, we must use a special relocation type.
      45             :   if (const MCSymbolRefExpr *SyExp =
      46           0 :           dyn_cast<MCSymbolRefExpr>(Fixup.getValue()))
      47           0 :     if (SyExp->getKind() == MCSymbolRefExpr::VK_WebAssembly_FUNCTION)
      48             :       return ELF::R_WEBASSEMBLY_FUNCTION;
      49             : 
      50           0 :   switch (Fixup.getKind()) {
      51             :   case FK_Data_4:
      52             :     assert(!is64Bit() && "4-byte relocations only supported on wasm32");
      53             :     return ELF::R_WEBASSEMBLY_DATA;
      54             :   case FK_Data_8:
      55             :     assert(is64Bit() && "8-byte relocations only supported on wasm64");
      56             :     return ELF::R_WEBASSEMBLY_DATA;
      57           0 :   default:
      58           0 :     llvm_unreachable("unimplemented fixup kind");
      59             :   }
      60             : }
      61             : 
      62             : std::unique_ptr<MCObjectTargetWriter>
      63           1 : llvm::createWebAssemblyELFObjectWriter(bool Is64Bit, uint8_t OSABI) {
      64           2 :   return llvm::make_unique<WebAssemblyELFObjectWriter>(Is64Bit, OSABI);
      65             : }

Generated by: LCOV version 1.13