X-Git-Url: https://git.saurik.com/apple/ld64.git/blobdiff_plain/f80fe69f3f29962e8aa43a99f8ed9201548f3d78..c1f6aec514f7e3059b9613d90f479f494f19f7bb:/src/other/ObjectDump.cpp?ds=sidebyside diff --git a/src/other/ObjectDump.cpp b/src/other/ObjectDump.cpp index 36fcce9..6763e1a 100644 --- a/src/other/ObjectDump.cpp +++ b/src/other/ObjectDump.cpp @@ -396,11 +396,13 @@ struct AtomSorter rightString = (char*)cstringAtom->rawContentPointer(); } } - assert(leftString != NULL); - assert(rightString != NULL); - diff = strcmp(leftString, rightString); - if ( diff != 0 ) - return (diff < 0); + if ( leftString != rightString ) { + assert(leftString != NULL); + assert(rightString != NULL); + diff = strcmp(leftString, rightString); + if ( diff != 0 ) + return (diff < 0); + } } else if ( left->section().type() == ld::Section::typeLiteral4 ) { // if literal sort by content @@ -804,6 +806,7 @@ void dumper::dumpFixup(const ld::Fixup* ref) case ld::Fixup::kindStoreThumbHigh16: printf(", then store high-16 in Thumb movt"); break; +#if SUPPORT_ARCH_arm64 case ld::Fixup::kindStoreARM64Branch26: printf(", then store as ARM64 26-bit pcrel branch"); break; @@ -831,12 +834,19 @@ void dumper::dumpFixup(const ld::Fixup* ref) case ld::Fixup::kindStoreARM64TLVPLoadPageOff12: printf(", then store as ARM64 12-bit page offset of TLVP"); break; + case ld::Fixup::kindStoreARM64TLVPLoadNowLeaPage21: + printf(", then store as ARM64 21-bit pcrel ADRP of lea of TLVP"); + break; + case ld::Fixup::kindStoreARM64TLVPLoadNowLeaPageOff12: + printf(", then store as ARM64 12-bit page offset of lea of TLVP"); + break; case ld::Fixup::kindStoreARM64PointerToGOT: printf(", then store as 64-bit pointer to GOT entry"); break; case ld::Fixup::kindStoreARM64PCRelToGOT: printf(", then store as 32-bit delta to GOT entry"); break; +#endif case ld::Fixup::kindDtraceExtra: printf("dtrace static probe extra info"); break; @@ -858,18 +868,23 @@ void dumper::dumpFixup(const ld::Fixup* ref) case ld::Fixup::kindStoreThumbDtraceIsEnableSiteClear: printf("Thumb dtrace static is-enabled site"); break; +#if SUPPORT_ARCH_arm64 case ld::Fixup::kindStoreARM64DtraceCallSiteNop: printf("ARM64 dtrace static probe site"); break; case ld::Fixup::kindStoreARM64DtraceIsEnableSiteClear: printf("ARM64 dtrace static is-enabled site"); break; +#endif case ld::Fixup::kindLazyTarget: printf("lazy reference to external symbol %s", referenceTargetAtomName(ref)); break; case ld::Fixup::kindSetLazyOffset: printf("offset of lazy binding info for %s", referenceTargetAtomName(ref)); break; + case ld::Fixup::kindIslandTarget: + printf("ultimate target of island %s", referenceTargetAtomName(ref)); + break; case ld::Fixup::kindDataInCodeStartData: printf("start of data in code"); break; @@ -888,6 +903,46 @@ void dumper::dumpFixup(const ld::Fixup* ref) case ld::Fixup::kindDataInCodeEnd: printf("end of data in code"); break; + case ld::Fixup::kindLinkerOptimizationHint: +#if SUPPORT_ARCH_arm64 + ld::Fixup::LOH_arm64 extra; + extra.addend = ref->u.addend; + printf("ARM64 hint: "); + switch(extra.info.kind) { + case LOH_ARM64_ADRP_ADRP: + printf("ADRP-ADRP"); + break; + case LOH_ARM64_ADRP_LDR: + printf("ADRP-LDR"); + break; + case LOH_ARM64_ADRP_ADD_LDR: + printf("ADRP-ADD-LDR"); + break; + case LOH_ARM64_ADRP_LDR_GOT_LDR: + printf("ADRP-LDR-GOT-LDR"); + break; + case LOH_ARM64_ADRP_ADD_STR: + printf("ADRP-ADD-STR"); + break; + case LOH_ARM64_ADRP_LDR_GOT_STR: + printf("ADRP-LDR-GOT-STR"); + break; + case LOH_ARM64_ADRP_ADD: + printf("ADRP-ADD"); + break; + default: + printf("kind=%d", extra.info.kind); + break; + } + printf(", offset1=0x%X", (extra.info.delta1 << 2) + ref->offsetInAtom); + if ( extra.info.count > 0 ) + printf(", offset2=0x%X", (extra.info.delta2 << 2) + ref->offsetInAtom); + if ( extra.info.count > 1 ) + printf(", offset3=0x%X", (extra.info.delta3 << 2) + ref->offsetInAtom); + if ( extra.info.count > 2 ) + printf(", offset4=0x%X", (extra.info.delta4 << 2) + ref->offsetInAtom); +#endif + break; case ld::Fixup::kindStoreTargetAddressLittleEndian32: printf("store 32-bit little endian address of %s", referenceTargetAtomName(ref)); break; @@ -938,6 +993,7 @@ void dumper::dumpFixup(const ld::Fixup* ref) case ld::Fixup::kindSetTargetTLVTemplateOffsetLittleEndian64: printf("tlv template offset of %s", referenceTargetAtomName(ref)); break; +#if SUPPORT_ARCH_arm64 case ld::Fixup::kindStoreTargetAddressARM64Branch26: printf("ARM64 store 26-bit pcrel branch to %s", referenceTargetAtomName(ref)); break; @@ -954,11 +1010,24 @@ void dumper::dumpFixup(const ld::Fixup* ref) printf("ARM64 store 12-bit page offset of GOT of %s", referenceTargetAtomName(ref)); break; case ld::Fixup::kindStoreTargetAddressARM64GOTLeaPage21: - printf("ARM64 store 21-bit pcrel ADRP for lea of %s", referenceTargetAtomName(ref)); + printf("ARM64 store 21-bit pcrel ADRP to GOT lea for %s", referenceTargetAtomName(ref)); break; case ld::Fixup::kindStoreTargetAddressARM64GOTLeaPageOff12: - printf("ARM64 store 12-bit page offset of lea of %s", referenceTargetAtomName(ref)); + printf("ARM64 store 12-bit page offset of GOT lea of %s", referenceTargetAtomName(ref)); + break; + case ld::Fixup::kindStoreTargetAddressARM64TLVPLoadPage21: + printf("ARM64 store 21-bit pcrel ADRP to TLV for %s", referenceTargetAtomName(ref)); break; + case ld::Fixup::kindStoreTargetAddressARM64TLVPLoadPageOff12: + printf("ARM64 store 12-bit page offset of TLV of %s", referenceTargetAtomName(ref)); + break; + case ld::Fixup::kindStoreTargetAddressARM64TLVPLoadNowLeaPage21: + printf("ARM64 store 21-bit pcrel ADRP to lea for TLV for %s", referenceTargetAtomName(ref)); + break; + case ld::Fixup::kindStoreTargetAddressARM64TLVPLoadNowLeaPageOff12: + printf("ARM64 store 12-bit page offset of lea for TLV of %s", referenceTargetAtomName(ref)); + break; +#endif //default: // printf("unknown fixup"); // break; @@ -1180,12 +1249,17 @@ static ld::relocatable::File* createReader(const char* path) objOpts.warnUnwindConversionProblems = true; objOpts.keepDwarfUnwind = false; objOpts.forceDwarfConversion = false; + objOpts.verboseOptimizationHints = true; + objOpts.armUsesZeroCostExceptions = true; objOpts.subType = sPreferredSubArch; + objOpts.treateBitcodeAsData = false; + objOpts.usingBitcode = true; #if 1 if ( ! foundFatSlice ) { cpu_type_t archOfObj; cpu_subtype_t subArchOfObj; - if ( mach_o::relocatable::isObjectFile(p, &archOfObj, &subArchOfObj) ) { + Options::Platform platform; + if ( mach_o::relocatable::isObjectFile(p, &archOfObj, &subArchOfObj, &platform) ) { objOpts.architecture = archOfObj; objOpts.subType = subArchOfObj; } @@ -1196,7 +1270,7 @@ static ld::relocatable::File* createReader(const char* path) return objResult; // see if it is an llvm object file - objResult = lto::parse(p, fileLen, path, stat_buf.st_mtime, ld::File::Ordinal::NullOrdinal(), sPreferredArch, sPreferredSubArch, false); + objResult = lto::parse(p, fileLen, path, stat_buf.st_mtime, ld::File::Ordinal::NullOrdinal(), sPreferredArch, sPreferredSubArch, false, true); if ( objResult != NULL ) return objResult;