1 //===-- lib/CodeGen/ELFCodeEmitter.h ----------------------------*- C++ -*-===// 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 #ifndef ELFCODEEMITTER_H 11 #define ELFCODEEMITTER_H 12 13 #include "llvm/CodeGen/ObjectCodeEmitter.h" 14 #include <vector> 15 16 namespace llvm { 17 class ELFWriter; 18 class ELFSection; 19 20 /// ELFCodeEmitter - This class is used by the ELFWriter to 21 /// emit the code for functions to the ELF file. 22 class ELFCodeEmitter : public ObjectCodeEmitter { 23 ELFWriter &EW; 24 25 /// Target machine description 26 TargetMachine &TM; 27 28 /// Section containing code for functions 29 ELFSection *ES; 30 31 /// Relocations - Record relocations needed by the current function 32 std::vector<MachineRelocation> Relocations; 33 34 /// JTRelocations - Record relocations needed by the relocation 35 /// section. 36 std::vector<MachineRelocation> JTRelocations; 37 38 /// FnStartPtr - Function offset from the beginning of ELFSection 'ES' 39 uintptr_t FnStartOff; 40 public: ELFCodeEmitter(ELFWriter & ew)41 explicit ELFCodeEmitter(ELFWriter &ew) : EW(ew), TM(EW.TM) {} 42 43 /// addRelocation - Register new relocations for this function addRelocation(const MachineRelocation & MR)44 void addRelocation(const MachineRelocation &MR) { 45 Relocations.push_back(MR); 46 } 47 48 /// emitConstantPool - For each constant pool entry, figure out which 49 /// section the constant should live in and emit data to it 50 void emitConstantPool(MachineConstantPool *MCP); 51 52 /// emitJumpTables - Emit all the jump tables for a given jump table 53 /// info and record them to the appropriate section. 54 void emitJumpTables(MachineJumpTableInfo *MJTI); 55 56 void startFunction(MachineFunction &F); 57 bool finishFunction(MachineFunction &F); 58 59 /// emitLabel - Emits a label emitLabel(MCSymbol * Label)60 virtual void emitLabel(MCSymbol *Label) { 61 assert(0 && "emitLabel not implemented"); 62 } 63 64 /// getLabelAddress - Return the address of the specified LabelID, 65 /// only usable after the LabelID has been emitted. getLabelAddress(MCSymbol * Label)66 virtual uintptr_t getLabelAddress(MCSymbol *Label) const { 67 assert(0 && "getLabelAddress not implemented"); 68 return 0; 69 } 70 setModuleInfo(llvm::MachineModuleInfo * MMI)71 virtual void setModuleInfo(llvm::MachineModuleInfo* MMI) {} 72 73 }; // end class ELFCodeEmitter 74 75 } // end namespace llvm 76 77 #endif 78 79