2014-10-24 3 views
0

나는 기본 블록에 간단한 패스를 작성하려고하고 다음과 같이 코드는 다음과 같습니다llvm : visitInstruction이 기본 블록의 모든 명령어를 방문하지 않습니까?

struct SimplePass : BasicBlockPass, InstVisitor<SimplePass> 
{ 
    ... some initialisation and some finalization code 
    virtual bool runOnBasicBlock(BasicBlock& B) { 
     std::cout << "---This is a block divider---" << B.size() << std::endl; 
     visit(B); 
     return false; 
    } 
    void visitInstruction(Instruction& I){ 
     std::cout << "Visiting every single instruction:" << I.getOpcodeName(I.getOpcode()) << std::endl; 
    } 
    void visitBranchInst(BranchInst& I) { 
     if(I.isUnconditional()) { 
      std::cout << "Encountered an unconditional branch!" << std::endl; 
     } 
    } 

} 

을 매우 이상하게 나는이 같은 일부 출력을 얻을 :

... 
---This is a block divider---5 
Visiting every single instruction:call 
Visiting every single instruction:load 
Visiting every single instruction:add 
Visiting every single instruction:store 
Encountered an unconditional branch! 
---This is a block divider---7 
Visiting every single instruction:phi 
Visiting every single instruction:load 
Visiting every single instruction:sub 
Visiting every single instruction:call 
Visiting every single instruction:load 
Visiting every single instruction:icmp 
---This is a block divider---3 
...... 

쉽게 볼입니다 위의 두 블록 모두에서 실제 명령어 수는 5와 7이어야하지만 visitInstrucion 함수는 가끔 기본 블록의 마지막 명령어를 방문하지 않습니다. 왜 이런 일이 발생합니까? 이 일이 일어날 예정입니까? 제 1 블록의

+0

블록의 마지막 명령이 TerminatorInst 명령이 아닙니까? (즉, 실제 코드를 나타내지는 않습니다.) –

+1

@JoachimIsaksson aha 나는 그 문제를 해결했다고 생각합니다. – dorafmon

답변

1

:

Visiting every single instruction:call 
Visiting every single instruction:load 
Visiting every single instruction:add 
Visiting every single instruction:store 
Encountered an unconditional branch! 

그것은 비록 5! 마지막 줄은 void visitBranchInst(BranchInst& I)에서 발생하며 우선 순위는 visitInstruction입니다. 보다 구체적인 방문자가보다 일반적인 방문자보다 우선합니다. 어쨌든 visitInstruction을 호출하기를 원한다면, 더 많은 특정 방문자로부터 명시 적으로해야합니다. 자동으로 발생하지는 않습니다.

다음 블록은 조건부 분기로 끝날 수 있습니까? 그런 다음 visitBranchInst은 아무 것도 인쇄하지 않으며 visitInstruction으로 전파되지 않습니다.