gpt4 book ai didi

llvm - 如何在 LLVM 中找到值的 "the"定义点?

转载 作者:行者123 更新时间:2023-12-05 01:06:11 26 4
gpt4 key购买 nike

LLVM 对其 IR 使用静态单一赋值 (SSA) 形式,这意味着每个 Value 都有一个单一的定义点。那么,什么是最简单(也是最通用)的方法来找到 Value 的“the”定义点,而不必检查每次使用并确定我们的 Value 是如何被使用的?在下面的代码中,我对用作函数参数的 Value 的定义点感兴趣。

protected: void getValueDefs( Function * F ) {
for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I) {
ImmutableCallSite CS( cast<Value>(I) );
if ( !CS || isa<IntrinsicInst>(I) ) continue;
for ( User::const_op_iterator Ab = CS.arg_begin(), Ae = CS.arg_end(); Ab != Ae; ++Ab ) {
for ( User *U : Ab->get()->users() ) {
if (Instruction *Inst = dyn_cast<Instruction>(U)) {
/* How to do the check here?? */
}
}
}
}
}

最佳答案

这种写法有点奇怪。我可能会做这样的事情:

void scanFunc(Function &F) {

for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) {
for (BasicBlock::iterator BBI = BB->begin(), BBE = BB->end(); BBI != BBE;
++BBI) {
if (CallInst *CI = dyn_cast<CallInst>(BBI)) {
dbgs() << "Call: ";
CI->dump();
dbgs() << "\n";
ImmutableCallSite CS(CI);
for (ImmutableCallSite::arg_iterator I = CS.arg_begin(),
E = CS.arg_end();
I != E; ++I) {
if (Instruction *Inst = dyn_cast<Instruction>(*I)) {
// Do stuff
dbgs() << "\tInst: ";
Inst->dump();
dbgs() << "\n";

}
}
}
}
}
}

但基本上,如果它是一条指令,它就是值的定义。这就是 IR 的工作原理。否则,它可能是一个常量等。如果你使用这段代码:

int a (int b) {
return b + 4;
}

int b (int c) {
return a(c) + a(c-1);
}

int d (int e, int f, int g) {
int h = a(4);
int i = b(5);
int j = b(6);

return h + i + j + e + f + g;
}

并将其编译为 IR 并在其上运行此代码,您将看到:

Call:   %call = call i32 @_Z1ai(i32 %0)

Inst: %0 = load i32* %c.addr, align 4

Call: %call1 = call i32 @_Z1ai(i32 %sub)

Inst: %sub = sub nsw i32 %1, 1

Call: %call = call i32 @_Z1ai(i32 4)

Call: %call1 = call i32 @_Z1bi(i32 5)

Call: %call2 = call i32 @_Z1bi(i32 6)

关于llvm - 如何在 LLVM 中找到值的 "the"定义点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27436458/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com