LLVM tutorial chapter 3

안상준·2025년 7월 14일

LLVM

목록 보기
1/12

https://llvm.org/docs/tutorial/

LLVM tutorial chapter 3를 보고 공부한 내용을 블로그로 정리해 보았다.

Introduction


2장에서 parser, lexer로 구축한 AST를 LLVM IR로 변환하는 과정을 chapter 3 에서 다루었다.

Code Generation Setup


모든 표현식 노드들의 공통 부모 클래스

  • codegen()은 AST를 LLVM IR로 변환해 주는 함수
  • Value는 SSA값을 나타내는 클래스
  • SSA정적 단일 할당 레지스터로, 재할당이 불가능
  • NumberExprAST는 "1.0"과 같은 숫자 리터럴을 표현하는 AST노드
  • TheContext : LLVM 전체 작업의 Context로, 메모리나 타입 시스템 등을 관리
  • Builder : LLVM 명령어를 만드는 도우미 클래스로 SSA 형식의 명령어를 만들고, 어디에 넣을지 위치를 추적
  • TheModule은 함수와 전역 변수를 포함하는 LLVM 구조체
  • LogError : 코드 생성 중에 발견된 오류를 보고하는데 사용하는 메소드

Expression Code Generation

NumberExpr


숫자 상수를 LLVM IR로 변환
ConstatntFP : 부동소수점 상수를 표현하는 클래스

VariableExpr


변수를 LLVM IR로 변환

BinaryExpr


산술연산 AST를 LLVM IR 명령어로 생성
재귀적으로 AST를 탐색하며 LLVM IR로 변환
CreateUIToFP : bool 타입을 double 타입으로 변환

CallExpr


AST로 표현된 함수 호출부를 LVLM IR 명령어로 변환

  • LLVM Module의 symbol table에서 함수 이름을 조회
  • 호출할 함수가 준비되면 전달될 각 인수에 대해 재귀적으로 IR 코드를 생성
  • 인자 개수가 매개변수와 일치한지 확인
  • 인자를 차례대로 IR로 변환
  • LLVM IR call 명령을 생성

Prototype


함수 프로토타입을 LLVM IR로 변환

def foo(x y)...

함수 프로토타입

  • N개의 LLVM double 타입 벡터 생성
  • N개의 double 타입을 인수로 받고 결과로 double 타입 하나를 반환하며, 가변 인수가 함수 타입을 생성
  • 실제 프로토타입에 해당하는 IR 함수를 생성
  • 프로토타입에 지정된 이름에 따라 각 함수의 인수 이름을 설정

Function


함수 전체를 LLVM IR로 변환

  • TheModule에서 기존 함수가 있는지 확인
  • 프로토타입 생성
  • 블럭 생성 및 삽입 위치 설정
  • 매개변수를 NameValues에 등록
  • 함수 본문 IR 생성, 리턴 명령 추가
  • IR 유효성 검사

0개의 댓글