diff options
author | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2009-06-14 07:53:21 +0000 |
---|---|---|
committer | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2009-06-14 07:53:21 +0000 |
commit | fee73a317c4fe5fce68c9296bba2f4e103254524 (patch) | |
tree | 8ad5f1970cb6ca5f1b431b4a03bba33b06cb471e /lib/CodeGen/ELFWriter.h | |
parent | 95105024ed3806a7c67d6acd5be45934cb5276db (diff) | |
download | external_llvm-fee73a317c4fe5fce68c9296bba2f4e103254524.zip external_llvm-fee73a317c4fe5fce68c9296bba2f4e103254524.tar.gz external_llvm-fee73a317c4fe5fce68c9296bba2f4e103254524.tar.bz2 |
Introduce new BinaryObject (blob) class, ELF Writer modified to use it. BinaryObject.h by Aaron Gray
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73333 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/ELFWriter.h')
-rw-r--r-- | lib/CodeGen/ELFWriter.h | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/lib/CodeGen/ELFWriter.h b/lib/CodeGen/ELFWriter.h index 04918f7..8a380f0 100644 --- a/lib/CodeGen/ELFWriter.h +++ b/lib/CodeGen/ELFWriter.h @@ -24,6 +24,7 @@ #include <map> namespace llvm { + class BinaryObject; class ConstantStruct; class ELFCodeEmitter; class GlobalVariable; @@ -56,6 +57,9 @@ namespace llvm { /// Target machine description. TargetMachine &TM; + /// Target Elf Writer description. + const TargetELFWriterInfo *TEW; + /// Mang - The object used to perform name mangling for this module. Mangler *Mang; @@ -85,13 +89,8 @@ namespace llvm { bool doFinalization(Module &M); private: - // The buffer we accumulate the file header into. Note that this should be - // changed into something much more efficient later (and the bitcode writer - // as well!). - DataBuffer FileHeader; - - /// ElfHdr - Hold information about the ELF Header - ELFHeader *ElfHdr; + // Blob containing the Elf header + BinaryObject ElfHdr; /// SectionList - This is the list of sections that we have emitted to the /// file. Once the file has been completely built, the section header table @@ -110,7 +109,7 @@ namespace llvm { ELFSection *&SN = SectionLookup[Name]; if (SN) return *SN; - SectionList.push_back(Name); + SectionList.push_back(ELFSection(Name, isLittleEndian, is64Bit)); SN = &SectionList.back(); SN->SectionIdx = NumSections++; SN->Type = Type; @@ -125,6 +124,10 @@ namespace llvm { ELFSection::SHF_EXECINSTR | ELFSection::SHF_ALLOC); } + ELFSection &getNonExecStackSection() { + return getSection(".note.GNU-stack", ELFSection::SHT_PROGBITS, 0, 1); + } + ELFSection &getSymbolTableSection() { return getSection(".symtab", ELFSection::SHT_SYMTAB, 0); } @@ -143,14 +146,14 @@ namespace llvm { ELFSection::SHF_WRITE | ELFSection::SHF_ALLOC); } - /// SymbolTable - This is the list of symbols we have emitted to the file. + /// SymbolList - This is the list of symbols we have emitted to the file. /// This actually gets rearranged before emission to the file (to put the /// local symbols first in the list). - std::vector<ELFSym> SymbolTable; + std::vector<ELFSym> SymbolList; - /// PendingSyms - This is a list of externally defined symbols that we have - /// been asked to emit, but have not seen a reference to. When a reference - /// is seen, the symbol will move from this list to the SymbolTable. + /// PendingGlobals - List of externally defined symbols that we have been + /// asked to emit, but have not seen a reference to. When a reference + /// is seen, the symbol will move from this list to the SymbolList. SetVector<GlobalValue*> PendingGlobals; // As we complete the ELF file, we need to update fields in the ELF header @@ -160,15 +163,16 @@ namespace llvm { unsigned ELFHdr_e_shoff_Offset; // e_shoff in ELF header. unsigned ELFHdr_e_shstrndx_Offset; // e_shstrndx in ELF header. unsigned ELFHdr_e_shnum_Offset; // e_shnum in ELF header. + private: void EmitGlobal(GlobalVariable *GV); - void EmitGlobalConstant(const Constant *C, OutputBuffer &GblCstTab); + void EmitGlobalConstant(const Constant *C, ELFSection &GblS); void EmitGlobalConstantStruct(const ConstantStruct *CVS, - OutputBuffer &GblCstTab); + ELFSection &GblS); void EmitRelocations(); - void EmitSectionHeader(OutputBuffer &TableOut, const ELFSection &Section); + void EmitSectionHeader(BinaryObject &SHdrTab, const ELFSection &SHdr); void EmitSectionTableStringTable(); - void EmitSymbol(OutputBuffer &SymTabOut, ELFSym &Sym); + void EmitSymbol(BinaryObject &SymbolTable, ELFSym &Sym); void EmitSymbolTable(); void OutputSectionsAndSectionTable(); }; |