diff --git a/Make.inc b/Make.inc index 80ee08a3fae1d..4382393ab21dd 100644 --- a/Make.inc +++ b/Make.inc @@ -459,6 +459,7 @@ USEGCC := 0 USECLANG := 0 USEICC := 0 else +USEMSVC := 0 ifeq ($(USECLANG), 1) USEGCC := 0 USEICC := 0 @@ -522,7 +523,7 @@ ifneq ($(OS), WINNT) # Do not enable on windows to avoid warnings from libuv. JCXXFLAGS += -pedantic endif -DEBUGFLAGS := -O0 -ggdb2 -DJL_DEBUG_BUILD -fstack-protector-all +DEBUGFLAGS := -O0 -ggdb2 -DJL_DEBUG_BUILD -fstack-protector SHIPFLAGS := -O3 -ggdb2 -falign-functions endif @@ -533,7 +534,7 @@ JCFLAGS := -std=gnu99 -pipe $(fPIC) -fno-strict-aliasing -D_FILE_OFFSET_BITS=64 # AArch64 needs this flag to generate the .eh_frame used by libunwind JCPPFLAGS := -fasynchronous-unwind-tables JCXXFLAGS := -pipe $(fPIC) -fno-rtti -pedantic -DEBUGFLAGS := -O0 -g -DJL_DEBUG_BUILD -fstack-protector-all +DEBUGFLAGS := -O0 -g -DJL_DEBUG_BUILD -fstack-protector SHIPFLAGS := -O3 -g ifeq ($(OS), Darwin) ifeq ($(MACOSX_VERSION_MIN),) @@ -557,7 +558,7 @@ CXX := icpc JCFLAGS := -std=gnu11 -pipe $(fPIC) -fno-strict-aliasing -D_FILE_OFFSET_BITS=64 -fp-model precise -fp-model except -no-ftz JCPPFLAGS := JCXXFLAGS := -pipe $(fPIC) -fno-rtti -DEBUGFLAGS := -O0 -g -DJL_DEBUG_BUILD -fstack-protector-all +DEBUGFLAGS := -O0 -g -DJL_DEBUG_BUILD -fstack-protector SHIPFLAGS := -O3 -g -falign-functions endif @@ -623,6 +624,24 @@ else SHLIB_EXT := so endif +ifeq ($(SHLIB_EXT), so) +define SONAME_FLAGS + -Wl,-soname=$1 +endef +else +define SONAME_FLAGS +endef +endif + +ifeq ($(OS)$(USEMSVC),WINNT0) +define IMPLIB_FLAGS + -Wl,--out-implib,$(build_libdir)/$(notdir $1).a +endef +else +define IMPLIB_FLAGS +endef +endif + # On Windows, we want shared library files to end up in $(build_bindir), instead of $(build_libdir) # We also don't really have a private bindir on windows right now, due to lack of RPATH. ifeq ($(OS),WINNT) @@ -1507,11 +1526,11 @@ define dep_lib_path $$($(PYTHON) $(call python_cygpath,$(JULIAHOME)/contrib/relative_path.py) $(1) $(2)) endef -LIBJULIA_BUILD_DEPLIB := $(call dep_lib_path,$(build_bindir),$(build_shlibdir)/libjulia.$(JL_MAJOR_MINOR_SHLIB_EXT)) -LIBJULIA_INSTALL_DEPLIB := $(call dep_lib_path,$(bindir),$(shlibdir)/libjulia.$(JL_MAJOR_MINOR_SHLIB_EXT)) +LIBJULIAINTERNAL_BUILD_DEPLIB := $(call dep_lib_path,$(build_libdir),$(build_shlibdir)/libjulia-internal.$(JL_MAJOR_MINOR_SHLIB_EXT)) +LIBJULIAINTERNAL_INSTALL_DEPLIB := $(call dep_lib_path,$(libdir),$(private_shlibdir)/libjulia-internal.$(JL_MAJOR_MINOR_SHLIB_EXT)) -LIBJULIA_DEBUG_BUILD_DEPLIB := $(call dep_lib_path,$(build_bindir),$(build_shlibdir)/libjulia-debug.$(JL_MAJOR_MINOR_SHLIB_EXT)) -LIBJULIA_DEBUG_INSTALL_DEPLIB := $(call dep_lib_path,$(bindir),$(shlibdir)/libjulia-debug.$(JL_MAJOR_MINOR_SHLIB_EXT)) +LIBJULIAINTERNAL_DEBUG_BUILD_DEPLIB := $(call dep_lib_path,$(build_libdir),$(build_shlibdir)/libjulia-internal-debug.$(JL_MAJOR_MINOR_SHLIB_EXT)) +LIBJULIAINTERNAL_DEBUG_INSTALL_DEPLIB := $(call dep_lib_path,$(libdir),$(private_shlibdir)/libjulia-internal-debug.$(JL_MAJOR_MINOR_SHLIB_EXT)) ifeq ($(OS),WINNT) ifeq ($(BINARY),32) @@ -1532,16 +1551,16 @@ LIBGCC_NAME := libgcc_s.$(SHLIB_EXT).1 endif -LIBGCC_BUILD_DEPLIB := $(call dep_lib_path,$(build_bindir),$(build_shlibdir)/$(LIBGCC_NAME)) -LIBGCC_INSTALL_DEPLIB := $(call dep_lib_path,$(bindir),$(private_shlibdir)/$(LIBGCC_NAME)) +LIBGCC_BUILD_DEPLIB := $(call dep_lib_path,$(build_libdir),$(build_shlibdir)/$(LIBGCC_NAME)) +LIBGCC_INSTALL_DEPLIB := $(call dep_lib_path,$(libdir),$(private_shlibdir)/$(LIBGCC_NAME)) # USE_SYSTEM_LIBM causes it to get symlinked into build_private_shlibdir ifeq ($(USE_SYSTEM_LIBM),1) -LIBM_BUILD_DEPLIB := $(call dep_lib_path,$(build_bindir),$(build_private_shlibdir)/$(LIBMNAME).$(SHLIB_EXT)) +LIBM_BUILD_DEPLIB := $(call dep_lib_path,$(build_libdir),$(build_private_shlibdir)/$(LIBMNAME).$(SHLIB_EXT)) else -LIBM_BUILD_DEPLIB := $(call dep_lib_path,$(build_bindir),$(build_shlibdir)/$(LIBMNAME).$(SHLIB_EXT)) +LIBM_BUILD_DEPLIB := $(call dep_lib_path,$(build_libdir),$(build_shlibdir)/$(LIBMNAME).$(SHLIB_EXT)) endif -LIBM_INSTALL_DEPLIB := $(call dep_lib_path,$(bindir),$(private_shlibdir)/$(LIBMNAME).$(SHLIB_EXT)) +LIBM_INSTALL_DEPLIB := $(call dep_lib_path,$(libdir),$(private_shlibdir)/$(LIBMNAME).$(SHLIB_EXT)) # We list: # * libgcc_s, because FreeBSD needs to load ours, not the system one. @@ -1552,10 +1571,10 @@ LIBM_INSTALL_DEPLIB := $(call dep_lib_path,$(bindir),$(private_shlibdir)/$(LIBMN # * debug builds must link against libjuliadebug, not libjulia # * install time relative paths are not equal to build time relative paths (../lib vs. ../lib/julia) # That second point will no longer be true for most deps once they are placed within Artifacts directories. -LOADER_BUILD_DEP_LIBS = $(LIBGCC_BUILD_DEPLIB):$(LIBM_BUILD_DEPLIB):$(LIBJULIA_BUILD_DEPLIB) -LOADER_DEBUG_BUILD_DEP_LIBS = $(LIBGCC_BUILD_DEPLIB):$(LIBM_BUILD_DEPLIB):$(LIBJULIA_DEBUG_BUILD_DEPLIB) -LOADER_INSTALL_DEP_LIBS = $(LIBGCC_INSTALL_DEPLIB):$(LIBM_INSTALL_DEPLIB):$(LIBJULIA_INSTALL_DEPLIB) -LOADER_DEBUG_INSTALL_DEP_LIBS = $(LIBGCC_INSTALL_DEPLIB):$(LIBM_INSTALL_DEPLIB):$(LIBJULIA_DEBUG_INSTALL_DEPLIB) +LOADER_BUILD_DEP_LIBS = $(LIBGCC_BUILD_DEPLIB):$(LIBM_BUILD_DEPLIB):$(LIBJULIAINTERNAL_BUILD_DEPLIB) +LOADER_DEBUG_BUILD_DEP_LIBS = $(LIBGCC_BUILD_DEPLIB):$(LIBM_BUILD_DEPLIB):$(LIBJULIAINTERNAL_DEBUG_BUILD_DEPLIB) +LOADER_INSTALL_DEP_LIBS = $(LIBGCC_INSTALL_DEPLIB):$(LIBM_INSTALL_DEPLIB):$(LIBJULIAINTERNAL_INSTALL_DEPLIB) +LOADER_DEBUG_INSTALL_DEP_LIBS = $(LIBGCC_INSTALL_DEPLIB):$(LIBM_INSTALL_DEPLIB):$(LIBJULIAINTERNAL_DEBUG_INSTALL_DEPLIB) # Colors for make ifndef VERBOSE diff --git a/Makefile b/Makefile index 4f8076ee69be4..6ff2e042719bc 100644 --- a/Makefile +++ b/Makefile @@ -72,16 +72,16 @@ julia-libccalltest: julia-deps julia-libllvmcalltest: julia-deps @$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT)/src libllvmcalltest -julia-src-release julia-src-debug : julia-src-% : julia-deps julia_flisp.boot.inc.phony - @$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT)/src libjulia-$* +julia-src-release julia-src-debug : julia-src-% : julia-deps julia_flisp.boot.inc.phony julia-cli-% + @$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT)/src $* -julia-cli-release julia-cli-debug : julia-cli-% : julia-src-% - @$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT)/cli julia-$* +julia-cli-release julia-cli-debug: julia-cli-% : + @$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT)/cli $* -julia-sysimg-ji : julia-stdlib julia-base julia-cli-$(JULIA_BUILD_MODE) | $(build_private_libdir) +julia-sysimg-ji : julia-stdlib julia-base julia-cli-$(JULIA_BUILD_MODE) julia-src-$(JULIA_BUILD_MODE) | $(build_private_libdir) @$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT) -f sysimage.mk sysimg-ji JULIA_EXECUTABLE='$(JULIA_EXECUTABLE)' -julia-sysimg-bc : julia-stdlib julia-base julia-cli-$(JULIA_BUILD_MODE) | $(build_private_libdir) +julia-sysimg-bc : julia-stdlib julia-base julia-cli-$(JULIA_BUILD_MODE) julia-src-$(JULIA_BUILD_MODE) | $(build_private_libdir) @$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT) -f sysimage.mk sysimg-bc JULIA_EXECUTABLE='$(JULIA_EXECUTABLE)' julia-sysimg-release julia-sysimg-debug : julia-sysimg-% : julia-sysimg-ji julia-cli-% @@ -155,13 +155,16 @@ julia-base-cache: julia-sysimg-$(JULIA_BUILD_MODE) | $(DIRS) $(build_datarootdir $(call cygpath_w,$(build_datarootdir)/julia/base.cache)) # public libraries, that are installed in $(prefix)/lib -JL_TARGETS := julia julialoader +JL_TARGETS := julia ifeq ($(BUNDLE_DEBUG_LIBS),1) -JL_TARGETS += julia-debug julialoader-debug +JL_TARGETS += julia-debug endif # private libraries, that are installed in $(prefix)/lib/julia -JL_PRIVATE_LIBS-0 := libccalltest libllvmcalltest +JL_PRIVATE_LIBS-0 := libccalltest libllvmcalltest libjulia-internal +ifeq ($(BUNDLE_DEBUG_LIBS),1) +JL_TARGETS += libjulia-internal-debug +endif ifeq ($(USE_GPL_LIBS), 1) JL_PRIVATE_LIBS-0 += libsuitesparse_wrapper JL_PRIVATE_LIBS-$(USE_SYSTEM_SUITESPARSE) += libamd libbtf libcamd libccolamd libcholmod libcolamd libklu libldl librbio libspqr libsuitesparseconfig libumfpack @@ -356,13 +359,11 @@ endif endif ifneq ($(LOADER_BUILD_DEP_LIBS),$(LOADER_INSTALL_DEP_LIBS)) - # Next, overwrite relative path to libjulia in our loaders if $(LOADER_BUILD_DEP_LIBS) != $(LOADER_INSTALL_DEP_LIBS) - $(call stringreplace,$(DESTDIR)$(bindir)/julia,$(LOADER_BUILD_DEP_LIBS)$$,$(LOADER_INSTALL_DEP_LIBS)) - $(call stringreplace,$(DESTDIR)$(shlibdir)/libjulialoader.$(JL_MAJOR_MINOR_SHLIB_EXT),$(LOADER_BUILD_DEP_LIBS)$$,$(LOADER_INSTALL_DEP_LIBS)) + # Next, overwrite relative path to libjulia-internal in our loader if $(LOADER_BUILD_DEP_LIBS) != $(LOADER_INSTALL_DEP_LIBS) + $(call stringreplace,$(DESTDIR)$(shlibdir)/libjulia.$(JL_MAJOR_MINOR_SHLIB_EXT),$(LOADER_BUILD_DEP_LIBS)$$,$(LOADER_INSTALL_DEP_LIBS)) ifeq ($(BUNDLE_DEBUG_LIBS),1) - $(call stringreplace,$(DESTDIR)$(bindir)/julia-debug,$(LOADER_DEBUG_BUILD_DEP_LIBS)$$,$(LOADER_DEBUG_INSTALL_DEP_LIBS)) - $(call stringreplace,$(DESTDIR)$(shlibdir)/libjulialoader-debug.$(JL_MAJOR_MINOR_SHLIB_EXT),$(LOADER_DEBUG_BUILD_DEP_LIBS)$$,$(LOADER_DEBUG_INSTALL_DEP_LIBS)) + $(call stringreplace,$(DESTDIR)$(shlibdir)/libjulia-debug.$(JL_MAJOR_MINOR_SHLIB_EXT),$(LOADER_DEBUG_BUILD_DEP_LIBS)$$,$(LOADER_DEBUG_INSTALL_DEP_LIBS)) endif endif diff --git a/cli/Makefile b/cli/Makefile index 39cabecf1be81..f28e4207a6d74 100644 --- a/cli/Makefile +++ b/cli/Makefile @@ -6,11 +6,10 @@ include $(JULIAHOME)/Make.inc include $(JULIAHOME)/deps/llvm-ver.make -HEADERS := $(addprefix $(JULIAHOME)/src/,julia.h julia_assert.h julia_threads.h julia_internal.h options.h) \ - $(BUILDDIR)/../src/julia_version.h $(wildcard $(JULIAHOME)/src/support/*.h) $(LIBUV_INC)/uv.h +HEADERS := jl_exports.h loader.h $(addprefix $(JULIAHOME)/src/support/,platform.h dirpath.h) $(addprefix $(JULIAHOME)/src/,jl_exported_data.inc jl_exported_funcs.inc) LOADER_CFLAGS = $(JCFLAGS) -I$(BUILDROOT)/src -I$(JULIAHOME)/src -I$(JULIAHOME)/src/support -I$(build_includedir) -ffreestanding -LOADER_LDFLAGS = $(JLDFLAGS) -ffreestanding +LOADER_LDFLAGS = $(JLDFLAGS) -ffreestanding -L$(build_shlibdir) -L$(build_libdir) ifeq ($(OS),WINNT) LOADER_CFLAGS += -municode -mconsole -nostdlib -fno-stack-check -fno-stack-protector -mno-stack-arg-probe @@ -31,20 +30,35 @@ endif SHIPFLAGS += -DDEP_LIBS="\"$(LOADER_BUILD_DEP_LIBS)\"" DEBUGFLAGS += -DDEP_LIBS="\"$(LOADER_DEBUG_BUILD_DEP_LIBS)\"" -SRCS := loader_exe loader_lib -OBJS := $(SRCS:%=$(BUILDDIR)/%.o) -DOBJS := $(SRCS:%=$(BUILDDIR)/%.dbg.obj) +EXE_OBJS := $(BUILDDIR)/loader_exe.o +EXE_DOBJS := $(BUILDDIR)/loader_exe.dbg.obj LIB_OBJS := $(BUILDDIR)/loader_lib.o LIB_DOBJS := $(BUILDDIR)/loader_lib.dbg.obj +# If this is an architecture that supports dynamic linking, link in a trampoline definition +ifneq (,$(wildcard $(SRCDIR)/trampolines/trampolines_$(ARCH).S)) +LIB_OBJS += $(BUILDDIR)/loader_trampolines.o +LIB_DOBJS += $(BUILDDIR)/loader_trampolines.o +endif + default: release all: release debug -release debug : % : julia-% +release debug : % : julia-% libjulia-% -$(BUILDDIR)/%.o: $(SRCDIR)/%.c $(HEADERS) +$(BUILDDIR)/loader_lib.o : $(SRCDIR)/loader_lib.c $(HEADERS) + @$(call PRINT_CC, $(CC) -DLIBRARY_EXPORTS $(SHIPFLAGS) $(LOADER_CFLAGS) -c $< -o $@) +$(BUILDDIR)/loader_lib.dbg.obj : $(SRCDIR)/loader_lib.c $(HEADERS) + @$(call PRINT_CC, $(CC) -DLIBRARY_EXPORTS $(DEBUGFLAGS) $(LOADER_CFLAGS) -c $< -o $@) +$(BUILDDIR)/loader_exe.o : $(SRCDIR)/loader_exe.c $(HEADERS) @$(call PRINT_CC, $(CC) $(SHIPFLAGS) $(LOADER_CFLAGS) -c $< -o $@) -$(BUILDDIR)/%.dbg.obj: $(SRCDIR)/%.c $(HEADERS) +$(BUILDDIR)/loader_exe.dbg.obj : $(SRCDIR)/loader_exe.c $(HEADERS) @$(call PRINT_CC, $(CC) $(DEBUGFLAGS) $(LOADER_CFLAGS) -c $< -o $@) +$(BUILDDIR)/loader_trampolines.o : $(SRCDIR)/trampolines/trampolines_$(ARCH).S + @$(call PRINT_CC, $(CC) $(DEBUGFLAGS) $(LOADER_CFLAGS) $< -c -o $@) + +DIRS = $(build_bindir) $(build_libdir) +$(DIRS): + @mkdir -p $@ ifeq ($(OS),WINNT) ifneq ($(USEMSVC), 1) @@ -54,14 +68,11 @@ $(BUILDDIR)/julia_res.o: $(JULIAHOME)/contrib/windows/julia.rc $(JULIAHOME)/VERS '/^(\d+)\.?(\d*)\.?(\d*)/ && \ print int $$1,",",int $$2,",0,",int $$3'` && \ $(CROSS_COMPILE)windres $< -O coff -o $@ -DJLVER=$$JLVERi -DJLVER_STR=\\\"$$JLVER\\\" -OBJS += julia_res.o -DOBJS += julia_res.o +EXE_OBJS += $(BUILDDIR)/julia_res.o +EXE_DOBJS += $(BUILDDIR)/julia_res.o endif endif -julia-release: $(build_bindir)/julia$(EXE) $(build_shlibdir)/libjulialoader.$(JL_MAJOR_MINOR_SHLIB_EXT) -julia-debug: $(build_bindir)/julia-debug$(EXE) $(build_shlibdir)/libjulialoader-debug.$(JL_MAJOR_MINOR_SHLIB_EXT) - # Embed an Info.plist in the julia executable # Create an intermediate target Info.plist for Darwin code signing. ifeq ($(DARWIN_FRAMEWORK),1) @@ -78,30 +89,58 @@ $(build_bindir)/julia$(EXE): $(BUILDDIR)/Info.plist $(build_bindir)/julia-debug$(EXE): $(BUILDDIR)/Info.plist endif -$(build_shlibdir)/libjulialoader.$(JL_MAJOR_MINOR_SHLIB_EXT): $(LIB_OBJS) - @$(call PRINT_LINK, $(CC) $(LOADER_CFLAGS) -shared $(SHIPFLAGS) $^ -o $@ $(LOADER_LDFLAGS) $(RPATH_LIB)) -ifneq ($(OS), WINNT) - @ln -sf $(notdir $@) $(build_shlibdir)/libjulialoader.$(JL_MAJOR_SHLIB_EXT) - @ln -sf $(notdir $@) $(build_shlibdir)/libjulialoader.$(SHLIB_EXT) -endif +julia-release: $(build_bindir)/julia$(EXE) +julia-debug: $(build_bindir)/julia-debug$(EXE) +libjulia-release: $(build_shlibdir)/libjulia.$(JL_MAJOR_MINOR_SHLIB_EXT) +libjulia-debug: $(build_shlibdir)/libjulia-debug.$(JL_MAJOR_MINOR_SHLIB_EXT) +ifeq ($(OS),WINNT) +# On Windows we need to strip out exported functions from the generated import library. +# On i686, there's an extra underscore at the beginning +ifeq ($(ARCH),i686) +ABI_UNDERSCORE := _\#\# +else +ABI_UNDERSCORE := +endif +EXPORTED_FUNCS := $(shell echo -e "#include \"jl_exported_funcs.inc\"\n#define XX(x) $(ABI_UNDERSCORE)x\nJL_EXPORTED_FUNCS(XX)" | $(CPP) -I$(JULIAHOME)/src - | tail -n 1) +STRIP_EXPORTED_FUNCS := $(patsubst %,--strip-symbol=%,$(EXPORTED_FUNCS)) + +# Note that if the objcopy command starts getting too long, we can use `@file` to read +# command-line options from `file` instead. +define strip_implib + $(OBJCOPY) $(1).a $(STRIP_EXPORTED_FUNCS) $(1).a.stripped + mv $(1).a.stripped $(1).a +endef +endif -$(build_shlibdir)/libjulialoader-debug.$(JL_MAJOR_MINOR_SHLIB_EXT): $(LIB_DOBJS) - @$(call PRINT_LINK, $(CC) $(LOADER_CFLAGS) -shared $(DEBUGFLAGS) $^ -o $@ $(LOADER_LDFLAGS) $(RPATH_LIB)) +$(build_shlibdir)/libjulia.$(JL_MAJOR_MINOR_SHLIB_EXT): $(LIB_OBJS) | $(build_shlibdir) $(build_libdir) + @$(call PRINT_LINK, $(CC) $(call IMPLIB_FLAGS,$@) $(LOADER_CFLAGS) -DLIBRARY_EXPORTS -shared $(SHIPFLAGS) $(LIB_OBJS) -o $@ $(LOADER_LDFLAGS) $(RPATH_LIB)) $(call SONAME_FLAGS,$(notdir $@)) + $(INSTALL_NAME_CMD)libjulia.$(SHLIB_EXT) $@ ifneq ($(OS), WINNT) - @ln -sf $(notdir $@) $(build_shlibdir)/libjulialoader-debug.$(JL_MAJOR_SHLIB_EXT) - @ln -sf $(notdir $@) $(build_shlibdir)/libjulialoader-debug.$(SHLIB_EXT) + @ln -sf $(notdir $@) $(build_shlibdir)/libjulia.$(JL_MAJOR_SHLIB_EXT) + @ln -sf $(notdir $@) $(build_shlibdir)/libjulia.$(SHLIB_EXT) +else + $(call strip_implib,$(build_libdir)/libjulia.$(SHLIB_EXT)) endif -$(build_bindir)/julia$(EXE): $(OBJS) - @$(call PRINT_LINK, $(CC) $(LOADER_CFLAGS) $(SHIPFLAGS) $^ -o $@ $(LOADER_LDFLAGS) $(RPATH)) +$(build_shlibdir)/libjulia-debug.$(JL_MAJOR_MINOR_SHLIB_EXT): $(LIB_DOBJS) | $(build_shlibdir) $(build_libdir) + @$(call PRINT_LINK, $(CC) $(call IMPLIB_FLAGS,$@) $(LOADER_CFLAGS) -DLIBRARY_EXPORTS -shared $(DEBUGFLAGS) $(LIB_DOBJS) -o $@ $(LOADER_LDFLAGS) $(RPATH_LIB)) $(call SONAME_FLAGS,$(notdir $@)) + $(INSTALL_NAME_CMD)libjulia-debug.$(SHLIB_EXT) $@ +ifneq ($(OS), WINNT) + @ln -sf $(notdir $@) $(build_shlibdir)/libjulia-debug.$(JL_MAJOR_SHLIB_EXT) + @ln -sf $(notdir $@) $(build_shlibdir)/libjulia-debug.$(SHLIB_EXT) +else + $(call strip_implib,$(build_libdir)/libjulia-debug.$(SHLIB_EXT)) +endif -$(build_bindir)/julia-debug$(EXE): $(DOBJS) - @$(call PRINT_LINK, $(CC) $(LOADER_CFLAGS) $(DEBUGFLAGS) $^ -o $@ $(LOADER_LDFLAGS) $(RPATH)) +$(build_bindir)/julia$(EXE): $(EXE_OBJS) $(build_shlibdir)/libjulia.$(JL_MAJOR_MINOR_SHLIB_EXT) | $(build_bindir) + @$(call PRINT_LINK, $(CC) $(LOADER_CFLAGS) $(SHIPFLAGS) $(EXE_OBJS) -o $@ $(LOADER_LDFLAGS) $(RPATH) -ljulia) +$(build_bindir)/julia-debug$(EXE): $(EXE_DOBJS) $(build_shlibdir)/libjulia-debug.$(JL_MAJOR_MINOR_SHLIB_EXT) | $(build_bindir) + @$(call PRINT_LINK, $(CC) $(LOADER_CFLAGS) $(DEBUGFLAGS) $(EXE_DOBJS) -o $@ $(LOADER_LDFLAGS) $(RPATH) -ljulia-debug) clean: | $(CLEAN_TARGETS) - rm -f *.o *.dbg.obj + rm -f $(BUILDDIR)/*.o $(BUILDDIR)/*.dbg.obj rm -f $(build_bindir)/julia* .PHONY: clean release debug julia-release julia-debug diff --git a/cli/jl_exports.h b/cli/jl_exports.h new file mode 100644 index 0000000000000..ecbe81041f5ac --- /dev/null +++ b/cli/jl_exports.h @@ -0,0 +1,31 @@ +// This file is a part of Julia. License is MIT: https://julialang.org/license +// Bring in the curated lists of exported data and function symbols, then +// perform C preprocessor magic upon them to generate lists of declarations and +// functions to re-export our function symbols from libjulia-internal to libjulia. +#include "../src/jl_exported_data.inc" +#include "../src/jl_exported_funcs.inc" + +// Define data symbols as `const void * $(name);` +#define XX(name) JL_DLLEXPORT const void * name; +JL_EXPORTED_DATA(XX) +#undef XX + +// Define holder locations for function addresses as `const void * $(name)_addr` +#define XX(name) JL_HIDDEN const void * name##_addr; +JL_EXPORTED_FUNCS(XX) +#undef XX + +// Generate lists of function names and addresses +#define XX(name) #name, +static const char *const jl_exported_func_names[] = { + JL_EXPORTED_FUNCS(XX) + NULL +}; +#undef XX + +#define XX(name) &name##_addr, +static const void ** jl_exported_func_addrs[] = { + JL_EXPORTED_FUNCS(XX) + NULL +}; +#undef XX diff --git a/cli/loader.h b/cli/loader.h index 42b777a623077..5b1c10abc9998 100644 --- a/cli/loader.h +++ b/cli/loader.h @@ -1,3 +1,5 @@ +// This file is a part of Julia. License is MIT: https://julialang.org/license + /* Bring in definitions for `_OS_X_`, `PATH_MAX` and `PATHSEPSTRING`, `jl_ptls_t`, etc... */ #include "../src/support/platform.h" #include "../src/support/dirpath.h" @@ -30,12 +32,13 @@ #include #include #endif + +#define _GNU_SOURCE // Need this for `dladdr()` #include #include #include #include #include - #include #include #endif @@ -49,12 +52,52 @@ # define JL_CONST_FUNC #endif +// Borrow definition from `support/dtypes.h` +#ifdef _OS_WINDOWS_ +# ifdef LIBRARY_EXPORTS +# define JL_DLLEXPORT __declspec(dllexport) +# else +# define JL_DLLEXPORT __declspec(dllimport) +# endif +#define JL_HIDDEN +#else +# if defined(LIBRARY_EXPORTS) && defined(_OS_LINUX) +# define JL_DLLEXPORT __attribute__ ((visibility("protected"))) +# else +# define JL_DLLEXPORT __attribute__ ((visibility("default"))) +# endif +#define JL_HIDDEN __attribute__ ((visibility("hidden"))) +#endif +#ifdef JL_DEBUG_BUILD +#define JL_NAKED __attribute__ ((naked,no_stack_protector)) +#else +#define JL_NAKED __attribute__ ((naked)) +#endif + +/* + * DEP_LIBS is our list of dependent libraries that must be loaded before `libjulia`. + * Note that order matters, as each entry will be opened in-order. We define here a + * dummy value just so this file compiles on its own, and also so that developers can + * see what this value should look like. Note that the last entry must always be + * `libjulia`, and that all paths should be relative to this loader library path. + */ +#if !defined(DEP_LIBS) +#define DEP_LIBS "../lib/example.so:../lib/libjulia.so" +#endif + +// We need to dlopen() ourselves in order to introspect the libdir. +#if defined(JL_DEBUG_BUILD) +#define LIBJULIA_NAME "libjulia-debug" +#else +#define LIBJULIA_NAME "libjulia" +#endif + // Declarations from `loader_lib.c` and `loader_win_utils.c` -extern const char * get_exe_dir(); -extern int load_repl(const char *, int, char **); -void print_stderr(const char * msg); -void print_stderr3(const char * msg1, const char * msg2, const char * msg3); +JL_DLLEXPORT extern int jl_load_repl(int, char **); +JL_DLLEXPORT void jl_loader_print_stderr(const char * msg); +void jl_loader_print_stderr3(const char * msg1, const char * msg2, const char * msg3); +static void * lookup_symbol(const void * lib_handle, const char * symbol_name); #ifdef _OS_WINDOWS_ LPWSTR *CommandLineToArgv(LPWSTR lpCmdLine, int *pNumArgs); diff --git a/cli/loader_exe.c b/cli/loader_exe.c index 74d8a150dc639..e0cfdd93fbee7 100644 --- a/cli/loader_exe.c +++ b/cli/loader_exe.c @@ -1,12 +1,19 @@ +// This file is a part of Julia. License is MIT: https://julialang.org/license +// This defines a bare-bones loader that opens `libjulia` and immediately invokes its `load_repl()` function. #include "loader.h" #ifdef __cplusplus extern "C" { #endif +/* Bring in helper functions for windows without libgcc. */ +#ifdef _OS_WINDOWS_ +#include "loader_win_utils.c" +#endif + /* Define ptls getter, as this cannot be defined within a shared library. */ #if !defined(_OS_WINDOWS_) && !defined(_OS_DARWIN_) -__attribute__ ((visibility("default"))) JL_CONST_FUNC void * jl_get_ptls_states_static(void) +JL_DLLEXPORT JL_CONST_FUNC void * jl_get_ptls_states_static(void) { /* Because we can't #include in this file, we define a TLS state object with * hopefully enough room; at last check, the `jl_tls_states_t` struct was <16KB. */ @@ -26,16 +33,14 @@ int mainCRTStartup(void) int main(int argc, char * argv[]) { #endif - // Immediately get the current exe dir, allowing us to calculate relative paths. - const char * exe_dir = get_exe_dir(); -#ifdef _OS_WINDOWS_ // Convert Windows wchar_t values to UTF8 +#ifdef _OS_WINDOWS_ for (int i=0; i if [ -z "$1" ]; then - echo "Usage: $0 " + echo "Usage: $0 " exit 1 fi -libdir="$1" -private_libdir="$2" +private_libdir="$1" -if [ ! -f "$libdir/libjulia.so" ]; then - echo "ERROR: Could not open $libdir/libjulia.so" >&2 +if [ ! -f "$private_libdir/libjulia-internal.so" ]; then + echo "ERROR: Could not open $libdir/libjulia-internal.so" >&2 exit 2 fi @@ -24,7 +23,7 @@ find_shlib () } # Discover libstdc++ location and name -LIBSTD=$(find_shlib "$libdir/libjulia.so" "libstdc++.so") +LIBSTD=$(find_shlib "$private_libdir/libjulia-internal.so" "libstdc++.so") LIBSTD_NAME=$(basename $LIBSTD) LIBSTD_DIR=$(dirname $LIBSTD) diff --git a/doc/src/devdocs/init.md b/doc/src/devdocs/init.md index 18cd9e0b8e26d..24d0874c196a4 100644 --- a/doc/src/devdocs/init.md +++ b/doc/src/devdocs/init.md @@ -5,7 +5,7 @@ How does the Julia runtime execute `julia -e 'println("Hello World!")'` ? ## `main()` Execution starts at [`main()` in `cli/loader_exe.c`](https://github.com/JuliaLang/julia/blob/master/cli/loader_exe.c), -which calls `load_repl()` in [`cli/loader_lib.c`](https://github.com/JuliaLang/julia/blob/master/cli/loader_lib.c) +which calls `jl_load_repl()` in [`cli/loader_lib.c`](https://github.com/JuliaLang/julia/blob/master/cli/loader_lib.c) which loads a few libraries, eventually calling [`repl_entrypoint()` in `src/jlapi.c`](https://github.com/JuliaLang/julia/blob/master/src/jlapi.c). `repl_entrypoint()` calls [`libsupport_init()`](https://github.com/JuliaLang/julia/blob/master/src/support/libsupportinit.c) diff --git a/doc/src/devdocs/llvm.md b/doc/src/devdocs/llvm.md index 8f265cc287464..454cb0333443c 100644 --- a/doc/src/devdocs/llvm.md +++ b/doc/src/devdocs/llvm.md @@ -79,7 +79,7 @@ environment. In addition, it exposes the `-julia` meta-pass, which runs the entire Julia pass-pipeline over the IR. As an example, to generate a system image, one could do: ``` -opt -load libjulia.so -julia -o opt.bc unopt.bc +opt -load libjulia-internal.so -julia -o opt.bc unopt.bc llc -o sys.o opt.bc cc -shared -o sys.so sys.o ``` diff --git a/src/Makefile b/src/Makefile index dab649c352923..60b0aa1529ba0 100644 --- a/src/Makefile +++ b/src/Makefile @@ -120,10 +120,10 @@ ifeq ($(OS), Darwin) CLANG_LDFLAGS += -Wl,-undefined,dynamic_lookup endif - -COMMON_LIBS := -L$(build_shlibdir) -L$(build_libdir) $(LIBUV) $(LIBUTF8PROC) $(NO_WHOLE_ARCHIVE) $(LIBUNWIND) $(LLVMLINK) $(OSLIBS) -DEBUG_LIBS := $(WHOLE_ARCHIVE) $(BUILDDIR)/flisp/libflisp-debug.a $(WHOLE_ARCHIVE) $(BUILDDIR)/support/libsupport-debug.a $(COMMON_LIBS) -RELEASE_LIBS := $(WHOLE_ARCHIVE) $(BUILDDIR)/flisp/libflisp.a $(WHOLE_ARCHIVE) $(BUILDDIR)/support/libsupport.a $(COMMON_LIBS) +COMMON_LIBPATHS := -L$(build_libdir) -L$(build_shlibdir) +COMMON_LIBS := $(LIBUV) $(LIBUTF8PROC) $(NO_WHOLE_ARCHIVE) $(LIBUNWIND) $(LLVMLINK) $(OSLIBS) +DEBUG_LIBS := $(COMMON_LIBPATHS) $(WHOLE_ARCHIVE) $(BUILDDIR)/flisp/libflisp-debug.a $(WHOLE_ARCHIVE) $(BUILDDIR)/support/libsupport-debug.a -ljulia-debug $(COMMON_LIBS) +RELEASE_LIBS := $(COMMON_LIBPATHS) $(WHOLE_ARCHIVE) $(BUILDDIR)/flisp/libflisp.a $(WHOLE_ARCHIVE) $(BUILDDIR)/support/libsupport.a -ljulia $(COMMON_LIBS) OBJS := $(SRCS:%=$(BUILDDIR)/%.o) DOBJS := $(SRCS:%=$(BUILDDIR)/%.dbg.obj) @@ -150,7 +150,7 @@ endif default: $(JULIA_BUILD_MODE) # contains either "debug" or "release" all: debug release -release debug: %: libjulia-% +release debug: %: libjulia-internal-% $(BUILDDIR): mkdir -p $(BUILDDIR) @@ -286,52 +286,41 @@ $(BUILDDIR)/julia_version.h: $(JULIAHOME)/VERSION ifneq ($(USEMSVC), 1) CXXLD = $(CXX) -shared -ifeq ($(OS),WINNT) -CXXLD += -Wl,--out-implib,$(build_libdir)/$(notdir $@).a -endif else CXXLD = $(LD) -dll -export:jl_setjmp -export:jl_longjmp endif -ifeq ($(SHLIB_EXT), so) - SONAME := -Wl,-soname=libjulia.$(JL_MAJOR_SHLIB_EXT) - SONAME_DEBUG := -Wl,-soname=libjulia-debug.$(JL_MAJOR_SHLIB_EXT) -else - SONAME := - SONAME_DEBUG := -endif - -$(build_shlibdir)/libjulia-debug.$(JL_MAJOR_MINOR_SHLIB_EXT): $(SRCDIR)/julia.expmap $(DOBJS) $(BUILDDIR)/flisp/libflisp-debug.a $(BUILDDIR)/support/libsupport-debug.a $(LIBUV) - @$(call PRINT_LINK, $(CXXLD) $(JCXXFLAGS) $(CXXLDFLAGS) $(DEBUGFLAGS) $(DOBJS) $(RPATH_LIB) -o $@ $(JLDFLAGS) $(JLIBLDFLAGS) $(DEBUG_LIBS) $(SONAME_DEBUG)) - $(INSTALL_NAME_CMD)libjulia-debug.$(SHLIB_EXT) $@ +$(build_shlibdir)/libjulia-internal-debug.$(JL_MAJOR_MINOR_SHLIB_EXT): $(SRCDIR)/julia.expmap $(DOBJS) $(BUILDDIR)/flisp/libflisp-debug.a $(BUILDDIR)/support/libsupport-debug.a $(LIBUV) + @$(call PRINT_LINK, $(CXXLD) $(call IMPLIB_FLAGS,$@) $(JCXXFLAGS) $(CXXLDFLAGS) $(DEBUGFLAGS) $(DOBJS) $(RPATH_LIB) -o $@ $(JLDFLAGS) $(JLIBLDFLAGS) $(DEBUG_LIBS) $(call SONAME_FLAGS,$(notdir $@))) + $(INSTALL_NAME_CMD)libjulia-internal-debug.$(SHLIB_EXT) $@ ifneq ($(OS), WINNT) - @ln -sf libjulia-debug.$(JL_MAJOR_MINOR_SHLIB_EXT) $(build_shlibdir)/libjulia-debug.$(JL_MAJOR_SHLIB_EXT) - @ln -sf libjulia-debug.$(JL_MAJOR_MINOR_SHLIB_EXT) $(build_shlibdir)/libjulia-debug.$(SHLIB_EXT) + @ln -sf libjulia-internal-debug.$(JL_MAJOR_MINOR_SHLIB_EXT) $(build_shlibdir)/libjulia-internal-debug.$(JL_MAJOR_SHLIB_EXT) + @ln -sf libjulia-internal-debug.$(JL_MAJOR_MINOR_SHLIB_EXT) $(build_shlibdir)/libjulia-internal-debug.$(SHLIB_EXT) endif $(DSYMUTIL) $@ -$(BUILDDIR)/libjulia-debug.a: $(SRCDIR)/julia.expmap $(DOBJS) $(BUILDDIR)/flisp/libflisp-debug.a $(BUILDDIR)/support/libsupport-debug.a +$(BUILDDIR)/libjulia-internal-debug.a: $(SRCDIR)/julia.expmap $(DOBJS) $(BUILDDIR)/flisp/libflisp-debug.a $(BUILDDIR)/support/libsupport-debug.a rm -f $@ @$(call PRINT_LINK, ar -rcs $@ $(DOBJS)) -libjulia-debug: $(build_shlibdir)/libjulia-debug.$(JL_MAJOR_MINOR_SHLIB_EXT) $(PUBLIC_HEADER_TARGETS) +libjulia-internal-debug: $(build_shlibdir)/libjulia-internal-debug.$(JL_MAJOR_MINOR_SHLIB_EXT) $(PUBLIC_HEADER_TARGETS) -$(build_shlibdir)/libjulia.$(JL_MAJOR_MINOR_SHLIB_EXT): $(SRCDIR)/julia.expmap $(OBJS) $(BUILDDIR)/flisp/libflisp.a $(BUILDDIR)/support/libsupport.a $(LIBUV) - @$(call PRINT_LINK, $(CXXLD) $(JCXXFLAGS) $(CXXLDFLAGS) $(SHIPFLAGS) $(OBJS) $(RPATH_LIB) -o $@ $(JLDFLAGS) $(JLIBLDFLAGS) $(RELEASE_LIBS) $(SONAME)) - $(INSTALL_NAME_CMD)libjulia.$(SHLIB_EXT) $@ +$(build_shlibdir)/libjulia-internal.$(JL_MAJOR_MINOR_SHLIB_EXT): $(SRCDIR)/julia.expmap $(OBJS) $(BUILDDIR)/flisp/libflisp.a $(BUILDDIR)/support/libsupport.a $(LIBUV) + @$(call PRINT_LINK, $(CXXLD) $(call IMPLIB_FLAGS,$@) $(JCXXFLAGS) $(CXXLDFLAGS) $(SHIPFLAGS) $(OBJS) $(RPATH_LIB) -o $@ $(JLDFLAGS) $(JLIBLDFLAGS) $(RELEASE_LIBS) $(call SONAME_FLAGS,$(notdir $@))) + $(INSTALL_NAME_CMD)libjulia-internal.$(SHLIB_EXT) $@ ifneq ($(OS), WINNT) - @ln -sf libjulia.$(JL_MAJOR_MINOR_SHLIB_EXT) $(build_shlibdir)/libjulia.$(JL_MAJOR_SHLIB_EXT) - @ln -sf libjulia.$(JL_MAJOR_MINOR_SHLIB_EXT) $(build_shlibdir)/libjulia.$(SHLIB_EXT) + @ln -sf libjulia-internal.$(JL_MAJOR_MINOR_SHLIB_EXT) $(build_shlibdir)/libjulia-internal.$(JL_MAJOR_SHLIB_EXT) + @ln -sf libjulia-internal.$(JL_MAJOR_MINOR_SHLIB_EXT) $(build_shlibdir)/libjulia-internal.$(SHLIB_EXT) endif $(DSYMUTIL) $@ -$(BUILDDIR)/libjulia.a: julia.expmap $(OBJS) $(BUILDDIR)/flisp/libflisp.a $(BUILDDIR)/support/libsupport.a +$(BUILDDIR)/libjulia-internal.a: $(SRCDIR)/julia.expmap $(OBJS) $(BUILDDIR)/flisp/libflisp.a $(BUILDDIR)/support/libsupport.a rm -f $@ @$(call PRINT_LINK, ar -rcs $@ $(OBJS)) -libjulia-release: $(build_shlibdir)/libjulia.$(JL_MAJOR_MINOR_SHLIB_EXT) $(PUBLIC_HEADER_TARGETS) +libjulia-internal-release: $(build_shlibdir)/libjulia-internal.$(JL_MAJOR_MINOR_SHLIB_EXT) $(PUBLIC_HEADER_TARGETS) clean: - -rm -fr $(build_shlibdir)/libjulia* $(build_shlibdir)/libccalltest* $(build_shlibdir)/libllvmcalltest* + -rm -fr $(build_shlibdir)/libjulia-internal* $(build_shlibdir)/libccalltest* $(build_shlibdir)/libllvmcalltest* -rm -f $(BUILDDIR)/julia_flisp.boot $(BUILDDIR)/julia_flisp.boot.inc -rm -f $(BUILDDIR)/*.dbg.obj $(BUILDDIR)/*.o $(BUILDDIR)/*.dwo $(BUILDDIR)/*.$(SHLIB_EXT) $(BUILDDIR)/*.a -rm -f $(BUILDDIR)/julia_version.h diff --git a/src/ast.c b/src/ast.c index 944e6602cd4d1..90a953098223d 100644 --- a/src/ast.c +++ b/src/ast.c @@ -32,7 +32,7 @@ jl_sym_t *empty_sym; jl_sym_t *top_sym; jl_sym_t *module_sym; jl_sym_t *slot_sym; jl_sym_t *export_sym; jl_sym_t *import_sym; jl_sym_t *toplevel_sym; jl_sym_t *quote_sym; -jl_sym_t *line_sym; jl_sym_t *jl_incomplete_sym; +jl_sym_t *line_sym; jl_sym_t *incomplete_sym; jl_sym_t *goto_sym; jl_sym_t *goto_ifnot_sym; jl_sym_t *return_sym; jl_sym_t *lineinfo_sym; jl_sym_t *lambda_sym; jl_sym_t *assign_sym; @@ -341,7 +341,7 @@ void jl_init_common_symbols(void) globalref_sym = jl_symbol("globalref"); line_sym = jl_symbol("line"); lineinfo_sym = jl_symbol("lineinfo"); - jl_incomplete_sym = jl_symbol("incomplete"); + incomplete_sym = jl_symbol("incomplete"); error_sym = jl_symbol("error"); goto_sym = jl_symbol("goto"); goto_ifnot_sym = jl_symbol("gotoifnot"); diff --git a/src/gf.c b/src/gf.c index d639637105891..eb4bdb3b314d5 100644 --- a/src/gf.c +++ b/src/gf.c @@ -69,12 +69,8 @@ void jl_call_tracer(tracer_cb callback, jl_value_t *tracee) /// ----- Definitions for various internal TypeMaps ----- /// -static const struct jl_typemap_info method_defs = { - 1, &jl_method_type -}; -static const struct jl_typemap_info lambda_cache = { - 0, &jl_method_instance_type -}; +static struct jl_typemap_info method_defs = {1}; +static struct jl_typemap_info lambda_cache = {1}; static int8_t jl_cachearg_offset(jl_methtable_t *mt) { diff --git a/src/jl_exported_data.inc b/src/jl_exported_data.inc new file mode 100644 index 0000000000000..d36b1e67440ba --- /dev/null +++ b/src/jl_exported_data.inc @@ -0,0 +1,118 @@ +#define JL_EXPORTED_DATA(XX) \ + XX(jl_abstractarray_type) \ + XX(jl_abstractslot_type) \ + XX(jl_abstractstring_type) \ + XX(jl_an_empty_string) \ + XX(jl_an_empty_vec_any) \ + XX(jl_any_type) \ + XX(jl_anytuple_type) \ + XX(jl_anytuple_type_type) \ + XX(jl_argument_type) \ + XX(jl_argumenterror_type) \ + XX(jl_array_any_type) \ + XX(jl_array_int32_type) \ + XX(jl_array_symbol_type) \ + XX(jl_array_type) \ + XX(jl_array_typename) \ + XX(jl_array_uint8_type) \ + XX(jl_base_module) \ + XX(jl_bool_type) \ + XX(jl_bottom_type) \ + XX(jl_boundserror_type) \ + XX(jl_builtin_type) \ + XX(jl_char_type) \ + XX(jl_code_info_type) \ + XX(jl_code_instance_type) \ + XX(jl_core_module) \ + XX(jl_const_type) \ + XX(jl_datatype_type) \ + XX(jl_densearray_type) \ + XX(jl_diverror_exception) \ + XX(jl_emptysvec) \ + XX(jl_emptytuple) \ + XX(jl_emptytuple_type) \ + XX(jl_errorexception_type) \ + XX(jl_expr_type) \ + XX(jl_false) \ + XX(jl_float16_type) \ + XX(jl_float32_type) \ + XX(jl_float64_type) \ + XX(jl_floatingpoint_type) \ + XX(jl_function_type) \ + XX(jl_globalref_type) \ + XX(jl_gotoifnot_type) \ + XX(jl_gotonode_type) \ + XX(jl_initerror_type) \ + XX(jl_int16_type) \ + XX(jl_int32_type) \ + XX(jl_int64_type) \ + XX(jl_int8_type) \ + XX(jl_interrupt_exception) \ + XX(jl_intrinsic_type) \ + XX(jl_lineinfonode_type) \ + XX(jl_linenumbernode_type) \ + XX(jl_llvmpointer_type) \ + XX(jl_llvmpointer_typename) \ + XX(jl_loaderror_type) \ + XX(jl_main_module) \ + XX(jl_memory_exception) \ + XX(jl_method_instance_type) \ + XX(jl_method_match_type) \ + XX(jl_method_type) \ + XX(jl_methoderror_type) \ + XX(jl_methtable_type) \ + XX(jl_module_type) \ + XX(jl_namedtuple_type) \ + XX(jl_namedtuple_typename) \ + XX(jl_newvarnode_type) \ + XX(jl_nonfunction_mt) \ + XX(jl_nothing) \ + XX(jl_nothing_type) \ + XX(jl_number_type) \ + XX(jl_partial_struct_type) \ + XX(jl_phicnode_type) \ + XX(jl_phinode_type) \ + XX(jl_pinode_type) \ + XX(jl_pointer_type) \ + XX(jl_pointer_typename) \ + XX(jl_quotenode_type) \ + XX(jl_readonlymemory_exception) \ + XX(jl_ref_type) \ + XX(jl_returnnode_type) \ + XX(jl_signed_type) \ + XX(jl_simplevector_type) \ + XX(jl_slotnumber_type) \ + XX(jl_ssavalue_type) \ + XX(jl_stackovf_exception) \ + XX(jl_string_type) \ + XX(jl_symbol_type) \ + XX(jl_task_type) \ + XX(jl_top_module) \ + XX(jl_true) \ + XX(jl_tuple_typename) \ + XX(jl_tvar_type) \ + XX(jl_type_type) \ + XX(jl_type_type_mt) \ + XX(jl_type_typename) \ + XX(jl_typedslot_type) \ + XX(jl_typeerror_type) \ + XX(jl_typemap_entry_type) \ + XX(jl_typemap_level_type) \ + XX(jl_typename_type) \ + XX(jl_typeofbottom_type) \ + XX(jl_uint16_type) \ + XX(jl_uint32_type) \ + XX(jl_uint64_type) \ + XX(jl_uint8_type) \ + XX(jl_uint8pointer_type) \ + XX(jl_undefref_exception) \ + XX(jl_undefvarerror_type) \ + XX(jl_unionall_type) \ + XX(jl_uniontype_type) \ + XX(jl_upsilonnode_type) \ + XX(jl_vararg_type) \ + XX(jl_vararg_typename) \ + XX(jl_vecelement_typename) \ + XX(jl_void_type) \ + XX(jl_voidpointer_type) \ + XX(jl_weakref_type) diff --git a/src/jl_exported_funcs.inc b/src/jl_exported_funcs.inc new file mode 100644 index 0000000000000..d12e8794f5ce4 --- /dev/null +++ b/src/jl_exported_funcs.inc @@ -0,0 +1,760 @@ +#define JL_EXPORTED_FUNCS(XX) \ + XX(jl_) \ + XX(jl_abs_float) \ + XX(jl_abs_float_withtype) \ + XX(jl_active_task_stack) \ + XX(jl_add_float) \ + XX(jl_add_int) \ + XX(jl_add_optimization_passes) \ + XX(jl_add_ptr) \ + XX(jl_add_standard_imports) \ + XX(jl_alignment) \ + XX(jl_alloc_array_1d) \ + XX(jl_alloc_array_2d) \ + XX(jl_alloc_array_3d) \ + XX(jl_alloc_string) \ + XX(jl_alloc_svec) \ + XX(jl_alloc_svec_uninit) \ + XX(jl_alloc_vec_any) \ + XX(jl_and_int) \ + XX(jl_apply_array_type) \ + XX(jl_apply_generic) \ + XX(jl_apply_tuple_type) \ + XX(jl_apply_tuple_type_v) \ + XX(jl_apply_type) \ + XX(jl_apply_type1) \ + XX(jl_apply_type2) \ + XX(jl_argument_datatype) \ + XX(jl_argument_method_table) \ + XX(jl_array_cconvert_cstring) \ + XX(jl_array_copy) \ + XX(jl_array_data_owner) \ + XX(jl_array_del_at) \ + XX(jl_array_del_beg) \ + XX(jl_array_del_end) \ + XX(jl_array_eltype) \ + XX(jl_array_grow_at) \ + XX(jl_array_grow_beg) \ + XX(jl_array_grow_end) \ + XX(jl_array_isassigned) \ + XX(jl_arraylen) \ + XX(jl_array_ptr) \ + XX(jl_array_ptr_1d_append) \ + XX(jl_array_ptr_1d_push) \ + XX(jl_array_ptr_copy) \ + XX(jl_array_rank) \ + XX(jl_arrayref) \ + XX(jl_arrayset) \ + XX(jl_array_size) \ + XX(jl_array_sizehint) \ + XX(jl_array_to_string) \ + XX(jl_array_typetagdata) \ + XX(jl_arrayunset) \ + XX(jl_ashr_int) \ + XX(jl_astaggedvalue) \ + XX(jl_atexit_hook) \ + XX(jl_backtrace_from_here) \ + XX(jl_base_relative_to) \ + XX(jl_binding_owner) \ + XX(jl_binding_resolved_p) \ + XX(jl_bitcast) \ + XX(jl_boundp) \ + XX(jl_bounds_error) \ + XX(jl_bounds_error_int) \ + XX(jl_bounds_error_ints) \ + XX(jl_bounds_error_tuple_int) \ + XX(jl_bounds_error_unboxed_int) \ + XX(jl_bounds_error_v) \ + XX(jl_box_bool) \ + XX(jl_box_char) \ + XX(jl_box_float32) \ + XX(jl_box_float64) \ + XX(jl_box_int16) \ + XX(jl_box_int32) \ + XX(jl_box_int64) \ + XX(jl_box_int8) \ + XX(jl_box_slotnumber) \ + XX(jl_box_ssavalue) \ + XX(jl_box_uint16) \ + XX(jl_box_uint32) \ + XX(jl_box_uint64) \ + XX(jl_box_uint8) \ + XX(jl_box_uint8pointer) \ + XX(jl_box_voidpointer) \ + XX(jl_breakpoint) \ + XX(jl_bswap_int) \ + XX(jl_call) \ + XX(jl_call0) \ + XX(jl_call1) \ + XX(jl_call2) \ + XX(jl_call3) \ + XX(jl_call_in_typeinf_world) \ + XX(jl_calloc) \ + XX(jl_capture_interp_frame) \ + XX(jl_ceil_llvm) \ + XX(jl_ceil_llvm_withtype) \ + XX(jl_cglobal) \ + XX(jl_cglobal_auto) \ + XX(jl_checked_assignment) \ + XX(jl_checked_sadd_int) \ + XX(jl_checked_sdiv_int) \ + XX(jl_checked_smul_int) \ + XX(jl_checked_srem_int) \ + XX(jl_checked_ssub_int) \ + XX(jl_checked_uadd_int) \ + XX(jl_checked_udiv_int) \ + XX(jl_checked_umul_int) \ + XX(jl_checked_urem_int) \ + XX(jl_checked_usub_int) \ + XX(jl_clear_implicit_imports) \ + XX(jl_clear_malloc_data) \ + XX(jl_clock_now) \ + XX(jl_close_uv) \ + XX(jl_code_for_staged) \ + XX(jl_compile_extern_c) \ + XX(jl_compile_hint) \ + XX(jl_compress_argnames) \ + XX(jl_compress_ir) \ + XX(jl_compute_fieldtypes) \ + XX(jl_copy_ast) \ + XX(jl_copy_code_info) \ + XX(jl_copysign_float) \ + XX(jl_cpuid) \ + XX(jl_cpuidex) \ + XX(jl_cpu_pause) \ + XX(jl_cpu_threads) \ + XX(jl_cpu_wake) \ + XX(jl_crc32c_sw) \ + XX(jl_create_native) \ + XX(jl_create_system_image) \ + XX(jl_cstr_to_string) \ + XX(jl_ctlz_int) \ + XX(jl_ctpop_int) \ + XX(jl_cttz_int) \ + XX(jl_current_exception) \ + XX(jl_debug_method_invalidation) \ + XX(jl_declare_constant) \ + XX(jl_defines_or_exports_p) \ + XX(jl_deprecate_binding) \ + XX(jl_div_float) \ + XX(jl_dlclose) \ + XX(jl_dlopen) \ + XX(jl_dlsym) \ + XX(jl_dump_compiles) \ + XX(jl_dump_fptr_asm) \ + XX(jl_dump_function_ir) \ + XX(jl_dump_host_cpu) \ + XX(jl_dump_llvm_asm) \ + XX(jl_dump_method_asm) \ + XX(jl_egal) \ + XX(jl_eh_restore_state) \ + XX(jl_enqueue_task) \ + XX(jl_enter_handler) \ + XX(jl_enter_threaded_region) \ + XX(jl_environ) \ + XX(jl_eof_error) \ + XX(jl_eq_float) \ + XX(jl_eq_int) \ + XX(jl_eqtable_get) \ + XX(jl_eqtable_nextind) \ + XX(jl_eqtable_pop) \ + XX(jl_eqtable_put) \ + XX(jl_errno) \ + XX(jl_error) \ + XX(jl_errorf) \ + XX(jl_eval_string) \ + XX(jl_exception_clear) \ + XX(jl_exceptionf) \ + XX(jl_exception_occurred) \ + XX(jl_excstack_state) \ + XX(jl_exit) \ + XX(jl_exit_on_sigint) \ + XX(jl_exit_threaded_region) \ + XX(jl_expand) \ + XX(jl_expand_and_resolve) \ + XX(jl_expand_stmt) \ + XX(jl_expand_stmt_with_loc) \ + XX(jl_expand_with_loc) \ + XX(jl_expand_with_loc_warn) \ + XX(jl_extern_c) \ + XX(jl_f__abstracttype) \ + XX(jl_f_applicable) \ + XX(jl_f__apply) \ + XX(jl_f__apply_in_world) \ + XX(jl_f__apply_iterate) \ + XX(jl_f__apply_latest) \ + XX(jl_f__apply_pure) \ + XX(jl_f_apply_type) \ + XX(jl_f_arrayref) \ + XX(jl_f_arrayset) \ + XX(jl_f_arraysize) \ + XX(jl_f_const_arrayref) \ + XX(jl_f__equiv_typedef) \ + XX(jl_f__expr) \ + XX(jl_f_fieldtype) \ + XX(jl_f_getfield) \ + XX(jl_field_index) \ + XX(jl_field_isdefined) \ + XX(jl_f_ifelse) \ + XX(jl_finalize) \ + XX(jl_finalize_th) \ + XX(jl_find_free_typevars) \ + XX(jl_f_intrinsic_call) \ + XX(jl_f_invoke) \ + XX(jl_f_invoke_kwsorter) \ + XX(jl_first_argument_datatype) \ + XX(jl_f_is) \ + XX(jl_f_isa) \ + XX(jl_f_isdefined) \ + XX(jl_f_issubtype) \ + XX(jl_flipsign_int) \ + XX(jl_floor_llvm) \ + XX(jl_floor_llvm_withtype) \ + XX(jl_fl_parse) \ + XX(jl_flush_cstdio) \ + XX(jl_fma_float) \ + XX(jl_f_new_module) \ + XX(jl_f_nfields) \ + XX(jl_forceclose_uv) \ + XX(jl_format_filename) \ + XX(jl_fpext) \ + XX(jl_fpiseq) \ + XX(jl_fpislt) \ + XX(jl_f__primitivetype) \ + XX(jl_fptosi) \ + XX(jl_fptoui) \ + XX(jl_fptr_args) \ + XX(jl_fptr_const_return) \ + XX(jl_fptr_interpret_call) \ + XX(jl_fptr_sparam) \ + XX(jl_fptrunc) \ + XX(jl_free) \ + XX(jl_free_stack) \ + XX(jl_fs_access) \ + XX(jl_fs_chmod) \ + XX(jl_fs_chown) \ + XX(jl_fs_close) \ + XX(jl_f_setfield) \ + XX(jl_f__setsuper) \ + XX(jl_f_sizeof) \ + XX(jl_fs_read) \ + XX(jl_fs_read_byte) \ + XX(jl_fs_rename) \ + XX(jl_fs_sendfile) \ + XX(jl_fs_symlink) \ + XX(jl_fstat) \ + XX(jl_f__structtype) \ + XX(jl_fs_unlink) \ + XX(jl_f_svec) \ + XX(jl_fs_write) \ + XX(jl_f_throw) \ + XX(jl_ftruncate) \ + XX(jl_f_tuple) \ + XX(jl_f_typeassert) \ + XX(jl_f__typebody) \ + XX(jl_f_typeof) \ + XX(jl_f__typevar) \ + XX(jl_gc_add_finalizer) \ + XX(jl_gc_add_finalizer_th) \ + XX(jl_gc_add_ptr_finalizer) \ + XX(jl_gc_alloc) \ + XX(jl_gc_alloc_0w) \ + XX(jl_gc_alloc_1w) \ + XX(jl_gc_alloc_2w) \ + XX(jl_gc_alloc_3w) \ + XX(jl_gc_allocobj) \ + XX(jl_gc_alloc_typed) \ + XX(jl_gc_big_alloc) \ + XX(jl_gc_collect) \ + XX(jl_gc_conservative_gc_support_enabled) \ + XX(jl_gc_counted_calloc) \ + XX(jl_gc_counted_free_with_size) \ + XX(jl_gc_counted_malloc) \ + XX(jl_gc_counted_realloc_with_old_size) \ + XX(jl_gc_diff_total_bytes) \ + XX(jl_gc_enable) \ + XX(jl_gc_enable_conservative_gc_support) \ + XX(jl_gc_enable_finalizers) \ + XX(jl_gc_external_obj_hdr_size) \ + XX(jl_gc_find_taggedvalue_pool) \ + XX(jl_gc_get_total_bytes) \ + XX(jl_gc_internal_obj_base_ptr) \ + XX(jl_gc_is_enabled) \ + XX(jl_gc_live_bytes) \ + XX(jl_gc_managed_malloc) \ + XX(jl_gc_managed_realloc) \ + XX(jl_gc_mark_queue_obj) \ + XX(jl_gc_mark_queue_objarray) \ + XX(jl_gc_max_internal_obj_size) \ + XX(jl_gc_new_weakref) \ + XX(jl_gc_new_weakref_th) \ + XX(jl_gc_num) \ + XX(jl_gc_pool_alloc) \ + XX(jl_gc_queue_multiroot) \ + XX(jl_gc_queue_root) \ + XX(jl_gc_safe_enter) \ + XX(jl_gc_safe_leave) \ + XX(jl_gc_safepoint) \ + XX(jl_gc_schedule_foreign_sweepfunc) \ + XX(jl_gc_set_cb_notify_external_alloc) \ + XX(jl_gc_set_cb_notify_external_free) \ + XX(jl_gc_set_cb_post_gc) \ + XX(jl_gc_set_cb_pre_gc) \ + XX(jl_gc_set_cb_root_scanner) \ + XX(jl_gc_set_cb_task_scanner) \ + XX(jl_gc_sync_total_bytes) \ + XX(jl_gc_total_hrtime) \ + XX(jl_gc_unsafe_enter) \ + XX(jl_gc_unsafe_leave) \ + XX(jl_gdblookup) \ + XX(jl_generating_output) \ + XX(jl_generic_function_def) \ + XX(jl_gensym) \ + XX(jl_getaddrinfo) \ + XX(jl_getallocationgranularity) \ + XX(jl_get_ARCH) \ + XX(jl_get_backtrace) \ + XX(jl_get_binding) \ + XX(jl_get_binding_for_method_def) \ + XX(jl_get_binding_or_error) \ + XX(jl_get_binding_wr) \ + XX(jl_get_cfunction_trampoline) \ + XX(jl_get_cpu_name) \ + XX(jl_get_current_task) \ + XX(jl_get_default_sysimg_path) \ + XX(jl_get_excstack) \ + XX(jl_get_fenv_consts) \ + XX(jl_get_field) \ + XX(jl_get_field_offset) \ + XX(jl_get_fieldtypes) \ + XX(jl_get_function_id) \ + XX(jl_get_global) \ + XX(jl_get_image_file) \ + XX(jl_get_JIT) \ + XX(jl_get_julia_bin) \ + XX(jl_get_julia_bindir) \ + XX(jl_get_keyword_sorter) \ + XX(jl_get_kwsorter) \ + XX(jl_get_llvm_context) \ + XX(jl_get_llvmf_defn) \ + XX(jl_get_llvm_function) \ + XX(jl_get_llvm_module) \ + XX(jl_get_LLVM_VERSION) \ + XX(jl_get_method_inferred) \ + XX(jl_get_module_binding) \ + XX(jl_get_module_compile) \ + XX(jl_get_module_infer) \ + XX(jl_get_module_of_binding) \ + XX(jl_get_module_optlevel) \ + XX(jl_getnameinfo) \ + XX(jl_get_next_task) \ + XX(jl_get_nth_field) \ + XX(jl_get_nth_field_checked) \ + XX(jl_get_nth_field_noalloc) \ + XX(jl_getpagesize) \ + XX(jl_getpid) \ + XX(jl_get_ptls_states) \ + XX(jl_get_root_symbol) \ + XX(jl_get_safe_restore) \ + XX(jl_get_size) \ + XX(jl_get_task_tid) \ + XX(jl_gettimeofday) \ + XX(jl_get_tls_world_age) \ + XX(jl_get_UNAME) \ + XX(jl_get_world_counter) \ + XX(jl_get_zero_subnormals) \ + XX(jl_gf_invoke_lookup) \ + XX(jl_gf_invoke_lookup_worlds) \ + XX(jl_git_branch) \ + XX(jl_git_commit) \ + XX(jl_global_event_loop) \ + XX(jl_has_empty_intersection) \ + XX(jl_has_free_typevars) \ + XX(jl_has_so_reuseport) \ + XX(jl_has_typevar) \ + XX(jl_has_typevar_from_unionall) \ + XX(jl_hrtime) \ + XX(jl_id_char) \ + XX(jl_id_start_char) \ + XX(jl_idtable_rehash) \ + XX(jl_infer_thunk) \ + XX(jl_init_restored_modules) \ + XX(jl_init__threading) \ + XX(jl_init_with_image__threading) \ + XX(jl_install_sigint_handler) \ + XX(jl_instantiate_type_in_env) \ + XX(jl_instantiate_unionall) \ + XX(jl_intersect_types) \ + XX(jl_in_threaded_region) \ + XX(jl_intrinsic_name) \ + XX(jl_invoke) \ + XX(jl_invoke_api) \ + XX(jl_iolock_begin) \ + XX(jl_iolock_end) \ + XX(jl_ios_buffer_n) \ + XX(jl_ios_fd) \ + XX(jl_ios_get_nbyte_int) \ + XX(jl_ir_flag_inferred) \ + XX(jl_ir_flag_inlineable) \ + XX(jl_ir_flag_pure) \ + XX(jl_ir_nslots) \ + XX(jl_ir_slotflag) \ + XX(jl_isa) \ + XX(jl_isa_compileable_sig) \ + XX(jl_is_binding_deprecated) \ + XX(jl_is_char_signed) \ + XX(jl_is_const) \ + XX(jl_is_debugbuild) \ + XX(jl_is_identifier) \ + XX(jl_is_imported) \ + XX(jl_is_initialized) \ + XX(jl_is_in_pure_context) \ + XX(jl_islayout_inline) \ + XX(jl_is_memdebug) \ + XX(jl_is_not_broken_subtype) \ + XX(jl_is_operator) \ + XX(jl_is_task_started) \ + XX(jl_istopmod) \ + XX(jl_is_unary_and_binary_operator) \ + XX(jl_is_unary_operator) \ + XX(jl_lazy_load_and_lookup) \ + XX(jl_le_float) \ + XX(jl_lisp_prompt) \ + XX(jl_LLVMCreateDisasm) \ + XX(jl_LLVMDisasmInstruction) \ + XX(jl_LLVMFlipSign) \ + XX(jl_LLVMSMod) \ + XX(jl_load) \ + XX(jl_load_) \ + XX(jl_load_and_lookup) \ + XX(jl_load_dynamic_library) \ + XX(jl_load_file_string) \ + XX(jl_lookup_code_address) \ + XX(jl_lseek) \ + XX(jl_lshr_int) \ + XX(jl_lstat) \ + XX(jl_lt_float) \ + XX(jl_macroexpand) \ + XX(jl_macroexpand1) \ + XX(jl_malloc) \ + XX(jl_malloc_stack) \ + XX(jl_matching_methods) \ + XX(jl_maxrss) \ + XX(jl_method_def) \ + XX(jl_method_instance_add_backedge) \ + XX(jl_method_table_add_backedge) \ + XX(jl_method_table_disable) \ + XX(jl_method_table_for) \ + XX(jl_method_table_insert) \ + XX(jl_methtable_lookup) \ + XX(jl_mi_cache_insert) \ + XX(jl_mmap) \ + XX(jl_module_build_id) \ + XX(jl_module_export) \ + XX(jl_module_exports_p) \ + XX(jl_module_globalref) \ + XX(jl_module_import) \ + XX(jl_module_name) \ + XX(jl_module_names) \ + XX(jl_module_parent) \ + XX(jl_module_use) \ + XX(jl_module_using) \ + XX(jl_module_usings) \ + XX(jl_module_uuid) \ + XX(jl_muladd_float) \ + XX(jl_mul_float) \ + XX(jl_mul_int) \ + XX(jl_native_alignment) \ + XX(jl_nb_available) \ + XX(jl_ne_float) \ + XX(jl_neg_float) \ + XX(jl_neg_float_withtype) \ + XX(jl_neg_int) \ + XX(jl_ne_int) \ + XX(jl_new_array) \ + XX(jl_new_bits) \ + XX(jl_new_code_info_uninit) \ + XX(jl_new_codeinst) \ + XX(jl_new_datatype) \ + XX(jl_new_foreign_type) \ + XX(jl_new_method_instance_uninit) \ + XX(jl_new_method_table) \ + XX(jl_new_method_uninit) \ + XX(jl_new_module) \ + XX(jl_new_primitivetype) \ + XX(jl_new_struct) \ + XX(jl_new_structt) \ + XX(jl_new_struct_uninit) \ + XX(jl_new_structv) \ + XX(jl_new_task) \ + XX(jl_new_typename_in) \ + XX(jl_new_typevar) \ + XX(jl_next_from_addrinfo) \ + XX(jl_no_exc_handler) \ + XX(jl_normalize_to_compilable_sig) \ + XX(jl_not_int) \ + XX(jl_object_id) \ + XX(jl_object_id_) \ + XX(jl_obvious_subtype) \ + XX(jl_operator_precedence) \ + XX(jl_op_suffix_char) \ + XX(jl_or_int) \ + XX(jl_parse) \ + XX(jl_parse_all) \ + XX(jl_parse_input_line) \ + XX(jl_parse_opts) \ + XX(jl_parse_string) \ + XX(jl_pathname_for_handle) \ + XX(jl_pchar_to_array) \ + XX(jl_pchar_to_string) \ + XX(jl_pointerref) \ + XX(jl_pointerset) \ + XX(jl_pop_handler) \ + XX(jl_preload_sysimg_so) \ + XX(jl_prepend_cwd) \ + XX(jl_printf) \ + XX(jl_process_events) \ + XX(jl_profile_clear_data) \ + XX(jl_profile_delay_nsec) \ + XX(jl_profile_get_data) \ + XX(jl_profile_init) \ + XX(jl_profile_is_running) \ + XX(jl_profile_len_data) \ + XX(jl_profile_maxlen_data) \ + XX(jl_profile_start_timer) \ + XX(jl_profile_stop_timer) \ + XX(jl_ptrarrayref) \ + XX(jl_ptr_to_array) \ + XX(jl_ptr_to_array_1d) \ + XX(jl_pwrite) \ + XX(jl_queue_work) \ + XX(jl_raise_debugger) \ + XX(jl_readuntil) \ + XX(jl_read_verify_header) \ + XX(jl_realloc) \ + XX(jl_register_newmeth_tracer) \ + XX(jl_rem_float) \ + XX(jl_repl_raise_sigtstp) \ + XX(jl_reshape_array) \ + XX(jl_restore_excstack) \ + XX(jl_restore_incremental) \ + XX(jl_restore_incremental_from_buf) \ + XX(jl_restore_system_image) \ + XX(jl_restore_system_image_data) \ + XX(jl_rethrow) \ + XX(jl_rethrow_other) \ + XX(jl_rettype_inferred) \ + XX(jl_rint_llvm) \ + XX(jl_rint_llvm_withtype) \ + XX(jl_running_on_valgrind) \ + XX(jl_safe_printf) \ + XX(jl_save_incremental) \ + XX(jl_save_system_image) \ + XX(jl_SC_CLK_TCK) \ + XX(jl_sdiv_int) \ + XX(jl_set_ARGS) \ + XX(jl_set_const) \ + XX(jl_set_errno) \ + XX(jl_set_global) \ + XX(jl_set_istopmod) \ + XX(jl_set_module_compile) \ + XX(jl_set_module_infer) \ + XX(jl_set_module_nospecialize) \ + XX(jl_set_module_optlevel) \ + XX(jl_set_module_uuid) \ + XX(jl_set_next_task) \ + XX(jl_set_nth_field) \ + XX(jl_set_ptls_states_getter) \ + XX(jl_set_safe_restore) \ + XX(jl_set_sysimg_so) \ + XX(jl_set_task_tid) \ + XX(jl_set_typeinf_func) \ + XX(jl_set_zero_subnormals) \ + XX(jl_sext_int) \ + XX(jl_shl_int) \ + XX(jl_sigatomic_begin) \ + XX(jl_sigatomic_end) \ + XX(jl_sig_throw) \ + XX(jl_sitofp) \ + XX(jl_sizeof_ios_t) \ + XX(jl_sizeof_jl_options) \ + XX(jl_sizeof_mode_t) \ + XX(jl_sizeof_off_t) \ + XX(jl_sizeof_stat) \ + XX(jl_sizeof_uv_fs_t) \ + XX(jl_sle_int) \ + XX(jl_slt_int) \ + XX(jl_smod_int) \ + XX(jl_sockaddr_from_addrinfo) \ + XX(jl_sockaddr_host4) \ + XX(jl_sockaddr_host6) \ + XX(jl_sockaddr_is_ip4) \ + XX(jl_sockaddr_is_ip6) \ + XX(jl_sockaddr_port4) \ + XX(jl_sockaddr_port6) \ + XX(jl_sockaddr_set_port) \ + XX(jl_spawn) \ + XX(jl_specializations_get_linfo) \ + XX(jl_specializations_lookup) \ + XX(jl_sqrt_llvm) \ + XX(jl_sqrt_llvm_fast) \ + XX(jl_sqrt_llvm_fast_withtype) \ + XX(jl_sqrt_llvm_withtype) \ + XX(jl_srem_int) \ + XX(jl_stat) \ + XX(jl_stat_blksize) \ + XX(jl_stat_blocks) \ + XX(jl_stat_ctime) \ + XX(jl_stat_dev) \ + XX(jl_stat_gid) \ + XX(jl_static_show) \ + XX(jl_static_show_func_sig) \ + XX(jl_stat_ino) \ + XX(jl_stat_mode) \ + XX(jl_stat_mtime) \ + XX(jl_stat_nlink) \ + XX(jl_stat_rdev) \ + XX(jl_stat_size) \ + XX(jl_stat_uid) \ + XX(jl_stderr_obj) \ + XX(jl_stderr_stream) \ + XX(jl_stdin_stream) \ + XX(jl_stdout_obj) \ + XX(jl_stdout_stream) \ + XX(jl_stored_inline) \ + XX(jl_string_ptr) \ + XX(jl_string_to_array) \ + XX(jl_strtod_c) \ + XX(jl_strtof_c) \ + XX(jl_sub_float) \ + XX(jl_sub_int) \ + XX(jl_sub_ptr) \ + XX(jl_substrtod) \ + XX(jl_substrtof) \ + XX(jl_subtype) \ + XX(jl_subtype_env) \ + XX(jl_subtype_env_size) \ + XX(jl_svec) \ + XX(jl_svec1) \ + XX(jl_svec2) \ + XX(jl_svec_copy) \ + XX(jl_svec_fill) \ + XX(jl_svec_isassigned) \ + XX(jl_svec_len) \ + XX(jl_svec_ref) \ + XX(jl_switch) \ + XX(jl_switchto) \ + XX(jl_symbol) \ + XX(jl_symbol_lookup) \ + XX(jl_symbol_n) \ + XX(jl_symbol_name) \ + XX(jl_tagged_gensym) \ + XX(jl_take_buffer) \ + XX(jl_task_get_next) \ + XX(jl_task_stack_buffer) \ + XX(jl_tcp_bind) \ + XX(jl_tcp_connect) \ + XX(jl_tcp_getpeername) \ + XX(jl_tcp_getsockname) \ + XX(jl_tcp_quickack) \ + XX(jl_tcp_reuseport) \ + XX(jl_test_cpu_feature) \ + XX(jl_threadid) \ + XX(jl_threading_enabled) \ + XX(jl_throw) \ + XX(jl_throw_out_of_memory_error) \ + XX(jl_too_few_args) \ + XX(jl_too_many_args) \ + XX(jl_toplevel_eval) \ + XX(jl_toplevel_eval_in) \ + XX(jl_trunc_int) \ + XX(jl_trunc_llvm) \ + XX(jl_trunc_llvm_withtype) \ + XX(jl_try_substrtod) \ + XX(jl_try_substrtof) \ + XX(jl_tty_set_mode) \ + XX(jl_tupletype_fill) \ + XX(jl_typeassert) \ + XX(jl_type_equality_is_identity) \ + XX(jl_type_error) \ + XX(jl_type_error_rt) \ + XX(jl_typeinf_begin) \ + XX(jl_typeinf_end) \ + XX(jl_type_intersection) \ + XX(jl_type_intersection_with_env) \ + XX(jl_typemax_uint) \ + XX(jl_type_morespecific) \ + XX(jl_type_morespecific_no_subtype) \ + XX(jl_typename_str) \ + XX(jl_typeof) \ + XX(jl_typeof_str) \ + XX(jl_types_equal) \ + XX(jl_type_to_llvm) \ + XX(jl_type_union) \ + XX(jl_type_unionall) \ + XX(jl_udiv_int) \ + XX(jl_udp_bind) \ + XX(jl_udp_send) \ + XX(jl_uitofp) \ + XX(jl_ule_int) \ + XX(jl_ult_int) \ + XX(jl_unbox_bool) \ + XX(jl_unbox_float32) \ + XX(jl_unbox_float64) \ + XX(jl_unbox_int16) \ + XX(jl_unbox_int32) \ + XX(jl_unbox_int64) \ + XX(jl_unbox_int8) \ + XX(jl_unbox_uint16) \ + XX(jl_unbox_uint32) \ + XX(jl_unbox_uint64) \ + XX(jl_unbox_uint8) \ + XX(jl_unbox_uint8pointer) \ + XX(jl_unbox_voidpointer) \ + XX(jl_uncompress_argname_n) \ + XX(jl_uncompress_argnames) \ + XX(jl_uncompress_ir) \ + XX(jl_undefined_var_error) \ + XX(jl_urem_int) \ + XX(jl_uv_associate_julia_struct) \ + XX(jl_uv_buf_base) \ + XX(jl_uv_buf_len) \ + XX(jl_uv_buf_set_base) \ + XX(jl_uv_buf_set_len) \ + XX(jl_uv_connect_handle) \ + XX(jl_uv_disassociate_julia_struct) \ + XX(jl_uv_file_handle) \ + XX(jl_uv_flush) \ + XX(jl_uv_fs_t_path) \ + XX(jl_uv_fs_t_ptr) \ + XX(jl_uv_handle) \ + XX(jl_uv_handle_data) \ + XX(jl_uv_handle_type) \ + XX(jl_uv_interface_addresses) \ + XX(jl_uv_interface_address_is_internal) \ + XX(jl_uv_interface_address_sockaddr) \ + XX(jl_uv_process_data) \ + XX(jl_uv_process_pid) \ + XX(jl_uv_putb) \ + XX(jl_uv_putc) \ + XX(jl_uv_puts) \ + XX(jl_uv_req_data) \ + XX(jl_uv_req_set_data) \ + XX(jl_uv_sizeof_interface_address) \ + XX(jl_uv_unix_fd_is_watched) \ + XX(jl_uv_write) \ + XX(jl_uv_writecb) \ + XX(jl_uv_write_handle) \ + XX(jl_valueof) \ + XX(jl_value_ptr) \ + XX(jl_ver_is_release) \ + XX(jl_ver_major) \ + XX(jl_ver_minor) \ + XX(jl_ver_patch) \ + XX(jl_ver_string) \ + XX(jl_vexceptionf) \ + XX(jl_vprintf) \ + XX(jl_wakeup_thread) \ + XX(jl_xor_int) \ + XX(jl_yield) \ + XX(jl_zext_int) diff --git a/src/jltypes.c b/src/jltypes.c index a5d82dc87dc50..2599b47f744c1 100644 --- a/src/jltypes.c +++ b/src/jltypes.c @@ -23,128 +23,6 @@ extern "C" { #define max_probe(size) ((size) <= 1024 ? 16 : (size) >> 6) #define h2index(hv, sz) (size_t)((hv) & ((sz)-1)) -jl_datatype_t *jl_any_type; -jl_unionall_t *jl_type_type; -jl_typename_t *jl_type_typename; -jl_methtable_t *jl_type_type_mt; -jl_methtable_t *jl_nonfunction_mt; -jl_datatype_t *jl_typename_type; -jl_datatype_t *jl_symbol_type; -jl_datatype_t *jl_ssavalue_type; -jl_datatype_t *jl_abstractslot_type; -jl_datatype_t *jl_slotnumber_type; -jl_datatype_t *jl_typedslot_type; -jl_datatype_t *jl_argument_type; -jl_datatype_t *jl_const_type; -jl_datatype_t *jl_partial_struct_type; -jl_datatype_t *jl_method_match_type; -jl_datatype_t *jl_simplevector_type; -jl_typename_t *jl_tuple_typename; -jl_datatype_t *jl_anytuple_type; -jl_datatype_t *jl_emptytuple_type; -jl_unionall_t *jl_anytuple_type_type; -jl_typename_t *jl_vecelement_typename; -jl_unionall_t *jl_vararg_type; -jl_typename_t *jl_vararg_typename; -jl_datatype_t *jl_tvar_type; -jl_datatype_t *jl_uniontype_type; -jl_datatype_t *jl_unionall_type; -jl_datatype_t *jl_datatype_type; -jl_datatype_t *jl_function_type; -jl_datatype_t *jl_builtin_type; - -jl_datatype_t *jl_typeofbottom_type; -jl_value_t *jl_bottom_type; -jl_unionall_t *jl_abstractarray_type; -jl_unionall_t *jl_densearray_type; - -jl_datatype_t *jl_bool_type; -jl_datatype_t *jl_char_type; -jl_datatype_t *jl_int8_type; -jl_datatype_t *jl_uint8_type; -jl_datatype_t *jl_int16_type; -jl_datatype_t *jl_uint16_type; -jl_datatype_t *jl_int32_type; -jl_datatype_t *jl_uint32_type; -jl_datatype_t *jl_int64_type; -jl_datatype_t *jl_uint64_type; -jl_datatype_t *jl_float16_type; -jl_datatype_t *jl_float32_type; -jl_datatype_t *jl_float64_type; -jl_datatype_t *jl_floatingpoint_type; -jl_datatype_t *jl_number_type; -jl_datatype_t *jl_signed_type; - -JL_DLLEXPORT jl_value_t *jl_emptytuple; -jl_svec_t *jl_emptysvec; -jl_value_t *jl_nothing; - -JL_DLLEXPORT jl_value_t *jl_true; -JL_DLLEXPORT jl_value_t *jl_false; - -jl_unionall_t *jl_array_type; -jl_typename_t *jl_array_typename; -jl_value_t *jl_array_uint8_type; -jl_value_t *jl_array_any_type; -jl_value_t *jl_array_symbol_type; -jl_value_t *jl_array_int32_type; -jl_datatype_t *jl_weakref_type; -jl_datatype_t *jl_abstractstring_type; -jl_datatype_t *jl_string_type; -jl_datatype_t *jl_expr_type; -jl_datatype_t *jl_globalref_type; -jl_datatype_t *jl_linenumbernode_type; -jl_datatype_t *jl_gotonode_type; -jl_datatype_t *jl_gotoifnot_type; -jl_datatype_t *jl_returnnode_type; -jl_datatype_t *jl_pinode_type; -jl_datatype_t *jl_phinode_type; -jl_datatype_t *jl_phicnode_type; -jl_datatype_t *jl_upsilonnode_type; -jl_datatype_t *jl_quotenode_type; -jl_datatype_t *jl_newvarnode_type; -jl_datatype_t *jl_intrinsic_type; -jl_datatype_t *jl_method_type; -jl_datatype_t *jl_methtable_type; -jl_datatype_t *jl_typemap_entry_type; -jl_datatype_t *jl_typemap_level_type; -jl_datatype_t *jl_method_instance_type; -jl_datatype_t *jl_code_instance_type; -jl_datatype_t *jl_code_info_type; -jl_datatype_t *jl_module_type; -jl_datatype_t *jl_errorexception_type; -jl_datatype_t *jl_argumenterror_type; -jl_datatype_t *jl_typeerror_type; -jl_datatype_t *jl_methoderror_type; -jl_datatype_t *jl_loaderror_type; -jl_datatype_t *jl_initerror_type; -jl_datatype_t *jl_undefvarerror_type; -jl_datatype_t *jl_lineinfonode_type; -jl_unionall_t *jl_ref_type; -jl_unionall_t *jl_pointer_type; -jl_typename_t *jl_pointer_typename; -jl_unionall_t *jl_llvmpointer_type; -jl_typename_t *jl_llvmpointer_typename; -jl_datatype_t *jl_void_type; // deprecated -jl_datatype_t *jl_nothing_type; -jl_datatype_t *jl_voidpointer_type; -jl_datatype_t *jl_uint8pointer_type; -jl_typename_t *jl_namedtuple_typename; -jl_unionall_t *jl_namedtuple_type; -jl_datatype_t *jl_task_type; -jl_value_t *jl_an_empty_vec_any; -jl_value_t *jl_an_empty_string; -jl_value_t *jl_stackovf_exception; -#ifdef SEGV_EXCEPTION -jl_value_t *jl_segv_exception; -#endif -JL_DLLEXPORT jl_value_t *jl_diverror_exception; -JL_DLLEXPORT jl_value_t *jl_undefref_exception; -jl_value_t *jl_interrupt_exception; -jl_datatype_t *jl_boundserror_type; -jl_value_t *jl_memory_exception; -jl_value_t *jl_readonlymemory_exception; - // --- type properties and predicates --- static int typeenv_has(jl_typeenv_t *env, jl_tvar_t *v) JL_NOTSAFEPOINT diff --git a/src/julia.h b/src/julia.h index a3addc636cbb6..ec02eb8f32334 100644 --- a/src/julia.h +++ b/src/julia.h @@ -595,126 +595,123 @@ typedef struct { // constants and type objects ------------------------------------------------- // kinds -extern JL_DLLEXPORT jl_datatype_t *jl_typeofbottom_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_datatype_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_uniontype_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_unionall_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_tvar_type JL_GLOBALLY_ROOTED; - -extern JL_DLLEXPORT jl_datatype_t *jl_any_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_unionall_t *jl_type_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_typename_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_typename_t *jl_type_typename JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_symbol_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_ssavalue_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_abstractslot_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_slotnumber_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_typedslot_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_argument_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_const_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_partial_struct_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_method_match_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_simplevector_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_typename_t *jl_tuple_typename JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_typename_t *jl_vecelement_typename JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_anytuple_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_emptytuple_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_typeofbottom_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_datatype_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_uniontype_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_unionall_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_tvar_type JL_GLOBALLY_ROOTED; + +extern JL_DLLIMPORT jl_datatype_t *jl_any_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_unionall_t *jl_type_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_typename_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_typename_t *jl_type_typename JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_symbol_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_ssavalue_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_abstractslot_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_slotnumber_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_typedslot_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_argument_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_const_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_partial_struct_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_method_match_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_simplevector_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_typename_t *jl_tuple_typename JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_typename_t *jl_vecelement_typename JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_anytuple_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_emptytuple_type JL_GLOBALLY_ROOTED; #define jl_tuple_type jl_anytuple_type -extern JL_DLLEXPORT jl_unionall_t *jl_anytuple_type_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_unionall_t *jl_vararg_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_typename_t *jl_vararg_typename JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_function_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_builtin_type JL_GLOBALLY_ROOTED; - -extern JL_DLLEXPORT jl_value_t *jl_bottom_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_method_instance_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_code_instance_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_code_info_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_method_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_module_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_unionall_t *jl_abstractarray_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_unionall_t *jl_densearray_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_unionall_t *jl_array_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_typename_t *jl_array_typename JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_weakref_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_abstractstring_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_string_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_errorexception_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_argumenterror_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_loaderror_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_initerror_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_typeerror_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_methoderror_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_undefvarerror_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_lineinfonode_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_value_t *jl_stackovf_exception JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_value_t *jl_memory_exception JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_value_t *jl_readonlymemory_exception JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_value_t *jl_diverror_exception JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_value_t *jl_undefref_exception JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_value_t *jl_interrupt_exception JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_boundserror_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_value_t *jl_an_empty_vec_any JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_value_t *jl_an_empty_string JL_GLOBALLY_ROOTED; - -extern JL_DLLEXPORT jl_datatype_t *jl_bool_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_char_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_int8_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_uint8_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_int16_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_uint16_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_int32_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_uint32_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_int64_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_uint64_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_float16_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_float32_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_float64_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_floatingpoint_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_number_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_void_type JL_GLOBALLY_ROOTED; // deprecated -extern JL_DLLEXPORT jl_datatype_t *jl_nothing_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_signed_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_voidpointer_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_uint8pointer_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_unionall_t *jl_pointer_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_unionall_t *jl_llvmpointer_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_unionall_t *jl_ref_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_typename_t *jl_pointer_typename JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_typename_t *jl_llvmpointer_typename JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_typename_t *jl_namedtuple_typename JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_unionall_t *jl_namedtuple_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_task_type JL_GLOBALLY_ROOTED; - -extern JL_DLLEXPORT jl_value_t *jl_array_uint8_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_value_t *jl_array_any_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_value_t *jl_array_symbol_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_value_t *jl_array_int32_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_expr_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_globalref_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_linenumbernode_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_gotonode_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_gotoifnot_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_returnnode_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_phinode_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_pinode_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_phicnode_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_upsilonnode_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_quotenode_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_newvarnode_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_intrinsic_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_methtable_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_typemap_level_type JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_datatype_t *jl_typemap_entry_type JL_GLOBALLY_ROOTED; - -extern JL_DLLEXPORT jl_svec_t *jl_emptysvec JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_value_t *jl_emptytuple JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_value_t *jl_true JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_value_t *jl_false JL_GLOBALLY_ROOTED; -extern JL_DLLEXPORT jl_value_t *jl_nothing JL_GLOBALLY_ROOTED; - -// some important symbols -extern JL_DLLEXPORT jl_sym_t *jl_incomplete_sym; +extern JL_DLLIMPORT jl_unionall_t *jl_anytuple_type_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_unionall_t *jl_vararg_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_typename_t *jl_vararg_typename JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_function_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_builtin_type JL_GLOBALLY_ROOTED; + +extern JL_DLLIMPORT jl_value_t *jl_bottom_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_method_instance_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_code_instance_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_code_info_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_method_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_module_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_unionall_t *jl_abstractarray_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_unionall_t *jl_densearray_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_unionall_t *jl_array_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_typename_t *jl_array_typename JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_weakref_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_abstractstring_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_string_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_errorexception_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_argumenterror_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_loaderror_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_initerror_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_typeerror_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_methoderror_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_undefvarerror_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_lineinfonode_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_value_t *jl_stackovf_exception JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_value_t *jl_memory_exception JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_value_t *jl_readonlymemory_exception JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_value_t *jl_diverror_exception JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_value_t *jl_undefref_exception JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_value_t *jl_interrupt_exception JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_boundserror_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_value_t *jl_an_empty_vec_any JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_value_t *jl_an_empty_string JL_GLOBALLY_ROOTED; + +extern JL_DLLIMPORT jl_datatype_t *jl_bool_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_char_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_int8_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_uint8_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_int16_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_uint16_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_int32_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_uint32_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_int64_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_uint64_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_float16_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_float32_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_float64_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_floatingpoint_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_number_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_void_type JL_GLOBALLY_ROOTED; // deprecated +extern JL_DLLIMPORT jl_datatype_t *jl_nothing_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_signed_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_voidpointer_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_uint8pointer_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_unionall_t *jl_pointer_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_unionall_t *jl_llvmpointer_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_unionall_t *jl_ref_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_typename_t *jl_pointer_typename JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_typename_t *jl_llvmpointer_typename JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_typename_t *jl_namedtuple_typename JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_unionall_t *jl_namedtuple_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_task_type JL_GLOBALLY_ROOTED; + +extern JL_DLLIMPORT jl_value_t *jl_array_uint8_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_value_t *jl_array_any_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_value_t *jl_array_symbol_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_value_t *jl_array_int32_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_expr_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_globalref_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_linenumbernode_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_gotonode_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_gotoifnot_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_returnnode_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_phinode_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_pinode_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_phicnode_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_upsilonnode_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_quotenode_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_newvarnode_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_intrinsic_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_methtable_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_typemap_level_type JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_datatype_t *jl_typemap_entry_type JL_GLOBALLY_ROOTED; + +extern JL_DLLIMPORT jl_svec_t *jl_emptysvec JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_value_t *jl_emptytuple JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_value_t *jl_true JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_value_t *jl_false JL_GLOBALLY_ROOTED; +extern JL_DLLIMPORT jl_value_t *jl_nothing JL_GLOBALLY_ROOTED; // gc ------------------------------------------------------------------------- diff --git a/src/julia_internal.h b/src/julia_internal.h index 19efe2ad23912..21bdbc85ec901 100644 --- a/src/julia_internal.h +++ b/src/julia_internal.h @@ -152,7 +152,7 @@ STATIC_INLINE uint32_t jl_int32hash_fast(uint32_t a) // useful constants extern jl_methtable_t *jl_type_type_mt JL_GLOBALLY_ROOTED; extern jl_methtable_t *jl_nonfunction_mt JL_GLOBALLY_ROOTED; -JL_DLLEXPORT extern size_t jl_world_counter; +extern size_t jl_world_counter; typedef void (*tracer_cb)(jl_value_t *tracee); extern tracer_cb jl_newmeth_tracer; @@ -1244,7 +1244,7 @@ extern jl_sym_t *empty_sym; extern jl_sym_t *top_sym; extern jl_sym_t *module_sym; extern jl_sym_t *slot_sym; extern jl_sym_t *export_sym; extern jl_sym_t *import_sym; extern jl_sym_t *toplevel_sym; extern jl_sym_t *quote_sym; -extern jl_sym_t *line_sym; extern jl_sym_t *jl_incomplete_sym; +extern jl_sym_t *line_sym; extern jl_sym_t *incomplete_sym; extern jl_sym_t *goto_sym; extern jl_sym_t *goto_ifnot_sym; extern jl_sym_t *return_sym; extern jl_sym_t *lambda_sym; extern jl_sym_t *assign_sym; diff --git a/src/module.c b/src/module.c index 72b7b83fa07e4..3bc1f22ea4cbc 100644 --- a/src/module.c +++ b/src/module.c @@ -11,11 +11,6 @@ extern "C" { #endif -jl_module_t *jl_main_module = NULL; -jl_module_t *jl_core_module = NULL; -jl_module_t *jl_base_module = NULL; -jl_module_t *jl_top_module = NULL; - JL_DLLEXPORT jl_module_t *jl_new_module(jl_sym_t *name) { jl_ptls_t ptls = jl_get_ptls_states(); diff --git a/src/staticdata.c b/src/staticdata.c index ddc5f2f9dc335..5b63c6d4fcbe6 100644 --- a/src/staticdata.c +++ b/src/staticdata.c @@ -30,63 +30,182 @@ extern "C" { // TODO: put WeakRefs on the weak_refs list during deserialization // TODO: handle finalizers +#define NUM_TAGS 146 + // An array of references that need to be restored from the sysimg // This is a manually constructed dual of the gvars array, which would be produced by codegen for Julia code, for C. -static void *const _tags[] = { - // builtin types - &jl_any_type, &jl_symbol_type, &jl_ssavalue_type, &jl_datatype_type, &jl_slotnumber_type, - &jl_simplevector_type, &jl_array_type, &jl_typedslot_type, - &jl_expr_type, &jl_globalref_type, &jl_string_type, - &jl_module_type, &jl_tvar_type, &jl_method_instance_type, &jl_method_type, &jl_code_instance_type, - &jl_linenumbernode_type, &jl_lineinfonode_type, - &jl_gotonode_type, &jl_quotenode_type, &jl_gotoifnot_type, &jl_argument_type, &jl_returnnode_type, - &jl_const_type, &jl_partial_struct_type, &jl_method_match_type, - &jl_pinode_type, &jl_phinode_type, &jl_phicnode_type, &jl_upsilonnode_type, - &jl_type_type, &jl_bottom_type, &jl_ref_type, &jl_pointer_type, &jl_llvmpointer_type, - &jl_vararg_type, &jl_abstractarray_type, - &jl_densearray_type, &jl_nothing_type, &jl_function_type, &jl_typeofbottom_type, - &jl_unionall_type, &jl_typename_type, &jl_builtin_type, &jl_code_info_type, - &jl_task_type, &jl_uniontype_type, &jl_abstractstring_type, - &jl_array_any_type, &jl_intrinsic_type, &jl_abstractslot_type, - &jl_methtable_type, &jl_typemap_level_type, &jl_typemap_entry_type, - &jl_voidpointer_type, &jl_uint8pointer_type, &jl_newvarnode_type, - &jl_anytuple_type_type, &jl_anytuple_type, &jl_namedtuple_type, &jl_emptytuple_type, - &jl_array_symbol_type, &jl_array_uint8_type, &jl_array_int32_type, - &jl_int32_type, &jl_int64_type, &jl_bool_type, &jl_uint8_type, - &jl_uint32_type, &jl_uint64_type, &jl_char_type, &jl_weakref_type, - &jl_int8_type, &jl_int16_type, &jl_uint16_type, - &jl_float16_type, &jl_float32_type, &jl_float64_type, &jl_floatingpoint_type, - &jl_number_type, &jl_signed_type, - // special typenames - &jl_tuple_typename, &jl_pointer_typename, &jl_llvmpointer_typename, &jl_array_typename, &jl_type_typename, - &jl_vararg_typename, &jl_namedtuple_typename, - &jl_vecelement_typename, - // special exceptions - &jl_errorexception_type, &jl_argumenterror_type, &jl_typeerror_type, - &jl_methoderror_type, &jl_loaderror_type, &jl_initerror_type, - &jl_undefvarerror_type, &jl_stackovf_exception, &jl_diverror_exception, - &jl_interrupt_exception, &jl_boundserror_type, &jl_memory_exception, - &jl_undefref_exception, &jl_readonlymemory_exception, +jl_value_t **const*const get_tags(void) { + // Make sure to keep an extra slot at the end to sentinel length + static void * _tags[NUM_TAGS] = {NULL}; + + // Lazyily-initialize this list + if (_tags[0] == NULL) { + unsigned int i = 0; +#define INSERT_TAG(sym) _tags[i++] = &(sym) + // builtin types + INSERT_TAG(jl_any_type); + INSERT_TAG(jl_symbol_type); + INSERT_TAG(jl_ssavalue_type); + INSERT_TAG(jl_datatype_type); + INSERT_TAG(jl_slotnumber_type); + INSERT_TAG(jl_simplevector_type); + INSERT_TAG(jl_array_type); + INSERT_TAG(jl_typedslot_type); + INSERT_TAG(jl_expr_type); + INSERT_TAG(jl_globalref_type); + INSERT_TAG(jl_string_type); + INSERT_TAG(jl_module_type); + INSERT_TAG(jl_tvar_type); + INSERT_TAG(jl_method_instance_type); + INSERT_TAG(jl_method_type); + INSERT_TAG(jl_code_instance_type); + INSERT_TAG(jl_linenumbernode_type); + INSERT_TAG(jl_lineinfonode_type); + INSERT_TAG(jl_gotonode_type); + INSERT_TAG(jl_quotenode_type); + INSERT_TAG(jl_gotoifnot_type); + INSERT_TAG(jl_argument_type); + INSERT_TAG(jl_returnnode_type); + INSERT_TAG(jl_const_type); + INSERT_TAG(jl_partial_struct_type); + INSERT_TAG(jl_method_match_type); + INSERT_TAG(jl_pinode_type); + INSERT_TAG(jl_phinode_type); + INSERT_TAG(jl_phicnode_type); + INSERT_TAG(jl_upsilonnode_type); + INSERT_TAG(jl_type_type); + INSERT_TAG(jl_bottom_type); + INSERT_TAG(jl_ref_type); + INSERT_TAG(jl_pointer_type); + INSERT_TAG(jl_llvmpointer_type); + INSERT_TAG(jl_vararg_type); + INSERT_TAG(jl_abstractarray_type); + INSERT_TAG(jl_densearray_type); + INSERT_TAG(jl_nothing_type); + INSERT_TAG(jl_function_type); + INSERT_TAG(jl_typeofbottom_type); + INSERT_TAG(jl_unionall_type); + INSERT_TAG(jl_typename_type); + INSERT_TAG(jl_builtin_type); + INSERT_TAG(jl_code_info_type); + INSERT_TAG(jl_task_type); + INSERT_TAG(jl_uniontype_type); + INSERT_TAG(jl_abstractstring_type); + INSERT_TAG(jl_array_any_type); + INSERT_TAG(jl_intrinsic_type); + INSERT_TAG(jl_abstractslot_type); + INSERT_TAG(jl_methtable_type); + INSERT_TAG(jl_typemap_level_type); + INSERT_TAG(jl_typemap_entry_type); + INSERT_TAG(jl_voidpointer_type); + INSERT_TAG(jl_uint8pointer_type); + INSERT_TAG(jl_newvarnode_type); + INSERT_TAG(jl_anytuple_type_type); + INSERT_TAG(jl_anytuple_type); + INSERT_TAG(jl_namedtuple_type); + INSERT_TAG(jl_emptytuple_type); + INSERT_TAG(jl_array_symbol_type); + INSERT_TAG(jl_array_uint8_type); + INSERT_TAG(jl_array_int32_type); + INSERT_TAG(jl_int32_type); + INSERT_TAG(jl_int64_type); + INSERT_TAG(jl_bool_type); + INSERT_TAG(jl_uint8_type); + INSERT_TAG(jl_uint32_type); + INSERT_TAG(jl_uint64_type); + INSERT_TAG(jl_char_type); + INSERT_TAG(jl_weakref_type); + INSERT_TAG(jl_int8_type); + INSERT_TAG(jl_int16_type); + INSERT_TAG(jl_uint16_type); + INSERT_TAG(jl_float16_type); + INSERT_TAG(jl_float32_type); + INSERT_TAG(jl_float64_type); + INSERT_TAG(jl_floatingpoint_type); + INSERT_TAG(jl_number_type); + INSERT_TAG(jl_signed_type); + + // special typenames + INSERT_TAG(jl_tuple_typename); + INSERT_TAG(jl_pointer_typename); + INSERT_TAG(jl_llvmpointer_typename); + INSERT_TAG(jl_array_typename); + INSERT_TAG(jl_type_typename); + INSERT_TAG(jl_vararg_typename); + INSERT_TAG(jl_namedtuple_typename); + INSERT_TAG(jl_vecelement_typename); + + // special exceptions + INSERT_TAG(jl_errorexception_type); + INSERT_TAG(jl_argumenterror_type); + INSERT_TAG(jl_typeerror_type); + INSERT_TAG(jl_methoderror_type); + INSERT_TAG(jl_loaderror_type); + INSERT_TAG(jl_initerror_type); + INSERT_TAG(jl_undefvarerror_type); + INSERT_TAG(jl_stackovf_exception); + INSERT_TAG(jl_diverror_exception); + INSERT_TAG(jl_interrupt_exception); + INSERT_TAG(jl_boundserror_type); + INSERT_TAG(jl_memory_exception); + INSERT_TAG(jl_undefref_exception); + INSERT_TAG(jl_readonlymemory_exception); + + // other special values + INSERT_TAG(jl_emptysvec); + INSERT_TAG(jl_emptytuple); + INSERT_TAG(jl_false); + INSERT_TAG(jl_true); + INSERT_TAG(jl_nothing); + INSERT_TAG(jl_an_empty_string); + INSERT_TAG(jl_an_empty_vec_any); + INSERT_TAG(jl_module_init_order); + INSERT_TAG(jl_core_module); + INSERT_TAG(jl_base_module); + INSERT_TAG(jl_main_module); + INSERT_TAG(jl_top_module); + INSERT_TAG(jl_typeinf_func); + INSERT_TAG(jl_type_type_mt); + INSERT_TAG(jl_nonfunction_mt); + + // some Core.Builtin Functions that we want to be able to reference: + INSERT_TAG(jl_builtin_throw); + INSERT_TAG(jl_builtin_is); + INSERT_TAG(jl_builtin_typeof); + INSERT_TAG(jl_builtin_sizeof); + INSERT_TAG(jl_builtin_issubtype); + INSERT_TAG(jl_builtin_isa); + INSERT_TAG(jl_builtin_typeassert); + INSERT_TAG(jl_builtin__apply); + INSERT_TAG(jl_builtin__apply_iterate); + INSERT_TAG(jl_builtin_isdefined); + INSERT_TAG(jl_builtin_nfields); + INSERT_TAG(jl_builtin_tuple); + INSERT_TAG(jl_builtin_svec); + INSERT_TAG(jl_builtin_getfield); + INSERT_TAG(jl_builtin_setfield); + INSERT_TAG(jl_builtin_fieldtype); + INSERT_TAG(jl_builtin_arrayref); + INSERT_TAG(jl_builtin_const_arrayref); + INSERT_TAG(jl_builtin_arrayset); + INSERT_TAG(jl_builtin_arraysize); + INSERT_TAG(jl_builtin_apply_type); + INSERT_TAG(jl_builtin_applicable); + INSERT_TAG(jl_builtin_invoke); + INSERT_TAG(jl_builtin__expr); + INSERT_TAG(jl_builtin_ifelse); + INSERT_TAG(jl_builtin__typebody); + + // All optional tags must be placed at the end, so that we + // don't accidentally have a `NULL` in the middle #ifdef SEGV_EXCEPTION - &jl_segv_exception, + INSERT_TAG(jl_segv_exception); #endif - // other special values - &jl_emptysvec, &jl_emptytuple, &jl_false, &jl_true, &jl_nothing, - &jl_an_empty_string, &jl_an_empty_vec_any, - - &jl_module_init_order, &jl_core_module, &jl_base_module, &jl_main_module, &jl_top_module, - &jl_typeinf_func, &jl_type_type_mt, &jl_nonfunction_mt, - // some Core.Builtin Functions that we want to be able to reference: - &jl_builtin_throw, &jl_builtin_is, &jl_builtin_typeof, &jl_builtin_sizeof, - &jl_builtin_issubtype, &jl_builtin_isa, &jl_builtin_typeassert, &jl_builtin__apply, - &jl_builtin__apply_iterate, - &jl_builtin_isdefined, &jl_builtin_nfields, &jl_builtin_tuple, &jl_builtin_svec, - &jl_builtin_getfield, &jl_builtin_setfield, &jl_builtin_fieldtype, &jl_builtin_arrayref, - &jl_builtin_const_arrayref, &jl_builtin_arrayset, &jl_builtin_arraysize, - &jl_builtin_apply_type, &jl_builtin_applicable, &jl_builtin_invoke, - &jl_builtin__expr, &jl_builtin_ifelse, &jl_builtin__typebody, - NULL }; -static jl_value_t **const*const tags = (jl_value_t**const*const)_tags; +#undef INSERT_TAG + assert(i >= (NUM_TAGS-2) && i < NUM_TAGS); + } + return (jl_value_t**const*const) _tags; +} // hash of definitions for predefined tagged object static htable_t symbol_table; @@ -1384,6 +1503,7 @@ static void jl_save_system_image_to_stream(ios_t *f) JL_GC_DISABLED s.ptls = jl_get_ptls_states(); arraylist_new(&s.relocs_list, 0); arraylist_new(&s.gctags_list, 0); + jl_value_t **const*const tags = get_tags(); // empty!(Core.ARGS) if (jl_core_module != NULL) { @@ -1554,6 +1674,7 @@ static void jl_restore_system_image_from_stream(ios_t *f) JL_GC_DISABLED s.ptls = jl_get_ptls_states(); arraylist_new(&s.relocs_list, 0); arraylist_new(&s.gctags_list, 0); + jl_value_t **const*const tags = get_tags(); // step 1: read section map assert(ios_pos(f) == 0 && f->bm == bm_mem); diff --git a/src/support/dtypes.h b/src/support/dtypes.h index b252776404d68..46780e8e64d4a 100644 --- a/src/support/dtypes.h +++ b/src/support/dtypes.h @@ -63,15 +63,28 @@ */ #ifdef _OS_WINDOWS_ -#define STDCALL __stdcall +#define STDCALL __stdcall # ifdef LIBRARY_EXPORTS # define JL_DLLEXPORT __declspec(dllexport) # else # define JL_DLLEXPORT __declspec(dllimport) # endif +#define JL_DLLIMPORT __declspec(dllimport) #else #define STDCALL -#define JL_DLLEXPORT __attribute__ ((visibility("default"))) +# define JL_DLLEXPORT __attribute__ ((visibility("default"))) +#define JL_DLLIMPORT +#endif + +/* + * Debug builds include `-fstack-protector`, which adds a bit of extra prologue to + * functions, even naked ones. We don't want that, but we also don't want the + * compiler warnings when `no_stack_protector` has no effect. + */ +#ifdef JL_DEBUG_BUILD +#define JL_NAKED __attribute__ ((naked,no_stack_protector)) +#else +#define JL_NAKED __attribute__ ((naked)) #endif #ifdef _OS_LINUX_ diff --git a/src/threading.c b/src/threading.c index 5fd5c2fa59cd8..8f8dd45c28507 100644 --- a/src/threading.c +++ b/src/threading.c @@ -205,29 +205,13 @@ JL_DLLEXPORT void jl_set_ptls_states_getter(jl_get_ptls_states_func f) } } -# if JL_USE_IFUNC -static jl_get_ptls_states_func jl_get_ptls_states_resolve(void) -{ - if (jl_tls_states_cb != jl_get_ptls_states_init) - return jl_tls_states_cb; - // If we can't find the static version, return the wrapper instead - // of the slow version so that we won't resolve to the slow version - // due to issues in the relocation order. - // This may not be necessary once `ifunc` support in glibc is more mature. - if (!jl_get_ptls_states_static) - return jl_get_ptls_states_wrapper; - jl_tls_states_cb = jl_get_ptls_states_static; - return jl_tls_states_cb; -} - -JL_DLLEXPORT JL_CONST_FUNC jl_ptls_t (jl_get_ptls_states)(void) JL_GLOBALLY_ROOTED - __attribute__((ifunc ("jl_get_ptls_states_resolve"))); -# else // JL_TLS_USE_IFUNC JL_DLLEXPORT JL_CONST_FUNC jl_ptls_t (jl_get_ptls_states)(void) JL_GLOBALLY_ROOTED { - return jl_get_ptls_states_wrapper(); +#ifndef __clang_analyzer__ + return (*jl_tls_states_cb)(); +#endif } -# endif // JL_TLS_USE_IFUNC + jl_get_ptls_states_func jl_get_ptls_states_getter(void) { if (jl_tls_states_cb == jl_get_ptls_states_init) diff --git a/src/toplevel.c b/src/toplevel.c index ef5720a0d4f0e..5ddf139e5f086 100644 --- a/src/toplevel.c +++ b/src/toplevel.c @@ -507,7 +507,7 @@ int jl_is_toplevel_only_expr(jl_value_t *e) JL_NOTSAFEPOINT ((jl_expr_t*)e)->head == const_sym || ((jl_expr_t*)e)->head == toplevel_sym || ((jl_expr_t*)e)->head == error_sym || - ((jl_expr_t*)e)->head == jl_incomplete_sym); + ((jl_expr_t*)e)->head == incomplete_sym); } int jl_needs_lowering(jl_value_t *e) JL_NOTSAFEPOINT @@ -518,7 +518,7 @@ int jl_needs_lowering(jl_value_t *e) JL_NOTSAFEPOINT jl_sym_t *head = ex->head; if (head == module_sym || head == import_sym || head == using_sym || head == export_sym || head == thunk_sym || head == toplevel_sym || - head == error_sym || head == jl_incomplete_sym || head == method_sym) { + head == error_sym || head == incomplete_sym || head == method_sym) { return 0; } if (head == global_sym || head == const_sym) { @@ -829,7 +829,7 @@ jl_value_t *jl_toplevel_eval_flex(jl_module_t *JL_NONNULL m, jl_value_t *e, int JL_GC_POP(); return res; } - else if (head == error_sym || head == jl_incomplete_sym) { + else if (head == error_sym || head == incomplete_sym) { if (jl_expr_nargs(ex) == 0) jl_eval_errorf(m, "malformed \"%s\" expression", jl_symbol_name(head)); if (jl_is_string(jl_exprarg(ex, 0))) diff --git a/stdlib/Libdl/test/runtests.jl b/stdlib/Libdl/test/runtests.jl index 6d2b83b28b323..5c06dd929f1a1 100644 --- a/stdlib/Libdl/test/runtests.jl +++ b/stdlib/Libdl/test/runtests.jl @@ -19,7 +19,7 @@ end if Base.DARWIN_FRAMEWORK return occursin(Regex("^$(Base.DARWIN_FRAMEWORK_NAME)(?:_debug)?\$"), basename(dl)) else - return occursin(Regex("^libjulia(?:.*)\\.$(Libdl.dlext)(?:\\..+)?\$"), basename(dl)) + return occursin(Regex("^libjulia-internal(?:.*)\\.$(Libdl.dlext)(?:\\..+)?\$"), basename(dl)) end end) == 1 # look for something libjulia-like (but only one) @@ -29,9 +29,8 @@ end cd(@__DIR__) do -# Find the library directory by finding the path of libjulia (or libjulia-debug, as the case may be) -# and then adding on /julia to that directory path to get the private library directory, if we need -# to (where "need to" is defined as private_libdir/julia/libccalltest.dlext exists +# Find the library directory by finding the path of libjulia-internal (or libjulia-internal-debug, +# as the case may be) to get the private library directory private_libdir = if Base.DARWIN_FRAMEWORK if ccall(:jl_is_debugbuild, Cint, ()) != 0 dirname(abspath(Libdl.dlpath(Base.DARWIN_FRAMEWORK_NAME * "_debug"))) @@ -39,13 +38,9 @@ private_libdir = if Base.DARWIN_FRAMEWORK joinpath(dirname(abspath(Libdl.dlpath(Base.DARWIN_FRAMEWORK_NAME))),"Frameworks") end elseif ccall(:jl_is_debugbuild, Cint, ()) != 0 - dirname(abspath(Libdl.dlpath("libjulia-debug"))) + dirname(abspath(Libdl.dlpath("libjulia-internal-debug"))) else - dirname(abspath(Libdl.dlpath("libjulia"))) -end - -if isfile(joinpath(private_libdir,"julia","libccalltest."*Libdl.dlext)) - private_libdir = joinpath(private_libdir, "julia") + dirname(abspath(Libdl.dlpath("libjulia-internal"))) end @test !isempty(Libdl.find_library(["libccalltest"], [private_libdir])) diff --git a/sysimage.mk b/sysimage.mk index 1b78b247a408e..ebc991bdd40f0 100644 --- a/sysimage.mk +++ b/sysimage.mk @@ -15,7 +15,7 @@ VERSDIR := v`cut -d. -f1-2 < $(JULIAHOME)/VERSION` $(build_private_libdir)/%.$(SHLIB_EXT): $(build_private_libdir)/%-o.a @$(call PRINT_LINK, $(CXX) $(LDFLAGS) -shared $(fPIC) -L$(build_private_libdir) -L$(build_libdir) -L$(build_shlibdir) -o $@ \ $(WHOLE_ARCHIVE) $< $(NO_WHOLE_ARCHIVE) \ - $(if $(findstring -debug,$(notdir $@)),-ljulia-debug,-ljulia) \ + $(if $(findstring -debug,$(notdir $@)),-ljulia-internal-debug -ljulia-debug,-ljulia-internal -ljulia) \ $$([ $(OS) = WINNT ] && echo '' -lssp)) @$(INSTALL_NAME_CMD)$(notdir $@) $@ @$(DSYMUTIL) $@ diff --git a/test/llvmpasses/alloc-opt.jl b/test/llvmpasses/alloc-opt.jl index 4a41fb7a5539f..dd1ff78151f95 100644 --- a/test/llvmpasses/alloc-opt.jl +++ b/test/llvmpasses/alloc-opt.jl @@ -1,6 +1,6 @@ # This file is a part of Julia. License is MIT: https://julialang.org/license -# RUN: julia --startup-file=no %s | opt -load libjulia%shlibext -AllocOpt -LateLowerGCFrame -FinalLowerGC -S - | FileCheck %s +# RUN: julia --startup-file=no %s | opt -load libjulia-internal%shlibext -AllocOpt -LateLowerGCFrame -FinalLowerGC -S - | FileCheck %s isz = sizeof(UInt) == 8 ? "i64" : "i32" diff --git a/test/llvmpasses/alloc-opt2.jl b/test/llvmpasses/alloc-opt2.jl index b50c6f03caa5a..00a4394352fbf 100644 --- a/test/llvmpasses/alloc-opt2.jl +++ b/test/llvmpasses/alloc-opt2.jl @@ -1,6 +1,6 @@ # This file is a part of Julia. License is MIT: https://julialang.org/license -# RUN: julia --startup-file=no %s | opt -load libjulia%shlibext -AllocOpt -S - | FileCheck %s +# RUN: julia --startup-file=no %s | opt -load libjulia-internal%shlibext -AllocOpt -S - | FileCheck %s isz = sizeof(UInt) == 8 ? "i64" : "i32" diff --git a/test/llvmpasses/final-lower-gc.ll b/test/llvmpasses/final-lower-gc.ll index ca15a60472550..04376f7f81496 100644 --- a/test/llvmpasses/final-lower-gc.ll +++ b/test/llvmpasses/final-lower-gc.ll @@ -1,4 +1,4 @@ -; RUN: opt -load libjulia%shlibext -FinalLowerGC -S %s | FileCheck %s +; RUN: opt -load libjulia-internal%shlibext -FinalLowerGC -S %s | FileCheck %s @tag = external addrspace(10) global {} diff --git a/test/llvmpasses/gcroots.ll b/test/llvmpasses/gcroots.ll index 15bdaf433ee34..c11bb7ae4fe56 100644 --- a/test/llvmpasses/gcroots.ll +++ b/test/llvmpasses/gcroots.ll @@ -1,4 +1,4 @@ -; RUN: opt -load libjulia%shlibext -LateLowerGCFrame -FinalLowerGC -S %s | FileCheck %s +; RUN: opt -load libjulia-internal%shlibext -LateLowerGCFrame -FinalLowerGC -S %s | FileCheck %s declare void @boxed_simple({} addrspace(10)*, {} addrspace(10)*) diff --git a/test/llvmpasses/late-lower-gc.ll b/test/llvmpasses/late-lower-gc.ll index 115d703f65f92..29f889031b629 100644 --- a/test/llvmpasses/late-lower-gc.ll +++ b/test/llvmpasses/late-lower-gc.ll @@ -1,4 +1,4 @@ -; RUN: opt -load libjulia%shlibext -LateLowerGCFrame -S %s | FileCheck %s +; RUN: opt -load libjulia-internal%shlibext -LateLowerGCFrame -S %s | FileCheck %s @tag = external addrspace(10) global {}, align 16 diff --git a/test/llvmpasses/loopinfo.jl b/test/llvmpasses/loopinfo.jl index 67dadbf118e41..4df485c0debcb 100644 --- a/test/llvmpasses/loopinfo.jl +++ b/test/llvmpasses/loopinfo.jl @@ -2,7 +2,7 @@ # RUN: julia --startup-file=no %s %t && llvm-link -S %t/* -o %t/module.ll # RUN: cat %t/module.ll | FileCheck %s -# RUN: cat %t/module.ll | opt -load libjulia%shlibext -LowerSIMDLoop -S - | FileCheck %s -check-prefix=LOWER +# RUN: cat %t/module.ll | opt -load libjulia-internal%shlibext -LowerSIMDLoop -S - | FileCheck %s -check-prefix=LOWER # RUN: julia --startup-file=no %s %t -O && llvm-link -S %t/* -o %t/module.ll # RUN: cat %t/module.ll | FileCheck %s -check-prefix=FINAL diff --git a/test/llvmpasses/lower-handlers.ll b/test/llvmpasses/lower-handlers.ll index daeb60261d69c..42e768ee132a7 100644 --- a/test/llvmpasses/lower-handlers.ll +++ b/test/llvmpasses/lower-handlers.ll @@ -1,4 +1,4 @@ -; RUN: opt -load libjulia%shlibext -LowerExcHandlers -S %s | FileCheck %s +; RUN: opt -load libjulia-internal%shlibext -LowerExcHandlers -S %s | FileCheck %s attributes #1 = { returns_twice } declare i32 @julia.except_enter() #1 diff --git a/test/llvmpasses/muladd.ll b/test/llvmpasses/muladd.ll index 83f5955a1c21e..ec36f7bd1fa12 100644 --- a/test/llvmpasses/muladd.ll +++ b/test/llvmpasses/muladd.ll @@ -1,4 +1,4 @@ -; RUN: opt -load libjulia%shlibext -CombineMulAdd -S %s | FileCheck %s +; RUN: opt -load libjulia-internal%shlibext -CombineMulAdd -S %s | FileCheck %s define double @fast_muladd1(double %a, double %b, double %c) { top: diff --git a/test/llvmpasses/propagate-addrspace.ll b/test/llvmpasses/propagate-addrspace.ll index 4df6f073c67bc..1c50c54b4dc9a 100644 --- a/test/llvmpasses/propagate-addrspace.ll +++ b/test/llvmpasses/propagate-addrspace.ll @@ -1,4 +1,4 @@ -; RUN: opt -load libjulia%shlibext -PropagateJuliaAddrspaces -dce -S %s | FileCheck %s +; RUN: opt -load libjulia-internal%shlibext -PropagateJuliaAddrspaces -dce -S %s | FileCheck %s define i64 @simple() { ; CHECK-LABEL: @simple diff --git a/test/llvmpasses/refinements.ll b/test/llvmpasses/refinements.ll index 2b23516d8818b..37212a512d68f 100644 --- a/test/llvmpasses/refinements.ll +++ b/test/llvmpasses/refinements.ll @@ -1,4 +1,4 @@ -; RUN: opt -load libjulia%shlibext -LateLowerGCFrame -FinalLowerGC -S %s | FileCheck %s +; RUN: opt -load libjulia-internal%shlibext -LateLowerGCFrame -FinalLowerGC -S %s | FileCheck %s declare {}*** @julia.ptls_states() diff --git a/test/llvmpasses/remove-addrspaces.ll b/test/llvmpasses/remove-addrspaces.ll index 308e921fe5364..2f34cf55ffc08 100644 --- a/test/llvmpasses/remove-addrspaces.ll +++ b/test/llvmpasses/remove-addrspaces.ll @@ -1,4 +1,4 @@ -; RUN: opt -load libjulia%shlibext -RemoveJuliaAddrspaces -S %s | FileCheck %s +; RUN: opt -load libjulia-internal%shlibext -RemoveJuliaAddrspaces -S %s | FileCheck %s define i64 @getindex({} addrspace(10)* nonnull align 16 dereferenceable(40)) { diff --git a/test/llvmpasses/returnstwicegc.ll b/test/llvmpasses/returnstwicegc.ll index 0c72143ed1836..c542fd026ff81 100644 --- a/test/llvmpasses/returnstwicegc.ll +++ b/test/llvmpasses/returnstwicegc.ll @@ -1,4 +1,4 @@ -; RUN: opt -load libjulia%shlibext -LateLowerGCFrame -FinalLowerGC -S %s | FileCheck %s +; RUN: opt -load libjulia-internal%shlibext -LateLowerGCFrame -FinalLowerGC -S %s | FileCheck %s declare void @boxed_simple({} addrspace(10)*, {} addrspace(10)*) diff --git a/test/llvmpasses/safepoint_stress.jl b/test/llvmpasses/safepoint_stress.jl index 4d00542069079..7ff96643e82c3 100644 --- a/test/llvmpasses/safepoint_stress.jl +++ b/test/llvmpasses/safepoint_stress.jl @@ -1,6 +1,6 @@ # This file is a part of Julia. License is MIT: https://julialang.org/license -# RUN: julia --startup-file=no %s | opt -load libjulia%shlibext -LateLowerGCFrame -FinalLowerGC -S - | FileCheck %s +# RUN: julia --startup-file=no %s | opt -load libjulia-internal%shlibext -LateLowerGCFrame -FinalLowerGC -S - | FileCheck %s println(""" declare {} addrspace(10)* @alloc() diff --git a/test/llvmpasses/simdloop.ll b/test/llvmpasses/simdloop.ll index 0438ee8cdf8fb..469e0699b2d99 100644 --- a/test/llvmpasses/simdloop.ll +++ b/test/llvmpasses/simdloop.ll @@ -1,4 +1,4 @@ -; RUN: opt -load libjulia%shlibext -LowerSIMDLoop -S %s | FileCheck %s +; RUN: opt -load libjulia-internal%shlibext -LowerSIMDLoop -S %s | FileCheck %s declare void @julia.loopinfo_marker()