我想存储有关正在分配和更改的每个堆栈内存的数据。
为此,我认为我需要一种可以存储相关数据的某种数据结构,例如局部变量的值及其任何变化,例如在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);
}
答案 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