2012-11-15 1 views
0

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 r0stw r0,4(r1)와 함께 스택에 저장된다.
  • 2) 방금 입력 한 함수의 주소는 lis r12,35addi r0,r12,-32088의 두 명령어로 r0에 저장됩니다. _mcountr0라고 따라서

4(r1)는 호출자의 프로그램 카운터를 포함 입력 함수 주소를 포함한다. 이 쌍의 정보는 저장되어 콜 그래프를 만드는 데 사용됩니다.

이 정보는 gcc 소스 인 gcc/libffi/src/powerpc/asm.h를 읽음으로써 발견되었습니다.

아직 무엇이 _mcount에 반환 될지 확신 할 수 없습니다. _mcountblr을 사용할 수 없도록 LR을 복원해야하는 것으로 나타나면 (4)r1에서 LR을 복원하고 대신 점프 명령어를 사용하여 bl _mcount 이후의 명령으로 돌아 가야합니다. 이게 말이 돼?

+0

이 소리 [* gprof * 구현] (http://stackoverflow.com/a/1779343/23771). –

+1

gprof가 _mcount 및 프로필 타이머에 의해 저장된 결과를 찾는 도구입니까? _mcount는 프로그램이 실행되는 동안 호출되는 함수입니다. gprof는이 정보를 검색하고 표시합니다. 나는 기능의 분리를 정확하게 기술 했는가? – KeithSmith

+0

예, * gprof *는 함수 B가 입력 될 때 어떤 함수 A가 B를 호출했는지를 나타내는 카운터를 증가시키는 함수를 필요로합니다. 그렇게해야 할 수도 있지만 더 좋은 방법이 있습니다 (* gprof *) 프로그래머가 최적화 기회를 찾을 수 있습니다. –

답변

0

이것은 완벽한 해결책은 아니지만 아래의 어셈블리 코드는 PowerPC 용 더미 _mcount를 만듭니다.

코드를 사용하여 _mcount 외부를 해결할 수 있지만 콜 그래프 데이터는 기록되지 않습니다. 이 코드는 파워가 지금 체크에서의 ECOS RTOS 저장소에 _mcount의 구현있다 my_mcount()

.text     
    .globl _mcount 
_mcount: 
    # Move LR to CTR and return via CTR 
    mflr r0 
    mtctr r0 
    lwz r0,4(r1) 
    mtlr r0 
    bctr