diff options
author | Daniel Dunbar <daniel@zuster.org> | 2010-05-10 23:15:20 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2010-05-10 23:15:20 +0000 |
commit | 75778984f92ca53997dca25000065ee34f2872f0 (patch) | |
tree | c9e3f7184cd229eba154326e611a4bfd12323af4 /llvm/lib/MC/MachObjectWriter.cpp | |
parent | 7de3106a898626b821155a04cd304fe66810f648 (diff) | |
download | bcm5719-llvm-75778984f92ca53997dca25000065ee34f2872f0.tar.gz bcm5719-llvm-75778984f92ca53997dca25000065ee34f2872f0.zip |
MC/Mach-O: Fix another mismatch with .weak_definition, we shouldn't use a
scattered relocation entry with a .weak_definition.
llvm-svn: 103443
Diffstat (limited to 'llvm/lib/MC/MachObjectWriter.cpp')
-rw-r--r-- | llvm/lib/MC/MachObjectWriter.cpp | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/llvm/lib/MC/MachObjectWriter.cpp b/llvm/lib/MC/MachObjectWriter.cpp index 8dd551800f8..c45fbd5dad0 100644 --- a/llvm/lib/MC/MachObjectWriter.cpp +++ b/llvm/lib/MC/MachObjectWriter.cpp @@ -740,15 +740,24 @@ public: // If this is a difference or a defined symbol plus an offset, then we need // a scattered relocation entry. + // Differences always require scattered relocations. + if (Target.getSymB()) + return RecordScatteredRelocation(Asm, Layout, Fragment, Fixup, + Target, FixedValue); + + // Get the symbol data, if any. + MCSymbolData *SD = 0; + if (Target.getSymA()) + SD = &Asm.getSymbolData(Target.getSymA()->getSymbol()); + + // If this is an internal relocation with an offset, it also needs a + // scattered relocation entry. uint32_t Offset = Target.getConstant(); if (IsPCRel) Offset += 1 << Log2Size; - if (Target.getSymB() || - (Target.getSymA() && !Target.getSymA()->getSymbol().isUndefined() && - Offset)) { - RecordScatteredRelocation(Asm, Layout, Fragment, Fixup,Target,FixedValue); - return; - } + if (Offset && SD && !doesSymbolRequireExternRelocation(SD)) + return RecordScatteredRelocation(Asm, Layout, Fragment, Fixup, + Target, FixedValue); // See <reloc.h>. uint32_t Address = Layout.getFragmentOffset(Fragment) + Fixup.Offset; @@ -765,9 +774,6 @@ public: Type = RIT_Vanilla; Value = 0; } else { - const MCSymbol *Symbol = &Target.getSymA()->getSymbol(); - MCSymbolData *SD = &Asm.getSymbolData(*Symbol); - // Check whether we need an external or internal relocation. if (doesSymbolRequireExternRelocation(SD)) { IsExtern = 1; |