2013-05-21 3 views
1

LLVM 플러그인을 작성하여 각 함수 선언에 대해 함수가 가질 수있는 범용 레지스터, XMM 레지스터 및 스택 인수 수를 지정하고 싶습니다. x86 SYSV 호출 규칙에서만 작동하면됩니다. 현재 가능합니까? 그렇다면 모든 방향이 가장 중요합니다.LLVM : 함수 인수 위치 얻기 (ABI)

답변

0

가능하지만 약간 까다 롭습니다. LLVM은 시스템 특정 코드를 망칠 때보 다 IR을 조작 할 때 훨씬 더 우호적 인 것처럼 보입니다. 패스를 추가하는 쉬운 방법은 없습니다. 또한 사용되는 최종 레지스터 수는 가상 레지스터가 실제 x86 논리 레지스터에 할당되는 방식에 따라 달라지며 일부 경우에는 유출이 발생할 수 있고 다른 경우에는 일부 변수가 제거됩니다. 따라서 값이 SSA 형식 인 IR에서 작업하지 못하게 할뿐 아니라 실제로 CodeGen의 마지막 단계에서 작업해야합니다. 더 재미있는 일을하기 위해서, 당신이 사용하는 최적화 수준에 달려 있습니다. 체크 아웃 - llvm/lib/CodeGen/Passes.cpp, addOptimizedRegAlloc 또는 addFastRegAlloc에서 전달 된 호출 된 내부를 체크 아웃하고 마지막 액션 (CodeGen의 별도 파일로 구현 됨)을 사용하여 타기하십시오. 내부 루프는 꽤 솔직해야하지만, TargetRegisterInfo에 열거 된 X86 대상 등록부를 기반으로하여 부기를 실행해야합니다.