我想从头开始创建LLVM IR中的新功能。 LLVM代码应该与带有引用参数的C ++函数相对应,比如说
void foo(double& x){ X = 0; }
http://llvm.org/releases/2.6/docs/tutorial/JITTutorial1.html这样的教程太旧了(llvm 2.6),并没有考虑传递引用函数。
有关如何执行此操作的任何提示?谢谢。
答案 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>