Home | History | Annotate | Download | only in MCTargetDesc
      1 //===-- LanaiELFObjectWriter.cpp - Lanai 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 #include "MCTargetDesc/LanaiBaseInfo.h"
     11 #include "MCTargetDesc/LanaiFixupKinds.h"
     12 #include "MCTargetDesc/LanaiMCTargetDesc.h"
     13 #include "llvm/MC/MCELFObjectWriter.h"
     14 #include "llvm/MC/MCSymbol.h"
     15 #include "llvm/Support/ErrorHandling.h"
     16 #include "llvm/Support/raw_ostream.h"
     17 
     18 using namespace llvm;
     19 
     20 namespace {
     21 class LanaiELFObjectWriter : public MCELFObjectTargetWriter {
     22 public:
     23   explicit LanaiELFObjectWriter(uint8_t OSABI);
     24 
     25   ~LanaiELFObjectWriter() override;
     26 
     27 protected:
     28   unsigned getRelocType(MCContext &Ctx, const MCValue &Target,
     29                         const MCFixup &Fixup, bool IsPCRel) const override;
     30   bool needsRelocateWithSymbol(const MCSymbol &SD,
     31                                unsigned Type) const override;
     32 };
     33 } // namespace
     34 
     35 LanaiELFObjectWriter::LanaiELFObjectWriter(uint8_t OSABI)
     36     : MCELFObjectTargetWriter(/*Is64Bit=*/false, OSABI, ELF::EM_LANAI,
     37                               /*HasRelocationAddend=*/true) {}
     38 
     39 LanaiELFObjectWriter::~LanaiELFObjectWriter() {}
     40 
     41 unsigned LanaiELFObjectWriter::getRelocType(MCContext &Ctx,
     42                                             const MCValue &Target,
     43                                             const MCFixup &Fixup,
     44                                             bool IsPCRel) const {
     45   unsigned Type;
     46   unsigned Kind = static_cast<unsigned>(Fixup.getKind());
     47   switch (Kind) {
     48   case Lanai::FIXUP_LANAI_21:
     49     Type = ELF::R_LANAI_21;
     50     break;
     51   case Lanai::FIXUP_LANAI_21_F:
     52     Type = ELF::R_LANAI_21_F;
     53     break;
     54   case Lanai::FIXUP_LANAI_25:
     55     Type = ELF::R_LANAI_25;
     56     break;
     57   case Lanai::FIXUP_LANAI_32:
     58   case FK_Data_4:
     59     Type = ELF::R_LANAI_32;
     60     break;
     61   case Lanai::FIXUP_LANAI_HI16:
     62     Type = ELF::R_LANAI_HI16;
     63     break;
     64   case Lanai::FIXUP_LANAI_LO16:
     65     Type = ELF::R_LANAI_LO16;
     66     break;
     67   case Lanai::FIXUP_LANAI_NONE:
     68     Type = ELF::R_LANAI_NONE;
     69     break;
     70 
     71   default:
     72     llvm_unreachable("Invalid fixup kind!");
     73   }
     74   return Type;
     75 }
     76 
     77 bool LanaiELFObjectWriter::needsRelocateWithSymbol(const MCSymbol &SD,
     78                                                    unsigned Type) const {
     79   switch (Type) {
     80   case ELF::R_LANAI_21:
     81   case ELF::R_LANAI_21_F:
     82   case ELF::R_LANAI_25:
     83   case ELF::R_LANAI_32:
     84   case ELF::R_LANAI_HI16:
     85     return true;
     86   default:
     87     return false;
     88   }
     89 }
     90 
     91 MCObjectWriter *llvm::createLanaiELFObjectWriter(raw_pwrite_stream &OS,
     92                                                  uint8_t OSABI) {
     93   MCELFObjectTargetWriter *MOTW = new LanaiELFObjectWriter(OSABI);
     94   return createELFObjectWriter(MOTW, OS, /*IsLittleEndian=*/false);
     95 }
     96