环境:windows llvm5.0.1
代码:
#include "llvm/ExecutionEngine/GenericValue.h"
#include "llvm/ExecutionEngine/MCJIT.h"
#include "llvm/ExecutionEngine/Interpreter.h"
#include "llvm/ExecutionEngine/SectionMemoryManager.h"
#include "llvm/IR/Verifier.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include <llvm/IRReader/IRReader.h>
#include <llvm/Support/SourceMgr.h>
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/TargetSelect.h"
#include <llvm/Support/MemoryBuffer.h>
#include "llvm/Support/raw_ostream.h"
#include <llvm/Support/DynamicLibrary.h>
#include "llvm/Support/Debug.h"
#include <cctype>
#include <cstdio>
#include <map>
#include <string>
#include <vector>
#include <stdlib.h>
#include <iostream>
using namespace llvm;
using namespace std;
static LLVMContext *context;
typedef void(*func_type)(...);
int main(int argc, char* argv[]) {
InitializeNativeTarget();
InitializeNativeTargetAsmPrinter();
InitializeNativeTargetAsmParser();
RTDyldMemoryManager* RTDyldMM = NULL;
context = new LLVMContext();
SMDiagnostic *smd = new SMDiagnostic();
static unique_ptr<Module> Owner = llvm::parseIRFile("external.bc", *smd, *context);
//std::unique_ptr<Module> Owner = llvm::make_unique<Module>("test", *context);
Module *module = Owner.get();
std::string ErrStr;
RTDyldMM = new SectionMemoryManager();
ExecutionEngine *executionEngine = EngineBuilder(std::move(Owner))
.setEngineKind(EngineKind::JIT)
.setErrorStr(&ErrStr)
.setVerifyModules(true)
.setMCJITMemoryManager(std::unique_ptr<RTDyldMemoryManager>(RTDyldMM))
.setOptLevel(CodeGenOpt::Default)
.create();
if (!executionEngine) {
exit(1);
}
executionEngine->finalizeObject();
void *func = executionEngine->getPointerToFunction(module->getFunction("sayhello"));
// uint64_t func = executionEngine->getFunctionAddress("islower");
func_type f = (func_type)func;
f();
system("pause");
return 0;
}
遇到的问题:
finalizeObject失败,尝试使用getFunctionAddress也失败,调用getFunctionAddress方法时会默认调用finalizeObject方法。
当注释掉finalizeObject方法时,出现如下错误: