diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2010-09-17 22:34:41 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2010-09-17 22:34:41 +0000 |
| commit | 0ecde03e9f74676ab607a21a33c48b0f4b33f750 (patch) | |
| tree | f12ea64fcbe422acab0f02f54214105307d1932e /llvm/lib/MC | |
| parent | b330786d1fc224454468597eeb0570e3859b01b6 (diff) | |
| download | bcm5719-llvm-0ecde03e9f74676ab607a21a33c48b0f4b33f750.tar.gz bcm5719-llvm-0ecde03e9f74676ab607a21a33c48b0f4b33f750.zip | |
Avoid relocations in a common case.
llvm-svn: 114229
Diffstat (limited to 'llvm/lib/MC')
| -rw-r--r-- | llvm/lib/MC/ELFObjectWriter.cpp | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp index 8295dacd156..d0fc9cac479 100644 --- a/llvm/lib/MC/ELFObjectWriter.cpp +++ b/llvm/lib/MC/ELFObjectWriter.cpp @@ -470,12 +470,22 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm, unsigned Index = 0; int64_t Value = Target.getConstant(); + bool IsPCRel = isFixupKindX86PCRel(Fixup.getKind()); if (!Target.isAbsolute()) { const MCSymbol *Symbol = &Target.getSymA()->getSymbol(); MCSymbolData &SD = Asm.getSymbolData(*Symbol); const MCSymbolData *Base = Asm.getAtom(Layout, &SD); MCFragment *F = SD.getFragment(); + // Avoid relocations for cases like jumps and calls in the same file. + if (Symbol->isDefined() && !SD.isExternal() && + IsPCRel && + &Fragment->getParent()->getSection() == &Symbol->getSection()) { + uint64_t FixupAddr = Layout.getFragmentAddress(Fragment) + Fixup.getOffset(); + FixedValue = Layout.getSymbolAddress(&SD) + Target.getConstant() - FixupAddr; + return; + } + if (Base) { if (F && (!Symbol->isInSection() || SD.isCommon()) && !SD.isExternal()) { Index = F->getParent()->getOrdinal() + LocalSymbolData.size() + 1; @@ -507,7 +517,6 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm, FixedValue = Value; // determine the type of the relocation - bool IsPCRel = isFixupKindX86PCRel(Fixup.getKind()); unsigned Type; if (Is64Bit) { if (IsPCRel) { |

