mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-18 07:06:38 +00:00
[lld-macho][NFC] Refactor insertions into inputSections (#85692)
Before this change, after `InputSection` objects are created, they need to be added to the appropriate container for tracking. The logic for selecting the appropriate container lives in `Driver.cpp` / `gatherInputSections`, where the `InputSection` is added to the matching container depending on the input config and the type of `InputSection`. Also, multiple other locations also insert directly into `inputSections` array - assuming that that is the appropriate container for the `InputSection`'s they create. Currently this is the correct assumption, however an upcoming feature will change this. For an upcoming feature (relative method lists), we need to route `InputSection`'s either to `inputSections` array or to a synthetic section, depending on weather the relative method list optimization is enabled or not. We can achieve the above either by duplicating some of the logic or refactoring the routing and `InputSection`'s and reusing that. The refactoring & code sharing approach seems the correct way to go - as such this diff performs the refactoring while not introducing any functional changes. Later on we can just call `addInputSection` and not have to worry about routing logic. ---------
This commit is contained in:
parent
b19bf3e888
commit
b609a4d7ea
@ -612,7 +612,7 @@ static void replaceCommonSymbols() {
|
||||
if (!osec)
|
||||
osec = ConcatOutputSection::getOrCreateForInput(isec);
|
||||
isec->parent = osec;
|
||||
inputSections.push_back(isec);
|
||||
addInputSection(isec);
|
||||
|
||||
// FIXME: CommonSymbol should store isReferencedDynamically, noDeadStrip
|
||||
// and pass them on here.
|
||||
@ -1220,53 +1220,18 @@ static void createFiles(const InputArgList &args) {
|
||||
|
||||
static void gatherInputSections() {
|
||||
TimeTraceScope timeScope("Gathering input sections");
|
||||
int inputOrder = 0;
|
||||
for (const InputFile *file : inputFiles) {
|
||||
for (const Section *section : file->sections) {
|
||||
// Compact unwind entries require special handling elsewhere. (In
|
||||
// contrast, EH frames are handled like regular ConcatInputSections.)
|
||||
if (section->name == section_names::compactUnwind)
|
||||
continue;
|
||||
ConcatOutputSection *osec = nullptr;
|
||||
for (const Subsection &subsection : section->subsections) {
|
||||
if (auto *isec = dyn_cast<ConcatInputSection>(subsection.isec)) {
|
||||
if (isec->isCoalescedWeak())
|
||||
continue;
|
||||
if (config->emitInitOffsets &&
|
||||
sectionType(isec->getFlags()) == S_MOD_INIT_FUNC_POINTERS) {
|
||||
in.initOffsets->addInput(isec);
|
||||
continue;
|
||||
}
|
||||
isec->outSecOff = inputOrder++;
|
||||
if (!osec)
|
||||
osec = ConcatOutputSection::getOrCreateForInput(isec);
|
||||
isec->parent = osec;
|
||||
inputSections.push_back(isec);
|
||||
} else if (auto *isec =
|
||||
dyn_cast<CStringInputSection>(subsection.isec)) {
|
||||
if (isec->getName() == section_names::objcMethname) {
|
||||
if (in.objcMethnameSection->inputOrder == UnspecifiedInputOrder)
|
||||
in.objcMethnameSection->inputOrder = inputOrder++;
|
||||
in.objcMethnameSection->addInput(isec);
|
||||
} else {
|
||||
if (in.cStringSection->inputOrder == UnspecifiedInputOrder)
|
||||
in.cStringSection->inputOrder = inputOrder++;
|
||||
in.cStringSection->addInput(isec);
|
||||
}
|
||||
} else if (auto *isec =
|
||||
dyn_cast<WordLiteralInputSection>(subsection.isec)) {
|
||||
if (in.wordLiteralSection->inputOrder == UnspecifiedInputOrder)
|
||||
in.wordLiteralSection->inputOrder = inputOrder++;
|
||||
in.wordLiteralSection->addInput(isec);
|
||||
} else {
|
||||
llvm_unreachable("unexpected input section kind");
|
||||
}
|
||||
}
|
||||
for (const Subsection &subsection : section->subsections)
|
||||
addInputSection(subsection.isec);
|
||||
}
|
||||
if (!file->objCImageInfo.empty())
|
||||
in.objCImageInfo->addFile(file);
|
||||
}
|
||||
assert(inputOrder <= UnspecifiedInputOrder);
|
||||
}
|
||||
|
||||
static void foldIdenticalLiterals() {
|
||||
@ -1422,6 +1387,7 @@ bool link(ArrayRef<const char *> argsArr, llvm::raw_ostream &stdoutOS,
|
||||
concatOutputSections.clear();
|
||||
inputFiles.clear();
|
||||
inputSections.clear();
|
||||
inputSectionsOrder = 0;
|
||||
loadedArchives.clear();
|
||||
loadedObjectFrameworks.clear();
|
||||
missingAutolinkWarnings.clear();
|
||||
|
@ -37,6 +37,44 @@ static_assert(sizeof(void *) != 8 ||
|
||||
"instances of it");
|
||||
|
||||
std::vector<ConcatInputSection *> macho::inputSections;
|
||||
int macho::inputSectionsOrder = 0;
|
||||
|
||||
// Call this function to add a new InputSection and have it routed to the
|
||||
// appropriate container. Depending on its type and current config, it will
|
||||
// either be added to 'inputSections' vector or to a synthetic section.
|
||||
void lld::macho::addInputSection(InputSection *inputSection) {
|
||||
if (auto *isec = dyn_cast<ConcatInputSection>(inputSection)) {
|
||||
if (isec->isCoalescedWeak())
|
||||
return;
|
||||
if (config->emitInitOffsets &&
|
||||
sectionType(isec->getFlags()) == S_MOD_INIT_FUNC_POINTERS) {
|
||||
in.initOffsets->addInput(isec);
|
||||
return;
|
||||
}
|
||||
isec->outSecOff = inputSectionsOrder++;
|
||||
auto *osec = ConcatOutputSection::getOrCreateForInput(isec);
|
||||
isec->parent = osec;
|
||||
inputSections.push_back(isec);
|
||||
} else if (auto *isec = dyn_cast<CStringInputSection>(inputSection)) {
|
||||
if (isec->getName() == section_names::objcMethname) {
|
||||
if (in.objcMethnameSection->inputOrder == UnspecifiedInputOrder)
|
||||
in.objcMethnameSection->inputOrder = inputSectionsOrder++;
|
||||
in.objcMethnameSection->addInput(isec);
|
||||
} else {
|
||||
if (in.cStringSection->inputOrder == UnspecifiedInputOrder)
|
||||
in.cStringSection->inputOrder = inputSectionsOrder++;
|
||||
in.cStringSection->addInput(isec);
|
||||
}
|
||||
} else if (auto *isec = dyn_cast<WordLiteralInputSection>(inputSection)) {
|
||||
if (in.wordLiteralSection->inputOrder == UnspecifiedInputOrder)
|
||||
in.wordLiteralSection->inputOrder = inputSectionsOrder++;
|
||||
in.wordLiteralSection->addInput(isec);
|
||||
} else {
|
||||
llvm_unreachable("unexpected input section kind");
|
||||
}
|
||||
|
||||
assert(inputSectionsOrder <= UnspecifiedInputOrder);
|
||||
}
|
||||
|
||||
uint64_t InputSection::getFileSize() const {
|
||||
return isZeroFill(getFlags()) ? 0 : getSize();
|
||||
|
@ -302,6 +302,8 @@ bool isEhFrameSection(const InputSection *);
|
||||
bool isGccExceptTabSection(const InputSection *);
|
||||
|
||||
extern std::vector<ConcatInputSection *> inputSections;
|
||||
// This is used as a counter for specyfing input order for input sections
|
||||
extern int inputSectionsOrder;
|
||||
|
||||
namespace section_names {
|
||||
|
||||
@ -369,6 +371,7 @@ constexpr const char addrSig[] = "__llvm_addrsig";
|
||||
|
||||
} // namespace section_names
|
||||
|
||||
void addInputSection(InputSection *inputSection);
|
||||
} // namespace macho
|
||||
|
||||
std::string toString(const macho::InputSection *);
|
||||
|
@ -790,7 +790,7 @@ void ObjcCategoryMerger::emitAndLinkProtocolList(
|
||||
infoCategoryWriter.catPtrListInfo.align);
|
||||
listSec->parent = infoCategoryWriter.catPtrListInfo.outputSection;
|
||||
listSec->live = true;
|
||||
allInputSections.push_back(listSec);
|
||||
addInputSection(listSec);
|
||||
|
||||
listSec->parent = infoCategoryWriter.catPtrListInfo.outputSection;
|
||||
|
||||
@ -848,7 +848,7 @@ void ObjcCategoryMerger::emitAndLinkPointerList(
|
||||
infoCategoryWriter.catPtrListInfo.align);
|
||||
listSec->parent = infoCategoryWriter.catPtrListInfo.outputSection;
|
||||
listSec->live = true;
|
||||
allInputSections.push_back(listSec);
|
||||
addInputSection(listSec);
|
||||
|
||||
listSec->parent = infoCategoryWriter.catPtrListInfo.outputSection;
|
||||
|
||||
@ -889,7 +889,7 @@ ObjcCategoryMerger::emitCatListEntrySec(const std::string &forCateogryName,
|
||||
bodyData, infoCategoryWriter.catListInfo.align);
|
||||
newCatList->parent = infoCategoryWriter.catListInfo.outputSection;
|
||||
newCatList->live = true;
|
||||
allInputSections.push_back(newCatList);
|
||||
addInputSection(newCatList);
|
||||
|
||||
newCatList->parent = infoCategoryWriter.catListInfo.outputSection;
|
||||
|
||||
@ -927,7 +927,7 @@ Defined *ObjcCategoryMerger::emitCategoryBody(const std::string &name,
|
||||
bodyData, infoCategoryWriter.catBodyInfo.align);
|
||||
newBodySec->parent = infoCategoryWriter.catBodyInfo.outputSection;
|
||||
newBodySec->live = true;
|
||||
allInputSections.push_back(newBodySec);
|
||||
addInputSection(newBodySec);
|
||||
|
||||
std::string symName =
|
||||
objc::symbol_names::category + baseClassName + "_$_(" + name + ")";
|
||||
@ -1132,7 +1132,7 @@ void ObjcCategoryMerger::generateCatListForNonErasedCategories(
|
||||
infoCategoryWriter.catListInfo.align);
|
||||
listSec->parent = infoCategoryWriter.catListInfo.outputSection;
|
||||
listSec->live = true;
|
||||
allInputSections.push_back(listSec);
|
||||
addInputSection(listSec);
|
||||
|
||||
std::string slotSymName = "<__objc_catlist slot for category ";
|
||||
slotSymName += nonErasedCatBody->getName();
|
||||
|
@ -793,7 +793,7 @@ void StubHelperSection::setUp() {
|
||||
|
||||
in.imageLoaderCache->parent =
|
||||
ConcatOutputSection::getOrCreateForInput(in.imageLoaderCache);
|
||||
inputSections.push_back(in.imageLoaderCache);
|
||||
addInputSection(in.imageLoaderCache);
|
||||
// Since this isn't in the symbol table or in any input file, the noDeadStrip
|
||||
// argument doesn't matter.
|
||||
dyldPrivate =
|
||||
@ -855,7 +855,7 @@ ConcatInputSection *ObjCSelRefsSection::makeSelRef(StringRef methname) {
|
||||
/*addend=*/static_cast<int64_t>(methnameOffset),
|
||||
/*referent=*/in.objcMethnameSection->isec});
|
||||
objcSelref->parent = ConcatOutputSection::getOrCreateForInput(objcSelref);
|
||||
inputSections.push_back(objcSelref);
|
||||
addInputSection(objcSelref);
|
||||
objcSelref->isFinal = true;
|
||||
methnameToSelref[CachedHashStringRef(methname)] = objcSelref;
|
||||
return objcSelref;
|
||||
|
Loading…
x
Reference in New Issue
Block a user