2014-10-21 4 views
2

LLVM lli 도구를 정적 라이브러리 (main()에서 lli()으로 바꾸고 libLLi.a에서 내 보냅니다)로 사용하고 싶습니다. 풍부한 UI를 만들 수 있습니다. 표준 입력을 가로 채기 위해 어떻게 수정 (또는 수정없이 사용) 할 수 있습니까?LLVM 도구 입력을 차단하는 방법은 무엇입니까?

LLVM 어셈블리 파일 (clang -S -emit-llvm .. -o output.ll 사용)을 생성하는 방법과 lli 도구 (lli output.ll)를 사용하여 실행하는 방법을 알고 있다고 가정합니다.

일반적인 사용 사례 : cin.getline 호출 할 때

#include <iostream> 

using namespace std; 

int main() { 
    char name[128]; 
    cout << "type your name: "; 
    cin.getline(name, sizeof(name)); 
    cout << "hi, " << name << endl; 

    return 0; 
} 

내가 그것을 위해 LLVM 어셈블리를 해석하고에서 InputBox를 표시해야하고 쇼 텍스트 상자 cout <<을 : 간단한 응용 프로그램의

소스 코드는 LLI 해석 할 (InputBox 및 TextBox는 풍부한 UI 컨트롤입니다.)

추신. 프로세스를 포크 할 수없고 전체 자식 프로세스의 stdin/stdout을 전달할 수 없습니다.

답변

4

lli은 이미 llvm 라이브러리 함수를 감싸는 씬 래퍼입니다. tools/lli/lli.cpp의 main() 함수는 모든 가능한 설정을 제어하기 위해 많은 수의 플래그를 지원하기 때문에 길었습니다. 스트립을 제거한 후에는 EngineBuilder을 사용하여 ExecutionEngine을 만들고이를 사용하여 llvm::Function을 실행하면 10 줄 미만이어야합니다.

또한 chapter 4 of the Kaleidoscope tutorial이 유용 할 수도 있습니다. 여기서는 언어에 JIT 지원을 추가합니다. 또한 EngineBuilder를 사용하는 방법을 보여줍니다. 빌드 할 ExecutionEngine은 Interpreter 대신 JIT이지만 사용 사례에 맞게 사용자 정의 할 수 있습니다.

이제 다른 질문에 대해서는 stdinstdout을 어떻게 트랩합니까? LLVM은 VM이 아니며 코드가 프로세스에서 실행 중이고 stdin과 stdout을 사용하고 있습니다. 나의 첫 번째 제안은 이미 LLVM IR 포맷의 기능을 가지고 있기 때문에, 표준 I/O 기능을 당신의 I/O 기능으로 대체하는 변환 패스를 실행하는 것입니다. ABI를 정렬 할 수있는 경우 더 간단한 방법은 ExecutionEngine을 사용하여 다시 매핑하는 것입니다. EE->updateGlobalMapping(functionDeclInIR, &replacementFunctionInNativeCode)을 호출하여 ExecutionEngine에 functionDeclInIR에 대한 Function*이 nativeF에서 replacementFunctionInNativeCode로 표시되는지 확인합니다. GUI를 사용하는 _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc (일명 ostream :: operator < <) 구현을 제공해야합니다.

+0

소리가 유망합니다. 'ostream :: operator <<'inheritor?를 작성하는 방법에 대한 제안/예제/링크. – 4ntoine

관련 문제