【发布时间】:2019-08-07 05:10:06
【问题描述】:
我有一个 cpp 文件和使用 clang 9 的位代码。现在,我从源代码中选择一个 cpp 行号,我想获取此源代码行的 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() 调用的来源是语言规则,而不是源代码中的任何位置。
【讨论】: