Compute the correct section for zed = foo + 1 in COFF.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 1 May 2014 13:37:57 +0000 (13:37 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 1 May 2014 13:37:57 +0000 (13:37 +0000)
This fixes pr19147.

There are a few more related issues to fix, but the testcase in the bug now
passes.

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

lib/MC/WinCOFFObjectWriter.cpp
test/MC/COFF/offset.s

index be7a9c8c0d33b76986ad18e0a57d3c301a64eaa7..5cc239dce6ed50f841216e90f79b700a9918b75b 100644 (file)
@@ -441,6 +441,7 @@ void WinCOFFObjectWriter::DefineSymbol(MCSymbolData const &SymbolData,
   } else {
     const MCSymbolData &ResSymData =
       Assembler.getSymbolData(Symbol.AliasedSymbol());
+    const MCSymbol *Base = Layout.getBaseSymbol(Symbol);
     coff_symbol->Data.Value = getSymbolValue(ResSymData, Layout);
 
     coff_symbol->Data.Type         = (ResSymData.getFlags() & 0x0000FFFF) >>  0;
@@ -454,11 +455,14 @@ void WinCOFFObjectWriter::DefineSymbol(MCSymbolData const &SymbolData,
        external ? COFF::IMAGE_SYM_CLASS_EXTERNAL : COFF::IMAGE_SYM_CLASS_STATIC;
     }
 
-    if (Symbol.isAbsolute() || Symbol.AliasedSymbol().isVariable())
+    if (!Base) {
       coff_symbol->Data.SectionNumber = COFF::IMAGE_SYM_ABSOLUTE;
-    else if (ResSymData.Fragment)
-      coff_symbol->Section =
-        SectionMap[&ResSymData.Fragment->getParent()->getSection()];
+    } else {
+      const MCSymbolData &BaseData = Assembler.getSymbolData(*Base);
+      if (BaseData.Fragment)
+        coff_symbol->Section =
+            SectionMap[&BaseData.Fragment->getParent()->getSection()];
+    }
 
     coff_symbol->MCData = &ResSymData;
   }
@@ -826,14 +830,9 @@ void WinCOFFObjectWriter::WriteObject(MCAssembler &Asm,
   Header.NumberOfSymbols = 0;
 
   for (auto & Symbol : Symbols) {
-    MCSymbolData const *SymbolData = Symbol->MCData;
-
     // Update section number & offset for symbols that have them.
-    if (SymbolData && SymbolData->Fragment) {
-      assert(Symbol->Section != nullptr);
-
+    if (Symbol->Section)
       Symbol->Data.SectionNumber = Symbol->Section->Number;
-    }
 
     if (Symbol->should_keep()) {
       MakeSymbolReal(*Symbol, Header.NumberOfSymbols++);
index 9e6f42c4dddb73c9f86c325a01f4648eac8d6472..d0d3710fcce2f8e9c9923213f9d1dcf44cf34403 100644 (file)
@@ -11,7 +11,7 @@ test1_zed = test1_foo + 1
 // CHECK:      Symbol {
 // CHECK:        Name: test1_zed
 // CHECK-NEXT:   Value: 1
-// CHECK-NEXT:   Section:
+// CHECK-NEXT:   Section: .data
 // CHECK-NEXT:   BaseType: Null
 // CHECK-NEXT:   ComplexType: Null
 // CHECK-NEXT:   StorageClass: External