【问题标题】:How to get actual value of global variables in llvm如何在llvm中获取全局变量的实际值
【发布时间】:2017-06-13 20:46:33
【问题描述】:

例如:

int x=0;
int y=0;

其中 x 和 y 是全局变量,在 main() 函数中我们执行以下操作:

x++;
y++;

如何获取llvm中全局变量x和y的最新值。

当我尝试执行errs()<<g; 时,他们将初始值设为@BB0 = global i32 但我需要通过使用 llvm 来获得像 x=1 这样的实际值。

【问题讨论】:

  • 究竟是什么时候运行 LLVM?为什么你希望它知道运行时值?
  • 我在 MCJIT 中实现代码以获取所有指令。我想在运行 lli file.ll 后通过其名称获取全局变量的值
  • 这样可以取回每个全局变量的值吗?

标签: clang llvm llvm-clang


【解决方案1】:

假设您使用的是 LLVM 的 API:

如果全局是常量,可以直接访问它的初始化值,例如:

Constant* myGlobal = new GlobalVariable( myLlvmModule, myLlvmType, true, GlobalValue::InternalLinkage, initializationValue );
...
Constant* constValue = myGlobal->getInitializer();

如果该值是例如整数类型,你可以像这样检索它:

ConstantInt* constInt = cast<ConstantInt>( constValue );
int64_t constIntValue = constInt->getSExtValue();

如果全局不是常量,则必须加载它指向的数据(所有全局实际上都是指针):

Value* loadedValue = new LoadInst( myGlobal );

【讨论】:

    【解决方案2】:

    全局基本上是一个指针。您可以通过ExecutionEngine::getGlobalValueAddress 获取主机程序中的地址,然后您可以取消引用该地址以获取存储的值。

    【讨论】:

    • 这才是我真正需要的。谢谢
    • 此外,有没有一种方法可以获取局部变量的真实值。不是 getValue() 我想要真正的价值(比如 1、2、3.5 等)
    • @R.Omar 这是一个新的(尽管相关的)问题,请单独提出该问题。
    • 谢谢,我发了一个新问题
    • [stackoverflow.com/questions/44874575/…请您尽快回答这个问题
    猜你喜欢
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    相关资源
    最近更新 更多