fix register reassignment if name doesn't appear first in file
This commit is contained in:
+17
-9
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user