mirror of
https://github.com/ksherlock/x65.git
synced 2024-12-27 13:29:18 +00:00
Fixed x65 symbol files that broke with source debug changes
This commit is contained in:
parent
74d517e9d3
commit
5339e5c789
23
x65.cpp
23
x65.cpp
@ -1582,6 +1582,7 @@ struct MapSymbol {
|
|||||||
strref name; // string name
|
strref name; // string name
|
||||||
int value;
|
int value;
|
||||||
int16_t section;
|
int16_t section;
|
||||||
|
int16_t orig_section;
|
||||||
bool local; // local variables
|
bool local; // local variables
|
||||||
};
|
};
|
||||||
typedef std::vector<struct MapSymbol> MapSymbolArray;
|
typedef std::vector<struct MapSymbol> MapSymbolArray;
|
||||||
@ -1777,7 +1778,7 @@ public:
|
|||||||
pairArray<uint32_t, Macro> macros;
|
pairArray<uint32_t, Macro> macros;
|
||||||
pairArray<uint32_t, LabelPool> labelPools;
|
pairArray<uint32_t, LabelPool> labelPools;
|
||||||
pairArray<uint32_t, LabelStruct> labelStructs;
|
pairArray<uint32_t, LabelStruct> labelStructs;
|
||||||
pairArray<uint32_t, strref> xdefs; // labels matching xdef names will be marked as external
|
pairArray<uint32_t, strref> xdefs; // labels matching xdef names will be marked as external
|
||||||
|
|
||||||
std::vector<char*> source_files; // all source files encountered while assembling. referenced by source level debugging
|
std::vector<char*> source_files; // all source files encountered while assembling. referenced by source level debugging
|
||||||
std::vector<LateEval> lateEval;
|
std::vector<LateEval> lateEval;
|
||||||
@ -2026,7 +2027,7 @@ public:
|
|||||||
|
|
||||||
// constructor
|
// constructor
|
||||||
Asm() : opcode_table(opcodes_6502), opcode_count(num_opcodes_6502), num_instructions(0),
|
Asm() : opcode_table(opcodes_6502), opcode_count(num_opcodes_6502), num_instructions(0),
|
||||||
cpu(CPU_6502), list_cpu(CPU_6502) {
|
cpu(CPU_6502), list_cpu(CPU_6502), lastEvalSection(-1) {
|
||||||
Cleanup(); localLabels.reserve(256); loadedData.reserve(16); lateEval.reserve(64); }
|
Cleanup(); localLabels.reserve(256); loadedData.reserve(16); lateEval.reserve(64); }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -2900,7 +2901,9 @@ StatusCode Asm::MergeSections(int section_id, int section_merge) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!s.IsRelativeSection()) { LinkLabelsToAddress(section_merge, -1, m.start_address); }
|
if(!s.IsRelativeSection()) {
|
||||||
|
LinkLabelsToAddress(section_merge, -1, s.start_address);
|
||||||
|
}
|
||||||
|
|
||||||
// go through all labels referencing merging section
|
// go through all labels referencing merging section
|
||||||
for (uint32_t i = 0; i<labels.count(); i++) {
|
for (uint32_t i = 0; i<labels.count(); i++) {
|
||||||
@ -4478,7 +4481,8 @@ void Asm::LabelAdded(Label *pLabel, bool local) {
|
|||||||
}
|
}
|
||||||
MapSymbol sym;
|
MapSymbol sym;
|
||||||
sym.name = pLabel->label_name;
|
sym.name = pLabel->label_name;
|
||||||
sym.section = (int16_t)(pLabel->section == -1 ? pLabel->orig_section : pLabel->section);
|
sym.section = (int16_t)pLabel->section;
|
||||||
|
sym.orig_section = (int16_t)pLabel->orig_section;
|
||||||
sym.value = pLabel->value;
|
sym.value = pLabel->value;
|
||||||
sym.local = local;
|
sym.local = local;
|
||||||
pLabel->mapIndex = pLabel->evaluated ? -1 : (int)map.size();
|
pLabel->mapIndex = pLabel->evaluated ? -1 : (int)map.size();
|
||||||
@ -7019,7 +7023,7 @@ bool Asm::SourceDebugExport(strref filename) {
|
|||||||
if (i->name.same_str("debugbreak")) { continue; }
|
if (i->name.same_str("debugbreak")) { continue; }
|
||||||
uint32_t value = (uint32_t)i->value;
|
uint32_t value = (uint32_t)i->value;
|
||||||
strref sectName;
|
strref sectName;
|
||||||
uint16_t section = i->section;
|
uint16_t section = i->orig_section;
|
||||||
if (size_t(section) < allSections.size()) {
|
if (size_t(section) < allSections.size()) {
|
||||||
value += allSections[section].start_address;
|
value += allSections[section].start_address;
|
||||||
sectName = allSections[section].name;
|
sectName = allSections[section].name;
|
||||||
@ -7440,7 +7444,8 @@ struct ObjFileLateEval {
|
|||||||
struct ObjFileMapSymbol {
|
struct ObjFileMapSymbol {
|
||||||
struct ObjFileStr name; // symbol name
|
struct ObjFileStr name; // symbol name
|
||||||
int value;
|
int value;
|
||||||
int16_t section;
|
int16_t section; // address relative to this section
|
||||||
|
int16_t orig_section; // seciton label originated from
|
||||||
bool local; // local labels are probably needed
|
bool local; // local labels are probably needed
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -7686,6 +7691,7 @@ StatusCode Asm::WriteObjectFile(strref filename) {
|
|||||||
ms.value = mi->value;
|
ms.value = mi->value;
|
||||||
ms.local = mi->local;
|
ms.local = mi->local;
|
||||||
ms.section = mi->section >= 0 ? aRemapSects[mi->section] : -1;
|
ms.section = mi->section >= 0 ? aRemapSects[mi->section] : -1;
|
||||||
|
ms.orig_section = mi->orig_section >= 0 ? aRemapSects[mi->orig_section] : -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7870,6 +7876,7 @@ StatusCode Asm::ReadObjectFile(strref filename, int link_to_section)
|
|||||||
MapSymbol sym;
|
MapSymbol sym;
|
||||||
sym.name = m.name.offs>=0 ? strref(str_pool + m.name.offs) : strref();
|
sym.name = m.name.offs>=0 ? strref(str_pool + m.name.offs) : strref();
|
||||||
sym.section = m.section >=0 ? aSctRmp[m.section] : m.section;
|
sym.section = m.section >=0 ? aSctRmp[m.section] : m.section;
|
||||||
|
sym.orig_section = m.orig_section >= 0 ? aSctRmp[m.orig_section] : m.orig_section;
|
||||||
sym.value = m.value;
|
sym.value = m.value;
|
||||||
sym.local = m.local;
|
sym.local = m.local;
|
||||||
map.push_back(sym);
|
map.push_back(sym);
|
||||||
@ -8442,7 +8449,9 @@ int main(int argc, char **argv) {
|
|||||||
bool wasLocal = false;
|
bool wasLocal = false;
|
||||||
for (MapSymbolArray::iterator i = assembler.map.begin(); i!=assembler.map.end(); ++i) {
|
for (MapSymbolArray::iterator i = assembler.map.begin(); i!=assembler.map.end(); ++i) {
|
||||||
uint32_t value = (uint32_t)i->value;
|
uint32_t value = (uint32_t)i->value;
|
||||||
if (size_t(i->section) < assembler.allSections.size()) { value += assembler.allSections[i->section].start_address; }
|
if (size_t(i->section) < assembler.allSections.size()) {
|
||||||
|
value += assembler.allSections[i->section].start_address;
|
||||||
|
}
|
||||||
fprintf(f, "%s.label " STRREF_FMT " = $%04x", wasLocal==i->local ? "\n" :
|
fprintf(f, "%s.label " STRREF_FMT " = $%04x", wasLocal==i->local ? "\n" :
|
||||||
(i->local ? " {\n" : "\n}\n"), STRREF_ARG(i->name), value);
|
(i->local ? " {\n" : "\n}\n"), STRREF_ARG(i->name), value);
|
||||||
wasLocal = i->local;
|
wasLocal = i->local;
|
||||||
|
Loading…
Reference in New Issue
Block a user