diff --git a/lib/MC/MachObjectWriter.cpp b/lib/MC/MachObjectWriter.cpp index 24ad99879f4..e7a9174db65 100644 --- a/lib/MC/MachObjectWriter.cpp +++ b/lib/MC/MachObjectWriter.cpp @@ -820,9 +820,9 @@ public: Relocations[Fragment->getParent()].push_back(MRE); } - static bool getARMFixupKindMachOInfo(unsigned Kind, bool &Is24BitBranch, + static bool getARMFixupKindMachOInfo(unsigned Kind, unsigned &RelocType, unsigned &Log2Size) { - Is24BitBranch = false; + RelocType = unsigned(macho::RIT_Vanilla); Log2Size = ~0U; switch (Kind) { @@ -847,21 +847,24 @@ public: case ARM::fixup_arm_pcrel_10: case ARM::fixup_arm_adr_pcrel_12: case ARM::fixup_arm_branch: - Is24BitBranch = true; + RelocType = unsigned(macho::RIT_ARM_Branch24Bit); // Report as 'long', even though that is not quite accurate. Log2Size = llvm::Log2_32(4); return true; // Handle Thumb branches. case ARM::fixup_arm_thumb_br: + RelocType = unsigned(macho::RIT_ARM_ThumbBranch22Bit); Log2Size = llvm::Log2_32(2); return true; case ARM::fixup_arm_thumb_bl: + RelocType = unsigned(macho::RIT_ARM_ThumbBranch32Bit); Log2Size = llvm::Log2_32(4); return true; case ARM::fixup_arm_thumb_blx: + RelocType = unsigned(macho::RIT_ARM_ThumbBranch22Bit); // Report as 'long', even though that is not quite accurate. Log2Size = llvm::Log2_32(4); return true; @@ -872,8 +875,8 @@ public: MCValue Target, uint64_t &FixedValue) { unsigned IsPCRel = isFixupKindPCRel(Asm, Fixup.getKind()); unsigned Log2Size; - bool Is24BitBranch; - if (!getARMFixupKindMachOInfo(Fixup.getKind(), Is24BitBranch, Log2Size)) { + unsigned RelocType = macho::RIT_Vanilla; + if (!getARMFixupKindMachOInfo(Fixup.getKind(), RelocType, Log2Size)) { report_fatal_error("unknown ARM fixup kind!"); return; } @@ -896,7 +899,7 @@ public: // // Is this right for ARM? uint32_t Offset = Target.getConstant(); - if (IsPCRel && !Is24BitBranch) + if (IsPCRel && RelocType == macho::RIT_Vanilla) Offset += 1 << Log2Size; if (Offset && SD && !doesSymbolRequireExternRelocation(SD)) return RecordARMScatteredRelocation(Asm, Layout, Fragment, Fixup, @@ -940,9 +943,8 @@ public: if (IsPCRel) FixedValue -= getSectionAddress(Fragment->getParent()); - // Determine the appropriate type based on the fixup kind. - Type = Is24BitBranch ? (unsigned)macho::RIT_ARM_Branch24Bit : - (unsigned)macho::RIT_Vanilla; + // The type is determined by the fixup kind. + Type = RelocType; } // struct relocation_info (8 bytes) diff --git a/test/MC/MachO/darwin-Thumb-reloc.s b/test/MC/MachO/darwin-Thumb-reloc.s index 263a8035581..200b8593791 100644 --- a/test/MC/MachO/darwin-Thumb-reloc.s +++ b/test/MC/MachO/darwin-Thumb-reloc.s @@ -64,7 +64,7 @@ L_.str: @ CHECK: ('word-1', 0x0)), @ CHECK: # Relocation 2 @ CHECK: (('word-0', 0x0), -@ CHECK-FIXME: ('word-1', 0x6d000001)), +@ CHECK: ('word-1', 0x6d000001)), @ CHECK: ]) @ CHECK-FIXME: ('_section_data', 'fff7feef 04000000') @ CHECK: # Section 1