MC-COFF: Fix (PR8278) temporary symbol relocations.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115656 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/MC/WinCOFFObjectWriter.cpp b/lib/MC/WinCOFFObjectWriter.cpp
index 24c517b..a097691 100644
--- a/lib/MC/WinCOFFObjectWriter.cpp
+++ b/lib/MC/WinCOFFObjectWriter.cpp
@@ -660,7 +660,8 @@
   // 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;
 
diff --git a/test/MC/COFF/symbol-fragment-offset.ll b/test/MC/COFF/symbol-fragment-offset.ll
index a8c917e..fec1925 100644
--- a/test/MC/COFF/symbol-fragment-offset.ll
+++ b/test/MC/COFF/symbol-fragment-offset.ll
@@ -4,13 +4,15 @@
 ; RUN: llc -filetype=obj -mtriple i686-pc-win32 %s -o - | coff-dump.py | FileCheck %s

 ; RUN: llc -filetype=obj -mtriple x86_64-pc-win32 %s -o %t

 

-@.str = private constant [7 x i8] c"Hello \00"    ; <[7 x i8]*> [#uses=1]

-@str = internal constant [7 x i8] c"World!\00"    ; <[7 x i8]*> [#uses=1]

+@.str0 = private constant [7 x i8] c"Hello \00"    ; <[7 x i8]*> [#uses=1]

+@.str1 = private constant [7 x i8] c"World!\00"    ; <[7 x i8]*> [#uses=1]

+@.str2 = private constant [19 x i8] c"I'm The Last Line.\00"

 

 define i32 @main() nounwind {

 entry:

-  %call = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([7 x i8]* @.str, i32 0, i32 0)) nounwind ; <i32> [#uses=0]

-  %puts = tail call i32 @puts(i8* getelementptr inbounds ([7 x i8]* @str, i32 0, i32 0)) ; <i32> [#uses=0]

+  %call = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([7 x i8]* @.str0, i32 0, i32 0)) nounwind ; <i32> [#uses=0]

+  %puts0 = tail call i32 @puts(i8* getelementptr inbounds ([7 x i8]* @.str1, i32 0, i32 0)) ; <i32> [#uses=0]

+  %puts1 = tail call i32 @puts(i8* getelementptr inbounds ([19 x i8]* @.str2, i32 0, i32 0)) ; <i32> [#uses=0]

   ret i32 0

 }

 

@@ -23,7 +25,7 @@
 ; CHECK:   NumberOfSections         = 2

 ; CHECK:   TimeDateStamp            = {{[0-9]+}}

 ; CHECK:   PointerToSymbolTable     = 0x{{[0-9A-F]+}}

-; CHECK:   NumberOfSymbols          = 8

+; CHECK:   NumberOfSymbols          = 7

 ; CHECK:   SizeOfOptionalHeader     = 0

 ; CHECK:   Characteristics          = 0x0

 ; CHECK:   Sections                 = [

@@ -35,7 +37,7 @@
 ; CHECK:       PointerToRawData         = 0x{{[0-9A-F]+}}

 ; CHECK:       PointerToRelocations     = 0x{{[0-9A-F]+}}

 ; CHECK:       PointerToLineNumbers     = 0x0

-; CHECK:       NumberOfRelocations      = 4

+; CHECK:       NumberOfRelocations      = 6

 ; CHECK:       NumberOfLineNumbers      = 0

 ; CHECK:       Charateristics           = 0x60500020

 ; CHECK:         IMAGE_SCN_CNT_CODE

@@ -43,28 +45,43 @@
 ; CHECK:         IMAGE_SCN_MEM_EXECUTE

 ; CHECK:         IMAGE_SCN_MEM_READ

 ; CHECK:       SectionData              =

+; CHECK:         83 EC 04 C7 04 24 00 00 - 00 00 E8 00 00 00 00 C7 |.....$..........|

+; CHECK:         04 24 07 00 00 00 E8 00 - 00 00 00 C7 04 24 10 00 |.$...........$..|

+; CHECK:         00 00 E8 00 00 00 00 31 - C0 83 C4 04 C3 00 00 00 |.......1........|

 ; CHECK:       Relocations              = [

 ; CHECK:         0 = {

-; CHECK:           VirtualAddress           = 0x{{[0-9A-F]+}}

+; CHECK:           VirtualAddress           = 0x6

 ; CHECK:           SymbolTableIndex         = 2

 ; CHECK:           Type                     = IMAGE_REL_I386_DIR32 (6)

 ; CHECK:           SymbolName               = .data

 ; CHECK:         }

 ; CHECK:         1 = {

-; CHECK:           VirtualAddress           = 0x{{[0-9A-F]+}}

+; CHECK:           VirtualAddress           = 0xB

 ; CHECK:           SymbolTableIndex         = 5

 ; CHECK:           Type                     = IMAGE_REL_I386_REL32 (20)

 ; CHECK:           SymbolName               = _printf

 ; CHECK:         }

 ; CHECK:         2 = {

-; CHECK:           VirtualAddress           = 0x{{[0-9A-F]+}}

-; CHECK:           SymbolTableIndex         = 6

+; CHECK:           VirtualAddress           = 0x12

+; CHECK:           SymbolTableIndex         = 2

 ; CHECK:           Type                     = IMAGE_REL_I386_DIR32 (6)

-; CHECK:           SymbolName               = _str

+; CHECK:           SymbolName               = .data

 ; CHECK:         }

 ; CHECK:         3 = {

-; CHECK:           VirtualAddress           = 0x{{[0-9A-F]+}}

-; CHECK:           SymbolTableIndex         = 7

+; CHECK:           VirtualAddress           = 0x17

+; CHECK:           SymbolTableIndex         = 6

+; CHECK:           Type                     = IMAGE_REL_I386_REL32 (20)

+; CHECK:           SymbolName               = _puts

+; CHECK:         }

+; CHECK:         4 = {

+; CHECK:           VirtualAddress           = 0x1E

+; CHECK:           SymbolTableIndex         = 2

+; CHECK:           Type                     = IMAGE_REL_I386_DIR32 (6)

+; CHECK:           SymbolName               = .data

+; CHECK:         }

+; CHECK:         5 = {

+; CHECK:           VirtualAddress           = 0x23

+; CHECK:           SymbolTableIndex         = 6

 ; CHECK:           Type                     = IMAGE_REL_I386_REL32 (20)

 ; CHECK:           SymbolName               = _puts

 ; CHECK:         }

@@ -80,14 +97,15 @@
 ; CHECK:       PointerToLineNumbers     = 0x0

 ; CHECK:       NumberOfRelocations      = 0

 ; CHECK:       NumberOfLineNumbers      = 0

-; CHECK:       Charateristics           = 0xC0100040

+; CHECK:       Charateristics           = 0xC0500040

 ; CHECK:         IMAGE_SCN_CNT_INITIALIZED_DATA

-; CHECK:         IMAGE_SCN_ALIGN_1BYTES

+; CHECK:         IMAGE_SCN_ALIGN_16BYTES

 ; CHECK:         IMAGE_SCN_MEM_READ

 ; CHECK:         IMAGE_SCN_MEM_WRITE

 ; CHECK:       SectionData              =

-; CHECK:         48 65 6C 6C 6F 20 00 57 - 6F 72 6C 64 21 00       |Hello .World!.|

-

+; CHECK:         48 65 6C 6C 6F 20 00 57 - 6F 72 6C 64 21 00 00 00 |Hello .World!...|

+; CHECK:         49 27 6D 20 54 68 65 20 - 4C 61 73 74 20 4C 69 6E |I'm The Last Lin|

+; CHECK:         65 2E 00                                          |e..|

 ; CHECK:       Relocations              = None

 ; CHECK:     }

 ; CHECK:   ]

@@ -101,7 +119,7 @@
 ; CHECK:       StorageClass             = IMAGE_SYM_CLASS_STATIC (3)

 ; CHECK:       NumberOfAuxSymbols       = 1

 ; CHECK:       AuxillaryData            =

-; CHECK:         21 00 00 00 04 00 00 00 - 00 00 00 00 01 00 00 00 |!...............|

+; CHECK:         30 00 00 00 06 00 00 00 - 00 00 00 00 01 00 00 00 |0...............|

 ; CHECK:         00 00                                             |..|

 

 ; CHECK:     }

@@ -114,7 +132,7 @@
 ; CHECK:       StorageClass             = IMAGE_SYM_CLASS_STATIC (3)

 ; CHECK:       NumberOfAuxSymbols       = 1

 ; CHECK:       AuxillaryData            =

-; CHECK:         0E 00 00 00 00 00 00 00 - 00 00 00 00 02 00 00 00 |................|

+; CHECK:         23 00 00 00 00 00 00 00 - 00 00 00 00 02 00 00 00 |#...............|

 ; CHECK:         00 00                                             |..|

 

 ; CHECK:     }

@@ -140,17 +158,6 @@
 

 ; CHECK:     }

 ; CHECK:     6 = {

-; CHECK:       Name                     = _str

-; CHECK:       Value                    = 7

-; CHECK:       SectionNumber            = 2

-; CHECK:       SimpleType               = IMAGE_SYM_TYPE_NULL (0)

-; CHECK:       ComplexType              = IMAGE_SYM_DTYPE_NULL (0)

-; CHECK:       StorageClass             = IMAGE_SYM_CLASS_STATIC (3)

-; CHECK:       NumberOfAuxSymbols       = 0

-; CHECK:       AuxillaryData            =

-

-; CHECK:     }

-; CHECK:     7 = {

 ; CHECK:       Name                     = _puts

 ; CHECK:       Value                    = 0

 ; CHECK:       SectionNumber            = 0