From 6057eb7ab697fcd0feb3cdd55e9a497cfe0aff72 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Mon, 15 Jul 2013 19:41:21 +0000 Subject: [PATCH] [mc-coff] Resolve aliases when emitting COFF relocations This is consistent with the ELF object writer. Add some COFF tests that relocate against an alias. Reviewers: espindola Differential Revision: http://llvm-reviews.chandlerc.com/D1079 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186341 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/WinCOFFObjectWriter.cpp | 5 +- test/MC/COFF/alias.s | 106 +++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 test/MC/COFF/alias.s diff --git a/lib/MC/WinCOFFObjectWriter.cpp b/lib/MC/WinCOFFObjectWriter.cpp index cf733960881..28e611f6d73 100644 --- a/lib/MC/WinCOFFObjectWriter.cpp +++ b/lib/MC/WinCOFFObjectWriter.cpp @@ -637,8 +637,9 @@ void WinCOFFObjectWriter::RecordRelocation(const MCAssembler &Asm, uint64_t &FixedValue) { assert(Target.getSymA() != NULL && "Relocation must reference a symbol!"); - const MCSymbol *A = &Target.getSymA()->getSymbol(); - MCSymbolData &A_SD = Asm.getSymbolData(*A); + const MCSymbol &Symbol = Target.getSymA()->getSymbol(); + const MCSymbol &A = Symbol.AliasedSymbol(); + MCSymbolData &A_SD = Asm.getSymbolData(A); MCSectionData const *SectionData = Fragment->getParent(); diff --git a/test/MC/COFF/alias.s b/test/MC/COFF/alias.s new file mode 100644 index 00000000000..f6f6d46bf6a --- /dev/null +++ b/test/MC/COFF/alias.s @@ -0,0 +1,106 @@ +// RUN: llvm-mc -filetype=obj -triple i686-pc-win32 %s -o - | llvm-readobj -t -r | FileCheck %s + +local1: +external_aliased_to_local = local1 + + .globl global_aliased_to_external +global_aliased_to_external = external1 + + .globl global_aliased_to_local +local2: +global_aliased_to_local = local2 + + .weak weak_aliased_to_external +weak_aliased_to_external = external2 + +// Generate relocs against the above aliases. + .long external_aliased_to_local + .long global_aliased_to_external + .long global_aliased_to_local + .long weak_aliased_to_external + +// CHECK: Relocations [ +// CHECK: 0x0 IMAGE_REL_I386_DIR32 local1 +// CHECK: 0x4 IMAGE_REL_I386_DIR32 external1 +// CHECK: 0x8 IMAGE_REL_I386_DIR32 local2 +// CHECK: 0xC IMAGE_REL_I386_DIR32 external2 +// CHECK: ] +// CHECK: Symbols [ +// CHECK-NEXT: Symbol { +// CHECK-NEXT: Name: .text +// CHECK-NEXT: Value: 0 +// CHECK-NEXT: Section: .text (1) +// CHECK-NEXT: BaseType: Null (0x0) +// CHECK-NEXT: ComplexType: Null (0x0) +// CHECK-NEXT: StorageClass: Static (0x3) +// CHECK-NEXT: AuxSymbolCount: 1 +// CHECK: } +// CHECK: Symbol { +// CHECK-NEXT: Name: local1 +// CHECK-NEXT: Value: 0 +// CHECK-NEXT: Section: .text (1) +// CHECK-NEXT: BaseType: Null (0x0) +// CHECK-NEXT: ComplexType: Null (0x0) +// CHECK-NEXT: StorageClass: Static (0x3) +// CHECK-NEXT: AuxSymbolCount: 0 +// CHECK-NEXT: } +// CHECK-NEXT: Symbol { +// CHECK-NEXT: Name: global_aliased_to_external +// CHECK-NEXT: Value: 0 +// CHECK-NEXT: Section: (0) +// CHECK-NEXT: BaseType: Null (0x0) +// CHECK-NEXT: ComplexType: Null (0x0) +// CHECK-NEXT: StorageClass: External (0x2) +// CHECK-NEXT: AuxSymbolCount: 0 +// CHECK-NEXT: } +// CHECK-NEXT: Symbol { +// CHECK-NEXT: Name: external1 +// CHECK-NEXT: Value: 0 +// CHECK-NEXT: Section: (0) +// CHECK-NEXT: BaseType: Null (0x0) +// CHECK-NEXT: ComplexType: Null (0x0) +// CHECK-NEXT: StorageClass: External (0x2) +// CHECK-NEXT: AuxSymbolCount: 0 +// CHECK-NEXT: } +// CHECK-NEXT: Symbol { +// CHECK-NEXT: Name: global_aliased_to_local +// CHECK-NEXT: Value: 0 +// CHECK-NEXT: Section: .text (1) +// CHECK-NEXT: BaseType: Null (0x0) +// CHECK-NEXT: ComplexType: Null (0x0) +// CHECK-NEXT: StorageClass: Static (0x3) +// CHECK-NEXT: AuxSymbolCount: 0 +// CHECK-NEXT: } +// CHECK-NEXT: Symbol { +// CHECK-NEXT: Name: local2 +// CHECK-NEXT: Value: 0 +// CHECK-NEXT: Section: .text (1) +// CHECK-NEXT: BaseType: Null (0x0) +// CHECK-NEXT: ComplexType: Null (0x0) +// CHECK-NEXT: StorageClass: Static (0x3) +// CHECK-NEXT: AuxSymbolCount: 0 +// CHECK-NEXT: } +// CHECK-NEXT: Symbol { +// CHECK-NEXT: Name: weak_aliased_to_external +// CHECK-NEXT: Value: 0 +// CHECK-NEXT: Section: (0) +// CHECK-NEXT: BaseType: Null (0x0) +// CHECK-NEXT: ComplexType: Null (0x0) +// CHECK-NEXT: StorageClass: WeakExternal (0x69) +// CHECK-NEXT: AuxSymbolCount: 1 +// CHECK-NEXT: AuxWeakExternal { +// CHECK-NEXT: Linked: external2 (9) +// CHECK-NEXT: Search: Library (0x2) +// CHECK-NEXT: Unused: (00 00 00 00 00 00 00 00 00 00) +// CHECK-NEXT: } +// CHECK-NEXT: } +// CHECK-NEXT: Symbol { +// CHECK-NEXT: Name: external2 +// CHECK-NEXT: Value: 0 +// CHECK-NEXT: Section: (0) +// CHECK-NEXT: BaseType: Null (0x0) +// CHECK-NEXT: ComplexType: Null (0x0) +// CHECK-NEXT: StorageClass: External (0x2) +// CHECK-NEXT: AuxSymbolCount: 0 +// CHECK-NEXT: } +// CHECK-NEXT: ] -- 2.34.1