From 5d343f42a5eb8aaacaeef7af4d4f57c05ccbec89 Mon Sep 17 00:00:00 2001 From: rain2133 <1370973498@qq.com> Date: Wed, 6 Aug 2025 02:02:05 +0800 Subject: [PATCH] =?UTF-8?q?[midend-llvmirprint]=E6=A3=80=E6=9F=A5=E5=B9=B6?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E5=88=9D=E5=A7=8B=E5=80=BC=E7=9A=84?= =?UTF-8?q?=E6=89=93=E5=8D=B0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/midend/IR.cpp | 191 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 142 insertions(+), 49 deletions(-) diff --git a/src/midend/IR.cpp b/src/midend/IR.cpp index c0901cf..2a41637 100644 --- a/src/midend/IR.cpp +++ b/src/midend/IR.cpp @@ -164,6 +164,21 @@ void Type::print(ostream &os) const { } } +void Use::print(std::ostream& os) const { + os << "Use[" << index << "]: "; + if (value) { + printVarName(os, value); + } else { + os << "null"; + } + os << " used by "; + if (user) { + os << "User@" << user; + } else { + os << "null"; + } +} + PointerType* PointerType::get(Type *baseType) { static std::map> pointerTypes; auto iter = pointerTypes.find(baseType); @@ -217,25 +232,63 @@ void GlobalValue::print(std::ostream& os) const { // 输出全局变量的LLVM IR格式 os << "@" << getName() << " = global "; + auto baseType = getType()->as()->getBaseType(); + os << *baseType << " "; + // 输出初始化值 - if (initValues.size() > 0) { - os << *getType()->as()->getBaseType() << " "; - if (initValues.size() == 1) { - // 单个初始值 - initValues.getValue(0)->print(os); + if (initValues.size() == 0) { + // 没有初始化值,使用zeroinitializer + os << "zeroinitializer"; + } else { + // 检查是否所有值都是零值 + bool allZero = true; + const auto& values = initValues.getValues(); + for (Value* val : values) { + if (auto constVal = dynamic_cast(val)) { + if (!constVal->isZero()) { + allZero = false; + break; + } + } else { + allZero = false; + break; + } + } + + if (allZero) { + // 所有值都是零,使用zeroinitializer + os << "zeroinitializer"; + } else if (initValues.size() == 1) { + // 单个初始值 - 如果是标量零值也考虑使用zeroinitializer + auto singleVal = initValues.getValue(0); + if (auto constVal = dynamic_cast(singleVal)) { + if (constVal->isZero() && (baseType->isInt() || baseType->isFloat())) { + // 标量零值使用zeroinitializer + os << "zeroinitializer"; + } else { + // 非零值或非基本类型,打印实际值 + singleVal->print(os); + } + } else { + // 非常量值,打印实际值 + singleVal->print(os); + } } else { - // 数组初始值 + // 数组初始值 - 需要展开ValueCounter中的压缩表示 os << "["; - for (unsigned i = 0; i < initValues.size(); ++i) { - if (i > 0) os << ", "; - auto value = initValues.getValue(i); - os << *value->getType() << " "; - value->print(os); + bool first = true; + const auto& numbers = initValues.getNumbers(); + + for (size_t i = 0; i < values.size(); ++i) { + for (unsigned j = 0; j < numbers[i]; ++j) { + if (!first) os << ", "; + os << *values[i]->getType() << " "; + values[i]->print(os); + first = false; + } } os << "]"; } - } else { - os << *getType()->as()->getBaseType() << " zeroinitializer"; } } @@ -243,25 +296,91 @@ void ConstantVariable::print(std::ostream& os) const { // 输出常量的LLVM IR格式 os << "@" << getName() << " = constant "; + auto baseType = getType()->as()->getBaseType(); + os << *baseType << " "; + // 输出初始化值 + if (initValues.size() == 0) { + // 没有初始化值,使用zeroinitializer + os << "zeroinitializer"; + } else { + // 检查是否所有值都是零值 + bool allZero = true; + const auto& values = initValues.getValues(); + for (Value* val : values) { + if (auto constVal = dynamic_cast(val)) { + if (!constVal->isZero()) { + allZero = false; + break; + } + } else { + allZero = false; + break; + } + } + + if (allZero) { + // 所有值都是零,使用zeroinitializer + os << "zeroinitializer"; + } else if (initValues.size() == 1) { + // 单个初始值 - 如果是标量零值也考虑使用zeroinitializer + auto singleVal = initValues.getValue(0); + if (auto constVal = dynamic_cast(singleVal)) { + if (constVal->isZero() && (baseType->isInt() || baseType->isFloat())) { + // 标量零值使用zeroinitializer + os << "zeroinitializer"; + } else { + // 非零值或非基本类型,打印实际值 + singleVal->print(os); + } + } else { + // 非常量值,打印实际值 + singleVal->print(os); + } + } else { + // 数组初始值 - 需要展开ValueCounter中的压缩表示 + os << "["; + bool first = true; + const auto& numbers = initValues.getNumbers(); + + for (size_t i = 0; i < values.size(); ++i) { + for (unsigned j = 0; j < numbers[i]; ++j) { + if (!first) os << ", "; + os << *values[i]->getType() << " "; + values[i]->print(os); + first = false; + } + } + os << "]"; + } + } +} + +void ConstantVariable::print_init(std::ostream& os) const { + // 只输出初始化值部分 if (initValues.size() > 0) { - os << *getType()->as()->getBaseType() << " "; if (initValues.size() == 1) { // 单个初始值 initValues.getValue(0)->print(os); } else { - // 数组初始值 + // 数组初始值 - 需要展开ValueCounter中的压缩表示 os << "["; - for (unsigned i = 0; i < initValues.size(); ++i) { - if (i > 0) os << ", "; - auto value = initValues.getValue(i); - os << *value->getType() << " "; - value->print(os); + bool first = true; + const auto& values = initValues.getValues(); + const auto& numbers = initValues.getNumbers(); + + for (size_t i = 0; i < values.size(); ++i) { + for (unsigned j = 0; j < numbers[i]; ++j) { + if (!first) os << ", "; + os << *values[i]->getType() << " "; + values[i]->print(os); + first = false; + } } os << "]"; } } else { - os << *getType()->as()->getBaseType() << " zeroinitializer"; + os << "zeroinitializer"; } } @@ -926,39 +1045,13 @@ void Function::print(std::ostream& os) const { void Module::print(std::ostream& os) const { // 打印全局变量声明 for (auto& globalVar : const_cast(this)->getGlobals()) { - printVarName(os, globalVar.get()); - os << " = global " << *globalVar->getType()->as()->getBaseType(); - - // 打印初始值 - const auto& initValues = globalVar->getInitValues(); - if (initValues.size() > 0) { - os << " "; - // 简化处理:只打印第一个初始值 - initValues.getValue(0)->print(os); - } else { - // 默认初始化 - if (globalVar->getType()->as()->getBaseType()->isInt()) { - os << " 0"; - } else if (globalVar->getType()->as()->getBaseType()->isFloat()) { - os << " 0.0"; - } else { - os << " zeroinitializer"; - } - } + globalVar->print(os); os << "\n"; } // 打印常量声明 for (auto& constVar : getConsts()) { - printVarName(os, constVar.get()); - os << " = constant " << *constVar->getType()->as()->getBaseType(); - os << " "; - const auto& initValues = constVar->getInitValues(); - if (initValues.size() > 0) { - initValues.getValue(0)->print(os); - } else { - os << "0"; - } + constVar->print(os); os << "\n"; }