summaryrefslogtreecommitdiffstats
path: root/lib/CodeGen
diff options
context:
space:
mode:
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>2009-06-23 04:39:27 +0000
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>2009-06-23 04:39:27 +0000
commite39493eb1bb867f8c4e4cdb59952576b52201bbf (patch)
treed65fc13b99e4f184a1f7994d11bfd5650f8db840 /lib/CodeGen
parentbcd0b8d2ef63c8a3219bf1d93653279c2814281f (diff)
downloadexternal_llvm-e39493eb1bb867f8c4e4cdb59952576b52201bbf.zip
external_llvm-e39493eb1bb867f8c4e4cdb59952576b52201bbf.tar.gz
external_llvm-e39493eb1bb867f8c4e4cdb59952576b52201bbf.tar.bz2
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73944 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r--lib/CodeGen/ELFWriter.cpp36
-rw-r--r--lib/CodeGen/ELFWriter.h8
2 files changed, 25 insertions, 19 deletions
diff --git a/lib/CodeGen/ELFWriter.cpp b/lib/CodeGen/ELFWriter.cpp
index acdf3d5d..03db656 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 ae3939f..39577d9 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() {