Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Make.inc
Original file line number Diff line number Diff line change
Expand Up @@ -378,8 +378,10 @@ ifeq ($(XC_HOST),)
CROSS_COMPILE:=
# delayed expansion of $(CC), since it won't be computed until later
HOSTCC = $(CC)
HOSTCXX = $(CXX)
else
HOSTCC ?= gcc
HOSTCXX ?= g++
OPENBLAS_DYNAMIC_ARCH := 1
override CROSS_COMPILE:=$(XC_HOST)-
ifneq (,$(findstring mingw,$(XC_HOST)))
Expand Down
4 changes: 0 additions & 4 deletions deps/NATIVE.cmake

This file was deleted.

13 changes: 4 additions & 9 deletions deps/llvm.mk
Original file line number Diff line number Diff line change
Expand Up @@ -129,19 +129,14 @@ LLVM_CMAKE += -DLLVM_BINDINGS_LIST="" -DLLVM_INCLUDE_DOCS=Off -DLLVM_ENABLE_TERM
ifeq ($(LLVM_ASSERTIONS), 1)
LLVM_CMAKE += -DLLVM_ENABLE_ASSERTIONS:BOOL=ON
endif # LLVM_ASSERTIONS
ifeq ($(LLVM_DEBUG), 1)
ifeq ($(OS), WINNT)
LLVM_CXXFLAGS += -Wa,-mbig-obj
endif # OS == WINNT
endif # LLVM_DEBUG
ifeq ($(OS), WINNT)
LLVM_CPPFLAGS += -D__USING_SJLJ_EXCEPTIONS__ -D__CRT__NO_INLINE
ifneq ($(BUILD_OS),WINNT)
LLVM_CMAKE += -DCROSS_TOOLCHAIN_FLAGS_NATIVE=-DCMAKE_TOOLCHAIN_FILE=$(SRCDIR)/NATIVE.cmake
endif # BUILD_OS != WINNT
endif # OS == WINNT
ifneq ($(HOSTCC),$(CC))
LLVM_CMAKE += -DCROSS_TOOLCHAIN_FLAGS_NATIVE="-DCMAKE_C_COMPILER=$$(which $(HOSTCC));-DCMAKE_CXX_COMPILER=$$(which $(HOSTCXX))"
endif
ifeq ($(OS), emscripten)
LLVM_CMAKE += -DCMAKE_TOOLCHAIN_FILE=$(EMSCRIPTEN)/cmake/Modules/Platform/Emscripten.cmake -DCROSS_TOOLCHAIN_FLAGS_NATIVE=-DCMAKE_TOOLCHAIN_FILE=$(SRCDIR)/NATIVE.cmake -DLLVM_INCLUDE_TOOLS=OFF -DLLVM_BUILD_TOOLS=OFF -DLLVM_INCLUDE_TESTS=OFF -DLLVM_ENABLE_THREADS=OFF -DLLVM_BUILD_UTILS=OFF
LLVM_CMAKE += -DCMAKE_TOOLCHAIN_FILE=$(EMSCRIPTEN)/cmake/Modules/Platform/Emscripten.cmake -DLLVM_INCLUDE_TOOLS=OFF -DLLVM_BUILD_TOOLS=OFF -DLLVM_INCLUDE_TESTS=OFF -DLLVM_ENABLE_THREADS=OFF -DLLVM_BUILD_UTILS=OFF
endif # OS == emscripten
ifeq ($(USE_LLVM_SHLIB),1)
# NOTE: we could also --disable-static here (on the condition we link tools
Expand Down
4 changes: 1 addition & 3 deletions deps/tools/common.mk
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,12 @@ CMAKE_COMMON += -DCMAKE_CXX_COMPILER="$(CXX_BASE)"
ifneq ($(strip $(CMAKE_CXX_ARG)),)
CMAKE_COMMON += -DCMAKE_CXX_COMPILER_ARG1="$(CMAKE_CXX_ARG)"
endif
CMAKE_COMMON += -DCMAKE_LINKER="$(shell which $(LD))" -DCMAKE_AR="$(shell which $(AR))" -DCMAKE_RANLIB="$(shell which $(RANLIB))"
CMAKE_COMMON += -DCMAKE_LINKER="$$(which $(LD))" -DCMAKE_AR="$$(which $(AR))" -DCMAKE_RANLIB="$$(which $(RANLIB))"

ifeq ($(OS),WINNT)
CMAKE_COMMON += -DCMAKE_SYSTEM_NAME=Windows
ifneq ($(BUILD_OS),WINNT)
CMAKE_COMMON += -DCMAKE_RC_COMPILER="$$(which $(CROSS_COMPILE)windres)"
endif
endif

# For now this is LLVM specific, but I expect it won't be in the future
ifeq ($(CMAKE_GENERATOR),Ninja)
Expand Down
2 changes: 1 addition & 1 deletion src/anticodegen.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ void jl_write_malloc_log(void) UNAVAILABLE
void jl_write_coverage_data(void) UNAVAILABLE

JL_DLLEXPORT void jl_clear_malloc_data(void) UNAVAILABLE
JL_DLLEXPORT void jl_extern_c(jl_function_t *f, jl_value_t *rt, jl_value_t *argt, char *name) UNAVAILABLE
JL_DLLEXPORT int jl_extern_c(jl_function_t *f, jl_value_t *rt, jl_value_t *argt, char *name) UNAVAILABLE
JL_DLLEXPORT void *jl_function_ptr(jl_function_t *f, jl_value_t *rt, jl_value_t *argt) UNAVAILABLE
JL_DLLEXPORT jl_value_t *jl_dump_method_asm(jl_method_instance_t *linfo, size_t world, int raw_mc, char getwrapper, const char* asm_variant, const char *debuginfo) UNAVAILABLE
JL_DLLEXPORT const jl_value_t *jl_dump_function_ir(void *f, uint8_t strip_ir_metadata, uint8_t dump_module, const char *debuginfo) UNAVAILABLE
Expand Down
8 changes: 3 additions & 5 deletions src/codegen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5396,7 +5396,7 @@ static jl_cgval_t emit_cfunction(jl_codectx_t &ctx, jl_value_t *output_type, con

// do codegen to create a C-callable alias/wrapper, or if sysimg_handle is set,
// restore one from a loaded system image.
void jl_generate_ccallable(void *llvmmod, void *sysimg_handle, jl_value_t *declrt, jl_value_t *sigt, jl_codegen_params_t &params)
const char *jl_generate_ccallable(void *llvmmod, void *sysimg_handle, jl_value_t *declrt, jl_value_t *sigt, jl_codegen_params_t &params)
{
jl_datatype_t *ft = (jl_datatype_t*)jl_tparam0(sigt);
jl_value_t *ff = ft->instance;
Expand Down Expand Up @@ -5438,7 +5438,7 @@ void jl_generate_ccallable(void *llvmmod, void *sysimg_handle, jl_value_t *declr
gen_cfun_wrapper((Module*)llvmmod, params, sig, ff, name, declrt, lam, NULL, NULL, NULL);
}
JL_GC_POP();
return;
return name;
}
err = jl_get_exceptionf(jl_errorexception_type, "%s", sig.err_msg.c_str());
}
Expand Down Expand Up @@ -7587,7 +7587,6 @@ static void init_jit_functions(void)
add_named_global(except_enter_func, (void*)NULL);

#ifdef _OS_WINDOWS_
#ifndef FORCE_ELF
#if defined(_CPU_X86_64_)
#if defined(_COMPILER_GCC_)
add_named_global("___chkstk_ms", &___chkstk_ms);
Expand All @@ -7602,7 +7601,6 @@ static void init_jit_functions(void)
#endif
#endif
#endif
#endif

#define BOX_F(ct) add_named_global("jl_box_"#ct, &jl_box_##ct);
BOX_F(int8); BOX_F(uint8);
Expand Down Expand Up @@ -7751,7 +7749,7 @@ extern "C" void jl_init_llvm(void)
#endif

init_julia_llvm_meta();
jl_ExecutionEngine = new JuliaOJIT(*jl_TargetMachine);
jl_ExecutionEngine = new JuliaOJIT(*jl_TargetMachine, &jl_LLVMContext);

// Mark our address spaces as non-integral
jl_data_layout = jl_ExecutionEngine->getDataLayout();
Expand Down
123 changes: 49 additions & 74 deletions src/debuginfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -227,16 +227,13 @@ class JuliaJITEventListener: public JITEventListener
if (!SavedObject.first) {
auto NewBuffer = MemoryBuffer::getMemBufferCopy(
Object.getData(), Object.getFileName());
auto NewObj = object::ObjectFile::createObjectFile(NewBuffer->getMemBufferRef());
assert(NewObj);
SavedObject = std::make_pair(std::move(*NewObj), std::move(NewBuffer));
auto NewObj = cantFail(object::ObjectFile::createObjectFile(NewBuffer->getMemBufferRef()));
SavedObject = std::make_pair(std::move(NewObj), std::move(NewBuffer));
}
const object::ObjectFile &debugObj = *SavedObject.first.release();
SavedObject.second.release();

object::section_iterator Section = debugObj.section_begin();
object::section_iterator EndSection = debugObj.section_end();

std::map<StringRef, object::SectionRef, strrefcomp> loadedSections;
for (const object::SectionRef &lSection: Object.sections()) {
#if JL_LLVM_VERSION >= 100000
Expand Down Expand Up @@ -316,16 +313,14 @@ class JuliaJITEventListener: public JITEventListener
#endif

#if defined(_OS_WINDOWS_)
uint64_t SectionAddrCheck = 0; // assert that all of the Sections are at the same location
uint64_t SectionAddrCheck = 0;
uint64_t SectionLoadCheck = 0;
uint64_t SectionWriteCheck = 0;
uint8_t *UnwindData = NULL;
#if defined(_CPU_X86_64_)
uint64_t SectionLoadOffset = 1; // The real offset shouldn't be 1.
uint8_t *catchjmp = NULL;
for (const object::SymbolRef &sym_iter : debugObj.symbols()) {
StringRef sName;
auto sNameOrError = sym_iter.getName();
assert(sNameOrError);
sName = sNameOrError.get();
StringRef sName = cantFail(sym_iter.getName());
uint8_t **pAddr = NULL;
if (sName.equals("__UnwindData")) {
pAddr = &UnwindData;
Expand All @@ -334,98 +329,79 @@ class JuliaJITEventListener: public JITEventListener
pAddr = &catchjmp;
}
if (pAddr) {
uint64_t Addr, SectionAddr, SectionLoadAddr;
auto AddrOrError = sym_iter.getAddress();
assert(AddrOrError);
Addr = AddrOrError.get();
auto SectionOrError = sym_iter.getSection();
assert(SectionOrError);
Section = SectionOrError.get();
uint64_t Addr = cantFail(sym_iter.getAddress());
auto Section = cantFail(sym_iter.getSection());
assert(Section != EndSection && Section->isText());
SectionAddr = Section->getAddress();
uint64_t SectionAddr = Section->getAddress();
#if JL_LLVM_VERSION >= 100000
auto secName = Section->getName();
assert(secName);
SectionLoadAddr = getLoadAddress(*secName);
sName = cantFail(Section->getName());
#else
Section->getName(sName);
SectionLoadAddr = getLoadAddress(sName);
#endif
Addr -= SectionAddr - SectionLoadAddr;
*pAddr = (uint8_t*)Addr;
if (SectionAddrCheck)
assert(SectionAddrCheck == SectionLoadAddr);
else
SectionAddrCheck = SectionLoadAddr;
uint64_t SectionLoadAddr = getLoadAddress(sName);
assert(SectionLoadAddr);
if (SectionAddrCheck) // assert that all of the Sections are at the same location
assert(SectionAddrCheck == SectionAddr &&
SectionLoadCheck == SectionLoadAddr);
SectionAddrCheck = SectionAddr;
SectionLoadCheck = SectionLoadAddr;
SectionWriteCheck = SectionLoadAddr;
if (memmgr)
SectionAddr =
(uintptr_t)lookupWriteAddressFor(memmgr,
(void*)SectionLoadAddr);
if (SectionLoadOffset != 1)
assert(SectionLoadOffset == SectionAddr - SectionLoadAddr);
else
SectionLoadOffset = SectionAddr - SectionLoadAddr;
SectionWriteCheck = (uintptr_t)lookupWriteAddressFor(memmgr,
(void*)SectionLoadAddr);
Addr += SectionWriteCheck - SectionLoadAddr;
*pAddr = (uint8_t*)Addr;
}
}
assert(catchjmp);
assert(UnwindData);
assert(SectionAddrCheck);
assert(SectionLoadOffset != 1);
catchjmp[SectionLoadOffset] = 0x48;
catchjmp[SectionLoadOffset + 1] = 0xb8; // mov RAX, QWORD PTR [&__julia_personality]
*(uint64_t*)(&catchjmp[SectionLoadOffset + 2]) =
(uint64_t)&__julia_personality;
catchjmp[SectionLoadOffset + 10] = 0xff;
catchjmp[SectionLoadOffset + 11] = 0xe0; // jmp RAX
UnwindData[SectionLoadOffset] = 0x09; // version info, UNW_FLAG_EHANDLER
UnwindData[SectionLoadOffset + 1] = 4; // size of prolog (bytes)
UnwindData[SectionLoadOffset + 2] = 2; // count of unwind codes (slots)
UnwindData[SectionLoadOffset + 3] = 0x05; // frame register (rbp) = rsp
UnwindData[SectionLoadOffset + 4] = 4; // second instruction
UnwindData[SectionLoadOffset + 5] = 0x03; // mov RBP, RSP
UnwindData[SectionLoadOffset + 6] = 1; // first instruction
UnwindData[SectionLoadOffset + 7] = 0x50; // push RBP
*(DWORD*)&UnwindData[SectionLoadOffset + 8] = (DWORD)(catchjmp - (uint8_t*)SectionAddrCheck); // relative location of catchjmp
assert(SectionLoadCheck);
catchjmp[0] = 0x48;
catchjmp[1] = 0xb8; // mov RAX, QWORD PTR [&__julia_personality]
*(uint64_t*)(&catchjmp[2]) = (uint64_t)&__julia_personality;
catchjmp[10] = 0xff;
catchjmp[11] = 0xe0; // jmp RAX
UnwindData[0] = 0x09; // version info, UNW_FLAG_EHANDLER
UnwindData[1] = 4; // size of prolog (bytes)
UnwindData[2] = 2; // count of unwind codes (slots)
UnwindData[3] = 0x05; // frame register (rbp) = rsp
UnwindData[4] = 4; // second instruction
UnwindData[5] = 0x03; // mov RBP, RSP
UnwindData[6] = 1; // first instruction
UnwindData[7] = 0x50; // push RBP
*(DWORD*)&UnwindData[8] = (DWORD)(catchjmp - (uint8_t*)SectionWriteCheck); // relative location of catchjmp
#endif // defined(_OS_X86_64_)
#endif // defined(_OS_WINDOWS_)

auto symbols = object::computeSymbolSizes(debugObj);
bool first = true;
for (const auto &sym_size : symbols) {
const object::SymbolRef &sym_iter = sym_size.first;
auto SymbolTypeOrError = sym_iter.getType();
assert(SymbolTypeOrError);
object::SymbolRef::Type SymbolType = SymbolTypeOrError.get();
object::SymbolRef::Type SymbolType = cantFail(sym_iter.getType());
if (SymbolType != object::SymbolRef::ST_Function) continue;
auto AddrOrError = sym_iter.getAddress();
assert(AddrOrError);
uint64_t Addr = AddrOrError.get();
auto SectionOrError = sym_iter.getSection();
assert(SectionOrError);
Section = SectionOrError.get();
uint64_t Addr = cantFail(sym_iter.getAddress());
auto Section = cantFail(sym_iter.getSection());
if (Section == EndSection) continue;
if (!Section->isText()) continue;
uint64_t SectionAddr = Section->getAddress();
#if JL_LLVM_VERSION >= 100000
Expected<StringRef> secName = Section->getName();
assert(secName);
uint64_t SectionLoadAddr = getLoadAddress(*secName);
StringRef secName = cantFail(Section->getName());
#else
StringRef secName;
Section->getName(secName);
uint64_t SectionLoadAddr = getLoadAddress(secName);
#endif
uint64_t SectionLoadAddr = getLoadAddress(secName);
Addr -= SectionAddr - SectionLoadAddr;
auto sNameOrError = sym_iter.getName();
assert(sNameOrError);
StringRef sName = sNameOrError.get();
StringRef sName = cantFail(sym_iter.getName());
uint64_t SectionSize = Section->getSize();
size_t Size = sym_size.second;
#if defined(_OS_WINDOWS_)
if (SectionAddrCheck)
assert(SectionAddrCheck == SectionLoadAddr);
else
SectionAddrCheck = SectionLoadAddr;
assert(SectionAddrCheck == SectionAddr &&
SectionLoadCheck == SectionLoadAddr);
SectionAddrCheck = SectionAddr;
SectionLoadCheck = SectionLoadAddr;
create_PRUNTIME_FUNCTION(
(uint8_t*)(uintptr_t)Addr, (size_t)Size, sName,
(uint8_t*)(uintptr_t)SectionLoadAddr, (size_t)SectionSize, UnwindData);
Expand Down Expand Up @@ -821,9 +797,8 @@ static void get_function_name_and_base(llvm::object::SectionRef Section, size_t
}
if (distance != (size_t)-1) {
if (needs_saddr) {
auto addr = sym_found.getAddress();
assert(addr);
*saddr = (void*)(uintptr_t)(addr.get() - slide);
uintptr_t addr = cantFail(sym_found.getAddress());
*saddr = (void*)(addr - slide);
needs_saddr = false;
}
if (needs_name) {
Expand Down
4 changes: 3 additions & 1 deletion src/dump.c
Original file line number Diff line number Diff line change
Expand Up @@ -2576,7 +2576,9 @@ static jl_value_t *_jl_restore_incremental(ios_t *f, jl_array_t *mod_array)
for (int i = 0; i < ccallable_list.len; i++) {
jl_svec_t *item = (jl_svec_t*)ccallable_list.items[i];
JL_GC_PROMISE_ROOTED(item);
jl_compile_extern_c(NULL, NULL, NULL, jl_svecref(item, 0), jl_svecref(item, 1));
int success = jl_compile_extern_c(NULL, NULL, NULL, jl_svecref(item, 0), jl_svecref(item, 1));
if (!success)
jl_safe_printf("@ccallable was already defined for this method name\n");
}
arraylist_free(&ccallable_list);
jl_value_t *ret = (jl_value_t*)jl_svec(2, restored, init_order);
Expand Down
Loading