我有一个 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()
调用的来源是语言规则,而不是源代码中的任何位置。