OSDN Git Service

COFF: handle "undef - ." expressions.
authorRafael Espindola <rafael.espindola@gmail.com>
Fri, 23 Jun 2017 02:15:56 +0000 (02:15 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Fri, 23 Jun 2017 02:15:56 +0000 (02:15 +0000)
This is another thing that the ELF implementation can do but is
missing from COFF.

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

lib/MC/WinCOFFObjectWriter.cpp
test/MC/COFF/bad-expr.s
test/MC/COFF/cross-section-relative.s

index 08b349c..8d8c5ff 100644 (file)
@@ -746,17 +746,6 @@ void WinCOFFObjectWriter::recordRelocation(
       return;
     }
 
-    if (!A.getFragment()) {
-      Asm.getContext().reportError(
-          Fixup.getLoc(),
-          Twine("symbol '") + A.getName() +
-              "' can not be undefined in a subtraction expression");
-      return;
-    }
-
-    assert(&A.getSection() != &B->getSection() &&
-           "This doesn't need a relocation");
-
     // Offset of the symbol in the section
     int64_t OffsetOfB = Layout.getSymbolOffset(*B);
 
index 9a212d9..ecbdd41 100644 (file)
@@ -1,9 +1,7 @@
 // RUN: not llvm-mc -filetype=obj -triple i386-pc-win32 %s 2>&1 | FileCheck %s
 
 // CHECK: symbol '__ImageBase' can not be undefined in a subtraction expression
-// CHECK: symbol '__ImageBase' can not be undefined in a subtraction expression
 
         .data
 _x:
         .long   _x-__ImageBase
-        .long   __ImageBase-_x
index b47b7f4..27a8cc2 100644 (file)
@@ -58,17 +58,18 @@ t6:
        .long   g3-(t6+16)
        .zero   4
 
+.long foobar - .
 
 // READOBJ:  Section {
 // READOBJ:    Number: 5
 // READOBJ:    Name: .fix (2E 66 69 78 00 00 00 00)
 // READOBJ:    VirtualSize: 0x0
 // READOBJ:    VirtualAddress: 0x0
-// READOBJ:    RawDataSize: 56
+// READOBJ:    RawDataSize:
 // READOBJ:    PointerToRawData: 0xEC
-// READOBJ:    PointerToRelocations: 0x124
+// READOBJ:    PointerToRelocations:
 // READOBJ:    PointerToLineNumbers: 0x0
-// READOBJ:    RelocationCount: 6
+// READOBJ:    RelocationCount:
 // READOBJ:    LineNumberCount: 0
 // READOBJ:    Characteristics [ (0xC0500040)
 // READOBJ:      IMAGE_SCN_ALIGN_16BYTES (0x500000)
@@ -80,7 +81,7 @@ t6:
 // READOBJ:      0000: 08000000 00000000 04000000 00000000  |................|
 // READOBJ:      0010: 00000000 00000000 04000000 00000000  |................|
 // READOBJ:      0020: 01020000 00000000 00010000 00000000  |................|
-// READOBJ:      0030: 04000000 00000000                    |........|
+// READOBJ:      0030: 04000000 00000000 04000000           |............|
 // READOBJ:    )
 // READOBJ:  }
 // READOBJ:  ]
@@ -116,3 +117,8 @@ t6:
 // READOBJ:      Type: IMAGE_REL_AMD64_REL32 (4)
 // READOBJ:      Symbol: g3
 // READOBJ:    }
+// READOBJ:    Relocation {
+// READOBJ:      Offset: 0x38
+// READOBJ:      Type: IMAGE_REL_AMD64_REL32 (4)
+// READOBJ:      Symbol: foobar
+// READOBJ:    }