LLVM如何获取callsite文件名和行号

时间:2017-01-18 08:07:30

标签: c++ llvm

我对LLVM非常陌生,这是我第一次编写C ++

我需要找到几个与LLVM CallSite相关的函数信息,但是,我在这里检查了源代码:LLVM CallSite Source Code

仍然不知道从哪里获取呼叫站点文件名(例如,CallSite在example.c文件中),呼叫站点行号(例如,在线整个计划中的18个)

您知道如何获取呼叫站点文件名和行号吗?

1 个答案:

答案 0 :(得分:3)

您可以通过从被调用函数中检索调试信息来获取此信息。算法如下:

  1. 你需要得到底层的被叫值,这是一个函数。
  2. 然后你需要获得附加到该功能的调试信息。
  3. 调试信息应包含您需要的所有内容。
  4. 这是一个应该完成工作的代码(虽然我没有运行它):

    CallSite cs = ...;
    if (!cs.isCall() && !cs.isInvoke()) {
      break;
    }
    
    Function *calledFunction = dyn_cast<Function>(cs.getCalledValue());
    if (!calledFunction) {
      break;
    }
    
    MDNode *metadata = calledFunction->getMetadata(0);
    if (!metadata) {
      break;
    }
    
    DILocation *debugLocation = dyn_cast<DILocation>(metadata);
    if (debugLocation) {
      debugLocation->getFilename();
      debugLocation->getLine();
    }
    

    请注意休息时间。他们在这里表明每一步都可能不会成功,所以你应该准备好处理所有这些情况。