MC-COFF: Fix (PR8278) temporary symbol relocations.
authorMichael J. Spencer <bigcheesegs@gmail.com>
Tue, 5 Oct 2010 19:48:03 +0000 (19:48 +0000)
committerMichael J. Spencer <bigcheesegs@gmail.com>
Tue, 5 Oct 2010 19:48:03 +0000 (19:48 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115656 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/WinCOFFObjectWriter.cpp
test/MC/COFF/symbol-fragment-offset.ll

index 24c517b122dfa7993bdd80acedce53f37ba3fb61..a09769189625057558c99ca76fb9c721de0e54dc 100644 (file)
@@ -660,7 +660,8 @@ void WinCOFFObjectWriter::RecordRelocation(const MCAssembler &Asm,
   // turn relocations for temporary symbols into section relocations
   if (coff_symbol->MCData->getSymbol().isTemporary()) {
     Reloc.Symb = coff_symbol->Section->Symbol;
-    FixedValue += Layout.getFragmentOffset(coff_symbol->MCData->Fragment);
+    FixedValue += Layout.getFragmentOffset(coff_symbol->MCData->Fragment)
+                + coff_symbol->MCData->getOffset();
   } else
     Reloc.Symb = coff_symbol;
 
index a8c917e0c41e490739ee1b25a6308b716fa8f544..fec19250b295cf7b8d174ad710c800b1e67700ad 100644 (file)
@@ -4,13 +4,15 @@
 ; RUN: llc -filetype=obj -mtriple i686-pc-win32 %s -o - | coff-dump.py | FileCheck %s\r
 ; RUN: llc -filetype=obj -mtriple x86_64-pc-win32 %s -o %t\r
 \r
-@.str = private constant [7 x i8] c"Hello \00"    ; <[7 x i8]*> [#uses=1]\r
-@str = internal constant [7 x i8] c"World!\00"    ; <[7 x i8]*> [#uses=1]\r
+@.str0 = private constant [7 x i8] c"Hello \00"    ; <[7 x i8]*> [#uses=1]\r
+@.str1 = private constant [7 x i8] c"World!\00"    ; <[7 x i8]*> [#uses=1]\r
+@.str2 = private constant [19 x i8] c"I'm The Last Line.\00"\r
 \r
 define i32 @main() nounwind {\r
 entry:\r
-  %call = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([7 x i8]* @.str, i32 0, i32 0)) nounwind ; <i32> [#uses=0]\r
-  %puts = tail call i32 @puts(i8* getelementptr inbounds ([7 x i8]* @str, i32 0, i32 0)) ; <i32> [#uses=0]\r
+  %call = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([7 x i8]* @.str0, i32 0, i32 0)) nounwind ; <i32> [#uses=0]\r
+  %puts0 = tail call i32 @puts(i8* getelementptr inbounds ([7 x i8]* @.str1, i32 0, i32 0)) ; <i32> [#uses=0]\r
+  %puts1 = tail call i32 @puts(i8* getelementptr inbounds ([19 x i8]* @.str2, i32 0, i32 0)) ; <i32> [#uses=0]\r
   ret i32 0\r
 }\r
 \r
@@ -23,7 +25,7 @@ declare i32 @puts(i8* nocapture) nounwind
 ; CHECK:   NumberOfSections         = 2\r
 ; CHECK:   TimeDateStamp            = {{[0-9]+}}\r
 ; CHECK:   PointerToSymbolTable     = 0x{{[0-9A-F]+}}\r
-; CHECK:   NumberOfSymbols          = 8\r
+; CHECK:   NumberOfSymbols          = 7\r
 ; CHECK:   SizeOfOptionalHeader     = 0\r
 ; CHECK:   Characteristics          = 0x0\r
 ; CHECK:   Sections                 = [\r
@@ -35,7 +37,7 @@ declare i32 @puts(i8* nocapture) nounwind
 ; CHECK:       PointerToRawData         = 0x{{[0-9A-F]+}}\r
 ; CHECK:       PointerToRelocations     = 0x{{[0-9A-F]+}}\r
 ; CHECK:       PointerToLineNumbers     = 0x0\r
-; CHECK:       NumberOfRelocations      = 4\r
+; CHECK:       NumberOfRelocations      = 6\r
 ; CHECK:       NumberOfLineNumbers      = 0\r
 ; CHECK:       Charateristics           = 0x60500020\r
 ; CHECK:         IMAGE_SCN_CNT_CODE\r
@@ -43,28 +45,43 @@ declare i32 @puts(i8* nocapture) nounwind
 ; CHECK:         IMAGE_SCN_MEM_EXECUTE\r
 ; CHECK:         IMAGE_SCN_MEM_READ\r
 ; CHECK:       SectionData              =\r
+; CHECK:         83 EC 04 C7 04 24 00 00 - 00 00 E8 00 00 00 00 C7 |.....$..........|\r
+; CHECK:         04 24 07 00 00 00 E8 00 - 00 00 00 C7 04 24 10 00 |.$...........$..|\r
+; CHECK:         00 00 E8 00 00 00 00 31 - C0 83 C4 04 C3 00 00 00 |.......1........|\r
 ; CHECK:       Relocations              = [\r
 ; CHECK:         0 = {\r
-; CHECK:           VirtualAddress           = 0x{{[0-9A-F]+}}\r
+; CHECK:           VirtualAddress           = 0x6\r
 ; CHECK:           SymbolTableIndex         = 2\r
 ; CHECK:           Type                     = IMAGE_REL_I386_DIR32 (6)\r
 ; CHECK:           SymbolName               = .data\r
 ; CHECK:         }\r
 ; CHECK:         1 = {\r
-; CHECK:           VirtualAddress           = 0x{{[0-9A-F]+}}\r
+; CHECK:           VirtualAddress           = 0xB\r
 ; CHECK:           SymbolTableIndex         = 5\r
 ; CHECK:           Type                     = IMAGE_REL_I386_REL32 (20)\r
 ; CHECK:           SymbolName               = _printf\r
 ; CHECK:         }\r
 ; CHECK:         2 = {\r
-; CHECK:           VirtualAddress           = 0x{{[0-9A-F]+}}\r
-; CHECK:           SymbolTableIndex         = 6\r
+; CHECK:           VirtualAddress           = 0x12\r
+; CHECK:           SymbolTableIndex         = 2\r
 ; CHECK:           Type                     = IMAGE_REL_I386_DIR32 (6)\r
-; CHECK:           SymbolName               = _str\r
+; CHECK:           SymbolName               = .data\r
 ; CHECK:         }\r
 ; CHECK:         3 = {\r
-; CHECK:           VirtualAddress           = 0x{{[0-9A-F]+}}\r
-; CHECK:           SymbolTableIndex         = 7\r
+; CHECK:           VirtualAddress           = 0x17\r
+; CHECK:           SymbolTableIndex         = 6\r
+; CHECK:           Type                     = IMAGE_REL_I386_REL32 (20)\r
+; CHECK:           SymbolName               = _puts\r
+; CHECK:         }\r
+; CHECK:         4 = {\r
+; CHECK:           VirtualAddress           = 0x1E\r
+; CHECK:           SymbolTableIndex         = 2\r
+; CHECK:           Type                     = IMAGE_REL_I386_DIR32 (6)\r
+; CHECK:           SymbolName               = .data\r
+; CHECK:         }\r
+; CHECK:         5 = {\r
+; CHECK:           VirtualAddress           = 0x23\r
+; CHECK:           SymbolTableIndex         = 6\r
 ; CHECK:           Type                     = IMAGE_REL_I386_REL32 (20)\r
 ; CHECK:           SymbolName               = _puts\r
 ; CHECK:         }\r
@@ -80,14 +97,15 @@ declare i32 @puts(i8* nocapture) nounwind
 ; CHECK:       PointerToLineNumbers     = 0x0\r
 ; CHECK:       NumberOfRelocations      = 0\r
 ; CHECK:       NumberOfLineNumbers      = 0\r
-; CHECK:       Charateristics           = 0xC0100040\r
+; CHECK:       Charateristics           = 0xC0500040\r
 ; CHECK:         IMAGE_SCN_CNT_INITIALIZED_DATA\r
-; CHECK:         IMAGE_SCN_ALIGN_1BYTES\r
+; CHECK:         IMAGE_SCN_ALIGN_16BYTES\r
 ; CHECK:         IMAGE_SCN_MEM_READ\r
 ; CHECK:         IMAGE_SCN_MEM_WRITE\r
 ; CHECK:       SectionData              =\r
-; CHECK:         48 65 6C 6C 6F 20 00 57 - 6F 72 6C 64 21 00       |Hello .World!.|\r
-\r
+; CHECK:         48 65 6C 6C 6F 20 00 57 - 6F 72 6C 64 21 00 00 00 |Hello .World!...|\r
+; CHECK:         49 27 6D 20 54 68 65 20 - 4C 61 73 74 20 4C 69 6E |I'm The Last Lin|\r
+; CHECK:         65 2E 00                                          |e..|\r
 ; CHECK:       Relocations              = None\r
 ; CHECK:     }\r
 ; CHECK:   ]\r
@@ -101,7 +119,7 @@ declare i32 @puts(i8* nocapture) nounwind
 ; CHECK:       StorageClass             = IMAGE_SYM_CLASS_STATIC (3)\r
 ; CHECK:       NumberOfAuxSymbols       = 1\r
 ; CHECK:       AuxillaryData            =\r
-; CHECK:         21 00 00 00 04 00 00 00 - 00 00 00 00 01 00 00 00 |!...............|\r
+; CHECK:         30 00 00 00 06 00 00 00 - 00 00 00 00 01 00 00 00 |0...............|\r
 ; CHECK:         00 00                                             |..|\r
 \r
 ; CHECK:     }\r
@@ -114,7 +132,7 @@ declare i32 @puts(i8* nocapture) nounwind
 ; CHECK:       StorageClass             = IMAGE_SYM_CLASS_STATIC (3)\r
 ; CHECK:       NumberOfAuxSymbols       = 1\r
 ; CHECK:       AuxillaryData            =\r
-; CHECK:         0E 00 00 00 00 00 00 00 - 00 00 00 00 02 00 00 00 |................|\r
+; CHECK:         23 00 00 00 00 00 00 00 - 00 00 00 00 02 00 00 00 |#...............|\r
 ; CHECK:         00 00                                             |..|\r
 \r
 ; CHECK:     }\r
@@ -140,17 +158,6 @@ declare i32 @puts(i8* nocapture) nounwind
 \r
 ; CHECK:     }\r
 ; CHECK:     6 = {\r
-; CHECK:       Name                     = _str\r
-; CHECK:       Value                    = 7\r
-; CHECK:       SectionNumber            = 2\r
-; CHECK:       SimpleType               = IMAGE_SYM_TYPE_NULL (0)\r
-; CHECK:       ComplexType              = IMAGE_SYM_DTYPE_NULL (0)\r
-; CHECK:       StorageClass             = IMAGE_SYM_CLASS_STATIC (3)\r
-; CHECK:       NumberOfAuxSymbols       = 0\r
-; CHECK:       AuxillaryData            =\r
-\r
-; CHECK:     }\r
-; CHECK:     7 = {\r
 ; CHECK:       Name                     = _puts\r
 ; CHECK:       Value                    = 0\r
 ; CHECK:       SectionNumber            = 0\r