From bd023b8ebe28c5cbd1baf1ff823ced98a032d32d Mon Sep 17 00:00:00 2001 From: Bruno Cardoso Lopes Date: Tue, 23 Jun 2009 04:39:27 +0000 Subject: [PATCH] Use a default alignment for data and bss sections. Only pad when the section size > 0 and move the code that deals with globals initializers to a place we know for sure the global is initialized. llvm-svn: 73944 --- lib/CodeGen/ELFWriter.cpp | 36 +++++++++++++++++++----------------- lib/CodeGen/ELFWriter.h | 8 ++++++-- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/lib/CodeGen/ELFWriter.cpp b/lib/CodeGen/ELFWriter.cpp index acdf3d5d56a..03db65699a2 100644 --- a/lib/CodeGen/ELFWriter.cpp +++ b/lib/CodeGen/ELFWriter.cpp @@ -159,10 +159,6 @@ ELFSection &ELFWriter::getGlobalSymELFSection(const GlobalVariable *GV, unsigned Flags = S->getFlags(); unsigned SectionType = ELFSection::SHT_PROGBITS; unsigned SHdrFlags = ELFSection::SHF_ALLOC; - const TargetData *TD = TM.getTargetData(); - unsigned Align = TD->getPreferredAlignment(GV); - Constant *CV = GV->getInitializer(); - DOUT << "Section " << S->getName() << " for global " << GV->getName() << "\n"; // If this is an external global, the symbol does not have a section. @@ -171,6 +167,10 @@ ELFSection &ELFWriter::getGlobalSymELFSection(const GlobalVariable *GV, return getNullSection(); } + const TargetData *TD = TM.getTargetData(); + unsigned Align = TD->getPreferredAlignment(GV); + Constant *CV = GV->getInitializer(); + if (Flags & SectionFlags::Code) SHdrFlags |= ELFSection::SHF_EXECINSTR; if (Flags & SectionFlags::Writeable) @@ -192,6 +192,7 @@ ELFSection &ELFWriter::getGlobalSymELFSection(const GlobalVariable *GV, GV->hasCommonLinkage()) { Sym.SectionIdx = ELFSection::SHN_COMMON; Sym.IsCommon = true; + ElfS.Align = 1; return ElfS; } Sym.IsBss = true; @@ -218,19 +219,21 @@ void ELFWriter::EmitFunctionDeclaration(const Function *F) { void ELFWriter::EmitGlobalVar(const GlobalVariable *GV) { unsigned SymBind = getGlobalELFLinkage(GV); + unsigned Align=0, Size=0; ELFSym GblSym(GV); GblSym.setBind(SymBind); - if (GV->hasInitializer()) + if (GV->hasInitializer()) { GblSym.setType(ELFSym::STT_OBJECT); - else + const TargetData *TD = TM.getTargetData(); + Align = TD->getPreferredAlignment(GV); + Size = TD->getTypeAllocSize(GV->getInitializer()->getType()); + GblSym.Size = Size; + } else { GblSym.setType(ELFSym::STT_NOTYPE); + } ELFSection &GblSection = getGlobalSymELFSection(GV, GblSym); - const TargetData *TD = TM.getTargetData(); - unsigned Align = TD->getPreferredAlignment(GV); - unsigned Size = TD->getTypeAllocSize(GV->getInitializer()->getType()); - GblSym.Size = Size; if (GblSym.IsCommon) { GblSym.Value = Align; @@ -598,7 +601,7 @@ void ELFWriter::EmitSymbolTable() { /// section names. void ELFWriter::EmitSectionTableStringTable() { // First step: add the section for the string table to the list of sections: - ELFSection &SHStrTab = getSection(".shstrtab", ELFSection::SHT_STRTAB, 0); + ELFSection &SHStrTab = getSectionHeaderStringTableSection(); // Now that we know which section number is the .shstrtab section, update the // e_shstrndx entry in the ELF header. @@ -684,13 +687,12 @@ void ELFWriter::OutputSectionsAndSectionTable() { << ", SectionData Size: " << S.size() << "\n"; // Align FileOff to whatever the alignment restrictions of the section are. - if (S.Align) { - for (size_t NewFileOff = (FileOff+S.Align-1) & ~(S.Align-1); - FileOff != NewFileOff; ++FileOff) - O << (char)0xAB; - } - if (S.size()) { + if (S.Align) { + for (size_t NewFileOff = (FileOff+S.Align-1) & ~(S.Align-1); + FileOff != NewFileOff; ++FileOff) + O << (char)0xAB; + } O.write((char *)&S.getData()[0], S.Size); FileOff += S.Size; } diff --git a/lib/CodeGen/ELFWriter.h b/lib/CodeGen/ELFWriter.h index ae3939f2040..39577d9a97d 100644 --- a/lib/CodeGen/ELFWriter.h +++ b/lib/CodeGen/ELFWriter.h @@ -171,14 +171,18 @@ namespace llvm { return getSection(".strtab", ELFSection::SHT_STRTAB, 0, 1); } + ELFSection &getSectionHeaderStringTableSection() { + return getSection(".shstrtab", ELFSection::SHT_STRTAB, 0, 1); + } + ELFSection &getDataSection() { return getSection(".data", ELFSection::SHT_PROGBITS, - ELFSection::SHF_WRITE | ELFSection::SHF_ALLOC); + ELFSection::SHF_WRITE | ELFSection::SHF_ALLOC, 4); } ELFSection &getBSSSection() { return getSection(".bss", ELFSection::SHT_NOBITS, - ELFSection::SHF_WRITE | ELFSection::SHF_ALLOC); + ELFSection::SHF_WRITE | ELFSection::SHF_ALLOC, 4); } ELFSection &getNullSection() {