【问题标题】:How to get LLVM bitcode line number from CPP source code line number?如何从 CPP 源代码行号中获取 LLVM 位代码行号?
【发布时间】:2019-08-07 05:10:06
【问题描述】:

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

【问题讨论】:

    标签: c++ llvm


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2016-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 2011-06-29
      • 1970-01-01
      • 2011-11-22
      • 1970-01-01
      相关资源
      最近更新 更多