2012-01-20 2 views
5

나는 소스 파일을 가져 와서 인스트루멘털 된 출력을 생성하는 C (그리고 어쩌면 C++)로 약간의 동적 코드 계측을 수행함으로써 Clang을 사용하여 속도를 높이려고합니다. 모든 블록의 시작 부분에 함수 호출을 추가하고 모든 부울 식을 변경하여 일부 함수를 호출하여 추적 할 수도 있습니다. 예를 들어 :Dynamic Instrumentation with Clang

foo = a && (b || c); 

는 같은 될 것입니다 :

foo = EXPR_AND(a, EXPR_OR(b, c)); 

을 따라서 나는 발생 조건의 모든 조합을 추적 할 수 있습니다.

나는 최선의 접근 방식이 될 것이라고 RecursiveASTVisitor를 사용한다고 가정하지만 방문하는 각 노드마다 C 코드를 출력하는 쉬운 방법이 있습니까?

이와 같은 것을 달성하기 위해 무엇을보아야하는지에 대한 제안이 가장 만족 스러울 것입니다!

참고 : 추가 조사를 마친 후 가장 친한 친구 인 것처럼 보이는 libclang을 발견했습니다. 다시 쓰는 사람과 함께, 나는 내가 필요한 것을 가지고 있을지도 모른다. 좋은 예를 가리키는 포인터 (방금 libclang에서 비디오를 만나는 훌륭한 애플 개발자를 찾았습니다)가 좋을 것입니다.

+0

'b' 또는'c'가 부작용을 포함하면 제안 된 변형은 코드의 의미를 크게 변경합니다 ... –

+0

실제로 EXPR_AND 및 EXPR_OR은 다음과 같은 매크로 확장입니다. #define EXPR_AND (a, b) (instr [0] = 1 : instr [1] = 1,0) && (b? instr [2] = 0 : instr [3] = 1,0) –

답변

2

좋은 예를 보려면 this project을 참조하십시오.

호출 함수를 호출하고 종료하는 데 clang을 사용하며 전달 된 인수의 유형도 검사합니다.