[llvm-commits] [llvm] r114229 - /llvm/trunk/lib/MC/ELFObjectWriter.cpp
Rafael Espindola
rafael.espindola at gmail.com
Fri Sep 17 15:34:41 PDT 2010
Author: rafael
Date: Fri Sep 17 17:34:41 2010
New Revision: 114229
URL: http://llvm.org/viewvc/llvm-project?rev=114229&view=rev
Log:
Avoid relocations in a common case.
Modified:
llvm/trunk/lib/MC/ELFObjectWriter.cpp
Modified: llvm/trunk/lib/MC/ELFObjectWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/ELFObjectWriter.cpp?rev=114229&r1=114228&r2=114229&view=diff
==============================================================================
--- llvm/trunk/lib/MC/ELFObjectWriter.cpp (original)
+++ llvm/trunk/lib/MC/ELFObjectWriter.cpp Fri Sep 17 17:34:41 2010
@@ -470,12 +470,22 @@
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 @@
FixedValue = Value;
// determine the type of the relocation
- bool IsPCRel = isFixupKindX86PCRel(Fixup.getKind());
unsigned Type;
if (Is64Bit) {
if (IsPCRel) {
More information about the llvm-commits
mailing list