[mc-coff] Resolve aliases when emitting COFF relocations
authorReid Kleckner <reid@kleckner.net>
Mon, 15 Jul 2013 19:41:21 +0000 (19:41 +0000)
committerReid Kleckner <reid@kleckner.net>
Mon, 15 Jul 2013 19:41:21 +0000 (19:41 +0000)
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
test/MC/COFF/alias.s [new file with mode: 0644]

index cf733960881adb49f96acf30ad075754e296f005..28e611f6d73383ba0ee766868d6962c7230dec33 100644 (file)
@@ -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 (file)
index 0000000..f6f6d46
--- /dev/null
@@ -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: ]