相关疑难解决方法(0)

如何追踪LLVM verifyFunction错误"预计没有前向声明!"?

我正在为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)

c++ compiler-construction debugging llvm llvm-ir

5
推荐指数
1
解决办法
1173
查看次数

LLVM中的抽象解释

我需要使用抽象解释来使用LLVM进行一些分析。这可能吗?或者我需要更轻松地使用分析工具。如果我可以通过LLVM做到这一点,那么哪些类将帮助我从原始源代码中编写语句,以获取变量之间的关系(以及每个变量的可能值范围)

llvm llvm-clang abstract-interpretation llvm-ir

5
推荐指数
1
解决办法
529
查看次数

LLVM 检索 AllocaInst 的名称

我正在尝试检索传递给调用的指针的名称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)

c++ cuda llvm llvm-ir

5
推荐指数
1
解决办法
1043
查看次数

LLVM opt mem2reg无效

我目前正在玩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)

optimization clang ssa compiler-optimization llvm-codegen

4
推荐指数
2
解决办法
1562
查看次数