diff options
author | Bill Wendling <isanbard@gmail.com> | 2007-01-17 03:49:21 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2007-01-17 03:49:21 +0000 |
commit | 157c4eeb4d81140ce8c4dbff630828546d62d599 (patch) | |
tree | ffed2f970ebed6896774738dd7a4f30b89c3a863 /lib/CodeGen/ELFWriter.cpp | |
parent | 3007f7a30e2202ea93de6f1e5f8c4a8914b43bd9 (diff) |
Use the methods in the TargetObjInfo object instead of internal methods.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33289 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/ELFWriter.cpp')
-rw-r--r-- | lib/CodeGen/ELFWriter.cpp | 116 |
1 files changed, 66 insertions, 50 deletions
diff --git a/lib/CodeGen/ELFWriter.cpp b/lib/CodeGen/ELFWriter.cpp index ee9cecd579..0beda80ca1 100644 --- a/lib/CodeGen/ELFWriter.cpp +++ b/lib/CodeGen/ELFWriter.cpp @@ -37,6 +37,7 @@ #include "llvm/CodeGen/MachineConstantPool.h" #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetMachine.h" +#include "llvm/Target/TargetObjInfo.h" #include "llvm/Support/Mangler.h" #include "llvm/Support/Streams.h" using namespace llvm; @@ -53,8 +54,20 @@ namespace llvm { ELFWriter::ELFSection *ES; // Section to write to. std::vector<unsigned char> *OutBuffer; size_t FnStart; + + /// Target machine description. + /// + TargetMachine &TM; + + /// Target object writer info. + /// + const TargetObjInfo *TOI; public: - ELFCodeEmitter(ELFWriter &ew) : EW(ew), OutBuffer(0) {} + ELFCodeEmitter(ELFWriter &ew, TargetMachine &tm) + : EW(ew), OutBuffer(0), TM(tm) { + // Create the target object info object for this target. + TOI = TM.getTargetObjInfo(); + } void startFunction(MachineFunction &F); bool finishFunction(MachineFunction &F); @@ -113,7 +126,7 @@ void ELFCodeEmitter::startFunction(MachineFunction &F) { // Add padding zeros to the end of the buffer to make sure that the // function will start on the correct byte alignment within the section. - ELFWriter::align(*OutBuffer, Align); + TOI->align(*OutBuffer, Align); FnStart = OutBuffer->size(); } @@ -165,8 +178,11 @@ ELFWriter::ELFWriter(std::ostream &o, TargetMachine &tm) : O(o), TM(tm) { isLittleEndian = TM.getTargetData()->isLittleEndian(); // Create the machine code emitter object for this target. - MCE = new ELFCodeEmitter(*this); + MCE = new ELFCodeEmitter(*this, TM); NumSections = 0; + + // Create the target object info object for this target. + TOI = TM.getTargetObjInfo(); } ELFWriter::~ELFWriter() { @@ -181,36 +197,36 @@ bool ELFWriter::doInitialization(Module &M) { // Local alias to shortenify coming code. std::vector<unsigned char> &FH = FileHeader; - outbyte(FH, 0x7F); // EI_MAG0 - outbyte(FH, 'E'); // EI_MAG1 - outbyte(FH, 'L'); // EI_MAG2 - outbyte(FH, 'F'); // EI_MAG3 - outbyte(FH, is64Bit ? 2 : 1); // EI_CLASS - outbyte(FH, isLittleEndian ? 1 : 2); // EI_DATA - outbyte(FH, 1); // EI_VERSION - FH.resize(16); // EI_PAD up to 16 bytes. + TOI->outbyte(FH, 0x7F); // EI_MAG0 + TOI->outbyte(FH, 'E'); // EI_MAG1 + TOI->outbyte(FH, 'L'); // EI_MAG2 + TOI->outbyte(FH, 'F'); // EI_MAG3 + TOI->outbyte(FH, is64Bit ? 2 : 1); // EI_CLASS + TOI->outbyte(FH, isLittleEndian ? 1 : 2); // EI_DATA + TOI->outbyte(FH, 1); // EI_VERSION + FH.resize(16); // EI_PAD up to 16 bytes. // This should change for shared objects. - outhalf(FH, 1); // e_type = ET_REL - outhalf(FH, e_machine); // e_machine = whatever the target wants - outword(FH, 1); // e_version = 1 - outaddr(FH, 0); // e_entry = 0 -> no entry point in .o file - outaddr(FH, 0); // e_phoff = 0 -> no program header for .o + TOI->outhalf(FH, 1); // e_type = ET_REL + TOI->outhalf(FH, e_machine); // e_machine = whatever the target wants + TOI->outword(FH, 1); // e_version = 1 + TOI->outaddr(FH, 0); // e_entry = 0 -> no entry point in .o file + TOI->outaddr(FH, 0); // e_phoff = 0 -> no program header for .o ELFHeader_e_shoff_Offset = FH.size(); - outaddr(FH, 0); // e_shoff - outword(FH, e_flags); // e_flags = whatever the target wants + TOI->outaddr(FH, 0); // e_shoff + TOI->outword(FH, e_flags); // e_flags = whatever the target wants - outhalf(FH, is64Bit ? 64 : 52); // e_ehsize = ELF header size - outhalf(FH, 0); // e_phentsize = prog header entry size - outhalf(FH, 0); // e_phnum = # prog header entries = 0 - outhalf(FH, is64Bit ? 64 : 40); // e_shentsize = sect hdr entry size + TOI->outhalf(FH, is64Bit ? 64 : 52); // e_ehsize = ELF header size + TOI->outhalf(FH, 0); // e_phentsize = prog header entry size + TOI->outhalf(FH, 0); // e_phnum = # prog header entries=0 + TOI->outhalf(FH, is64Bit ? 64 : 40); // e_shentsize = sect hdr entry size ELFHeader_e_shnum_Offset = FH.size(); - outhalf(FH, 0); // e_shnum = # of section header ents + TOI->outhalf(FH, 0); // e_shnum = # of section header ents ELFHeader_e_shstrndx_Offset = FH.size(); - outhalf(FH, 0); // e_shstrndx = Section # of '.shstrtab' + TOI->outhalf(FH, 0); // e_shstrndx = Section # of '.shstrtab' // Add the null section, which is required to be first in the file. getSection("", 0, 0); @@ -352,7 +368,7 @@ void ELFWriter::EmitSymbolTable() { DataBuffer &StrTabBuf = StrTab.SectionData; // Set the zero'th symbol to a null byte, as required. - outbyte(StrTabBuf, 0); + TOI->outbyte(StrTabBuf, 0); SymbolTable[0].NameIdx = 0; unsigned Index = 1; for (unsigned i = 1, e = SymbolTable.size(); i != e; ++i) { @@ -389,22 +405,22 @@ void ELFWriter::EmitSymbolTable() { if (!is64Bit) { // 32-bit and 64-bit formats are shuffled a bit. for (unsigned i = 0, e = SymbolTable.size(); i != e; ++i) { ELFSym &Sym = SymbolTable[i]; - outword(SymTabBuf, Sym.NameIdx); - outaddr32(SymTabBuf, Sym.Value); - outword(SymTabBuf, Sym.Size); - outbyte(SymTabBuf, Sym.Info); - outbyte(SymTabBuf, Sym.Other); - outhalf(SymTabBuf, Sym.SectionIdx); + TOI->outword(SymTabBuf, Sym.NameIdx); + TOI->outaddr32(SymTabBuf, Sym.Value); + TOI->outword(SymTabBuf, Sym.Size); + TOI->outbyte(SymTabBuf, Sym.Info); + TOI->outbyte(SymTabBuf, Sym.Other); + TOI->outhalf(SymTabBuf, Sym.SectionIdx); } } else { for (unsigned i = 0, e = SymbolTable.size(); i != e; ++i) { ELFSym &Sym = SymbolTable[i]; - outword(SymTabBuf, Sym.NameIdx); - outbyte(SymTabBuf, Sym.Info); - outbyte(SymTabBuf, Sym.Other); - outhalf(SymTabBuf, Sym.SectionIdx); - outaddr64(SymTabBuf, Sym.Value); - outxword(SymTabBuf, Sym.Size); + TOI->outword(SymTabBuf, Sym.NameIdx); + TOI->outbyte(SymTabBuf, Sym.Info); + TOI->outbyte(SymTabBuf, Sym.Other); + TOI->outhalf(SymTabBuf, Sym.SectionIdx); + TOI->outaddr64(SymTabBuf, Sym.Value); + TOI->outxword(SymTabBuf, Sym.Size); } } @@ -420,7 +436,7 @@ void ELFWriter::EmitSectionTableStringTable() { // Now that we know which section number is the .shstrtab section, update the // e_shstrndx entry in the ELF header. - fixhalf(FileHeader, SHStrTab.SectionIdx, ELFHeader_e_shstrndx_Offset); + TOI->fixhalf(FileHeader, SHStrTab.SectionIdx, ELFHeader_e_shstrndx_Offset); // Set the NameIdx of each section in the string table and emit the bytes for // the string table. @@ -471,11 +487,11 @@ void ELFWriter::OutputSectionsAndSectionTable() { // Now that we know where all of the sections will be emitted, set the e_shnum // entry in the ELF header. - fixhalf(FileHeader, NumSections, ELFHeader_e_shnum_Offset); + TOI->fixhalf(FileHeader, NumSections, ELFHeader_e_shnum_Offset); // Now that we know the offset in the file of the section table, update the // e_shoff address in the ELF header. - fixaddr(FileHeader, FileOff, ELFHeader_e_shoff_Offset); + TOI->fixaddr(FileHeader, FileOff, ELFHeader_e_shoff_Offset); // Now that we know all of the data in the file header, emit it and all of the // sections! @@ -497,16 +513,16 @@ void ELFWriter::OutputSectionsAndSectionTable() { O.write((char*)&S.SectionData[0], S.SectionData.size()); FileOff += S.SectionData.size(); - outword(Table, S.NameIdx); // sh_name - Symbol table name idx - outword(Table, S.Type); // sh_type - Section contents & semantics - outword(Table, S.Flags); // sh_flags - Section flags. - outaddr(Table, S.Addr); // sh_addr - The mem addr this section is in. - outaddr(Table, S.Offset); // sh_offset - Offset from the file start. - outword(Table, S.Size); // sh_size - The section size. - outword(Table, S.Link); // sh_link - Section header table index link. - outword(Table, S.Info); // sh_info - Auxillary information. - outword(Table, S.Align); // sh_addralign - Alignment of section. - outword(Table, S.EntSize); // sh_entsize - Size of entries in the section. + TOI->outword(Table, S.NameIdx); // sh_name - Symbol table name idx + TOI->outword(Table, S.Type); // sh_type - Section contents & semantics + TOI->outword(Table, S.Flags); // sh_flags - Section flags + TOI->outaddr(Table, S.Addr); // sh_addr - The mem addr this section is in + TOI->outaddr(Table, S.Offset); // sh_offset - Offset from the file start + TOI->outword(Table, S.Size); // sh_size - The section size + TOI->outword(Table, S.Link); // sh_link - Section header table index link + TOI->outword(Table, S.Info); // sh_info - Auxillary information + TOI->outword(Table, S.Align); // sh_addralign - Alignment of section + TOI->outword(Table, S.EntSize); // sh_entsize - Size of entries in the sect SectionList.pop_front(); } |