【发布时间】:2016-11-24 01:27:34
【问题描述】:
我正在为一种伪代码语言编写 LLVM IR 生成器。这种语言应该允许重新定义功能。
这是一种情况,我有两个函数都名为“f”,但它们有不同的参数。
function f(int i, float r) returns int { return i; }
function f(float r, float r2) returns int {return i; }
我认为 LLVM 可以区分这一点,但我明白了
错误:函数重新定义无效
而我生成的代码是:
define i32 @f(i32 %i, float %r) {
%var.i.0 = alloca i32
store i32 %i, i32* %var.i.0
%var.r.1 = alloca float
store float %r, float* %var.r.1
%int.2 = load i32* %var.i.0
ret i32 %int.2
; -- 0 :: i32
%int.3 = add i32 0, 0
ret i32 %int.3
}
define i32 @f(float %r, float %r2) {
%var.r.2 = alloca float
store float %r, float* %var.r.2
%var.r2.3 = alloca float
store float %r2, float* %var.r2.3
%var.i.4 = alloca i32
%float.3 = load float* %var.r.2
%int.7 = fptosi float %float.3 to i32
store i32 %int.7, i32* %var.i.4
%int.8 = load i32* %var.i.4
ret i32 %int.8
; -- 0 :: i32
%int.9 = add i32 0, 0
ret i32 %int.9
}
所以,我认为 LLVM 不允许函数重载?那么我生成一个顺序计数器并通过添加这个顺序计数器作为后缀来区分所有这些功能是一个好主意,即define i32 @f.1()和define i32 @f.2()?
【问题讨论】:
-
我正在为动态类型语言做同样的事情,并且我已经采取生成函数签名为
@modulename_functionname_xyz其中xy编码arity。在您的情况下,您可以对类型进行编码。例如。 @foo.f_if 和 @foo.f_ff. -
@FrankC。我正在考虑稍后改变这件事,但现在我会通过计数器来区分它,因为我不是唯一一个在做这件事的人。
标签: llvm llvm-clang llvm-ir