fix register reassignment if name doesn't appear first in file

This commit is contained in:
Martin Michelsen
2024-06-13 23:38:20 -07:00
parent 3dc106b42e
commit 27ecab2993
+18 -10
View File
@@ -1782,6 +1782,10 @@ struct RegisterAssigner {
shared_ptr<Register> prev; shared_ptr<Register> prev;
shared_ptr<Register> next; shared_ptr<Register> next;
unordered_set<size_t> offsets; unordered_set<size_t> offsets;
std::string str() const {
return string_printf("Register(%p, name=\"%s\", number=%hd)", this, this->name.c_str(), this->number);
}
}; };
~RegisterAssigner() { ~RegisterAssigner() {
@@ -1798,17 +1802,20 @@ struct RegisterAssigner {
} }
shared_ptr<Register> get_or_create(const string& name, int16_t number) { shared_ptr<Register> get_or_create(const string& name, int16_t number) {
shared_ptr<Register> reg; if ((number < -1) || (number >= 0x100)) {
try { throw runtime_error("invalid register number");
if (!name.empty()) {
reg = this->named_regs.at(name);
} else if (number >= 0 && number < 0x100) {
reg = this->numbered_regs.at(number);
} else {
throw runtime_error("invalid register name or number");
} }
shared_ptr<Register> reg;
if (!name.empty()) {
try {
reg = this->named_regs.at(name);
} catch (const out_of_range&) { } catch (const out_of_range&) {
} }
}
if (!reg && number >= 0) {
reg = this->numbered_regs.at(number);
}
if (!reg) { if (!reg) {
reg = make_shared<Register>(); reg = make_shared<Register>();
@@ -1817,8 +1824,9 @@ struct RegisterAssigner {
if (number >= 0) { if (number >= 0) {
if (reg->number < 0) { if (reg->number < 0) {
reg->number = number; reg->number = number;
if (this->numbered_regs.at(reg->number)) { auto& numbered_reg = this->numbered_regs.at(reg->number);
throw runtime_error(string_printf("number %hd is already assigned to a different register", reg->number)); if (numbered_reg) {
throw runtime_error(reg->str() + " cannot be assigned due to conflict with " + numbered_reg->str());
} }
this->numbered_regs.at(reg->number) = reg; this->numbered_regs.at(reg->number) = reg;
} else if (reg->number != number) { } else if (reg->number != number) {