summaryrefslogtreecommitdiff
path: root/lib/MC/ELFObjectWriter.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2010-09-17 22:34:41 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2010-09-17 22:34:41 +0000
commit0007489312ecb1b51ae275f1e452786480151a4c (patch)
treeaf2f51a98f2231e7040059a5fdf43c813e9c7640 /lib/MC/ELFObjectWriter.cpp
parent6edb0eac87a6e46b89de3ad5d8e39c41969e2a54 (diff)
downloadllvm-0007489312ecb1b51ae275f1e452786480151a4c.tar.gz
llvm-0007489312ecb1b51ae275f1e452786480151a4c.tar.bz2
llvm-0007489312ecb1b51ae275f1e452786480151a4c.tar.xz
Avoid relocations in a common case.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@114229 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/ELFObjectWriter.cpp')
-rw-r--r--lib/MC/ELFObjectWriter.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp
index 8295dacd15..d0fc9cac47 100644
--- a/lib/MC/ELFObjectWriter.cpp
+++ b/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) {