使用LLVM c ++ API创建“类”定义

问题描述

我正在使用LLVM c ++ api开发自定义前端语言,并且正在向该语言添加“类”定义构造。词法分析器和解析器用C ++编写,LLVM c ++ api用于生成IR代码并编译到不同的计算机后端。我已经可以使用自定义的前端语言定义函数和变量,调用函数并评估基本算术。

为了在语言中添加“类”定义,我遵循了https://mapping-high-level-constructs-to-llvm-ir.readthedocs.io/en/latest/object-oriented-constructs/classes.html上的建议

这建议我们创建一个“结构类型”以包含该类的所有数据成员,并分别为该类的方法定义一堆函数(如果我正确理解链接的话)。

因此,在我的编译器代码中,我定义了一个称为“ ClassAST”的AST节点,其中包含该类的数据成员的名称和类型,以及在前面定义的“ class”的方法函数定义的集合。结束语。 AST节点的c ++代码段如下:

set(pathToOpenCv $ENV{OPEN_CV_PATH})

代码段中,FunctionAST,ExprAST,PrototypeAST是我定义的其他AST节点类型,以便分别表示函数,表达式和函数原型,并用于生成它们的IR代码。 “ IRgen”是我定义的一个类,用于为我的编译器包含llvm :: Context,llvm :: Module,llvm :: IRBuilder实例。

现在,要为ClassAST节点生成IR代码,我定义“ codegen”,功能

class ClassAST {
public:
  std::vector<std::unique_ptr<FunctionAST>> function_members;
  std::vector<std::unique_ptr<ExprAST>> data_members;
  std::unique_ptr<PrototypeAST> Proto;
  ClassAST(std::unique_ptr<PrototypeAST> Proto,std::vector<std::unique_ptr<FunctionAST>> function_members,std::vector<std::unique_ptr<ExprAST>> data_members)
    : Proto(std::move(Proto)),function_members(std::move(function_members)),data_members(std::move(data_members)) {}

  llvm::Type *codegen(IRgen *irgen);
}

上面的codegen(..)函数成功创建了class_StructType来包含适当的data_member类型,并为定义的'function_members'生成了IR代码,并将函数定义添加到了'irgen'中的llvm :: Module实例中。 / p>

但是,我不知道如何将class_StructType类型添加到llvm :: Module实例,以便以后的代码可以检索该类型并创建class_StructType的实例。

有人可以阐明如何将新的StructType添加到llvm:Module实例吗?(我使用的是最新的llvm 12.0 API,但即使是较旧的api 11.0也可以)。 / p>

解决方法

查看Module::getTypeByName的源代码,它在LLVMContext实例中查找名称。这意味着您不必将类型添加到模块中,并且即使通过Module实例,名称查找也可以正常工作。