https://llvm.org/docs/tutorial/
LLVM tutorial chapter 4를 공부하고 정리해 보았다.
chapter 1~3까지 LLVM IR 생성에 대하여 알려 주었고, chapter 4에서는 언어에 최적화 기능과 JIT 컴파일러 추가에 대한 내용 이었습니다.

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

%addtmp = 3 + x
%addtmp1 = x + 3
%multmp = addtmp * %addtmp1
하지만 위의 경우 인라인으로 최적화 하기에는 제한적이다. 이를 해결하기 위해 두 가지 변환이 필요하다.

LLVM의 모듈, IRBuilder, PassManager 등을 초기화 하는 중앙 관리 함수
TheModule 초기화FunctionPassManager, 4개의 AnalysisManager 초기화PassInstrumentationCallbacks, StandardInstrumentations는 개발자 패스 간에 수행되는 작업을 사용자가 지정할 수 있도록 하는 패스 계측 프레임워크
Transform pass, Analysis pass 등록


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

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

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

최상위 표현식을 파싱하고 LLVM IR로 컴파일한 뒤, JIT을 통해 실행
TheModule 안에 익명 함수 "__anon_expr" 형태로 들어감LLVM Modue, Context를 JIT에 등록Module, Context 초기화