/
githubmirror
/
julia
Обзор
Документация
Войти
/
githubmirror
/
julia
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/llvm_api.cpp
142 строки
4 KB
Jameson Nash
clangsa: add thread-safety capability analysis of safepoint annotations (#62288)
15 июл 2026, 21:56
Не верифицирован
15 июл 2026, 21:56
9821f8a
Код
Авторство
О чём код?
// This file is a part of Julia. License is MIT: https://julialang.org/license #undef DEBUG #include "llvm-version.h" #include "platform.h" #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS #define __STDC_CONSTANT_MACROS #endif #include "jitlayers.h" #include <llvm-c/Core.h> #include <llvm-c/Error.h> #include <llvm-c/Orc.h> #include <llvm-c/OrcEE.h> #include <llvm-c/TargetMachine.h> #include <llvm-c/Types.h> #include <llvm/Support/CBindingWrapping.h> #include <llvm/Support/MemoryBuffer.h> #if JL_LLVM_VERSION < 180000 namespace llvm { namespace orc { class OrcV2CAPIHelper { public: using PoolEntry = orc::SymbolStringPtr::PoolEntry; using PoolEntryPtr = orc::SymbolStringPtr::PoolEntryPtr; // Move from SymbolStringPtr to PoolEntryPtr (no change in ref count). static PoolEntryPtr moveFromSymbolStringPtr(SymbolStringPtr S) { PoolEntryPtr Result = nullptr; std::swap(Result, S.S); return Result; } }; } // namespace orc } // namespace llvm #endif typedef struct JLOpaqueJuliaOJIT *JuliaOJITRef; typedef struct LLVMOrcOpaqueIRCompileLayer *LLVMOrcIRCompileLayerRef; DEFINE_SIMPLE_CONVERSION_FUNCTIONS(JuliaOJIT, JuliaOJITRef) DEFINE_SIMPLE_CONVERSION_FUNCTIONS(orc::JITDylib, LLVMOrcJITDylibRef) DEFINE_SIMPLE_CONVERSION_FUNCTIONS(orc::ExecutionSession, LLVMOrcExecutionSessionRef) #if JL_LLVM_VERSION >= 180000 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(orc::SymbolStringPoolEntryUnsafe::PoolEntry, LLVMOrcSymbolStringPoolEntryRef) #else DEFINE_SIMPLE_CONVERSION_FUNCTIONS(orc::OrcV2CAPIHelper::PoolEntry, LLVMOrcSymbolStringPoolEntryRef) #endif DEFINE_SIMPLE_CONVERSION_FUNCTIONS(orc::IRCompileLayer, LLVMOrcIRCompileLayerRef) DEFINE_SIMPLE_CONVERSION_FUNCTIONS(orc::MaterializationResponsibility, LLVMOrcMaterializationResponsibilityRef) extern "C" { JL_DLLEXPORT_CODEGEN JuliaOJITRef JLJITGetJuliaOJIT_impl(void) { return wrap(jl_ExecutionEngine); } JL_DLLEXPORT_CODEGEN LLVMOrcExecutionSessionRef JLJITGetLLVMOrcExecutionSession_impl(JuliaOJITRef JIT) { return wrap(&unwrap(JIT)->getExecutionSession()); } JL_DLLEXPORT_CODEGEN LLVMOrcJITDylibRef JLJITCreateJITDylib_impl(JuliaOJITRef JIT, const char *Name) { return wrap(&unwrap(JIT)->createJITDylib(Name)); } JL_DLLEXPORT_CODEGEN LLVMErrorRef JLJITAddObjectFile_impl( JuliaOJITRef JIT, LLVMOrcJITDylibRef JD, LLVMMemoryBufferRef ObjBuffer) { return wrap(unwrap(JIT)->addObjectFile( *unwrap(JD), std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer)))); } JL_DLLEXPORT_CODEGEN LLVMErrorRef JLJITAddLLVMIRModule_impl( JuliaOJITRef JIT, LLVMOrcJITDylibRef JD, LLVMOrcThreadSafeModuleRef TSM) { std::unique_ptr<orc::ThreadSafeModule> TmpTSM(unwrap(TSM)); return wrap(unwrap(JIT)->addExternalModule(*unwrap(JD), std::move(*TmpTSM))); } JL_DLLEXPORT_CODEGEN LLVMErrorRef JLJITJDLookup_impl(JuliaOJITRef JIT, LLVMOrcJITDylibRef JD, LLVMOrcExecutorAddress *Result, const char *Name, int ExternalJDOnly) JL_CANSAFEPOINT { auto Sym = unwrap(JIT)->findJDSymbol(*unwrap(JD), Name, ExternalJDOnly); if (Sym) { auto addr = Sym->getAddress(); *Result = orc::ExecutorAddr(addr).getValue(); return LLVMErrorSuccess; } else { *Result = 0; return wrap(Sym.takeError()); } } JL_DLLEXPORT_CODEGEN LLVMOrcSymbolStringPoolEntryRef JLJITMangleAndIntern_impl(JuliaOJITRef JIT, const char *Name) { #if JL_LLVM_VERSION >= 180000 return wrap(orc::SymbolStringPoolEntryUnsafe::take(unwrap(JIT)->mangle(Name)).rawPtr()); #else return wrap(orc::OrcV2CAPIHelper::moveFromSymbolStringPtr(unwrap(JIT)->mangle(Name))); #endif } JL_DLLEXPORT_CODEGEN const char * JLJITGetTripleString_impl(JuliaOJITRef JIT) { return unwrap(JIT)->getTargetTriple().str().c_str(); } JL_DLLEXPORT_CODEGEN char JLJITGetGlobalPrefix_impl(JuliaOJITRef JIT) { return unwrap(JIT)->getDataLayout().getGlobalPrefix(); } JL_DLLEXPORT_CODEGEN const char * JLJITGetDataLayoutString_impl(JuliaOJITRef JIT) { return unwrap(JIT)->getDataLayout().getStringRepresentation().c_str(); } JL_DLLEXPORT_CODEGEN LLVMOrcIRCompileLayerRef JLJITGetIRCompileLayer_impl(JuliaOJITRef JIT) { return wrap(&unwrap(JIT)->getIRCompileLayer()); } } // extern "C"