LLVM tutorial chapter 4

안상준·2025년 7월 14일

LLVM

목록 보기
2/12

https://llvm.org/docs/tutorial/
LLVM tutorial chapter 4를 공부하고 정리해 보았다.

Introduction

chapter 1~3까지 LLVM IR 생성에 대하여 알려 주었고, chapter 4에서는 언어에 최적화 기능과 JIT 컴파일러 추가에 대한 내용 이었습니다.

Trivial Constant Folding


왼쪽과 같은 코드를 LLVM 에서 인라인으로 최적화를 실시한다.

%addtmp = 3 + x
%addtmp1 = x + 3
%multmp = addtmp * %addtmp1

하지만 위의 경우 인라인으로 최적화 하기에는 제한적이다. 이를 해결하기 위해 두 가지 변환이 필요하다.

  • 표현식 재연관 - 연관의 순서를 바꾸는 최적화 기법
  • 공통 부분 표현식 제거 - LLVM Pass 형태로 최적화 가능

LLVM Optimization Passes

  • Module Pass : 모듈 전체를 대상으로 수행하는 패스
  • Function Pass : 함수 한만 대상으로 수행하는 패스
  • Transform Pass : LLVM IR을 직접 변경하는 패스
  • Analysis Pass : IR을 변경하지 않고 정보를 수집하는 패스

InitializeModuleAndManagers


LLVM의 모듈, IRBuilder, PassManager 등을 초기화 하는 중앙 관리 함수

  • 전역 모듈 TheModule 초기화
  • FunctionPassManager, 4개의 AnalysisManager 초기화
  • PassInstrumentationCallbacks, StandardInstrumentations는 개발자 패스 간에 수행되는 작업을 사용자가 지정할 수 있도록 하는 패스 계측 프레임워크

    Transform pass, Analysis pass 등록

Adding a JIT Compiler


JIT(Just In-Time) Compiler : 프로그램을 실행하는 도중에 소스코드를 기계어로 번역하는 기술

main


가장 위 전역 변수는 JIT 컴파일러 인스턴스 포인터 이다.
코드 내에서 TheJIT을 초기화 하고 KaleidoscopeJIT객체를 생성하고 소유권을 생성 한다.

InitializeModuleAndPassManager


JIT에 대한 레이아웃을 설정
LLVM IR을 생성하고 최적화 할 수 있는 준비 작업
IR Context, Module, Builder, FPM 초기화

HandleTopLevelExpression


최상위 표현식을 파싱하고 LLVM IR로 컴파일한 뒤, JIT을 통해 실행

  • 최상위 표현식 -> AST -> IR
  • TheModule 안에 익명 함수 "__anon_expr" 형태로 들어감
  • JIT 리소스 추적기 생성(나중에 삭제 용도로 사용)
  • LLVM Modue, Context를 JIT에 등록
  • Module, Context 초기화
  • 기계어로 만들어진 "__anon_expr" 함수를 찾아 주소를 반환
  • 주소를 함수 포인터로 변환후 실행
  • 메모리 해제

실행 예시

0개의 댓글