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