LLVM Pass

2958 단어
Writing an LLVM Pass
LLVM Pass는 전체 LLVM 아키텍처의 중요한 구성 요소입니다.Passes의 주요 업무는 바로 코드에 대한 최적화 작업을 하는 것이다. 만약에 최적화 작업을 하려면 코드에 대한 분석이 빠질 수 없기 때문에 Passes도 코드에 대한 분석 작업을 책임진다.
모든 패스는 자신의 기능을 가지고 모든 패스를 하나의 작은 모듈로 볼 수 있다. 이런 작은 모듈은 단독으로 일을 하고 간단한 임무를 완성할 수 있다. 물론 이런 작은 모듈도 조합하여 비교적 복잡한 임무를 공동으로 완성할 수 있다.이렇게 하면 전체 LLVM의 아키텍처가 유연해집니다.
LLVM은 Pass 클래스를 제공하고 일부 Pass 클래스의 하위 클래스를 제공합니다.만약에 우리가 자신의 패스를 쓰려고 한다면 우리는 우리의 목표에 따라 그 중의 유형을 합리적으로 선택하여 계승할 수 있다.자연히 우리는 이런 종류에 대해 비교적 깊이 있는 이해를 필요로 한다.이 정도는 현재 나는 아직 공부하고 있다.
다음은 우리가 가장 간단한 예시를 모방하여 어떻게 스스로 패스를 쓰는지 간단하게 설명한다.주행 절차를 위주로 하다.

폴더 만들기


우선 llvm/lib/Transforms 디렉터리에 새 폴더 MyHello를 만듭니다.
mkdir MyHello

MyHello.cpp


MyHello를 만듭니다.cpp, 내용은 다음과 같습니다.
#include "llvm/Pass.h"
#include "llvm/IR/Function.h"
#include "llvm/Support/raw_ostream.h"

using namespace llvm;

namespace {
  struct MyHello : public FunctionPass {
    static char ID;
    MyHello() : FunctionPass(ID) {}

    bool runOnFunction(Function &F) override {
      errs() << "Hello: ";
      errs().write_escaped(F.getName()) << '
'; return false; } }; // end of struct Hello } // end of anonymous namespace char MyHello::ID = 0; static RegisterPass X("myhello", "My Hello World Pass", false /* Only looks at CFG */, false /* Analysis Pass */);

CMakeLists 작성txt


우리는 cmake 도구를 사용하여Makefile 파일을 얻을 것입니다. 따라서 CmakeLists를 작성해야 합니다.txt 파일.파일 내용은 다음과 같습니다.
add_llvm_loadable_module( LLVMMyHello
  MyHello.cpp
  )

그 다음에 Transforms/디렉터리에 있는 CMakeLists를 사용합니다.txt 파일에 MyHello 하위 디렉토리를 추가합니다.다음과 같이 추가됩니다.
add_subdirectory(MyHello)

이로써 패스의 소스 코드가 완성되었습니다.

컴파일, 설치


다음은build 디렉터리에 잘라야 합니다. bulid 디렉터리가 어디를 가리키는지 모르면 LLVM과 Clang을 설치하는 것을 참고하십시오.이어서 다음 세 단계를 수행합니다(LLVM 및 Clang 설치 자습서 참조).실행이 완료되면build/lib 디렉터리에 LLVMMyHello가 하나 더 있는 것을 볼 수 있습니다.서류여기까지 우리는 자신의 패스를 얻었다.
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD="X86" ../llvm
make -j 12
sudo make install

테스트 실행


우선 임의로 위치를 찾아 테스트 파일feature를 작성하십시오.cpp.
#include 
#include 

class MyClass {
    public:
        std::string s ="Hello, world
"; // Non-static data member initializer }; int main() { std::cout << MyClass().s; }

이어서 Clang을 사용하여 컴파일할 수 있습니다.ll 또는.bc 파일.
clang++ -Wall -g -O3 -emit-llvm -std=c++11 -stdlib=libc++ feature.cpp -S -o feature.ll

마지막으로 우리는 우리의 패스를 테스트하는 것을 사용한다.
 opt -load LLVMMyHello.so -myhello < feature.ll > /dev/null

이에 따라 패스를 쓰는 기본 절차를 대충 파악했고 더 자세한 내용은 공식 문서를 참고할 수 있다.

좋은 웹페이지 즐겨찾기