分析LLVM IR指令
Analyzing LLVM IR instruction
我正在尝试分析以下 llvm-ir 指令:
%0 = call nonnull {}* inttoptr (i64 140019712366044 to {}* ({}*, i64)*)({}* inttoptr (i64 140019153768096 to {}*), i64 0)
我找不到任何关于 docs 中 {}*
的信息。它是指向空结构的指针吗?
这条指令是做什么的?
Is it a pointer to an empty struct ?
是的。有点像空指针。 void*
在 LLVM IR 中不是有效类型,大多数前端为此目的使用 i8*
。
What does this instruction do ?
这是间接调用。第一个 {}*
是被调用者的 return 类型(并且保证是一个 nonnull
指针!),被调用者是值 i64 140019712366044
转换为指向函数的指针returns {}*
并采用两个参数,{}*
和 i64
。然后对于第一个参数,它将此函数 i64 140019153768096
转换为 {}*
和 0 作为第二个参数。
那些常量数字表明这是一个 JIT,而那些是指向此 LLVM IR 模块之外的东西的指针。
我正在尝试分析以下 llvm-ir 指令:
%0 = call nonnull {}* inttoptr (i64 140019712366044 to {}* ({}*, i64)*)({}* inttoptr (i64 140019153768096 to {}*), i64 0)
我找不到任何关于 docs 中 {}*
的信息。它是指向空结构的指针吗?
这条指令是做什么的?
Is it a pointer to an empty struct ?
是的。有点像空指针。 void*
在 LLVM IR 中不是有效类型,大多数前端为此目的使用 i8*
。
What does this instruction do ?
这是间接调用。第一个 {}*
是被调用者的 return 类型(并且保证是一个 nonnull
指针!),被调用者是值 i64 140019712366044
转换为指向函数的指针returns {}*
并采用两个参数,{}*
和 i64
。然后对于第一个参数,它将此函数 i64 140019153768096
转换为 {}*
和 0 作为第二个参数。
那些常量数字表明这是一个 JIT,而那些是指向此 LLVM IR 模块之外的东西的指针。