mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-09 11:25:55 +00:00
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
This commit is contained in:
@@ -441,6 +441,7 @@ void WinCOFFObjectWriter::DefineSymbol(MCSymbolData const &SymbolData,
|
|||||||
} else {
|
} else {
|
||||||
const MCSymbolData &ResSymData =
|
const MCSymbolData &ResSymData =
|
||||||
Assembler.getSymbolData(Symbol.AliasedSymbol());
|
Assembler.getSymbolData(Symbol.AliasedSymbol());
|
||||||
|
const MCSymbol *Base = Layout.getBaseSymbol(Symbol);
|
||||||
coff_symbol->Data.Value = getSymbolValue(ResSymData, Layout);
|
coff_symbol->Data.Value = getSymbolValue(ResSymData, Layout);
|
||||||
|
|
||||||
coff_symbol->Data.Type = (ResSymData.getFlags() & 0x0000FFFF) >> 0;
|
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;
|
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;
|
coff_symbol->Data.SectionNumber = COFF::IMAGE_SYM_ABSOLUTE;
|
||||||
else if (ResSymData.Fragment)
|
} else {
|
||||||
coff_symbol->Section =
|
const MCSymbolData &BaseData = Assembler.getSymbolData(*Base);
|
||||||
SectionMap[&ResSymData.Fragment->getParent()->getSection()];
|
if (BaseData.Fragment)
|
||||||
|
coff_symbol->Section =
|
||||||
|
SectionMap[&BaseData.Fragment->getParent()->getSection()];
|
||||||
|
}
|
||||||
|
|
||||||
coff_symbol->MCData = &ResSymData;
|
coff_symbol->MCData = &ResSymData;
|
||||||
}
|
}
|
||||||
@@ -826,14 +830,9 @@ void WinCOFFObjectWriter::WriteObject(MCAssembler &Asm,
|
|||||||
Header.NumberOfSymbols = 0;
|
Header.NumberOfSymbols = 0;
|
||||||
|
|
||||||
for (auto & Symbol : Symbols) {
|
for (auto & Symbol : Symbols) {
|
||||||
MCSymbolData const *SymbolData = Symbol->MCData;
|
|
||||||
|
|
||||||
// Update section number & offset for symbols that have them.
|
// Update section number & offset for symbols that have them.
|
||||||
if (SymbolData && SymbolData->Fragment) {
|
if (Symbol->Section)
|
||||||
assert(Symbol->Section != nullptr);
|
|
||||||
|
|
||||||
Symbol->Data.SectionNumber = Symbol->Section->Number;
|
Symbol->Data.SectionNumber = Symbol->Section->Number;
|
||||||
}
|
|
||||||
|
|
||||||
if (Symbol->should_keep()) {
|
if (Symbol->should_keep()) {
|
||||||
MakeSymbolReal(*Symbol, Header.NumberOfSymbols++);
|
MakeSymbolReal(*Symbol, Header.NumberOfSymbols++);
|
||||||
|
@@ -11,7 +11,7 @@ test1_zed = test1_foo + 1
|
|||||||
// CHECK: Symbol {
|
// CHECK: Symbol {
|
||||||
// CHECK: Name: test1_zed
|
// CHECK: Name: test1_zed
|
||||||
// CHECK-NEXT: Value: 1
|
// CHECK-NEXT: Value: 1
|
||||||
// CHECK-NEXT: Section:
|
// CHECK-NEXT: Section: .data
|
||||||
// CHECK-NEXT: BaseType: Null
|
// CHECK-NEXT: BaseType: Null
|
||||||
// CHECK-NEXT: ComplexType: Null
|
// CHECK-NEXT: ComplexType: Null
|
||||||
// CHECK-NEXT: StorageClass: External
|
// CHECK-NEXT: StorageClass: External
|
||||||
|
Reference in New Issue
Block a user