컴파일러

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

용성군 2021. 7. 22. 19:03
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
반응형