[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 06:49:43 PDT 2024
https://github.com/alx32 created https://github.com/llvm/llvm-project/pull/90856
We simplify category merging code to simplify it, as follows:
- We can simplify InfoWriteSection to not be templated.
- We remove PointerListInfo::categoryOffset as it is not used.
We also update symbol names to match ld64 ( "`Class_$_(Cat)`" => "`Class(Cat)`" )
>From 5c93dc9063670eb2a1404536dc10e241a108ed1f 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 ++++++++-----------
.../objc-category-merging-complete-test.s | 4 +-
...jc-category-merging-extern-class-minimal.s | 4 +-
3 files changed, 34 insertions(+), 49 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,
diff --git a/lld/test/MachO/objc-category-merging-complete-test.s b/lld/test/MachO/objc-category-merging-complete-test.s
index 3bc3ca26b6ae6c..d2d264a3f26c2d 100644
--- a/lld/test/MachO/objc-category-merging-complete-test.s
+++ b/lld/test/MachO/objc-category-merging-complete-test.s
@@ -13,7 +13,7 @@
# RUN: llvm-objdump --objc-meta-data --macho a64_file2_merge.exe | FileCheck %s --check-prefixes=MERGE_CATS
-MERGE_CATS: __OBJC_$_CATEGORY_MyBaseClass_$_(Category02|Category03)
+MERGE_CATS: __OBJC_$_CATEGORY_MyBaseClass(Category02|Category03)
MERGE_CATS-NEXT: name {{.*}} Category02|Category03
MERGE_CATS: instanceMethods
MERGE_CATS-NEXT: entsize 24
@@ -90,7 +90,7 @@ MERGE_CATS-NEXT: name {{.*}} MyProtocol03Prop
MERGE_CATS-NEXT: attributes {{.*}} Ti,R,D
-NO_MERGE_CATS-NOT: __OBJC_$_CATEGORY_MyBaseClass_$_(Category02|Category03)
+NO_MERGE_CATS-NOT: __OBJC_$_CATEGORY_MyBaseClass(Category02|Category03)
NO_MERGE_CATS: __OBJC_$_CATEGORY_MyBaseClass_$_Category02
NO_MERGE_CATS: instanceMethods
NO_MERGE_CATS-NEXT: 24
diff --git a/lld/test/MachO/objc-category-merging-extern-class-minimal.s b/lld/test/MachO/objc-category-merging-extern-class-minimal.s
index ede7ef5d9c32d4..ea79f29a421c5c 100644
--- a/lld/test/MachO/objc-category-merging-extern-class-minimal.s
+++ b/lld/test/MachO/objc-category-merging-extern-class-minimal.s
@@ -20,7 +20,7 @@ MERGE_CATS-NOT: __OBJC_$_CATEGORY_MyBaseClass_$_Category01
MERGE_CATS-NOT: __OBJC_$_CATEGORY_MyBaseClass_$_Category02
# Check that the merged cateogry is there, in the correct format
-MERGE_CATS: __OBJC_$_CATEGORY_MyBaseClass_$_(Category01|Category02)
+MERGE_CATS: __OBJC_$_CATEGORY_MyBaseClass(Category01|Category02)
MERGE_CATS-NEXT: name {{.*}} Category01|Category02
MERGE_CATS: instanceMethods
MERGE_CATS-NEXT: 24
@@ -37,7 +37,7 @@ MERGE_CATS-NEXT: instanceProperties 0x0
#### Check merge categories disabled ###
# Check that the merged category is not there
-NO_MERGE_CATS-NOT: __OBJC_$_CATEGORY_MyBaseClass_$_(Category01|Category02)
+NO_MERGE_CATS-NOT: __OBJC_$_CATEGORY_MyBaseClass(Category01|Category02)
# Check that the original categories are there
NO_MERGE_CATS: __OBJC_$_CATEGORY_MyBaseClass_$_Category01
More information about the llvm-commits
mailing list