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