blob: 22ab156b94030008b0a647d1b673761bae6dbcf3 [file] [log] [blame]
Alexei Starovoitove4c8c802015-01-24 17:51:26 +00001//===-- BPFELFObjectWriter.cpp - BPF 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/BPFMCTargetDesc.h"
Zachary Turner264b5d92017-06-07 03:48:56 +000011#include "llvm/BinaryFormat/ELF.h"
Alexei Starovoitove4c8c802015-01-24 17:51:26 +000012#include "llvm/MC/MCELFObjectWriter.h"
13#include "llvm/MC/MCFixup.h"
14#include "llvm/Support/ErrorHandling.h"
Eugene Zelenko4282c402017-01-06 23:06:25 +000015#include <cstdint>
Alexei Starovoitove4c8c802015-01-24 17:51:26 +000016
17using namespace llvm;
18
19namespace {
Eugene Zelenko4282c402017-01-06 23:06:25 +000020
Alexei Starovoitove4c8c802015-01-24 17:51:26 +000021class BPFELFObjectWriter : public MCELFObjectTargetWriter {
22public:
23 BPFELFObjectWriter(uint8_t OSABI);
Eugene Zelenko4282c402017-01-06 23:06:25 +000024 ~BPFELFObjectWriter() override = default;
Alexei Starovoitove4c8c802015-01-24 17:51:26 +000025
26protected:
Rafael Espindola8340f942016-01-13 22:56:57 +000027 unsigned getRelocType(MCContext &Ctx, const MCValue &Target,
28 const MCFixup &Fixup, bool IsPCRel) const override;
Alexei Starovoitove4c8c802015-01-24 17:51:26 +000029};
Eugene Zelenko4282c402017-01-06 23:06:25 +000030
31} // end anonymous namespace
Alexei Starovoitove4c8c802015-01-24 17:51:26 +000032
33BPFELFObjectWriter::BPFELFObjectWriter(uint8_t OSABI)
Alexei Starovoitovcfb51f52016-07-15 22:27:55 +000034 : MCELFObjectTargetWriter(/*Is64Bit*/ true, OSABI, ELF::EM_BPF,
Alexei Starovoitove4c8c802015-01-24 17:51:26 +000035 /*HasRelocationAddend*/ false) {}
36
Rafael Espindola8340f942016-01-13 22:56:57 +000037unsigned BPFELFObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target,
Alexei Starovoitove4c8c802015-01-24 17:51:26 +000038 const MCFixup &Fixup,
39 bool IsPCRel) const {
40 // determine the type of the relocation
41 switch ((unsigned)Fixup.getKind()) {
42 default:
43 llvm_unreachable("invalid fixup kind!");
44 case FK_SecRel_8:
Alexei Starovoitov7ab125d2016-11-21 06:21:23 +000045 return ELF::R_BPF_64_64;
Alexei Starovoitove4c8c802015-01-24 17:51:26 +000046 case FK_SecRel_4:
Alexei Starovoitov7ab125d2016-11-21 06:21:23 +000047 return ELF::R_BPF_64_32;
Alexei Starovoitov01886a02015-07-24 03:17:08 +000048 case FK_Data_8:
Alexei Starovoitov7ab125d2016-11-21 06:21:23 +000049 return ELF::R_BPF_64_64;
Alexei Starovoitov01886a02015-07-24 03:17:08 +000050 case FK_Data_4:
Alexei Starovoitov7ab125d2016-11-21 06:21:23 +000051 return ELF::R_BPF_64_32;
Alexei Starovoitove4c8c802015-01-24 17:51:26 +000052 }
53}
54
Alexei Starovoitov310dead2015-06-04 19:15:05 +000055MCObjectWriter *llvm::createBPFELFObjectWriter(raw_pwrite_stream &OS,
56 uint8_t OSABI, bool IsLittleEndian) {
Lang Hamesdcb312b2017-10-09 23:53:15 +000057 return createELFObjectWriter(llvm::make_unique<BPFELFObjectWriter>(OSABI), OS,
58 IsLittleEndian);
Alexei Starovoitove4c8c802015-01-24 17:51:26 +000059}