使用引用参数创建LLVM函数(例如double& x)

时间:2015-04-18 15:01:25

标签: llvm llvm-ir

我想从头开始创建LLVM IR中的新功能。 LLVM代码应该与带有引用参数的C ++函数相对应,比如说

void foo(double& x){    X = 0; }

http://llvm.org/releases/2.6/docs/tutorial/JITTutorial1.html这样的教程太旧了(llvm 2.6),并没有考虑传递引用函数。

有关如何执行此操作的任何提示?谢谢。

1 个答案:

答案 0 :(得分:1)

在LLVM中,引用类型通常使用指针类型实现。对于以下C ++源代码,

int foo(int & i) {
    return i;
}

int bar(int *i) {
    return *i;
}

void baz(int i) {
    foo(i);
    bar(&i);
}

相应的IR是:

; Function Attrs: nounwind
define i32 @_Z3fooRi(i32* dereferenceable(4) %i) #0 {
entry:
  %i.addr = alloca i32*, align 8
  store i32* %i, i32** %i.addr, align 8
  %0 = load i32*, i32** %i.addr, align 8
  %1 = load i32, i32* %0, align 4
  ret i32 %1
}

; Function Attrs: nounwind
define i32 @_Z3barPi(i32* %i) #0 {
entry:
  %i.addr = alloca i32*, align 8
  store i32* %i, i32** %i.addr, align 8
  %0 = load i32*, i32** %i.addr, align 8
  %1 = load i32, i32* %0, align 4
  ret i32 %1
}

; Function Attrs: nounwind
define void @_Z3bazi(i32 %i) #0 {
entry:
  %i.addr = alloca i32, align 4
  store i32 %i, i32* %i.addr, align 4
  %call = call i32 @_Z3fooRi(i32* dereferenceable(4) %i.addr)
  %call1 = call i32 @_Z3barPi(i32* %i.addr)
  ret void
}

您可以发现 foo bar 之间的 i 没有本质区别: dereferenceable 是只需parameter attribute即可在前端代码生成过程中自行添加。{/ p>