2012-12-17 3 views
1

저는 LLVM의 초보자입니다. BasicBlock의 지시 사항 사이를 이동하려고하는데 할 수 없습니다. 이 특별한 예에서 나는 마지막 명령의 이전 명령을 얻으려고합니다.LLVM BasicBlock pass

  1. 나는이 코드의 다음과 같은 순서 : 나는이 방법을 시도하고

    bool patternDC::runOnBasicBlock(BasicBlock &BB) { 
    ... 
    if (BB.getTerminator()) 
        { 
          Instruction* current = BB.getTerminator(); 
          errs() << "\n LAST: "<<*current<<"\n"; 
    
         Instruction* prev = &BB.back(); 
         errs() << "\n PENULTIMATE: "<<*prev<<"\n";   
         ... 
    

터미널 인쇄 동일한 명령. 나는 back()이 어떻게 작동하는지 모른다. (파일 BasicBlock.h의 라인 199에서 정의.) 나는 또한 시도

  1. :

    bool patternDC::runOnBasicBlock(BasicBlock &BB) { 
    ... 
    BasicBlock::const_iterator I = BB.begin(); 
    BasicBlock::const_iterator E = BB.end(); 
    BasicBlock::const_iterator prev_iter,last_iter; 
    prev_iter = NULL; last_iter = NULL; 
    for(;I!=E;I++){ 
        prev_iter = last_iter; 
        last_iter = I; 
    } 
    if(prev_iter){ 
        errs() << "prev_iter: " << *(dyn_cast<Instruction>(prev_iter)) << "\n"; 
    } 
    if(last_iter){ 
        errs() << "last_iter: " << *(dyn_cast<Instruction>(last_iter)) << "\n"; 
    } 
    // not related to the main question: uncomment the next line for an unusual  
    //behavior: lastlast is DIFFERENT from last.lastlast=section(BasicBlock) 
        // errs() << "lastlast: " << *(dyn_cast<Instruction>(I)) << "\n"; 
        ... 
        Instruction* prev = *(dyn_cast<Instruction*>(prev_iter)); 
        errs() << "\n prev: "<<*prev<<"\n"; 
    

터미널 인쇄물을 밖으로 잘 이전과 마지막으로 할 때 나는 컴파일 오류가 명령어에 할당 * prev Clang 오류 : "..... /home/alex/llvm/include/llvm/Support/Casting.h:51:28 : 오류 : 'classof'은 (는) 다음 멤버의 멤버가 아닙니다. 'llvm :: Instruction *' "

누군가가 기본 블록에서 모든 요소를 ​​사용할 수있는 더 좋은 방법을 알고 이들이 작동하지 않는 이유를 알고 있다면

, 알렉스

답변

-1

요소 만있는 기본 블록에 대해 (BB-> size()> 1) 확인하여 해결했습니다.

1

에게, 나에게 :)

감사합니다 알려 모든 LLVM Instruction 클래스는 ilist_node입니다하시기 바랍니다 즉, 목록에서 다음/이전 명령 (이 경우 기본 블록)을 쿼리 할 수 ​​있습니다. 보다 구체적으로 귀하의 질문에 :

Instruction* last = BB.getTerminator(); 
Instruction* prev = last->getPrevNode(); 

은 관련 API를 볼 수 LLVM의 소스 ilist_node의 정의를 참조 해주세요.

+0

감사합니다! 이제는 컴파일 오류가 없습니다. 하지만 지금은 * prev를 사용하려고 할 때마다 런타임에 스택 덤프 오류가 발생합니다. – Alex

+0

@ user1817807 : 명령어가 하나 인 기본 블록이있을 수 있습니다. 'prev'가 NULL인지 확인하십시오. –

+0

감사합니다! 나는 모든 가능성을 점검 할 것이다. – Alex