diff --git a/Make.inc b/Make.inc index 003f50db78376..b8b04c9332313 100644 --- a/Make.inc +++ b/Make.inc @@ -340,6 +340,11 @@ endif STDLIBCPP_FLAG := +ifeq ($(OS), FreeBSD) +USEGCC := 0 +USECLANG := 1 +endif + ifeq ($(OS), Darwin) DARWINVER := $(shell uname -r | cut -b 1-2) DARWINVER_GTE13 := $(shell expr `uname -r | cut -b 1-2` \>= 13) diff --git a/README.md b/README.md index d893f1b32c036..bf89ab33271bf 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ developers may find the notes in [CONTRIBUTING](https://github.com/JuliaLang/jul - **FreeBSD** - **Windows** -All systems are supported with both x86/64 (64-bit) and x86 (32-bit) architectures. Experimental and early support for [ARM](https://github.com/JuliaLang/julia/blob/master/README.arm.md) is available too. +All systems are supported with both x86/64 (64-bit) and x86 (32-bit) architectures. Experimental and early support for [ARM](https://github.com/JuliaLang/julia/blob/master/README.arm.md), AARCH64, and POWER (little-endian) is available too. ## Source Download and Compilation @@ -235,12 +235,22 @@ When building Julia, or its dependencies, libraries installed by third party pac ### FreeBSD -On *FreeBSD Release 9.0*, install the `gcc47`, `git`, and `gmake` packages/ports, and compile Julia with the command: +On *FreeBSD Release 11.0*, install the gfortran, git, cmake, and gmake packages/ports (`pkg install gcc6 gmake git cmake`), and compile Julia with the command: - $ gmake FC=gfortran47 + $ echo 'FC=gfortran6' >> Make.user + $ gmake You must use the `gmake` command on FreeBSD instead of `make`. +Note that Julia is community-supported and we have little control over our upstream dependencies, you may still run into issues with dependencies and YMMV. Current known issues include: + + - The x86 arch doesn't support threading due to lack of compiler runtime library support (set `JULIA_THREADS=0`). + - libunwind needs a small patch to its tests to compile. + - OpenBLAS patches in pkg haven't been upstreamed. + - gfortran can't link binaries. Set `FFLAGS=-Wl,-rpath,/usr/local/lib/gcc6` to work around this (upstream bug submitted to FreeBSD pkg maintainers). + - System libraries installed by pkg are not on the compiler path by default. You may need to add `LDFLAGS=/usr/local/lib` and `CPPFLAGS=/usr/local/include` to your environment or `Make.user` file to build successfully. + + ### Windows In order to build Julia on Windows, see [README.windows](https://github.com/JuliaLang/julia/blob/master/README.windows.md). diff --git a/deps/checksums/libuv-28743d6091531340cfe316de2b2d385fe1778ff5.tar.gz/md5 b/deps/checksums/libuv-28743d6091531340cfe316de2b2d385fe1778ff5.tar.gz/md5 deleted file mode 100644 index e42a20ffd5a35..0000000000000 --- a/deps/checksums/libuv-28743d6091531340cfe316de2b2d385fe1778ff5.tar.gz/md5 +++ /dev/null @@ -1 +0,0 @@ -cc07a8ef026fa42eeaddf7b6e074096e diff --git a/deps/checksums/libuv-28743d6091531340cfe316de2b2d385fe1778ff5.tar.gz/sha512 b/deps/checksums/libuv-28743d6091531340cfe316de2b2d385fe1778ff5.tar.gz/sha512 deleted file mode 100644 index bec2d8d44203f..0000000000000 --- a/deps/checksums/libuv-28743d6091531340cfe316de2b2d385fe1778ff5.tar.gz/sha512 +++ /dev/null @@ -1 +0,0 @@ -e128cec9548ff2f52a78743203d3f06dceef3cf7cbeb3a7a5f7453b132576833f82688eed52cf74c035f57828deac079cd845ad47c8cd6197a8e0bebf3586fc2 diff --git a/deps/checksums/libuv-8d5131b6c1595920dd30644cd1435b4f344b46c8.tar.gz/md5 b/deps/checksums/libuv-8d5131b6c1595920dd30644cd1435b4f344b46c8.tar.gz/md5 new file mode 100644 index 0000000000000..89795f7987bbc --- /dev/null +++ b/deps/checksums/libuv-8d5131b6c1595920dd30644cd1435b4f344b46c8.tar.gz/md5 @@ -0,0 +1 @@ +4c91d4c9161555c911630b0a70ddec03 diff --git a/deps/checksums/libuv-8d5131b6c1595920dd30644cd1435b4f344b46c8.tar.gz/sha512 b/deps/checksums/libuv-8d5131b6c1595920dd30644cd1435b4f344b46c8.tar.gz/sha512 new file mode 100644 index 0000000000000..faf62292a62af --- /dev/null +++ b/deps/checksums/libuv-8d5131b6c1595920dd30644cd1435b4f344b46c8.tar.gz/sha512 @@ -0,0 +1 @@ +c53513a5aea84405bf302b084a23f24f54148aac90a2bd666219ce14879723baab959942934d0d801a4572fffd07e60a7d574ade8d7eb57b6da8216063c20a48 diff --git a/deps/libgit2.mk b/deps/libgit2.mk index 0e530132f7732..f17bea8ff3345 100644 --- a/deps/libgit2.mk +++ b/deps/libgit2.mk @@ -47,9 +47,14 @@ ifeq ($(OS),Linux) $(BUILDDIR)/$(LIBGIT2_SRC_DIR)/Makefile: $(SRCDIR)/srccache/$(LIBGIT2_SRC_DIR)/libgit2-require-openssl.patch-applied $(SRCDIR)/srccache/$(LIBGIT2_SRC_DIR)/libgit2-openssl-hang.patch-applied endif ifneq ($(OS),WINNT) +ifeq ($(USE_SYSTEM_CURL), 0) $(BUILDDIR)/$(LIBGIT2_SRC_DIR)/Makefile: $(CURL_OBJ_TARGET) endif -$(BUILDDIR)/$(LIBGIT2_SRC_DIR)/Makefile: $(SRCDIR)/srccache/$(LIBGIT2_SRC_DIR)/CMakeLists.txt $(SRCDIR)/srccache/$(LIBGIT2_SRC_DIR)/libgit2-ssh.patch-applied $(SRCDIR)/srccache/$(LIBGIT2_SRC_DIR)/libgit2-agent-nonfatal.patch-applied $(LIBSSH2_OBJ_TARGET) +endif +ifeq ($(USE_SYSTEM_LIBSSH2), 0) +$(BUILDDIR)/$(LIBGIT2_SRC_DIR)/Makefile: $(LIBSSH2_OBJ_TARGET) +endif +$(BUILDDIR)/$(LIBGIT2_SRC_DIR)/Makefile: $(SRCDIR)/srccache/$(LIBGIT2_SRC_DIR)/CMakeLists.txt $(SRCDIR)/srccache/$(LIBGIT2_SRC_DIR)/libgit2-ssh.patch-applied $(SRCDIR)/srccache/$(LIBGIT2_SRC_DIR)/libgit2-agent-nonfatal.patch-applied mkdir -p $(dir $@) cd $(dir $@) && \ $(CMAKE) $(dir $<) $(LIBGIT2_OPTS) diff --git a/deps/libuv.version b/deps/libuv.version index 478ebca66589a..4ba4b36712aaf 100644 --- a/deps/libuv.version +++ b/deps/libuv.version @@ -1,2 +1,2 @@ LIBUV_BRANCH=julia-uv1.9.0 -LIBUV_SHA1=28743d6091531340cfe316de2b2d385fe1778ff5 +LIBUV_SHA1=8d5131b6c1595920dd30644cd1435b4f344b46c8 diff --git a/src/cgmemmgr.cpp b/src/cgmemmgr.cpp index 5c3b187ecab25..a85dfa57a227b 100644 --- a/src/cgmemmgr.cpp +++ b/src/cgmemmgr.cpp @@ -47,7 +47,7 @@ static void *map_anon_page(size_t size) mem = (char*)LLT_ALIGN(uintptr_t(mem), jl_page_size); #else // _OS_WINDOWS_ void *mem = mmap(nullptr, size, PROT_READ | PROT_WRITE, - MAP_NORESERVE | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); assert(mem != MAP_FAILED && "Cannot allocate RW memory"); #endif // _OS_WINDOWS_ return mem; diff --git a/src/flisp/Makefile b/src/flisp/Makefile index 5d7cf6fc51ccd..5de2aff8a4888 100644 --- a/src/flisp/Makefile +++ b/src/flisp/Makefile @@ -77,10 +77,10 @@ CCLD := $(LD) endif $(BUILDDIR)/$(EXENAME)-debug: $(DOBJS) $(LIBFILES_debug) $(BUILDDIR)/$(LIBTARGET)-debug.a $(BUILDDIR)/flmain.dbg.obj | $(BUILDDIR)/flisp.boot - @$(call PRINT_LINK, $(CCLD) $(DEBUGFLAGS) $(DOBJS) $(BUILDDIR)/flmain.dbg.obj -o $@ $(BUILDDIR)/$(LIBTARGET)-debug.a $(LIBFILES_debug) $(LIBS) $(OSLIBS)) + @$(call PRINT_LINK, $(CCLD) $(DEBUGFLAGS) $(LDFLAGS) $(DOBJS) $(BUILDDIR)/flmain.dbg.obj -o $@ $(BUILDDIR)/$(LIBTARGET)-debug.a $(LIBFILES_debug) $(LIBS) $(OSLIBS)) $(BUILDDIR)/$(EXENAME): $(OBJS) $(LIBFILES_release) $(BUILDDIR)/$(LIBTARGET).a $(BUILDDIR)/flmain.o | $(BUILDDIR)/flisp.boot - @$(call PRINT_LINK, $(CCLD) $(SHIPFLAGS) $(OBJS) $(BUILDDIR)/flmain.o -o $@ $(BUILDDIR)/$(LIBTARGET).a $(LIBFILES_release) $(LIBS) $(OSLIBS)) + @$(call PRINT_LINK, $(CCLD) $(SHIPFLAGS) $(LDFLAGS) $(OBJS) $(BUILDDIR)/flmain.o -o $@ $(BUILDDIR)/$(LIBTARGET).a $(LIBFILES_release) $(LIBS) $(OSLIBS)) ifneq ($(BUILDDIR),.) $(BUILDDIR)/flisp.boot: flisp.boot diff --git a/src/gc-pages.c b/src/gc-pages.c index ead16010cee15..fbe2b27450fe3 100644 --- a/src/gc-pages.c +++ b/src/gc-pages.c @@ -37,6 +37,10 @@ void jl_gc_init_page(void) #endif } +#ifndef MAP_NORESERVE // not defined in POSIX, FreeBSD, etc. +#define MAP_NORESERVE (0) +#endif + // Try to allocate a memory block for a region with `pg_cnt` pages. // Return `NULL` if allocation failed. Result is aligned to `GC_PAGE_SZ`. static char *jl_gc_try_alloc_region(int pg_cnt) diff --git a/src/gc.c b/src/gc.c index c95a9fbc62d59..44aa2d2133b91 100644 --- a/src/gc.c +++ b/src/gc.c @@ -618,7 +618,11 @@ JL_DLLEXPORT jl_value_t *jl_gc_big_alloc(jl_ptls_t ptls, size_t sz) bigval_t *v = (bigval_t*)malloc_cache_align(allocsz); if (v == NULL) jl_throw(jl_memory_exception); +#ifdef JULIA_ENABLE_THREADING jl_atomic_fetch_add(&gc_num.allocd, allocsz); +#else + gc_num.allocd += allocsz; +#endif gc_num.bigalloc++; #ifdef MEMDEBUG memset(v, 0xee, allocsz); @@ -1602,7 +1606,7 @@ static void post_mark(arraylist_t *list) } // collector entry point and control -static volatile uint64_t jl_gc_disable_counter = 0; +static volatile uint32_t jl_gc_disable_counter = 0; JL_DLLEXPORT int jl_gc_enable(int on) { @@ -2094,7 +2098,7 @@ void *jl_gc_perm_alloc_nolock(size_t sz) pool = (void*)LLT_ALIGN((uintptr_t)pool, JL_SMALL_BYTE_ALIGNMENT); #else void *pool = mmap(0, GC_PERM_POOL_SIZE, PROT_READ | PROT_WRITE, - MAP_NORESERVE | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (__unlikely(pool == MAP_FAILED)) return NULL; #endif diff --git a/src/julia_threads.h b/src/julia_threads.h index e18eb7283e1d4..5302fa88c31d6 100644 --- a/src/julia_threads.h +++ b/src/julia_threads.h @@ -159,7 +159,7 @@ static inline unsigned long JL_CONST_FUNC jl_thread_self(void) * 2. (most importantly) we need interoperability between code written * in different languages. * The current c++ standard (c++14) does not allow using c11 atomic - * functions or types and there's currently no grantee that the two + * functions or types and there's currently no guarantee that the two * types are compatible (although most of them probably are). * We also need to access these atomic variables from the LLVM JIT code * which is very hard unless the layout of the object is fully diff --git a/src/safepoint.c b/src/safepoint.c index 6644f32b63c61..2874266ebe4b5 100644 --- a/src/safepoint.c +++ b/src/safepoint.c @@ -93,7 +93,7 @@ void jl_safepoint_init(void) char *addr = (char*)VirtualAlloc(NULL, pgsz * 3, MEM_COMMIT, PAGE_READONLY); #else char *addr = (char*)mmap(0, pgsz * 3, PROT_READ, - MAP_NORESERVE | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (addr == MAP_FAILED) addr = NULL; #endif diff --git a/src/signals-unix.c b/src/signals-unix.c index 9bf9bdb01f734..f9cea3354e1cb 100644 --- a/src/signals-unix.c +++ b/src/signals-unix.c @@ -84,12 +84,24 @@ static void jl_call_in_ctx(jl_ptls_t ptls, void (*fptr)(void), void *_ctx) *(void**)rsp = NULL; ctx->uc_mcontext.gregs[REG_RSP] = rsp; ctx->uc_mcontext.gregs[REG_RIP] = (uintptr_t)fptr; +#elif defined(_OS_FREEBSD_) && defined(_CPU_X86_64_) + ucontext_t *ctx = (ucontext_t*)_ctx; + rsp -= sizeof(void*); + *(void**)rsp = NULL; + ctx->uc_mcontext.mc_rsp = rsp; + ctx->uc_mcontext.mc_rip = (uintptr_t)fptr; #elif defined(_OS_LINUX_) && defined(_CPU_X86_) ucontext_t *ctx = (ucontext_t*)_ctx; rsp -= sizeof(void*); *(void**)rsp = NULL; ctx->uc_mcontext.gregs[REG_ESP] = rsp; ctx->uc_mcontext.gregs[REG_EIP] = (uintptr_t)fptr; +#elif defined(_OS_FREEBSD_) && defined(_CPU_X86_) + ucontext_t *ctx = (ucontext_t*)_ctx; + rsp -= sizeof(void*); + *(void**)rsp = NULL; + ctx->uc_mcontext.mc_esp = rsp; + ctx->uc_mcontext.mc_eip = (uintptr_t)fptr; #elif defined(_OS_LINUX_) && defined(_CPU_AARCH64_) ucontext_t *ctx = (ucontext_t*)_ctx; ctx->uc_mcontext.sp = rsp; @@ -112,7 +124,8 @@ static void jl_call_in_ctx(jl_ptls_t ptls, void (*fptr)(void), void *_ctx) ctx->uc_mcontext64->__ss.__rsp = rsp; ctx->uc_mcontext64->__ss.__rip = (uintptr_t)fptr; #else - // TODO Add support for FreeBSD and PowerPC(64)? +#warning "julia: throw-in-context not supported on this platform" + // TODO Add support for PowerPC(64)? fptr(); #endif } @@ -436,7 +449,7 @@ static void *alloc_sigstack(size_t size) // Add one guard page to catch stack overflow in the signal handler size = LLT_ALIGN(size, pagesz) + pagesz; void *stackbuff = mmap(0, size, PROT_READ | PROT_WRITE, - MAP_NORESERVE | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (stackbuff == MAP_FAILED) jl_errorf("fatal error allocating signal stack: mmap: %s", strerror(errno)); diff --git a/src/task.c b/src/task.c index 105e80d34d579..81b9b564211ce 100644 --- a/src/task.c +++ b/src/task.c @@ -359,7 +359,7 @@ static void ctx_switch(jl_ptls_t ptls, jl_task_t *t, jl_jmp_buf *where) " push %%ebp;\n" // instead of ESP " jmp %P1;\n" // call `start_task` with fake stack frame " ud2" - : : "r" (stackbase), ""(&start_task) : "memory" ); + : : "r" (stackbase), "X"(&start_task) : "memory" ); #elif defined(_CPU_AARCH64_) asm(" mov sp, %0;\n" " mov x29, xzr;\n" // Clear link register (x29) and frame pointer