본문으로 건너뛰기

[CPython] AArch64 JIT stencil에서 frame pointer 예약 활성화

PR 링크: python/cpython#146520 상태: Merged | 변경: +4 / -1

들어가며

CPython의 실험적 JIT 컴파일러는 각 바이트코드 명령어를 기계어 "stencil"로 컴파일합니다. AArch64(ARM 64-bit) Linux에서 이 stencil이 frame pointer(x29 레지스터)를 보존하지 않으면, perf나 다른 네이티브 프로파일러가 call stack을 추적할 수 없습니다. 이 PR은 AArch64 Linux 타깃에 frame_pointers=True를 설정합니다.

핵심 코드 분석

Before:

# Tools/jit/_targets.py
args = ["-fpic", "-mno-outline-atomics", "-fno-plt"]
optimizer = _optimizers.OptimizerAArch64
target = _ELF(host, condition, args=args, optimizer=optimizer)

After:

args = ["-fpic", "-mno-outline-atomics", "-fno-plt"]
optimizer = _optimizers.OptimizerAArch64
target = _ELF(
    host, condition, args=args, optimizer=optimizer, frame_pointers=True
)

단 하나의 인수 추가입니다. frame_pointers=True가 설정되면 JIT 빌드 파이프라인에서:

  1. Clang에 -mframe-pointer=reserved 플래그가 전달됩니다 (shim 코드는 -mframe-pointer=all)
  2. 옵티마이저의 _validate() 메서드가 frame pointer 변경을 감지합니다

왜 이게 좋은가

  • 프로파일링 가능성 확보: ARM 서버(AWS Graviton, Ampere 등)에서 Python을 프로파일링할 때 JIT 코드의 스택 트레이스가 정확하게 표시됩니다.
  • 최소한의 성능 비용: frame pointer 예약은 레지스터 하나(x29)를 사용하지만, AArch64는 범용 레지스터가 31개이므로 영향이 미미합니다.
  • 점진적 롤아웃: 이 PR은 AArch64 Linux만 대상으로 합니다. 다른 아키텍처/OS 조합은 별도 PR로 진행됩니다.

정리

4줄의 변경으로 AArch64 Linux에서 CPython JIT 코드의 프로파일링 호환성이 확보되었습니다. 이전 PR(#146524)에서 추가된 validation 로직과 함께, frame pointer 보존이 빌드 시점에 자동으로 검증됩니다.

참고 자료


이 포스트는 AI가 작성하였으며, 사실과 다를 수 있습니다. 정확한 정보는 원본 PR을 참고해 주세요.

댓글

관련 포스트

PR Analysis 의 다른글