diff options
author | Daniel Dunbar <daniel@zuster.org> | 2010-03-09 21:27:30 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2010-03-09 21:27:30 +0000 |
commit | e180fa962cc629255bbb0c5f185299c981b042ef (patch) | |
tree | 414f64fa503b6f5421e794b54e475420596b8f4a | |
parent | f7b730425fc45a28cafddf6e9907cd89acdae2aa (diff) | |
download | external_llvm-e180fa962cc629255bbb0c5f185299c981b042ef.zip external_llvm-e180fa962cc629255bbb0c5f185299c981b042ef.tar.gz external_llvm-e180fa962cc629255bbb0c5f185299c981b042ef.tar.bz2 |
MC/Mach-O: Don't generate relocations for PCrel fixups to local labels.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@98080 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/MC/MCAssembler.cpp | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index 928c037..84dda6d 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -440,7 +440,7 @@ public: DenseMap<const MCSymbol*,MCSymbolData*> &SymbolMap, std::vector<MachRelocationEntry> &Relocs) { uint32_t Address = Fragment.getOffset() + Fixup.Offset; - unsigned IsPCRel = 0; + unsigned IsPCRel = isFixupKindPCRel(Fixup.Kind); unsigned Log2Size = getFixupKindLog2Size(Fixup.Kind); unsigned Type = RIT_Vanilla; @@ -468,10 +468,16 @@ public: // The value which goes in the fixup is current value of the expression. Fixup.FixedValue = Value - Value2 + Target.getConstant(); - if (isFixupKindPCRel(Fixup.Kind)) { + if (IsPCRel) Fixup.FixedValue -= Address; - IsPCRel = 1; - } + + // If this fixup is a vanilla PC relative relocation for a local label, we + // don't need a relocation. + // + // FIXME: Implement proper atom support. + if (IsPCRel && Target.getSymA() && Target.getSymA()->isTemporary() && + !Target.getSymB()) + return; MachRelocationEntry MRE; MRE.Word0 = ((Address << 0) | @@ -516,7 +522,7 @@ public: uint32_t Address = Fragment.getOffset() + Fixup.Offset; uint32_t Value = 0; unsigned Index = 0; - unsigned IsPCRel = 0; + unsigned IsPCRel = isFixupKindPCRel(Fixup.Kind); unsigned Log2Size = getFixupKindLog2Size(Fixup.Kind); unsigned IsExtern = 0; unsigned Type = 0; @@ -554,11 +560,15 @@ public: // The value which goes in the fixup is current value of the expression. Fixup.FixedValue = Value + Target.getConstant(); - - if (isFixupKindPCRel(Fixup.Kind)) { + if (IsPCRel) Fixup.FixedValue -= Address; - IsPCRel = 1; - } + + // If this fixup is a vanilla PC relative relocation for a local label, we + // don't need a relocation. + // + // FIXME: Implement proper atom support. + if (IsPCRel && Target.getSymA() && Target.getSymA()->isTemporary()) + return; // struct relocation_info (8 bytes) MachRelocationEntry MRE; |