[llvm] Reland "[MC][NFC] Make ELFUniquingMap a StringMap (#95006)" (PR #95030)
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 10 13:38:05 PDT 2024
================
@@ -548,16 +549,42 @@ MCSectionELF *MCContext::getELFSection(const Twine &Section, unsigned Type,
if (GroupSym)
Group = GroupSym->getName();
assert(!(LinkedToSym && LinkedToSym->getName().empty()));
- // Do the lookup, if we have a hit, return it.
- auto IterBool = ELFUniquingMap.insert(std::make_pair(
- ELFSectionKey{Section.str(), Group,
- LinkedToSym ? LinkedToSym->getName() : "", UniqueID},
- nullptr));
- auto &Entry = *IterBool.first;
- if (!IterBool.second)
- return Entry.second;
- StringRef CachedName = Entry.first.SectionName;
+ // Sections are differentiated by the quadruple (section_name, group_name,
+ // unique_id, link_to_symbol_name). Sections sharing the same quadruple are
+ // combined into one section. As an optimization, non-unique sections without
+ // group or linked-to symbol have a shorter unique-ing key.
+ std::pair<StringMap<MCSectionELF *>::iterator, bool> EntryNewPair;
+ // Length of the section name, which are the first SectionLen bytes of the key
+ unsigned SectionLen;
+ if (GroupSym || LinkedToSym || UniqueID != MCSection::NonUniqueID) {
+ SmallString<128> Buffer;
+ Section.toVector(Buffer);
+ SectionLen = Buffer.size();
+ Buffer.push_back(0); // separator which cannot occur in the name
+ if (GroupSym)
+ Buffer.append(GroupSym->getName());
+ Buffer.push_back(0); // separator which cannot occur in the name
+ if (LinkedToSym)
+ Buffer.append(LinkedToSym->getName());
+ support::endian::write(Buffer, UniqueID, endianness::native);
+ StringRef UniqueMapKey = StringRef(Buffer);
+ EntryNewPair = ELFUniquingMap.insert(std::make_pair(UniqueMapKey, nullptr));
+ } else if (!Section.isSingleStringRef()) {
+ SmallString<128> Buffer;
+ StringRef UniqueMapKey = Section.toStringRef(Buffer);
+ SectionLen = UniqueMapKey.size();
----------------
MaskRay wrote:
SectionLen is fixed now
https://github.com/llvm/llvm-project/pull/95030
More information about the llvm-commits
mailing list