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

时间:2019-08-07 05:10:06

标签: c++ llvm

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

1 个答案:

答案 0 :(得分:0)

可能没有一组与该确切行明显对应的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()调用的起源是一种语言规则,而不是源代码中的任何位置。