gpt4 book ai didi

c++ - LLVM-如何使嵌套函数查看外部函数的变量

转载 作者:行者123 更新时间:2023-12-02 10:23:48 25 4
gpt4 key购买 nike

我正在尝试为支持嵌套函数的语言编写编译器,例如:

func a()
int x;
func b()
int y;
{
// code of func b - both x and y are visible here
}
{
// code of func a - only x is visible here
}

我在c++中使用LLVM API来编译代码。我的问题是我不知道如何使变量x在函数b中可见,因为据我所知llvm不支持嵌套函数。到目前为止,我声明变量的方式是该函数:

static AllocaInst *CreateEntryBlockAlloca(Function *TheFunction, const std::string &VarName, Type *T) {
IRBuilder<> TmpB(&TheFunction->getEntryBlock(), TheFunction->getEntryBlock().begin());
return TmpB.CreateAlloca(T, 0, VarName.c_str());
}

如llvm教程 https://llvm.org/docs/tutorial/LangImpl07.html#adjusting-existing-variables-for-mutation所示。
当使用此声明并尝试在嵌套函数中使用外部变量时,会弹出此错误:指令并不能支配所有使用!
有没有办法解决这个问题?

最佳答案

LLVM支持结构,对吗?这就是典型的编译器的工作。

您需要使用引用的每个外变量从生成的字段创建一个匿名结构。然后,创建一个与b()对应的匿名函数,该函数以该结构作为参数并对其进行操作。基本上,您将b()转换为常规的顶层函数。最后,您转换a()代码,以便它创建struct实例并调用匿名函数。在这一点上,进一步的优化是可能的。要做好准备:这一点都不容易,这可能是代码转换的非常高级的主题。

例如

func a()
int x = 1;
func b() {
return x+1;
}
return b() + 2;
}

变成
struct tmp {
int tmpx; // reference or value?
}
func tmp_b(tmp& instance) {
instance.tmpx += 1;
return instance.tmpx;
}
func a() {
int x = 1;
tmp instance(tmpx = x); // should it go by reference or value?
return tmp_b(instance) + 2;
}

或者,您可以将b()转换为b(int x)顶级功能。但是这种方法不太灵活。还是根据上下文使用两种方法,为什么不呢?

请注意,如果您的语言通过方法和/或运算符(在这种情况下为调用运算符)重载来支持适当的类,则可以简化所有操作。

关于c++ - LLVM-如何使嵌套函数查看外部函数的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55736390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com