2014-04-09 4 views
12

C++로 작성된 고성능 시스템에서 작업하고 있습니다. 프로세스는이 응용 프로그램 용으로 개발 된 간단한 언어로 작성된 런타임의 복잡한 논리 (규칙)를 이해할 수 있어야합니다.C++의 임베디드 LLVM에서 이진 코드 (공유 라이브러리) 생성

  • 에 논리를 컴파일 임베디드 인터프리터를 실행하고 데이터에 대한 동적 기능 해석 논리를 기반으로 데이터를 수신 전화, 작품을 생성 -

    1. 는 논리를 해석 : 우리는 두 가지 옵션이 있습니다 plugin.so 동적 공유 파일은 훨씬 빠르게 임베디드보다 실행하는 것,

    옵션 2는 기계 코드를 최적화 할 것 같은 정말 매력적인 것 같아요 플러그인을로드하고 런타임에 논리 함수를 호출, dlsym에를 dlopen을 사용 통역 인 t 그는 처리한다. 내가 탐구하고

    옵션은 다음과 같습니다

      • 이 컴파일 방법 문자열을 컴파일 (문자열 로직, 목록 & 오류 목록 & 경고)
      • 여기
      • 입력 로직이 문자열이 포함 로직 쓰기 사용자 정의 언어로 코딩 됨
      • llvm ir를 생성하고 컴파일 메소드의 반환 값은 다음을 반환합니다.
      • 링크 방법 쓰기 bool 링크 (문자열 ir, 문자열 파일 이름, 목록 & 오류, 목록 & 경고)
      • 링크 방법은 내가 llvm 설명서를 검색하지만 나는 그런 가능성을 쓸 수 있는지 알아낼 수 없었습니다. 방법

      내가 맞으면 LLVM IR은 LLVM 바이트 코드 또는 어셈블리 코드로 변환됩니다. 그런 다음 LLVM JIT를 사용하여 JIT 모드로 실행하거나 GNU Assembler를 사용하여 원시 코드를 생성합니다.

      LLVM에서 해당 기능을 찾을 수 있습니까? C++의 시스템 명령을 사용하여 "as"를 호출하여 내 요구 사항에 맞는 plugin.so 파일을 생성하는 것이 아니라 코드 내에서 모두 수행하는 것이 훨씬 더 좋을 것입니다.

      런타임시 내 프로세스에서 공유 라이브러리 원시 이진 코드를 생성 할 수있는 방법을 알고 있다면 알려주십시오.

    • +0

      저는이 문제에 대해서는 전문가가 아니지만 http://llvm.org/docs/tutorial/LangImpl4 일 수 있습니다.html # add-a-jit-compiler 도움이됩니다. – godfatherofpolka

      +0

      링크를 이용해 주셔서 감사합니다. 예, 임베디드 jit이 또 다른 옵션이라고 생각합니다. JIT 코드에서 C++ 인터페이스를 구현하고 JIT에서 파생 클래스 구현에 대한 포인터를 호출 C++ 응용 프로그램에 반환 할 수 있는지 궁금합니다. – Sanjit

      +0

      AngelScript 나 Lua (더 구체적으로 LuaJit)와 같은 스크립팅 언어가 사용자의 목적에 충분히 빠르지 않다면 OpenCL을 살펴 보는 것이 좋습니다. 런타임시 C/C++로 작성된 전산 코드를 컴파일 할 수 있습니다. C 전처리기를 사용하여 전산 커널을 쉽게 구성 할 수 있습니다. 대부분의 OpenCL 컴파일러는 LLVM을 내부적으로 사용하기 때문에 기술적 세부 사항이 많지 않으면 서 전체 기능을 사용할 수 있습니다. 최종 보너스로 GPU에서 코드를 쉽게 실행하려고 할 수 있지만 원하는 경우 CPU를 제한 할 수 있습니다. – stgatilov

      답변

      3

      llc 이진 코드 변환에 LLVM-IR을 사용하는 llvm 도구입니다. 나는 그것이 당신이 필요한 전부라고 생각합니다.

      기본적으로 LLVM IR을 원하는 방식으로 생성 한 다음 IR을 통해 llc를 호출 할 수 있습니다.

      명령 줄에서 호출하거나 llc 구현으로 이동하여 자신의 프로그램에서 어떻게 작동하는지 확인할 수 있습니다. 나는 그것이 도움이되기를 바랍니다

      http://llvm.org/docs/CommandGuide/llc.html

      : 여기

      은 유용한 링크입니다.

      +2

      llc는 링커가 아닌 어셈블러/컴파일러입니다. .asm 또는 .obj 출력을 생성합니다. 로드 가능한 라이브러리 (.dll 또는 .so)를 생성하지 않습니다. – Sean

      +1

      의견을 보내 주신 Sean에게 감사드립니다. Embedded JIT는 지금까지 내가 찾은 최고의 옵션입니다. – Sanjit