문제

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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top