728x90
반응형
이번 글에서는 프로그램 내 특정 명령어의 수를 세어 출력하는 간단한 프로그램을 만들어 보도록 하겠다.
LLVM IR에는 총 64개의 명령어 Opcode 존재하며 자주 사용되는 명령어들은 다음과 같다.
- BinaryOperator: add, sub, mul 과 같은 산술 연산이나, and, or과 같은 비교 연산 등 2개의 operand들을 연산하는 명령어
- ReturnInst, BranchInst 등: 제어 흐름관련 명령어들
- CallInst: 함수 호출 명령어
- CastInst: 타입 변환 명령어
- AllocaInst: 스택(정적)에 메모리 할당하는 명령어
- LoadInst, StoreInst: 메모리에 있는 데이터들을 접근하는 명령어
- GetElementPtrInst: 배열 접근 등에서 메모리 접근하는 명령어
이제 내가 만든 임의의 Test.c 파일을 Test.ll 파일로 만들어 Add, Mul, Div, Sub 명령어의 개수를 세보도록 하자.
llvm::Instruction의 함수들을 사용하면 우리가 어떤 명령어를 사용하고 있는지 알 수 있다.
- Add, Sub, Div, Mul 명령어는 llvm::Instruction 클래스의 자식 클래스인 llvm::BinaryOperator 자료형이다. llvm::Instruction의 멤버 함수 isBinaryOp()를 사용하여 이를 확인 할 수 있다.
- 하지만 위의 명령어는 BinaryOpeartor의 Opcode로만 나타내어지기 때문에 이 방법으로 해당 명령어가 Add 명령어인지는 확신 할 수 없다. 즉 isBinaryOp는 BinaryOperator인지 아닌지를 확인하는 함수이고 위의 명령어는 Opcode로만 구별할 수 있다.
따라서 llvm::Instruction의 getOpcode() 메소드를 사용하여 Opcode를 직접 얻어 어떤 명령어인지 확인 해야하며 코드는 다음과 같다.
위의 코드가 존재하는 파일(CountInst.cpp)을 바이너리로 컴파일하고 Test.c 를 IR 레벨로 컴파일한다.
Test.ll내에 Instruction add, sub, mul, div의 명령어 갯수를 출력하였다.
혹시나 틀리거나 잘못된 부분이 있으면 알려주시기 바랍니다.
728x90
반응형
'컴파일러' 카테고리의 다른 글
[디지털논리] FPGA란? (0) | 2021.08.27 |
---|---|
[컴파일러] 5. LLVM을 이용해 Instruction 위치 이동(feat 메모리 명령어 종속성) (2) | 2021.08.02 |
[컴파일러/LLVM] 2. Module, Function, Basic Block 순회하며 Instruction 출력하기 (0) | 2021.08.01 |
[컴파일러] 1. LLVM을 이용한 컴파일 방법 및 IR파일 읽기(feat. 소스코드와 IR 코드 ) (0) | 2021.07.31 |
[컴파일러] 4. LLVM을 이용한 IR 레벨에서 명령어 삭제 및 생성 (0) | 2021.07.28 |