llvm.org의 온라인 컴파일러로 bc 파일을 생성했습니다. ac 또는 C++ 프로그램에서이 bc 파일을로드 할 수 있는지 알고 싶습니다. bc 파일을 llvm jit (프로그래밍 방식으로 C 프로그램에서)과 비교하여 결과를 얻습니다.c 프로그램에서 LLVM Jit을 호출하십시오.
어떻게하면됩니까?
llvm.org의 온라인 컴파일러로 bc 파일을 생성했습니다. ac 또는 C++ 프로그램에서이 bc 파일을로드 할 수 있는지 알고 싶습니다. bc 파일을 llvm jit (프로그래밍 방식으로 C 프로그램에서)과 비교하여 결과를 얻습니다.c 프로그램에서 LLVM Jit을 호출하십시오.
어떻게하면됩니까?
명령 줄에서 LLVM 프로그램 lli를 사용하여 bc 파일을 실행할 수 있습니다. 파일이 LLVM 어셈블리 언어 인 경우 llvm-as를 먼저 실행하여 이진 비트 코드 파일을 만들어야합니다.
그것은 C.에서이 작업을 수행하기 쉽습니다 난 당신이 광범위한 LLVM 문서를 볼 것을 권 해드립니다 : http://llvm.org/docs
해당 페이지의 링크가있는 LLVM의 IRC 채널은 매우 지식이 사람들로 가득하다 질문에 기꺼이 대답한다.
간접적 인 답변에 사과드립니다. 나는 LLVM을 광범위하게 사용하지만, 단지 시간적으로 불만이있는 경우가 아니라 직접적인 코드 생성을한다.
이것은 (다소간) 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();
}
여기 나단 하웰의 기반으로 몇 가지 작업 코드는 다음과 같습니다
#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 명령 줄 도구를 사용했습니다.
Doh # 링커가 JIT를 강제로 가져 오려면 #을 포함해야합니다. 그렇지 않으면 삭제됩니다. 샘플을 업데이트하겠습니다. –
이것을 수행 할 API가 있습니까? – Ariel
Ariel : 예, 대부분의 LLVM은 LLVM 자체와 함께 제공되는 바인딩을 사용하여 일반 C에서 사용할 수 있습니다. http://llvm.org/docs/FAQ.html#langirgen 및 http://npcontemplation.blogspot.com/2008/06/secret-of-llvm-c-bindings.html –