BPFELFObjectWriter.cpp revision 288943
1214501Srpaulo//===-- BPFELFObjectWriter.cpp - BPF ELF Writer ---------------------------===//
2214501Srpaulo//
3214501Srpaulo//                     The LLVM Compiler Infrastructure
4214501Srpaulo//
5214501Srpaulo// This file is distributed under the University of Illinois Open Source
6214501Srpaulo// License. See LICENSE.TXT for details.
7214501Srpaulo//
8214501Srpaulo//===----------------------------------------------------------------------===//
9214501Srpaulo
10214501Srpaulo#include "MCTargetDesc/BPFMCTargetDesc.h"
11214501Srpaulo#include "llvm/MC/MCELFObjectWriter.h"
12214501Srpaulo#include "llvm/MC/MCFixup.h"
13214501Srpaulo#include "llvm/Support/ErrorHandling.h"
14214501Srpaulo
15214501Srpaulousing namespace llvm;
16214501Srpaulo
17214501Srpaulonamespace {
18214501Srpauloclass BPFELFObjectWriter : public MCELFObjectTargetWriter {
19214501Srpaulopublic:
20214501Srpaulo  BPFELFObjectWriter(uint8_t OSABI);
21214501Srpaulo
22214501Srpaulo  ~BPFELFObjectWriter() override;
23214501Srpaulo
24214501Srpauloprotected:
25214501Srpaulo  unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup,
26214501Srpaulo                        bool IsPCRel) const override;
27214501Srpaulo};
28214501Srpaulo}
29214501Srpaulo
30214501SrpauloBPFELFObjectWriter::BPFELFObjectWriter(uint8_t OSABI)
31214501Srpaulo    : MCELFObjectTargetWriter(/*Is64Bit*/ true, OSABI, ELF::EM_NONE,
32214501Srpaulo                              /*HasRelocationAddend*/ false) {}
33214501Srpaulo
34214501SrpauloBPFELFObjectWriter::~BPFELFObjectWriter() {}
35214501Srpaulo
36214501Srpaulounsigned BPFELFObjectWriter::GetRelocType(const MCValue &Target,
37214501Srpaulo                                          const MCFixup &Fixup,
38214501Srpaulo                                          bool IsPCRel) const {
39214501Srpaulo  // determine the type of the relocation
40214501Srpaulo  switch ((unsigned)Fixup.getKind()) {
41214501Srpaulo  default:
42214501Srpaulo    llvm_unreachable("invalid fixup kind!");
43214501Srpaulo  case FK_SecRel_8:
44214501Srpaulo    return ELF::R_X86_64_64;
45214501Srpaulo  case FK_SecRel_4:
46214501Srpaulo    return ELF::R_X86_64_PC32;
47214501Srpaulo  }
48214501Srpaulo}
49214501Srpaulo
50214501SrpauloMCObjectWriter *llvm::createBPFELFObjectWriter(raw_pwrite_stream &OS,
51214501Srpaulo                                               uint8_t OSABI, bool IsLittleEndian) {
52214501Srpaulo  MCELFObjectTargetWriter *MOTW = new BPFELFObjectWriter(OSABI);
53214501Srpaulo  return createELFObjectWriter(MOTW, OS, IsLittleEndian);
54214501Srpaulo}
55214501Srpaulo