Llvm 从函数中获取文件名和位置
我有一个迭代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和未签名行。如何从函数指针获取行号和存储类型?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
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(如果存在)。