jade
14207e1cf8
This is UB, we should not be doing it, and we can cheaply turn it into
crashes reliably. We would much rather have crashes than the program
doing something silly.
Benchmarks, but i wonder if they are nonsense because they get identical
times across compilers?!
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|:---|---:|---:|---:|---:|
| `result-clang/bin/nix eval -f ../nixpkgs/pkgs/development/haskell-modules/hackage-packages.nix` | 375.5 ± 24.0 | 353.8 | 408.8 | 1.00 |
| `result-gcc/bin/nix eval -f ../nixpkgs/pkgs/development/haskell-modules/hackage-packages.nix` | 407.9 ± 26.0 | 385.1 | 449.5 | 1.09 ± 0.10 |
| `result-clangsan/bin/nix eval -f ../nixpkgs/pkgs/development/haskell-modules/hackage-packages.nix` | 382.2 ± 26.6 | 354.9 | 419.0 | 1.02 ± 0.10 |
| `result-gccsan/bin/nix eval -f ../nixpkgs/pkgs/development/haskell-modules/hackage-packages.nix` | 408.6 ± 24.6 | 384.5 | 441.9 | 1.09 ± 0.10 |
| Command | Mean [s] | Min [s] | Max [s] | Relative |
|:---|---:|---:|---:|---:|
| `result-clang/bin/nix search --no-eval-cache github:nixos/nixpkgs/e1fa12d4f6c6fe19ccb59cac54b5b3f25e160870 hello` | 17.199 ± 0.167 | 16.930 | 17.499 | 1.01 ± 0.01 |
| `result-gcc/bin/nix search --no-eval-cache github:nixos/nixpkgs/e1fa12d4f6c6fe19ccb59cac54b5b3f25e160870 hello` | 17.409 ± 0.126 | 17.242 | 17.633 | 1.02 ± 0.01 |
| `result-clangsan/bin/nix search --no-eval-cache github:nixos/nixpkgs/e1fa12d4f6c6fe19ccb59cac54b5b3f25e160870 hello` | 17.080 ± 0.137 | 16.879 | 17.350 | 1.00 |
| `result-gccsan/bin/nix search --no-eval-cache github:nixos/nixpkgs/e1fa12d4f6c6fe19ccb59cac54b5b3f25e160870 hello` | 17.396 ± 0.160 | 17.131 | 17.660 | 1.02 ± 0.01 |
| Command | Mean [s] | Min [s] | Max [s] | Relative |
|:---|---:|---:|---:|---:|
| `result-clang/bin/nix eval --raw --impure --expr 'with import <nixpkgs/nixos> {}; system'` | 6.267 ± 0.069 | 6.197 | 6.415 | 1.02 ± 0.01 |
| `result-gcc/bin/nix eval --raw --impure --expr 'with import <nixpkgs/nixos> {}; system'` | 6.232 ± 0.045 | 6.180 | 6.311 | 1.01 ± 0.01 |
| `result-clangsan/bin/nix eval --raw --impure --expr 'with import <nixpkgs/nixos> {}; system'` | 6.162 ± 0.020 | 6.133 | 6.196 | 1.00 |
| `result-gccsan/bin/nix eval --raw --impure --expr 'with import <nixpkgs/nixos> {}; system'` | 6.229 ± 0.031 | 6.199 | 6.289 | 1.01 ± 0.01 |
| Command | Mean [s] | Min [s] | Max [s] | Relative |
|:---|---:|---:|---:|---:|
| `GC_INITIAL_HEAP_SIZE=10g result-clang/bin/nix eval --raw --impure --expr 'with import <nixpkgs/nixos> {}; system'` | 4.683 ± 0.044 | 4.630 | 4.761 | 1.00 |
| `GC_INITIAL_HEAP_SIZE=10g result-gcc/bin/nix eval --raw --impure --expr 'with import <nixpkgs/nixos> {}; system'` | 4.750 ± 0.041 | 4.680 | 4.812 | 1.01 ± 0.01 |
| `GC_INITIAL_HEAP_SIZE=10g result-clangsan/bin/nix eval --raw --impure --expr 'with import <nixpkgs/nixos> {}; system'` | 4.703 ± 0.040 | 4.640 | 4.760 | 1.00 ± 0.01 |
| `GC_INITIAL_HEAP_SIZE=10g result-gccsan/bin/nix eval --raw --impure --expr 'with import <nixpkgs/nixos> {}; system'` | 4.766 ± 0.037 | 4.727 | 4.844 | 1.02 ± 0.01 |
Change-Id: I616ca3eab670317587d47b41870d8ac963c019ae
162 lines
5.5 KiB
Makefile
162 lines
5.5 KiB
Makefile
libs-list :=
|
||
|
||
ifdef HOST_DARWIN
|
||
SO_EXT = dylib
|
||
else
|
||
ifdef HOST_CYGWIN
|
||
SO_EXT = dll
|
||
else
|
||
SO_EXT = so
|
||
endif
|
||
endif
|
||
|
||
# Build a library with symbolic name $(1). The library is defined by
|
||
# various variables prefixed by ‘$(1)_’:
|
||
#
|
||
# - $(1)_NAME: the name of the library (e.g. ‘libfoo’); defaults to
|
||
# $(1).
|
||
#
|
||
# - $(1)_DIR: the directory where the (non-installed) library will be
|
||
# placed.
|
||
#
|
||
# - $(1)_SOURCES: the source files of the library.
|
||
#
|
||
# - $(1)_CFLAGS: additional C compiler flags.
|
||
#
|
||
# - $(1)_CXXFLAGS: additional C++ compiler flags.
|
||
#
|
||
# - $(1)_ORDER_AFTER: a set of targets on which the object files of
|
||
# this libraries will have an order-only dependency.
|
||
#
|
||
# - $(1)_LIBS: the symbolic names of other libraries on which this
|
||
# library depends.
|
||
#
|
||
# - $(1)_ALLOW_UNDEFINED: if set, the library is allowed to have
|
||
# undefined symbols. Has no effect for static libraries.
|
||
#
|
||
# - $(1)_LDFLAGS: additional linker flags.
|
||
#
|
||
# - $(1)_LDFLAGS_PROPAGATED: additional linker flags, also propagated
|
||
# to the linking of programs/libraries that use this library.
|
||
#
|
||
# - $(1)_FORCE_INSTALL: if defined, the library will be installed even
|
||
# if it's not needed (i.e. dynamically linked) by a program.
|
||
#
|
||
# - $(1)_INSTALL_DIR: the directory where the library will be
|
||
# installed. Defaults to $(libdir).
|
||
#
|
||
# - $(1)_EXCLUDE_FROM_LIBRARY_LIST: if defined, the library will not
|
||
# be automatically marked as a dependency of the top-level all
|
||
# target andwill not be listed in the make help output. This is
|
||
# useful for libraries built solely for testing, for example.
|
||
#
|
||
# - BUILD_SHARED_LIBS: if equal to ‘1’, a dynamic library will be
|
||
# built, otherwise a static library.
|
||
define build-library
|
||
$(1)_NAME ?= $(1)
|
||
_d := $(buildprefix)$$(strip $$($(1)_DIR))
|
||
_srcs := $$(sort $$(foreach src, $$($(1)_SOURCES), $$(src)))
|
||
$(1)_OBJS := $$(addprefix $(buildprefix), $$(addsuffix .o, $$(basename $$(_srcs))))
|
||
_libs := $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_PATH))
|
||
|
||
ifdef HOST_CYGWIN
|
||
$(1)_INSTALL_DIR ?= $$(bindir)
|
||
else
|
||
$(1)_INSTALL_DIR ?= $$(libdir)
|
||
endif
|
||
|
||
$(1)_LDFLAGS_USE :=
|
||
$(1)_LDFLAGS_USE_INSTALLED :=
|
||
$(1)_LIB_CLOSURE := $(1)
|
||
|
||
$$(eval $$(call create-dir, $$(_d)))
|
||
|
||
ifeq ($(BUILD_SHARED_LIBS), 1)
|
||
|
||
ifdef $(1)_ALLOW_UNDEFINED
|
||
ifdef HOST_DARWIN
|
||
$(1)_LDFLAGS += -undefined suppress -flat_namespace
|
||
endif
|
||
else
|
||
# -Wl,-z,defs is broken with sanitizers on Linux/clang at least.
|
||
endif
|
||
|
||
ifndef HOST_DARWIN
|
||
$(1)_LDFLAGS += -Wl,-soname=$$($(1)_NAME).$(SO_EXT)
|
||
endif
|
||
|
||
$(1)_PATH := $$(_d)/$$($(1)_NAME).$(SO_EXT)
|
||
|
||
$$($(1)_PATH): $$($(1)_OBJS) $$(_libs) | $$(_d)/
|
||
+$$(trace-ld) $(CXX) -o $$(abspath $$@) -shared $$(LDFLAGS) $$(GLOBAL_LDFLAGS) $$($(1)_OBJS) $$($(1)_LDFLAGS) $$($(1)_LDFLAGS_PROPAGATED) $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_LDFLAGS_USE)) $$($(1)_LDFLAGS_UNINSTALLED)
|
||
|
||
ifndef HOST_DARWIN
|
||
$(1)_LDFLAGS_USE += -Wl,-rpath,$$(abspath $$(_d))
|
||
endif
|
||
$(1)_LDFLAGS_USE += -L$$(_d) -l$$(patsubst lib%,%,$$(strip $$($(1)_NAME)))
|
||
|
||
$(1)_INSTALL_PATH := $(DESTDIR)$$($(1)_INSTALL_DIR)/$$($(1)_NAME).$(SO_EXT)
|
||
|
||
_libs_final := $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_INSTALL_PATH))
|
||
|
||
$$(eval $$(call create-dir, $$($(1)_INSTALL_DIR)))
|
||
|
||
$$($(1)_INSTALL_PATH): $$($(1)_OBJS) $$(_libs_final) | $(DESTDIR)$$($(1)_INSTALL_DIR)/
|
||
+$$(trace-ld) $(CXX) -o $$@ -shared $$(LDFLAGS) $$(GLOBAL_LDFLAGS) $$($(1)_OBJS) $$($(1)_LDFLAGS) $$($(1)_LDFLAGS_PROPAGATED) $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_LDFLAGS_USE_INSTALLED))
|
||
|
||
$(1)_LDFLAGS_USE_INSTALLED += -L$$(DESTDIR)$$($(1)_INSTALL_DIR) -l$$(patsubst lib%,%,$$(strip $$($(1)_NAME)))
|
||
ifndef HOST_DARWIN
|
||
ifeq ($(SET_RPATH_TO_LIBS), 1)
|
||
$(1)_LDFLAGS_USE_INSTALLED += -Wl,-rpath,$$($(1)_INSTALL_DIR)
|
||
else
|
||
$(1)_LDFLAGS_USE_INSTALLED += -Wl,-rpath-link,$$($(1)_INSTALL_DIR)
|
||
endif
|
||
endif
|
||
|
||
ifdef $(1)_FORCE_INSTALL
|
||
install: $$($(1)_INSTALL_PATH)
|
||
endif
|
||
|
||
else
|
||
|
||
$(1)_PATH := $$(_d)/$$($(1)_NAME).a
|
||
|
||
$$($(1)_PATH): $$($(1)_OBJS) | $$(_d)/
|
||
$$(trace-ld) $(LD) $$(ifndef $(HOST_DARWIN),-U) -r -o $$(_d)/$$($(1)_NAME).o $$^
|
||
$$(trace-ar) $(AR) crs $$@ $$(_d)/$$($(1)_NAME).o
|
||
|
||
$(1)_LDFLAGS_USE += $$($(1)_PATH) $$($(1)_LDFLAGS) $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_LDFLAGS_USE))
|
||
|
||
$(1)_INSTALL_PATH := $$(libdir)/$$($(1)_NAME).a
|
||
|
||
$(1)_LIB_CLOSURE += $$($(1)_LIBS)
|
||
|
||
endif
|
||
|
||
$(1)_LDFLAGS_USE += $$($(1)_LDFLAGS_PROPAGATED)
|
||
$(1)_LDFLAGS_USE_INSTALLED += $$($(1)_LDFLAGS_PROPAGATED)
|
||
|
||
# Propagate CFLAGS and CXXFLAGS to the individual object files.
|
||
$$(foreach obj, $$($(1)_OBJS), $$(eval $$(obj)_CFLAGS=$$($(1)_CFLAGS)))
|
||
$$(foreach obj, $$($(1)_OBJS), $$(eval $$(obj)_CXXFLAGS=$$($(1)_CXXFLAGS)))
|
||
|
||
# Make each object file depend on the common dependencies.
|
||
$$(foreach obj, $$($(1)_OBJS), $$(eval $$(obj): $$($(1)_COMMON_DEPS) $$(GLOBAL_COMMON_DEPS)))
|
||
|
||
# Make each object file have order-only dependencies on the common
|
||
# order-only dependencies. This includes the order-only dependencies
|
||
# of libraries we're depending on.
|
||
$(1)_ORDER_AFTER_CLOSED = $$($(1)_ORDER_AFTER) $$(foreach lib, $$($(1)_LIBS), $$($$(lib)_ORDER_AFTER_CLOSED))
|
||
|
||
$$(foreach obj, $$($(1)_OBJS), $$(eval $$(obj): | $$($(1)_ORDER_AFTER_CLOSED) $$(GLOBAL_ORDER_AFTER)))
|
||
|
||
# Include .dep files, if they exist.
|
||
$(1)_DEPS := $$(foreach fn, $$($(1)_OBJS), $$(call filename-to-dep, $$(fn)))
|
||
-include $$($(1)_DEPS)
|
||
|
||
ifndef $(1)_EXCLUDE_FROM_LIBRARY_LIST
|
||
libs-list += $$($(1)_PATH)
|
||
endif
|
||
clean-files += $$(_d)/*.a $$(_d)/*.$(SO_EXT) $$(_d)/*.o $$(_d)/.*.dep $$($(1)_DEPS) $$($(1)_OBJS)
|
||
endef
|