diff --git a/lld/MachO/ObjC.cpp b/lld/MachO/ObjC.cpp index 95fe0c9374f15..b8c895b2215d0 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 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 catListInfo; - InfoWriteSection catBodyInfo; - InfoWriteSection catNameInfo; - InfoWriteSection 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> catListToErasedOffsets); - template void collectSectionWriteInfoFromIsec(const InputSection *isec, - InfoWriteSection &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 void ObjcCategoryMerger::collectSectionWriteInfoFromIsec( - const InputSection *isec, InfoWriteSection &catWriteInfo) { + const InputSection *isec, InfoWriteSection &catWriteInfo) { catWriteInfo.inputSection = const_cast
(&isec->section); catWriteInfo.align = isec->align; - catWriteInfo.outputSection = dyn_cast_or_null(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( - catInfo.catListIsec, infoCategoryWriter.catListInfo); + collectSectionWriteInfoFromIsec(catInfo.catListIsec, + infoCategoryWriter.catListInfo); if (!infoCategoryWriter.catBodyInfo.valid) - collectSectionWriteInfoFromIsec( - 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( - 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( - ptrList->isec(), infoCategoryWriter.catPtrListInfo); + collectSectionWriteInfoFromIsec(ptrList->isec(), + infoCategoryWriter.catPtrListInfo); // we've successfully collected data, so we can break break; }