【问题标题】:getting Data stored in an LLVM variable获取存储在 LLVM 变量中的数据
【发布时间】:2021-05-30 10:52:16
【问题描述】:

我正在构建一个将汇编代码转换为 LLVM IR 的升降器。我想知道是否有可能的方法来检查存储在 LLVM 变量中的数据。例如在我下面的代码中。我正在创建一个虚拟 LLVM 函数。在我的函数内部,我只有一个基本块,我在其中为单个变量 SRC 分配内存,然后在分配的内存中存储立即值 31。最后一步是我从该内存中加载到一个名为loaded 的变量中。 有没有办法检查 %loaded 变量的值实际上是 31 吗?。

int main()

{

llvm::LLVMContext context;

llvm::Type* type = llvm::Type::getVoidTy(context);

Module* modu = new Module("test", context);

modu->getOrInsertFunction("dummy",type);

Function* dummy = modu->getFunction("dummy");

BasicBlock* block = BasicBlock::Create(context, "entry", dummy);

IRBuilder<> builder(block);

llvm::Value* SRC = builder.CreateAlloca(Type::getInt32Ty(context), nullptr);

llvm::Value* s = builder.CreateStore(llvm::ConstantInt::get(context, llvm::APInt(/*nbits*/32, 31, true)), SRC,  /*isVolatile=*/false);

llvm::Value* loaded = builder.CreateLoad(SRC, "loaded");    

builder.CreateRetVoid();    

PassManager <llvm::Module>PM;

llvm::AnalysisManager  <llvm::Module>AM;

verifyFunction(*(modu->getFunction("dummy")), &llvm::errs());

verifyModule(*modu, &llvm::errs());

PassBuilder PB;

PB.registerModuleAnalyses(AM);    

PM.addPass(PrintModulePass());

PM.run(*modu, AM);

我的代码输出如下所示:

; ModuleID = 'test'
source_filename = "test"

define void @dummy() {
entry:
%0 = alloca i32, align 4
store i32 31, i32* %0, align 4
%loaded = load i32, i32* %0, align 4
ret void
}

【问题讨论】:

    标签: c++ llvm lifting


    【解决方案1】:

    您可以插入对printf 的调用并将此 IR 编译为本机可执行文件。运行它会打印出变量值。

    或者,您可以在调试器下在此 IR 上运行 lli 并在 load 处理程序上中断。

    【讨论】:

    • 感谢您的评论.. 所以我将此部分添加到我现有的代码中:std::error_code EC; llvm::raw_fd_ostream OS("module", EC); WriteBitcodeToFile(*modu, OS); OS.flush();.. 获取可以运行 lli 命令的 llvm 位码文件,但是,我收到此错误:lli: Symbols not found: [ main ]..任何提示我可能会丢失,好吗?
    • 显然,它会尝试定位main 函数以从它开始执行。使用lli -entry-function=foo 使其从foo 开始。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多