LLVM:在运行时更新数据结构

时间:2018-08-21 23:03:40

标签: c++ llvm llvm-clang llvm-ir

我想存储有关正在分配和更改的每个堆栈内存的数据。

为此,我认为我需要一种可以存储相关数据的某种数据结构,例如局部变量的值及其任何变化,例如在store指令之前。

此外,我应该能够在任何读取局部变量(例如load指令)之前,使用保存在数据结构中的值检查该值。

如果我们假设IR看起来像这样

%1 = alloca i32, 
[...]
%20 = store i32 0, %1

我需要更改上面的代码,使其看起来像下面的

%18 = call __Checking
%19 = <storing the return value from __Checking into a data structure>
%20 = store i32 0, %1

我的问题是我无法弄清楚如何将来自__Checking库的返回值存储到我在开头定义的StructType中。

我的相关代码

if (StoreInst *SI = dyn_cast<StoreInst>(&I)){
   Value* newValue = IRB.CreateCall(....);
   Type* strTy[] = { Type::getInt64Ty(m.getContext()),                                                                              
                     Type::getInt64Ty(m.getContext()) };
   Type* t = StructType::create(strTy);
}

1 个答案:

答案 0 :(得分:0)

您没有提供有关__Checking返回的类型(甚至__Checking来自哪里)和StructType内部的任何特定信息,所以我要建议用runtime library(很可能用C语言)来抽象该行为。

这将允许您在需要存储(或比较等)值的IR的那些部分中设置函数调用。函数会将值和StructType(以及其他必需的东西)作为参数,并在纯C中执行所需的操作(例如,存储值)。

例如,使用部分已发布的IR(应该在运行时库中定义前缀为myruntime_的名称)

%0 = alloca %myruntime_struct
[...]
%18 = call @__Checking
%19 = call @myruntime_storevalue(%2, %18, /* other arguments? */)
%20 = store i32 0, %1