标签: llvm-ir

迭代模块中的所有结构

我正在编写 ModulePass,我需要分析给定模块中定义的每个结构。

我知道在 ValueSymbolTable 中插入了带有名称的标识结构,但是我如何遍历所有其他结构(没有名称和文字结构标识)?

c++ types type-systems llvm llvm-ir

2
推荐指数
1
解决办法
1095
查看次数

LLVM的SelectInst的好处

LLVM有一个SelectInst用于表示表达式的表达式something = cond ? true-part : false-part.

这条指令在IR中有什么好处,编译器?:也可以一直降低到a BranchInst?是否有支持此类指令的CPU?或者select降级为CodeGenerator的跳转?

我认为分析传递可能有好处,因为它select保证了隐含的两个"分支" if.但另一方面,编译器根本不需要使用该指令,因此这些通道必须能够处理brs.

llvm llvm-ir

2
推荐指数
1
解决办法
685
查看次数

是否可以直接从格式正确的AST生成汇编代码而无需转换为IR?

我有一个用LLVM和C ++实现的玩具解释器?通过走AST并使用JIT,基于Perl的语言,内置的数据结构和函数来生成LLVM IR?现在我想将其扩展为可编译的,生成程序集代码并使用gas和ld获取可执行文件。

如果我想要的只是一个可运行的编译器,无需复杂的优化即可创建“ JUST CORRECT” elf可执行文件,我是否必须将AST转换为RTL之类的IR或类似的东西?还是有其他选择而不是在语法分析阶段构建AST?

顺便说一句?我想知道在像lcc或tcc这样的小型编译器中,它的“ IR”和“目标代码”是什么?

compiler-construction assembly llvm-ir

2
推荐指数
1
解决办法
869
查看次数

在 LLVM 中,如何在程序集文件中反映元数据?

这是设置:我正在使用 LLVM,并且我有一个分析过程,需要使分析的一些结果可供以后使用。这些结果需要在我生成的最终 .s 文件(ARM 架构)中可见。然后我在 .s 文件上运行一些脚本,这些脚本使用这些结果做进一步分析,但也依赖于生成的 ASM 的实际结构(否则我只会使用更多的 LLVM 传递)。

最初我认为元数据就是我想要的,我创建了一些简单的测试函数来为我关心的每条指令插入一些元数据。但我不知道如何使这个元数据反映在最终的 .s 文件中。更糟糕的是,我无法弄清楚如何使元数据字符串成为我真正想要的。您将在下面看到的“5”永远不会输出。相反,我在输出中看到 46 或 47。

void addMetadata(Instruction& I) {
    LLVMContext& C = I.getContext();
    MDNode* N = MDNode::get(C, MDString::get(C, "5"));
    I.setMetadata("alias_set", N);

    std::cerr << "Instruction" << std::endl;
    I.dump();
}
Run Code Online (Sandbox Code Playgroud)

示例输出:

Instruction
  %30 = load i32* %29, align 4, !dbg !67, !alias_set !46
Run Code Online (Sandbox Code Playgroud)

我也听说内联汇编可能会起作用,但我不知道这是否允许我在特定的 IR 指令之前插入注释或标签。如果 IR 被重新排序,那么无论它走到哪里,该标签或评论都需要跟随它。基本上,我只想在 .s 文件中看到一个标签或评论,其中包含一些我想要的少量信息。有谁知道这是怎么做到的吗?谢谢!

metadata llvm inline-assembly llvm-ir

2
推荐指数
1
解决办法
400
查看次数

LLVM“指令并不支配所有用途” - 插入新指令

使用 llvm pass 插入指令时出现以下错误:

Instruction does not dominate all uses!
%add = add nsw i32 10, 2
%cmp3 = icmp ne i32 %a.01, %add
Broken module found, compilation aborted!
Run Code Online (Sandbox Code Playgroud)

我在一个位代码文件中有源代码,其片段是:

if.then:                                          ; preds = %entry
    %add = add nsw i32 10, 2
    br label %if.end
if.else:                                          ; preds = %entry
    %sub = sub nsw i32 10, 2
    br label %if.end
if.end:                                           ; preds = %if.else, %if.then
    %a.0 = phi i32 [ %add, %if.then ], [ %sub, %if.else ] 
    %a.01 = …
Run Code Online (Sandbox Code Playgroud)

instrumentation llvm llvm-ir

2
推荐指数
1
解决办法
2231
查看次数

使用 llvm 库构建时如何链接?

我正在尝试解析 LLVM-IR 文件(.ll)并进行静态分析。

我在下面找到了这个示例代码,我尝试构建它,但我不知道要链接哪个库。

#include <iostream>
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/IRReader/IRReader.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/raw_ostream.h"

using namespace llvm;

int main(int argc, char** argv)
{
    if (argc < 2) {
        errs() << "Expected an argument - IR file name\n";
        exit(1);
    }

    LLVMContext &Context = getGlobalContext();
    SMDiagnostic Err;
    std::unique_ptr<Module> Mod = parseIRFile(argv[1], Err, Context);

    if (Mod) {
        std::cout << "Mod is not null" << std::endl;
    }
    else {
       std::cout << "Mod is null" << std::endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我给出了下面的命令来构建,它给了我一些未定义的参考错误,我认为这是一个链接错误。

g++ …
Run Code Online (Sandbox Code Playgroud)

compiler-construction static-analysis llvm llvm-clang llvm-ir

2
推荐指数
1
解决办法
1666
查看次数

LLVM将if / else插入现有基本块

我想在运行时检查某些指令的值。因此,我创建了一个比较指令和一个分支指令,它们分支到“然后”基本块或“其他”基本块。但是,我不确定如何在条件分支之后插入创建的基本块,以及如何拆分现有基本块。

Instruction* someInst;
IRBuilder<> B(someInst);

Value* condition = B.CreateICmp(CmpInst::ICMP_UGT, someInst, someValue);

BasicBlock* thenBB = BasicBlock::Create(*ctx, "then");
BasicBlock* elseBB = BasicBlock::Create(*ctx, "else");

B.CreateCondBr(condition, thenBB, elseBB);

B.SetInsertPoint(thenBB);
//insert stuff

B.SetInsertPoint(elseBB);
//insert stuff
Run Code Online (Sandbox Code Playgroud)

如何在现有基本块的中间插入if / else?

llvm llvm-ir llvm-c++-api

2
推荐指数
1
解决办法
2326
查看次数

如何在LLVM-IR中比较指针?

我想分析LLVM IR中的指针值。

LLVM Value Class中所示

Value是一个非常重要的LLVM类。它是程序所计算的所有值的基类,可用作所有其他值的操作数。值是其他重要类的超类,例如指令和功能。所有值都有一个类型。类型不是Value的子类。一些值可以具有名称,并且它们属于某个模块。在值上设置名称会自动更新模块的符号表。

要测试a Value是否为指针,有一个函数a->getType()->isPointerTy()。LLVM还提供了LLVM PointerType类,但是没有直接的api来比较指针的值。

所以我想知道如何比较这些指针值,以测试它们是否相等。我知道有AliasAnalysis,但是我对AliasAnalysis结果有疑问,所以我想自己验证一下。

pointers llvm-ir llvm-c++-api

2
推荐指数
1
解决办法
1101
查看次数

LLVM IR 优化

我正在尝试按照链接生成c代码的 IR 表示。c我使用的代码如下

void main() {
 int c1 = 17;
 int c2 = 25;
 int c3 = c1 + c2;
 printf("Value = %d\n", c3);
}
Run Code Online (Sandbox Code Playgroud)

我将其另存为const.c. 保存后,我使用以下命令生成.bc文件。

clang -c -emit-llvm const.c -o const.bc
Run Code Online (Sandbox Code Playgroud)


一旦生成.BC文件,我想以此来生成的优化版本使用下面的命令const.bc被命名文件const.reg.bc

opt -mem2reg const.bc > const.reg.bc
Run Code Online (Sandbox Code Playgroud)

我在生成这些文件时没有任何问题,但由于某种原因,它们完全相同,并且没有发生任何优化。结果应该不同,我的意思是const.reg.bc应该是const.bc文件的优化版本。但由于某种原因,它不会发生。有人可以告诉我我做错了什么吗?

register-allocation llvm compiler-optimization llvm-ir

2
推荐指数
1
解决办法
1109
查看次数

LLVM IR:当作为参数传递给函数时,如何在 llvm ir 代码中获取数组的大小?

我有一个将数组作为参数的函数,我需要在函数中首先获取数组的大小。我需要在 LLVM IR 中执行此操作。这可能吗?我可以访问数组,但我不知道大小。

void test(int[] a) {

} 
Run Code Online (Sandbox Code Playgroud)

现在正在翻译为

define void @test(i32* %__p__a) {
entry: 
       %a = alloca i32*, align 4
       store i32* %__p__a , i32** %a, align 4
       ret void
}
Run Code Online (Sandbox Code Playgroud)

llvm llvm-ir

2
推荐指数
1
解决办法
96
查看次数