[midend]解决部分变量重命名问题

This commit is contained in:
rain2133
2025-08-09 22:30:09 +08:00
parent 6b9ad0566d
commit c867bda9b4
3 changed files with 75 additions and 4 deletions

View File

@@ -1,6 +1,7 @@
#include "IR.h"
#include <algorithm>
#include <cassert>
#include <functional>
#include <memory>
#include <queue>
#include <set>
@@ -1033,12 +1034,23 @@ auto SymbolTable::addVariable(const std::string &name, Value *variable) -> Value
if (curNode != nullptr) {
std::stringstream ss;
auto iter = variableIndex.find(name);
// 处理超长变量名超过100字符
std::string displayName = name;
if (name.length() > 100) {
// 计算简单哈希
std::hash<std::string> hasher;
size_t hash = hasher(name);
// 截断到前100个字符 + 哈希后缀
displayName = name.substr(0, 100) + "_hash_" + std::to_string(hash);
}
if (iter != variableIndex.end()) {
ss << name << iter->second ;
ss << displayName << iter->second ;
iter->second += 1;
} else {
variableIndex.emplace(name, 1);
ss << name << 0 ;
ss << displayName << 0 ;
}
variable->setName(ss.str());
@@ -1056,6 +1068,47 @@ auto SymbolTable::addVariable(const std::string &name, Value *variable) -> Value
return result;
}
/**
* 注册函数参数名字到符号表确保后续的alloca变量不会使用相同的名字
*/
void SymbolTable::registerParameterName(const std::string &name) {
if (curNode != nullptr) {
// 为当前函数作用域创建一个唯一的参数名标识
std::string scopedName = name + "_param_" + std::to_string(reinterpret_cast<uintptr_t>(curNode));
auto iter = variableIndex.find(scopedName);
if (iter != variableIndex.end()) {
iter->second += 1;
} else {
// 注册带作用域的参数名确保在本作用域中后续的addVariable会避免冲突
variableIndex.emplace(scopedName, 1);
}
// 同时确保原名字也有一个索引这样addVariable会为alloca生成不同的名字
auto iter2 = variableIndex.find(name);
if (iter2 == variableIndex.end()) {
variableIndex.emplace(name, 1); // 设置为1这样addVariable会生成name1而不是name0
} else {
iter2->second += 1;
}
}
}
/**
* 直接添加变量到当前作用域,不进行重命名
*/
void SymbolTable::addVariableDirectly(const std::string &name, Value *variable) {
if (curNode != nullptr) {
curNode->varList.emplace(name, variable);
auto global = dynamic_cast<GlobalValue *>(variable);
auto constvar = dynamic_cast<ConstantVariable *>(variable);
if (global != nullptr) {
globals.emplace_back(global);
} else if (constvar != nullptr) {
globalconsts.emplace_back(constvar);
}
}
}
/**
* 获取全局变量
*/