2012-11-13 2 views
5

몇 시간 동안 검색해 봤는데 도움이 될만한 것을 찾을 수 없습니다. 나는 FunctionPass를 포함하는 프로젝트에서 일하고있다. runOnFunction (Function & f) 메소드를 구현했는데 정상적으로 작동합니다.LLVM 명령어를 삽입하는 방법은 무엇입니까?

1) 저장 명령

2) 비트 단위 AND 연산 (0000FFFF를 사용하여 정수를 변경 정수

3)에 스토어 명령의 메모리 어드레스 변환)

에게 검색 : 기본적으로는 필요

virtual bool runOnFunction(Function &F) { 
    for (Function::iterator bb = F.begin(), bbe = F.end(); bb != bbe; ++bb) { 
    BasicBlock& b = *bb; 
    for (BasicBlock::iterator i = b.begin(), ie = b.end(); i != ie; ++i) { 
     if(StoreInst *si = dyn_cast<StoreInst>(&*i)) { 
     PtrToIntInst* ptrToInt = new PtrToIntInst(si->getPointerOperand(), IntegerType::get(si->getContext(), 32), "", si); 
     } 
    } 
    } 
    return true; 
} 
:

4)

지금까지 나는 다음있어 포인터에 다시 정수 변환

나는 실제로 내 명령을 삽입하는 방법을 알아 내거나 AND 명령을 만드는 방법을 찾을 수 없다. 누군가가 올바른 방향으로 나를 가리킬 수 있다면 그것은 좋을 것입니다.

미리 감사드립니다.

답변

4

Programmer's Manual을 살펴 보는 것이 좋습니다. 기본 사항에 대해서는 상당히 다르게 적용됩니다.

특히, a section about creating and inserting new instructions이 있습니다. 가장 간단한 방법은 새 명령어의 생성자에 대한 마지막 인수로 기존 명령어를 제공하는 것입니다. 그런 다음 기존 명령어를 기존 명령어 바로 앞에 삽입합니다.

또는 끝에 추가하려는 경우 엔 클로징 기본 블록을 전달할 수 있습니다 (단, 터미네이터 처리 필요). 마지막으로 외곽 기본 블록에 getInstList()을 호출 한 다음 insert 또는 push_back으로 새 지침을 삽입 할 수 있습니다.

제쳐두고, 모든 블록을 반복 할 필요가 없으며 각 블록의 모든 명령을 반복 할 필요가 없으므로 지침을 직접 반복 할 수 있습니다. the section about the instruction iterator in the programmer's manual을 참조하십시오.

+0

인클로저 기본 블록을 통과하는 경우 터미네이터를 어떻게 처리합니까? – PatoBeltran

+1

@PatoBeltran 그런 식으로 지침을 추가해도 기본 블록의 검증이 실행되지 않으므로 중간 단계에서 변형 된 기본 블록을 사용할 수 있습니다. 패스 기능을 끝내기 전에 마지막에 터미네이터를 배치하십시오. – Oak

4
virtual bool runOnFunction(Function &F) { 
    for (Function::iterator bb = F.begin(), bbe = F.end(); bb != bbe; ++bb) { 
    BasicBlock &b = *bb; 
    for (BasicBlock::iterator i = b.begin(), ie = b.end(); i != ie; ++i) { 
     if (StoreInst *si = dyn_cast<StoreInst>(&*i)) { 
     IRBuilder Builder(si); 
     Value *StoreAddr = Builder.CreatePtrToInt(si->getPointerOperand(), Builder.getInt32Ty()); 
     Value *Masked = Builder.CreateAnd(StoreAddr, 0xffff); 
     Value *AlignedAddr = Builder.CreateIntToPtr(Masked, si->getPointerOperand()->getType()); 
     // ... 
     } 
    } 
    } 
    return true; 
} 
0

당신은 쉽게 다른 명령 전이나 기본 블록의 끝에서 새로운 명령어를 삽입 할 IRBuilder를 사용할 수 있습니다. 당신이 후 또 다른 하나를 명령 를 삽입해야하는 경우

또는, 당신은 포함 된 기본 블록에 instruction list를 사용해야합니다 :

BasicBlock *pb = ...; 
Instruction *pi = ...; 
Instruction *newInst = new Instruction(...); 

pb->getInstList().insertAfter(pi, newInst); 

코드 및 솔루션 here에서 가져옵니다.

관련 문제