diff options
| author | Ed Schouten <ed@FreeBSD.org> | 2009-06-14 09:23:33 +0000 | 
|---|---|---|
| committer | Ed Schouten <ed@FreeBSD.org> | 2009-06-14 09:23:33 +0000 | 
| commit | 600c6fa13de5c407dc36dbb0ab73807868741ae0 (patch) | |
| tree | 49817b316c4fdaa56d9d16ebf2555303d1a990e0 /lib/CodeGen/ELFWriter.h | |
| parent | 93338c197185f946619794ce011ec27b5b6250e2 (diff) | |
Notes
Diffstat (limited to 'lib/CodeGen/ELFWriter.h')
| -rw-r--r-- | lib/CodeGen/ELFWriter.h | 61 | 
1 files changed, 44 insertions, 17 deletions
| diff --git a/lib/CodeGen/ELFWriter.h b/lib/CodeGen/ELFWriter.h index 14a44f0240bff..8a380f0340103 100644 --- a/lib/CodeGen/ELFWriter.h +++ b/lib/CodeGen/ELFWriter.h @@ -16,15 +16,20 @@  #include "llvm/ADT/SetVector.h"  #include "llvm/CodeGen/MachineFunctionPass.h" +#include "llvm/Support/OutputBuffer.h" +#include "llvm/Target/TargetAsmInfo.h" +#include "llvm/Target/TargetELFWriterInfo.h"  #include "ELF.h"  #include <list>  #include <map>  namespace llvm { +  class BinaryObject; +  class ConstantStruct; +  class ELFCodeEmitter;    class GlobalVariable;    class Mangler;    class MachineCodeEmitter; -  class ELFCodeEmitter;    class raw_ostream;    /// ELFWriter - This class implements the common target-independent code for @@ -52,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; @@ -59,6 +67,10 @@ namespace llvm {      /// code for functions to the .o file.      ELFCodeEmitter *MCE; +    /// TAI - Target Asm Info, provide information about section names for +    /// globals and other target specific stuff. +    const TargetAsmInfo *TAI; +      //===------------------------------------------------------------------===//      // Properties inferred automatically from the target machine.      //===------------------------------------------------------------------===// @@ -77,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 @@ -97,17 +104,18 @@ namespace llvm {      /// getSection - Return the section with the specified name, creating a new      /// section if one does not already exist. -    ELFSection &getSection(const std::string &Name, -                           unsigned Type, unsigned Flags = 0) { +    ELFSection &getSection(const std::string &Name, unsigned Type,  +                           unsigned Flags = 0, unsigned Align = 0) {        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;        SN->Flags = Flags;        SN->Link = ELFSection::SHN_UNDEF; +      SN->Align = Align;        return *SN;      } @@ -116,23 +124,36 @@ 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); +    } + +    ELFSection &getStringTableSection() { +      return getSection(".strtab", ELFSection::SHT_STRTAB, 0, 1); +    } +      ELFSection &getDataSection() {        return getSection(".data", ELFSection::SHT_PROGBITS,                          ELFSection::SHF_WRITE | ELFSection::SHF_ALLOC);      } +      ELFSection &getBSSSection() {        return getSection(".bss", ELFSection::SHT_NOBITS,                          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 @@ -142,11 +163,17 @@ 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 EmitSymbolTable(); +    void EmitGlobalConstant(const Constant *C, ELFSection &GblS); +    void EmitGlobalConstantStruct(const ConstantStruct *CVS, +                                  ELFSection &GblS);      void EmitRelocations(); +    void EmitSectionHeader(BinaryObject &SHdrTab, const ELFSection &SHdr);      void EmitSectionTableStringTable(); +    void EmitSymbol(BinaryObject &SymbolTable, ELFSym &Sym); +    void EmitSymbolTable();      void OutputSectionsAndSectionTable();    };  } | 
