[lld] [lld-macho] Category Merger: add support for addrsig references (PR #90903)
Kyungwoo Lee via llvm-commits
llvm-commits at lists.llvm.org
Thu May 2 17:06:32 PDT 2024
================
@@ -1183,26 +1193,66 @@ void ObjcCategoryMerger::eraseMergedCategories() {
// the references to the ones we merged.
generateCatListForNonErasedCategories(catListToErasedOffsets);
+ // We use erasedIsecs below to track erased sections so we can later remove
+ // references to it.
+ std::unordered_set<InputSection *> erasedIsecs;
+ erasedIsecs.reserve(categoryMap.size());
+
// Erase the old method lists & names of the categories that were merged
for (auto &mapEntry : categoryMap) {
for (InfoInputCategory &catInfo : mapEntry.second) {
if (!catInfo.wasMerged)
continue;
+ erasedIsecs.insert(catInfo.catBodyIsec);
+ erasedIsecs.insert(catInfo.catListIsec);
+
eraseISec(catInfo.catBodyIsec);
- tryEraseDefinedAtIsecOffset(catInfo.catBodyIsec, catLayout.nameOffset);
+ tryEraseDefinedAtIsecOffset(catInfo.catBodyIsec, catLayout.nameOffset,
+ erasedIsecs);
tryEraseDefinedAtIsecOffset(catInfo.catBodyIsec,
- catLayout.instanceMethodsOffset);
+ catLayout.instanceMethodsOffset, erasedIsecs);
tryEraseDefinedAtIsecOffset(catInfo.catBodyIsec,
- catLayout.classMethodsOffset);
+ catLayout.classMethodsOffset, erasedIsecs);
tryEraseDefinedAtIsecOffset(catInfo.catBodyIsec,
- catLayout.protocolsOffset);
+ catLayout.protocolsOffset, erasedIsecs);
tryEraseDefinedAtIsecOffset(catInfo.catBodyIsec,
- catLayout.classPropsOffset);
+ catLayout.classPropsOffset, erasedIsecs);
tryEraseDefinedAtIsecOffset(catInfo.catBodyIsec,
- catLayout.instancePropsOffset);
+ catLayout.instancePropsOffset, erasedIsecs);
}
}
+
+ removeRefsToErasedIsecs(erasedIsecs);
+}
+
+// The compiler may generate references to categories inside the addrsig
+// section. This function will erase these references.
+void ObjcCategoryMerger::removeRefsToErasedIsecs(
+ std::unordered_set<InputSection *> erasedIsecs) {
+ for (InputSection *isec : inputSections) {
+ if (isec->getName() != section_names::addrSig)
+ continue;
+
+ auto removeRelocs = [&erasedIsecs](Reloc &r) {
+ ConcatInputSection *isec = nullptr;
+ isec = dyn_cast_or_null<ConcatInputSection>(
----------------
kyulee-com wrote:
I think you can combine these two lines into one.
https://github.com/llvm/llvm-project/pull/90903
More information about the llvm-commits
mailing list