LLVM으로 JIT를 작성할 때 C Opcode 구현을 어떻게 재사용 하시겠습니까?
-
21-08-2019 - |
문제
LLVM 튜토리얼 및 예제에서 컴파일러는 이와 같이 전화를 걸어 LLVM IR을 출력합니다.
return Builder.CreateAdd(L, R, "addtmp");
그러나 많은 통역사가 다음과 같이 쓰여집니다.
switch (opcode) {
case ADD:
result = L + R;
break;
...
LLVM IR에서 각 오프 코드를 다시 구현하지 않고 LLVM으로 JIT를 만들기 위해 이러한 각 코드 스 니펫을 어떻게 추출 하시겠습니까?
해결책
좋아, 먼저 모든 코드 스 니펫을 가져 와서 자신의 기능으로 리팩토링하십시오. 따라서 코드는 다음과 같습니다.
void addOpcode(uint32_t *result, uint32_t L, uint32_t R) {
*result = L + R;
}
switch (opcode) {
case ADD:
addOpcode(&result, L, R);
break;
....
자,이 작업을 마친 후에도 통역사는 여전히 실행해야합니다. 이제 모든 새로운 기능을 가져 와서 자신의 파일에 배치하십시오. 이제 LLVM-GCC 또는 Clang을 사용하여 해당 파일을 컴파일하고 기본 코드를 생성하는 대신 "CPP"백엔드 (-march -cpp). 컴파일 장치의 바이트 코드를 인스턴스화하는 C ++ 코드가 생성됩니다. 특정 함수 등으로 제한하는 옵션을 지정할 수 있습니다. "-cppgen 모듈"을 사용하려는 것입니다.
이제 통역사 루프 접착제를 함께 원래 코드를 직접 실행하는 대신 생성 된 C ++ 코드로 호출 한 다음 일부 최적화기 및 기본 코드 게이터로 전달하십시오. jit의 Gratz ;-) VM_OPS와 같은 몇 개의 LLVM 프로젝트에서 이것의 예를 볼 수 있습니다. llvm-lua.
제휴하지 않습니다 StackOverflow