ConstantStruct 或 ConstantArray 读取内存内容
ConstantStruct or ConstantArray read memory content
我正在写一些 llvm (3.7) pass,我需要一些关于 Constant 类 的信息。
在我正在解析的 llvm-IR 中,有 "ConstantStruct" 或 "ConstantArray" 实例用作全局变量的初始值设定项。例如:
%struct.S = type { i32, i32, i32, i32 }
@s = global [2 x %struct.S] [%struct.S { i32 6, i32 8, i32 -8, i32 -5 }, %struct.S { i32 0, i32 2, i32 -1, i32 2 }], align 4
如果我可以读取这些常量的内存,而不必递归遍历所有元素(也可以是 ConstantStructs 或数组),我的工作会容易得多。
例如,我需要一个函数
llvm::ConstantStruct* initializer = globalVar->getInitializer();
void* memoryContent;
int sizeInBytes = initializer->getMemoryContent(&memoryContent);
到目前为止,我必须一个一个地阅读元素,这是一个痛苦的(而且容易出错)的过程。
如有任何提示,我们将不胜感激。
我只是知道这是不可能的,因为初始化操作数中可能有 ConstExpr。
但是,我设法通过对 valueId 的大切换获得了一个很好的递归实现。
我正在写一些 llvm (3.7) pass,我需要一些关于 Constant 类 的信息。 在我正在解析的 llvm-IR 中,有 "ConstantStruct" 或 "ConstantArray" 实例用作全局变量的初始值设定项。例如:
%struct.S = type { i32, i32, i32, i32 }
@s = global [2 x %struct.S] [%struct.S { i32 6, i32 8, i32 -8, i32 -5 }, %struct.S { i32 0, i32 2, i32 -1, i32 2 }], align 4
如果我可以读取这些常量的内存,而不必递归遍历所有元素(也可以是 ConstantStructs 或数组),我的工作会容易得多。
例如,我需要一个函数
llvm::ConstantStruct* initializer = globalVar->getInitializer();
void* memoryContent;
int sizeInBytes = initializer->getMemoryContent(&memoryContent);
到目前为止,我必须一个一个地阅读元素,这是一个痛苦的(而且容易出错)的过程。
如有任何提示,我们将不胜感激。
我只是知道这是不可能的,因为初始化操作数中可能有 ConstExpr。
但是,我设法通过对 valueId 的大切换获得了一个很好的递归实现。