gcc 프로파일 링을 구현하려고합니다.GCC 프로파일 링 구현 문제 PowerPC 용 C/C++ cross
PowerPC와 함께 eCos가 내장 된 환경을 사용하고 있습니다. 내가 프로그래밍 프로그래밍
-pg
스위치를 사용하여 컴파일하고 연결할 때 기호 _mcount
이 정의되지 않았 음을 알게되었습니다.
이 기능을 구현할 필요가 있다는 것을 알고 있습니다.
_mcount
기능에 필요한 요구 사항은 무엇입니까?
모든 레지스터를 저장하고 복원해야한다는 점을 고치겠습니다. 표준 32와 함께 저장하고 복원해야하는 특수 레지스터가 있습니까?
_mcount
은 인터럽트를 사용하지 않도록 설정해야한다는 커미션을 보았으며 호출 트리 데이터를 기록하기 전에 _mcount
인터럽트를 사용하지 않도록 설정 했습니까?
내 PowerPC는 8245입니다. 이것은 603e 제품군 프로세서입니다.
저는 GCC 4.6.1을 크로스 컴파일러로 powerpc-eabi로 사용하고 있습니다.
다음은 gcc가 생성하는 _mcount 호출의 예입니다.
100b40: 7c 08 02 a6 mflr r0
100b44: 3d 80 00 23 lis r12,35
100b48: 90 01 00 04 stw r0,4(r1)
100b4c: 38 0c 82 a8 addi r0,r12,-32088
100b50: 48 05 19 25 bl 152474 <_mcount>
100b54: 94 21 ff 88 stwu r1,-120(r1)
100b58: 7c 08 02 a6 mflr r0
100b5c: 90 01 00 7c stw r0,124(r1)
100b60: 93 e1 00 74 stw r31,116(r1)
100b64: 7c 3f 0b 78 mr r31,r1
컴파일러 -pg
스위치에 의해 생성 된 코드는 다음을 수행되는 프로파일 함수의 첫 번째 명령은 도시 첫 행이다.
- 1) 발신자의 주소가 두 명령어
mflr r0
stw r0,4(r1)
와 함께 스택에 저장된다. - 2) 방금 입력 한 함수의 주소는
lis r12,35
및addi r0,r12,-32088
의 두 명령어로r0
에 저장됩니다._mcount
가r0
라고 따라서
4(r1)
는 호출자의 프로그램 카운터를 포함 입력 함수 주소를 포함한다. 이 쌍의 정보는 저장되어 콜 그래프를 만드는 데 사용됩니다.
이 정보는 gcc 소스 인 gcc/libffi/src/powerpc/asm.h를 읽음으로써 발견되었습니다.
아직 무엇이 _mcount
에 반환 될지 확신 할 수 없습니다. _mcount
이 blr
을 사용할 수 없도록 LR을 복원해야하는 것으로 나타나면 (4)r1
에서 LR을 복원하고 대신 점프 명령어를 사용하여 bl _mcount
이후의 명령으로 돌아 가야합니다. 이게 말이 돼?
이 소리 [* gprof * 구현] (http://stackoverflow.com/a/1779343/23771). –
gprof가 _mcount 및 프로필 타이머에 의해 저장된 결과를 찾는 도구입니까? _mcount는 프로그램이 실행되는 동안 호출되는 함수입니다. gprof는이 정보를 검색하고 표시합니다. 나는 기능의 분리를 정확하게 기술 했는가? – KeithSmith
예, * gprof *는 함수 B가 입력 될 때 어떤 함수 A가 B를 호출했는지를 나타내는 카운터를 증가시키는 함수를 필요로합니다. 그렇게해야 할 수도 있지만 더 좋은 방법이 있습니다 (* gprof *) 프로그래머가 최적화 기회를 찾을 수 있습니다. –