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