728x90
반응형

컴파일러 6

[디지털논리] FPGA란?

정의 FPGA (Field Programmable Gate Array)는 디지털 회로(And, Or, Not 등등)를 프로그램하듯이 설계할 수 있게 만들어진 반도체 칩입니다. FPGA 자체로는 아무것도 할 수 없습니다. 개발자는 HDL(Hardware Description Language)를 사용해서 코드를 작성합니다. 여기서 유명한 HDL은 Verilog와 VHDL이 있습니다. HDL을 이용해 만든 코드를 비트 파일로 변환시켜 FPGA에 로드시킵니다. 로드되면 FPGA는 설계한 디지털 회로처럼 동작합니다. 만약 FPGA가 없다면 우리는 직접 반도체 회사에가서 막대한 비용을 투자해 설계한 반도체를 직접 생산해서 써야합니다. 만약 원하는대로 동작하지 않는다면 이 과정을 여러번 반복해야해서 시간과 비용이 모..

컴파일러 2021.08.27

[컴파일러] 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

[컴파일러/LLVM] 2. Module, Function, Basic Block 순회하며 Instruction 출력하기

이번 글에서는 LLVM의 기본적인 Module 구조를 보고, IR파일 내의 명령어들을 출력해보도록 하겠다. Module은 하나의 IR 파일이라고 생각하면 편하다. 그리고 LLVM IR에서는 llvm::Module -> llvm::Function -> llvm::BasicBlock -> llvm::Instruction의 계층구조로 IR 프로그램을 관리한다. Module은 여러 개의 Function으로 구성되어 있고, Function은 다시 여러 개의 Basic Block 으로 구성되어 있으며, Basic Block은 Instruction로 구성되어 있다. Module = 모듈, 일반적으로 하나의 소스 파일 Function = 함수 Basic Block = Branch나 Return같은 제어 명령어로 끝남(..

컴파일러 2021.08.01

[컴파일러] 1. LLVM을 이용한 컴파일 방법 및 IR파일 읽기(feat. 소스코드와 IR 코드 )

글을 작성하기에 앞서 한양대 Computer Architecture and System Software LAB에서 제공받은 자료를 바탕으로 작성되었다. 이번 글에서는 clang, llvm-as, llvm-dis, llc의 명령어를 사용해 IR 코드 (.bc, .ll 파일)와 바이너리(실행 파일)로 컴파일하는 방법을 알아보도록 하겠다. clang은 LLVM IR 기반 컴파일러 중 하나로, C, C++등 다양한 언어들을 IR 단계로 컴파일 하도록 지원한다.  컴파일러는 프론트엔드와 백엔드로 나뉘어지는데 clang은 언어에 따라 컴파일 해주는 프론트엔드 부분을 담당하고 있다. 다음을 보면 .c와 .cpp 소스코드는 clang을 통해 llvm bitcode로 컴파일되는것을 알 수 있다. llvm-as, llvm..

컴파일러 2021.07.31

[컴파일러] 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
728x90
반응형