You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nudt-compiler-cpp/src/ir/Module.cpp

55 lines
1.5 KiB

// 保存函数列表并提供模块级上下文访问。
#include "ir/IR.h"
namespace ir {
Context& Module::GetContext() { return context_; }
const Context& Module::GetContext() const { return context_; }
Function* Module::CreateFunction(const std::string& name,
std::shared_ptr<FunctionType> func_type) {
functions_.push_back(std::make_unique<Function>(name, std::move(func_type)));
return functions_.back().get();
}
Function* Module::FindFunction(const std::string& name) const {
for (const auto& func : functions_) {
if (func->GetName() == name) {
return func.get();
}
}
return nullptr;
}
const std::vector<std::unique_ptr<Function>>& Module::GetFunctions() const {
return functions_;
}
GlobalValue* Module::CreateGlobal(const std::string& name,
std::shared_ptr<Type> ty) {
// 对于标量类型,自动转换为指针类型
std::shared_ptr<Type> global_ty;
if (ty->IsInt32()) {
global_ty = Type::GetPtrInt32Type(); // i32 -> i32*
} else if (ty->IsFloat()) {
global_ty = Type::GetPtrFloatType(); // float -> float*
} else if (ty->IsInt1()) {
global_ty = Type::GetPtrInt1Type(); // i1 -> i1*
} else {
// 数组等类型保持不变
global_ty = ty;
}
globals_.push_back(std::make_unique<GlobalValue>(global_ty, name));
return globals_.back().get();
}
const std::vector<std::unique_ptr<GlobalValue>>& Module::GetGlobals() const {
return globals_;
}
} // namespace ir