diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2011-02-16 03:25:55 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2011-02-16 03:25:55 +0000 |
commit | 908159b46ae118d36fccbc1d5145dcedfc3d4185 (patch) | |
tree | 2bcfa35cdee3a066ce28656022bc1e7b506c6e5e | |
parent | 169e1552e748348b033fb6817df4bffc345e5583 (diff) |
Gas is very inconsistent about when a relaxation/relocation is needed. Do
the right thing and stop trying to copy it. Fixes PR8944.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@125648 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/MC/MCObjectWriter.h | 2 | ||||
-rw-r--r-- | lib/MC/ELFObjectWriter.cpp | 25 | ||||
-rw-r--r-- | lib/MC/MCAssembler.cpp | 6 | ||||
-rw-r--r-- | lib/MC/MCObjectWriter.cpp | 12 | ||||
-rw-r--r-- | lib/MC/WinCOFFObjectWriter.cpp | 20 | ||||
-rw-r--r-- | test/MC/ELF/relax.s | 20 |
6 files changed, 20 insertions, 65 deletions
diff --git a/include/llvm/MC/MCObjectWriter.h b/include/llvm/MC/MCObjectWriter.h index d267e6d0df..782d844598 100644 --- a/include/llvm/MC/MCObjectWriter.h +++ b/include/llvm/MC/MCObjectWriter.h @@ -96,7 +96,7 @@ public: const MCSymbolData &DataA, const MCFragment &FB, bool InSet, - bool IsPCRel) const = 0; + bool IsPCRel) const; /// Write the object file. diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index 0db54b5d48..8a00a16cfb 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/lib/MC/ELFObjectWriter.cpp @@ -359,13 +359,6 @@ namespace { MCDataFragment *F, const MCSectionData *SD); - virtual bool - IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm, - const MCSymbolData &DataA, - const MCFragment &FB, - bool InSet, - bool IsPCRel) const; - virtual void WriteObject(MCAssembler &Asm, const MCAsmLayout &Layout); virtual void WriteSection(MCAssembler &Asm, const SectionIndexMapTy &SectionIndexMap, @@ -1181,24 +1174,6 @@ void ELFObjectWriter::CreateMetadataSections(MCAssembler &Asm, } } -bool -ELFObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm, - const MCSymbolData &DataA, - const MCFragment &FB, - bool InSet, - bool IsPCRel) const { - // FIXME: This is in here just to match gnu as output. If the two ends - // are in the same section, there is nothing that the linker can do to - // break it. - if (DataA.isExternal()) - return false; - - const MCSection &SecA = DataA.getSymbol().AliasedSymbol().getSection(); - const MCSection &SecB = FB.getParent()->getSection(); - // On ELF A - B is absolute if A and B are in the same section. - return &SecA == &SecB; -} - void ELFObjectWriter::CreateIndexedSections(MCAssembler &Asm, MCAsmLayout &Layout, GroupMapTy &GroupMap, diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index 587068aee5..9992646042 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -229,8 +229,10 @@ bool MCAssembler::EvaluateFixup(const MCAsmLayout &Layout, } else if (!Target.getSymA()) { IsResolved = false; } else { - const MCSymbol &SA = Target.getSymA()->getSymbol(); - if (SA.AliasedSymbol().isUndefined()) { + const MCSymbolRefExpr *A = Target.getSymA(); + const MCSymbol &SA = A->getSymbol(); + if (A->getKind() != MCSymbolRefExpr::VK_None || + SA.AliasedSymbol().isUndefined()) { IsResolved = false; } else { const MCSymbolData &DataA = getSymbolData(SA); diff --git a/lib/MC/MCObjectWriter.cpp b/lib/MC/MCObjectWriter.cpp index f7a790410c..efe9f68ee2 100644 --- a/lib/MC/MCObjectWriter.cpp +++ b/lib/MC/MCObjectWriter.cpp @@ -66,3 +66,15 @@ MCObjectWriter::IsSymbolRefDifferenceFullyResolved(const MCAssembler &Asm, InSet, false); } + +bool +MCObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm, + const MCSymbolData &DataA, + const MCFragment &FB, + bool InSet, + bool IsPCRel) const { + const MCSection &SecA = DataA.getSymbol().AliasedSymbol().getSection(); + const MCSection &SecB = FB.getParent()->getSection(); + // On ELF and COFF A - B is absolute if A and B are in the same section. + return &SecA == &SecB; +} diff --git a/lib/MC/WinCOFFObjectWriter.cpp b/lib/MC/WinCOFFObjectWriter.cpp index 48a7c3bd64..6ca5d37fc3 100644 --- a/lib/MC/WinCOFFObjectWriter.cpp +++ b/lib/MC/WinCOFFObjectWriter.cpp @@ -179,13 +179,6 @@ public: MCValue Target, uint64_t &FixedValue); - virtual bool - IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm, - const MCSymbolData &DataA, - const MCFragment &FB, - bool InSet, - bool IsPCRel) const; - void WriteObject(MCAssembler &Asm, const MCAsmLayout &Layout); }; } @@ -719,19 +712,6 @@ void WinCOFFObjectWriter::RecordRelocation(const MCAssembler &Asm, coff_section->Relocations.push_back(Reloc); } -bool -WinCOFFObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl( - const MCAssembler &Asm, - const MCSymbolData &DataA, - const MCFragment &FB, - bool InSet, - bool IsPCRel) const { - const MCSection &SecA = DataA.getSymbol().AliasedSymbol().getSection(); - const MCSection &SecB = FB.getParent()->getSection(); - // On COFF A - B is absolute if A and B are in the same section. - return &SecA == &SecB; -} - void WinCOFFObjectWriter::WriteObject(MCAssembler &Asm, const MCAsmLayout &Layout) { // Assign symbol and section indexes and offsets. diff --git a/test/MC/ELF/relax.s b/test/MC/ELF/relax.s index d584c7c88f..2c0e285db5 100644 --- a/test/MC/ELF/relax.s +++ b/test/MC/ELF/relax.s @@ -1,10 +1,6 @@ // RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | elf-dump --dump-section-data | FileCheck %s -// Test that we do a relaxation for foo but not for bar or zed. Relaxing foo is -// probably not necessary, but matches what gnu as does. - -// Also test that the relaxation done for foo uses the symbol, not section and -// offset. +// Test that we do not relax these. bar: .globl foo @@ -20,22 +16,12 @@ foo: // CHECK-NEXT: ('sh_flags', 0x00000006) // CHECK-NEXT: ('sh_addr', 0x00000000) // CHECK-NEXT: ('sh_offset', 0x00000040) -// CHECK-NEXT: ('sh_size', 0x00000009) +// CHECK-NEXT: ('sh_size', 0x00000006) // CHECK-NEXT: ('sh_link', 0x00000000) // CHECK-NEXT: ('sh_info', 0x00000000) // CHECK-NEXT: ('sh_addralign', 0x00000004) // CHECK-NEXT: ('sh_entsize', 0x00000000) -// CHECK-NEXT: ('_section_data', 'ebfee900 000000eb f7') +// CHECK-NEXT: ('_section_data', 'ebfeebfc ebfa') // CHECK: # Symbol 0x00000006 // CHECK-NEXT: (('st_name', 0x00000005) # 'foo' - -// CHECK: .rela.text -// CHECK: ('_relocations', [ -// CHECK-NEXT: Relocation 0x00000000 -// CHECK-NEXT: (('r_offset', 0x00000003) -// CHECK-NEXT: ('r_sym', 0x00000006) -// CHECK-NEXT: ('r_type', 0x00000002) -// CHECK-NEXT: ('r_addend', 0xfffffffc) -// CHECK-NEXT: ), -// CHECK-NEXT: ]) |