问题标签 [llvm-ir]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
319 浏览

c++ - 如何控制 LLVM IR 中全局变量的位置?

我正在尝试修改 LLVM,使其在内存中保持某些常量和函数连续。
换句话说,我需要确保某些函数的机器代码总是在内存中以大约 4 字节的常量开头。函数体本身不得修改。

我可以通过以某种方式修改 LLVM IR 来实现这一点吗?

  • 如果是:我将如何在 LLVM IR 中声明以使变量和函数在内存中保持连续?

  • 如果不是:我应该修改代码生成过程的哪一部分(即,通过哪个(es))来实现这一点?任何指向我应该查看的项目/文件的链接都会有所帮助,因为我还不确定从哪里开始。

0 投票
1 回答
591 浏览

c++ - 从 std::istream 读取 LLVM IR

以前我曾问过如何在文件中写入然后读回 IR。读取的代码如下所示:

但是,我试图将 LLVM IR 改造成的代码只传递给我一个std::istream&. 如何从 IR 中读取 IR std::istream

我想出了如何使用raw_os_ostreama 来适应 astd::ostreamraw_ostream编写模块,但是没有明显的方法来适应代码以供阅读,例如,没有MemoryBuffer适应 a std::istream(除非我错过了)。

0 投票
1 回答
380 浏览

c++ - 确定数组索引

我在 C 代码中有以下循环:

我想在上面的代码中确定数组 b 的步幅为 3 并且 f 的增量因子为 2。

生成的 LLVM 程序集是(对于包含循环的块):

现在在我的 LoopPass 中,我使用以下代码:

但我没有得到任何输出。我在这里做错了什么?

0 投票
3 回答
19724 浏览

c++ - 如何插入 LLVM 指令?

我一直在寻找几个小时,我找不到任何可以帮助我的东西。我正在做一个涉及 FunctionPass 的项目。我已经实现了一个 runOnFunction(Function &f) 方法,并且工作正常。基本上它需要:

1)检测存储指令

2)将store指令的内存地址转换为Integer

3) 使用按位与运算 (0000FFFF) 更改整数

4) 将整数转换回指针

到目前为止,我有以下内容:

我一生都无法弄清楚如何实际插入指令,甚至无法找到创建 AND 指令的方法。如果有人能指出我正确的方向,那就太好了。

提前致谢。

0 投票
1 回答
8089 浏览

llvm - 向 LLVM IR 中的指令添加元数据

首先,我是 LLVM 通行证的新手。

我试图在转换通过后将元数据添加到 LLVM 中的指令中(使用 C++ API)。我打算存储此信息以供工具链中的另一个工具使用。我对此有两个问题。

  1. 我希望我存储为元数据的信息能够输入到另一个适用于 LLVM IR 的工具中。那么元数据是个好主意吗?我打算将字符串存储为带有一些说明的元数据。

  2. 如果元数据是正确的方法,我需要一些帮助来创建元数据节点。我计划使用 setMedata() 函数将其附加到指令中。setMetadata() 的哪个变体是正确的。我不确定我的数据应该属于哪个 MDKind。我想创建一个 MDString,将它附加到我的 MDNode,然后使用指令调用 setMetadata()。如果我想将元数据附加到函数内的指令,我应该在 setMedata() 中使用什么上下文。上下文与元数据的相关性是什么?

我尝试在论坛和 llvm doxygen 文档中阅读很多讨论,但我没有得到所有问题的清晰完整的答案。感谢您的帮助或一些可以帮助我理解这一点的材料。

0 投票
1 回答
5130 浏览

c++ - 是否可以在 llvm 中为用户定义的传递添加参数

现在我们正在按照本教程为llvm实施分析过程。并且需要向插件传递一个附加参数,如下所示:

但是我没有找到任何手册告诉我该怎么做。所以我想知道在实践中是否可能。

提前致谢。

0 投票
1 回答
122 浏览

llvm-3.0 - Function arg list LLVM opt pass 中的数组检测

假设我有以下 LLVM IR

定义 void @foo(i32* %a, i32* %m) nounwind { ...

我通过为第一个 arg 传递一个数组并为 m 传递一个变量的地址来调用 foo。现在,我需要分析 foo 的 arg 列表并确定哪个 arg 传递了一个数组,而哪个只是一个指针地址。我知道两者实际上都是地址,但是 LLVM 是否提供某种元数据,以便我可以静态确定传入的类型。

注意:我正在写一个选择通行证

0 投票
2 回答
1104 浏览

llvm - 如何使用 dbg 元数据获取变量定义行号等?

据我所知,当我需要获取局部变量的行号时,我必须寻找llvm.dbg.declare内在函数的调用并获取 dbg 元数据(因为AllocaInst它本身不包含任何 dbg 信息)。但是似乎不能保证这CallInst是 的下一条指令AllocaInst,我必须在指定的函数中遍历指令,这是低效的。所以我想知道是否有一种方法可以直接AllocaInst获取llvm.dbg.declare指令。

例如,在一个名为 src 中foo.c

和相应的 llvm ir:

如果我需要知道中int a;定义的行号,foo.c我必须遍历 ir 并!dbg !9call void @llvm.dbg.declare(metadata !{i32* %a}, metadata !7), !dbg !9.

顺便说一句,处理全局变量时似乎没有困难,因为llvm.dbg.gv它包含非常信息。

0 投票
3 回答
7313 浏览

build - 如何将 IR 保存到文件并将其构建为可执行文件?

现在我使用 clang 将我的 .c 文件构建为 .s 文件。我已经使用 llvm API 修改了 IR。但是,现在我无法将修改后的 IR 保存到文件中。我想使用“LLVMWriteBitcodeToFile”,但找不到“LLVMOpaqueModule”的结构;我想使用“WriteBitcodeToFile”,它总是显示“类型不匹配”。而且我还想知道如何将 IR 文件构建为可执行文件。

接下来是我用来保存模块的两种方法:

1、首先使用WriteBitcodeToFile

2、第二次使用LLVMWriteBitcodeToFile

注意:m 是 Module 实例的一个点

0 投票
1 回答
1281 浏览

insert - 为什么我想在basicblock中插入一些指令那么麻烦?

当我尝试在基本块中插入一些指令时,我发现它很麻烦。

以上是我使用的一些代码。到现在我还是不明白在basicblock中插入各种指令的原理。(我只是可以插入一个allocaInst)。我希望有人能告诉我一些在基本块中插入各种指令的例子。