그래서 컴파일 타임에 코드를 호출 할 수있는 컴파일러를 작성하고 있습니다. 모든 것이 성공적으로 컴파일 된 후 llvm::ExecutionEngine
을 만들고 각 프로그램에 필요한 llvm::Module
을 추가합니다.LLVM - MCJIT에서 전역 변수를 올바르게 사용하는 방법
마지막으로 llvm::ExecutionEngine::finalizeObject
을 호출하고 모듈 내에서 기능을 실행합니다. 모듈이 전역 변수를 포함 할 때마다 Integer division by zero
오류와
llvm::ExecutionEngine::finalizeObject
충돌 :
llvm::ExecutionEngine* execution_engine = llvm::EngineBuilder(std::move(module)).setErrorStr(&error_str).create();
// Ensure execution engine was created successfully
if(!execution_engine){
std::cerr << "Failed to construct ExecutionEngine: " << error_str << std::endl;
return 1;
}
// Add all of the dependencies to the execution engine
for(size_t i = 0; i != dependencies.size(); i++){
ModuleDependency* dependency = &dependencies[i];
if(!dependency->is_nothing){
llvm::SMDiagnostic sm_diagnostic;
std::unique_ptr<llvm::Module> required_module = llvm::parseIRFile(dependency->bytecode_filename, sm_diagnostic, llvm_context);
if (!required_module) {
sm_diagnostic.print("Failed to parse IR File: ", llvm::errs());
return false;
}
required_module->setModuleIdentifier(dependency->bytecode_filename.c_str());
execution_engine->addModule(std::move(required_module));
}
}
execution_engine->finalizeObject();
llvm::GenericValue returned_value = execution_engine->runFunction(entry_point, args);
다 한 가지를 제외하고 잘 작동합니다.
내 질문 : MCJIT에서 전역 변수를 올바르게 사용하는 방법은 무엇입니까?
주 :
- 글로벌 변수는 경우 기본 실행
에서 잘 작동 - 전역 변수
를 사용하지 않을 때 실행 엔진이 잘 작동 - 나는 문제가 함께 할 수있는 뭔가가 있다고 생각 전역 변수의 연결 또는 실행 엔진의 데이터 레이아웃
의견을 보내 주셔서 감사합니다!