summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael J. Spencer <bigcheesegs@gmail.com>2010-10-05 19:48:03 +0000
committerMichael J. Spencer <bigcheesegs@gmail.com>2010-10-05 19:48:03 +0000
commiteb6e77f8cccd14cdba995ff8231f2c9faea9bfcc (patch)
treeed6b516c24a46dfe1a1edc9cad443e101311ebd8
parente452b171306ac255dedc46a49defc866a65184c6 (diff)
downloadllvm-eb6e77f8cccd14cdba995ff8231f2c9faea9bfcc.tar.gz
llvm-eb6e77f8cccd14cdba995ff8231f2c9faea9bfcc.tar.bz2
llvm-eb6e77f8cccd14cdba995ff8231f2c9faea9bfcc.tar.xz
MC-COFF: Fix (PR8278) temporary symbol relocations.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115656 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/MC/WinCOFFObjectWriter.cpp3
-rw-r--r--test/MC/COFF/symbol-fragment-offset.ll67
2 files changed, 39 insertions, 31 deletions
diff --git a/lib/MC/WinCOFFObjectWriter.cpp b/lib/MC/WinCOFFObjectWriter.cpp
index 24c517b122..a097691896 100644
--- a/lib/MC/WinCOFFObjectWriter.cpp
+++ b/lib/MC/WinCOFFObjectWriter.cpp
@@ -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;
diff --git a/test/MC/COFF/symbol-fragment-offset.ll b/test/MC/COFF/symbol-fragment-offset.ll
index a8c917e0c4..fec19250b2 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 @@ declare i32 @puts(i8* nocapture) nounwind
; 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 @@ declare i32 @puts(i8* nocapture) nounwind
; 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 @@ declare i32 @puts(i8* nocapture) nounwind
; 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 @@ declare i32 @puts(i8* nocapture) nounwind
; 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 @@ declare i32 @puts(i8* nocapture) nounwind
; 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 @@ declare i32 @puts(i8* nocapture) nounwind
; 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 @@ declare i32 @puts(i8* nocapture) nounwind
; 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