summaryrefslogtreecommitdiff
path: root/lib/MC
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2014-05-01 13:37:57 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2014-05-01 13:37:57 +0000
commit23d27597a343d3be78270e1cc6a65e3a0cc00a81 (patch)
tree38abd965908ddcd9e561d97ac2dd5591bb9a1bfd /lib/MC
parentf2b88ce2fd0d204b981f2c6cc70f8112f563fd7c (diff)
downloadllvm-23d27597a343d3be78270e1cc6a65e3a0cc00a81.tar.gz
llvm-23d27597a343d3be78270e1cc6a65e3a0cc00a81.tar.bz2
llvm-23d27597a343d3be78270e1cc6a65e3a0cc00a81.tar.xz
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207763 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC')
-rw-r--r--lib/MC/WinCOFFObjectWriter.cpp19
1 files changed, 9 insertions, 10 deletions
diff --git a/lib/MC/WinCOFFObjectWriter.cpp b/lib/MC/WinCOFFObjectWriter.cpp
index be7a9c8c0d..5cc239dce6 100644
--- a/lib/MC/WinCOFFObjectWriter.cpp
+++ b/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++);