IT TIP

디자인 제안 : llvm 다중 런타임 컨텍스트

itqueen 2020. 11. 28. 13:24
반응형

디자인 제안 : llvm 다중 런타임 컨텍스트


내 응용 프로그램은 동일한 (단일 스레드) 프로세스에서 여러 개별 컨텍스트를 실행해야합니다. 그들은 모두 하나의 LLVMContext.

프로세스는 스레드 의미에서 많은 컨텍스트를 실행합니다. 즉, 각각은 boost::context(여전히 볼트, 사전 승인 된 라이브러리에서) 연속 객체에서 함수를 실행 합니다. 즉, 각 컨텍스트가 양보 할 수 있지만 기본적으로 동일한 단일 스레드 프로세스에서 실행됩니다. 각각은 기본적으로 서로 독립적으로 실행되어야하며 더 중요한 것은 각각의 컴파일 오류가 다른 것의 실행에 영향을주지 않아야한다는 것입니다.

이러한 각 컨텍스트는 여러 변환 단위 (TU)에 걸쳐있는 코드를 동적으로 호출합니다. 일부 번역 단위는 이러한 많은 컨텍스트에서 공유 될 수 있습니다. 새 번역 단위 또는 수정 된 번역 단위의 컴파일 오류는 다른 컨텍스트에 영향을주지 않아야합니다.

Clarification Edit : 예를 들어 TU A는 컨텍스트 X와 Y의 두 컨텍스트간에 공유 될 수 있습니다. 전체 그림을보기 위해 X도 다른 번역 단위, 즉 B와 D의 코드를 실행한다고 가정하겠습니다. Y도 C를 갖게됩니다. 어느 시점에서 X는 A를 수정하기로 결정하므로 A의 사본 인 새 TU A.1을 만들고 거기에 수정을 적용하므로 컨텍스트 Y에 영향을주지 않습니다. 이 예제가 요구 사항을 명확하게 해주기를 바랍니다.

내 초기 충동은 llvm::Module각 컨텍스트에 대해 하나를 연결하는 것이었지만 LLVM에서 정의되지 않았기 때문에 중간 컴파일 상태의 모듈에서 발생하는 일이 발생했기 때문에 llvm::Module각 번역 단위에 대해 하나씩 추가하기로 결정했습니다 ( 이유는이 질문 참조 ) 및 사본 -on-write 정책 수정이 다른 컨텍스트에 영향을 미치는 것을 피하기 위해 번역 단위의 수정이 컨텍스트에 로컬로 발생하는 경우에 대해 이전에 설명했습니다.

내가 가진 두 가지 주요 질문은 다음과 같습니다.

  • 통합 라이브러리로 호출하기 위해 컨텍스트에서 다른 모듈을 함께 연결하는 방법은 무엇입니까? C ++ API를 사용하고 있습니다. 나는 특히이 기능에 영향을 미치는이 불쾌하고 오래된 버그대해 경계 합니다. 모든 모듈의 소유권을 JIT로 이전하면이 버그가 여전히 나에게 영향을 미칩니 ExecutionEngine::addModule()까?

  • 번역 단위를 수정하면 모듈 중 하나가 강제로 업데이트되면 필요한 단계는 무엇입니까? 이전 모듈 객체를 삭제 / 삭제하고 새로 만들어야합니까? 읽지 않은 재활용 정책이 있습니까?

이에 대한 두 번째 질문은 다음과 같습니다.

  • 얼마나 많이 ExecutionEngine필요합니까? 전체 응용 프로그램에 대해 하나? 컨텍스트 당 하나? 모듈 당 하나?

질문의 범위가 너무 압도적이지 않기를 바랍니다.


당신의 아이디어를 "걸기"위한 개념적 틀이 필요하다고 생각합니다. 다양한 실행 비트를 명령으로 생각하면 (아마도 명령 패턴을 사용하여 구현할 수도 있음)보다 명확한 상호 작용 지점 집합을 얻을 수 있습니다. 그 말은; 반환하려는 각 개별 실행에 대한 컨텍스트가 필요합니다. 두 개 이상은 적절한 장부를 작성해야합니다. 나는 두 가지가 본질적으로 부스트에서 무료로 처리된다고 생각합니다.
실행 비트 간의 통신도 마찬가지로 사용자에게 달려 있습니다. 실행 컨텍스트간에 공유되는 상태 (메멘토)를 만드는 것이 마음에 드는 솔루션 중 하나입니다. 런타임에 이미 적절한 상태가 내장되어있을 수도 있으며 추가 레이어가 필요하지 않습니다. 지적했듯이 글로벌은 이러한 상호 작용에서 친구가 아닙니다. 버전 관리 및 이름 확인도 문제입니다. 실행 비트를 분리하여 유지하면이 문제를 해결하는 데 큰 도움이됩니다. 조정 문제를 해결 한 후에는 이미 생성 한 비트를 추적하는 것이 더 중요합니다. 이것은 또한 재활용이 필요하지 않으며 매번 새로 만들기 만하면 다시로드 할 필요가 없음을 의미합니다. 또한 실행이 완료되면 이러한 비트의 수명 종료를 관리해야합니다. 나는 하나를 제안하고있다ExecutionEngine실행 비트 당. 이렇게하지 않는다는 것은 잘못된 코드의 영향으로부터 작업 코드를 "보호"하려는 시도가 훨씬 더 많다는 것을 의미합니다. 나는 단일 엔진으로 이것을 할 수 있다고 생각하지만 훨씬 더 위험합니다.

참고 URL : https://stackoverflow.com/questions/9934790/design-suggestion-llvm-multiple-runtime-contexts

반응형