4

我正在使用 C 和 LLVM 编写一些代码。我知道LLVMGetOperand返回 aLLVMValueRef但我想知道它到底是什么,因为它似乎LLVMValueRef可以是许多不同的东西。是否LLVMGetOperand返回创建操作数的指令?

我最终需要做的是获取指令操作数并获取创造价值的指令。如在

%3 = ADD %1 %2
...
%5 = ADD ...
...
%8 = SUB %3 %5

如果我知道指令%8 = SUB %3 %5,我想得到操作数%3%5然后用这些值得到指令%3 = ADD %1 %2%5 = ADD ...。我知道我需要使用LLVMGetOperand(),但我不知道它返回什么以及如何使用它来获得我需要的指令。如果它只是返回指令会很好。

我也调查了LLVMGetFirstUse()。是否LLVMGetFirstUse()接受一条指令,然后返回该指令产生的值的第一次使用?

我知道llvm.org并一直在使用它,我只需要比该网站上提供的更多说明。

4

1 回答 1

0

由于 C 绑定反映了 C++ 代码的结构,因此熟悉 C++ 中的工作方式通常是一个好主意。一个起点是LLVM Programmer's Manual

你提到的ValueRef只是Value*在C代码中。以下是手册中的描述

该类Value是 LLVM Source 基础中最重要的类。它表示一个类型化的值,可以(除其他外)用作指令的操作数。有很多不同的类型 Values,例如Constants, Arguments。甚至InstructionsFunctionsValues

现在,为了组装基本块,您通常使用IRBuilder该类。在 C 代码中,这对应于LLVMBuild*函数族。例如,这里是用于创建sub指令的函数的签名:

LLVMValueRef LLVMBuildSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
                          const char *Name);

第一个参数是对IRBuilder对象的引用,第二个是第一个操作数,第三个是第二个操作数,最后一个是结果值的可选名称。所以你的例子看起来像这样(未经测试):

/* I'm assuming that you have already created a basic block bb. */
LLVMBuilderRef builder = LLVMCreateBuilder(); 
LLVMPositionBuilderAtEnd(builder, bb);
LLVMValueRef lhs = LLVMBuildAdd(builder, 
    LLVMConstInt(LLVMInt32Type(), 1, 0), 
    LLVMConstInt(LLVMInt32Type(), 2, 0), NULL);
LLVMValueRef rhs = LLVMBuildAdd(builder, 
    LLVMConstInt(LLVMInt32Type(), 3, 0), 
    LLVMConstInt(LLVMInt32Type(), 4, 0), NULL);
LLVMBuildSub(build, lhs, rhs, NULL);

关于LLVMGetFirstUse: 给定 a Value,您可以遍历所有使用它的地方。LLVMGetFirstUse给你一个迭代器 ( LLVMUseRef) 指向你可以递增 ( LLVMGetNextUse) 和取消引用 ( LLVMGetUser) 的使用列表的头部。有关llvm/Use.h更多信息,请参阅。

于 2012-10-30T23:09:05.917 回答