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
이에 따라 패스를 쓰는 기본 절차를 대충 파악했고 더 자세한 내용은 공식 문서를 참고할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.