diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2014-05-01 13:37:57 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2014-05-01 13:37:57 +0000 |
| commit | 575f79a409ee3849def691fbffb693f0afec6b4d (patch) | |
| tree | 0343706585e5097694010d01ed36c496adbc73bf | |
| parent | 64568ca18ab1acae40ebb3f93f815727a58489a3 (diff) | |
| download | bcm5719-llvm-575f79a409ee3849def691fbffb693f0afec6b4d.tar.gz bcm5719-llvm-575f79a409ee3849def691fbffb693f0afec6b4d.zip | |
Compute the correct section for zed = foo + 1 in COFF.
This fixes pr19147.
There are a few more related issues to fix, but the testcase in the bug now
passes.
llvm-svn: 207763
| -rw-r--r-- | llvm/lib/MC/WinCOFFObjectWriter.cpp | 19 | ||||
| -rw-r--r-- | llvm/test/MC/COFF/offset.s | 2 |
2 files changed, 10 insertions, 11 deletions
diff --git a/llvm/lib/MC/WinCOFFObjectWriter.cpp b/llvm/lib/MC/WinCOFFObjectWriter.cpp index be7a9c8c0d3..5cc239dce6e 100644 --- a/llvm/lib/MC/WinCOFFObjectWriter.cpp +++ b/llvm/lib/MC/WinCOFFObjectWriter.cpp @@ -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++); diff --git a/llvm/test/MC/COFF/offset.s b/llvm/test/MC/COFF/offset.s index 9e6f42c4ddd..d0d3710fcce 100644 --- a/llvm/test/MC/COFF/offset.s +++ b/llvm/test/MC/COFF/offset.s @@ -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 |

