Index: src/IceELFSection.h |
diff --git a/src/IceELFSection.h b/src/IceELFSection.h |
index c57b8218d4a9ac0c72f7e936afa64bdf936dc901..b5a52f4ee4f2550301f622553723c44b3ee3cb51 100644 |
--- a/src/IceELFSection.h |
+++ b/src/IceELFSection.h |
@@ -19,6 +19,7 @@ |
#include "IceELFStreamer.h" |
#include "IceFixups.h" |
#include "IceOperand.h" |
+#include "IceStringPool.h" |
using namespace llvm::ELF; |
@@ -45,7 +46,7 @@ public: |
/// Constructs an ELF section, filling in fields that will be known once the |
/// *type* of section is decided. Other fields may be updated incrementally or |
/// only after the program is completely defined. |
- ELFSection(const IceString &Name, Elf64_Word ShType, Elf64_Xword ShFlags, |
+ ELFSection(const std::string &Name, Elf64_Word ShType, Elf64_Xword ShFlags, |
Elf64_Xword ShAddralign, Elf64_Xword ShEntsize) |
: Name(Name), Header() { |
Header.sh_type = ShType; |
@@ -70,7 +71,7 @@ public: |
void setNameStrIndex(Elf64_Word sh_name) { Header.sh_name = sh_name; } |
- const IceString &getName() const { return Name; } |
+ const std::string &getName() const { return Name; } |
void setLinkNum(Elf64_Word sh_link) { Header.sh_link = sh_link; } |
@@ -86,7 +87,7 @@ public: |
protected: |
/// Name of the section in convenient string form (instead of a index into the |
/// Section Header String Table, which is not known till later). |
- const IceString Name; |
+ const std::string Name; |
// The fields of the header. May only be partially initialized, but should |
// be fully initialized before writing. |
@@ -164,26 +165,26 @@ class ELFSymbolTableSection : public ELFSection { |
ELFSymbolTableSection &operator=(const ELFSymbolTableSection &) = delete; |
public: |
- ELFSymbolTableSection(const IceString &Name, Elf64_Word ShType, |
+ ELFSymbolTableSection(const std::string &Name, Elf64_Word ShType, |
Elf64_Xword ShFlags, Elf64_Xword ShAddralign, |
Elf64_Xword ShEntsize) |
: ELFSection(Name, ShType, ShFlags, ShAddralign, ShEntsize), |
- NullSymbol(nullptr) {} |
+ NullSymbolName(), NullSymbol(nullptr) {} |
/// Create initial entry for a symbol when it is defined. Each entry should |
/// only be defined once. We might want to allow Name to be a dummy name |
/// initially, then get updated to the real thing, since Data initializers are |
/// read before the bitcode's symbol table is read. |
- void createDefinedSym(const IceString &Name, uint8_t Type, uint8_t Binding, |
+ void createDefinedSym(GlobalString Name, uint8_t Type, uint8_t Binding, |
ELFSection *Section, RelocOffsetT Offset, SizeT Size); |
/// Note that a symbol table entry needs to be created for the given symbol |
/// because it is undefined. |
- void noteUndefinedSym(const IceString &Name, ELFSection *NullSection); |
+ void noteUndefinedSym(GlobalString Name, ELFSection *NullSection); |
- const ELFSym *findSymbol(const IceString &Name) const; |
+ const ELFSym *findSymbol(GlobalString Name) const; |
- void createNullSymbol(ELFSection *NullSection); |
+ void createNullSymbol(ELFSection *NullSection, GlobalContext *Ctx); |
const ELFSym *getNullSymbol() const { return NullSymbol; } |
size_t getSectionDataSize() const { |
@@ -199,12 +200,13 @@ public: |
private: |
// Map from symbol name to its symbol information. This assumes symbols are |
// unique across all sections. |
- using SymtabKey = IceString; |
+ using SymtabKey = GlobalString; |
using SymMap = std::map<SymtabKey, ELFSym>; |
template <bool IsELF64> |
void writeSymbolMap(ELFStreamer &Str, const SymMap &Map); |
+ GlobalString NullSymbolName; |
const ELFSym *NullSymbol; |
// Keep Local and Global symbols separate, since the sh_info needs to know |
// the index of the last LOCAL. |
@@ -219,7 +221,7 @@ class ELFRelocationSection : public ELFSection { |
ELFRelocationSection &operator=(const ELFRelocationSection &) = delete; |
public: |
- ELFRelocationSection(const IceString &Name, Elf64_Word ShType, |
+ ELFRelocationSection(const std::string &Name, Elf64_Word ShType, |
Elf64_Xword ShFlags, Elf64_Xword ShAddralign, |
Elf64_Xword ShEntsize) |
: ELFSection(Name, ShType, ShFlags, ShAddralign, ShEntsize), |
@@ -264,7 +266,11 @@ public: |
using ELFSection::ELFSection; |
/// Add a string to the table, in preparation for final layout. |
- void add(const IceString &Str); |
+ void add(const std::string &Str); |
+ void add(GlobalString Str) { |
+ if (Str.hasStdString()) |
+ add(Str.toString()); |
+ } |
/// Finalizes the layout of the string table and fills in the section Data. |
void doLayout(); |
@@ -275,7 +281,7 @@ public: |
/// Grabs the final index of a string after layout. Returns UnknownIndex if |
/// the string's index is not found. |
- size_t getIndex(const IceString &Str) const; |
+ size_t getIndex(const std::string &Str) const; |
llvm::StringRef getSectionData() const { |
assert(isLaidOut()); |
@@ -294,10 +300,10 @@ private: |
/// "unpop" share "pop" as the suffix, "pop" can only share the characters |
/// with one of them. |
struct SuffixComparator { |
- bool operator()(const IceString &StrA, const IceString &StrB) const; |
+ bool operator()(const std::string &StrA, const std::string &StrB) const; |
}; |
- using StringToIndexType = std::map<IceString, size_t, SuffixComparator>; |
+ using StringToIndexType = std::map<std::string, size_t, SuffixComparator>; |
/// Track strings to their index. Index will be UnknownIndex if not yet laid |
/// out. |
@@ -357,7 +363,7 @@ void ELFRelocationSection::writeData(ELFStreamer &Str, |
} else if (Fixup.valueIsSymbol()) { |
Symbol = Fixup.getSymbolValue(); |
} else { |
- const IceString Name = Fixup.symbol(); |
+ GlobalString Name = Fixup.symbol(); |
Symbol = SymTab->findSymbol(Name); |
if (!Symbol) |
llvm::report_fatal_error(Name + ": Missing symbol mentioned in reloc"); |