如何从CPP源代码行号中获取LLVM位码行号?

  • 本文关键字:LLVM 获取 CPP 源代码 c++ llvm
  • 更新时间 :
  • 英文 :


我有一个 cpp 文件和使用 clang 9 的位码。现在,我从源代码中选择一个 cpp 行号,我想获取此源代码行的 LLVM 位代码行号,而不是手动反汇编位代码文件并逐行读取文件。请告诉我是否可能以及如何。

可能没有一组 IR 指令清楚地对应于该确切的行......但大多数情况下,这是可能的。有一个名为 Instruction ::getDebugLoc(( 的函数,如果它返回任何内容,它返回该特定指令的文件名和行号。你可以使用它。

但是你需要为一些猜测做好准备,原因有两个。

  • 如果一条指令来自第 42 行,而接下来的两条指令没有标记的原点,然后有一个来自第 43 行,您必须决定如何处理中间的两条指令。没有通用的答案,这取决于您的需求。

  • 如果特定C++行调用内联函数或宏,则报告的行很可能位于内联函数或宏中。这可能适合您,也可能不适合您。

getDebugLoc(( 要求您使用调试信息进行编译。即使您使用完整的调试信息进行编译,它也不能总是返回源,因为指令在源代码中并不总是具有清晰且唯一的源。例如,在C++中,此代码要求}行调用Bar::~Bar()

if(foo) {
Bar b(42);
b.quuz();
}

但是{}是可选的,这是合法的:

if(foo)
Bar b(42);

编译器必须调用Bar::~Bar()即使该调用没有代码行。可以说~Bar()调用的来源是语言规则,而不是源代码中的任何位置。

最新更新