LLVM ? LLVM 빌드

손지웅·2025년 4월 24일

LLVM

LLVM 이란 ?

Low Level Virtual Machine의 약자.

Virtual machine은 실제 하드웨어를 소프트웨어로 가상화(Emulation)한 컴퓨터 환경이다.
물리적인 컴퓨터 한 대 위에 여러개의 가상 컴퓨터를 software로 만든다.

하지만 LLVM은 실제 가상 머신이 아니라, 컴파일러와 tool chain (개발 도구 집합) 의 집합체이다.
2000년 미국 일리노이 대학교에서 시작되었으며, 현재는 다양한 언어와 플랫폼을 지원하는 범용 컴파일러 오픈소스 프레임워크로 발전했다.

LLVM을 활용하여 ..
컴파일러 개발
컴파일러 개선
코드 최적화
난독화, 역난독화

개념

중간 표현. Intermediate Representation

컴파일러 or VM이 source code를 처리하는 과정에서 내부적으로 사용하는 데이터 구조
소스 코드 -> IR -> 기계어

  • 특정 프로그래밍 언어와 특정 하드웨어로부터 독립적인 형태로 설계 -> 컴파일러를 모듈식으로 구성할 수 있음
    - frontend : 소스 코드를 분석하여 IR로 분석하는 부분
    - backend : IR을 받아, 특정 하드웨어에 맞는 기계어로 변환하는 부분
  • 다양한 형태를 가질 수 있다.
    - 자료구조 (AST와 유사한 트리 구조)
    • 튜플, 스택 기반 코드 ( IL , 중간 언어 )
  • 고수준/저수준으로 나뉜다.

Optimizer

중간 표현을 입력받아 다양한 최적화 기법을 적용 -> 성능 향상된 IR 출력

  • pass : 최적화는 pass라고 불리는 개별 단위 모듈을 통해 실행된다. 각 패스는 특정 최적화 작업을 담당한다.
    - Analysis Passes : 분석 pass. 코드를 변경하지 않고 데이터 흐름 등을 변경한다.
    -Transform Passes : 정보나 분석을 통하여 IR을 변경

동작

특징

LLVM 빌드

빌드란, 소스코드를 실행 프로그램으로 변환화는 과정
MacOS 환경. Homebrew를 이용하여 빌드해보자.

build : 소스코드를 기계어로. 입력은 LLVM 소스코드이고

Github 소스 가져오기 -> llvm-project

필요한 패키기 설치

cMake : 다양한 플랫폼의 빌드 시스템 파일을 자동으로 만들어주는 도구

Ninja : 속도에 초점을 맞춘 빌드 시스템

CMake로 빌드 파일을 생성한다.

  1. 빌드 디렉토리 생성, 생성된 디렉토리로 이동
  2. CMake로 빌드 환경 구성.
cmake -G Ninja ../llvm \
      -DCMAKE_BUILD_TYPE=Release \
      -DLLVM_ENABLE_PROJECTS='clang;lld' \
      -DCMAKE_INSTALL_PREFIX=~/llvm-install

빌드 도구로 Ninja를 사용하고, 소스코드의 루트 디렉토리를 지정한다. 그 외 최적화 실행 릴리스 빌드 지정, LLVM과 같이 빌드할 Clang 컴파일러와 LLD linker도 함께 빌드하는 명령어다.


컴파일 진행중


노트북의 cpu, ram 사용 퍼센트를 보여주는 runcat 앱이다. 엄청 빠른 속도로 움직이고 있는것을 볼 수 있다.

프로세서의 사양에 따라 다르지만, 한시간정도 걸리는 모습이다. 빌드 도중 메모리 부족이나 하드디스크 공간 부족, 발열으로 인한 쓰로틀링 등 여러가지 변수가 존재 할 수 있으니 빌드 전 체크를 꼼꼼히 하고 진행하자.

이제 빌드된 결과물들을 설치 경로로 복사하자.


잘 설치가 된 모습이다.

환경 변수를 추가하고, 버전 확인을 통해 설치 여부를 다시 한번 확인한다.

PASS

컴파일러에서 IR을 분석하거나, 수정하는 단위

  • 컴파일러는 소스 코드를 바로 기계어로 바꾸는 것이 아니다. 중간 단계 IR에서 분석하고, 최적화한다.
  • 이러한 과정들 속에서 한번에 처리하는 것이 아니라 여러개의 pass가 차례로 IR을 처리한다.
  1. 프로그램(소스코드)을 IR로 변환
  2. 여러 pass는 IR을 차례로 처리한다.

PASS 실습


이 코드는, LLVM IR 형식의 main 함수이다.
i32 정수형을 return 하는 main함수를 정의했다. 즉

int main() {
  return 9;
}


opt는 optimizer이다. IR파일에 pass ( 최적화 단계 ) 를 적용한다.
-passes=deadargelim : 사용하지 않는 인수 제거
test.ll : 위에서 입력한 코드
-o/dev/null : 결과 파일을 버린다.

-> test.ll 파일에 최적화 패스를 적용하고, 결과는 버린다.


O2 : 여러가지 대표적인 최적화 패스를 한번에 진행하는 옵션
-S : 결과를 텍스트로 저장. 이때의 텍스트는 사람이 읽을 수 있는 글자이다. 이 옵션이 없다면, 바이너리 코드로 저장된다.
-o test.opt.ll : 최적화된 결과를 test.opt.ll 파일로 저장

-> test.ll에 최적화를 진행하여 IR코드로 만든다.


확인하면, 다음과 같다.

test.ll 모듈에서 만들어짐.
원본 소스 파일 이름은 test.ll
함수에 적용된 다양한 최적화 속성들 나열

0개의 댓글