mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
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
This commit is contained in:
parent
c3b0266a77
commit
bd023b8ebe
@ -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;
|
||||
}
|
||||
|
@ -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() {
|
||||
|
Loading…
Reference in New Issue
Block a user