如何从CPP源代码行号中获取LLVM位码行号?
How to get LLVM bitcode line number from CPP source code line number?
我有一个 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()
调用的来源是语言规则,而不是源代码中的任何位置。
相关文章:
- 将尾部调用void(i32,..)位转换为llvm::函数以获取FnAttribute
- 如何在使用 LLVM 编译时获取部分源代码的二进制代码
- 获取 LLVM 模块中的所有值
- 通过命令行参数获取llvm ir文件时面临问题
- 在LLVM中,如何获取Value的ValuetoValueMapTy (VMap)?它的目的是什么?
- 在 LLVM 中获取全局字符串值
- 如何从CPP源代码行号中获取LLVM位码行号?
- 如何在Clang LLVM AST中获取UnaryOperator的DevlRefExpr操作数
- 如何从LLVM的中间表示中获取在程序的每个函数中执行的函数调用列表
- 如何获取 LLVM 全局变量常量值
- 获取 llvm 指令的使用和定义
- 读取 STDIN 时如何获取 llvm::MemoryBuffer 的内容?
- 获取 llvm::MCJIT 代码生成后的函数大小
- 如何从LLVM中的Phinode及其相应的基本块中获取标签
- LLVM 如何获取调用站点文件名和行号
- 如何在LLVM 5.0中从TargetMachine获取DataLayout
- 如何获取LLVM中指令引用的所有全局变量
- 获取 llvm::函数静态地址
- 如何在LLVM中获取结构成员的值?
- 如何从 .ll 文件 LLVM 获取源代码行号