分析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 模块之外的东西的指针。