2012-02-05 3 views
0

내 언어 백엔드에서 점진적으로 함수 및 유형을 작성하지만 함수 및 유형이 성공적으로 작성되지 않은 경우 (사용자 입력 문제로 인해) 주 모듈 및 컨텍스트를 오염시키지 않습니다.llvm : 점진적으로 JIT 내용을 빌드하는 전략

이에 대해서는 an earlier question에게 문의하십시오. 내가 볼 수있는 한 가지 전략은 임시 모듈과 LLVMContext에있는 모든 것을 구축하는 것입니다. 성공 후에 만 ​​주맥으로 마이그레이션하지만 현재 API에서 가능한지 확실하지 않습니다. 예를 들어, LLVM 기능의 고립 된 섬을 대표한다고 가정했기 때문에 다른 컨텍스트간에 해당 컨텐트를 마이그레이션하는 것을 모를 수 있습니다. 그러나 .bc에 모든 것을 저장하고 다른 위치로로드하는 대안이 항상 있을지도 모릅니다.

이것을 달성하기 위해 어떤 다른 전략을 제안 하시겠습니까?

답변

1

원본과 대상의 두 개의 모듈이 있다고 가정하면 원본에서 대상으로 기능을 복사 할 수 있습니다. 예를 들어 LLVM의 코드는 LLVM 링커의 본문입니다 (lib/linker/LinkModules.cpp).

특히 해당 파일에서 linkFunctionProtolinkFunctionBody 메서드를 확인하십시오. linkFunctionBody은 함수 정의를 복사하고 중량물 용 llvm::CloneFunctionInto 유틸리티를 사용합니다. 특별히 다른 스레드에서 동시에 여러 LLVM의 인스턴스를 실행할 필요가없는 LLVMContext에 관해서는


, 너무 걱정 단지 문맥이 필요한 모든 곳에서 getGlobalContext()를 사용하지 마십시오. 자세한 내용은 this doc page을 참조하십시오.

+0

특히 장기 실행 서비스 프로세스에서 호출되기 때문에 여러 LLVMContext를 유지해야하며 글로벌 LLVMContext를 유지하면 무한하게 성장할 수 있습니다. 개별 LLVMContext는 더 나은 메모리 관리 및 가비지 수집을 가능하게합니다 (단일 스레드 프로세스 내에서 실행되는 경우에도) – lurscher

+0

@lurscher : 나는 그것이 "무한한 성장을 할 것"이라고 진지하게 생각합니다. 단일 컨텍스트 및 벤치마킹/프로파일 링을 사용하여 구현할 것을 제안합니다. 대부분의 메모리 사용은 중요하지 않습니다. 내가 링크 된 페이지에서 말한 것처럼, 컨텍스트간에 메모리 내 데이터 구조를 전달할 수는 없습니다. 나는 당신이 비트 코드로 그들을 직렬화 할 수 있고 (다른 상황에서) 다른 쪽에서 역 직렬화 할 수 있다고 상상한다. –

+0

그래, 나도 그렇게 생각했다. 감사! 어떤 경우 든 – lurscher