如何使用调用和分配指令在 llvm 字节码中查找类名
How to locate class name in the llvm bytecode, using call and alloca instructions?
我有以下C++代码:
class Date {
public:
Date(int, int, int);
private:
int year; int month; int day;
};
extern "C" int main(int argc, char *argv[])
{
Date today(1,9,2014);
//....
return 0;
}
Date::Date(int d, int m, int y) { day = d; month = m; year =y; }
对应的字节码为:
@_ZN4DateC1Eiii = alias void (%class.Date*, i32, i32, i32)* @_ZN4DateC2Eiii
define i32 @main(i32 %argc, i8** %argv) {
entry:
%retval = alloca i32, align 4
%argc.addr = alloca i32, align 4
%argv.addr = alloca i8**, align 4
%today = alloca %class.Date, align 4
store i32 0, i32* %retval
store i32 %argc, i32* %argc.addr, align 4
call void @llvm.dbg.declare(metadata !{i32* %argc.addr}, metadata !922), !dbg !923
store i8** %argv, i8*** %argv.addr, align 4
call void @llvm.dbg.declare(metadata !{i8*** %argv.addr}, metadata !924), !dbg !923
call void @llvm.dbg.declare(metadata !{%class.Date* %today}, metadata !925), !dbg !927
call void @_ZN4DateC1Eiii(%class.Date* %today, i32 1, i32 9, i32 1999), !dbg !927
//...
ret i32 0, !dbg !930
}
//...
define void @_ZN4DateC2Eiii(%class.Date* %this, i32 %d, i32 %m, i32 %y) unnamed_addr nounwind align 2 {
entry:
//...
}
我正在解析此代码,我需要在此语句中提取类名:% today = alloca% class.Date, align 4
有什么办法可以查看刚刚返回的:class.Date
???
我还需要知道如何从调用开始@ _ZN4DateC2Eiii
函数:
call void @ _ZN4DateC1Eiii (class.Date% *% today, i32 1, i32 9, i32 1999)! dbg! 927.
Clang 将使用类名来命名 LLVM 类型,如您在示例中所看到的(它使用 %class.Date
作为类型名称)。但是,获取类型名称的唯一可靠方法是查询调试信息。为此:
-
确定您关心
alloca
。 -
迭代函数,直到找到对
llvm.dbg.declare
的调用,其中第一个参数是包装 (1) 中的值的元数据节点。- 您可以使用
isa<DbgDeclareInst>
。
- 您可以使用
-
创建一个新的
DIVariable
实例,将 (2) 中的元数据节点作为构造函数参数传递。 -
您可以通过从 (3) 中调用对象上的
getType
来检索对象的类DIType
类型。可以在类型DIType
的对象上使用getName
来获取类型名称。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 正在查找文档以获得PS4平台的C++中的设备信息
- 在C++中查找文件
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 模板元程序查找相似的连续类型名称
- 在UNIX系统中使用DIR查找文件的字节大小
- 查找最接近的大于当前数字的数字的索引
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 查找后更改类变量
- 如何在文件中查找字节序列
- 查找二进制文件中字节序列的所有匹配项
- 需要帮助从12个字节生成新的24字节RGB查找阵列,或者是一种更好的编码方法
- 如何使用调用和别名指令在 llvm 字节码中查找函数名称
- 如何使用调用和分配指令在 llvm 字节码中查找类名
- 如何查找文件中的第 n 个字节
- 查找缓冲区中字节首次出现的最快方法
- 查找从类/结构开始偏移N字节的所有类/结构的所有成员
- 使用字符串中的unicode特殊字符的字节查找其Find_first_of
- 从64字节数组中查找字节的最快方法
- 查找数组中给定索引的第一个和最后一个字节的地址