gpt4 book ai didi

llvm - LLVM 操作数的遍历

转载 作者:行者123 更新时间:2023-12-04 12:45:45 29 4
gpt4 key购买 nike

使用 ModulePass,我的目标是向上遍历 SSA 图:从一个具有 0..2 个操作数的语句(大多数操作码属于该语句)开始,我想找出两件事:

  • 操作数是元数据/常量(简单:只需尝试转换为常量类型)还是变量?
  • 如果它是一个变量,请给我它定义的语句(因为 LLVM IR 是 SSA 形式,这是一个格式良好的查询),这样我就可以递归地继续这个遍历。

  • 例如,假设遵循 LLVM IR:
    define i32 @mul_add(i32 %x, i32 %y, i32 %z) {
    entry:
    %tmp = mul i32 %x, %y
    %tmp2 = add i32 %tmp, %z
    ret i32 %tmp2
    }

    我将从 return 语句开始。现在我想知道我要返回什么:
  • 我会得到返回语句的操作数
  • 我检测到操作数是一个名为 %tmp2
  • 的变量
  • 我将获得定义 %tmp2 的语句的操作数
  • 我先遍历第一个操作数,%tmp
  • (...)
  • %x 是一个函数参数,因此可能是我遍历的结束(或者是?)
  • (...继续此 DFS 中的其他分支...)

  • 我将如何使用 C++ API 来实现这些步骤?

    最佳答案

    解决方案很简单,我将尽可能地描述它。

    每个Operandllvm::Instruction在 LLVM 中是父类(super class)型 llvm::Value . Value的亚型是 llvm::Instruction .这允许通过以下方法递归:

    bool runOnInstruction(llvm::Instruction *instruction) {
    bool flag = false;
    for (auto operand = instruction->operands().begin();
    operand != instruction->operands().end(); ++operand) {
    printOperandStats(operand->get());
    flag = runOnOperand(operand->get()) | flag;
    }
    return flag;
    }

    bool runOnOperand(llvm::Value *operand) {
    operand->printAsOperand(errs(), true);
    // ... do something else ...
    auto *instruction = dyn_cast<llvm::Instruction>(operand);
    if (nullptr != instruction) {
    return runOnInstruction(instruction);
    } else {
    return false;
    }
    }

    这等于问题要求的 DFS。每个操作数将被转换为一个指令,并将被递归分析。 LLVM Passes 通常使用 bool 返回值:true 值描述对 IR 的修改。

    关于llvm - LLVM 操作数的遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44946645/

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