[lld] [lld-macho] Simplify category merging code & match symbol names to ld64 (PR #90856)
via llvm-commits
llvm-commits at lists.llvm.org
Thu May 2 08:36:56 PDT 2024
https://github.com/alx32 updated https://github.com/llvm/llvm-project/pull/90856
>From 3a862d101b45cb2dd5bd9a674d3bc1b4f8aeca3d Mon Sep 17 00:00:00 2001
From: Alex Borcan <alexborcan at fb.com>
Date: Thu, 2 May 2024 06:45:08 -0700
Subject: [PATCH] [lld-macho] Simplify category merging code & update symbol
names to match ld64
---
lld/MachO/ObjC.cpp | 75 +++++++++++++++++++---------------------------
1 file changed, 30 insertions(+), 45 deletions(-)
diff --git a/lld/MachO/ObjC.cpp b/lld/MachO/ObjC.cpp
index 95fe0c9374f150..4760fffebe3b30 100644
--- a/lld/MachO/ObjC.cpp
+++ b/lld/MachO/ObjC.cpp
@@ -351,30 +351,28 @@ class ObjcCategoryMerger {
// alignment as already used in existing (input) categories. To do this we
// have InfoCategoryWriter which contains the various sections that the
// generated categories will be written to.
- template <typename T> struct InfoWriteSection {
+ struct InfoWriteSection {
bool valid = false; // Data has been successfully collected from input
uint32_t align = 0;
Section *inputSection;
Reloc relocTemplate;
- T *outputSection;
+ OutputSection *outputSection;
};
struct InfoCategoryWriter {
- InfoWriteSection<ConcatOutputSection> catListInfo;
- InfoWriteSection<ConcatOutputSection> catBodyInfo;
- InfoWriteSection<CStringSection> catNameInfo;
- InfoWriteSection<ConcatOutputSection> catPtrListInfo;
+ InfoWriteSection catListInfo;
+ InfoWriteSection catBodyInfo;
+ InfoWriteSection catNameInfo;
+ InfoWriteSection catPtrListInfo;
};
// Information about a pointer list in the original categories (method lists,
// protocol lists, etc)
struct PointerListInfo {
- PointerListInfo(const char *_categoryPrefix, uint32_t _categoryOffset,
- uint32_t _pointersPerStruct)
- : categoryPrefix(_categoryPrefix), categoryOffset(_categoryOffset),
+ PointerListInfo(const char *_categoryPrefix, uint32_t _pointersPerStruct)
+ : categoryPrefix(_categoryPrefix),
pointersPerStruct(_pointersPerStruct) {}
const char *categoryPrefix;
- uint32_t categoryOffset = 0;
uint32_t pointersPerStruct = 0;
@@ -399,25 +397,16 @@ class ObjcCategoryMerger {
// In case we generate new data, mark the new data as belonging to this file
ObjFile *objFileForMergeData = nullptr;
- PointerListInfo instanceMethods = {
- objc::symbol_names::categoryInstanceMethods,
- /*_categoryOffset=*/catLayout.instanceMethodsOffset,
- /*pointersPerStruct=*/3};
- PointerListInfo classMethods = {
- objc::symbol_names::categoryClassMethods,
- /*_categoryOffset=*/catLayout.classMethodsOffset,
- /*pointersPerStruct=*/3};
+ PointerListInfo instanceMethods = {objc::symbol_names::instanceMethods,
+ /*pointersPerStruct=*/3};
+ PointerListInfo classMethods = {objc::symbol_names::categoryClassMethods,
+ /*pointersPerStruct=*/3};
PointerListInfo protocols = {objc::symbol_names::categoryProtocols,
- /*_categoryOffset=*/catLayout.protocolsOffset,
/*pointersPerStruct=*/0};
- PointerListInfo instanceProps = {
- objc::symbol_names::listProprieties,
- /*_categoryOffset=*/catLayout.instancePropsOffset,
- /*pointersPerStruct=*/2};
- PointerListInfo classProps = {
- objc::symbol_names::klassPropList,
- /*_categoryOffset=*/catLayout.classPropsOffset,
- /*pointersPerStruct=*/2};
+ PointerListInfo instanceProps = {objc::symbol_names::listProprieties,
+ /*pointersPerStruct=*/2};
+ PointerListInfo classProps = {objc::symbol_names::klassPropList,
+ /*pointersPerStruct=*/2};
};
public:
@@ -436,9 +425,8 @@ class ObjcCategoryMerger {
void generateCatListForNonErasedCategories(
std::map<ConcatInputSection *, std::set<uint64_t>>
catListToErasedOffsets);
- template <typename T>
void collectSectionWriteInfoFromIsec(const InputSection *isec,
- InfoWriteSection<T> &catWriteInfo);
+ InfoWriteSection &catWriteInfo);
void collectCategoryWriterInfoFromCategory(const InfoInputCategory &catInfo);
void parseCatInfoToExtInfo(const InfoInputCategory &catInfo,
ClassExtensionInfo &extInfo);
@@ -511,15 +499,12 @@ ObjcCategoryMerger::ObjcCategoryMerger(
protocolListHeaderLayout(target->wordSize),
allInputSections(_allInputSections) {}
-// This is a template so that it can be used both for CStringSection and
-// ConcatOutputSection
-template <typename T>
void ObjcCategoryMerger::collectSectionWriteInfoFromIsec(
- const InputSection *isec, InfoWriteSection<T> &catWriteInfo) {
+ const InputSection *isec, InfoWriteSection &catWriteInfo) {
catWriteInfo.inputSection = const_cast<Section *>(&isec->section);
catWriteInfo.align = isec->align;
- catWriteInfo.outputSection = dyn_cast_or_null<T>(isec->parent);
+ catWriteInfo.outputSection = isec->parent;
assert(catWriteInfo.outputSection &&
"outputSection may not be null in collectSectionWriteInfoFromIsec.");
@@ -576,19 +561,19 @@ void ObjcCategoryMerger::collectCategoryWriterInfoFromCategory(
const InfoInputCategory &catInfo) {
if (!infoCategoryWriter.catListInfo.valid)
- collectSectionWriteInfoFromIsec<ConcatOutputSection>(
- catInfo.catListIsec, infoCategoryWriter.catListInfo);
+ collectSectionWriteInfoFromIsec(catInfo.catListIsec,
+ infoCategoryWriter.catListInfo);
if (!infoCategoryWriter.catBodyInfo.valid)
- collectSectionWriteInfoFromIsec<ConcatOutputSection>(
- catInfo.catBodyIsec, infoCategoryWriter.catBodyInfo);
+ collectSectionWriteInfoFromIsec(catInfo.catBodyIsec,
+ infoCategoryWriter.catBodyInfo);
if (!infoCategoryWriter.catNameInfo.valid) {
lld::macho::Defined *catNameSym =
tryGetDefinedAtIsecOffset(catInfo.catBodyIsec, catLayout.nameOffset);
assert(catNameSym && "Category does not have a valid name Symbol");
- collectSectionWriteInfoFromIsec<CStringSection>(
- catNameSym->isec(), infoCategoryWriter.catNameInfo);
+ collectSectionWriteInfoFromIsec(catNameSym->isec(),
+ infoCategoryWriter.catNameInfo);
}
// Collect writer info from all the category lists (we're assuming they all
@@ -598,8 +583,8 @@ void ObjcCategoryMerger::collectCategoryWriterInfoFromCategory(
off <= catLayout.classPropsOffset; off += target->wordSize) {
if (Defined *ptrList =
tryGetDefinedAtIsecOffset(catInfo.catBodyIsec, off)) {
- collectSectionWriteInfoFromIsec<ConcatOutputSection>(
- ptrList->isec(), infoCategoryWriter.catPtrListInfo);
+ collectSectionWriteInfoFromIsec(ptrList->isec(),
+ infoCategoryWriter.catPtrListInfo);
// we've successfully collected data, so we can break
break;
}
@@ -795,7 +780,7 @@ void ObjcCategoryMerger::emitAndLinkProtocolList(
listSec->parent = infoCategoryWriter.catPtrListInfo.outputSection;
std::string symName = ptrList.categoryPrefix;
- symName += extInfo.baseClassName + "_$_(" + extInfo.mergedContainerName + ")";
+ symName += extInfo.baseClassName + "(" + extInfo.mergedContainerName + ")";
Defined *ptrListSym = make<Defined>(
newStringData(symName.c_str()), /*file=*/parentSym->getObjectFile(),
@@ -853,7 +838,7 @@ void ObjcCategoryMerger::emitAndLinkPointerList(
listSec->parent = infoCategoryWriter.catPtrListInfo.outputSection;
std::string symName = ptrList.categoryPrefix;
- symName += extInfo.baseClassName + "_$_" + extInfo.mergedContainerName;
+ symName += extInfo.baseClassName + "(" + extInfo.mergedContainerName + ")";
Defined *ptrListSym = make<Defined>(
newStringData(symName.c_str()), /*file=*/parentSym->getObjectFile(),
@@ -930,7 +915,7 @@ Defined *ObjcCategoryMerger::emitCategoryBody(const std::string &name,
addInputSection(newBodySec);
std::string symName =
- objc::symbol_names::category + baseClassName + "_$_(" + name + ")";
+ objc::symbol_names::category + baseClassName + "(" + name + ")";
Defined *catBodySym = make<Defined>(
newStringData(symName.c_str()), /*file=*/objFile, newBodySec,
/*value=*/0, bodyData.size(), /*isWeakDef=*/false, /*isExternal=*/false,
More information about the llvm-commits
mailing list