2017-03-14 13 views
1

정확한 디버그 정보를 IR에 인쇄하고 싶습니다. 어떻게해야합니까?LLVM-IR의 디버그 정보 이름 또는 번호 취득

예를 들어, 내가 목적을 디버깅 문자열로 !12를 인쇄하려면 다음과 같이 적외선 덩어리,

call void @llvm.dbg.declare(metadata i32* %a, metadata !10, metadata !11), !dbg !12! 
!12 = !DILocation(line: 19, column: 7, scope: !6) 

을 고려하십시오. 나는

Instruction::getDebugLoc()->get() 

을 수행하여 DILocation의 목적을 획득 할 수 있지만, 내가 할 모든 포인터이며 수를 획득하기위한 이러한 인터페이스가 없습니다. 나는 DILocation를 투기

<0x7342628> = !DILocation(line: 23, column: 3, scope: <0x733e5f8>) 

이 같은 결과 뭔가를 제공하기 때문에 실제로는 비트 코드를 생성 할 때 LLVM이 수를 제공한다고 가정 할 수있다. 내가 지시 :: 덤프()를 사용할 때, 그것은 나에게

call void @llvm.dbg.declare(metadata i32* %a, metadata !10, metadata !11), !dbg !12 

등이 보이는 뭔가를 제공합니다, 그래서 나는 그것을 실행하는 동안 번호 디버그 - 정보의 정보 여부가 있는지 여부를 혼란 스러워요.

번호 정보가 있습니까? 그렇다면 어떻게 그 정보를 얻을 수 있습니까? 그렇지 않다면, LLVM에서 비트 코드의 생성을 찾기 위해 어디에서 검사해야합니까?

답변

1

라인/열 번호에 대해 이야기하고 있습니까? 그렇다면, 당신은 쉽게 debugLoc에서 직접 액세스 할 수 있습니다

instruction->getDebugLoc()->getLine() 
instruction->getDebugLoc()->getColumn() 

DebugInfoMetadata에서 정의를 참조하십시오

unsigned getLine() const { return SubclassData32; } 
unsigned getColumn() const { return SubclassData16; } 
+1

줄 번호와 열 번호가 아닙니다. 이 경우 디버그 정보 (IR에 있음)의 번호를 출력하고 싶습니다. 12 – izazu

+0

@izazu, oh, my bad. 디버그 정보 노드에 대한 참조로 해석했습니다. – AlexDenisov

2

이 질문에 대답하기 위해 아마 너무 늦게되지 않습니다.

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 

내가 llvm//unittests/IR/MetadataTest.cpp, 그 시험 TEST_F(MDNodeTest, PrintFromMetadataAsValue)보고이를 발견했다.