Index: lld/trunk/lib/ReaderWriter/MachO/File.h =================================================================== --- lld/trunk/lib/ReaderWriter/MachO/File.h +++ lld/trunk/lib/ReaderWriter/MachO/File.h @@ -197,6 +197,11 @@ uint32_t swiftVersion() const { return _swiftVersion; } void setSwiftVersion(uint32_t v) { _swiftVersion = v; } + bool subsectionsViaSymbols() const { + return _flags & llvm::MachO::MH_SUBSECTIONS_VIA_SYMBOLS; + } + void setFlags(normalized::FileFlags v) { _flags = v; } + /// Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const File *F) { return F->kind() == File::kindMachObject; @@ -238,6 +243,7 @@ MachOLinkingContext::Arch _arch = MachOLinkingContext::arch_unknown; MachOLinkingContext::OS _os = MachOLinkingContext::OS::unknown; uint32_t _swiftVersion = 0; + normalized::FileFlags _flags; }; class MachODylibFile : public SharedLibraryFile { Index: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp =================================================================== --- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp +++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp @@ -105,10 +105,12 @@ public: Util(const MachOLinkingContext &ctxt) : _ctx(ctxt), _archHandler(ctxt.archHandler()), _entryAtom(nullptr), - _hasTLVDescriptors(false) {} + _hasTLVDescriptors(false), _subsectionsViaSymbols(true) {} ~Util(); - void assignAtomsToSections(const lld::File &atomFile); + void processDefinedAtoms(const lld::File &atomFile); + void processAtomAttributes(const DefinedAtom *atom); + void assignAtomToSection(const DefinedAtom *atom); void organizeSections(); void assignAddressesToSections(const NormalizedFile &file); uint32_t fileFlags(); @@ -180,6 +182,7 @@ AtomToIndex _atomToSymbolIndex; std::vector _machHeaderAliasAtoms; bool _hasTLVDescriptors; + bool _subsectionsViaSymbols; }; Util::~Util() { @@ -366,15 +369,28 @@ sect->size = offset + atom->size(); } -void Util::assignAtomsToSections(const lld::File &atomFile) { +void Util::processDefinedAtoms(const lld::File &atomFile) { for (const DefinedAtom *atom : atomFile.defined()) { - if (atom->contentType() == DefinedAtom::typeMachHeader) - _machHeaderAliasAtoms.push_back(atom); - else - appendAtom(sectionForAtom(atom), atom); + processAtomAttributes(atom); + assignAtomToSection(atom); } } +void Util::processAtomAttributes(const DefinedAtom *atom) { + auto *machoFile = static_cast(&atom->file()); + // If the file doesn't use subsections via symbols, then make sure we don't + // add that flag to the final output file if we have a relocatable file. + if (!machoFile->subsectionsViaSymbols()) + _subsectionsViaSymbols = false; +} + +void Util::assignAtomToSection(const DefinedAtom *atom) { + if (atom->contentType() == DefinedAtom::typeMachHeader) + _machHeaderAliasAtoms.push_back(atom); + else + appendAtom(sectionForAtom(atom), atom); +} + SegmentInfo *Util::segmentForName(StringRef segName) { for (SegmentInfo *si : _segmentInfos) { if ( si->name.equals(segName) ) @@ -1183,7 +1199,7 @@ uint32_t Util::fileFlags() { // FIXME: these need to determined at runtime. if (_ctx.outputMachOType() == MH_OBJECT) { - return MH_SUBSECTIONS_VIA_SYMBOLS; + return _subsectionsViaSymbols ? MH_SUBSECTIONS_VIA_SYMBOLS : 0; } else { uint32_t flags = MH_DYLDLINK; if (!_ctx.useFlatNamespace()) @@ -1208,7 +1224,7 @@ const MachOLinkingContext &context) { // The util object buffers info until the normalized file can be made. Util util(context); - util.assignAtomsToSections(atomFile); + util.processDefinedAtoms(atomFile); util.organizeSections(); std::unique_ptr f(new NormalizedFile()); Index: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp =================================================================== --- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp +++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp @@ -1056,6 +1056,7 @@ } // Cache some attributes on the file for use later. + file->setFlags(normalizedFile.flags); file->setArch(normalizedFile.arch); file->setOS(normalizedFile.os); Index: lld/trunk/test/mach-o/parse-data-relocs-x86_64.yaml =================================================================== --- lld/trunk/test/mach-o/parse-data-relocs-x86_64.yaml +++ lld/trunk/test/mach-o/parse-data-relocs-x86_64.yaml @@ -323,4 +323,5 @@ # CHECK: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ] # CHECK: section-choice: custom-required # CHECK: section-name: __DATA/__custom +# CHECK: dead-strip: never