MC: Fix symbol fragment offsets in COFF.
authorMichael J. Spencer <bigcheesegs@gmail.com>
Tue, 3 Aug 2010 04:43:24 +0000 (04:43 +0000)
committerMichael J. Spencer <bigcheesegs@gmail.com>
Tue, 3 Aug 2010 04:43:24 +0000 (04:43 +0000)
Patch by Cameron Esfahani!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@110100 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/WinCOFFObjectWriter.cpp
test/mc/COFF/symbol-fragment-offset.ll [new file with mode: 0644]

index 4fb806e8b85aac0cd0188aca7f68fb43a8753fc5..1a020ea80f759acb19d0e1ea956ec641701f2b0f 100644 (file)
@@ -617,7 +617,8 @@ void WinCOFFObjectWriter::WriteObject(const MCAssembler &Asm,
       COFFSection *coff_section = SectionMap[SymbolData->Fragment->getParent()];
 
       coff_symbol->Data.SectionNumber = coff_section->Number;
-      coff_symbol->Data.Value = Layout.getFragmentOffset(SymbolData->Fragment);
+      coff_symbol->Data.Value = Layout.getFragmentOffset(SymbolData->Fragment)
+                              + SymbolData->Offset;
     }
 
     // Update auxiliary symbol info.
diff --git a/test/mc/COFF/symbol-fragment-offset.ll b/test/mc/COFF/symbol-fragment-offset.ll
new file mode 100644 (file)
index 0000000..bf22c4e
--- /dev/null
@@ -0,0 +1,182 @@
+; RUN: llc -filetype=obj %s -o %t\r
+; RUN: coff-dump.py %abs_tmp | FileCheck %s\r
+\r
+; ModuleID = 'coff-fragment-test.c'\r
+target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32"\r
+target triple = "i686-pc-win32"\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
+\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
+  ret i32 0\r
+}\r
+\r
+declare i32 @printf(i8* nocapture, ...) nounwind\r
+\r
+declare i32 @puts(i8* nocapture) nounwind\r
+\r
+; CHECK: {\r
+; CHECK:   MachineType              = IMAGE_FILE_MACHINE_I386 (0x14C)\r
+; CHECK:   NumberOfSections         = 2\r
+; CHECK:   TimeDateStamp            = {{[0-9]+}}\r
+; CHECK:   PointerToSymbolTable     = 0xBB\r
+; CHECK:   NumberOfSymbols          = 9\r
+; CHECK:   SizeOfOptionalHeader     = 0\r
+; CHECK:   Characteristics          = 0x0\r
+; CHECK:   Sections                 = [\r
+; CHECK:     0 = {\r
+; CHECK:       Name                     = .text\r
+; CHECK:       VirtualSize              = 0\r
+; CHECK:       VirtualAddress           = 0\r
+; CHECK:       SizeOfRawData            = 33\r
+; CHECK:       PointerToRawData         = 0x64\r
+; CHECK:       PointerToRelocations     = 0x85\r
+; CHECK:       PointerToLineNumbers     = 0x0\r
+; CHECK:       NumberOfRelocations      = 4\r
+; CHECK:       NumberOfLineNumbers      = 0\r
+; CHECK:       Charateristics           = 0x60500020\r
+; CHECK:         IMAGE_SCN_CNT_CODE\r
+; CHECK:         IMAGE_SCN_ALIGN_16BYTES\r
+; 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 00 00 00 00 E8 00 - 00 00 00 31 C0 83 C4 04 |.$.........1....|\r
+; CHECK:         C3                                                |.|\r
+\r
+; CHECK:       Relocations              = [\r
+; CHECK:         0 = {\r
+; CHECK:           VirtualAddress           = 0x6\r
+; CHECK:           SymbolTableIndex         = 5\r
+; CHECK:           Type                     = IMAGE_REL_I386_DIR32 (6)\r
+; CHECK:           SymbolName               = _main\r
+; CHECK:         }\r
+; CHECK:         1 = {\r
+; CHECK:           VirtualAddress           = 0xB\r
+; CHECK:           SymbolTableIndex         = 6\r
+; CHECK:           Type                     = IMAGE_REL_I386_REL32 (20)\r
+; CHECK:           SymbolName               = L_.str\r
+; CHECK:         }\r
+; CHECK:         2 = {\r
+; CHECK:           VirtualAddress           = 0x12\r
+; CHECK:           SymbolTableIndex         = 7\r
+; CHECK:           Type                     = IMAGE_REL_I386_DIR32 (6)\r
+; CHECK:           SymbolName               = _printf\r
+; CHECK:         }\r
+; CHECK:         3 = {\r
+; CHECK:           VirtualAddress           = 0x17\r
+; CHECK:           SymbolTableIndex         = 8\r
+; CHECK:           Type                     = IMAGE_REL_I386_REL32 (20)\r
+; CHECK:           SymbolName               = _str\r
+; CHECK:         }\r
+; CHECK:       ]\r
+; CHECK:     }\r
+; CHECK:     1 = {\r
+; CHECK:       Name                     = .data\r
+; CHECK:       VirtualSize              = 0\r
+; CHECK:       VirtualAddress           = 0\r
+; CHECK:       SizeOfRawData            = 14\r
+; CHECK:       PointerToRawData         = 0xAD\r
+; CHECK:       PointerToRelocations     = 0x0\r
+; CHECK:       PointerToLineNumbers     = 0x0\r
+; CHECK:       NumberOfRelocations      = 0\r
+; CHECK:       NumberOfLineNumbers      = 0\r
+; CHECK:       Charateristics           = 0xC0100040\r
+; CHECK:         IMAGE_SCN_CNT_INITIALIZED_DATA\r
+; CHECK:         IMAGE_SCN_ALIGN_1BYTES\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:       Relocations              = None\r
+; CHECK:     }\r
+; CHECK:   ]\r
+; CHECK:   Symbols                  = [\r
+; CHECK:     0 = {\r
+; CHECK:       Name                     = .text\r
+; CHECK:       Value                    = 0\r
+; CHECK:       SectionNumber            = 1\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       = 1\r
+; CHECK:       AuxillaryData            =\r
+; CHECK:         21 00 00 00 04 00 00 00 - 00 00 00 00 01 00 00 00 |!...............|\r
+; CHECK:         00 00                                             |..|\r
+\r
+; CHECK:     }\r
+; CHECK:     1 = {\r
+; CHECK:       Name                     = .data\r
+; CHECK:       Value                    = 0\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       = 1\r
+; CHECK:       AuxillaryData            =\r
+; CHECK:         0E 00 00 00 00 00 00 00 - 00 00 00 00 02 00 00 00 |................|\r
+; CHECK:         00 00                                             |..|\r
+\r
+; CHECK:     }\r
+; CHECK:     2 = {\r
+; CHECK:       Name                     = _main\r
+; CHECK:       Value                    = 0\r
+; CHECK:       SectionNumber            = 1\r
+; CHECK:       SimpleType               = unknown (32)\r
+; CHECK:       ComplexType              = IMAGE_SYM_DTYPE_NULL (0)\r
+; CHECK:       StorageClass             = IMAGE_SYM_CLASS_EXTERNAL (2)\r
+; CHECK:       NumberOfAuxSymbols       = 0\r
+; CHECK:       AuxillaryData            =\r
+\r
+; CHECK:     }\r
+; CHECK:     3 = {\r
+; CHECK:       Name                     = L_.str\r
+; CHECK:       Value                    = 0\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:     4 = {\r
+; CHECK:       Name                     = _printf\r
+; CHECK:       Value                    = 0\r
+; CHECK:       SectionNumber            = 0\r
+; CHECK:       SimpleType               = IMAGE_SYM_TYPE_NULL (0)\r
+; CHECK:       ComplexType              = IMAGE_SYM_DTYPE_NULL (0)\r
+; CHECK:       StorageClass             = IMAGE_SYM_CLASS_EXTERNAL (2)\r
+; CHECK:       NumberOfAuxSymbols       = 0\r
+; CHECK:       AuxillaryData            =\r
+\r
+; CHECK:     }\r
+; CHECK:     5 = {\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:     6 = {\r
+; CHECK:       Name                     = _puts\r
+; CHECK:       Value                    = 0\r
+; CHECK:       SectionNumber            = 0\r
+; CHECK:       SimpleType               = IMAGE_SYM_TYPE_NULL (0)\r
+; CHECK:       ComplexType              = IMAGE_SYM_DTYPE_NULL (0)\r
+; CHECK:       StorageClass             = IMAGE_SYM_CLASS_EXTERNAL (2)\r
+; CHECK:       NumberOfAuxSymbols       = 0\r
+; CHECK:       AuxillaryData            =\r
+\r
+; CHECK:     }\r
+; CHECK:   ]\r
+; CHECK: }\r