LLVM의 두 기본 블록 사이에 블록을 삽입하고 싶습니다. 예를 들어, 기본 블록 A가 기본 블록 B로 점프하고 있다면, A 블록이 C 블록으로 점프하고 C 블록이 B 블록으로 점프하도록 기본 블록 C를 삽입하고 싶습니다. 어떻게 할 수 있습니까? 기본 블록 A의 종결 명령을 변경해야한다는 기본 생각이 있습니다. 예를 들어 대상 B가 C로 대체되지만 새 기본 블록 C를 중간에 추가하려면 어떻게해야합니까?LLVM에서 두 블록 사이에 블록 삽입하기
2
A
답변
3
예, 기본 블록 A의 종료 명령어를 변경하거나 교체해야합니다 (예 : 분기 인 경우 BranchInst::setSuccessor()
을 사용할 수 있음). 그런 다음 기본 블록 C를 만들고 종료 명령이 B로 점프하여 중간 사이에 오도록하십시오.
터미네이터의 타겟을 변경하기 만하면됩니다. 메모리에서 블록 순서를 재 배열 할 필요가 없습니다.
그러나 걱정할 필요가있는 두 가지 특별한 지침이 있음을 알아야합니다 (예 : 노드 및 랜딩 패드).
피 노드는 블록의 바로 전임자를 나타냅니다. 즉, A와 B 사이에 C를 삽입하면 B에서 모든 노드를 수정하거나 A 대신에 C를 참조하도록 수정해야합니다.
B가 랜딩 패드 블록 인 경우 명령), invoke 명령의 unwind 대상에서 직접 점프하는 것은 합법적입니다. A로부터 B 로의 점프가 언 와인드 대상을 경우, 당신은 기본 블록을 추가 할 수있는-사이에 당신이 landingpad에 C 자체를 만들어 B.에서 landingpad을 제거하지 않는
는
0
하는 기능이있다 llvm::splitEdge
이라고합니다. 그것은 질문이 요구 한 것과 정확히 일치합니다.
관련 문제
- 1. LLVM에서 함수의 마지막 기본 블록
- 2. 두 블록 요소 사이에 공백이 없어야합니다.
- 3. 한 완료 블록 대 두 완료 블록
- 4. CUDA에서 블록 사이에 스레드를 배포하십시오.
- 5. 보여주는 블록 : "블록"
- 6. 블록
- 7. 블록 요소 인라인 블록
- 8. 블록 내의 블록 동기화?
- 9. 블록
- 10. 블록
- 11. 블록
- 12. 블록 장치의 더티 블록 추적하기
- 13. 왼쪽 사이드 바 블록 두 번 위로 (중복 블록 제거)
- 14. 한 행의 두 블록 표시
- 15. FlowDocument에서 같은 줄에있는 두 블록
- 16. 두 번째 호출에서 recv() 블록
- 17. 블록 파일 복사 당 블록
- 18. 블록 해킹, 블록 단순화 방법
- 19. Java의 목록에있는 두 항목 사이에 항목 삽입하기
- 20. 셀 사이에 공백 삽입하기
- 21. 여러 catch 블록 또는 dynamic_cast가있는 블록?
- 22. 루비 블록
- 23. FOP - 블록
- 24. 블록 Robots.txt를
- 25. should_receive 블록
- 26. 블록 단위로 콜백 콜백 (__bridge_transfer 및 블록)
- 27. 센터 블록이 적용된 블록 디스플레이 인라인 블록
- 28. 선택 블록 내부의 중첩 된 스캔 블록
- 29. 문자열 사이에 단어 삽입하기
- 30. PostgreSQL의 : 블록
후임으로 건너 뛰기를 제거하는 방법을 알고 있습니까? – pythonic
@ user1018562 터미네이터 만 변경하면됩니다. 다른 작업 (예 :'BranchInst' 대상 중 하나에 대한 대상 레이블 변경)은 필요하지 않습니다. – Oak