나는 기본 블록에 간단한 패스를 작성하려고하고 다음과 같이 코드는 다음과 같습니다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 블록의
블록의 마지막 명령이 TerminatorInst 명령이 아닙니까? (즉, 실제 코드를 나타내지는 않습니다.) –
@JoachimIsaksson aha 나는 그 문제를 해결했다고 생각합니다. – dorafmon