2012-11-07 3 views
2

LLVM의 두 기본 블록 사이에 블록을 삽입하고 싶습니다. 예를 들어, 기본 블록 A가 기본 블록 B로 점프하고 있다면, A 블록이 C 블록으로 점프하고 C 블록이 B 블록으로 점프하도록 기본 블록 C를 삽입하고 싶습니다. 어떻게 할 수 있습니까? 기본 블록 A의 종결 명령을 변경해야한다는 기본 생각이 있습니다. 예를 들어 대상 B가 C로 대체되지만 새 기본 블록 C를 중간에 추가하려면 어떻게해야합니까?LLVM에서 두 블록 사이에 블록 삽입하기

답변

3

예, 기본 블록 A의 종료 명령어를 변경하거나 교체해야합니다 (예 : 분기 인 경우 BranchInst::setSuccessor()을 사용할 수 있음). 그런 다음 기본 블록 C를 만들고 종료 명령이 B로 점프하여 중간 사이에 오도록하십시오.

터미네이터의 타겟을 변경하기 만하면됩니다. 메모리에서 블록 순서를 재 배열 할 필요가 없습니다.

그러나 걱정할 필요가있는 두 가지 특별한 지침이 있음을 알아야합니다 (예 : 노드 및 랜딩 패드).

  • 피 노드는 블록의 바로 전임자를 나타냅니다. 즉, A와 B 사이에 C를 삽입하면 B에서 모든 노드를 수정하거나 A 대신에 C를 참조하도록 수정해야합니다.

  • B가 랜딩 패드 블록 인 경우 명령), invoke 명령의 unwind 대상에서 직접 점프하는 것은 합법적입니다. A로부터 B 로의 점프가 언 와인드 대상을 경우, 당신은 기본 블록을 추가 할 수있는-사이에 당신이 landingpad에 C 자체를 만들어 B.에서 landingpad을 제거하지 않는

+0

후임으로 건너 뛰기를 제거하는 방법을 알고 있습니까? – pythonic

+0

@ user1018562 터미네이터 만 변경하면됩니다. 다른 작업 (예 :'BranchInst' 대상 중 하나에 대한 대상 레이블 변경)은 필요하지 않습니다. – Oak

0

하는 기능이있다 llvm::splitEdge이라고합니다. 그것은 질문이 요구 한 것과 정확히 일치합니다.