我想在IR中打印调试信息的确切数量,我该怎么做呢?
例如,考虑如下所示的IR块,
call void @llvm.dbg.declare(metadata i32* %a, metadata !10, metadata !11), !dbg !12!
!12 = !DILocation(line: 19, column: 7, scope: !6)出于调试目的,我想将!12打印为字符串。我可以通过执行以下操作来获取DILocation的对象
Instruction::getDebugLoc()->get()但我得到的只是一个指针,并且没有这样的接口来获取数字。我可以假设LLVM在实际生成位码时给出了这个数字,因为转储DILocation会得到类似如下的结果
<0x7342628> = !DILocation(line: 23, column: 3, scope: <0x733e5f8>)这。但是当我使用Instruction::dump()时,它给出的结果如下所示
call void @llvm.dbg.declare(metadata i32* %a, metadata !10, metadata !11), !dbg !12这一点,所以我搞不懂它在运行时是否有debug-info的编号信息。
它有没有编号信息?如果是这样的话,我如何获取这些信息?如果没有,我应该在哪里检查LLVM中的位码生成?
发布于 2017-03-15 00:26:20
您是在谈论行/列号吗?如果是这样,那么您可以直接从debugLoc轻松地访问它们
instruction->getDebugLoc()->getLine()
instruction->getDebugLoc()->getColumn()请参阅DebugInfoMetadata上的定义
unsigned getLine() const { return SubclassData32; }
unsigned getColumn() const { return SubclassData16; }发布于 2017-05-06 05:00:20
现在回答这个问题可能还不算太晚。
if (instruction->hasMetadata()) {
instruction->dump();
// one way
SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;
instruction->getAllMetadata(MDs);
for (auto &MD : MDs) {
if (MDNode *N = MD.second) {
N->printAsOperand(errs(), instruction->getModule());
errs() << "\n";
}
}
// second way
instruction->getDebugLoc()->printAsOperand(errs(), instruction->getModule());
errs() << "\n";
// third way
int debugInfoKindID = 0;
MDNode *debug = instruction->getMetadata(debugInfoKindID);
debug->printAsOperand(errs(), instruction->getModule());
errs() << "\n";
}输出为:
%11 = add nsw i32 %9, %10, !dbg !29
!29
!29
!29我通过查看它的测试TEST_F(MDNodeTest, PrintFromMetadataAsValue) llvm//unittests/IR/MetadataTest.cpp找到了这一点。
https://stackoverflow.com/questions/42790506
复制相似问题