| Index: src/IceELFSection.cpp
|
| diff --git a/src/IceELFSection.cpp b/src/IceELFSection.cpp
|
| index 89c7369f5e9ef85c1ca350e4b8571b3b37cb9a5a..d9539bb39b0f10806e36014b51ef8d1b908cf672 100644
|
| --- a/src/IceELFSection.cpp
|
| +++ b/src/IceELFSection.cpp
|
| @@ -94,17 +94,20 @@ size_t ELFRelocationSection::getSectionDataSize() const {
|
|
|
| // Symbol tables.
|
|
|
| -void ELFSymbolTableSection::createNullSymbol(ELFSection *NullSection) {
|
| +void ELFSymbolTableSection::createNullSymbol(ELFSection *NullSection,
|
| + GlobalContext *Ctx) {
|
| // The first entry in the symbol table should be a NULL entry, so make sure
|
| // the map is still empty.
|
| assert(LocalSymbols.empty());
|
| - const IceString NullSymName("");
|
| - createDefinedSym(NullSymName, STT_NOTYPE, STB_LOCAL, NullSection, 0, 0);
|
| - NullSymbol = findSymbol(NullSymName);
|
| + // Explicitly set the null symbol name to the empty string, so that
|
| + // GlobalString::operator<() orders the null string first.
|
| + NullSymbolName = GlobalString::createWithString(Ctx, "");
|
| + createDefinedSym(NullSymbolName, STT_NOTYPE, STB_LOCAL, NullSection, 0, 0);
|
| + NullSymbol = findSymbol(NullSymbolName);
|
| }
|
|
|
| -void ELFSymbolTableSection::createDefinedSym(const IceString &Name,
|
| - uint8_t Type, uint8_t Binding,
|
| +void ELFSymbolTableSection::createDefinedSym(GlobalString Name, uint8_t Type,
|
| + uint8_t Binding,
|
| ELFSection *Section,
|
| RelocOffsetT Offset, SizeT Size) {
|
| ELFSym NewSymbol = ELFSym();
|
| @@ -122,7 +125,7 @@ void ELFSymbolTableSection::createDefinedSym(const IceString &Name,
|
| (void)Unique;
|
| }
|
|
|
| -void ELFSymbolTableSection::noteUndefinedSym(const IceString &Name,
|
| +void ELFSymbolTableSection::noteUndefinedSym(GlobalString Name,
|
| ELFSection *NullSection) {
|
| ELFSym NewSymbol = ELFSym();
|
| NewSymbol.Sym.setBindingAndType(STB_GLOBAL, STT_NOTYPE);
|
| @@ -138,7 +141,7 @@ void ELFSymbolTableSection::noteUndefinedSym(const IceString &Name,
|
| (void)Unique;
|
| }
|
|
|
| -const ELFSym *ELFSymbolTableSection::findSymbol(const IceString &Name) const {
|
| +const ELFSym *ELFSymbolTableSection::findSymbol(GlobalString Name) const {
|
| auto I = LocalSymbols.find(Name);
|
| if (I != LocalSymbols.end())
|
| return &I->second;
|
| @@ -151,16 +154,16 @@ const ELFSym *ELFSymbolTableSection::findSymbol(const IceString &Name) const {
|
| void ELFSymbolTableSection::updateIndices(const ELFStringTableSection *StrTab) {
|
| SizeT SymNumber = 0;
|
| for (auto &KeyValue : LocalSymbols) {
|
| - const IceString &Name = KeyValue.first;
|
| + GlobalString Name = KeyValue.first;
|
| ELFSection *Section = KeyValue.second.Section;
|
| Elf64_Sym &SymInfo = KeyValue.second.Sym;
|
| - if (!Name.empty())
|
| - SymInfo.st_name = StrTab->getIndex(Name);
|
| + if (Name != NullSymbolName && Name.hasStdString())
|
| + SymInfo.st_name = StrTab->getIndex(Name.toString());
|
| SymInfo.st_shndx = Section->getNumber();
|
| KeyValue.second.setNumber(SymNumber++);
|
| }
|
| for (auto &KeyValue : GlobalSymbols) {
|
| - const IceString &Name = KeyValue.first;
|
| + const std::string &Name = KeyValue.first.toString();
|
| ELFSection *Section = KeyValue.second.Section;
|
| Elf64_Sym &SymInfo = KeyValue.second.Sym;
|
| if (!Name.empty())
|
| @@ -182,24 +185,24 @@ void ELFSymbolTableSection::writeData(ELFStreamer &Str, bool IsELF64) {
|
|
|
| // String tables.
|
|
|
| -void ELFStringTableSection::add(const IceString &Str) {
|
| +void ELFStringTableSection::add(const std::string &Str) {
|
| assert(!isLaidOut());
|
| assert(!Str.empty());
|
| StringToIndexMap.insert(std::make_pair(Str, UnknownIndex));
|
| }
|
|
|
| -size_t ELFStringTableSection::getIndex(const IceString &Str) const {
|
| +size_t ELFStringTableSection::getIndex(const std::string &Str) const {
|
| assert(isLaidOut());
|
| StringToIndexType::const_iterator It = StringToIndexMap.find(Str);
|
| if (It == StringToIndexMap.end()) {
|
| - llvm_unreachable("String index not found");
|
| + llvm::report_fatal_error("String index not found: " + Str);
|
| return UnknownIndex;
|
| }
|
| return It->second;
|
| }
|
|
|
| bool ELFStringTableSection::SuffixComparator::
|
| -operator()(const IceString &StrA, const IceString &StrB) const {
|
| +operator()(const std::string &StrA, const std::string &StrB) const {
|
| size_t LenA = StrA.size();
|
| size_t LenB = StrB.size();
|
| size_t CommonLen = std::min(LenA, LenB);
|
|
|