2009-12-03 6 views
22

llvm.org의 온라인 컴파일러로 bc 파일을 생성했습니다. ac 또는 C++ 프로그램에서이 bc 파일을로드 할 수 있는지 알고 싶습니다. bc 파일을 llvm jit (프로그래밍 방식으로 C 프로그램에서)과 비교하여 결과를 얻습니다.c 프로그램에서 LLVM Jit을 호출하십시오.

어떻게하면됩니까?

답변

-3

명령 줄에서 LLVM 프로그램 lli를 사용하여 bc 파일을 실행할 수 있습니다. 파일이 LLVM 어셈블리 언어 인 경우 llvm-as를 먼저 실행하여 이진 비트 코드 파일을 만들어야합니다.

그것은 C.에서이 작업을 수행하기 쉽습니다 난 당신이 광범위한 LLVM 문서를 볼 것을 권 해드립니다 : http://llvm.org/docs

해당 페이지의 링크가있는 LLVM의 IRC 채널은 매우 지식이 사람들로 가득하다 질문에 기꺼이 대답한다.

간접적 인 답변에 사과드립니다. 나는 LLVM을 광범위하게 사용하지만, 단지 시간적으로 불만이있는 경우가 아니라 직접적인 코드 생성을한다.

15

이것은 (다소간) LLVM 2.6을 사용해야 작동합니다. 비트 맵 파일 위에 게으른 ModuleProvider를 만드는 데 도움이되는 몇 가지 도우미 함수가 SVN에있는 것처럼 보입니다. 나는 그것을 컴파일하려고하지 않았지만, 단지 JIT 어플리케이션 중 하나의 비트를 함께 붙였다.

#include <string> 
#include <memory> 

#include <llvm/Bitcode/ReaderWriter.h> 
#include <llvm/ExecutionEngine/ExecutionEngine.h> 
#include <llvm/ModuleProvider.h> 
#include <llvm/Support/MemoryBuffer.h> 
#include <llvm/ExecutionEngine/JIT.h> 

using namespace std; 
using namespace llvm; 

int main() 
{ 
    InitializeNativeTarget(); 
    llvm_start_multithreaded(); 
    LLVMContext context; 

    string error; 
    auto_ptr<MemoryBuffer> buffer(MemoryBuffer::getFile("bitcode.bc")); 
    auto_ptr<Module> module(ParseBitcodeFile(buffer.get(), context, &error)); 
    auto_ptr<ModuleProvider> mp(new ExistingModuleProvider(module)); 
    module.release(); 

    auto_ptr<ExecutionEngine> ee(ExecutionEngine::createJIT(mp.get(), &error)); 
    mp.release(); 

    Function* func = ee->getFunction("foo"); 

    typedef void (*PFN)(); 
    PFN pfn = reinterpret_cast<PFN>(ee->getPointerToFunction(func)); 
    pfn(); 
} 
23

여기 나단 하웰의 기반으로 몇 가지 작업 코드는 다음과 같습니다

#include <string> 
#include <memory> 
#include <iostream> 

#include <llvm/LLVMContext.h> 
#include <llvm/Target/TargetSelect.h> 
#include <llvm/Bitcode/ReaderWriter.h> 
#include <llvm/ExecutionEngine/ExecutionEngine.h> 
#include <llvm/ModuleProvider.h> 
#include <llvm/Support/MemoryBuffer.h> 
#include <llvm/ExecutionEngine/JIT.h> 

using namespace std; 
using namespace llvm; 

int main() 
{ 
    InitializeNativeTarget(); 
    llvm_start_multithreaded(); 
    LLVMContext context; 
    string error; 
    Module *m = ParseBitcodeFile(MemoryBuffer::getFile("tst.bc"), context, &error); 
    ExecutionEngine *ee = ExecutionEngine::create(m); 

    Function* func = ee->FindFunctionNamed("main"); 

    typedef void (*PFN)(); 
    PFN pfn = reinterpret_cast<PFN>(ee->getPointerToFunction(func)); 
    pfn(); 
    delete ee; 
} 

한 이상한 최종 포함하지 않고, EE가 NULL이었다. 기괴한.

내 tst.bc를 생성하려면 http://llvm.org/demo/index.cgi과 llvm-as 명령 줄 도구를 사용했습니다.

+1

Doh # 링커가 JIT를 강제로 가져 오려면 # 을 포함해야합니다. 그렇지 않으면 삭제됩니다. 샘플을 업데이트하겠습니다. –

+0

이것을 수행 할 API가 있습니까? – Ariel

+1

Ariel : 예, 대부분의 LLVM은 LLVM 자체와 함께 제공되는 바인딩을 사용하여 일반 C에서 사용할 수 있습니다. http://llvm.org/docs/FAQ.html#langirgen 및 http://npcontemplation.blogspot.com/2008/06/secret-of-llvm-c-bindings.html –