Index: src/IceELFObjectWriter.cpp |
diff --git a/src/IceELFObjectWriter.cpp b/src/IceELFObjectWriter.cpp |
index 26e76f01cbac80960f8fcac0542773fd57ffa862..2c065aff5923a39a033e98a406436b633124aa17 100644 |
--- a/src/IceELFObjectWriter.cpp |
+++ b/src/IceELFObjectWriter.cpp |
@@ -76,16 +76,16 @@ uint32_t getELFFlags(TargetArch Arch) { |
ELFObjectWriter::ELFObjectWriter(GlobalContext &Ctx, ELFStreamer &Out) |
: Ctx(Ctx), Str(Out), ELF64(isELF64(Ctx.getFlags())) { |
// Create the special bookkeeping sections now. |
- const IceString NullSectionName(""); |
+ constexpr char NullSectionName[] = ""; |
NullSection = new (Ctx.allocate<ELFSection>()) |
ELFSection(NullSectionName, SHT_NULL, 0, 0, 0); |
- const IceString ShStrTabName(".shstrtab"); |
+ constexpr char ShStrTabName[] = ".shstrtab"; |
ShStrTab = new (Ctx.allocate<ELFStringTableSection>()) |
ELFStringTableSection(ShStrTabName, SHT_STRTAB, 0, 1, 0); |
ShStrTab->add(ShStrTabName); |
- const IceString SymTabName(".symtab"); |
+ constexpr char SymTabName[] = ".symtab"; |
const Elf64_Xword SymTabAlign = ELF64 ? 8 : 4; |
const Elf64_Xword SymTabEntSize = |
ELF64 ? sizeof(Elf64_Sym) : sizeof(Elf32_Sym); |
@@ -93,15 +93,15 @@ ELFObjectWriter::ELFObjectWriter(GlobalContext &Ctx, ELFStreamer &Out) |
"Elf_Sym sizes cannot be derived from sizeof"); |
SymTab = createSection<ELFSymbolTableSection>(SymTabName, SHT_SYMTAB, 0, |
SymTabAlign, SymTabEntSize); |
- SymTab->createNullSymbol(NullSection); |
+ SymTab->createNullSymbol(NullSection, &Ctx); |
- const IceString StrTabName(".strtab"); |
+ constexpr char StrTabName[] = ".strtab"; |
StrTab = |
createSection<ELFStringTableSection>(StrTabName, SHT_STRTAB, 0, 1, 0); |
} |
template <typename T> |
-T *ELFObjectWriter::createSection(const IceString &Name, Elf64_Word ShType, |
+T *ELFObjectWriter::createSection(const std::string &Name, Elf64_Word ShType, |
Elf64_Xword ShFlags, Elf64_Xword ShAddralign, |
Elf64_Xword ShEntsize) { |
assert(!SectionNumbersAssigned); |
@@ -117,8 +117,8 @@ ELFObjectWriter::createRelocationSection(const ELFSection *RelatedSection) { |
// practice we've only had .rela for elf64 (x86-64). In the future, the two |
// properties may need to be decoupled and the ShEntSize can vary more. |
const Elf64_Word ShType = ELF64 ? SHT_RELA : SHT_REL; |
- const IceString RelPrefix = ELF64 ? ".rela" : ".rel"; |
- const IceString RelSectionName = RelPrefix + RelatedSection->getName(); |
+ const std::string RelPrefix = ELF64 ? ".rela" : ".rel"; |
+ const std::string RelSectionName = RelPrefix + RelatedSection->getName(); |
const Elf64_Xword ShAlign = ELF64 ? 8 : 4; |
const Elf64_Xword ShEntSize = ELF64 ? sizeof(Elf64_Rela) : sizeof(Elf32_Rel); |
static_assert(sizeof(Elf64_Rela) == 24 && sizeof(Elf32_Rel) == 8, |
@@ -216,16 +216,16 @@ Elf64_Off ELFObjectWriter::alignFileOffset(Elf64_Xword Align) { |
return OffsetInFile; |
} |
-void ELFObjectWriter::writeFunctionCode(const IceString &FuncName, |
- bool IsInternal, Assembler *Asm) { |
+void ELFObjectWriter::writeFunctionCode(GlobalString FuncName, bool IsInternal, |
+ Assembler *Asm) { |
assert(!SectionNumbersAssigned); |
- TimerMarker T_func(&Ctx, FuncName); |
+ TimerMarker T_func(&Ctx, FuncName.toStringOrEmpty()); |
TimerMarker Timer(TimerStack::TT_writeELF, &Ctx); |
ELFTextSection *Section = nullptr; |
ELFRelocationSection *RelSection = nullptr; |
const bool FunctionSections = Ctx.getFlags().getFunctionSections(); |
if (TextSections.empty() || FunctionSections) { |
- IceString SectionName = ".text"; |
+ std::string SectionName = ".text"; |
if (FunctionSections) |
SectionName += "." + FuncName; |
constexpr Elf64_Xword ShFlags = SHF_ALLOC | SHF_EXECINSTR; |
@@ -289,7 +289,7 @@ classifyGlobalSection(const VariableDeclaration *Var) { |
// is non-empty, then only the TranslateOnly variable is kept for emission. |
void partitionGlobalsBySection(const VariableDeclarationList &Vars, |
VariableDeclarationPartition VarsBySection[], |
- const IceString &TranslateOnly) { |
+ const std::string &TranslateOnly) { |
for (VariableDeclaration *Var : Vars) { |
if (GlobalContext::matchSymbolName(Var->getName(), TranslateOnly)) { |
size_t Section = classifyGlobalSection(Var); |
@@ -303,7 +303,7 @@ void partitionGlobalsBySection(const VariableDeclarationList &Vars, |
void ELFObjectWriter::writeDataSection(const VariableDeclarationList &Vars, |
FixupKind RelocationKind, |
- const IceString &SectionSuffix, |
+ const std::string &SectionSuffix, |
bool IsPIC) { |
TimerMarker Timer(TimerStack::TT_writeELF, &Ctx); |
assert(!SectionNumbersAssigned); |
@@ -320,7 +320,7 @@ void ELFObjectWriter::writeDataSection(const VariableDeclarationList &Vars, |
} |
namespace { |
-IceString MangleSectionName(const char Base[], const IceString &Suffix) { |
+std::string MangleSectionName(const char Base[], const std::string &Suffix) { |
if (Suffix.empty()) |
return Base; |
return Base + ("." + Suffix); |
@@ -331,7 +331,7 @@ IceString MangleSectionName(const char Base[], const IceString &Suffix) { |
void ELFObjectWriter::writeDataOfType(SectionType ST, |
const VariableDeclarationPartition &Vars, |
FixupKind RelocationKind, |
- const IceString &SectionSuffix, |
+ const std::string &SectionSuffix, |
bool IsPIC) { |
if (Vars.empty()) |
return; |
@@ -346,7 +346,7 @@ void ELFObjectWriter::writeDataOfType(SectionType ST, |
// Lift this out, so it can be re-used if we do fdata-sections? |
switch (ST) { |
case ROData: { |
- const IceString SectionName = |
+ const std::string SectionName = |
MangleSectionName(IsPIC ? ".data.rel.ro" : ".rodata", SectionSuffix); |
const Elf64_Xword ShFlags = IsPIC ? (SHF_ALLOC | SHF_WRITE) : SHF_ALLOC; |
Section = createSection<ELFDataSection>(SectionName, SHT_PROGBITS, ShFlags, |
@@ -358,7 +358,7 @@ void ELFObjectWriter::writeDataOfType(SectionType ST, |
break; |
} |
case Data: { |
- const IceString SectionName = MangleSectionName(".data", SectionSuffix); |
+ const std::string SectionName = MangleSectionName(".data", SectionSuffix); |
constexpr Elf64_Xword ShFlags = SHF_ALLOC | SHF_WRITE; |
Section = createSection<ELFDataSection>(SectionName, SHT_PROGBITS, ShFlags, |
ShAddralign, ShEntsize); |
@@ -369,7 +369,7 @@ void ELFObjectWriter::writeDataOfType(SectionType ST, |
break; |
} |
case BSS: { |
- const IceString SectionName = MangleSectionName(".bss", SectionSuffix); |
+ const std::string SectionName = MangleSectionName(".bss", SectionSuffix); |
constexpr Elf64_Xword ShFlags = SHF_ALLOC | SHF_WRITE; |
Section = createSection<ELFDataSection>(SectionName, SHT_NOBITS, ShFlags, |
ShAddralign, ShEntsize); |
@@ -395,7 +395,7 @@ void ELFObjectWriter::writeDataOfType(SectionType ST, |
SizeT SymbolSize = Var->getNumBytes(); |
bool IsExternal = Var->isExternal() || Ctx.getFlags().getDisableInternal(); |
const uint8_t SymbolBinding = IsExternal ? STB_GLOBAL : STB_LOCAL; |
- const IceString &Name = Var->getName(); |
+ GlobalString Name = Var->getName(); |
SymTab->createDefinedSym(Name, SymbolType, SymbolBinding, Section, |
Section->getCurrentSize(), SymbolSize); |
StrTab->add(Name); |
@@ -546,10 +546,7 @@ template <typename ConstType> void ELFObjectWriter::writeConstantPool(Type Ty) { |
if (!C->getShouldBePooled()) |
continue; |
auto *Const = llvm::cast<ConstType>(C); |
- std::string SymBuffer; |
- llvm::raw_string_ostream SymStrBuf(SymBuffer); |
- Const->emitPoolLabel(SymStrBuf); |
- std::string &SymName = SymStrBuf.str(); |
+ GlobalString SymName = Const->getLabelName(); |
SymTab->createDefinedSym(SymName, STT_NOTYPE, STB_LOCAL, Section, |
OffsetInSection, SymbolSize); |
StrTab->add(SymName); |
@@ -586,8 +583,12 @@ void ELFObjectWriter::writeJumpTable(const JumpTableData &JT, |
const Elf64_Xword PointerSize = typeWidthInBytes(getPointerType()); |
const Elf64_Xword ShAddralign = PointerSize; |
const Elf64_Xword ShEntsize = PointerSize; |
- const IceString SectionName = MangleSectionName( |
- IsPIC ? ".data.rel.ro" : ".rodata", JT.getFunctionName() + "$jumptable"); |
+ const GlobalString JTName = JT.getFunctionName(); |
+ const std::string SectionName = MangleSectionName( |
+ IsPIC ? ".data.rel.ro" : ".rodata", |
+ (JTName.hasStdString() ? JTName.toString() |
+ : std::to_string(JTName.getID())) + |
+ "$jumptable"); |
Section = createSection<ELFDataSection>(SectionName, SHT_PROGBITS, SHF_ALLOC, |
ShAddralign, ShEntsize); |
Section->setFileOffset(alignFileOffset(ShAddralign)); |
@@ -599,8 +600,8 @@ void ELFObjectWriter::writeJumpTable(const JumpTableData &JT, |
Section->padToAlignment(Str, PointerSize); |
const bool IsExternal = Ctx.getFlags().getDisableInternal(); |
const uint8_t SymbolBinding = IsExternal ? STB_GLOBAL : STB_LOCAL; |
- const IceString JumpTableName = |
- InstJumpTable::makeName(JT.getFunctionName(), JT.getId()); |
+ GlobalString JumpTableName = Ctx.getGlobalString( |
+ InstJumpTable::makeName(JT.getFunctionName(), JT.getId())); |
SymTab->createDefinedSym(JumpTableName, SymbolType, SymbolBinding, Section, |
Section->getCurrentSize(), PointerSize); |
StrTab->add(JumpTableName); |
@@ -619,7 +620,8 @@ void ELFObjectWriter::setUndefinedSyms(const ConstantList &UndefSyms) { |
TimerMarker Timer(TimerStack::TT_writeELF, &Ctx); |
for (const Constant *S : UndefSyms) { |
const auto *Sym = llvm::cast<ConstantRelocatable>(S); |
- const IceString &Name = Sym->getName(); |
+ GlobalString Name = Sym->getName(); |
+ assert(Name.hasStdString()); |
bool BadIntrinsic; |
const Intrinsics::FullIntrinsicInfo *Info = |
Ctx.getIntrinsicsInfo().find(Name, BadIntrinsic); |