diff options
Diffstat (limited to 'Makefile')
-rw-r--r-- | Makefile | 51 |
1 files changed, 38 insertions, 13 deletions
@@ -20,7 +20,7 @@ MALLOC_IMPL ?= dlmalloc # yes or no BUILD_LIBC_TOP_HALF ?= yes # The directory where we will store intermediate artifacts. -OBJDIR ?= $(CURDIR)/build +OBJDIR ?= $(CURDIR)/build/$(TARGET_TRIPLE) # When the length is no larger than this threshold, we consider the # overhead of bulk memory opcodes to outweigh the performance benefit, @@ -32,10 +32,14 @@ BULK_MEMORY_THRESHOLD ?= 32 # Variables from this point on are not meant to be overridable via the # make command-line. -# Set the target variables. Multiarch triples notably omit the vendor field, -# which happens to be what we do for the main target triple too. +# Set the default WASI target triple. TARGET_TRIPLE = wasm32-wasi -MULTIARCH_TRIPLE = wasm32-wasi + +# Threaded version necessitates a different traget, as objects from different +# targets can't be mixed together while linking. +ifeq ($(THREAD_MODEL), posix) +TARGET_TRIPLE = wasm32-wasi-threads +endif # These variables describe the locations of various files and directories in # the source tree. @@ -195,14 +199,22 @@ LIBC_TOP_HALF_MUSL_SOURCES += \ $(addprefix $(LIBC_TOP_HALF_MUSL_SRC_DIR)/, \ env/__init_tls.c \ stdio/__lockfile.c \ + stdio/flockfile.c \ + stdio/ftrylockfile.c \ + stdio/funlockfile.c \ thread/__lock.c \ thread/__wait.c \ thread/__timedwait.c \ thread/default_attr.c \ thread/pthread_attr_destroy.c \ + thread/pthread_attr_get.c \ thread/pthread_attr_init.c \ thread/pthread_attr_setstack.c \ + thread/pthread_attr_setdetachstate.c \ thread/pthread_attr_setstacksize.c \ + thread/pthread_barrier_destroy.c \ + thread/pthread_barrier_init.c \ + thread/pthread_barrier_wait.c \ thread/pthread_cleanup_push.c \ thread/pthread_cond_broadcast.c \ thread/pthread_cond_destroy.c \ @@ -215,6 +227,8 @@ LIBC_TOP_HALF_MUSL_SOURCES += \ thread/pthread_condattr_setclock.c \ thread/pthread_condattr_setpshared.c \ thread/pthread_create.c \ + thread/pthread_detach.c \ + thread/pthread_equal.c \ thread/pthread_getspecific.c \ thread/pthread_join.c \ thread/pthread_key_create.c \ @@ -256,6 +270,7 @@ LIBC_TOP_HALF_MUSL_SOURCES += \ thread/sem_timedwait.c \ thread/sem_trywait.c \ thread/sem_wait.c \ + thread/wasm32/wasi_thread_start.s \ ) endif @@ -274,12 +289,13 @@ LIBC_TOP_HALF_HEADERS_PRIVATE = $(LIBC_TOP_HALF_DIR)/headers/private LIBC_TOP_HALF_SOURCES = $(LIBC_TOP_HALF_DIR)/sources LIBC_TOP_HALF_ALL_SOURCES = \ $(LIBC_TOP_HALF_MUSL_SOURCES) \ - $(sort $(shell find $(LIBC_TOP_HALF_SOURCES) -name \*.c)) + $(sort $(shell find $(LIBC_TOP_HALF_SOURCES) -name \*.[cs])) # Add any extra flags CFLAGS = $(EXTRA_CFLAGS) # Set the target. CFLAGS += --target=$(TARGET_TRIPLE) +ASMFLAGS += --target=$(TARGET_TRIPLE) # WebAssembly floating-point match doesn't trap. # TODO: Add -fno-signaling-nans when the compiler supports it. CFLAGS += -fno-trapping-math @@ -326,10 +342,11 @@ CFLAGS += -isystem "$(SYSROOT_INC)" # These variables describe the locations of various files and directories in # the build tree. objs = $(patsubst $(CURDIR)/%.c,$(OBJDIR)/%.o,$(1)) +asmobjs = $(patsubst $(CURDIR)/%.s,$(OBJDIR)/%.o,$(1)) DLMALLOC_OBJS = $(call objs,$(DLMALLOC_SOURCES)) EMMALLOC_OBJS = $(call objs,$(EMMALLOC_SOURCES)) LIBC_BOTTOM_HALF_ALL_OBJS = $(call objs,$(LIBC_BOTTOM_HALF_ALL_SOURCES)) -LIBC_TOP_HALF_ALL_OBJS = $(call objs,$(LIBC_TOP_HALF_ALL_SOURCES)) +LIBC_TOP_HALF_ALL_OBJS = $(call asmobjs,$(call objs,$(LIBC_TOP_HALF_ALL_SOURCES))) ifeq ($(MALLOC_IMPL),dlmalloc) LIBC_OBJS += $(DLMALLOC_OBJS) else ifeq ($(MALLOC_IMPL),emmalloc) @@ -357,9 +374,9 @@ LIBWASI_EMULATED_SIGNAL_MUSL_OBJS = $(call objs,$(LIBWASI_EMULATED_SIGNAL_MUSL_S # These variables describe the locations of various files and # directories in the generated sysroot tree. -SYSROOT_LIB := $(SYSROOT)/lib/$(MULTIARCH_TRIPLE) +SYSROOT_LIB := $(SYSROOT)/lib/$(TARGET_TRIPLE) SYSROOT_INC = $(SYSROOT)/include -SYSROOT_SHARE = $(SYSROOT)/share/$(MULTIARCH_TRIPLE) +SYSROOT_SHARE = $(SYSROOT)/share/$(TARGET_TRIPLE) # Files from musl's include directory that we don't want to install in the # sysroot's include directory. @@ -504,6 +521,10 @@ $(OBJDIR)/%.o: $(CURDIR)/%.c include_dirs @mkdir -p "$(@D)" $(CC) $(CFLAGS) -MD -MP -o $@ -c $< +$(OBJDIR)/%.o: $(CURDIR)/%.s include_dirs + @mkdir -p "$(@D)" + $(CC) $(ASMFLAGS) -o $@ -c $< + -include $(shell find $(OBJDIR) -name \*.d) $(DLMALLOC_OBJS): CFLAGS += \ @@ -645,11 +666,13 @@ check-symbols: startup_files libc @# its builtin include path first, which produces compiler-specific @# output. @# - @# TODO: Undefine __FLOAT128__ for now since it's not in clang 8.0. - @# TODO: Filter out __FLT16_* for now, as not all versions of clang have these. @# TODO: Filter out __NO_MATH_ERRNO_ and a few __*WIDTH__ that are new to clang 14. + @# TODO: Filter out __GCC_HAVE_SYNC_COMPARE_AND_SWAP_* that are new to clang 16. @# TODO: clang defined __FLT_EVAL_METHOD__ until clang 15, so we force-undefine it @# for older versions. + @# TODO: Undefine __wasm_mutable_globals__ and __wasm_sign_ext__, that are new to + @# clang 16 for -mcpu=generic. + @# TODO: As of clang 16, __GNUC_VA_LIST is #defined without a value. $(CC) $(CFLAGS) "$(SYSROOT_SHARE)/include-all.c" \ -isystem $(SYSROOT_INC) \ -std=gnu17 \ @@ -663,22 +686,24 @@ check-symbols: startup_files libc -U__clang_version__ \ -U__clang_literal_encoding__ \ -U__clang_wide_literal_encoding__ \ + -U__wasm_mutable_globals__ \ + -U__wasm_sign_ext__ \ -U__GNUC__ \ -U__GNUC_MINOR__ \ -U__GNUC_PATCHLEVEL__ \ -U__VERSION__ \ - -U__FLOAT128__ \ -U__NO_MATH_ERRNO__ \ -U__BITINT_MAXWIDTH__ \ -U__FLT_EVAL_METHOD__ -Wno-builtin-macro-redefined \ | sed -e 's/__[[:upper:][:digit:]]*_ATOMIC_\([[:upper:][:digit:]_]*\)_LOCK_FREE/__compiler_ATOMIC_\1_LOCK_FREE/' \ - | grep -v '^#define __FLT16_' \ + | sed -e 's/__GNUC_VA_LIST $$/__GNUC_VA_LIST 1/' \ | grep -v '^#define __\(BOOL\|INT_\(LEAST\|FAST\)\(8\|16\|32\|64\)\|INT\|LONG\|LLONG\|SHRT\)_WIDTH__' \ + | grep -v '^#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_\(1\|2\|4\|8\)' \ > "$(SYSROOT_SHARE)/predefined-macros.txt" # Check that the computed metadata matches the expected metadata. # This ignores whitespace because on Windows the output has CRLF line endings. - diff -wur "$(CURDIR)/expected/$(MULTIARCH_TRIPLE)/$(THREAD_MODEL)" "$(SYSROOT_SHARE)" + diff -wur "$(CURDIR)/expected/$(TARGET_TRIPLE)" "$(SYSROOT_SHARE)" install: finish mkdir -p "$(INSTALL_DIR)" |