728x90
반응형

LLVM 4

[컴파일러] 5. LLVM을 이용해 Instruction 위치 이동(feat 메모리 명령어 종속성)

이번 글에선 IR 파일에서 Store 명령어를 BasicBlock 가장 마지막 부분으로 위치를 옮기도록 해보겠다. 일반적인 산술 연산(ex add, sub) 명령어와 다르게, 메모리 명령어 (load/store)의 종속 관계는 컴파일러 입장에서 대부분 알기 어렵다. 예를 들면 주소 X에서 값을 읽은 명령어와(load) 주소 Y에 값을 저장하는 명령어(store)가 있다고 할 때, 주소 X와 주소 Y가 같거나, 다르다는 보장이 없는 이상 종속 관계가 없다고 하더라도 순서가 쉽게 바뀔 수 없다. 따라서 Store 명령어의 위치 이동으로 이루어지는 종속성 문제는 컴파일러 레벨에서 특별한 오류를 발생시키지 않는다. 프로그램 작성 Basic Block 마지막 store 명령에 모든 store명령을 이동시키는 프로..

컴파일러 2021.08.02

[컴파일러] 4. LLVM을 이용한 IR 레벨에서 명령어 삭제 및 생성

이번 글은 제목처럼 IR(intermediate representation) 레벨에서 프로그램 내의 명령어를 삭제 또는 생성을 해보려한다. LLVM IR은 계층 구조로 프로그램을 관리하므로 반복문을 통해 특정 종류의 명령어에 접근 할 수 있다(ADD, SUB, DIV 등에 접근할 수 있으며 모르겠다면 이전 글 컴파일러 3을 참조 ). 이를 통해 instruction을 생성하도록 하겠다. 명령어 생성 LLVM에서 명령어를 생성하는 방법은 Create 함수를 이용하는 것이다. LLVM은 아래와 같이 수행할 명령어의 Operand들을(Value *s1, Value *s2) Create 함수의 매개변수로 요구한다. Operand에는 Value, Type 등의 형태가 될 수 있다. static BinaryOper..

컴파일러 2021.07.28

[컴파일러] 3. LLVM을 이용하여 프로그램 안의 특정 명령어 세기

이번 글에서는 프로그램 내 특정 명령어의 수를 세어 출력하는 간단한 프로그램을 만들어 보도록 하겠다. LLVM IR에는 총 64개의 명령어 Opcode 존재하며 자주 사용되는 명령어들은 다음과 같다. BinaryOperator: add, sub, mul 과 같은 산술 연산이나, and, or과 같은 비교 연산 등 2개의 operand들을 연산하는 명령어 ReturnInst, BranchInst 등: 제어 흐름관련 명령어들 CallInst: 함수 호출 명령어 CastInst: 타입 변환 명령어 AllocaInst: 스택(정적)에 메모리 할당하는 명령어 LoadInst, StoreInst: 메모리에 있는 데이터들을 접근하는 명령어 GetElementPtrInst: 배열 접근 등에서 메모리 접근하는 명령어 이..

컴파일러 2021.07.22

[컴파일러] LLVM 다운로드 및 설치 방법

이번 글에는 llvm을 사용하기 위해 pre-built binary 파일을 다운 받는 과정을 작성해보도록 하겠다. 설치환경 : Ubuntu 16.04에 LLVM 6.0.1을 다운받았다. 먼저 미리 빌드된 binary 파일을 사용하기 위해서 아래의 사이트에서 LLVM 6.0.1버전 Pre-Built Binaries 부분에서 Ubuntu 16.04 파일을 다운받았다(.sig 파일이 아님). https://releases.llvm.org/download.html LLVM Download Page If you'd like access to the "latest and greatest" in LLVM development, please see the instructions for accessing the LLVM..

인턴 2021.07.11
728x90
반응형