1*9880d681SAndroid Build Coastguard Worker //===-- BPFELFObjectWriter.cpp - BPF ELF Writer ---------------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker #include "MCTargetDesc/BPFMCTargetDesc.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCELFObjectWriter.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCFixup.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h"
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker using namespace llvm;
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker namespace {
18*9880d681SAndroid Build Coastguard Worker class BPFELFObjectWriter : public MCELFObjectTargetWriter {
19*9880d681SAndroid Build Coastguard Worker public:
20*9880d681SAndroid Build Coastguard Worker BPFELFObjectWriter(uint8_t OSABI);
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker ~BPFELFObjectWriter() override;
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker protected:
25*9880d681SAndroid Build Coastguard Worker unsigned getRelocType(MCContext &Ctx, const MCValue &Target,
26*9880d681SAndroid Build Coastguard Worker const MCFixup &Fixup, bool IsPCRel) const override;
27*9880d681SAndroid Build Coastguard Worker };
28*9880d681SAndroid Build Coastguard Worker }
29*9880d681SAndroid Build Coastguard Worker
BPFELFObjectWriter(uint8_t OSABI)30*9880d681SAndroid Build Coastguard Worker BPFELFObjectWriter::BPFELFObjectWriter(uint8_t OSABI)
31*9880d681SAndroid Build Coastguard Worker : MCELFObjectTargetWriter(/*Is64Bit*/ true, OSABI, ELF::EM_NONE,
32*9880d681SAndroid Build Coastguard Worker /*HasRelocationAddend*/ false) {}
33*9880d681SAndroid Build Coastguard Worker
~BPFELFObjectWriter()34*9880d681SAndroid Build Coastguard Worker BPFELFObjectWriter::~BPFELFObjectWriter() {}
35*9880d681SAndroid Build Coastguard Worker
getRelocType(MCContext & Ctx,const MCValue & Target,const MCFixup & Fixup,bool IsPCRel) const36*9880d681SAndroid Build Coastguard Worker unsigned BPFELFObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target,
37*9880d681SAndroid Build Coastguard Worker const MCFixup &Fixup,
38*9880d681SAndroid Build Coastguard Worker bool IsPCRel) const {
39*9880d681SAndroid Build Coastguard Worker // determine the type of the relocation
40*9880d681SAndroid Build Coastguard Worker switch ((unsigned)Fixup.getKind()) {
41*9880d681SAndroid Build Coastguard Worker default:
42*9880d681SAndroid Build Coastguard Worker llvm_unreachable("invalid fixup kind!");
43*9880d681SAndroid Build Coastguard Worker case FK_SecRel_8:
44*9880d681SAndroid Build Coastguard Worker return ELF::R_X86_64_64;
45*9880d681SAndroid Build Coastguard Worker case FK_SecRel_4:
46*9880d681SAndroid Build Coastguard Worker return ELF::R_X86_64_PC32;
47*9880d681SAndroid Build Coastguard Worker case FK_Data_8:
48*9880d681SAndroid Build Coastguard Worker return IsPCRel ? ELF::R_X86_64_PC64 : ELF::R_X86_64_64;
49*9880d681SAndroid Build Coastguard Worker case FK_Data_4:
50*9880d681SAndroid Build Coastguard Worker return IsPCRel ? ELF::R_X86_64_PC32 : ELF::R_X86_64_32;
51*9880d681SAndroid Build Coastguard Worker }
52*9880d681SAndroid Build Coastguard Worker }
53*9880d681SAndroid Build Coastguard Worker
createBPFELFObjectWriter(raw_pwrite_stream & OS,uint8_t OSABI,bool IsLittleEndian)54*9880d681SAndroid Build Coastguard Worker MCObjectWriter *llvm::createBPFELFObjectWriter(raw_pwrite_stream &OS,
55*9880d681SAndroid Build Coastguard Worker uint8_t OSABI, bool IsLittleEndian) {
56*9880d681SAndroid Build Coastguard Worker MCELFObjectTargetWriter *MOTW = new BPFELFObjectWriter(OSABI);
57*9880d681SAndroid Build Coastguard Worker return createELFObjectWriter(MOTW, OS, IsLittleEndian);
58*9880d681SAndroid Build Coastguard Worker }
59