对于LLVM IR指令,%cmp7 = icmp eq i32 %6 %7我希望得到所有三个寄存器/符号名称(即%cmp %6 and %7)
现在我可以%cmp通过命令获取字符串,pi->getName()其中pi是指令指针.但是当我尝试获取操作名称时,我通过键入获得了空字符串pi->getOperand(0)->getName().
我试图isa<Instruction>(pi->getOperand(0))检查这是否是一个指令,它返回true但pi->getOperand(0)->hasName()返回false.事情让我感到奇怪的是,为什么这两个pi和pi->getOperand(0)的指示,但仅pi具有名?
有没有想法我可以使用API 获取操作数名称(字符串%6和 %7此处)?
我正在使用的LLVM版本是3.4.2
我想在某个指令之前插入一个函数,但函数调用是在另一个文件中定义的.我试过了
IRBuilder<> Builder(pi);
CallInst *callOne = Builder.CreateCall(func_ins, "foo");
Run Code Online (Sandbox Code Playgroud)
这里func_ins是func*(or Value* to be more general)和foo是调用函数的变量名称前缀我被分配.由于这个函数是在另一个文件中定义的,我不知道指针func_ins应该指向哪里,所以我只是将它设置为NULL但它不起作用.
谁能给我一些关于如何解决这个问题的提示?
还有一个问题是我可以使用WriteBitcodeToFile转储具有外部函数调用文件的已检测代码,因为我想知道它可能会报告Referencing function in another module还是Broken Module在执行模块检查时?
我试图通过编写函数传递从 IR 获取循环信息。所以我按照一些例子写了如下。我对写通行证和通行证管理器不是很熟悉。
#include <iostream>
#include "llvm/LLVMContext.h"
#include "llvm/Module.h"
#include "llvm/Function.h"
#include "llvm/BasicBlock.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Support/IRReader.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/LoopPass.h"
#include "llvm/Pass.h"
#include "llvm/PassManager.h"
using namespace llvm;
namespace {
class DetectLoop: public FunctionPass {
public:
DetectLoop() : FunctionPass(ID) {}
static char ID;
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<LoopInfo>();//I'm not sure if it's correct here *****1*****
}
virtual bool runOnFunction(Function &F) {
if (!F.isDeclaration())
LoopInfo &li = getAnalysis<LoopInfo>(F);//*****2*****
for (Function::iterator I = F.begin(); I != …Run Code Online (Sandbox Code Playgroud) 我有一个C代码(例如,称为ac),它调用我们这样的函数printf,textcolor并gotoxy从stdio.h/curses.h 调用.用于ac的LLVM-IR将仅声明这些函数并显示已调用这些函数意味着它不具有用于在a.ll中实现这些函数的详细IR.有没有什么方法可以访问这些IR或将所有实现(这些函数调用的a.c + IR的IR)放在一个.ll文件中?我不太了解LLVM,所以如果我犯了一些概念错误,请告诉我.