2017-03-11 12 views
1

그래서 컴파일 타임에 코드를 호출 할 수있는 컴파일러를 작성하고 있습니다. 모든 것이 성공적으로 컴파일 된 후 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에서 전역 변수를 올바르게 사용하는 방법은 무엇입니까?

주 :
- 글로벌 변수는 경우 기본 실행
에서 잘 작동 - 전역 변수
를 사용하지 않을 때 실행 엔진이 잘 작동 - 나는 문제가 함께 할 수있는 뭔가가 있다고 생각 전역 변수의 연결 또는 실행 엔진의 데이터 레이아웃

의견을 보내 주셔서 감사합니다!

답변

0

내 문제가 발견되었습니다.

내 전역에는 JIT 코드에는 의미가없는 CommonLinkage가 있습니다. 전역 변수의 연결을 InernalLinkage로 변경하면 코드가 제대로 작동합니다.