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
+17 -9
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,16 +1802,19 @@ 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) {
if ((number < -1) || (number >= 0x100)) {
throw runtime_error("invalid register number");
}
shared_ptr<Register> reg; shared_ptr<Register> reg;
try { if (!name.empty()) {
if (!name.empty()) { try {
reg = this->named_regs.at(name); reg = this->named_regs.at(name);
} else if (number >= 0 && number < 0x100) { } catch (const out_of_range&) {
reg = this->numbered_regs.at(number);
} else {
throw runtime_error("invalid register name or number");
} }
} catch (const out_of_range&) { }
if (!reg && number >= 0) {
reg = this->numbered_regs.at(number);
} }
if (!reg) { if (!reg) {
@@ -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) {