Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Llvm 从函数中获取文件名和位置_Llvm_Clang++_Llvm Clang_Llvm Ir_Llvm 3.0 - Fatal编程技术网

Llvm 从函数中获取文件名和位置

Llvm 从函数中获取文件名和位置,llvm,clang++,llvm-clang,llvm-ir,llvm-3.0,Llvm,Clang++,Llvm Clang,Llvm Ir,Llvm 3.0,我有一个迭代LLVM IR代码的LLVM过程,我想为原始代码的函数和基本块获取一个目录和文件名。我知道,当我有一个指令指针时,我可以使用下面的代码轻松地获得信息:感谢@hailinzeng () 给出下面的错误 /usr/lib/llvm-3.9/include/llvm/IR/Metadata.def:83:42:注意:“llvm::DILocation”的前向声明 手柄\u专用\u MDNODE\u叶\u唯一(位置) 我正在使用LLVM3.9 更新:: 谢谢Stanislav Pankevi

我有一个迭代LLVM IR代码的LLVM过程,我想为原始代码的函数和基本块获取一个目录和文件名。我知道,当我有一个指令指针时,我可以使用下面的代码轻松地获得信息:感谢@hailinzeng ()

给出下面的错误

/usr/lib/llvm-3.9/include/llvm/IR/Metadata.def:83:42:注意:“llvm::DILocation”的前向声明 手柄\u专用\u MDNODE\u叶\u唯一(位置)

我正在使用LLVM3.9

更新:: 谢谢Stanislav Pankevich。我没有包括正确的标题,但现在我有一个新的问题。DILocation需要LLVMContext、StorageType和未签名行。如何从函数指针获取行号和存储类型?
DILocation(LLVMContext&C,StorageType存储,未签名行,

对于处理类似问题的人员,可以使用

llvm::MDNode * testmd = F.getMetadata("dbg");
F.getContext ()

如果查看.ll文件中的代码,您会发现每个函数都有与其关联的DINode,类似于
。这是元数据节点号,其中包含有关该函数的信息。该节点的类型是,您可以按如下方式访问它:

SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;
F.getAllMetadata(MDs);
for (auto &MD : MDs) {
  if (MDNode *N = MD.second) {
    if (auto *subProgram = dyn_cast<DISubprogram>(N)) {
      errs() << subProgram->getLine();
    }
  }
}
smallvectormds;
F.getAllMetadata(MDs);
用于(自动和MD:MDs){
if(MDNode*N=MD.second){
if(自动*子程序=动态转换(N)){
errs()getLine();
}
}
}

您可以使用调试节点中的所有信息。

如果查看代码的.ll文件,您会看到每个函数都有与其关联的DINode,类似于
。这是元数据节点号,其中包含有关该函数的信息。该节点的类型是您可以按如下方式访问它:

SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;
F.getAllMetadata(MDs);
for (auto &MD : MDs) {
  if (MDNode *N = MD.second) {
    if (auto *subProgram = dyn_cast<DISubprogram>(N)) {
      errs() << subProgram->getLine();
    }
  }
}
smallvectormds;
F.getAllMetadata(MDs);
用于(自动和MD:MDs){
if(MDNode*N=MD.second){
if(自动*子程序=动态转换(N)){
errs()getLine();
}
}
}

您可以使用“调试”节点中的所有信息。

如果我们需要列详细信息,该如何处理?这在DISubprogram中是不可能的。 我试过这个:

DILocation *debugLocation = dyn_cast<DILocation>(N);
debugLocation->getLine();
DILocation*debugLocation=dyn\u cast(N);
debugLocation->getLine();
sample.ll文件不包含以下行: !10=!位置(行:1,列:1,作用域:!1)
但是,它会在运行时转储内核。请提供如何使其工作的任何建议。

如果我们需要列详细信息,如何处理,这在DISubprogram中是不可能的。 我试过这个:

DILocation *debugLocation = dyn_cast<DILocation>(N);
debugLocation->getLine();
DILocation*debugLocation=dyn\u cast(N);
debugLocation->getLine();
sample.ll文件不包含以下行: !10=!位置(行:1,列:1,作用域:!1)
但是,它会在运行时转储内核。请给出如何使其工作的任何建议。

注意:转发声明…消息表明您缺少
包括“llvm/IR/DebugInfoMetadata.h”以及可能的
包括“llvm/IR/DebugInfo.h”
导入。另请参见:。您确定链接主题中的方法对您不起作用吗:
MDNode*metadata=function->getMetadata(0);
,然后
DILocation*debugLocation=dyn_cast(metadata);
?注意:转发声明…消息表明您缺少
\include>“llvm/IR/DebugInfo.h”
和可能的
#包括“llvm/IR/DebugInfo.h”
导入。另请参见:。您确定链接主题中的方法对您无效:
MDNode*metadata=function->getMetadata(0);
,然后
DILocation*debugLocation=dyn\u cast(元数据)
?回答得很好。必须做一些更改,但效果很好。您也可以在llvm::Function上简单地使用方法“getSubprogram”,它直接返回双程序(如果存在)。回答得很好。必须做一些更改,但效果很好。您也可以简单地使用方法“getSubprogram”在llvm::函数上,该函数直接返回DISubprogram(如果存在)。