我正在为LLVM中的一种新语言开发编译器,并在生成调试信息时遇到问题.
我还没有找到很多关于如何使用DIBuilder实际生成调试信息的文档,所以我很可能做了一些非常错误的事情.
我一直在看Kaleidoscope示例,因为它是我发现的唯一使用调试信息的示例.我还没有打开Clang来看看他们是如何使用它的,但我很乐意听到有人的声音.
我已经能够使用一些更复杂的示例来编译和运行我的语言,但我在一些基础知识中重新开始添加调试支持.这是我正在尝试编译的简单脚本:
double my_main()
{
return 0.0;
}
Run Code Online (Sandbox Code Playgroud)
这是来自verifyFunction,verifyModule和转储模块的输出.
编辑:注意在下面的编辑中我指出转储是在调用finalize之后正确删除临时.
Failed To Verify Function: my_main error: Expected no forward declarations!
!8 = <temporary!> !{}
Failed To Verify Module: test.str error: Expected no forward declarations!
!8 = <temporary!> !{}
; ModuleID = 'test.str'
define double @my_main() !dbg !6 {
entry:
br label %block, !dbg !10
block: ; preds = %entry
ret double 0.000000e+00, !dbg !10
}
!llvm.module.flags = !{!0, !1}
!llvm.dbg.cu = !{!2} …Run Code Online (Sandbox Code Playgroud) 我需要使用抽象解释来使用LLVM进行一些分析。这可能吗?或者我需要更轻松地使用分析工具。如果我可以通过LLVM做到这一点,那么哪些类将帮助我从原始源代码中编写语句,以获取变量之间的关系(以及每个变量的可能值范围)
我正在尝试检索传递给调用的指针的名称cudaMalloc。
CallInst *CUMallocCI = ... ; // CI of cudaMalloc call
Value *Ptr = CUMallocCI->getOperand(0);
if (AllocaInst *AI = dyn_cast<AllocaInst>(Ptr) != nullptr) {
errs() << AI->getName() << "\n";
}
Run Code Online (Sandbox Code Playgroud)
然而上面只是打印一个空行。是否可以从该分配中获取指针名称?
这是相关的IR:
%28 = alloca i8*, align 8
...
...
call void @llvm.dbg.declare(metadata i8** %28, metadata !926, metadata !DIExpression()), !dbg !927
%257 = call i32 @cudaMalloc(i8** %28, i64 1), !dbg !928
...
...
!926 = !DILocalVariable(name: "d_over", scope: !677, file: !3, line: 191, type: !22)
!927 = !DILocation(line: 191, …Run Code Online (Sandbox Code Playgroud) 我目前正在玩LLVM,我正在尝试编写一些优化器来熟悉opt和clang.我写了一个test.c文件,如下所示:
int foo(int aa, int bb, int cc){
int sum = aa + bb;
return sum/cc;
}
Run Code Online (Sandbox Code Playgroud)
我编译了源代码并生成了2个.ll文件,一个未经优化,一个用mem2reg优化器传递:
clang -emit-llvm -O0 -c test.c -o test.bc
llvm-dis test.bc
opt -mem2reg -S test.ll -o test-mem2reg.ll
Run Code Online (Sandbox Code Playgroud)
两个.ll文件都给了我以下输出:
ModuleID = 'test.bc'
source_filename = "test.c"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; Function Attrs: noinline nounwind optnone uwtable
define i32 @foo(i32 %aa, i32 %bb, i32 %cc) #0 {
entry:
%aa.addr = alloca i32, align 4
%bb.addr = alloca i32, align 4
%cc.addr = …Run Code Online (Sandbox Code Playgroud) llvm ×3
llvm-ir ×3
c++ ×2
clang ×1
cuda ×1
debugging ×1
llvm-clang ×1
llvm-codegen ×1
optimization ×1
ssa ×1