diff --git a/Compiler/H5root/1/H5root b/Compiler/H5root/1/H5root new file mode 100644 index 0000000..55f34a2 --- /dev/null +++ b/Compiler/H5root/1/H5root @@ -0,0 +1,13 @@ +#!/bin/bash + +CPLUS_INCLUDE_PATH="@PREFIX@/include:@ROOT_PREFIX@/include" + +declare -r progname=$(basename "$0") + +declare -a args=() + +if [[ "${progname}" == "roger" ]]; then + args+=( "--roger" ) +fi + +"@PREFIX@/bin/H5root.bin" "${args[@]}" "$@" diff --git a/Compiler/H5root/1/variants b/Compiler/H5root/1/variants index 7edd57b..aa89c2a 100644 --- a/Compiler/H5root/1/variants +++ b/Compiler/H5root/1/variants @@ -1,3 +1,10 @@ -H5root/1.2.0 stable b:autoconf/2.69 b:automake/1.14 b:libtool/2.4.2 gcc/4.7.4 hdf5_serial/1.8.12 b:H5hut_serial/1.99.13 root/5.34.19 -H5root/1.2.0 stable b:autoconf/2.69 b:automake/1.14 b:libtool/2.4.2 gcc/4.8.3 hdf5_serial/1.8.12 b:H5hut_serial/1.99.13 root/5.34.19 -H5root/1.3.0 unstable b:autoconf/2.69 b:automake/1.14 b:libtool/2.4.2 gcc/4.8.3 hdf5_serial/1.8.12 b:H5hut_serial/1.99.13 root/5.34.19 +H5root/1.2.0 stable b:autoconf/2.69 b:automake/1.14 b:libtool/2.4.2 gcc/4.7.4 hdf5_serial/1.8.12 b:H5hut_serial/1.99.13 root/5.34.19 +H5root/1.2.0 stable b:autoconf/2.69 b:automake/1.14 b:libtool/2.4.2 gcc/4.8.3 hdf5_serial/1.8.12 b:H5hut_serial/1.99.13 root/5.34.19 +H5root/1.3.0 unstable b:autoconf/2.69 b:automake/1.14 b:libtool/2.4.2 gcc/4.8.3 hdf5_serial/1.8.12 b:H5hut_serial/1.99.13 root/5.34.19 +H5root/1.3.2rc2 unstable gcc/5.4.0 b:hdf5_serial/1.8.18 b:H5hut/2.0.0rc3 root/6.08.02 boost/1.62.0 gsl/2.2.1 +H5root/1.3.2rc4 unstable gcc/5.4.0 b:hdf5_serial/1.8.18 b:H5hut/2.0.0rc3 root/6.08.02 boost/1.62.0 gsl/2.2.1 +H5root/1.3.2rc4-1 unstable b:autoconf/2.69 b:automake/1.14 b:libtool/2.4.2 gcc/5.4.0 b:hdf5_serial/1.8.18 b:H5hut/2.0.0rc3 root/6.08.02 boost/1.62.0 gsl/2.2.1 +H5root/1.3.2rc5 unstable b:autoconf/2.69 b:automake/1.14 b:libtool/2.4.2 gcc/5.4.0 b:hdf5_serial/1.8.18 b:H5hut/2.0.0rc3 root/6.08.02 boost/1.62.0 gsl/2.2.1 +H5root/1.3.2rc5-1 unstable b:autoconf/2.69 b:automake/1.14 b:libtool/2.4.2 gcc/5.4.0 b:hdf5_serial/1.8.18 b:H5hut/2.0.0rc3 root/6.08.02 boost/1.62.0 gsl/2.2.1 +H5root/1.3.2 unstable b:autoconf/2.69 b:automake/1.14 b:libtool/2.4.2 gcc/5.4.0 b:hdf5_serial/1.8.18 b:H5hut/2.0.0rc3 root/6.08.02 boost/1.62.0 gsl/2.2.1 +H5root/1.3.4 unstable b:autoconf/2.69 b:automake/1.14 b:libtool/2.4.2 gcc/5.4.0 b:hdf5_serial/1.8.18 b:H5hut/2.0.0rc3 root/6.08.02 boost/1.62.0 gsl/2.2.1 diff --git a/Compiler/H5root/build b/Compiler/H5root/build index 85a3164..a837472 100755 --- a/Compiler/H5root/build +++ b/Compiler/H5root/build @@ -1,6 +1,8 @@ #!/usr/bin/env modbuild -pbuild::pre_configure() { +SOURCE_URL="http://amas.web.psi.ch/Downloads/$P/$P-$V.tar.bz2" + +pbuild::post_prep() { ./autogen.sh } @@ -9,8 +11,42 @@ pbuild::configure() { --prefix="${PREFIX}" } -declare JOBS=1 -pbuild::compile_in_sourcetree +pbuild::post_install() { + # Unfortunatelly we need some fancy post-installation. + # Otherwise it wouldn't be possible to load the modules + # for H5root and OPAL at the same time. The problem is + # the JIT compiler of ROOT and the fact, that we need + # a serial HDF5 for H5root but a parallel for OPAL. + # + # Since ROOT's JIT compiler uses the environment variable + # CPLUS_INCLUDE_PATH to search for header files, the + # content of it is cruciale. In other words: it must be + # guaranteed that the header files of the serial compiled + # HDF5 are used by ROOT's JIT compiler. Since we have no + # influence on the order he modules are loaded, we cannot + # guarantee this without checking and - if required - + # changing the search path. + # + # The simplest solution for this problem is to install + # all required header files of HDF5 and H5hut into the + # include directory of the H5root module and to use a + # wrapper script to set the right search path. + + # rename H5root binary, this will be called by a wrapper + # script. + mv "${PREFIX}/bin/H5root" "${PREFIX}/bin/H5root.bin" + + # install wrapper script and set the right paths + local sed_cmd="s:@PREFIX@:${PREFIX}:g;" + sed_cmd+="s:@HDF5_PREFIX@:${HDF5_SERIAL_PREFIX}:g;" + sed_cmd+="s:@ROOT_PREFIX@:${ROOT_PREFIX}:g;" + sed "${sed_cmd}" "${BUILD_BLOCK_DIR}/${V_MAJOR}/H5root" > "${PREFIX}/bin/H5root" + chmod 0755 "${PREFIX}/bin/H5root" + + # install serial HDF5 and H5hut header files + cp -av "${HDF5_SERIAL_INCLUDE_DIR}/"* "${PREFIX}/include/" + cp -av "${H5HUT_INCLUDE_DIR}/"* "${PREFIX}/include/" +} pbuild::add_to_group 'Compiler' pbuild::make_all diff --git a/Compiler/SuperLU/5/variants b/Compiler/SuperLU/5/variants index 563878d..5070212 100644 --- a/Compiler/SuperLU/5/variants +++ b/Compiler/SuperLU/5/variants @@ -1 +1,2 @@ SuperLU/5.2.1 unstable gcc/4.8.5 b:OpenBLAS/0.2.19 b:cmake/3.6.3 +SuperLU/5.2.1 unstable gcc/5.4.0 b:OpenBLAS/0.2.19 b:cmake/3.6.3 diff --git a/Compiler/UMFPACK/5/variants b/Compiler/UMFPACK/5/variants index 34cd636..29b0cde 100644 --- a/Compiler/UMFPACK/5/variants +++ b/Compiler/UMFPACK/5/variants @@ -3,3 +3,4 @@ UMFPACK/5.6.2 stable gcc/4.8.3 OpenBLAS/0.2.9 UMFPACK/5.6.2 stable gcc/4.8.4 OpenBLAS/0.2.9 UMFPACK/5.6.2 stable gcc/4.9.2 OpenBLAS/0.2.9 UMFPACK/5.6.2 unstable gcc/4.9.3 OpenBLAS/0.2.9 +UMFPACK/5.6.2 unstable gcc/5.4.0 OpenBLAS/0.2.19 diff --git a/Compiler/UMFPACK/build b/Compiler/UMFPACK/build index 2268b34..13ee965 100755 --- a/Compiler/UMFPACK/build +++ b/Compiler/UMFPACK/build @@ -1,5 +1,7 @@ #!/usr/bin/env modbuild +SOURCE_URL="file://$PMODULES_DISTFILESDIR/$P-V.tar.bz2" + pbuild::configure() { cat < "${MODULE_SRCDIR}/SuiteSparse_config/SuiteSparse_config.mk" CF = \$(CFLAGS) \$(CPPFLAGS) \$(TARGET_ARCH) -O3 -fexceptions -fPIC -DNTIMER diff --git a/Compiler/UMFPACK/modulefile b/Compiler/UMFPACK/modulefile index fd26acc..9c0c3da 100644 --- a/Compiler/UMFPACK/modulefile +++ b/Compiler/UMFPACK/modulefile @@ -11,6 +11,6 @@ Ax=b, using the Unsymmetric MultiFrontal method. Written in ANSI/ISO C, with a MATLAB (Version 6.0 and later) interface. Appears as a built-in routine (for lu, backslash, and forward slash) in MATLAB. Includes a MATLAB interface, a C-callable interface, and a Fortran-callable interface. Note -that "UMFPACK" is pronounced in two syllables, "Umph Pack". It is not "You -Em Ef Pack". +that 'UMFPACK' is pronounced in two syllables, 'Umph Pack'. It is not 'You +Em Ef Pack'. " diff --git a/Compiler/atlas/modulefile b/Compiler/atlas/modulefile index 0aa7a3b..9f75337 100644 --- a/Compiler/atlas/modulefile +++ b/Compiler/atlas/modulefile @@ -4,7 +4,7 @@ module-whatis "efficient BLAS and partial LAPACK implementation" module-url "http://math-atlas.sourceforge.net/" module-license "BSD-style license" module-maintainer "Achim Gsell " -mdoule-help " +module-help " The ATLAS (Automatically Tuned Linear Algebra Software) project is an ongoing research effort focusing on applying empirical techniques in order to provide portable performance. At present, it provides C and diff --git a/Compiler/boost/1/variants b/Compiler/boost/1/variants index 3336bf8..baa9993 100644 --- a/Compiler/boost/1/variants +++ b/Compiler/boost/1/variants @@ -4,6 +4,8 @@ boost/1.55.0 stable gcc/4.8.4 b:Python/3.4.0 boost/1.55.0 stable gcc/4.8.5 b:Python/2.7.11 boost/1.55.0 stable gcc/4.9.2 b:Python/3.4.0 +boost/1.57.0 stable gcc/4.8.2 b:Python/3.4.0 + boost/1.58.0 stable gcc/4.8.4 b:Python/3.4.0 boost/1.58.0 stable gcc/4.8.5 b:Python/2.7.11 boost/1.58.0 stable gcc/4.9.3 b:Python/2.7.11 @@ -17,4 +19,6 @@ boost/1.62.0 stable gcc/4.9.4 Python/2.7.12 boost/1.62.0 stable gcc/5.4.0 Python/2.7.12 boost/1.62.0 stable gcc/6.2.0 Python/2.7.12 boost/1.62.0 unstable gcc/6.3.0 Python/2.7.12 +boost/1.62.0 unstable gcc/7.1.0 Python/2.7.12 boost/1.63.0 stable gcc/6.3.0 Python/2.7.12 +boost/1.64.0 unstable gcc/5.4.0 Python/2.7.12 diff --git a/Compiler/clapack/3/variants b/Compiler/clapack/3/variants new file mode 100644 index 0000000..5dce9eb --- /dev/null +++ b/Compiler/clapack/3/variants @@ -0,0 +1 @@ +clapack/3.2.1 unstable gcc/5.4.0 b:cmake/3.6.3 diff --git a/Compiler/clapack/build b/Compiler/clapack/build new file mode 100755 index 0000000..c0f0175 --- /dev/null +++ b/Compiler/clapack/build @@ -0,0 +1,22 @@ +#!/usr/bin/env modbuild +# + +SOURCE_URL="http://www.netlib.org/$P/$P-$V-CMAKE.tgz" + +pbuild::configure() { + cmake -DCMAKE_INSTALL_PREFIX:PATH=$PREFIX \ + "${MODULE_SRCDIR}" \ + || exit 1 +} + +pbuild::install() { + mkdir -p "${PREFIX}/include" + mkdir -p "${PREFIX}/lib" + install -m 0644 "${MODULE_BUILDDIR}/F2CLIBS/libf2c/libf2c.a" "${PREFIX}/lib" + install -m 0644 "${MODULE_BUILDDIR}/SRC/liblapack.a" "${PREFIX}/lib" +} + +pbuild::add_to_group 'Compiler' +pbuild::set_docfiles 'COPYING' +pbuild::make_all + diff --git a/Compiler/clapack/modulefile b/Compiler/clapack/modulefile new file mode 100644 index 0000000..20a3bc7 --- /dev/null +++ b/Compiler/clapack/modulefile @@ -0,0 +1,10 @@ +#%Module1.0 + +module-whatis "CLAPACK - f2c'ed version of LAPACK" +module-url "http://www.netlib.org/clapack/" +module-license "See: $PREFIX/share/doc/COPYING" +module-maintainer "Achim Gsell " + +module-help " + +" diff --git a/Compiler/eigen3/3/variants b/Compiler/eigen3/3/variants new file mode 100644 index 0000000..59fe042 --- /dev/null +++ b/Compiler/eigen3/3/variants @@ -0,0 +1 @@ +eigen/3.3.4 unstable gcc/5.4.0 b:cmake/3.6.3 b:mpfr/3.1.5 b:gmp/6.1.2 b:UMFPACK/5.6.2 b:boost/1.62.0 b:SuperLU/5.2.1 diff --git a/Compiler/eigen3/build b/Compiler/eigen3/build new file mode 100755 index 0000000..f69eef1 --- /dev/null +++ b/Compiler/eigen3/build @@ -0,0 +1,29 @@ +#!/usr/bin/env modbuild +# +# Notes: +# On Mac OS X VTK does not compile out of the box with self-compiled GCC. +# grep for "long-branch" and "pascal-string" in the cmake configuration +# and remove these strings. +# + +SOURCE_URL="http://bitbucket.org/eigen/eigen/get/${V_MAJOR}.${V_MINOR}.${V_PATCHLVL}.tar.bz2" + +pbuild::configure() { + export BOOST_ROOT="${BOOST_PREFIX}" + config_args=() + config_args+=( "-DUMFPACK_INCLUDES=${UMFPACK_INCLUDE_DIR}" ) + config_args+=( "-DUMFPACK_LIBRARIES=${UMFPACK_LIBRARY_DIR}" ) + config_args+=( "-DGMP_INCLUDES=${GMP_INCLUDE_DIR}" ) + config_args+=( "-DGMP_LIBRARIES=${GMP_LIBRARY_DIR}" ) + config_args+=( "-DMPFR_INCLUDES=${MPFR_INCLUDE_DIR}" ) + config_args+=( "-DMPFR_LIBRARIES=${MPFR_LIBRARY_DIR}" ) + config_args+=( "-DSUPERLU_INCLUDES=${SUPERLU_INCLUDE_DIR}" ) + config_args+=( "-DSUPERLU_LIBRARIES=${SUPERLU_LIBRARY_DIR}" ) + cmake -DCMAKE_INSTALL_PREFIX:PATH=$PREFIX \ + "${config_args[@]}" \ + "${MODULE_SRCDIR}" +} + +pbuild::add_to_group 'Compiler' +pbuild::make_all + diff --git a/Compiler/eigen3/modulefile b/Compiler/eigen3/modulefile new file mode 100644 index 0000000..5e4e3fa --- /dev/null +++ b/Compiler/eigen3/modulefile @@ -0,0 +1,11 @@ +#%Module1.0 + +module-whatis "a C++ template library for linear algebra:" +module-url "http://eigen.tuxfamily.org/" +module-license "Mozilla Public License Version 2.0" +module-maintainer "Achim Gsell " + +module-help " +Eigen is a C++ template library for linear algebra: matrices, vectors, +numerical solvers, and related algorithms. +" diff --git a/Compiler/hdf5_serial/1/variants b/Compiler/hdf5_serial/1/variants index 78cb1db..8cc17ec 100644 --- a/Compiler/hdf5_serial/1/variants +++ b/Compiler/hdf5_serial/1/variants @@ -34,3 +34,22 @@ hdf5_serial/1.8.18 stable gcc/4.9.4 hdf5_serial/1.8.18 stable gcc/5.4.0 hdf5_serial/1.8.18 stable gcc/6.2.0 hdf5_serial/1.8.18 stable gcc/6.3.0 +hdf5_serial/1.8.18 stable gcc/7.2.0 + +hdf5_serial/1.8.19 stable gcc/4.8.5 +hdf5_serial/1.8.19 stable gcc/4.9.4 +hdf5_serial/1.8.19 stable gcc/5.4.0 +hdf5_serial/1.8.19 stable gcc/6.3.0 +hdf5_serial/1.8.19 stable gcc/7.2.0 + +hdf5_serial/1.10.1 stable gcc/4.8.5 +hdf5_serial/1.10.1 stable gcc/4.9.4 +hdf5_serial/1.10.1 stable gcc/5.4.0 +hdf5_serial/1.10.1 stable gcc/6.3.0 +hdf5_serial/1.10.1 stable gcc/7.2.0 + +hdf5_serial/1.10.1 unstable intel/17.1 +hdf5_serial/1.10.1 stable intel/17.4 + +hdf5_serial/1.10.1 unstable pgi/17.3 +hdf5_serial/1.10.1 unstable pgi/17.7 diff --git a/Compiler/hdf5_serial/build b/Compiler/hdf5_serial/build index 2c1f42c..443c17f 100755 --- a/Compiler/hdf5_serial/build +++ b/Compiler/hdf5_serial/build @@ -1,6 +1,11 @@ #!/usr/bin/env modbuild pbuild::configure() { + test "$(basename "$CPP")" = "pgprepro" && { + CPP=cpp + CXX=g++ + echo "INFO: substituted pgprepro with cpp, and pgc++ with g++!" + } "${MODULE_SRCDIR}"/configure \ --prefix="${PREFIX}" \ --enable-shared \ diff --git a/Compiler/openmpi/2.1/variants.Linux b/Compiler/openmpi/2.1/variants.Linux index c1a6228..2575134 100644 --- a/Compiler/openmpi/2.1/variants.Linux +++ b/Compiler/openmpi/2.1/variants.Linux @@ -1 +1,6 @@ +openmpi/2.1.1 stable gcc/6.4.0 openmpi/2.1.0 stable gcc/7.1.0 +openmpi/2.1.1 stable gcc/7.2.0 + +openmpi/2.1.1 unstable intel/17.1 +openmpi/2.1.1 stable intel/17.4 diff --git a/Compiler/root/build6 b/Compiler/root/build6 index 74abbf4..dc1cba1 100755 --- a/Compiler/root/build6 +++ b/Compiler/root/build6 @@ -3,13 +3,15 @@ SOURCE_URL="https://root.cern.ch/download/root_v${V_MAJOR}.${V_MINOR}.${V_PATCHLVL}.source.tar.gz" declare -a EXTRA_LIBS=() -config_args='' +config_args=() case ${OS} in Darwin ) # cocoa doesn't work with GCC!? - config_args+=' -Dcocoa=OFF' - config_args+=' -Dx11=ON' + config_args+=( '-Dcocoa=OFF' ) + config_args+=( '-Dx11=ON' ) + config_args+=( '-DCMAKE_OSX_SYSROOT=/' ) + config_args+=( "-DCMAKE_OSX_DEPLOYMENT_TARGET=''" ) ;; Linux ) INSTANTCLIENT_INCLUDE_DIR='/usr/lib/oracle/12.1/client64/include' @@ -18,10 +20,10 @@ Linux ) CXX_INCLUDE_PATH+=":${INSTANTCLIENT_INCLUDE_DIR}" CPLUS_INCLUDE_PATH+=":${INSTANTCLIENT_INCLUDE_DIR}" LIBRARY_DIR+=":${INSTANTCLIENT_LIBRARY_DIR}" - config_args+=" -Doracle=ON" - config_args+=" -DORACLE_PATH_INCLUDES=${INSTANTCLIENT_INCLUDE_DIR}" - config_args+=" -DORACLE_PATH_LIB=${INSTANTCLIENT_LIBRARY_DIR}" - config_args+=" -DORACLE_OCI_VERSION=10G_R2" + config_args+=( "-Doracle=ON" ) + config_args+=( "-DORACLE_PATH_INCLUDES=${INSTANTCLIENT_INCLUDE_DIR}" ) + config_args+=( "-DORACLE_PATH_LIB=${INSTANTCLIENT_LIBRARY_DIR}" ) + config_args+=( "-DORACLE_OCI_VERSION=10G_R2" ) ;; *) std:die 1 "${OS} is not supported" @@ -34,7 +36,7 @@ pbuild::patch_sources_Linux() { pbuild::configure() { cmake "${MODULE_SRCDIR}" \ - ${config_args} \ + "${config_args[@]}" \ -DCMAKE_INSTALL_PREFIX="${PREFIX}" \ || exit 1 sed -i.bak "s:${MODULE_SRCDIR//\/\///}/root.exe:${MODULE_BUILDDIR//\/\///}/bin/root.exe:" CMakeFiles/hsimple.dir/build.make diff --git a/Compiler/vtk/8/variants.Linux b/Compiler/vtk/8/variants.Linux new file mode 100644 index 0000000..580fb68 --- /dev/null +++ b/Compiler/vtk/8/variants.Linux @@ -0,0 +1 @@ +vtk/8.0.0 unstable b:cmake/3.6.3 gcc/5.4.0 diff --git a/Compiler/vtk/build b/Compiler/vtk/build index 2760004..752ceca 100755 --- a/Compiler/vtk/build +++ b/Compiler/vtk/build @@ -2,7 +2,7 @@ # # Notes: # On Mac OS X VTK does not compile out of the box with self-compiled GCC. -# grep vor "long-branch" and "pascal-string" in the cmake configuration +# grep for "long-branch" and "pascal-string" in the cmake configuration # and remove these strings. # diff --git a/Libraries/mpfr/4/variants b/Libraries/mpfr/4/variants new file mode 100644 index 0000000..cec1cb1 --- /dev/null +++ b/Libraries/mpfr/4/variants @@ -0,0 +1 @@ +mpfr/4.0.0 stable b:gmp/6.1.2 diff --git a/Libraries/mpfr/build b/Libraries/mpfr/build index b96abb2..44dcb18 100755 --- a/Libraries/mpfr/build +++ b/Libraries/mpfr/build @@ -1,6 +1,6 @@ #!/usr/bin/env modbuild -SOURCE_URL="http://www.mpfr.org/$P-current/$P-$V.tar.gz" +SOURCE_URL="http://www.mpfr.org/$P-$V/$P-$V.tar.gz" pbuild::configure() { "${MODULE_SRCDIR}"/configure \ diff --git a/MPI/OPAL/1.6/variants b/MPI/OPAL/1.6/variants index 783c6a3..3e73d86 100644 --- a/MPI/OPAL/1.6/variants +++ b/MPI/OPAL/1.6/variants @@ -1,3 +1,8 @@ OPAL/1.6.0rc1 unstable gcc/5.4.0 openmpi/1.10.4 boost/1.62.0 hdf5/1.8.18 H5hut/2.0.0rc3 gsl/2.2.1 trilinos/12.10.1 cuda/8.0.44 dks/1.1.1 b:cmake/3.6.3 b:OpenBLAS/0.2.19 OPAL/1.6.0rc2 unstable gcc/5.4.0 openmpi/1.10.4 boost/1.62.0 hdf5/1.8.18 H5hut/2.0.0rc3 gsl/2.2.1 trilinos/12.10.1 cuda/8.0.44 dks/1.1.1 b:cmake/3.6.3 b:OpenBLAS/0.2.19 - +OPAL/1.6.0rc3 unstable gcc/5.4.0 openmpi/1.10.4 boost/1.62.0 hdf5/1.8.18 H5hut/2.0.0rc3 gsl/2.2.1 trilinos/12.10.1 cuda/8.0.44 dks/1.1.2 b:cmake/3.6.3 b:OpenBLAS/0.2.19 +OPAL/1.6.0rc4 unstable gcc/5.4.0 openmpi/1.10.4 boost/1.62.0 hdf5/1.8.18 H5hut/2.0.0rc3 gsl/2.2.1 trilinos/12.10.1 cuda/8.0.44 dks/1.1.2 b:cmake/3.6.3 b:OpenBLAS/0.2.19 +OPAL/1.6.0rc5 unstable gcc/5.4.0 openmpi/1.10.4 boost/1.62.0 hdf5/1.8.18 H5hut/2.0.0rc3 gsl/2.2.1 trilinos/12.10.1 cuda/8.0.44 dks/1.1.2 b:cmake/3.6.3 b:OpenBLAS/0.2.19 +OPAL/1.6.0rc6 unstable gcc/5.4.0 openmpi/1.10.4 boost/1.62.0 hdf5/1.8.18 H5hut/2.0.0rc3 gsl/2.2.1 trilinos/12.10.1 cuda/8.0.44 dks/1.1.2 b:cmake/3.6.3 b:OpenBLAS/0.2.19 +OPAL/1.6.0 stable gcc/5.4.0 openmpi/1.10.4 boost/1.62.0 hdf5/1.8.18 H5hut/2.0.0rc3 gsl/2.2.1 trilinos/12.10.1 cuda/8.0.44 dks/1.1.2 b:cmake/3.6.3 b:OpenBLAS/0.2.19 +OPAL/1.6.1 unstable gcc/5.4.0 openmpi/1.10.4 boost/1.62.0 hdf5/1.8.18 H5hut/2.0.0rc3 gsl/2.2.1 trilinos/12.10.1 cuda/8.0.44 dks/1.1.2 b:cmake/3.6.3 b:OpenBLAS/0.2.19 diff --git a/MPI/OPAL/build b/MPI/OPAL/build index a569054..3ba06d5 100755 --- a/MPI/OPAL/build +++ b/MPI/OPAL/build @@ -1,5 +1,7 @@ #!/usr/bin/env modbuild +SOURCE_URL='http://amas.web.psi.ch/Downloads/OPAL/OPAL-1.6.0rc6.tar.bz2' + config_args=() case ${OS} in @@ -15,7 +17,7 @@ esac pbuild::configure() { cmake \ -DCMAKE_INSTALL_PREFIX="${PREFIX}" \ - -DCMAKE_BUILD_TYPE=RELEASE \ + -DCMAKE_BUILD_TYPE=Release \ -DENABLE_SAAMG_SOLVER=TRUE \ "${config_args[@]}" \ "${MODULE_SRCDIR}" diff --git a/MPI/OPAL/modulefile b/MPI/OPAL/modulefile index 3fdb260..2ff1e1e 100644 --- a/MPI/OPAL/modulefile +++ b/MPI/OPAL/modulefile @@ -1,7 +1,7 @@ #%Module1.0 # OPAL_PREFIX is also used by OpenMPI! -module-dont-setenv { OPAL_PREFIX } +set dont-setenv { OPAL_PREFIX } module-whatis "Object Oriented Particle Accelerator Library" module-url "http://amas.psi.ch/OPAL" diff --git a/MPI/dks/1/variants b/MPI/dks/1/variants index f6636a5..ff455aa 100644 --- a/MPI/dks/1/variants +++ b/MPI/dks/1/variants @@ -4,3 +4,4 @@ dks/1.0.1 unstable gcc/5.4.0 openmpi/1.10.4 boost/1.62.0 cuda/8.0.44 b:cmake/3.6 dks/1.0.2 unstable gcc/5.4.0 openmpi/1.10.4 boost/1.62.0 cuda/8.0.44 b:cmake/3.6.3 dks/1.1.0 unstable gcc/5.4.0 openmpi/1.10.4 boost/1.62.0 cuda/8.0.44 b:cmake/3.6.3 dks/1.1.1 unstable gcc/5.4.0 openmpi/1.10.4 boost/1.62.0 cuda/8.0.44 b:cmake/3.6.3 +dks/1.1.2 unstable gcc/5.4.0 openmpi/1.10.4 boost/1.62.0 cuda/8.0.44 b:cmake/3.6.3 diff --git a/MPI/dks/build b/MPI/dks/build index 7c8de63..8bbcd6c 100755 --- a/MPI/dks/build +++ b/MPI/dks/build @@ -6,6 +6,13 @@ conf=() if (( ${vers[0]} >= 1 && ${vers[1]} >= 1 )); then conf+=("-DDKS_FULL=ON") fi +if (( ${vers[0]} >= 1 && ${vers[1]} >= 1 && ${vers[2]} >= 2 )); then + # if we want to link OPAL with static cuda libraries, we + # cannot use DKS_FULL=ON. This must be fixed in DKS. + conf=() + conf+=("-DENABLE_OPAL=ON") + conf+=("-DSTATIC_CUDA=1") +fi pbuild::configure() { export CXX=mpicxx diff --git a/MPI/elegant/modulefile b/MPI/elegant/modulefile new file mode 100644 index 0000000..3f4eb34 --- /dev/null +++ b/MPI/elegant/modulefile @@ -0,0 +1,23 @@ +#%Module1.0 + +module-whatis "an accelerator modeling code th" +module-url "http://www.aps.anl.gov/Accelerator_Systems_Division/Accelerator_Operations_Physics/elegant.html" +module-license "See: http://www.aps.anl.gov/epics/license/index.php" +module-maintainer "Achim Gsell " + +module-help " +elegant is an accelerator modeling code that performs many functions. Its +basic function is 6D tracking, which it performs using matrices (up to +second order), symplectic integration, numerical integration, or a user- +defined mixture. It computes Twiss parameters, transport matrices, radiation +integrals, correction matrices, amplification factors, and floor coordinates. +It also performs optimization, including optimization of radiation integrals, +floor coordinates, transport matrices, and beam properties from tracking. A +number of time-dependent elements are supported, such as rf cavities, kickers, +and ramping machines. The code provides simulation of various collective +effects, such as wakes and coherent synchrotron radiation. +" + +setenv RPN_DEFNS $PREFIX/RPN-DEFNS +setenv HOST_ARCH linux-x86_64 +setenv EPICS_HOST_ARCH linux-x86_64 diff --git a/MPI/gromacs/2016/variants b/MPI/gromacs/2016/variants new file mode 100644 index 0000000..7b9fec9 --- /dev/null +++ b/MPI/gromacs/2016/variants @@ -0,0 +1 @@ +gromacs/2016.4 unstable gcc/5.4.0 openmpi/1.10.4 b:cmake/3.6.3 diff --git a/MPI/gromacs/4/variants b/MPI/gromacs/4/variants new file mode 100644 index 0000000..6316eb9 --- /dev/null +++ b/MPI/gromacs/4/variants @@ -0,0 +1 @@ +gromacs/4.6.7 unstable gcc/4.8.4 openmpi/1.8.4 diff --git a/MPI/gromacs/5/variants b/MPI/gromacs/5/variants new file mode 100644 index 0000000..6c972ea --- /dev/null +++ b/MPI/gromacs/5/variants @@ -0,0 +1,3 @@ +gromacs/5.0.4 unstable gcc/4.8.4 openmpi/1.8.4 +gromacs/5.0.5 unstable gcc/4.9.2 openmpi/1.8.4 +gromacs/5.1.2 unstable gcc/4.9.3 openmpi/1.10.0 diff --git a/MPI/gromacs/build b/MPI/gromacs/build index d97f124..78bfb81 100755 --- a/MPI/gromacs/build +++ b/MPI/gromacs/build @@ -1,20 +1,20 @@ #!/usr/bin/env modbuild +SOURCE_URL="http://ftp.gromacs.org/pub/$P/$P-$V.tar.gz" + pbuild::configure() { cmake \ -DCMAKE_INSTALL_PREFIX="${PREFIX}" \ -DCMAKE_BUILD_TYPE=RELEASE \ -DGMX_MPI=on \ -DGMX_GPU=off \ + -DGMX_SIMD=SSE2 \ -DGMX_BUILD_OWN_FFTW=on \ "${MODULE_SRCDIR}" \ || exit 1 } - pbuild::add_to_group 'MPI' -pbuild::set_runtime_dependencies "${COMPILER}" "${MPI}" -pbuild::set_build_dependencies "${COMPILER}" "${MPI}" cmake pbuild::set_docfiles \ AUTHORS \ COPYING \ diff --git a/MPI/lammps/2017/variants b/MPI/lammps/2017/variants new file mode 100644 index 0000000..03d1f38 --- /dev/null +++ b/MPI/lammps/2017/variants @@ -0,0 +1 @@ +lammps/2017.8 unstable gcc/5.4.0 openmpi/1.10.4 diff --git a/MPI/lammps/build b/MPI/lammps/build new file mode 100755 index 0000000..df7bb75 --- /dev/null +++ b/MPI/lammps/build @@ -0,0 +1,26 @@ +#!/usr/bin/env modbuild + +SOURCE_URL="lammps-2017.8.tar.gz" + +pbuild::compile_in_sourcetree + +pbuild::configure() { + cp -v "${BUILD_BLOCK_DIR}/files/Makefile.PSI" "${MODULE_BUILDDIR}/src/MAKE/MINE" +} + +pbuild::build() { + make -C src PSI +} + +pbuild::install() { + install -m 0755 -d "${PREFIX}/bin" + install -m 0755 "${MODULE_BUILDDIR}/src/lmp_PSI" "${PREFIX}/bin/lmp_omp" + strip "${PREFIX}/bin/lmp_omp" +} + +pbuild::add_to_group 'MPI' +pbuild::set_docfiles \ + LICENSE \ + README +pbuild::make_all + diff --git a/MPI/lammps/files/Makefile.PSI b/MPI/lammps/files/Makefile.PSI new file mode 100644 index 0000000..5c25c8e --- /dev/null +++ b/MPI/lammps/files/Makefile.PSI @@ -0,0 +1,120 @@ +# omp = USER-OMP package, MPI with its default compiler + +SHELL = /bin/sh + +# --------------------------------------------------------------------- +# compiler/linker settings +# specify flags and libraries needed for your compiler + +CC = mpicxx +CCFLAGS = -g -O3 -fopenmp +SHFLAGS = -fPIC +DEPFLAGS = -M + +LINK = mpicxx +LINKFLAGS = -g -O -fopenmp +LIB = +SIZE = size + +ARCHIVE = ar +ARFLAGS = -rc +SHLIBFLAGS = -shared + +# --------------------------------------------------------------------- +# LAMMPS-specific settings, all OPTIONAL +# specify settings for LAMMPS features you will use +# if you change any -D setting, do full re-compile after "make clean" + +# LAMMPS ifdef settings +# see possible settings in Section 2.2 (step 4) of manual + +LMP_INC = -DLAMMPS_GZIP + +# MPI library +# see discussion in Section 2.2 (step 5) of manual +# MPI wrapper compiler/linker can provide this info +# can point to dummy MPI library in src/STUBS as in Makefile.serial +# use -D MPICH and OMPI settings in INC to avoid C++ lib conflicts +# INC = path for mpi.h, MPI compiler settings +# PATH = path for MPI library +# LIB = name of MPI library + +MPI_INC = -DMPICH_SKIP_MPICXX -DOMPI_SKIP_MPICXX=1 +MPI_PATH = +MPI_LIB = + +# FFT library +# see discussion in Section 2.2 (step 6) of manual +# can be left blank to use provided KISS FFT library +# INC = -DFFT setting, e.g. -DFFT_FFTW, FFT compiler settings +# PATH = path for FFT library +# LIB = name of FFT library + +FFT_INC = +FFT_PATH = +FFT_LIB = + +# JPEG and/or PNG library +# see discussion in Section 2.2 (step 7) of manual +# only needed if -DLAMMPS_JPEG or -DLAMMPS_PNG listed with LMP_INC +# INC = path(s) for jpeglib.h and/or png.h +# PATH = path(s) for JPEG library and/or PNG library +# LIB = name(s) of JPEG library and/or PNG library + +JPG_INC = +JPG_PATH = +JPG_LIB = + +# --------------------------------------------------------------------- +# build rules and dependencies +# do not edit this section + +include Makefile.package.settings +include Makefile.package + +EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) +EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) +EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS) +EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS) + +# Path to src files + +vpath %.cpp .. +vpath %.h .. + +# Link target + +$(EXE): $(OBJ) $(EXTRA_LINK_DEPENDS) + $(LINK) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(EXTRA_LIB) $(LIB) -o $(EXE) + $(SIZE) $(EXE) + +# Library targets + +lib: $(OBJ) $(EXTRA_LINK_DEPENDS) + $(ARCHIVE) $(ARFLAGS) $(EXE) $(OBJ) + +shlib: $(OBJ) $(EXTRA_LINK_DEPENDS) + $(CC) $(CCFLAGS) $(SHFLAGS) $(SHLIBFLAGS) $(EXTRA_PATH) -o $(EXE) \ + $(OBJ) $(EXTRA_LIB) $(LIB) + +# Compilation rules + +%.o:%.cpp $(EXTRA_CPP_DEPENDS) + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) -c $< + +%.d:%.cpp $(EXTRA_CPP_DEPENDS) + $(CC) $(CCFLAGS) $(EXTRA_INC) $(DEPFLAGS) $< > $@ + +%.o:%.cu $(EXTRA_CPP_DEPENDS) + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) -c $< + +# Individual dependencies + +depend : fastdep.exe $(SRC) + @./fastdep.exe $(EXTRA_INC) -- $^ > .depend || exit 1 + +fastdep.exe: ../DEPEND/fastdep.c + cc -O -o $@ $< + +sinclude .depend diff --git a/MPI/lammps/modulefile b/MPI/lammps/modulefile new file mode 100644 index 0000000..3f4eb34 --- /dev/null +++ b/MPI/lammps/modulefile @@ -0,0 +1,23 @@ +#%Module1.0 + +module-whatis "an accelerator modeling code th" +module-url "http://www.aps.anl.gov/Accelerator_Systems_Division/Accelerator_Operations_Physics/elegant.html" +module-license "See: http://www.aps.anl.gov/epics/license/index.php" +module-maintainer "Achim Gsell " + +module-help " +elegant is an accelerator modeling code that performs many functions. Its +basic function is 6D tracking, which it performs using matrices (up to +second order), symplectic integration, numerical integration, or a user- +defined mixture. It computes Twiss parameters, transport matrices, radiation +integrals, correction matrices, amplification factors, and floor coordinates. +It also performs optimization, including optimization of radiation integrals, +floor coordinates, transport matrices, and beam properties from tracking. A +number of time-dependent elements are supported, such as rf cavities, kickers, +and ramping machines. The code provides simulation of various collective +effects, such as wakes and coherent synchrotron radiation. +" + +setenv RPN_DEFNS $PREFIX/RPN-DEFNS +setenv HOST_ARCH linux-x86_64 +setenv EPICS_HOST_ARCH linux-x86_64 diff --git a/MPI/parmetis/4/variants b/MPI/parmetis/4/variants index 8e9f2e5..eb3a2e1 100644 --- a/MPI/parmetis/4/variants +++ b/MPI/parmetis/4/variants @@ -1,3 +1,4 @@ +parmetis/4.0.3 stable gcc/4.8.2 openmpi/1.6.5 b:cmake/3.4.1 parmetis/4.0.3 stable gcc/4.8.5 openmpi/1.10.2 b:cmake/3.4.1 parmetis/4.0.3 stable gcc/4.9.4 openmpi/1.10.2 b:cmake/3.4.1 parmetis/4.0.3 stable gcc/5.3.0 openmpi/1.10.2 b:cmake/3.4.1 diff --git a/MPI/trilinos/12/variants b/MPI/trilinos/12/variants index 66e2610..b607d06 100644 --- a/MPI/trilinos/12/variants +++ b/MPI/trilinos/12/variants @@ -1,9 +1,15 @@ +trilinos/12.2.1 unstable gcc/4.8.2 openmpi/1.6.5 hdf5/1.8.12 b:cmake/3.6.3 b:OpenBLAS/0.2.9 b:parmetis/4.0.3 + trilinos/12.8.1 stable gcc/4.8.5 openmpi/1.10.4 b:cmake/3.6.3 b:OpenBLAS/0.2.19 b:parmetis/4.0.3 trilinos/12.8.1 stable gcc/4.9.4 openmpi/1.10.4 b:cmake/3.6.3 b:OpenBLAS/0.2.19 b:parmetis/4.0.3 trilinos/12.8.1 stable gcc/5.4.0 openmpi/1.10.4 b:cmake/3.6.3 b:OpenBLAS/0.2.19 b:parmetis/4.0.3 trilinos/12.8.1 stable gcc/6.2.0 openmpi/1.10.4 b:cmake/3.6.3 b:OpenBLAS/0.2.19 b:parmetis/4.0.3 -trilinos/12.10.1 unstable gcc/4.8.5 openmpi/1.10.4 b:cmake/3.6.3 b:OpenBLAS/0.2.19 b:parmetis/4.0.3 -trilinos/12.10.1 unstable gcc/4.9.4 openmpi/1.10.4 b:cmake/3.6.3 b:OpenBLAS/0.2.19 b:parmetis/4.0.3 -trilinos/12.10.1 unstable gcc/5.4.0 openmpi/1.10.4 b:cmake/3.6.3 b:OpenBLAS/0.2.19 b:parmetis/4.0.3 -trilinos/12.10.1 unstable gcc/6.2.0 openmpi/1.10.4 b:cmake/3.6.3 b:OpenBLAS/0.2.19 b:parmetis/4.0.3 +trilinos/12.10.1 stable gcc/4.8.5 openmpi/1.10.4 b:cmake/3.6.3 b:OpenBLAS/0.2.19 b:parmetis/4.0.3 +trilinos/12.10.1 stable gcc/4.9.4 openmpi/1.10.4 b:cmake/3.6.3 b:OpenBLAS/0.2.19 b:parmetis/4.0.3 +trilinos/12.10.1 stable gcc/5.4.0 openmpi/1.10.4 b:cmake/3.6.3 b:OpenBLAS/0.2.19 b:parmetis/4.0.3 +trilinos/12.10.1 stable gcc/6.2.0 openmpi/1.10.4 b:cmake/3.6.3 b:OpenBLAS/0.2.19 b:parmetis/4.0.3 + +trilinos/12.10.1-1 unstable gcc/5.4.0 openmpi/1.10.4 hdf5/1.8.18 b:cmake/3.6.3 b:OpenBLAS/0.2.19 b:parmetis/4.0.3 +trilinos/12.10.1-2 unstable gcc/5.4.0 openmpi/1.10.4 hdf5/1.8.18 b:cmake/3.6.3 b:OpenBLAS/0.2.19 b:parmetis/4.0.3 +trilinos/12.10.1-1 unstable gcc/6.2.0 openmpi/1.10.4 hdf5/1.8.18 b:cmake/3.6.3 b:OpenBLAS/0.2.19 b:parmetis/4.0.3 diff --git a/MPI/trilinos/build b/MPI/trilinos/build index 482d5bd..3e84ad5 100755 --- a/MPI/trilinos/build +++ b/MPI/trilinos/build @@ -1,6 +1,6 @@ #!/usr/bin/env modbuild -SOURCE_URL="http://trilinos.csbsju.edu/download/files/trilinos-$V-Source.tar.bz2" +SOURCE_URL="http://trilinos.csbsju.edu/download/files/trilinos-${V_PKG}-Source.tar.bz2" declare -rx AR=ar @@ -27,10 +27,8 @@ pbuild::configure() { PARMETIS_INCLUDE_DIRS=$PARMETIS_PREFIX/include PARMETIS_LIBRARIES=$PARMETIS_PREFIX/lib/libparmetis.a - - METIS_INCLUDE_DIRS=$PARMETIS_PREFIX/include/metis - METIS_LIBRARIES=$PARMETIS_PREFIX/lib/libmetis.a - + METIS_INCLUDE_DIRS="${PARMETIS_PREFIX}/include/metis" + METIS_LIBRARIES="${PARMETIS_PREFIX}/lib/libmetis.a" cmake \ -D CMAKE_BUILD_TYPE:STRING=Release \ @@ -70,7 +68,7 @@ pbuild::configure() { "${MODULE_SRCDIR}" || exit 1 } -pbuild::add_to_group 'MPI' +pbuild::add_to_group 'HDF5' pbuild::set_docfiles Copyright.txt LICENSE README RELEASE_NOTES pbuild::make_all diff --git a/Programming/cmake/3/variants b/Programming/cmake/3/variants index 09cdedc..e105311 100644 --- a/Programming/cmake/3/variants +++ b/Programming/cmake/3/variants @@ -2,3 +2,4 @@ cmake/3.1.3 stable cmake/3.3.2 stable cmake/3.4.1 stable cmake/3.6.3 stable +cmake/3.8.1 stable diff --git a/Programming/gcc/4/variants b/Programming/gcc/4/variants index 7a5150e..c5f6713 100644 --- a/Programming/gcc/4/variants +++ b/Programming/gcc/4/variants @@ -1,4 +1,5 @@ gcc/4.7.4 stable b:gmp/5.1.1 b:mpfr/3.1.2 b:mpc/1.0.2 +gcc/4.8.2 stable b:gmp/5.1.1 b:mpfr/3.1.2 b:mpc/1.0.2 gcc/4.8.3 stable b:gmp/5.1.1 b:mpfr/3.1.2 b:mpc/1.0.2 gcc/4.8.4 stable b:gmp/5.1.1 b:mpfr/3.1.2 b:mpc/1.0.2 gcc/4.8.5 stable b:gmp/6.0.0 b:mpfr/3.1.3 b:mpc/1.0.3 diff --git a/Programming/gcc/5/macosx-version-min.patch b/Programming/gcc/5/macosx-version-min.patch new file mode 100644 index 0000000..dd60822 --- /dev/null +++ b/Programming/gcc/5/macosx-version-min.patch @@ -0,0 +1,419 @@ +Index: gcc/config/darwin-c.c +=================================================================== +--- gcc/config/darwin-c.c.orig ++++ gcc/config/darwin-c.c +@@ -570,42 +570,180 @@ find_subframework_header (cpp_reader *pf + return 0; + } + +-/* Return the value of darwin_macosx_version_min suitable for the +- __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ macro, so '10.4.2' +- becomes 1040 and '10.10.0' becomes 101000. The lowest digit is +- always zero, as is the second lowest for '10.10.x' and above. +- Print a warning if the version number can't be understood. */ ++/* Given a version string, return the version as a statically-allocated ++ array of three non-negative integers. If the version string is ++ invalid, return null. ++ ++ Version strings must consist of one, two, or three tokens, each ++ separated by a single period. Each token must contain only the ++ characters '0' through '9' and is converted to an equivalent ++ integer. Omitted tokens are treated as zeros. For example: ++ ++ "10" becomes {10,0,0} ++ "10.10" becomes {10,10,0} ++ "10.10.1" becomes {10,10,1} ++ "10.000010.1" becomes {10,10,1} ++ "10.010.001" becomes {10,10,1} ++ "000010.10.00001" becomes {10,10,1} */ ++ ++enum version_components { MAJOR, MINOR, TINY }; ++ ++static const unsigned long * ++parse_version (const char *version_str) ++{ ++ size_t version_len; ++ char *end; ++ static unsigned long version_array[3]; ++ ++ if (! version_str) ++ return NULL; ++ ++ version_len = strlen (version_str); ++ if (version_len < 1) ++ return NULL; ++ ++ /* Version string must consist of digits and periods only. */ ++ if (strspn (version_str, "0123456789.") != version_len) ++ return NULL; ++ ++ if (! ISDIGIT (version_str[0]) || ! ISDIGIT (version_str[version_len - 1])) ++ return NULL; ++ ++ version_array[MAJOR] = strtoul (version_str, &end, 10); ++ version_str = end + ((*end == '.') ? 1 : 0); ++ ++ /* Version string must not contain adjacent periods. */ ++ if (*version_str == '.') ++ return NULL; ++ ++ version_array[MINOR] = strtoul (version_str, &end, 10); ++ version_str = end + ((*end == '.') ? 1 : 0); ++ ++ version_array[TINY] = strtoul (version_str, &end, 10); ++ ++ /* Version string must contain no more than three tokens. */ ++ if (*end != '\0') ++ return NULL; ++ ++ return version_array; ++} ++ ++/* Given a three-component version represented as an array of ++ non-negative integers, return a statically-allocated string suitable ++ for the legacy __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ macro. ++ If the version is invalid and cannot be coerced into a valid form, ++ return null. ++ ++ The legacy format is a four-character string -- two chars for the ++ major number and one each for the minor and tiny numbers. Major ++ numbers are zero-padded if necessary. Minor and tiny numbers from ++ 10 through 99 are permitted but are clamped to 9 (for example, ++ {10,9,10} produces "1099"). Versions containing numbers greater ++ than 99 are rejected. */ ++ + static const char * +-version_as_macro (void) ++version_as_legacy_macro (const unsigned long *version) + { +- static char result[7] = "1000"; +- int minorDigitIdx; ++ unsigned long major, minor, tiny; ++ static char result[sizeof "9999"]; ++ ++ if (! version) ++ return NULL; ++ ++ major = version[MAJOR]; ++ minor = version[MINOR]; ++ tiny = version[TINY]; ++ ++ if (major > 99 || minor > 99 || tiny > 99) ++ return NULL; ++ ++ minor = ((minor > 9) ? 9 : minor); ++ tiny = ((tiny > 9) ? 9 : tiny); ++ ++ /* NOTE: Cast result of sizeof so that result of sprintf is not ++ converted to an unsigned type. */ ++ if (sprintf (result, "%02lu%lu%lu", major, minor, tiny) ++ != (int) sizeof "9999" - 1) ++ return NULL; + +- if (strncmp (darwin_macosx_version_min, "10.", 3) != 0) ++ return result; ++} ++ ++/* Given a three-component version represented as an array of ++ non-negative integers, return a statically-allocated string suitable ++ for the modern __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ macro ++ or the __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ macro. If the ++ version is invalid, return null. ++ ++ The modern format is a five- or six-character string -- one or two ++ chars for the major number and two each for the minor and tiny ++ numbers, which are zero-padded if necessary (for example, {8,1,0} ++ produces "80100", and {10,10,1} produces "101001"). Versions ++ containing numbers greater than 99 are rejected. */ ++ ++static const char * ++version_as_modern_macro (const unsigned long *version) ++{ ++ unsigned long major, minor, tiny; ++ static char result[sizeof "999999"]; ++ ++ if (! version) ++ return NULL; ++ ++ major = version[MAJOR]; ++ minor = version[MINOR]; ++ tiny = version[TINY]; ++ ++ if (major > 99 || minor > 99 || tiny > 99) ++ return NULL; ++ ++ /* NOTE: 'sizeof ((x > y) ? "foo" : "bar")' returns size of char ++ pointer instead of char array, so use ++ '(x > y) ? sizeof "foo" : sizeof "bar"' instead. */ ++ /* NOTE: Cast result of sizeof so that result of sprintf is not ++ converted to an unsigned type. */ ++ if (sprintf (result, "%lu%02lu%02lu", major, minor, tiny) ++ != (int) ((major > 9) ? sizeof "999999" : sizeof "99999") - 1) ++ return NULL; ++ ++ return result; ++} ++ ++/* Return the value of darwin_macosx_version_min, suitably formatted ++ for the __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ macro. Values ++ representing OS X 10.9 and earlier are encoded using the legacy ++ four-character format, while 10.10 and later use a modern ++ six-character format. (For example, "10.9" produces "1090", and ++ "10.10.1" produces "101001".) If the value is invalid and cannot be ++ coerced into a valid form, print a warning and return "1000". */ ++ ++static const char * ++macosx_version_as_macro (void) ++{ ++ const unsigned long *version_array; ++ const char *version_macro; ++ ++ version_array = parse_version (darwin_macosx_version_min); ++ if (! version_array) + goto fail; +- if (! ISDIGIT (darwin_macosx_version_min[3])) ++ ++ /* Do not assume that the major number will always be exactly 10. */ ++ if (version_array[MAJOR] < 10 || version_array[MAJOR] > 10) + goto fail; + +- minorDigitIdx = 3; +- result[2] = darwin_macosx_version_min[minorDigitIdx++]; +- if (ISDIGIT (darwin_macosx_version_min[minorDigitIdx])) +- { +- /* Starting with OS X 10.10, the macro ends '00' rather than '0', +- i.e. 10.10.x becomes 101000 rather than 10100. */ +- result[3] = darwin_macosx_version_min[minorDigitIdx++]; +- result[4] = '0'; +- result[5] = '0'; +- result[6] = '\0'; +- } +- if (darwin_macosx_version_min[minorDigitIdx] != '\0' +- && darwin_macosx_version_min[minorDigitIdx] != '.') ++ if (version_array[MAJOR] == 10 && version_array[MINOR] < 10) ++ version_macro = version_as_legacy_macro (version_array); ++ else ++ version_macro = version_as_modern_macro (version_array); ++ ++ if (! version_macro) + goto fail; + +- return result; ++ return version_macro; + + fail: + error ("unknown value %qs of -mmacosx-version-min", +- darwin_macosx_version_min); ++ darwin_macosx_version_min); + return "1000"; + } + +@@ -627,7 +765,7 @@ darwin_cpp_builtins (cpp_reader *pfile) + builtin_define ("__CONSTANT_CFSTRINGS__"); + + builtin_define_with_value ("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", +- version_as_macro(), false); ++ macosx_version_as_macro(), false); + + /* Since we do not (at 4.6) support ObjC gc for the NeXT runtime, the + following will cause a syntax error if one tries to compile gc attributed +Index: gcc/testsuite/gcc.dg/darwin-minversion-10.c +=================================================================== +--- /dev/null ++++ gcc/testsuite/gcc.dg/darwin-minversion-10.c +@@ -0,0 +1,16 @@ ++/* PR target/63810: Test that a version with a zero-padded minor ++ number < 10 and a zero-padded tiny number < 10 produces the correct ++ four-character macro. */ ++/* Added by Lawrence Velázquez . */ ++ ++/* { dg-options "-mmacosx-version-min=10.07.02" } */ ++/* { dg-do compile { target *-*-darwin* } } */ ++ ++int ++main () ++{ ++#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1072 ++ fail me; ++#endif ++ return 0; ++} +Index: gcc/testsuite/gcc.dg/darwin-minversion-11.c +=================================================================== +--- /dev/null ++++ gcc/testsuite/gcc.dg/darwin-minversion-11.c +@@ -0,0 +1,15 @@ ++/* PR target/63810: Test that a version with outrageous zero-padding and ++ a minor number > 9 still produces a six-character macro. */ ++/* Added by Lawrence Velázquez . */ ++ ++/* { dg-options "-mmacosx-version-min=00010.010.0000098" } */ ++/* { dg-do compile { target *-*-darwin* } } */ ++ ++int ++main () ++{ ++#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 101098 ++ fail me; ++#endif ++ return 0; ++} +Index: gcc/testsuite/gcc.dg/darwin-minversion-12.c +=================================================================== +--- /dev/null ++++ gcc/testsuite/gcc.dg/darwin-minversion-12.c +@@ -0,0 +1,15 @@ ++/* PR target/63810: Test that a version with outrageous zero-padding and ++ a minor number < 10 still produces a four-character macro. */ ++/* Added by Lawrence Velázquez . */ ++ ++/* { dg-options "-mmacosx-version-min=010.008.000031" } */ ++/* { dg-do compile { target *-*-darwin* } } */ ++ ++int ++main () ++{ ++#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1089 ++ fail me; ++#endif ++ return 0; ++} +Index: gcc/testsuite/gcc.dg/darwin-minversion-3.c +=================================================================== +--- gcc/testsuite/gcc.dg/darwin-minversion-3.c.orig ++++ gcc/testsuite/gcc.dg/darwin-minversion-3.c +@@ -1,11 +1,11 @@ +-/* Test that most-minor versions greater than 9 work. */ +-/* { dg-options "-mmacosx-version-min=10.4.10" } */ ++/* Test that most minor versions < 10 work. */ ++/* { dg-options "-mmacosx-version-min=10.4.1" } */ + /* { dg-do compile { target *-*-darwin* } } */ + + int + main () + { +-#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1040 ++#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1041 + fail me; + #endif + return 0; +Index: gcc/testsuite/gcc.dg/darwin-minversion-4.c +=================================================================== +--- gcc/testsuite/gcc.dg/darwin-minversion-4.c.orig ++++ gcc/testsuite/gcc.dg/darwin-minversion-4.c +@@ -1,11 +1,11 @@ +-/* Test that major versions greater than 9 work and have the additional 0. */ +-/* { dg-options "-mmacosx-version-min=10.10.0" } */ ++/* Test that minor versions > 9 produce a six-character macro. */ ++/* { dg-options "-mmacosx-version-min=10.10.1" } */ + /* { dg-do compile { target *-*-darwin* } } */ + + int + main () + { +-#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 101000 ++#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 101001 + fail me; + #endif + return 0; +Index: gcc/testsuite/gcc.dg/darwin-minversion-5.c +=================================================================== +--- /dev/null ++++ gcc/testsuite/gcc.dg/darwin-minversion-5.c +@@ -0,0 +1,16 @@ ++/* PR target/63810: Test that a version with minor number < 10 and tiny ++ number > 9 produces a four-character macro with the tiny number ++ clamped to 9. */ ++/* Added by Lawrence Velázquez . */ ++ ++/* { dg-options "-mmacosx-version-min=10.9.10" } */ ++/* { dg-do compile { target *-*-darwin* } } */ ++ ++int ++main () ++{ ++#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1099 ++ fail me; ++#endif ++ return 0; ++} +Index: gcc/testsuite/gcc.dg/darwin-minversion-6.c +=================================================================== +--- /dev/null ++++ gcc/testsuite/gcc.dg/darwin-minversion-6.c +@@ -0,0 +1,15 @@ ++/* PR target/63810: Test that tiny numbers are preserved in ++ six-character macros. */ ++/* Added by Lawrence Velázquez . */ ++ ++/* { dg-options "-mmacosx-version-min=10.10.11" } */ ++/* { dg-do compile { target *-*-darwin* } } */ ++ ++int ++main () ++{ ++#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 101011 ++ fail me; ++#endif ++ return 0; ++} +Index: gcc/testsuite/gcc.dg/darwin-minversion-7.c +=================================================================== +--- /dev/null ++++ gcc/testsuite/gcc.dg/darwin-minversion-7.c +@@ -0,0 +1,15 @@ ++/* PR target/63810: Test that tiny numbers < 10 are preserved in ++ four-character macros. */ ++/* Added by Lawrence Velázquez . */ ++ ++/* { dg-options "-mmacosx-version-min=10.9.1" } */ ++/* { dg-do compile { target *-*-darwin* } } */ ++ ++int ++main () ++{ ++#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1091 ++ fail me; ++#endif ++ return 0; ++} +Index: gcc/testsuite/gcc.dg/darwin-minversion-8.c +=================================================================== +--- /dev/null ++++ gcc/testsuite/gcc.dg/darwin-minversion-8.c +@@ -0,0 +1,15 @@ ++/* PR target/63810: Test that a version with minor number > 9 and no ++ tiny number produces a six-character macro ending in "00". */ ++/* Added by Lawrence Velázquez . */ ++ ++/* { dg-options "-mmacosx-version-min=10.11" } */ ++/* { dg-do compile { target *-*-darwin* } } */ ++ ++int ++main () ++{ ++#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 101100 ++ fail me; ++#endif ++ return 0; ++} +Index: gcc/testsuite/gcc.dg/darwin-minversion-9.c +=================================================================== +--- /dev/null ++++ gcc/testsuite/gcc.dg/darwin-minversion-9.c +@@ -0,0 +1,15 @@ ++/* PR target/63810: Test that a version with a zero-padded minor ++ number < 10 produces a four-character macro. */ ++/* Added by Lawrence Velázquez . */ ++ ++/* { dg-options "-mmacosx-version-min=10.08.4" } */ ++/* { dg-do compile { target *-*-darwin* } } */ ++ ++int ++main () ++{ ++#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1084 ++ fail me; ++#endif ++ return 0; ++} diff --git a/Programming/gcc/6/variants b/Programming/gcc/6/variants index dee69bc..66a92ce 100644 --- a/Programming/gcc/6/variants +++ b/Programming/gcc/6/variants @@ -1,3 +1,4 @@ gcc/6.1.0 stable b:gmp/6.1.0 b:mpfr/3.1.4 b:mpc/1.0.3 gcc/6.2.0 stable b:gmp/6.1.1 b:mpfr/3.1.4 b:mpc/1.0.3 -gcc/6.3.0 stable b:gmp/6.1.2 b:mpfr/3.1.5 b:mpc/1.0.3 +gcc/6.3.0 stable b:gmp/6.1.2 b:mpfr/3.1.5 b:mpc/1.0.3-2 +gcc/6.4.0 stable b:gmp/6.1.2 b:mpfr/3.1.5 b:mpc/1.0.3 diff --git a/Programming/gcc/7/variants b/Programming/gcc/7/variants index 52ce704..8673a23 100644 --- a/Programming/gcc/7/variants +++ b/Programming/gcc/7/variants @@ -1 +1,2 @@ gcc/7.1.0 stable b:gmp/6.1.2 b:mpfr/3.1.5 b:mpc/1.0.3 +gcc/7.2.0 stable b:gmp/6.1.2 b:mpfr/3.1.5 b:mpc/1.0.3-2 diff --git a/Programming/ld64/274/patches.Darwin/PR-29117886.patch b/Programming/ld64/274/patches.Darwin/PR-29117886.patch new file mode 120000 index 0000000..ccce0e8 --- /dev/null +++ b/Programming/ld64/274/patches.Darwin/PR-29117886.patch @@ -0,0 +1 @@ +../../files/PR-29117886.patch \ No newline at end of file diff --git a/Programming/ld64/274/patches.Darwin/PR-29679726.patch b/Programming/ld64/274/patches.Darwin/PR-29679726.patch new file mode 120000 index 0000000..f2ffa66 --- /dev/null +++ b/Programming/ld64/274/patches.Darwin/PR-29679726.patch @@ -0,0 +1 @@ +../../files/PR-29679726.patch \ No newline at end of file diff --git a/Programming/ld64/274/patches.Darwin/PR-29723276.patch b/Programming/ld64/274/patches.Darwin/PR-29723276.patch new file mode 120000 index 0000000..6c370da --- /dev/null +++ b/Programming/ld64/274/patches.Darwin/PR-29723276.patch @@ -0,0 +1 @@ +../../files/PR-29723276.patch \ No newline at end of file diff --git a/Programming/ld64/274/patches.Darwin/PR-29723629.patch b/Programming/ld64/274/patches.Darwin/PR-29723629.patch new file mode 120000 index 0000000..e0f3663 --- /dev/null +++ b/Programming/ld64/274/patches.Darwin/PR-29723629.patch @@ -0,0 +1 @@ +../../files/PR-29723629.patch \ No newline at end of file diff --git a/Programming/ld64/274/patches.Darwin/PR-49393.patch b/Programming/ld64/274/patches.Darwin/PR-49393.patch new file mode 120000 index 0000000..3929640 --- /dev/null +++ b/Programming/ld64/274/patches.Darwin/PR-49393.patch @@ -0,0 +1 @@ +../../files/PR-49393.patch \ No newline at end of file diff --git a/Programming/ld64/274/patches.Darwin/ld64-133-no-CrashReporterClient.h.patch b/Programming/ld64/274/patches.Darwin/ld64-133-no-CrashReporterClient.h.patch new file mode 120000 index 0000000..49a1306 --- /dev/null +++ b/Programming/ld64/274/patches.Darwin/ld64-133-no-CrashReporterClient.h.patch @@ -0,0 +1 @@ +../../files/ld64-133-no-CrashReporterClient.h.patch \ No newline at end of file diff --git a/Programming/ld64/274/patches.Darwin/ld64-134-missing-include.patch b/Programming/ld64/274/patches.Darwin/ld64-134-missing-include.patch new file mode 120000 index 0000000..33ed89f --- /dev/null +++ b/Programming/ld64/274/patches.Darwin/ld64-134-missing-include.patch @@ -0,0 +1 @@ +../../files/ld64-134-missing-include.patch \ No newline at end of file diff --git a/Programming/ld64/274/patches.Darwin/ld64-136-i386-badAddress.patch b/Programming/ld64/274/patches.Darwin/ld64-136-i386-badAddress.patch new file mode 120000 index 0000000..8e203e7 --- /dev/null +++ b/Programming/ld64/274/patches.Darwin/ld64-136-i386-badAddress.patch @@ -0,0 +1 @@ +../../files/ld64-136-i386-badAddress.patch \ No newline at end of file diff --git a/Programming/ld64/274/patches.Darwin/ld64-ppc-9610466.patch b/Programming/ld64/274/patches.Darwin/ld64-ppc-9610466.patch new file mode 120000 index 0000000..a9b0155 --- /dev/null +++ b/Programming/ld64/274/patches.Darwin/ld64-ppc-9610466.patch @@ -0,0 +1 @@ +../../files/ld64-ppc-9610466.patch \ No newline at end of file diff --git a/Programming/ld64/274/patches.Darwin/ld64-version.patch b/Programming/ld64/274/patches.Darwin/ld64-version.patch new file mode 120000 index 0000000..53c4978 --- /dev/null +++ b/Programming/ld64/274/patches.Darwin/ld64-version.patch @@ -0,0 +1 @@ +../../files/ld64-version.patch \ No newline at end of file diff --git a/Programming/ld64/274/variants.Darwin b/Programming/ld64/274/variants.Darwin new file mode 100644 index 0000000..e06e45c --- /dev/null +++ b/Programming/ld64/274/variants.Darwin @@ -0,0 +1 @@ +ld64/274.2 unstable diff --git a/Programming/ld64/build b/Programming/ld64/build new file mode 100755 index 0000000..7470141 --- /dev/null +++ b/Programming/ld64/build @@ -0,0 +1,73 @@ +#!/usr/bin/env modbuild + +CCTOOLS_VERSION='895' +DYLD_VERSION='421.2' + +SOURCE_URL="http://opensource.apple.com/tarballs/$P/$P-$V.tar.gz" +CCTOOLS_SOURCE_URL="https://opensource.apple.com/tarballs/cctools/cctools-${CCTOOLS_VERSION}.tar.gz" +DYLD_SOURCE_URL="http://opensource.apple.com/tarballs/dyld/dyld-${DYLD_VERSION}.tar.gz" + + +pbuild::patch_sources () { + find_patchdir() { + local -a patchdirs=() + patchdirs+=( "${BUILD_BLOCK_DIR}/${V}/patches.${OS}" ) + patchdirs+=( "${BUILD_BLOCK_DIR}/${V}/patches" ) + patchdirs+=( "${BUILD_BLOCK_DIR}/${V%.*}/patches.${OS}" ) + patchdirs+=( "${BUILD_BLOCK_DIR}/${V%.*}/patches" ) + patchdirs+=( "${BUILD_BLOCK_DIR}/${V%.*.*}/patches.${OS}" ) + patchdirs+=( "${BUILD_BLOCK_DIR}/${V%.*.*}/patches" ) + + for patchdir in "${patchdirs[@]}"; do + [[ -e "${patchdir}" ]] && return 0; + done + return 1 + } + + find_patchdir || return 0 + local patch_file='' + for patch_file in "${patchdir}"/*; do + patch -p0 < "${patch_file}" + done +} + +pbuild::post_prep() { + local -r DYLD_SRC_DIR="${PMODULES_TMPDIR}/dyld-${DYLD_VERSION}/src" + local -r CCTOOLS_SRC_DIR="${PMODULES_TMPDIR}/cctools-${CCTOOLS_VERSION}/src" + + local source_file='' + pbuild::get_source source_file "${DYLD_SOURCE_URL}" "${PMODULES_DISTFILESDIR}" || + std::die 4 "dyld/${DYLD_VERSION}: sourcecode not found." + pbuild::unpack "${source_file}" "${DYLD_SRC_DIR}" + + pbuild::get_source source_file "${CCTOOLS_SOURCE_URL}" "${PMODULES_DISTFILESDIR}" || + std::die 4 "cctools/${CCTOOLS_VERSION}: sourcecode not found." + pbuild::unpack "${source_file}" "${CCTOOLS_SRC_DIR}" + + cd "${MODULE_SRCDIR}" + mkdir -p "include/mach-o" + rsync --archive "../../cctools-${CCTOOLS_VERSION}/src/include/mach-o/" "include/mach-o/" + rsync --archive "../../dyld-${DYLD_VERSION}/src/include/mach-o/" "include/mach-o/" + mkdir -p "include/llvm-c" + cp -v "${BUILD_BLOCK_DIR}/files/Disassembler.h" "include/llvm-c/" + cp -v "${BUILD_BLOCK_DIR}/files/lto.h" "include/llvm-c/" +} + +pbuild::configure() { + cp -v "${BUILD_BLOCK_DIR}/files/Makefile-${V_MAJOR}" "${MODULE_SRCDIR}/Makefile" +} + +pbuild::build() { + cd "${MODULE_SRCDIR}" + which $CC + make OTHER_CXXFLAGS="-std=c++11 -I$PWD/include" OTHER_LDFLAGS="-L/Applications/Xcode.app/Contents/Frameworks -lLTO" +} + +# use system gcc to compile +declare -rx CC=/usr/bin/gcc +declare -rx CXX=/usr/bin/g++ + +pbuild::add_to_group 'Programming' +pbuild::set_docfiles 'COPYING' 'COPYING.LIB' 'COPYING.RUNTIME' 'COPYING3' 'COPYING3.LIB' 'NEWS' 'README' +pbuild::make_all + diff --git a/Programming/ld64/files/Disassembler.h b/Programming/ld64/files/Disassembler.h new file mode 100644 index 0000000..5fa79fa --- /dev/null +++ b/Programming/ld64/files/Disassembler.h @@ -0,0 +1,239 @@ +/*===-- llvm-c/Disassembler.h - Disassembler Public C Interface ---*- C -*-===*\ +|* *| +|* The LLVM Compiler Infrastructure *| +|* *| +|* This file is distributed under the University of Illinois Open Source *| +|* License. See LICENSE.TXT for details. *| +|* *| +|*===----------------------------------------------------------------------===*| +|* *| +|* This header provides a public interface to a disassembler library. *| +|* LLVM provides an implementation of this interface. *| +|* *| +\*===----------------------------------------------------------------------===*/ + +#ifndef LLVM_C_DISASSEMBLER_H +#define LLVM_C_DISASSEMBLER_H + +#include + +/** + * @defgroup LLVMCDisassembler Disassembler + * @ingroup LLVMC + * + * @{ + */ + +/** + * An opaque reference to a disassembler context. + */ +typedef void *LLVMDisasmContextRef; + +/** + * The type for the operand information call back function. This is called to + * get the symbolic information for an operand of an instruction. Typically + * this is from the relocation information, symbol table, etc. That block of + * information is saved when the disassembler context is created and passed to + * the call back in the DisInfo parameter. The instruction containing operand + * is at the PC parameter. For some instruction sets, there can be more than + * one operand with symbolic information. To determine the symbolic operand + * information for each operand, the bytes for the specific operand in the + * instruction are specified by the Offset parameter and its byte widith is the + * size parameter. For instructions sets with fixed widths and one symbolic + * operand per instruction, the Offset parameter will be zero and Size parameter + * will be the instruction width. The information is returned in TagBuf and is + * Triple specific with its specific information defined by the value of + * TagType for that Triple. If symbolic information is returned the function + * returns 1, otherwise it returns 0. + */ +typedef int (*LLVMOpInfoCallback)(void *DisInfo, uint64_t Pc, + uint64_t Offset, uint64_t Size, + int TagType, void *TagBuf); + +/** + * The initial support in LLVM MC for the most general form of a relocatable + * expression is "AddSymbol - SubtractSymbol + Offset". For some Darwin targets + * this full form is encoded in the relocation information so that AddSymbol and + * SubtractSymbol can be link edited independent of each other. Many other + * platforms only allow a relocatable expression of the form AddSymbol + Offset + * to be encoded. + * + * The LLVMOpInfoCallback() for the TagType value of 1 uses the struct + * LLVMOpInfo1. The value of the relocatable expression for the operand, + * including any PC adjustment, is passed in to the call back in the Value + * field. The symbolic information about the operand is returned using all + * the fields of the structure with the Offset of the relocatable expression + * returned in the Value field. It is possible that some symbols in the + * relocatable expression were assembly temporary symbols, for example + * "Ldata - LpicBase + constant", and only the Values of the symbols without + * symbol names are present in the relocation information. The VariantKind + * type is one of the Target specific #defines below and is used to print + * operands like "_foo@GOT", ":lower16:_foo", etc. + */ +struct LLVMOpInfoSymbol1 { + uint64_t Present; /* 1 if this symbol is present */ + const char *Name; /* symbol name if not NULL */ + uint64_t Value; /* symbol value if name is NULL */ +}; + +struct LLVMOpInfo1 { + struct LLVMOpInfoSymbol1 AddSymbol; + struct LLVMOpInfoSymbol1 SubtractSymbol; + uint64_t Value; + uint64_t VariantKind; +}; + +/** + * The operand VariantKinds for symbolic disassembly. + */ +#define LLVMDisassembler_VariantKind_None 0 /* all targets */ + +/** + * The ARM target VariantKinds. + */ +#define LLVMDisassembler_VariantKind_ARM_HI16 1 /* :upper16: */ +#define LLVMDisassembler_VariantKind_ARM_LO16 2 /* :lower16: */ + +/** + * The ARM64 target VariantKinds. + */ +#define LLVMDisassembler_VariantKind_ARM64_PAGE 1 /* @page */ +#define LLVMDisassembler_VariantKind_ARM64_PAGEOFF 2 /* @pageoff */ +#define LLVMDisassembler_VariantKind_ARM64_GOTPAGE 3 /* @gotpage */ +#define LLVMDisassembler_VariantKind_ARM64_GOTPAGEOFF 4 /* @gotpageoff */ +#define LLVMDisassembler_VariantKind_ARM64_TLVP 5 /* @tvlppage */ +#define LLVMDisassembler_VariantKind_ARM64_TLVOFF 6 /* @tvlppageoff */ + +/** + * The type for the symbol lookup function. This may be called by the + * disassembler for things like adding a comment for a PC plus a constant + * offset load instruction to use a symbol name instead of a load address value. + * It is passed the block information is saved when the disassembler context is + * created and the ReferenceValue to look up as a symbol. If no symbol is found + * for the ReferenceValue NULL is returned. The ReferenceType of the + * instruction is passed indirectly as is the PC of the instruction in + * ReferencePC. If the output reference can be determined its type is returned + * indirectly in ReferenceType along with ReferenceName if any, or that is set + * to NULL. + */ +typedef const char *(*LLVMSymbolLookupCallback)(void *DisInfo, + uint64_t ReferenceValue, + uint64_t *ReferenceType, + uint64_t ReferencePC, + const char **ReferenceName); +/** + * The reference types on input and output. + */ +/* No input reference type or no output reference type. */ +#define LLVMDisassembler_ReferenceType_InOut_None 0 + +/* The input reference is from a branch instruction. */ +#define LLVMDisassembler_ReferenceType_In_Branch 1 +/* The input reference is from a PC relative load instruction. */ +#define LLVMDisassembler_ReferenceType_In_PCrel_Load 2 + +/* The input reference is from an ARM64::ADRP instruction. */ +#define LLVMDisassembler_ReferenceType_In_ARM64_ADRP 0x100000001 +/* The input reference is from an ARM64::ADDXri instruction. */ +#define LLVMDisassembler_ReferenceType_In_ARM64_ADDXri 0x100000002 +/* The input reference is from an ARM64::LDRXui instruction. */ +#define LLVMDisassembler_ReferenceType_In_ARM64_LDRXui 0x100000003 +/* The input reference is from an ARM64::LDRXl instruction. */ +#define LLVMDisassembler_ReferenceType_In_ARM64_LDRXl 0x100000004 +/* The input reference is from an ARM64::ADR instruction. */ +#define LLVMDisassembler_ReferenceType_In_ARM64_ADR 0x100000005 + +/* The output reference is to as symbol stub. */ +#define LLVMDisassembler_ReferenceType_Out_SymbolStub 1 +/* The output reference is to a symbol address in a literal pool. */ +#define LLVMDisassembler_ReferenceType_Out_LitPool_SymAddr 2 +/* The output reference is to a cstring address in a literal pool. */ +#define LLVMDisassembler_ReferenceType_Out_LitPool_CstrAddr 3 + +/* The output reference is to a Objective-C CoreFoundation string. */ +#define LLVMDisassembler_ReferenceType_Out_Objc_CFString_Ref 4 +/* The output reference is to a Objective-C message. */ +#define LLVMDisassembler_ReferenceType_Out_Objc_Message 5 +/* The output reference is to a Objective-C message ref. */ +#define LLVMDisassembler_ReferenceType_Out_Objc_Message_Ref 6 +/* The output reference is to a Objective-C selector ref. */ +#define LLVMDisassembler_ReferenceType_Out_Objc_Selector_Ref 7 +/* The output reference is to a Objective-C class ref. */ +#define LLVMDisassembler_ReferenceType_Out_Objc_Class_Ref 8 + +/* The output reference is to a C++ symbol name. */ +#define LLVMDisassembler_ReferenceType_DeMangled_Name 9 + +#ifdef __cplusplus +extern "C" { +#endif /* !defined(__cplusplus) */ + +/** + * Create a disassembler for the TripleName. Symbolic disassembly is supported + * by passing a block of information in the DisInfo parameter and specifying the + * TagType and callback functions as described above. These can all be passed + * as NULL. If successful, this returns a disassembler context. If not, it + * returns NULL. This function is equivalent to calling LLVMCreateDisasmCPU() + * with an empty CPU name. + */ +LLVMDisasmContextRef LLVMCreateDisasm(const char *TripleName, void *DisInfo, + int TagType, LLVMOpInfoCallback GetOpInfo, + LLVMSymbolLookupCallback SymbolLookUp); + +/** + * Create a disassembler for the TripleName and a specific CPU. Symbolic + * disassembly is supported by passing a block of information in the DisInfo + * parameter and specifying the TagType and callback functions as described + * above. These can all be passed * as NULL. If successful, this returns a + * disassembler context. If not, it returns NULL. + */ +LLVMDisasmContextRef LLVMCreateDisasmCPU(const char *Triple, const char *CPU, + void *DisInfo, int TagType, + LLVMOpInfoCallback GetOpInfo, + LLVMSymbolLookupCallback SymbolLookUp); + +/** + * Set the disassembler's options. Returns 1 if it can set the Options and 0 + * otherwise. + */ +int LLVMSetDisasmOptions(LLVMDisasmContextRef DC, uint64_t Options); + +/* The option to produce marked up assembly. */ +#define LLVMDisassembler_Option_UseMarkup 1 +/* The option to print immediates as hex. */ +#define LLVMDisassembler_Option_PrintImmHex 2 +/* The option use the other assembler printer variant */ +#define LLVMDisassembler_Option_AsmPrinterVariant 4 +/* The option to set comment on instructions */ +#define LLVMDisassembler_Option_SetInstrComments 8 + /* The option to print latency information alongside instructions */ +#define LLVMDisassembler_Option_PrintLatency 16 + +/** + * Dispose of a disassembler context. + */ +void LLVMDisasmDispose(LLVMDisasmContextRef DC); + +/** + * Disassemble a single instruction using the disassembler context specified in + * the parameter DC. The bytes of the instruction are specified in the + * parameter Bytes, and contains at least BytesSize number of bytes. The + * instruction is at the address specified by the PC parameter. If a valid + * instruction can be disassembled, its string is returned indirectly in + * OutString whose size is specified in the parameter OutStringSize. This + * function returns the number of bytes in the instruction or zero if there was + * no valid instruction. + */ +size_t LLVMDisasmInstruction(LLVMDisasmContextRef DC, uint8_t *Bytes, + uint64_t BytesSize, uint64_t Pc, + char *OutString, size_t OutStringSize); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif /* !defined(__cplusplus) */ + +#endif /* !defined(LLVM_C_DISASSEMBLER_H) */ diff --git a/Programming/ld64/files/Makefile-274 b/Programming/ld64/files/Makefile-274 new file mode 100644 index 0000000..b1a2e02 --- /dev/null +++ b/Programming/ld64/files/Makefile-274 @@ -0,0 +1,106 @@ +ifdef LLVM_CONFIG +LLVM_CPPFLAGS := -I$(shell $(LLVM_CONFIG) --includedir) -DLTO_SUPPORT +LLVM_LDFLAGS := -L$(shell $(LLVM_CONFIG) --libdir) -Wl,-rpath,$(shell $(LLVM_CONFIG) --libdir) -lLTO +endif + +CPPFLAGS = $(LLVM_CPPFLAGS) -Isrc/abstraction -Isrc/ld -Isrc/ld/parsers $(OTHER_CPPFLAGS) +CFLAGS = -Os $(OTHER_CFLAGS) +CXXFLAGS = -Os $(OTHER_CXXFLAGS) +LDFLAGS = $(OTHER_LDFLAGS) + +ifndef RANLIB +RANLIB = ranlib +endif +ifndef AR +AR = ar +endif +ifndef PREFIX +PREFIX = /usr +endif + +# libprunetrie.a +all : src/ld/configure.h ObjectDump dyldinfo ld machocheck rebase unwinddump + +src/ld/Snapshot.o : src/ld/compile_stubs.h +src/ld/compile_stubs.h : compile_stubs + echo "static const char *compile_stubs = " > $@ + cat $^ | sed s/\"/\\\\\"/g | sed s/^/\"/ | sed s/$$/\\\\n\"/ >> $@ + echo ";" >> $@ + +src/ld/configure.h : src/create_configure + DERIVED_SOURCES_DIR=src/ld DERIVED_FILE_DIR=src/ld $^ > $@ + +ObjectDump : src/ld/debugline.o +ObjectDump : src/ld/parsers/macho_relocatable_file.o +ObjectDump : src/ld/parsers/lto_file.o +ObjectDump : src/other/ObjectDump.o + $(CXX) $(LLVM_LDFLAGS) $(LDFLAGS) $^ -o $@ + +dyldinfo : src/other/dyldinfo.o + $(CXX) $(LDFLAGS) -Wl,-exported_symbol,__mh_execute_header $^ -o $@ + +ld : src/ld/debugline.o +ld : src/ld/ld.o +ld : src/ld/InputFiles.o +ld : src/ld/Options.o +ld : src/ld/OutputFile.o +ld : src/ld/Resolver.o +ld : src/ld/Snapshot.o +ld : src/ld/SymbolTable.o +ld : src/ld/parsers/archive_file.o +ld : src/ld/parsers/lto_file.o +ld : src/ld/parsers/macho_dylib_file.o +ld : src/ld/parsers/macho_relocatable_file.o +ld : src/ld/parsers/opaque_section_file.o +ld : src/ld/parsers/textstub_dylib_file.o +ld : src/ld/passes/bitcode_bundle.o +ld : src/ld/passes/branch_island.o +ld : src/ld/passes/branch_shim.o +ld : src/ld/passes/code_dedup.o +ld : src/ld/passes/compact_unwind.o +ld : src/ld/passes/dtrace_dof.o +ld : src/ld/passes/dylibs.o +ld : src/ld/passes/got.o +ld : src/ld/passes/huge.o +ld : src/ld/passes/objc.o +ld : src/ld/passes/order.o +ld : src/ld/passes/tlvp.o +ld : src/ld/passes/stubs/stubs.o + $(CXX) $(LLVM_LDFLAGS) $(LDFLAGS) $(OTHER_LDFLAGS_LD64) -Wl,-exported_symbol,__mh_execute_header $^ -lxar -o $@ + +machocheck : src/other/machochecker.o + $(CXX) $(LDFLAGS) $^ -o $@ + +rebase : src/other/rebase.o + $(CXX) $(LDFLAGS) -Wl,-exported_symbol,__mh_execute_header $^ -o $@ + +unwinddump : src/other/unwinddump.o + $(CXX) $(LDFLAGS) -Wl,-exported_symbol,__mh_execute_header $^ -o $@ + +src/other/PruneTrie.o : src/ld/configure.h +libprunetrie.a : src/other/PruneTrie.o + $(AR) cru $@ $^ + $(RANLIB) $@ + +install : all + install -d -m 755 $(DESTDIR)$(PREFIX)/bin + install -d -m 755 $(DESTDIR)$(PREFIX)/lib + install -d -m 755 $(DESTDIR)$(PREFIX)/include/mach-o + install -d -m 755 $(DESTDIR)$(PREFIX)/share/man/man1 + + install -m 755 ObjectDump $(DESTDIR)$(PREFIX)/bin + install -m 755 dyldinfo $(DESTDIR)$(PREFIX)/bin + install -m 755 ld $(DESTDIR)$(PREFIX)/bin + install -m 755 machocheck $(DESTDIR)$(PREFIX)/bin + install -m 755 rebase $(DESTDIR)$(PREFIX)/bin + install -m 755 unwinddump $(DESTDIR)$(PREFIX)/bin + + #install -m 644 src/other/prune_trie.h $(DESTDIR)$(PREFIX)/include/mach-o + #install -m 644 libprunetrie.a $(DESTDIR)$(PREFIX)/lib + + install -m 644 doc/man/man1/dyldinfo.1 $(DESTDIR)$(PREFIX)/share/man/man1 + install -m 644 doc/man/man1/ld.1 $(DESTDIR)$(PREFIX)/share/man/man1 + install -m 644 doc/man/man1/ld64.1 $(DESTDIR)$(PREFIX)/share/man/man1 + install -m 644 doc/man/man1/rebase.1 $(DESTDIR)$(PREFIX)/share/man/man1 + install -m 644 doc/man/man1/unwinddump.1 $(DESTDIR)$(PREFIX)/share/man/man1 + diff --git a/Programming/ld64/files/PR-29117886.patch b/Programming/ld64/files/PR-29117886.patch new file mode 100644 index 0000000..686aae9 --- /dev/null +++ b/Programming/ld64/files/PR-29117886.patch @@ -0,0 +1,32 @@ +--- src/ld/OutputFile.cpp ++++ src/ld/OutputFile.cpp +@@ -4461,14 +4461,18 @@ void OutputFile::addClassicRelocs(ld::Internal& state, ld::Internal::FinalSectio + assert(minusTarget->definition() != ld::Atom::definitionProxy); + assert(target != NULL); + assert(target->definition() != ld::Atom::definitionProxy); +- // make sure target is not global and weak +- if ( (target->scope() == ld::Atom::scopeGlobal) && (target->combine() == ld::Atom::combineByName) +- && (atom->section().type() != ld::Section::typeCFI) +- && (atom->section().type() != ld::Section::typeDtraceDOF) +- && (atom->section().type() != ld::Section::typeUnwindInfo) +- && (minusTarget != target) ) { +- // ok for __eh_frame and __uwind_info to use pointer diffs to global weak symbols +- throwf("bad codegen, pointer diff in %s to global weak symbol %s", atom->name(), target->name()); ++ // check if target of pointer-diff is global and weak ++ if ( (target->scope() == ld::Atom::scopeGlobal) && (target->combine() == ld::Atom::combineByName) && (target->definition() == ld::Atom::definitionRegular) ) { ++ if ( (atom->section().type() == ld::Section::typeCFI) ++ || (atom->section().type() == ld::Section::typeDtraceDOF) ++ || (atom->section().type() == ld::Section::typeUnwindInfo) ) { ++ // ok for __eh_frame and __uwind_info to use pointer diffs to global weak symbols ++ return; ++ } ++ // Have direct reference to weak-global. This should be an indrect reference ++ warning("direct access in %s to global weak symbol %s means the weak symbol cannot be overriden at runtime. " ++ "This was likely caused by different translation units being compiled with different visiblity settings.", ++ atom->name(), target->name()); + } + return; + } +-- +2.10.1 + diff --git a/Programming/ld64/files/PR-29679726.patch b/Programming/ld64/files/PR-29679726.patch new file mode 100644 index 0000000..b53d05d --- /dev/null +++ b/Programming/ld64/files/PR-29679726.patch @@ -0,0 +1,1120 @@ +From 08ebdd8bde8f21872f1ba716eaf887ef1628d738 Mon Sep 17 00:00:00 2001 +From: Jeremy Huddleston Sequoia +Date: Sun, 18 Dec 2016 00:24:11 -0800 +Subject: [PATCH] Revert textstub_dylib_file.cpp back to ld64-264.3.102 version + +Signed-off-by: Jeremy Huddleston Sequoia +--- + ld64.xcodeproj/project.pbxproj | 6 - + src/ld/Options.cpp | 35 +- + src/ld/parsers/generic_dylib_file.hpp | 63 +++ + src/ld/parsers/macho_dylib_file.cpp | 64 --- + src/ld/parsers/textstub_dylib_file.cpp | 717 +++++++++++++++++++++++++++------ + 5 files changed, 658 insertions(+), 227 deletions(-) + +diff --git ld64.xcodeproj/project.pbxproj ld64.xcodeproj/project.pbxproj +index 600aeac9..db20e783 100644 +--- ld64.xcodeproj/project.pbxproj ++++ ld64.xcodeproj/project.pbxproj +@@ -1284,8 +1284,6 @@ + "-Wl,-lazy_library,$(DT_TOOLCHAIN_DIR)/usr/lib/libLTO.dylib", + "@$(DERIVED_FILE_DIR)/linkExtras", + "-Wl,-exported_symbol,__mh_execute_header", +- "-L$(DT_TOOLCHAIN_DIR)/usr/lib", +- "-ltapi", + ); + PREBINDING = NO; + PRODUCT_NAME = ld; +@@ -1358,8 +1356,6 @@ + "-Wl,-lazy_library,$(DT_TOOLCHAIN_DIR)/usr/lib/libLTO.dylib", + "@$(DERIVED_FILE_DIR)/linkExtras", + "-Wl,-exported_symbol,__mh_execute_header", +- "-L$(DT_TOOLCHAIN_DIR)/usr/lib", +- "-ltapi", + ); + PREBINDING = NO; + PRODUCT_NAME = ld; +@@ -1577,8 +1573,6 @@ + "-Wl,-lazy_library,$(DT_TOOLCHAIN_DIR)/usr/lib/libLTO.dylib", + "@$(DERIVED_FILE_DIR)/linkExtras", + "-Wl,-exported_symbol,__mh_execute_header", +- "-L$(DT_TOOLCHAIN_DIR)/usr/lib", +- "-ltapi", + ); + PREBINDING = NO; + PRODUCT_NAME = ld; +diff --git src/ld/Options.cpp src/ld/Options.cpp +index b7e17091..227b0d84 100644 +--- src/ld/Options.cpp ++++ src/ld/Options.cpp +@@ -34,7 +34,6 @@ + #include + #include + #include +-#include + + #include + #include +@@ -832,13 +831,7 @@ bool Options::findFile(const std::string &path, const std::vector & + bool found = tbdInfo.checkFileExists(*this, newPath.c_str()); + if ( fTraceDylibSearching ) + printf("[Logging for XBS]%sfound library: '%s'\n", (found ? " " : " not "), newPath.c_str()); +- if ( found ) +- break; +- } +- +- // If we found a text-based stub file, check if it should be used. +- if ( !tbdInfo.missing() ) { +- if (tapi::LinkerInterfaceFile::shouldPreferTextBasedStubFile(tbdInfo.path)) { ++ if ( found ) { + result = tbdInfo; + return true; + } +@@ -848,31 +841,10 @@ bool Options::findFile(const std::string &path, const std::vector & + bool found = dylibInfo.checkFileExists(*this, path.c_str()); + if ( fTraceDylibSearching ) + printf("[Logging for XBS]%sfound library: '%s'\n", (found ? " " : " not "), path.c_str()); +- } +- +- // There is only a text-based stub file. +- if ( !tbdInfo.missing() && dylibInfo.missing() ) { +- result = tbdInfo; +- return true; +- } +- // There is only a dynamic library file. +- else if ( tbdInfo.missing() && !dylibInfo.missing() ) { +- result = dylibInfo; +- return true; +- } +- // There are both - a text-based stub file and a dynamic library file. +- else if ( !tbdInfo.missing() && !dylibInfo.missing() ) { +- // If the files are still in synv we can use and should use the text-based stub file. +- if (tapi::LinkerInterfaceFile::areEquivalent(tbdInfo.path, dylibInfo.path)) { +- result = tbdInfo; +- } +- // Otherwise issue a warning and fall-back to the dynamic library file. +- else { +- warning("text-based stub file %s and library file %s are out of sync. Falling back to library file for linking.", tbdInfo.path, dylibInfo.path); ++ if ( found ) { + result = dylibInfo; +- ++ return true; + } +- return true; + } + + return false; +@@ -3959,7 +3931,6 @@ void Options::buildSearchPaths(int argc, const char* argv[]) + const char* ltoVers = lto::version(); + if ( ltoVers != NULL ) + fprintf(stderr, "LTO support using: %s\n", ltoVers); +- fprintf(stderr, "TAPI support using: %s\n", tapi::Version::getFullVersionAsString().c_str()); + exit(0); + } + } +diff --git src/ld/parsers/generic_dylib_file.hpp src/ld/parsers/generic_dylib_file.hpp +index 529e4ab6..d581ab37 100644 +--- src/ld/parsers/generic_dylib_file.hpp ++++ src/ld/parsers/generic_dylib_file.hpp +@@ -191,6 +191,7 @@ private: + + protected: + bool isPublicLocation(const char* path) const; ++ void addSymbol(const char* name, bool weak = false, bool tlv = false, pint_t address = 0); + + private: + ld::Section _importProxySection; +@@ -479,6 +480,68 @@ bool File::isPublicLocation(const char* path) const + return false; + } + ++template ++void File::addSymbol(const char* name, bool weakDef, bool tlv, pint_t address) ++{ ++ // symbols that start with $ld$ are meta-data to the static linker ++ // need way for ld and dyld to see different exported symbols in a dylib ++ if ( strncmp(name, "$ld$", 4) == 0 ) { ++ // $ld$ $ $ ++ const char* symAction = &name[4]; ++ const char* symCond = strchr(symAction, '$'); ++ if ( symCond != nullptr ) { ++ char curOSVers[16]; ++ sprintf(curOSVers, "$os%d.%d$", (this->_linkMinOSVersion >> 16), ((this->_linkMinOSVersion >> 8) & 0xFF)); ++ if ( strncmp(symCond, curOSVers, strlen(curOSVers)) == 0 ) { ++ const char* symName = strchr(&symCond[1], '$'); ++ if ( symName != nullptr ) { ++ ++symName; ++ if ( strncmp(symAction, "hide$", 5) == 0 ) { ++ if ( this->_s_logHashtable ) ++ fprintf(stderr, " adding %s to ignore set for %s\n", symName, this->path()); ++ this->_ignoreExports.insert(strdup(symName)); ++ return; ++ } ++ else if ( strncmp(symAction, "add$", 4) == 0 ) { ++ this->addSymbol(symName, weakDef); ++ return; ++ } ++ else if ( strncmp(symAction, "weak$", 5) == 0 ) { ++ if ( !this->_allowWeakImports ) ++ this->_ignoreExports.insert(strdup(symName)); ++ } ++ else if ( strncmp(symAction, "install_name$", 13) == 0 ) { ++ this->_dylibInstallPath = strdup(symName); ++ this->_installPathOverride = true; ++ // CoreGraphics redirects to ApplicationServices, but with wrong compat version ++ if ( strcmp(this->_dylibInstallPath, "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices") == 0 ) ++ this->_dylibCompatibilityVersion = Options::parseVersionNumber32("1.0"); ++ return; ++ } ++ else if ( strncmp(symAction, "compatibility_version$", 22) == 0 ) { ++ this->_dylibCompatibilityVersion = Options::parseVersionNumber32(symName); ++ return; ++ } ++ else { ++ warning("bad symbol action: %s in dylib %s", name, this->path()); ++ } ++ } ++ } ++ } ++ else { ++ warning("bad symbol condition: %s in dylib %s", name, this->path()); ++ } ++ } ++ ++ // add symbol as possible export if we are not supposed to ignore it ++ if ( this->_ignoreExports.count(name) == 0 ) { ++ AtomAndWeak bucket = { nullptr, weakDef, tlv, address }; ++ if ( this->_s_logHashtable ) ++ fprintf(stderr, " adding %s to hash table for %s\n", name, this->path()); ++ this->_atoms[strdup(name)] = bucket; ++ } ++} ++ + // If only weak_import symbols are used, linker should use LD_LOAD_WEAK_DYLIB + template + bool File::allSymbolsAreWeakImported() const +diff --git src/ld/parsers/macho_dylib_file.cpp src/ld/parsers/macho_dylib_file.cpp +index 16d3f5d7..a8233055 100644 +--- src/ld/parsers/macho_dylib_file.cpp ++++ src/ld/parsers/macho_dylib_file.cpp +@@ -70,7 +70,6 @@ public: + private: + using P = typename A::P; + using E = typename A::P::E; +- using pint_t = typename A::P::uint_t; + + void addDyldFastStub(); + void buildExportHashTableFromExportInfo(const macho_dyld_info_command

* dyldInfo, +@@ -78,7 +77,6 @@ private: + void buildExportHashTableFromSymbolTable(const macho_dysymtab_command

* dynamicInfo, + const macho_nlist

* symbolTable, const char* strings, + const uint8_t* fileContent); +- void addSymbol(const char* name, bool weakDef = false, bool tlv = false, pint_t address = 0); + static const char* objCInfoSegmentName(); + static const char* objCInfoSectionName(); + +@@ -526,68 +524,6 @@ void File::buildExportHashTableFromExportInfo(const macho_dyld_info_command

+-void File::addSymbol(const char* name, bool weakDef, bool tlv, pint_t address) +-{ +- // symbols that start with $ld$ are meta-data to the static linker +- // need way for ld and dyld to see different exported symbols in a dylib +- if ( strncmp(name, "$ld$", 4) == 0 ) { +- // $ld$ $ $ +- const char* symAction = &name[4]; +- const char* symCond = strchr(symAction, '$'); +- if ( symCond != nullptr ) { +- char curOSVers[16]; +- sprintf(curOSVers, "$os%d.%d$", (this->_linkMinOSVersion >> 16), ((this->_linkMinOSVersion >> 8) & 0xFF)); +- if ( strncmp(symCond, curOSVers, strlen(curOSVers)) == 0 ) { +- const char* symName = strchr(&symCond[1], '$'); +- if ( symName != nullptr ) { +- ++symName; +- if ( strncmp(symAction, "hide$", 5) == 0 ) { +- if ( this->_s_logHashtable ) +- fprintf(stderr, " adding %s to ignore set for %s\n", symName, this->path()); +- this->_ignoreExports.insert(strdup(symName)); +- return; +- } +- else if ( strncmp(symAction, "add$", 4) == 0 ) { +- this->addSymbol(symName, weakDef); +- return; +- } +- else if ( strncmp(symAction, "weak$", 5) == 0 ) { +- if ( !this->_allowWeakImports ) +- this->_ignoreExports.insert(strdup(symName)); +- } +- else if ( strncmp(symAction, "install_name$", 13) == 0 ) { +- this->_dylibInstallPath = symName; +- this->_installPathOverride = true; +- // CoreGraphics redirects to ApplicationServices, but with wrong compat version +- if ( strcmp(this->_dylibInstallPath, "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices") == 0 ) +- this->_dylibCompatibilityVersion = Options::parseVersionNumber32("1.0"); +- return; +- } +- else if ( strncmp(symAction, "compatibility_version$", 22) == 0 ) { +- this->_dylibCompatibilityVersion = Options::parseVersionNumber32(symName); +- return; +- } +- else { +- warning("bad symbol action: %s in dylib %s", name, this->path()); +- } +- } +- } +- } +- else { +- warning("bad symbol condition: %s in dylib %s", name, this->path()); +- } +- } +- +- // add symbol as possible export if we are not supposed to ignore it +- if ( this->_ignoreExports.count(name) == 0 ) { +- typename Base::AtomAndWeak bucket = { nullptr, weakDef, tlv, address }; +- if ( this->_s_logHashtable ) +- fprintf(stderr, " adding %s to hash table for %s\n", name, this->path()); +- this->_atoms[strdup(name)] = bucket; +- } +-} +- + template <> + void File::addDyldFastStub() + { +diff --git src/ld/parsers/textstub_dylib_file.cpp src/ld/parsers/textstub_dylib_file.cpp +index 58544625..74dbcd7c 100644 +--- src/ld/parsers/textstub_dylib_file.cpp ++++ src/ld/parsers/textstub_dylib_file.cpp +@@ -25,7 +25,7 @@ + + #include + #include +-#include ++ + #include + + #include "Architectures.hpp" +@@ -35,6 +35,469 @@ + #include "generic_dylib_file.hpp" + #include "textstub_dylib_file.hpp" + ++namespace { ++ ++/// ++/// A token is a light-weight reference to the content of an nmap'ed file. It ++/// doesn't own the data and it doesn't make a copy of it. The referenced data ++/// is only valid as long as the file is mapped in. ++/// ++class Token { ++ const char* _p; ++ size_t _size; ++ ++ int compareMemory(const char* lhs, const char* rhs, size_t size) const { ++ if (size == 0) ++ return 0; ++ return ::memcmp(lhs, rhs, size); ++ } ++ ++public: ++ Token() : _p(nullptr), _size(0) {} ++ ++ Token(const char* p) : _p(p), _size(0) { ++ if (p) ++ _size = ::strlen(p); ++ } ++ ++ Token(const char* p, size_t s) : _p(p), _size(s) {} ++ ++ const char* data() const { return _p; } ++ ++ size_t size() const { return _size; } ++ ++ std::string str() const { return std::string(_p, _size); } ++ ++ bool empty() const { return _size == 0; } ++ ++ bool operator==(Token other) const { ++ if (_size != other._size) ++ return false; ++ return compareMemory(_p, other._p, _size) == 0; ++ } ++ ++ bool operator!=(Token other) const { ++ return !(*this == other); ++ } ++}; ++ ++/// ++/// Simple text-based dynamic library file tokenizer. ++/// ++class Tokenizer { ++ const char* _start; ++ const char* _current; ++ const char* _end; ++ Token _currentToken; ++ ++ void fetchNextToken(); ++ void scanToNextToken(); ++ void skip(unsigned distance) { ++ _current += distance; ++ assert(_current <= _end && "Skipped past the end"); ++ } ++ ++ const char* skipLineBreak(const char* pos) const; ++ bool isDelimiter(const char* pos) const; ++ ++public: ++ Tokenizer(const char* data, uint64_t size) : _start(data), _current(data), _end(data + size) {} ++ ++ void reset() { ++ _current = _start; ++ fetchNextToken(); ++ } ++ ++ Token peek() { return _currentToken; } ++ Token next() { ++ Token token = peek(); ++ fetchNextToken(); ++ return token; ++ } ++}; ++ ++const char* Tokenizer::skipLineBreak(const char* pos) const ++{ ++ if ( pos == _end ) ++ return pos; ++ ++ // Carriage return. ++ if ( *pos == 0x0D ) { ++ // line feed. ++ if ( pos + 1 != _end && *(pos + 1) == 0x0A) ++ return pos + 2; ++ return pos + 1; ++ } ++ ++ // line feed. ++ if ( *pos == 0x0A ) ++ return pos + 1; ++ ++ return pos; ++} ++ ++void Tokenizer::scanToNextToken() { ++ while (true) { ++ while ( isDelimiter(_current) ) ++ skip(1); ++ ++ const char* i = skipLineBreak(_current); ++ if ( i == _current ) ++ break; ++ ++ _current = i; ++ } ++} ++ ++ ++bool Tokenizer::isDelimiter(const char* pos) const { ++ if ( pos == _end ) ++ return false; ++ if ( *pos == ' ' || *pos == '\t' || *pos == '\r' || *pos == '\n' || *pos == ',' || *pos == ':' || *pos == '\'' || *pos == '\"' ) ++ return true; ++ return false; ++} ++ ++void Tokenizer::fetchNextToken() { ++ scanToNextToken(); ++ ++ if (_current == _end) { ++ _currentToken = Token(); ++ return; ++ } ++ ++ auto start = _current; ++ while ( !isDelimiter(_current) ) { ++ ++_current; ++ } ++ ++ _currentToken = Token(start, _current - start); ++} ++ ++/// ++/// Representation of a parsed text-based dynamic library file. ++/// ++struct DynamicLibrary { ++ Token _installName; ++ uint32_t _currentVersion; ++ uint32_t _compatibilityVersion; ++ uint8_t _swiftVersion; ++ ld::File::ObjcConstraint _objcConstraint; ++ Options::Platform _platform; ++ std::vector _allowedClients; ++ std::vector _reexportedLibraries; ++ std::vector _symbols; ++ std::vector _classes; ++ std::vector _ivars; ++ std::vector _weakDefSymbols; ++ std::vector _tlvSymbols; ++ ++ DynamicLibrary() : _currentVersion(0x10000), _compatibilityVersion(0x10000), _swiftVersion(0), ++ _objcConstraint(ld::File::objcConstraintNone) {} ++}; ++ ++/// ++/// A simple text-based dynamic library file parser. ++/// ++class TBDFile { ++ Tokenizer _tokenizer; ++ ++ Token peek() { return _tokenizer.peek(); } ++ Token next() { return _tokenizer.next(); } ++ ++ void expectToken(Token str) { ++ Token token = next(); ++ if (token != str) ++ throwf("unexpected token: %s", token.str().c_str()); ++ } ++ ++ bool hasOptionalToken(Token str) { ++ auto token = peek(); ++ if ( token == str ) { ++ next(); ++ return true; ++ } ++ return false; ++ } ++ ++ ++ void parseFlowSequence(std::function func) { ++ expectToken("["); ++ ++ while ( true ) { ++ auto token = peek(); ++ if ( token == "]" ) ++ break; ++ ++ token = next(); ++ func(token); ++ } ++ ++ expectToken("]"); ++ } ++ ++ void parseAllowedClients(DynamicLibrary& lib) { ++ if ( !hasOptionalToken("allowed-clients") ) ++ return; ++ parseFlowSequence([&](Token name) { ++ lib._allowedClients.emplace_back(name); ++ }); ++ } ++ ++ void parseReexportedDylibs(DynamicLibrary& lib) { ++ if ( !hasOptionalToken("re-exports") ) ++ return; ++ parseFlowSequence([&](Token name) { ++ lib._reexportedLibraries.emplace_back(name); ++ }); ++ } ++ ++ void parseSymbols(DynamicLibrary& lib) { ++ if ( hasOptionalToken("symbols") ) { ++ parseFlowSequence([&](Token name) { ++ lib._symbols.emplace_back(name); ++ }); ++ } ++ ++ if ( hasOptionalToken("objc-classes") ) { ++ parseFlowSequence([&](Token name) { ++ lib._classes.emplace_back(name); ++ }); ++ } ++ ++ if ( hasOptionalToken("objc-ivars") ) { ++ parseFlowSequence([&](Token name) { ++ lib._ivars.emplace_back(name); ++ }); ++ } ++ ++ if ( hasOptionalToken("weak-def-symbols") ) { ++ parseFlowSequence([&](Token name) { ++ lib._weakDefSymbols.emplace_back(name); ++ }); ++ } ++ ++ if ( hasOptionalToken("thread-local-symbols") ) { ++ parseFlowSequence([&](Token name) { ++ lib._tlvSymbols.emplace_back(name); ++ }); ++ } ++ } ++ ++ std::vector parseArchFlowSequence() { ++ std::vector availabledArchitectures; ++ expectToken("archs"); ++ parseFlowSequence([&](Token name) { ++ availabledArchitectures.emplace_back(name.str()); ++ }); ++ return availabledArchitectures; ++ } ++ ++ bool parseArchFlowSequence(std::string &selectedArchName) { ++ auto availabledArchitectures = parseArchFlowSequence(); ++ ++ for (const auto &archName : availabledArchitectures) { ++ if (archName == selectedArchName) ++ return true; ++ } ++ ++ return false; ++ } ++ ++ void parsePlatform(DynamicLibrary& lib) { ++ expectToken("platform"); ++ ++ auto token = next(); ++ if (token == "macosx") ++ lib._platform = Options::kPlatformOSX; ++ else if (token == "ios") ++ lib._platform = Options::kPlatformiOS; ++ else if (token == "watchos") ++ lib._platform = Options::kPlatformWatchOS; ++#if SUPPORT_APPLE_TV ++ else if (token == "tvos") ++ lib._platform = Options::kPlatform_tvOS; ++#endif ++ else ++ lib._platform = Options::kPlatformUnknown; ++ } ++ ++ void parseInstallName(DynamicLibrary& lib) { ++ expectToken("install-name"); ++ ++ lib._installName = next(); ++ if ( lib._installName.empty() ) ++ throwf("no install name specified"); ++ } ++ ++ uint32_t parseVersionNumber32(Token token) { ++ if ( token.size() >= 128 ) ++ throwf("malformed version number"); ++ ++ // Make a null-terminated string. ++ char buffer[128]; ++ ::memcpy(buffer, token.data(), token.size()); ++ buffer[token.size()] = '\0'; ++ ++ return Options::parseVersionNumber32(buffer); ++ } ++ ++ void parseCurrentVersion(DynamicLibrary& lib) { ++ if ( !hasOptionalToken("current-version") ) ++ return; ++ lib._currentVersion = parseVersionNumber32(next()); ++ } ++ ++ void parseCompatibilityVersion(DynamicLibrary& lib) { ++ if ( !hasOptionalToken("compatibility-version") ) ++ return; ++ lib._compatibilityVersion = parseVersionNumber32(next()); ++ } ++ ++ void parseSwiftVersion(DynamicLibrary& lib) { ++ if ( !hasOptionalToken("swift-version") ) ++ return; ++ auto token = next(); ++ if ( token == "1.0" ) ++ lib._swiftVersion = 1; ++ else if ( token == "1.1" ) ++ lib._swiftVersion = 2; ++ else if ( token == "2.0" ) ++ lib._swiftVersion = 3; ++ else ++ throwf("unsupported Swift ABI version: %s", token.str().c_str()); ++ } ++ ++ void parseObjCConstraint(DynamicLibrary& lib) { ++ if ( !hasOptionalToken("objc-constraint") ) ++ return; ++ auto token = next(); ++ if ( token == "none" ) ++ lib._objcConstraint = ld::File::objcConstraintNone; ++ else if ( token == "retain_release" ) ++ lib._objcConstraint = ld::File::objcConstraintRetainRelease; ++ else if ( token == "retain_release_for_simulator" ) ++ lib._objcConstraint = ld::File::objcConstraintRetainReleaseForSimulator; ++ else if ( token == "retain_release_or_gc" ) ++ lib._objcConstraint = ld::File::objcConstraintRetainReleaseOrGC; ++ else if ( token == "gc" ) ++ lib._objcConstraint = ld::File::objcConstraintGC; ++ else ++ throwf("unexpected token: %s", token.str().c_str()); ++ } ++ void parseExportsBlock(DynamicLibrary& lib, std::string &selectedArchName) { ++ if ( !hasOptionalToken("exports") ) ++ return; ++ ++ if ( !hasOptionalToken("-") ) ++ return; ++ ++ while ( true ) { ++ if ( !parseArchFlowSequence(selectedArchName) ) { ++ Token token; ++ while ( true ) { ++ token = peek(); ++ if ( token == "archs" || token == "..." || token.empty() ) ++ break; ++ next(); ++ } ++ if (token == "..." || token.empty() ) ++ break; ++ ++ continue; ++ } ++ ++ parseAllowedClients(lib); ++ parseReexportedDylibs(lib); ++ parseSymbols(lib); ++ if ( !hasOptionalToken("-") ) ++ break; ++ } ++ } ++ ++ std::vector getCompatibleArchList(std::string &requestedArchName) { ++ if (requestedArchName == "i386") ++ return {"i386"}; ++ else if (requestedArchName == "x86_64" || requestedArchName == "x86_64h") ++ return {"x86_64", "x86_64h"}; ++ else if (requestedArchName == "armv7" || requestedArchName == "armv7s") ++ return {"armv7", "armv7s"}; ++ else if (requestedArchName == "armv7k") ++ return {"armv7k"}; ++ else if (requestedArchName == "arm64") ++ return {"arm64"}; ++ else ++ return {}; ++ } ++ ++ std::string parseAndSelectArchitecture(std::string &requestedArchName) { ++ auto availabledArchitectures = parseArchFlowSequence(); ++ ++ // First try to find an exact match (cpu type and sub-cpu type). ++ if (std::find(availabledArchitectures.begin(), availabledArchitectures.end(), requestedArchName) ++ != availabledArchitectures.end()) ++ return requestedArchName; ++ ++ // If there is no exact match, then try to find an ABI compatible slice. ++ auto compatibleArchitectures = getCompatibleArchList(requestedArchName); ++ std::vector result; ++ std::sort(availabledArchitectures.begin(), availabledArchitectures.end()); ++ std::sort(compatibleArchitectures.begin(), compatibleArchitectures.end()); ++ std::set_intersection(availabledArchitectures.begin(), availabledArchitectures.end(), ++ compatibleArchitectures.begin(), compatibleArchitectures.end(), ++ std::back_inserter(result)); ++ ++ if (result.empty()) ++ return std::string(); ++ else ++ return result.front(); ++ } ++ ++ void parseDocument(DynamicLibrary& lib, std::string &requestedArchName) { ++ auto selectedArchName = parseAndSelectArchitecture(requestedArchName); ++ if (selectedArchName.empty()) ++ throwf("invalid arch"); ++ ++ parsePlatform(lib); ++ parseInstallName(lib); ++ parseCurrentVersion(lib); ++ parseCompatibilityVersion(lib); ++ parseSwiftVersion(lib); ++ parseObjCConstraint(lib); ++ parseExportsBlock(lib, selectedArchName); ++ } ++ ++public: ++ TBDFile(const char* data, uint64_t size) : _tokenizer(data, size) {} ++ ++ DynamicLibrary parseFileForArch(std::string requestedArchName) { ++ _tokenizer.reset(); ++ DynamicLibrary lib; ++ expectToken("---"); ++ parseDocument(lib, requestedArchName); ++ expectToken("..."); ++ return lib; ++ } ++ ++ bool validForArch(std::string requestedArchName) { ++ _tokenizer.reset(); ++ auto token = next(); ++ if ( token != "---" ) ++ return false; ++ return !parseAndSelectArchitecture(requestedArchName).empty(); ++ } ++ ++ void dumpTokens() { ++ _tokenizer.reset(); ++ Token token; ++ do { ++ token = next(); ++ printf("token: %s\n", token.str().c_str()); ++ } while ( !token.empty() ); ++ } ++}; ++ ++} // end anonymous namespace + + namespace textstub { + namespace dylib { +@@ -50,94 +513,51 @@ class File final : public generic::dylib::File + using Base = generic::dylib::File; + + public: +- File(const char* path, const uint8_t* fileContent, uint64_t fileLength, ++ static bool validFile(const uint8_t* fileContent, bool executableOrDylib); ++ File(const uint8_t* fileContent, uint64_t fileLength, const char* path, + time_t mTime, ld::File::Ordinal ordinal, bool linkingFlatNamespace, +- bool linkingMainExecutable, bool hoistImplicitPublicDylibs, +- Options::Platform platform, uint32_t linkMinOSVersion, bool allowWeakImports, +- cpu_type_t cpuType, cpu_subtype_t cpuSubType, bool enforceDylibSubtypesMatch, +- bool allowSimToMacOSX, bool addVers, bool buildingForSimulator, ++ bool hoistImplicitPublicDylibs, Options::Platform platform, ++ cpu_type_t cpuType, const char* archName, uint32_t linkMinOSVersion, ++ bool allowWeakImports, bool allowSimToMacOSX, bool addVers, bool buildingForSimulator, + bool logAllFiles, const char* installPath, bool indirectDylib); + virtual ~File() noexcept {} + + private: +- void buildExportHashTable(const tapi::LinkerInterfaceFile* file); +-}; +- +-static ld::File::ObjcConstraint mapObjCConstraint(tapi::ObjCConstraint constraint) { +- switch (constraint) { +- case tapi::ObjCConstraint::None: +- return ld::File::objcConstraintNone; +- case tapi::ObjCConstraint::Retain_Release: +- return ld::File::objcConstraintRetainRelease; +- case tapi::ObjCConstraint::Retain_Release_For_Simulator: +- return ld::File::objcConstraintRetainReleaseForSimulator; +- case tapi::ObjCConstraint::Retain_Release_Or_GC: +- return ld::File::objcConstraintRetainReleaseOrGC; +- case tapi::ObjCConstraint::GC: +- return ld::File::objcConstraintGC; +- } +- +- return ld::File::objcConstraintNone; +-} ++ void buildExportHashTable(const DynamicLibrary &lib); + +-static Options::Platform mapPlatform(tapi::Platform platform) { +- switch (platform) { +- case tapi::Platform::Unknown: +- return Options::kPlatformUnknown; +- case tapi::Platform::OSX: +- return Options::kPlatformOSX; +- case tapi::Platform::iOS: +- return Options::kPlatformiOS; +- case tapi::Platform::watchOS: +- return Options::kPlatformWatchOS; +- case tapi::Platform::tvOS: +- return Options::kPlatform_tvOS; +- } +- +- return Options::kPlatformUnknown; +-} ++ cpu_type_t _cpuType; ++}; + + template +- File::File(const char* path, const uint8_t* fileContent, uint64_t fileLength, +- time_t mTime, ld::File::Ordinal ord, bool linkingFlatNamespace, +- bool linkingMainExecutable, bool hoistImplicitPublicDylibs, Options::Platform platform, +- uint32_t linkMinOSVersion, bool allowWeakImports, cpu_type_t cpuType, cpu_subtype_t cpuSubType, +- bool enforceDylibSubtypesMatch, bool allowSimToMacOSX, bool addVers, ++File::File(const uint8_t* fileContent, uint64_t fileLength, const char* path, time_t mTime, ++ ld::File::Ordinal ord, bool linkingFlatNamespace, bool hoistImplicitPublicDylibs, ++ Options::Platform platform, cpu_type_t cpuType, const char* archName, ++ uint32_t linkMinOSVersion, bool allowWeakImports, bool allowSimToMacOSX, bool addVers, + bool buildingForSimulator, bool logAllFiles, const char* targetInstallPath, + bool indirectDylib) + : Base(strdup(path), mTime, ord, platform, linkMinOSVersion, allowWeakImports, linkingFlatNamespace, +- hoistImplicitPublicDylibs, allowSimToMacOSX, addVers) ++ hoistImplicitPublicDylibs, allowSimToMacOSX, addVers), ++ _cpuType(cpuType) + { +- auto matchingType = enforceDylibSubtypesMatch ? +- tapi::CpuSubTypeMatching::Exact : tapi::CpuSubTypeMatching::ABI_Compatible; +- +- std::string errorMessage; +- auto file = std::unique_ptr( +- tapi::LinkerInterfaceFile::create(path, fileContent, fileLength, cpuType, +- cpuSubType, matchingType, +- tapi::PackedVersion32(linkMinOSVersion), errorMessage)); +- +- if (file == nullptr) +- throw strdup(errorMessage.c_str()); +- +- // unmap file - it is no longer needed. +- munmap((caddr_t)fileContent, fileLength); ++ this->_bitcode = std::unique_ptr(new ld::Bitcode(nullptr, 0)); ++ // Text stubs are implicit app extension safe. ++ this->_appExtensionSafe = true; + + // write out path for -t option + if ( logAllFiles ) + printf("%s\n", path); + +- this->_bitcode = std::unique_ptr(new ld::Bitcode(nullptr, 0)); +- this->_noRexports = !file->hasReexportedLibraries(); +- this->_hasWeakExports = file->hasWeakDefinedExports(); +- this->_dylibInstallPath = strdup(file->getInstallName().c_str()); +- this->_installPathOverride = file->isInstallNameVersionSpecific(); +- this->_dylibCurrentVersion = file->getCurrentVersion(); +- this->_dylibCompatibilityVersion = file->getCompatibilityVersion(); +- this->_swiftVersion = file->getSwiftVersion(); +- this->_objcConstraint = mapObjCConstraint(file->getObjCConstraint()); +- this->_parentUmbrella = file->getParentFrameworkName().empty() ? nullptr : strdup(file->getParentFrameworkName().c_str()); +- this->_appExtensionSafe = file->isApplicationExtensionSafe(); ++ TBDFile stub((const char*)fileContent, fileLength); ++ auto lib = stub.parseFileForArch(archName); ++ ++ this->_noRexports = lib._reexportedLibraries.empty(); ++ this->_hasWeakExports = !lib._weakDefSymbols.empty(); ++ this->_dylibInstallPath = strdup(lib._installName.str().c_str()); ++ this->_dylibCurrentVersion = lib._currentVersion; ++ this->_dylibCompatibilityVersion = lib._compatibilityVersion; ++ this->_swiftVersion = lib._swiftVersion; ++ this->_objcConstraint = lib._objcConstraint; ++ this->_hasPublicInstallName = this->isPublicLocation(this->_dylibInstallPath); + + // if framework, capture framework name + const char* lastSlash = strrchr(this->_dylibInstallPath, '/'); +@@ -151,69 +571,100 @@ template + this->_frameworkName = leafName; + } + +- for (auto &client : file->allowableClients()) +- this->_allowableClients.push_back(strdup(client.c_str())); ++ // TEMPORARY HACK BEGIN: Support ancient re-export command LC_SUB_FRAMEWORK. ++ // [TAPI] Support LC_SUB_FRAMEWORK as re-export indicator. ++ auto installName = std::string(this->_dylibInstallPath); ++ ++ // All sub-frameworks of ApplicationServices use LC_SUB_FRAMEWORK. ++ if (installName.find("/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/") == 0 && ++ installName.find(".dylib") == std::string::npos) { ++ this->_parentUmbrella = "ApplicationServices"; ++ } else if (installName.find("/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/") == 0) { ++ this->_parentUmbrella = "Carbon"; ++ } else if (installName.find("/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/") == 0 && ++ installName.find(".dylib") == std::string::npos) { ++ this->_parentUmbrella = "CoreServices"; ++ } else if (installName.find("/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLinearAlgebra.dylib") == 0 || ++ installName.find("/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libQuadrature.dylib") == 0 || ++ installName.find("System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libSparseBLAS.dylib") == 0) { ++ this->_parentUmbrella = "vecLib"; ++ } else if (installName.find("/System/Library/Frameworks/WebKit.framework/Versions/A/Frameworks/WebCore.framework/Versions/A/WebCore") == 0) { ++ this->_parentUmbrella = "WebKit"; ++ } else if (installName.find("/usr/lib/system/") == 0 && ++ installName != "/usr/lib/system/libkxld.dylib") { ++ this->_parentUmbrella = "System"; ++ } ++ // TEMPORARY HACK END ++ ++ for (auto &client : lib._allowedClients) { ++ if ((this->_parentUmbrella != nullptr) && (client.str() != this->_parentUmbrella)) ++ this->_allowableClients.push_back(strdup(client.str().c_str())); ++ } + + // [TAPI] Don't hoist "public" (in /usr/lib/) dylibs that should not be directly linked +- this->_hasPublicInstallName = file->hasAllowableClients() ? false : this->isPublicLocation(file->getInstallName().c_str()); +- +- for (const auto &client : file->allowableClients()) +- this->_allowableClients.emplace_back(strdup(client.c_str())); ++ if ( !this->_allowableClients.empty() ) ++ this->_hasPublicInstallName = false; + +- auto dylibPlatform = mapPlatform(file->getPlatform()); +- if ( (dylibPlatform != platform) && (platform != Options::kPlatformUnknown) ) { ++ if ( (lib._platform != platform) && (platform != Options::kPlatformUnknown) ) { + this->_wrongOS = true; + if ( this->_addVersionLoadCommand && !indirectDylib ) { + if ( buildingForSimulator ) { + if ( !this->_allowSimToMacOSXLinking ) + throwf("building for %s simulator, but linking against dylib built for %s (%s).", +- Options::platformName(platform), Options::platformName(dylibPlatform), path); ++ Options::platformName(platform), Options::platformName(lib._platform), path); + } else { + throwf("building for %s, but linking against dylib built for %s (%s).", +- Options::platformName(platform), Options::platformName(dylibPlatform), path); ++ Options::platformName(platform), Options::platformName(lib._platform), path); + } + } + } + +- for (const auto& reexport : file->reexportedLibraries()) { +- const char *path = strdup(reexport.c_str()); ++ this->_dependentDylibs.reserve(lib._reexportedLibraries.size()); ++ for ( const auto& reexport : lib._reexportedLibraries ) { ++ const char *path = strdup(reexport.str().c_str()); + if ( (targetInstallPath == nullptr) || (strcmp(targetInstallPath, path) != 0) ) + this->_dependentDylibs.emplace_back(path, true); + } + +- for (const auto& symbol : file->ignoreExports()) +- this->_ignoreExports.insert(strdup(symbol.c_str())); +- +- // if linking flat and this is a flat dylib, create one atom that references all imported symbols. +- if ( linkingFlatNamespace && linkingMainExecutable && (file->hasTwoLevelNamespace() == false) ) { +- std::vector importNames; +- importNames.reserve(file->undefineds().size()); +- // We do not need to strdup the name, because that will be done by the +- // ImportAtom constructor. +- for (const auto &sym : file->undefineds()) +- importNames.emplace_back(sym.getName().c_str()); +- this->_importAtom = new generic::dylib::ImportAtom(*this, importNames); +- } +- + // build hash table +- buildExportHashTable(file.get()); ++ buildExportHashTable(lib); ++ ++ munmap((caddr_t)fileContent, fileLength); + } + + template +-void File::buildExportHashTable(const tapi::LinkerInterfaceFile* file) { ++void File::buildExportHashTable(const DynamicLibrary& lib) { + if (this->_s_logHashtable ) + fprintf(stderr, "ld: building hashtable from text-stub info in %s\n", this->path()); + +- for (const auto &sym : file->exports()) { +- const char* name = sym.getName().c_str(); +- bool weakDef = sym.isWeakDefined(); +- bool tlv = sym.isThreadLocalValue(); ++ for (auto &sym : lib._symbols) ++ this->addSymbol(sym.str().c_str()); + +- typename Base::AtomAndWeak bucket = { nullptr, weakDef, tlv, 0 }; +- if ( this->_s_logHashtable ) +- fprintf(stderr, " adding %s to hash table for %s\n", name, this->path()); +- this->_atoms[strdup(name)] = bucket; ++#if SUPPORT_ARCH_i386 ++ if (this->_platform == Options::kPlatformOSX && _cpuType == CPU_TYPE_I386) { ++ for (auto &sym : lib._classes) ++ this->addSymbol((".objc_class_name" + sym.str()).c_str()); ++ } else { ++ for (auto &sym : lib._classes) { ++ this->addSymbol(("_OBJC_CLASS_$" + sym.str()).c_str()); ++ this->addSymbol(("_OBJC_METACLASS_$" + sym.str()).c_str()); ++ } + } ++#else ++ for (auto &sym : lib._classes) { ++ this->addSymbol(("_OBJC_CLASS_$" + sym.str()).c_str()); ++ this->addSymbol(("_OBJC_METACLASS_$" + sym.str()).c_str()); ++ } ++#endif ++ ++ for (auto &sym : lib._ivars) ++ this->addSymbol(("_OBJC_IVAR_$" + sym.str()).c_str()); ++ ++ for (auto &sym : lib._weakDefSymbols) ++ this->addSymbol(sym.str().c_str(), /*weak=*/true); ++ ++ for (auto &sym : lib._tlvSymbols) ++ this->addSymbol(sym.str().c_str(), /*weak=*/false, /*tlv=*/true); + } + + template +@@ -222,21 +673,20 @@ class Parser + public: + using P = typename A::P; + +- static ld::dylib::File* parse(const char* path, const uint8_t* fileContent, +- uint64_t fileLength, time_t mTime, +- ld::File::Ordinal ordinal, const Options& opts, ++ static bool validFile(const uint8_t* fileContent, uint64_t fileLength, ++ const std::string &path, const char* archName); ++ static ld::dylib::File* parse(const uint8_t* fileContent, uint64_t fileLength, const char* path, ++ time_t mTime, ld::File::Ordinal ordinal, const Options& opts, + bool indirectDylib) + { +- return new File(path, fileContent, fileLength,mTime, ordinal, ++ return new File(fileContent, fileLength, path, mTime, ordinal, + opts.flatNamespace(), +- opts.linkingMainExecutable(), + opts.implicitlyLinkIndirectPublicDylibs(), + opts.platform(), ++ opts.architecture(), ++ opts.architectureName(), + opts.minOSversion(), + opts.allowWeakImports(), +- opts.architecture(), +- opts.subArchitecture(), +- opts.enforceDylibSubtypesMatch(), + opts.allowSimulatorToLinkWithMacOSX(), + opts.addVersionLoadCommand(), + opts.targetIOSSimulator(), +@@ -246,6 +696,20 @@ public: + } + }; + ++template ++bool Parser::validFile(const uint8_t* fileContent, uint64_t fileLength, const std::string &path, ++ const char* archName) ++{ ++ if ( path.find(".tbd", path.size()-4) == std::string::npos ) ++ return false; ++ ++ TBDFile stub((const char*)fileContent, fileLength); ++ if ( !stub.validForArch(archName) ) ++ throwf("missing required architecture %s in file %s", archName, path.c_str()); ++ ++ return true; ++} ++ + // + // main function used by linker to instantiate ld::Files + // +@@ -253,27 +717,30 @@ ld::dylib::File* parse(const uint8_t* fileContent, uint64_t fileLength, const ch + time_t modTime, const Options& opts, ld::File::Ordinal ordinal, + bool bundleLoader, bool indirectDylib) + { +- + switch ( opts.architecture() ) { + #if SUPPORT_ARCH_x86_64 + case CPU_TYPE_X86_64: +- if (tapi::LinkerInterfaceFile::isSupported(path, fileContent, fileLength)) +- return Parser::parse(path, fileContent, fileLength, modTime, ordinal, opts, indirectDylib); ++ if ( Parser::validFile(fileContent, fileLength, path, opts.architectureName()) ) ++ return Parser::parse(fileContent, fileLength, path, modTime, ordinal, opts, indirectDylib); ++ break; + #endif + #if SUPPORT_ARCH_i386 + case CPU_TYPE_I386: +- if (tapi::LinkerInterfaceFile::isSupported(path, fileContent, fileLength)) +- return Parser::parse(path, fileContent, fileLength, modTime, ordinal, opts, indirectDylib); ++ if ( Parser::validFile(fileContent, fileLength, path, opts.architectureName()) ) ++ return Parser::parse(fileContent, fileLength, path, modTime, ordinal, opts, indirectDylib); ++ break; + #endif + #if SUPPORT_ARCH_arm_any + case CPU_TYPE_ARM: +- if (tapi::LinkerInterfaceFile::isSupported(path, fileContent, fileLength)) +- return Parser::parse(path, fileContent, fileLength, modTime, ordinal, opts, indirectDylib); ++ if ( Parser::validFile(fileContent, fileLength, path, opts.architectureName()) ) ++ return Parser::parse(fileContent, fileLength, path, modTime, ordinal, opts, indirectDylib); ++ break; + #endif + #if SUPPORT_ARCH_arm64 + case CPU_TYPE_ARM64: +- if (tapi::LinkerInterfaceFile::isSupported(path, fileContent, fileLength)) +- return Parser::parse(path, fileContent, fileLength, modTime, ordinal, opts, indirectDylib); ++ if ( Parser::validFile(fileContent, fileLength, path, opts.architectureName()) ) ++ return Parser::parse(fileContent, fileLength, path, modTime, ordinal, opts, indirectDylib); ++ break; + #endif + } + return nullptr; +-- +2.11.0 + diff --git a/Programming/ld64/files/PR-29723276.patch b/Programming/ld64/files/PR-29723276.patch new file mode 100644 index 0000000..fb5a32a --- /dev/null +++ b/Programming/ld64/files/PR-29723276.patch @@ -0,0 +1,12 @@ +--- src/other/ObjectDump.cpp.orig 2016-03-09 13:27:56.000000000 -0800 ++++ src/other/ObjectDump.cpp 2016-12-18 00:12:47.000000000 -0800 +@@ -843,9 +843,6 @@ void dumper::dumpFixup(const ld::Fixup* + case ld::Fixup::kindStoreARM64PCRelToGOT: + printf(", then store as 32-bit delta to GOT entry"); + break; +- case ld::Fixup::kindStoreARM64PointerToGOT32: +- printf(", then store as 32-bit pointer to GOT entry"); +- break; + case ld::Fixup::kindDtraceExtra: + printf("dtrace static probe extra info"); + break; diff --git a/Programming/ld64/files/PR-29723629.patch b/Programming/ld64/files/PR-29723629.patch new file mode 100644 index 0000000..66a8c8d --- /dev/null +++ b/Programming/ld64/files/PR-29723629.patch @@ -0,0 +1,37 @@ +guard usage of thinlto_code_gen_t behind an appropriate API version check + +--- src/ld/parsers/lto_file.cpp ++++ src/ld/parsers/lto_file.cpp +@@ -292,12 +292,14 @@ private: + std::vector& newAtoms, + std::vector& additionalUndefines); + ++#if LTO_API_VERSION >= 18 + static thinlto_code_gen_t init_thinlto_codegen(const std::vector& files, + const std::vector& allAtoms, + ld::Internal& state, + const OptimizeOptions& options, + CStringToAtom& deadllvmAtoms, + CStringToAtom& llvmAtoms); ++#endif + + static std::vector _s_files; + static bool _s_llvmOptionsProcessed; +@@ -1035,6 +1037,7 @@ bool Parser::optimizeLTO(const std::vector files, + return true; + } + ++#if LTO_API_VERSION >= 18 + // Create the ThinLTO codegenerator + thinlto_code_gen_t Parser::init_thinlto_codegen(const std::vector& files, + const std::vector& allAtoms, +@@ -1185,6 +1188,7 @@ thinlto_code_gen_t Parser::init_thinlto_codegen(const std::vector& + + return thingenerator; + } ++#endif + + // Full LTO processing + bool Parser::optimizeThinLTO(const std::vector& files, +-- +2.11.0 diff --git a/Programming/ld64/files/PR-49393.patch b/Programming/ld64/files/PR-49393.patch new file mode 100644 index 0000000..47921a4 --- /dev/null +++ b/Programming/ld64/files/PR-49393.patch @@ -0,0 +1,11 @@ +--- src/ld/parsers/textstub_dylib_file.cpp.orig 2015-06-15 15:42:21.000000000 -0700 ++++ src/ld/parsers/textstub_dylib_file.cpp 2015-10-23 17:45:56.000000000 -0700 +@@ -29,7 +29,7 @@ + #include + + #include "Architectures.hpp" +-#include "bitcode.hpp" ++#include "Bitcode.hpp" + #include "MachOFileAbstraction.hpp" + #include "MachOTrie.hpp" + #include "textstub_dylib_file.hpp" diff --git a/Programming/ld64/files/ld64-133-no-CrashReporterClient.h.patch b/Programming/ld64/files/ld64-133-no-CrashReporterClient.h.patch new file mode 100644 index 0000000..20e7cdc --- /dev/null +++ b/Programming/ld64/files/ld64-133-no-CrashReporterClient.h.patch @@ -0,0 +1,21 @@ +--- src/ld/Options.cpp.orig 2012-09-04 14:00:10.000000000 -0700 ++++ src/ld/Options.cpp 2012-09-04 14:00:37.000000000 -0700 +@@ -50,7 +50,7 @@ namespace lto { + // magic to place command line in crash reports + const int crashreporterBufferSize = 2000; + static char crashreporterBuffer[crashreporterBufferSize]; +-#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070 ++#if 0 && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070 + #include + // hack until ld does not need to build on 10.6 anymore + struct crashreporter_annotations_t gCRAnnotations +@@ -4246,7 +4247,7 @@ void Options::checkForClassic(int argc, + bool newLinker = false; + + // build command line buffer in case ld crashes +-#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070 ++#if 0 && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070 + CRSetCrashLogMessage(crashreporterBuffer); + #endif + const char* srcRoot = getenv("SRCROOT"); + diff --git a/Programming/ld64/files/ld64-134-missing-include.patch b/Programming/ld64/files/ld64-134-missing-include.patch new file mode 100644 index 0000000..f682e56 --- /dev/null +++ b/Programming/ld64/files/ld64-134-missing-include.patch @@ -0,0 +1,21 @@ +--- src/ld/parsers/lto_file.cpp.orig 2012-12-30 20:08:12.000000000 -0800 ++++ src/ld/parsers/lto_file.cpp 2012-12-30 20:08:32.000000000 -0800 +@@ -35,6 +35,8 @@ + #include + #include + ++#include ++ + #include "MachOFileAbstraction.hpp" + #include "Architectures.hpp" + #include "ld.hpp" +--- src/other/rebase.cpp.orig 2013-02-08 09:28:44.000000000 -0800 ++++ src/other/rebase.cpp 2013-02-08 09:29:01.000000000 -0800 +@@ -29,6 +29,7 @@ + #include + #include + #include ++#include + #include + #include + #include diff --git a/Programming/ld64/files/ld64-136-i386-badAddress.patch b/Programming/ld64/files/ld64-136-i386-badAddress.patch new file mode 100644 index 0000000..9a44484 --- /dev/null +++ b/Programming/ld64/files/ld64-136-i386-badAddress.patch @@ -0,0 +1,11 @@ +--- src/ld/LinkEdit.hpp.orig 2013-05-27 10:47:54.000000000 -0700 ++++ src/ld/LinkEdit.hpp 2013-05-27 10:56:06.000000000 -0700 +@@ -1278,7 +1278,7 @@ template + void FunctionStartsAtom::encode() const + { + this->_encodedData.reserve(8192); +- const uint64_t badAddress = 0xFFFFFFFFFFFFFFFF; ++ const uint64_t badAddress = 0xFFFFFFFFFFFFFFFFULL; + uint64_t addr = badAddress; + // delta compress all function addresses + for (std::vector::iterator it = this->_state.sections.begin(); it != this->_state.sections.end(); ++it) { diff --git a/Programming/ld64/files/ld64-ppc-9610466.patch b/Programming/ld64/files/ld64-ppc-9610466.patch new file mode 100644 index 0000000..1a3c91e --- /dev/null +++ b/Programming/ld64/files/ld64-ppc-9610466.patch @@ -0,0 +1,17 @@ +Adjust out-of range error to be a warning on ppc + +AKA for ppc + +https://trac.macports.org/ticket/46801 + +--- src/ld/OutputFile.cpp ++++ src/ld/OutputFile.cpp +@@ -625,7 +625,7 @@ void OutputFile::rangeCheckAbsolute32(int64_t displacement, ld::Internal& state, + // is encoded in mach-o the same as: + // .long _foo + 0x40000000 + // so if _foo lays out to 0xC0000100, the first is ok, but the second is not. +- if ( (_options.architecture() == CPU_TYPE_ARM) || (_options.architecture() == CPU_TYPE_I386) ) { ++ if ( (_options.architecture() == CPU_TYPE_ARM) || (_options.architecture() == CPU_TYPE_I386) || (_options.architecture() == CPU_TYPE_POWERPC) ) { + // Unlikely userland code does funky stuff like this, so warn for them, but not warn for -preload or -static + if ( (_options.outputKind() != Options::kPreload) && (_options.outputKind() != Options::kStaticExecutable) ) { + warning("32-bit absolute address out of range (0x%08llX max is 4GB): from %s + 0x%08X (0x%08llX) to 0x%08llX", diff --git a/Programming/ld64/files/ld64-version.patch b/Programming/ld64/files/ld64-version.patch new file mode 100644 index 0000000..85df69a --- /dev/null +++ b/Programming/ld64/files/ld64-version.patch @@ -0,0 +1,19 @@ +--- src/ld/Options.cpp 2008-03-20 18:48:04.000000000 -0700 ++++ src/ld/Options.cpp 2012-04-11 15:54:34.000000000 -0700 +@@ -32,6 +32,8 @@ + + #include "Options.h" + ++const char ldVersionString[] = "@(#)PROGRAM:ld PROJECT:ld64-@@VERSION@@\n"; ++ + void throwf(const char* format, ...) + { + va_list list; +@@ -2153,7 +2155,6 @@ void Options::buildSearchPaths(int argc, + addStandardLibraryDirectories = false; + else if ( strcmp(argv[i], "-v") == 0 ) { + fVerbose = true; +- extern const char ldVersionString[]; + fprintf(stderr, "%s", ldVersionString); + // if only -v specified, exit cleanly + if ( argc == 2 ) diff --git a/Programming/ld64/files/lto.h b/Programming/ld64/files/lto.h new file mode 100644 index 0000000..b1f5a45 --- /dev/null +++ b/Programming/ld64/files/lto.h @@ -0,0 +1,797 @@ +/*===-- llvm-c/lto.h - LTO Public C Interface ---------------------*- C -*-===*\ +|* *| +|* The LLVM Compiler Infrastructure *| +|* *| +|* This file is distributed under the University of Illinois Open Source *| +|* License. See LICENSE.TXT for details. *| +|* *| +|*===----------------------------------------------------------------------===*| +|* *| +|* This header provides public interface to an abstract link time optimization*| +|* library. LLVM provides an implementation of this interface for use with *| +|* llvm bitcode files. *| +|* *| +\*===----------------------------------------------------------------------===*/ + +#ifndef LLVM_C_LTO_H +#define LLVM_C_LTO_H + +#ifdef __cplusplus +#include +#else +#include +#endif +#include + +#ifndef __cplusplus +#if !defined(_MSC_VER) +#include +typedef bool lto_bool_t; +#else +/* MSVC in particular does not have anything like _Bool or bool in C, but we can + at least make sure the type is the same size. The implementation side will + use C++ bool. */ +typedef unsigned char lto_bool_t; +#endif +#else +typedef bool lto_bool_t; +#endif + +/** + * @defgroup LLVMCLTO LTO + * @ingroup LLVMC + * + * @{ + */ + +#define LTO_API_VERSION 20 + +/** + * \since prior to LTO_API_VERSION=3 + */ +typedef enum { + LTO_SYMBOL_ALIGNMENT_MASK = 0x0000001F, /* log2 of alignment */ + LTO_SYMBOL_PERMISSIONS_MASK = 0x000000E0, + LTO_SYMBOL_PERMISSIONS_CODE = 0x000000A0, + LTO_SYMBOL_PERMISSIONS_DATA = 0x000000C0, + LTO_SYMBOL_PERMISSIONS_RODATA = 0x00000080, + LTO_SYMBOL_DEFINITION_MASK = 0x00000700, + LTO_SYMBOL_DEFINITION_REGULAR = 0x00000100, + LTO_SYMBOL_DEFINITION_TENTATIVE = 0x00000200, + LTO_SYMBOL_DEFINITION_WEAK = 0x00000300, + LTO_SYMBOL_DEFINITION_UNDEFINED = 0x00000400, + LTO_SYMBOL_DEFINITION_WEAKUNDEF = 0x00000500, + LTO_SYMBOL_SCOPE_MASK = 0x00003800, + LTO_SYMBOL_SCOPE_INTERNAL = 0x00000800, + LTO_SYMBOL_SCOPE_HIDDEN = 0x00001000, + LTO_SYMBOL_SCOPE_PROTECTED = 0x00002000, + LTO_SYMBOL_SCOPE_DEFAULT = 0x00001800, + LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN = 0x00002800, + LTO_SYMBOL_COMDAT = 0x00004000, + LTO_SYMBOL_ALIAS = 0x00008000 +} lto_symbol_attributes; + +/** + * \since prior to LTO_API_VERSION=3 + */ +typedef enum { + LTO_DEBUG_MODEL_NONE = 0, + LTO_DEBUG_MODEL_DWARF = 1 +} lto_debug_model; + +/** + * \since prior to LTO_API_VERSION=3 + */ +typedef enum { + LTO_CODEGEN_PIC_MODEL_STATIC = 0, + LTO_CODEGEN_PIC_MODEL_DYNAMIC = 1, + LTO_CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC = 2, + LTO_CODEGEN_PIC_MODEL_DEFAULT = 3 +} lto_codegen_model; + +/** opaque reference to a loaded object module */ +typedef struct LLVMOpaqueLTOModule *lto_module_t; + +/** opaque reference to a code generator */ +typedef struct LLVMOpaqueLTOCodeGenerator *lto_code_gen_t; + +/** opaque reference to a thin code generator */ +typedef struct LLVMOpaqueThinLTOCodeGenerator *thinlto_code_gen_t; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Returns a printable string. + * + * \since prior to LTO_API_VERSION=3 + */ +extern const char* +lto_get_version(void); + +/** + * Returns the last error string or NULL if last operation was successful. + * + * \since prior to LTO_API_VERSION=3 + */ +extern const char* +lto_get_error_message(void); + +/** + * Checks if a file is a loadable object file. + * + * \since prior to LTO_API_VERSION=3 + */ +extern lto_bool_t +lto_module_is_object_file(const char* path); + +/** + * Checks if a file is a loadable object compiled for requested target. + * + * \since prior to LTO_API_VERSION=3 + */ +extern lto_bool_t +lto_module_is_object_file_for_target(const char* path, + const char* target_triple_prefix); + +/** + * Return true if \p Buffer contains a bitcode file with ObjC code (category + * or class) in it. + * + * \since LTO_API_VERSION=20 + */ +extern lto_bool_t +lto_module_has_objc_category(const void *mem, size_t length); + +/** +* Checks if a buffer is a loadable object file. +* +* \since prior to LTO_API_VERSION=3 +*/ +extern lto_bool_t lto_module_is_object_file_in_memory(const void *mem, + size_t length); + +/** + * Checks if a buffer is a loadable object compiled for requested target. + * + * \since prior to LTO_API_VERSION=3 + */ +extern lto_bool_t +lto_module_is_object_file_in_memory_for_target(const void* mem, size_t length, + const char* target_triple_prefix); + +/** + * Loads an object file from disk. + * Returns NULL on error (check lto_get_error_message() for details). + * + * \since prior to LTO_API_VERSION=3 + */ +extern lto_module_t +lto_module_create(const char* path); + +/** + * Loads an object file from memory. + * Returns NULL on error (check lto_get_error_message() for details). + * + * \since prior to LTO_API_VERSION=3 + */ +extern lto_module_t +lto_module_create_from_memory(const void* mem, size_t length); + +/** + * Loads an object file from memory with an extra path argument. + * Returns NULL on error (check lto_get_error_message() for details). + * + * \since LTO_API_VERSION=9 + */ +extern lto_module_t +lto_module_create_from_memory_with_path(const void* mem, size_t length, + const char *path); + +/** + * \brief Loads an object file in its own context. + * + * Loads an object file in its own LLVMContext. This function call is + * thread-safe. However, modules created this way should not be merged into an + * lto_code_gen_t using \a lto_codegen_add_module(). + * + * Returns NULL on error (check lto_get_error_message() for details). + * + * \since LTO_API_VERSION=11 + */ +extern lto_module_t +lto_module_create_in_local_context(const void *mem, size_t length, + const char *path); + +/** + * \brief Loads an object file in the codegen context. + * + * Loads an object file into the same context as \c cg. The module is safe to + * add using \a lto_codegen_add_module(). + * + * Returns NULL on error (check lto_get_error_message() for details). + * + * \since LTO_API_VERSION=11 + */ +extern lto_module_t +lto_module_create_in_codegen_context(const void *mem, size_t length, + const char *path, lto_code_gen_t cg); + +/** + * Loads an object file from disk. The seek point of fd is not preserved. + * Returns NULL on error (check lto_get_error_message() for details). + * + * \since LTO_API_VERSION=5 + */ +extern lto_module_t +lto_module_create_from_fd(int fd, const char *path, size_t file_size); + +/** + * Loads an object file from disk. The seek point of fd is not preserved. + * Returns NULL on error (check lto_get_error_message() for details). + * + * \since LTO_API_VERSION=5 + */ +extern lto_module_t +lto_module_create_from_fd_at_offset(int fd, const char *path, size_t file_size, + size_t map_size, off_t offset); + +/** + * Frees all memory internally allocated by the module. + * Upon return the lto_module_t is no longer valid. + * + * \since prior to LTO_API_VERSION=3 + */ +extern void +lto_module_dispose(lto_module_t mod); + +/** + * Returns triple string which the object module was compiled under. + * + * \since prior to LTO_API_VERSION=3 + */ +extern const char* +lto_module_get_target_triple(lto_module_t mod); + +/** + * Sets triple string with which the object will be codegened. + * + * \since LTO_API_VERSION=4 + */ +extern void +lto_module_set_target_triple(lto_module_t mod, const char *triple); + +/** + * Returns the number of symbols in the object module. + * + * \since prior to LTO_API_VERSION=3 + */ +extern unsigned int +lto_module_get_num_symbols(lto_module_t mod); + +/** + * Returns the name of the ith symbol in the object module. + * + * \since prior to LTO_API_VERSION=3 + */ +extern const char* +lto_module_get_symbol_name(lto_module_t mod, unsigned int index); + +/** + * Returns the attributes of the ith symbol in the object module. + * + * \since prior to LTO_API_VERSION=3 + */ +extern lto_symbol_attributes +lto_module_get_symbol_attribute(lto_module_t mod, unsigned int index); + +/** + * Returns the module's linker options. + * + * The linker options may consist of multiple flags. It is the linker's + * responsibility to split the flags using a platform-specific mechanism. + * + * \since LTO_API_VERSION=16 + */ +extern const char* +lto_module_get_linkeropts(lto_module_t mod); + +/** + * Diagnostic severity. + * + * \since LTO_API_VERSION=7 + */ +typedef enum { + LTO_DS_ERROR = 0, + LTO_DS_WARNING = 1, + LTO_DS_REMARK = 3, // Added in LTO_API_VERSION=10. + LTO_DS_NOTE = 2 +} lto_codegen_diagnostic_severity_t; + +/** + * Diagnostic handler type. + * \p severity defines the severity. + * \p diag is the actual diagnostic. + * The diagnostic is not prefixed by any of severity keyword, e.g., 'error: '. + * \p ctxt is used to pass the context set with the diagnostic handler. + * + * \since LTO_API_VERSION=7 + */ +typedef void (*lto_diagnostic_handler_t)( + lto_codegen_diagnostic_severity_t severity, const char *diag, void *ctxt); + +/** + * Set a diagnostic handler and the related context (void *). + * This is more general than lto_get_error_message, as the diagnostic handler + * can be called at anytime within lto. + * + * \since LTO_API_VERSION=7 + */ +extern void lto_codegen_set_diagnostic_handler(lto_code_gen_t, + lto_diagnostic_handler_t, + void *); + +/** + * Instantiates a code generator. + * Returns NULL on error (check lto_get_error_message() for details). + * + * All modules added using \a lto_codegen_add_module() must have been created + * in the same context as the codegen. + * + * \since prior to LTO_API_VERSION=3 + */ +extern lto_code_gen_t +lto_codegen_create(void); + +/** + * \brief Instantiate a code generator in its own context. + * + * Instantiates a code generator in its own context. Modules added via \a + * lto_codegen_add_module() must have all been created in the same context, + * using \a lto_module_create_in_codegen_context(). + * + * \since LTO_API_VERSION=11 + */ +extern lto_code_gen_t +lto_codegen_create_in_local_context(void); + +/** + * Frees all code generator and all memory it internally allocated. + * Upon return the lto_code_gen_t is no longer valid. + * + * \since prior to LTO_API_VERSION=3 + */ +extern void +lto_codegen_dispose(lto_code_gen_t); + +/** + * Add an object module to the set of modules for which code will be generated. + * Returns true on error (check lto_get_error_message() for details). + * + * \c cg and \c mod must both be in the same context. See \a + * lto_codegen_create_in_local_context() and \a + * lto_module_create_in_codegen_context(). + * + * \since prior to LTO_API_VERSION=3 + */ +extern lto_bool_t +lto_codegen_add_module(lto_code_gen_t cg, lto_module_t mod); + +/** + * Sets the object module for code generation. This will transfer the ownership + * of the module to the code generator. + * + * \c cg and \c mod must both be in the same context. + * + * \since LTO_API_VERSION=13 + */ +extern void +lto_codegen_set_module(lto_code_gen_t cg, lto_module_t mod); + +/** + * Sets if debug info should be generated. + * Returns true on error (check lto_get_error_message() for details). + * + * \since prior to LTO_API_VERSION=3 + */ +extern lto_bool_t +lto_codegen_set_debug_model(lto_code_gen_t cg, lto_debug_model); + +/** + * Sets which PIC code model to generated. + * Returns true on error (check lto_get_error_message() for details). + * + * \since prior to LTO_API_VERSION=3 + */ +extern lto_bool_t +lto_codegen_set_pic_model(lto_code_gen_t cg, lto_codegen_model); + +/** + * Sets the cpu to generate code for. + * + * \since LTO_API_VERSION=4 + */ +extern void +lto_codegen_set_cpu(lto_code_gen_t cg, const char *cpu); + +/** + * Sets the location of the assembler tool to run. If not set, libLTO + * will use gcc to invoke the assembler. + * + * \since LTO_API_VERSION=3 + */ +extern void +lto_codegen_set_assembler_path(lto_code_gen_t cg, const char* path); + +/** + * Sets extra arguments that libLTO should pass to the assembler. + * + * \since LTO_API_VERSION=4 + */ +extern void +lto_codegen_set_assembler_args(lto_code_gen_t cg, const char **args, + int nargs); + +/** + * Adds to a list of all global symbols that must exist in the final generated + * code. If a function is not listed there, it might be inlined into every usage + * and optimized away. + * + * \since prior to LTO_API_VERSION=3 + */ +extern void +lto_codegen_add_must_preserve_symbol(lto_code_gen_t cg, const char* symbol); + +/** + * Writes a new object file at the specified path that contains the + * merged contents of all modules added so far. + * Returns true on error (check lto_get_error_message() for details). + * + * \since LTO_API_VERSION=5 + */ +extern lto_bool_t +lto_codegen_write_merged_modules(lto_code_gen_t cg, const char* path); + +/** + * Generates code for all added modules into one native object file. + * This calls lto_codegen_optimize then lto_codegen_compile_optimized. + * + * On success returns a pointer to a generated mach-o/ELF buffer and + * length set to the buffer size. The buffer is owned by the + * lto_code_gen_t and will be freed when lto_codegen_dispose() + * is called, or lto_codegen_compile() is called again. + * On failure, returns NULL (check lto_get_error_message() for details). + * + * \since prior to LTO_API_VERSION=3 + */ +extern const void* +lto_codegen_compile(lto_code_gen_t cg, size_t* length); + +/** + * Generates code for all added modules into one native object file. + * This calls lto_codegen_optimize then lto_codegen_compile_optimized (instead + * of returning a generated mach-o/ELF buffer, it writes to a file). + * + * The name of the file is written to name. Returns true on error. + * + * \since LTO_API_VERSION=5 + */ +extern lto_bool_t +lto_codegen_compile_to_file(lto_code_gen_t cg, const char** name); + +/** + * Runs optimization for the merged module. Returns true on error. + * + * \since LTO_API_VERSION=12 + */ +extern lto_bool_t +lto_codegen_optimize(lto_code_gen_t cg); + +/** + * Generates code for the optimized merged module into one native object file. + * It will not run any IR optimizations on the merged module. + * + * On success returns a pointer to a generated mach-o/ELF buffer and length set + * to the buffer size. The buffer is owned by the lto_code_gen_t and will be + * freed when lto_codegen_dispose() is called, or + * lto_codegen_compile_optimized() is called again. On failure, returns NULL + * (check lto_get_error_message() for details). + * + * \since LTO_API_VERSION=12 + */ +extern const void* +lto_codegen_compile_optimized(lto_code_gen_t cg, size_t* length); + +/** + * Returns the runtime API version. + * + * \since LTO_API_VERSION=12 + */ +extern unsigned int +lto_api_version(void); + +/** + * Sets options to help debug codegen bugs. + * + * \since prior to LTO_API_VERSION=3 + */ +extern void +lto_codegen_debug_options(lto_code_gen_t cg, const char *); + +/** + * Initializes LLVM disassemblers. + * FIXME: This doesn't really belong here. + * + * \since LTO_API_VERSION=5 + */ +extern void +lto_initialize_disassembler(void); + +/** + * Sets if we should run internalize pass during optimization and code + * generation. + * + * \since LTO_API_VERSION=14 + */ +extern void +lto_codegen_set_should_internalize(lto_code_gen_t cg, + lto_bool_t ShouldInternalize); + +/** + * \brief Set whether to embed uselists in bitcode. + * + * Sets whether \a lto_codegen_write_merged_modules() should embed uselists in + * output bitcode. This should be turned on for all -save-temps output. + * + * \since LTO_API_VERSION=15 + */ +extern void +lto_codegen_set_should_embed_uselists(lto_code_gen_t cg, + lto_bool_t ShouldEmbedUselists); + +/** + * @} + * @defgroup LLVMCTLTO ThinLTO + * @ingroup LLVMC + * + * @{ + */ + +/** + * Type to wrap a single object returned by ThinLTO. + * + * \since LTO_API_VERSION=18 + */ +typedef struct { + const char *Buffer; + size_t Size; +} LTOObjectBuffer; + +/** + * Instantiates a ThinLTO code generator. + * Returns NULL on error (check lto_get_error_message() for details). + * + * + * The ThinLTOCodeGenerator is not intended to be reuse for multiple + * compilation: the model is that the client adds modules to the generator and + * ask to perform the ThinLTO optimizations / codegen, and finally destroys the + * codegenerator. + * + * \since LTO_API_VERSION=18 + */ +extern thinlto_code_gen_t thinlto_create_codegen(void); + +/** + * Frees the generator and all memory it internally allocated. + * Upon return the thinlto_code_gen_t is no longer valid. + * + * \since LTO_API_VERSION=18 + */ +extern void thinlto_codegen_dispose(thinlto_code_gen_t cg); + +/** + * Add a module to a ThinLTO code generator. Identifier has to be unique among + * all the modules in a code generator. The data buffer stays owned by the + * client, and is expected to be available for the entire lifetime of the + * thinlto_code_gen_t it is added to. + * + * On failure, returns NULL (check lto_get_error_message() for details). + * + * + * \since LTO_API_VERSION=18 + */ +extern void thinlto_codegen_add_module(thinlto_code_gen_t cg, + const char *identifier, const char *data, + int length); + +/** + * Optimize and codegen all the modules added to the codegenerator using + * ThinLTO. Resulting objects are accessible using thinlto_module_get_object(). + * + * \since LTO_API_VERSION=18 + */ +extern void thinlto_codegen_process(thinlto_code_gen_t cg); + +/** + * Returns the number of object files produced by the ThinLTO CodeGenerator. + * + * It usually matches the number of input files, but this is not a guarantee of + * the API and may change in future implementation, so the client should not + * assume it. + * + * \since LTO_API_VERSION=18 + */ +extern unsigned int thinlto_module_get_num_objects(thinlto_code_gen_t cg); + +/** + * Returns a reference to the ith object file produced by the ThinLTO + * CodeGenerator. + * + * Client should use \p thinlto_module_get_num_objects() to get the number of + * available objects. + * + * \since LTO_API_VERSION=18 + */ +extern LTOObjectBuffer thinlto_module_get_object(thinlto_code_gen_t cg, + unsigned int index); + +/** + * Sets which PIC code model to generate. + * Returns true on error (check lto_get_error_message() for details). + * + * \since LTO_API_VERSION=18 + */ +extern lto_bool_t thinlto_codegen_set_pic_model(thinlto_code_gen_t cg, + lto_codegen_model); + +/** + * @} + * @defgroup LLVMCTLTO_CACHING ThinLTO Cache Control + * @ingroup LLVMCTLTO + * + * These entry points control the ThinLTO cache. The cache is intended to + * support incremental build, and thus needs to be persistent accross build. + * The client enabled the cache by supplying a path to an existing directory. + * The code generator will use this to store objects files that may be reused + * during a subsequent build. + * To avoid filling the disk space, a few knobs are provided: + * - The pruning interval limit the frequency at which the garbage collector + * will try to scan the cache directory to prune it from expired entries. + * Setting to -1 disable the pruning (default). + * - The pruning expiration time indicates to the garbage collector how old an + * entry needs to be to be removed. + * - Finally, the garbage collector can be instructed to prune the cache till + * the occupied space goes below a threshold. + * @{ + */ + +/** + * Sets the path to a directory to use as a cache storage for incremental build. + * Setting this activates caching. + * + * \since LTO_API_VERSION=18 + */ +extern void thinlto_codegen_set_cache_dir(thinlto_code_gen_t cg, + const char *cache_dir); + +/** + * Sets the cache pruning interval (in seconds). A negative value disable the + * pruning. An unspecified default value will be applied, and a value of 0 will + * be ignored. + * + * \since LTO_API_VERSION=18 + */ +extern void thinlto_codegen_set_cache_pruning_interval(thinlto_code_gen_t cg, + int interval); + +/** + * Sets the maximum cache size that can be persistent across build, in terms of + * percentage of the available space on the the disk. Set to 100 to indicate + * no limit, 50 to indicate that the cache size will not be left over half the + * available space. A value over 100 will be reduced to 100, a value of 0 will + * be ignored. An unspecified default value will be applied. + * + * The formula looks like: + * AvailableSpace = FreeSpace + ExistingCacheSize + * NewCacheSize = AvailableSpace * P/100 + * + * \since LTO_API_VERSION=18 + */ +extern void thinlto_codegen_set_final_cache_size_relative_to_available_space( + thinlto_code_gen_t cg, unsigned percentage); + +/** + * Sets the expiration (in seconds) for an entry in the cache. An unspecified + * default value will be applied. A value of 0 will be ignored. + * + * \since LTO_API_VERSION=18 + */ +extern void thinlto_codegen_set_cache_entry_expiration(thinlto_code_gen_t cg, + unsigned expiration); + +/** + * @} + */ + +/** + * Sets the path to a directory to use as a storage for temporary bitcode files. + * The intention is to make the bitcode files available for debugging at various + * stage of the pipeline. + * + * \since LTO_API_VERSION=18 + */ +extern void thinlto_codegen_set_savetemps_dir(thinlto_code_gen_t cg, + const char *save_temps_dir); + +/** + * Sets the cpu to generate code for. + * + * \since LTO_API_VERSION=18 + */ +extern void thinlto_codegen_set_cpu(thinlto_code_gen_t cg, const char *cpu); + +/** + * Disable CodeGen, only run the stages till codegen and stop. The output will + * be bitcode. + * + * \since LTO_API_VERSION=19 + */ +extern void thinlto_codegen_disable_codegen(thinlto_code_gen_t cg, + lto_bool_t disable); + +/** + * Perform CodeGen only: disable all other stages. + * + * \since LTO_API_VERSION=19 + */ +extern void thinlto_codegen_set_codegen_only(thinlto_code_gen_t cg, + lto_bool_t codegen_only); + +/** + * Parse -mllvm style debug options. + * + * \since LTO_API_VERSION=18 + */ +extern void thinlto_debug_options(const char *const *options, int number); + +/** + * Test if a module has support for ThinLTO linking. + * + * \since LTO_API_VERSION=18 + */ +extern lto_bool_t lto_module_is_thinlto(lto_module_t mod); + +/** + * Adds a symbol to the list of global symbols that must exist in the final + * generated code. If a function is not listed there, it might be inlined into + * every usage and optimized away. For every single module, the functions + * referenced from code outside of the ThinLTO modules need to be added here. + * + * \since LTO_API_VERSION=18 + */ +extern void thinlto_codegen_add_must_preserve_symbol(thinlto_code_gen_t cg, + const char *name, + int length); + +/** + * Adds a symbol to the list of global symbols that are cross-referenced between + * ThinLTO files. If the ThinLTO CodeGenerator can ensure that every + * references from a ThinLTO module to this symbol is optimized away, then + * the symbol can be discarded. + * + * \since LTO_API_VERSION=18 + */ +extern void thinlto_codegen_add_cross_referenced_symbol(thinlto_code_gen_t cg, + const char *name, + int length); + +#ifdef __cplusplus +} +#endif + +/** + * @} + */ + +#endif /* LLVM_C_LTO_H */ diff --git a/Programming/matlab/README.md b/Programming/matlab/README.md new file mode 100644 index 0000000..48166e5 --- /dev/null +++ b/Programming/matlab/README.md @@ -0,0 +1,3 @@ +Installation guidelines: + +https://gitlab.psi.ch/Pmodules/buildblocks/wikis/Matlab \ No newline at end of file diff --git a/Programming/matlab/modulefile b/Programming/matlab/modulefile new file mode 100644 index 0000000..4e1490a --- /dev/null +++ b/Programming/matlab/modulefile @@ -0,0 +1,10 @@ +#%Module1.0 + +module-whatis "MATLAB" +module-url "http://ch.mathworks.com/" +module-license "MathWorks" +module-maintainer "Ivan Usov " +module-help "MATLAB (matrix laboratory) is a multi-paradigm numerical computing environment. A proprietary programming language developed by MathWorks, MATLAB allows matrix manipulations, plotting of functions and data, implementation of algorithms, creation of user interfaces, and interfacing with programs written in other languages, including C, C++, C#, Java, Fortran and Python." + +setenv MATLAB $PREFIX +prepend-path LM_LICENSE_FILE $PREFIX/licenses/license.dat diff --git a/Tools/HDFView/HDFView b/Tools/HDFView/HDFView new file mode 100755 index 0000000..6e2655e --- /dev/null +++ b/Tools/HDFView/HDFView @@ -0,0 +1,5 @@ +#!/bin/sh + +declare -r bindir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +exec "${bindir}/../libexec/hdfview.sh" 1> /dev/null 2>&1 & diff --git a/Tools/HDFView/README.md b/Tools/HDFView/README.md new file mode 100644 index 0000000..32cacf3 --- /dev/null +++ b/Tools/HDFView/README.md @@ -0,0 +1,40 @@ +# Build HDFView module + +## Notations + +Please read [this document](https://gitlab.psi.ch/Pmodules/documentation/wikis/Development/Notations) for commonly used notations and environment variables. + +## Setup environment + +Set +1. `GRP='Tools'` +2. `P=HDFView` +3. `V` to the HDFView version to install +4. `PREFIX=$PMODULES_ROOT/$GRP/$P/$V` +5. `BUILDBLOCK_DIR` to the directory of this file. +6. `MODULEFILES_DIR=$PMODULES_ROOT/$GRP/modulefiles`. +7. `RELEASE` to the release of the module + +## Download + +Download the package from https://www.hdfgroup.org/downloads/hdfview/. The compressed tar-file contains a shell-script installer. + +## Install the package + +1. Unpack the downloaded tar-file +2. `cd "$PMODULES_ROOT/Tools"`. +3. Run the installer script +4. Accept the license +5. Answer 'no' to the question "Do you want to include the subdirectory HDFView-$V-Linux?" +6. HDFView will be installed into `$PREFIX` + +## Post-install + +1. `mkdir "$PREFIX"/{bin,libexec}` +1. `mv "$PREFIX/hdfview.sh" "$PREFIX/libexec"` +2. `install --mode 0755 "$BUILDBLOCK_DIR/HDFView" "$PREFIX/bin"` + +## Install files for Pmodules + +1. `install --mode 0644 "$BUILDBLOCK_DIR/modulefile" "$MODULEFILES_DIR/$P/$V"` +2. `echo "$RELEASE" > "$MODULEFILES_DIR/$P/.release-$V"` \ No newline at end of file diff --git a/Tools/HDFView/modulefile b/Tools/HDFView/modulefile new file mode 100644 index 0000000..bf1a5d5 --- /dev/null +++ b/Tools/HDFView/modulefile @@ -0,0 +1,20 @@ +#%Module1.0 + +module-whatis "viewer for HDF files" +module-url "https://www.hdfgroup.org/downloads/hdfview/" +module-license "see \$HDFVIEW_DIR/share/doc/COPYING" +module-maintainer "Achim Gsell " + +module-help " +HDFView is a visual tool written in Java for browsing and editing HDF +(HDF5 and HDF4) files. Using HDFView, you can: + + - View a file hierarchy in a tree structure + - Create new files, add or delete groups and datasets + - View and modify the content of a dataset + - Add, delete and modify attributes + +HDFView uses the Java HDF Object Package, which implements HDF4 and HDF5 +data objects in an object-oriented form. +" + diff --git a/Tools/gnuplot/5/variants b/Tools/gnuplot/5/variants index 3b8d4f5..1093a84 100644 --- a/Tools/gnuplot/5/variants +++ b/Tools/gnuplot/5/variants @@ -1 +1,3 @@ -gnuplot/5.0.4 unstable +gnuplot/4.6.3 stable +gnuplot/5.0.0 stable +gnuplot/5.2.0 stable diff --git a/Tools/gnuplot/build b/Tools/gnuplot/build index 5b72923..f321704 100755 --- a/Tools/gnuplot/build +++ b/Tools/gnuplot/build @@ -1,5 +1,7 @@ #!/usr/bin/env modbuild +SOURCE_URL="https://sourceforge.net/projects/gnuplot/files/$P/$V/$P-$V.tar.gz" + pbuild::configure() { "${MODULE_SRCDIR}"/configure \ --prefix="${PREFIX}" \