如何识别 LLVM/C++ 中的任何类型的指令?

Nei*_*ral 6 c++ types casting llvm-clang

我被要求做一个 LLVM 函数,它允许我找到:跳转/分支、加载/存储、调用、“算术和其他类型的指令”。

就我设法做的而言,我已经能够找到使用 dyn_cast 执行以下代码的 CallInst、LoadInst、StoreInst 和 BranchInst:

for (const Function &F : *M) 
    for (const BasicBlock &BB : F) 
        for (const Instruction &I : BB) 
            if (const StoreInst *SI = dyn_cast<StoreInst>(&I)) 
                 count++;;
Run Code Online (Sandbox Code Playgroud)

我正在努力寻找一种提取所有算术和“其他类型”指令的方法。

谢谢你的时间。

Lan*_*udo 5

你可以在这里看到

if (llvm::isa <llvm::LoadInst> (I))
Run Code Online (Sandbox Code Playgroud)

llvm::StoreInst等。

对于包含二元运算符的指令,llvm::isa <llvm::BinaryOperator> (I)无法区分它们。用

if (!strncmp(I.getOpcodeName(), "add", 4))
Run Code Online (Sandbox Code Playgroud)

或者

if (I.getOpcode == llvm::Add)
Run Code Online (Sandbox Code Playgroud)

您可以在此处此处找到 OpcodeNames 和 Opcode

  • `I.getOpcode` 将是 `I.getOpcode()` (3认同)