[LLVM-IR] Hello World 찍기

LLVM/주절주절 2019. 9. 3. 01:51
일단 세팅을 먼저 해야 한다.
http://releases.llvm.org/download.html

여기서

32비트나 64비트로 인스톨러를 깔아서 실행- 예스맨이 되면 된다.

그럼 해당 비트의 프로그램 파일즈 디렉터리에 LLVM 항목이 생길 것이다.
거기 안에 보면 또 bin 디렉터리가 있는데. 여기에 주요 실행 파일들이 몰려있다.

그리고 저 clang이란 놈이 바로 c/c++ 컴파일러이자 llvm-ir 컴파일러이기도 한 놈이다.
앞으로 우린 저걸 쓸 것이다.

그리고 편하게 쓰기 위해서라도 이 경로를 패스에 저장해주면 된다.
환경변수 설정은 이 글을 볼 정도의 개발자라면 다 알 것이므로 방법은 생략한다.

그리고 c/c++ 라이브러리를 패스에 추가해줘야 한다.
콘솔 입출력 같은 플랫폼 종속적인 행위를 하려면 c/c++의 모듈을 쓸수밖에 없다..

그런데 윈도에서는 llvm에서 제공하는 라이브러리나 gcc 라이브러리는 뭔가 잘 돌아가질 않아서,
msvc의 라이브러리 디렉터리를 써야 한다.
라이브러리의 경로는 대충 이렇다. 더럽게 복잡하다.

저걸 따로 정리해서 include의 경로는 INCLUDE라는 이름의 환경 변수에 넣고,
lib 디렉터리 안에 있는 lib파일들도 따로 모아놓고, 그 경로를 LIB라는 이름의 환경 변수에 넣어주면,
clang이 컴파일할때 갖다 쓴다.


자 그럼 이제 코드를 돌려보자.
코드는 이렇다. 어셈과 유사한 부분이 많다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
; 이게 주석임

; 문자열 상수를 전역상수처럼 선언함
@.str = private unnamed_addr constant [13 x i8] c"hello world\0A\00"

; puts 함수의 외부 선언
declare i32 @puts(i8* nocapture) nounwind

; main 함수 정의
define i32 @main()
{   
     ; i32()*
     ; [13 x i8]를 i8 *로 변환함...
    %cast210 = getelementptr [13 x i8],[13 x i8]* @.str, i64 0, i64 0
   
    ; puts 함수를 호출해서 stdout에 문자열을 출력함
    call i32 @puts(i8* %cast210)

    ret i32 0
}

; 이름 붙인 메타데이터
!0 = !{i32 42, null, !"string"}
!foo = !{!0} 
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

이걸 써서 .ll 확장자로 저장한 다음에

clang에 넣고 돌리면 된다.

'LLVM > 주절주절' 카테고리의 다른 글

LLVM이란?  (0) 2019.09.03

설정

트랙백

댓글