获取 llvm 指令的使用和定义
Getting the use and def of an llvm instruction
我正在尝试进行活动分析,为此,我需要获取所有节点的def
和use
集,其中它们定义如下:
def[n] = set of all variables defined at node n
use[n] = set of all variables used at node n
例如,在行中:
a = b + c
def[n] = {a}
use[n] = {b,c}
我该怎么做?
http://llvm.org/docs/ProgrammersManual.html#iterating-over-def-use-use-def-chains
我希望这个页面可以帮到你。访问 Value 对象中的 user_begin ((、user_end (( 和用户 (( 方法的用户对象是使用 Value 对象的用户对象。指令类是用户类的子类。
我可能是错的,但是要在 IR 级别获得 def-use 集,该集的元素应该是 Value 对象,每个节点都应该是一个指令对象。
因此,每个节点的 def 集将是指令返回的 Value 对象(有可能出现指令不返回的情况。在这种情况下,def set 是空集(,并且使用集将通过指令user_iterator访问 User 对象。
基本上,当我们在LLVM中定义局部变量时,它使用AllocaInst
。这是您提出的示例:
a=b+c
在 C 代码中:
int a;
int b=10;
int c=10;
a=b+c;
在使用-g
编译的 LLVM IR 中(调试模式(:
%a = alloca i32, align 4
%b = alloca i32, align 4
%c = alloca i32, align 4
call void @llvm.dbg.declare(metadata i32* %a, metadata !14, metadata !16),
... !dbg !17
call void @llvm.dbg.declare(metadata i32* %b, metadata !18, metadata !16),
... !dbg !19
store i32 10, i32* %b, align 4, !dbg !19
call void @llvm.dbg.declare(metadata i32* %c, metadata !20, metadata !16),
... !dbg !21
store i32 10, i32* %c, align 4, !dbg !21
%0 = load i32, i32* %b, align 4, !dbg !22
%1 = load i32, i32* %c, align 4, !dbg !23
%add = add nsw i32 %0, %1, !dbg !24
store i32 %add, i32* %a, align 4, !dbg !25
让我们看看如何使用 LLVM API 来收集 def-use 链。这很容易,因为LLVM在功能级别有一个内置的API:
bool runOnFunction(Function &F){
errs() << "digraph " + F.getName() + "{n";
errs() << "n";
for (auto block = F.getBasicBlockList().begin(); block != F.getBasicBlockList().end(); block++) {
for (auto inst = block->begin(); inst != block->end(); inst++) {
for (Use &U:inst->operands()) {
Value *v = U.get();
if (dyn_cast<Instruction>(v)) {
errs() << """ << *dyn_cast<Instruction>(v) << """ << " -> " << """ << *inst << """ << ";n";
}
if (v->getName() != "") {
errs() << """ << v->getName() << """ << " -> " << """ << *inst << """ << ";n";
errs() << """ << v->getName() << """ << " [ color = red ]n";
}
}
}
}
errs() << "n}n";
}
对于定义使用链条,简单的道分配和用户。
这将生成一个 PDG。
取自 https://github.com/DengMinghua/LLVM-Program-Dependency-Graph-Generator 的代码
希望这有帮助。
- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- 如何使用 llvm-10 库在C++定义 LLVM 全局值变量?
- 如何检查函数是否在LLVM Instrumentation pass的ModulePass的系统头文件中定义?
- 如何在自定义 LLVM 传递之间正确传递数据结构
- llvm,通过 C++ API 定义字符串和数组
- LLVM 传递链接问题:未定义的符号
- LLVM-5.0 MakeFile未定义的参考失败
- 依赖GCC/LLVM的"-fexceptions"在技术上是未定义的行为吗?
- 获取 llvm 指令的使用和定义
- 如何在 LLVM 中找到操作数的定义点
- 自建LLVM选项的未定义符号
- 为什么我们在LLVM中为Objective-C编译器定义C++类型为void(而C++编译器可以看到Objective-
- CTOR 声明/定义中接受的 const 限定符(LLVM 错误?)
- 为什么在Visual Studio中使用LLVM+Clang时没有定义__clang__?
- 在CMake项目中编译后增加自定义llvm优化命令(opt)
- 使用llvm和clang的架构x86_64的未定义符号
- 如何在LLVM中声明函数并稍后定义它