Compiler construction 将源信息放入LLVM位代码文件以调试编译器错误

Compiler construction 将源信息放入LLVM位代码文件以调试编译器错误,compiler-construction,f#,code-generation,llvm,llvm-fs,Compiler Construction,F#,Code Generation,Llvm,Llvm Fs,我正在制作一个基本的编译器,并希望将源代码行放在llvm代码附近的某个位置,该代码是为方便调试而生成的。例如: proc f(a:Int, b:Int):Int { return a + b; } start { print f(1,2); return 0; } 应该以某种方式使用源代码进行注释,如下所示: @numFmt = internal constant [4 x i8] c"%d\0A\00" declare i32 @printf(i8*, ...)

我正在制作一个基本的编译器,并希望将源代码行放在llvm代码附近的某个位置,该代码是为方便调试而生成的。例如:

proc f(a:Int, b:Int):Int {
    return a + b;
}

start {
    print f(1,2);
    return 0;
}
应该以某种方式使用源代码进行注释,如下所示:

@numFmt = internal constant [4 x i8] c"%d\0A\00"

declare i32 @printf(i8*, ...) nounwind

define i32 @main() {
entry:
  %print.0 = call i32 @f(i32 1, i32 2)     ; print f(1,2) maybe using a comment
  %tmp.3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @numFmt, i32 0, i32 0), i32 %print.0)
"return 0    - or perhaps using a basic block":
  ret i32 0
}

define i32 @f(i32 %a, i32 %b) {
entry:
  "return a + b" = <or the result of some dummy operation that doesn't get stripped away"
  %return.0 = add i32 %a, %b
  ret i32 %return.0
}
@numFmt=内部常数[4 x i8]c“%d\0A\00”
声明i32@printf(i8*,…)nounwind
定义i32@main(){
条目:
%print.0=调用i32@f(i32 1,i32 2);print f(1,2)可能使用注释
%tmp.3=调用i32(i8*,…)*@printf(i8*getelementptr inbounds([4 x i8]*@numFmt,i32 0,i32 0),i32%print.0)
“返回0-或者使用基本块”:
ret i32 0
}
定义i32@f(i32%a,i32%b){
条目:

“return a+b”=+1询问有关LLVM和F#的问题:-)为什么要将实际的源代码绑定到中?使用LLVM元数据存储位置三元组(文件、行、列)对于每条指令。@SK logic:这只是为了更简单地调试编译器本身-您可以看到IR的哪一部分链接到源代码的哪一部分,而无需进行文件/行/列查找。请看(我以前针对的随机堆栈机中的代码)来看看我以前做过什么。我明白了。你可以一直使用这样的文本元数据,或者,或者(对于调试也更好)您可以实现一个预处理器,它将读取IR和源代码,并在指令与元数据之间显示相应的代码行。是的,元数据节点似乎是前进的方向。唉,我使用的是llvm fs绑定,它使用llvm C api,看起来我需要问另一个关于如何实际生成元数据节点。