피드로 돌아가기
Dev.toInfrastructure
원문 읽기
JIT 기반 메모리 실행을 넘어 Object Code 기반의 정적 링크 구조 설계
LLVM #6 — Compiling to Object Code.
AI 요약
Context
기존 JIT 컴파일러는 IR을 머신 코드로 변환하여 RAM에서 즉시 실행하는 구조로, 프로세스 종료 시 생성된 코드가 모두 소멸하는 일회성 한계 존재. 지속 가능한 코드 배포와 외부 C++ 프로그램과의 연동을 위해 디스크에 .o 파일을 생성하는 Object Code 출력 구조로의 전환 필요.
Technical Solution
- Target Triple 설정을 통한 하드웨어 아키텍처, 벤더, OS, ABI 정보를 정의하여 Cross-compilation 기반 마련
- InitializeAllTargetInfos 등 5단계 서브시스템 초기화를 통해 하드웨어 플랫폼 정보부터 Machine-code 추상화 레이어까지 전체 백엔드 활성화
- Target Machine 설정을 통한 데이터 레이아웃 및 메모리 정렬 규칙 정의로 Optimizer에 타겟별 포인터 크기 정보 제공
- legacy::PassManager를 활용하여 Module 내 IR을 실제 바이트 단위의 Object File로 변환하는 정적 코드 생성 파이프라인 구축
- JIT 이동 전 HandleDefinition 단계에서 Emitting을 수행하여 Module 내 함수 정의가 소멸하기 전 디스크에 기록하는 생명주기 제어
- macOS의 Symbol Prefix 규격(_ prefix)을 반영한 asm label 설정을 통해 Linker의 Symbol Mismatch 문제 해결
실천 포인트
1. Cross-compilation 설계 시 Target Triple의 ABI 규격이 대상 OS와 일치하는지 확인
2. 컴파일러 파이프라인 설계 시 IR의 생명주기와 JIT 메모리 전이 시점을 분석하여 Emitting 타이밍 결정
3. 서로 다른 언어/컴파일러 간 Linking 시 플랫폼별 Symbol Naming Convention(예: macOS의 언더바 접두사) 검토