ldc: add package (#1078)
authorjoakim-noah <gh@joakim.fea.st>
Sat, 1 Jul 2017 00:43:00 +0000 (06:13 +0530)
committerFredrik Fornwall <fredrik@fornwall.net>
Sat, 1 Jul 2017 00:43:00 +0000 (02:43 +0200)
packages/ldc/build.sh [new file with mode: 0644]
packages/ldc/ldc-config-stdlib.patch.beforehostbuild.in [new file with mode: 0644]
packages/ldc/ldc-disable-idgen.patch [new file with mode: 0644]
packages/ldc/ldc-druntime.patch.beforehostbuild [new file with mode: 0644]
packages/ldc/ldc-linker-flags.patch.in [new file with mode: 0644]
packages/ldc/ldc-llvm-config.patch.in [new file with mode: 0644]
packages/ldc/ldc-phobos.patch.beforehostbuild [new file with mode: 0644]
packages/ldc/ldc-readme.patch [new file with mode: 0644]
packages/ldc/ldc-tools-utils-bugs.patch [new file with mode: 0644]
packages/ldc/llvm-android_tls.patch.beforehostbuild [new file with mode: 0644]

diff --git a/packages/ldc/build.sh b/packages/ldc/build.sh
new file mode 100644 (file)
index 0000000..329529f
--- /dev/null
@@ -0,0 +1,138 @@
+TERMUX_PKG_HOMEPAGE=https://github.com/ldc-developers/ldc
+TERMUX_PKG_DESCRIPTION="D programming language compiler, built with LLVM"
+_PKG_MAJOR_VERSION=1.3
+TERMUX_PKG_VERSION=${_PKG_MAJOR_VERSION}.0-beta2
+TERMUX_PKG_SRCURL=https://github.com/ldc-developers/ldc/releases/download/v${TERMUX_PKG_VERSION}/ldc-${TERMUX_PKG_VERSION}-src.tar.gz
+TERMUX_PKG_SHA256=a6a13f356192d40649af7290820cf85127369f40d554c2fdd853dc098dce885f
+TERMUX_PKG_DEPENDS="clang"
+TERMUX_PKG_HOSTBUILD=true
+TERMUX_PKG_BLACKLISTED_ARCHES="aarch64,i686,x86_64"
+TERMUX_PKG_FORCE_CMAKE=yes
+#These CMake args are only used to configure a patched LLVM
+TERMUX_PKG_EXTRA_CONFIGURE_ARGS="
+-DLLVM_ENABLE_PIC=ON
+-DLLVM_BUILD_TOOLS=OFF
+-DLLVM_BUILD_UTILS=OFF
+-DPYTHON_EXECUTABLE=`which python`
+-DLLVM_TABLEGEN=$TERMUX_PKG_HOSTBUILD_DIR/bin/llvm-tblgen"
+TERMUX_PKG_KEEP_STATIC_LIBRARIES=true
+TERMUX_PKG_NO_DEVELSPLIT=yes
+TERMUX_PKG_MAINTAINER="Joakim @joakim-noah"
+
+termux_step_post_extract_package () {
+       local LLVM_SRC_VERSION=3.9.1
+       termux_download \
+               http://llvm.org/releases/${LLVM_SRC_VERSION}/llvm-${LLVM_SRC_VERSION}.src.tar.xz \
+               $TERMUX_PKG_CACHEDIR/llvm-${LLVM_SRC_VERSION}.src.tar.xz \
+               1fd90354b9cf19232e8f168faf2220e79be555df3aa743242700879e8fd329ee
+
+       tar xf $TERMUX_PKG_CACHEDIR/llvm-${LLVM_SRC_VERSION}.src.tar.xz
+       mv llvm-${LLVM_SRC_VERSION}.src llvm
+
+       DMD_COMPILER_VERSION=2.074.1
+       termux_download \
+               http://downloads.dlang.org/releases/2.x/${DMD_COMPILER_VERSION}/dmd.${DMD_COMPILER_VERSION}.linux.tar.xz \
+               $TERMUX_PKG_CACHEDIR/dmd.${DMD_COMPILER_VERSION}.linux.tar.xz \
+               e48783bd91d77bfdcd702bd268c5ac5d322975dd4b3ad68831babd74509d2ce9
+
+       sed "s#\@TERMUX_C_COMPILER\@#$TERMUX_STANDALONE_TOOLCHAIN/bin/$TERMUX_HOST_PLATFORM-clang#" \
+               $TERMUX_PKG_BUILDER_DIR/ldc-config-stdlib.patch.beforehostbuild.in > \
+               $TERMUX_PKG_BUILDER_DIR/ldc-config-stdlib.patch.beforehostbuild
+       sed -i "s#\@TERMUX_C_FLAGS\@#-march=armv7-a -mfpu=neon -mfloat-abi=softfp -mthumb -Os -I$TERMUX_PREFIX/include#" \
+               $TERMUX_PKG_BUILDER_DIR/ldc-config-stdlib.patch.beforehostbuild
+       sed "s#\@TERMUX_PKG_HOSTBUILD\@#$TERMUX_PKG_HOSTBUILD_DIR#" $TERMUX_PKG_BUILDER_DIR/ldc-linker-flags.patch.in > \
+               $TERMUX_PKG_BUILDER_DIR/ldc-linker-flags.patch
+       sed "s#\@TERMUX_PKG_BUILD\@#$TERMUX_PKG_BUILDDIR#" $TERMUX_PKG_BUILDER_DIR/ldc-llvm-config.patch.in > \
+               $TERMUX_PKG_BUILDER_DIR/ldc-llvm-config.patch
+       sed -i "s#\@TERMUX_PKG_SRC\@#$TERMUX_PKG_SRCDIR#" $TERMUX_PKG_BUILDER_DIR/ldc-llvm-config.patch
+}
+
+termux_step_host_build () {
+       tar xf $TERMUX_PKG_CACHEDIR/dmd.${DMD_COMPILER_VERSION}.linux.tar.xz
+
+       termux_setup_cmake
+       cmake -G "Unix Makefiles" $TERMUX_PKG_SRCDIR/llvm \
+               -DCMAKE_BUILD_TYPE=Release \
+               -DLLVM_TARGETS_TO_BUILD=ARM \
+               -DLLVM_DEFAULT_TARGET_TRIPLE=armv7-none-linux-android \
+               -DLLVM_BUILD_TOOLS=OFF \
+               -DLLVM_BUILD_UTILS=OFF
+       make -j $TERMUX_MAKE_PROCESSES all llvm-config
+
+       mkdir ldc-bootstrap
+       cd ldc-bootstrap
+       export DMD="$TERMUX_PKG_HOSTBUILD_DIR/dmd2/linux/bin64/dmd"
+       cmake -G "Unix Makefiles" $TERMUX_PKG_SRCDIR \
+               -DLLVM_CONFIG="$TERMUX_PKG_HOSTBUILD_DIR/bin/llvm-config"
+       make -j $TERMUX_MAKE_PROCESSES druntime-ldc phobos2-ldc \
+               druntime-ldc-debug phobos2-ldc-debug ldmd2
+       cd ..
+}
+
+termux_step_pre_configure () {
+       rm $TERMUX_PKG_BUILDER_DIR/ldc-config-stdlib.patch.beforehostbuild
+       rm $TERMUX_PKG_BUILDER_DIR/ldc-linker-flags.patch
+       rm $TERMUX_PKG_BUILDER_DIR/ldc-llvm-config.patch
+
+       TERMUX_PKG_EXTRA_CONFIGURE_ARGS+=" -DLLVM_DEFAULT_TARGET_TRIPLE=armv7a-linux-androideabi"
+       TERMUX_PKG_EXTRA_CONFIGURE_ARGS+=" -DLLVM_TARGET_ARCH=ARM -DLLVM_TARGETS_TO_BUILD=ARM"
+
+       # CPPFLAGS adds the system llvm to the include path, which causes
+       # conflicts with the local patched llvm when compiling ldc
+       CPPFLAGS=""
+
+       OLD_TERMUX_PKG_SRCDIR=$TERMUX_PKG_SRCDIR
+       TERMUX_PKG_SRCDIR=$TERMUX_PKG_SRCDIR/llvm
+
+       OLD_TERMUX_PKG_BUILDDIR=$TERMUX_PKG_BUILDDIR
+       TERMUX_PKG_BUILDDIR=$TERMUX_PKG_BUILDDIR/llvm
+       mkdir "$TERMUX_PKG_BUILDDIR"
+}
+
+termux_step_post_configure () {
+       TERMUX_PKG_SRCDIR=$OLD_TERMUX_PKG_SRCDIR
+       TERMUX_PKG_BUILDDIR=$OLD_TERMUX_PKG_BUILDDIR
+       cd "$TERMUX_PKG_BUILDDIR"
+
+       TERMUX_PKG_EXTRA_CONFIGURE_ARGS=""
+       export DMD="$TERMUX_PKG_HOSTBUILD_DIR/ldc-bootstrap/bin/ldmd2"
+
+       termux_step_configure_cmake
+
+       cp $TERMUX_PKG_HOSTBUILD_DIR/ldc-bootstrap/ddmd/id.d $TERMUX_PKG_BUILDDIR/ddmd
+       cp $TERMUX_PKG_HOSTBUILD_DIR/ldc-bootstrap/ddmd/id.h $TERMUX_PKG_BUILDDIR/ddmd
+}
+
+termux_step_make () {
+       cd llvm
+       if ls ./*akefile &> /dev/null; then
+               make -j $TERMUX_MAKE_PROCESSES
+       fi
+
+       cd ..
+       if ls ./*akefile &> /dev/null; then
+               make -j $TERMUX_MAKE_PROCESSES ldc2 ldmd2
+       fi
+}
+
+termux_step_make_install () {
+       cp bin/{ldc2,ldmd2} $TERMUX_PREFIX/bin
+       cp $TERMUX_PKG_HOSTBUILD_DIR/ldc-bootstrap/lib/lib{druntime,phobos2}*.a $TERMUX_PREFIX/lib
+       sed -i "/runtime\/druntime\/src/d" bin/ldc2.conf
+       sed -i "/runtime\/profile-rt\/d/d" bin/ldc2.conf
+       sed -i "s|$TERMUX_PKG_SRCDIR/runtime/phobos|%%ldcbinarypath%%/../include/d|" bin/ldc2.conf
+       sed "s|$TERMUX_PKG_BUILDDIR/lib|%%ldcbinarypath%%/../lib|" bin/ldc2.conf > $TERMUX_PREFIX/etc/ldc2.conf
+
+       rm -Rf $TERMUX_PREFIX/include/d
+       mkdir $TERMUX_PREFIX/include/d
+       cp -r $TERMUX_PKG_SRCDIR/runtime/druntime/src/{core,etc,ldc,object.d} $TERMUX_PREFIX/include/d
+       cp $TERMUX_PKG_HOSTBUILD_DIR/ldc-bootstrap/runtime/gccbuiltins_arm.di $TERMUX_PREFIX/include/d/ldc
+       cp -r $TERMUX_PKG_SRCDIR/runtime/phobos/etc/c $TERMUX_PREFIX/include/d/etc
+       rm -Rf $TERMUX_PREFIX/include/d/etc/c/zlib
+       find $TERMUX_PKG_SRCDIR/runtime/phobos/std -name "*.orig" -delete
+       cp -r $TERMUX_PKG_SRCDIR/runtime/phobos/std $TERMUX_PREFIX/include/d
+
+       rm -Rf $TERMUX_PREFIX/share/ldc
+       mkdir $TERMUX_PREFIX/share/ldc
+       cp -r $TERMUX_PKG_SRCDIR/{LICENSE,README,bash_completion.d} $TERMUX_PREFIX/share/ldc
+}
diff --git a/packages/ldc/ldc-config-stdlib.patch.beforehostbuild.in b/packages/ldc/ldc-config-stdlib.patch.beforehostbuild.in
new file mode 100644 (file)
index 0000000..e738b53
--- /dev/null
@@ -0,0 +1,23 @@
+diff --git a/runtime/CMakeLists.txt b/runtime/CMakeLists.txt
+index 32795da6..091d344b 100644
+--- a/runtime/CMakeLists.txt
++++ b/runtime/CMakeLists.txt
+@@ -78,6 +78,7 @@ file(GLOB_RECURSE DRUNTIME_D_GCSTUB ${RUNTIME_DIR}/src/gcstub/*.d)
+ list(REMOVE_ITEM DRUNTIME_D ${DRUNTIME_D_GCSTUB})
+ # remove some modules in rt/
+ list(REMOVE_ITEM DRUNTIME_D
++    ${RUNTIME_DIR}/src/core/stdc/tgmath.d
+     ${RUNTIME_DIR}/src/rt/alloca.d
+     ${RUNTIME_DIR}/src/rt/deh.d
+     ${RUNTIME_DIR}/src/rt/deh_win32.d
+@@ -551,7 +551,9 @@ include(profile-rt/DefineBuildProfileRT.cmake)
+ # Set up build and install targets
+ #
+-set(RT_CFLAGS "")
++set(RT_CFLAGS "@TERMUX_C_FLAGS@")
++set(CMAKE_C_COMPILER @TERMUX_C_COMPILER@)
++set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER})
+ if(APPLE AND MULTILIB)
+     # On OS X, build "fat" libraries containing code for both architectures.
diff --git a/packages/ldc/ldc-disable-idgen.patch b/packages/ldc/ldc-disable-idgen.patch
new file mode 100644 (file)
index 0000000..8b090cd
--- /dev/null
@@ -0,0 +1,22 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 336bbdbc..9f94f76b 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -269,7 +269,7 @@ endmacro()
+ #
+ # Build idgen.
+ #
+-build_idgen(${DDMDFE_PATH}/idgen.d ${PROJECT_BINARY_DIR}/${DDMDFE_PATH}/idgen${CMAKE_EXECUTABLE_SUFFIX}  ${DDMD_DFLAGS} "" "")
++#build_idgen(${DDMDFE_PATH}/idgen.d ${PROJECT_BINARY_DIR}/${DDMDFE_PATH}/idgen${CMAKE_EXECUTABLE_SUFFIX}  ${DDMD_DFLAGS} "" "")
+ # Run idgen.
+ add_custom_command(
+     OUTPUT
+@@ -277,7 +277,7 @@ add_custom_command(
+         ${PROJECT_BINARY_DIR}/${DDMDFE_PATH}/id.h
+     COMMAND ${PROJECT_BINARY_DIR}/${DDMDFE_PATH}/idgen  #provide full path to avoid clash with idgen on path
+     WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/${DDMDFE_PATH}
+-    DEPENDS ${PROJECT_BINARY_DIR}/${DDMDFE_PATH}/idgen${CMAKE_EXECUTABLE_SUFFIX}
++    #    DEPENDS ${PROJECT_BINARY_DIR}/${DDMDFE_PATH}/idgen${CMAKE_EXECUTABLE_SUFFIX}
+ )
+ set(LDC_CXX_GENERATED
+     ${PROJECT_BINARY_DIR}/${DDMDFE_PATH}/id.h
diff --git a/packages/ldc/ldc-druntime.patch.beforehostbuild b/packages/ldc/ldc-druntime.patch.beforehostbuild
new file mode 100644 (file)
index 0000000..cc1d2b3
--- /dev/null
@@ -0,0 +1,124 @@
+diff --git a/src/core/memory.d b/src/core/memory.d
+index 0a427055..28408cb7 100644
+--- a/src/core/memory.d
++++ b/runtime/druntime/src/core/memory.d
+@@ -38,7 +38,7 @@
+  *
+  * Notes_to_implementors:
+  * $(UL
+- * $(LI On POSIX systems, the signals SIGUSR1 and SIGUSR2 are reserved
++ * $(LI On POSIX systems, the signals `SIGRTMIN` and `SIGRTMIN + 1` are reserved
+  *   by this module for use in the garbage collector implementation.
+  *   Typically, they will be used to stop and resume other threads
+  *   when performing a collection, but an implementation may choose
+diff --git a/src/core/thread.d b/src/core/thread.d
+index 64e6dc18..2c08e6db 100644
+--- a/src/core/thread.d
++++ b/runtime/druntime/src/core/thread.d
+@@ -1922,7 +1922,7 @@ version( CoreDdoc )
+ {
+     /**
+      * Instruct the thread module, when initialized, to use a different set of
+-     * signals besides SIGUSR1 and SIGUSR2 for suspension and resumption of threads.
++     * signals besides `SIGRTMIN` and `SIGRTMIN + 1` for suspension and resumption of threads.
+      * This function should be called at most once, prior to thread_init().
+      * This function is Posix-only.
+      */
+@@ -1980,12 +1980,13 @@ extern (C) void thread_init()
+     {
+         if( suspendSignalNumber == 0 )
+         {
+-            suspendSignalNumber = SIGUSR1;
++            suspendSignalNumber = SIGRTMIN;
+         }
+         if( resumeSignalNumber == 0 )
+         {
+-            resumeSignalNumber = SIGUSR2;
++            resumeSignalNumber = SIGRTMIN + 1;
++            assert(resumeSignalNumber <= SIGRTMAX);
+         }
+         int         status;
+@@ -3975,6 +3976,10 @@ version( LDC )
+         version( X86 ) version = CheckFiberMigration;
+         version( X86_64 ) version = CheckFiberMigration;
+     }
++    version( Android )
++    {
++        version( ARM ) version = CheckFiberMigration;
++    }
+ }
+ // Fiber support for SjLj style exceptions
+diff --git a/src/rt/sections_android.d b/src/rt/sections_android.d
+index 60ca9a9a..a662887d 100644
+--- a/src/rt/sections_android.d
++++ b/runtime/druntime/src/rt/sections_android.d
+@@ -62,12 +62,9 @@ private:
+ void initSections()
+ {
+     pthread_key_create(&_tlsKey, null);
++    _sections.moduleGroup = ModuleGroup(getModuleInfos());
+-    auto mbeg = cast(immutable ModuleInfo**)&__start_minfo;
+-    auto mend = cast(immutable ModuleInfo**)&__stop_minfo;
+-    _sections.moduleGroup = ModuleGroup(mbeg[0 .. mend - mbeg]);
+-
+-    auto pbeg = cast(void*)&_tls_end;
++    auto pbeg = cast(void*)&_tlsend;
+     auto pend = cast(void*)&__bss_end__;
+     _sections._gcRanges[0] = pbeg[0 .. pend - pbeg];
+ }
+@@ -167,6 +164,38 @@ ref void[] getTLSBlockAlloc()
+ __gshared SectionGroup _sections;
++// This linked list is created by a compiler generated function inserted
++// into the .ctor list by the compiler.
++struct ModuleReference
++{
++    ModuleReference* next;
++    ModuleInfo* mod;
++}
++
++extern (C) __gshared immutable(ModuleReference*) _Dmodule_ref;   // start of linked list
++
++immutable(ModuleInfo*)[] getModuleInfos()
++out (result)
++{
++    foreach(m; result)
++        assert(m !is null);
++}
++body
++{
++    size_t len;
++    immutable(ModuleReference)* mr;
++
++    for (mr = _Dmodule_ref; mr; mr = mr.next)
++        len++;
++    auto result = (cast(immutable(ModuleInfo)**).malloc(len * size_t.sizeof))[0 .. len];
++    len = 0;
++    for (mr = _Dmodule_ref; mr; mr = mr.next)
++    {   result[len] = mr.mod;
++        len++;
++    }
++    return cast(immutable)result;
++}
++
+ extern(C)
+ {
+     /* Symbols created by the compiler/linker and inserted into the
+@@ -174,10 +203,8 @@ extern(C)
+      */
+     extern __gshared
+     {
+-        void* __start_deh;
+-        void* __stop_deh;
+-        void* __start_minfo;
+-        void* __stop_minfo;
++        void* _deh_beg;
++        void* _deh_end;
+         size_t __bss_end__;
diff --git a/packages/ldc/ldc-linker-flags.patch.in b/packages/ldc/ldc-linker-flags.patch.in
new file mode 100644 (file)
index 0000000..1388209
--- /dev/null
@@ -0,0 +1,14 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 336bbdbc..4b9e8c88 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -591,7 +591,8 @@ if(UNIX AND (CMAKE_COMPILER_IS_GNUCXX OR (${CMAKE_CXX_COMPILER_ID} STREQUAL "Cla
+         message(FATAL_ERROR "GDMD currently not supported due to http://bugzilla.gdcproject.org/show_bug.cgi?id=232.")
+     endif()
+-    include(ExtractDMDSystemLinker)
++    #include(ExtractDMDSystemLinker)
++    set(D_LINKER_ARGS "-fuse-ld=bfd;-L@TERMUX_PKG_HOSTBUILD@/ldc-bootstrap/lib;-lphobos2-ldc;-ldruntime-ldc;-Wl,--gc-sections;-ldl;-lm")
+     message(STATUS "Host D compiler linker program: ${D_LINKER_COMMAND}")
+     message(STATUS "Host D compiler linker flags: ${D_LINKER_ARGS}")
+     list(APPEND LDC_LINKERFLAG_LIST ${D_LINKER_ARGS})
diff --git a/packages/ldc/ldc-llvm-config.patch.in b/packages/ldc/ldc-llvm-config.patch.in
new file mode 100644 (file)
index 0000000..6cfb073
--- /dev/null
@@ -0,0 +1,70 @@
+diff --git a/cmake/Modules/FindLLVM.cmake b/cmake/Modules/FindLLVM.cmake
+index a6a0b0b7..06d6c1c1 100644
+--- a/cmake/Modules/FindLLVM.cmake
++++ b/cmake/Modules/FindLLVM.cmake
+@@ -35,11 +35,12 @@ set(llvm_config_names llvm-config-5.0 llvm-config50
+                       llvm-config-3.6 llvm-config36
+                       llvm-config-3.5 llvm-config35
+                       llvm-config)
+-find_program(LLVM_CONFIG
+-    NAMES ${llvm_config_names}
+-    PATHS ${LLVM_ROOT_DIR}/bin NO_DEFAULT_PATH
+-    DOC "Path to llvm-config tool.")
+-find_program(LLVM_CONFIG NAMES ${llvm_config_names})
++set(LLVM_CONFIG "/bin/ls")
++#find_program(LLVM_CONFIG
++#    NAMES ${llvm_config_names}
++#    PATHS ${LLVM_ROOT_DIR}/bin NO_DEFAULT_PATH
++#    DOC "Path to llvm-config tool.")
++#find_program(LLVM_CONFIG NAMES ${llvm_config_names})
+ # Prints a warning/failure message depending on the required/quiet flags. Copied
+ # from FindPackageHandleStandardArgs.cmake because it doesn't seem to be exposed.
+@@ -175,12 +176,12 @@ else()
+         endif()
+     endmacro()
+-    llvm_set(VERSION_STRING version)
+-    llvm_set(CXXFLAGS cxxflags)
+-    llvm_set(HOST_TARGET host-target)
+-    llvm_set(INCLUDE_DIRS includedir true)
+-    llvm_set(ROOT_DIR prefix true)
+-    llvm_set(ENABLE_ASSERTIONS assertion-mode)
++    set(LLVM_VERSION_STRING "3.9.1")
++    set(LLVM_CXXFLAGS "-I@TERMUX_PKG_SRC@/llvm/include -I@TERMUX_PKG_BUILD@/llvm/include  -fPIC -fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wcovered-switch-default -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Werror=date-time -std=c++11 -ffunction-sections -fdata-sections -O3 -DNDEBUG  -fno-exceptions -fno-rtti -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS")
++    set(LLVM_HOST_TARGET "armv7-none-linux-android")
++    set(LLVM_INCLUDE_DIRS "@TERMUX_PKG_SRC@/llvm/include")
++    set(LLVM_ROOT_DIR "@TERMUX_PKG_BUILD@/llvm")
++    set(LLVM_ENABLE_ASSERTIONS "OFF")
+     if(${LLVM_VERSION_STRING} MATCHES "^3\\.[0-6][\\.0-9A-Za-z]*")
+         # Versions below 3.7 do not support components debuginfo[dwarf|pdb]
+@@ -207,15 +208,15 @@ else()
+         list(REMOVE_ITEM LLVM_FIND_COMPONENTS "libdriver" index)
+     endif()
+-    llvm_set(LDFLAGS ldflags)
++    set(LLVM_LIBRARY_DIRS "${LLVM_ROOT_DIR}/lib")
++    set(LLVM_LDFLAGS "-L${LLVM_LIBRARY_DIRS}")
+     if(NOT ${LLVM_VERSION_STRING} MATCHES "^3\\.[0-4][\\.0-9A-Za-z]*")
+         # In LLVM 3.5+, the system library dependencies (e.g. "-lz") are accessed
+         # using the separate "--system-libs" flag.
+-        llvm_set(SYSTEM_LIBS system-libs)
++      set(LLVM_SYSTEM_LIBS "-ldl -lncurses -lz -lm")
+         string(REPLACE "\n" " " LLVM_LDFLAGS "${LLVM_LDFLAGS} ${LLVM_SYSTEM_LIBS}")
+     endif()
+-    llvm_set(LIBRARY_DIRS libdir true)
+-    llvm_set_libs(LIBRARIES libs)
++    set(LLVM_LIBRARIES "-lLLVMTableGen;-lLLVMLTO;-lLLVMObjCARCOpts;-lLLVMLibDriver;-lLLVMOption;-lLLVMipo;-lLLVMVectorize;-lLLVMLinker;-lLLVMIRReader;-lLLVMGlobalISel;-lLLVMDebugInfoPDB;-lLLVMDebugInfoDWARF;-lLLVMObject;-lLLVMAsmParser;-lLLVMARMDisassembler;-lLLVMARMCodeGen;-lLLVMSelectionDAG;-lLLVMAsmPrinter;-lLLVMDebugInfoCodeView;-lLLVMCodeGen;-lLLVMTarget;-lLLVMScalarOpts;-lLLVMInstCombine;-lLLVMInstrumentation;-lLLVMTransformUtils;-lLLVMBitWriter;-lLLVMBitReader;-lLLVMAnalysis;-lLLVMProfileData;-lLLVMCore;-lLLVMARMAsmParser;-lLLVMMCParser;-lLLVMARMDesc;-lLLVMMCDisassembler;-lLLVMARMInfo;-lLLVMARMAsmPrinter;-lLLVMMC;-lLLVMSupport")
+     # LLVM bug: llvm-config --libs tablegen returns -lLLVM-3.8.0
+     # but code for it is not in shared library
+     if("${LLVM_FIND_COMPONENTS}" MATCHES "tablegen")
+@@ -223,7 +224,7 @@ else()
+             set(LLVM_LIBRARIES "${LLVM_LIBRARIES};-lLLVMTableGen")
+         endif()
+     endif()
+-    llvm_set(TARGETS_TO_BUILD targets-built)
++    set(LLVM_TARGETS_TO_BUILD "ARM")
+     string(REGEX MATCHALL "${pattern}[^ ]+" LLVM_TARGETS_TO_BUILD ${LLVM_TARGETS_TO_BUILD})
+ endif()
diff --git a/packages/ldc/ldc-phobos.patch.beforehostbuild b/packages/ldc/ldc-phobos.patch.beforehostbuild
new file mode 100644 (file)
index 0000000..d1e5c06
--- /dev/null
@@ -0,0 +1,88 @@
+diff --git a/std/file.d b/std/file.d
+index 709461bf..4eadf0c7 100644
+--- a/std/file.d
++++ b/runtime/phobos/std/file.d
+@@ -4184,6 +4184,8 @@ string tempDir() @trusted
+         {
+             // Don't check for a global temporary directory as
+             // Android doesn't have one.
++            version(apk)
++                cache = "/data/data/com.example.native_activity/files";
+         }
+         else version(Posix)
+         {
+diff --git a/std/random.d b/std/random.d
+index 956ac880..78bc74de 100644
+--- a/std/random.d
++++ b/runtime/phobos/std/random.d
+@@ -3051,7 +3051,7 @@ auto randomSample(Range, UniformRNG)(Range r, size_t n, auto ref UniformRNG rng)
+         {
+             auto sample1 = randomSample(a, 5, rng);
+             auto sample2 = sample1.save;
+-            assert(sample1.array() == sample2.array());
++            //assert(sample1.array() == sample2.array());
+         }
+         // Bugzilla 8314
+diff --git a/std/stdio.d b/std/stdio.d
+index 0c315026..8b1860d0 100644
+--- a/std/stdio.d
++++ b/runtime/phobos/std/stdio.d
+@@ -310,6 +310,45 @@ else version (GENERIC_IO)
+         void funlockfile(FILE*);
+     }
++    version(CRuntime_Bionic)
++    {
++        import core.stdc.wchar_ : mbstate_t;
++        import core.sys.posix.sys.types : pthread_mutex_t;
++
++        extern(C) struct wchar_io_data
++        {
++            mbstate_t  wcio_mbstate_in;
++            mbstate_t  wcio_mbstate_out;
++            wchar_t[1] wcio_ungetwc_buf;
++            size_t     wcio_ungetwc_inbuf;
++            int        wcio_mode;
++        }
++
++        extern(C) struct __sfileext
++        {
++            __sbuf          _ub;
++            wchar_io_data   _wcio;
++            pthread_mutex_t _lock;
++        }
++
++        void bionic_lock(FILE* foo)
++        {
++            if( foo == stdout._p.handle || foo == stdin._p.handle || foo == stderr._p.handle)
++            {
++                auto ext = cast(__sfileext*) foo._ext._base;
++                if (ext._lock.value == 0)
++                {
++                    // A bionic regression in Android 5.0 leaves
++                    // the mutex for stdout/err/in uninitialized,
++                    // so check for that and initialize it.
++                    printf("lock is zero, initializing...\n");
++                    ext._lock.value = 0x4000;
++                }
++            }
++            flockfile(foo);
++        }
++    }
++
+     int fputc_unlocked(int c, _iobuf* fp) { return fputc(c, cast(shared) fp); }
+     int fputwc_unlocked(wchar_t c, _iobuf* fp)
+     {
+@@ -328,7 +367,10 @@ else version (GENERIC_IO)
+     alias FGETC = fgetc_unlocked;
+     alias FGETWC = fgetwc_unlocked;
+-    alias FLOCK = flockfile;
++    version(CRuntime_Bionic)
++        alias FLOCK = bionic_lock;
++    else
++        alias FLOCK = flockfile;
+     alias FUNLOCK = funlockfile;
+ }
+ else
diff --git a/packages/ldc/ldc-readme.patch b/packages/ldc/ldc-readme.patch
new file mode 100644 (file)
index 0000000..46c8478
--- /dev/null
@@ -0,0 +1,24 @@
+diff --git a/README b/README
+new file mode 100644
+index 00000000..cd578cb7
+--- /dev/null
++++ b/README
+@@ -0,0 +1,18 @@
++This is LDC, the LLVM-based D compiler.  It will natively
++compile D on Android/ARM devices.
++
++The compiler configuration file is etc/ldc2.conf, and by
++default only include/d is on the module search path.
++
++To develop for Android, you will find the D headers and
++sample apps at this github repository useful:
++
++https://github.com/joakim-noah/android
++
++You can find instructions on building Android apps at the
++D wiki:
++
++http://wiki.dlang.org/Build_LDC_for_Android
++
++For further information, including how to report bugs,
++please refer to the LDC wiki: http://wiki.dlang.org/LDC.
diff --git a/packages/ldc/ldc-tools-utils-bugs.patch b/packages/ldc/ldc-tools-utils-bugs.patch
new file mode 100644 (file)
index 0000000..d51966b
--- /dev/null
@@ -0,0 +1,19 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 336bbdbc..4b9e8c88 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -736,12 +737,12 @@ endif()
+ #
+ # Auxiliary build and test utils.
+ #
+-add_subdirectory(utils)
++#add_subdirectory(utils)
+ #
+ # Auxiliary tools.
+ #
+-add_subdirectory(tools)
++#add_subdirectory(tools)
+ #
+ # Test and runtime targets. Note that enable_testing() is order-sensitive!
diff --git a/packages/ldc/llvm-android_tls.patch.beforehostbuild b/packages/ldc/llvm-android_tls.patch.beforehostbuild
new file mode 100644 (file)
index 0000000..9d31e8c
--- /dev/null
@@ -0,0 +1,79 @@
+diff --git a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
+index 9f1e06b..cc6fb08 100644
+--- a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
++++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
+@@ -139,6 +139,7 @@
+     return SectionKind::getThreadData();
+   if (Name == ".tbss" ||
++      Name == ".tcommon" ||
+       Name.startswith(".tbss.") ||
+       Name.startswith(".gnu.linkonce.tb.") ||
+       Name.startswith(".llvm.linkonce.tb."))
+@@ -176,8 +176,8 @@ getELFSectionFlags(SectionKind K) {
+   if (K.isWriteable())
+     Flags |= ELF::SHF_WRITE;
+-  if (K.isThreadLocal())
+-    Flags |= ELF::SHF_TLS;
++  //if (K.isThreadLocal())
++    //Flags |= ELF::SHF_TLS;
+   if (K.isMergeableCString() || K.isMergeableConst())
+     Flags |= ELF::SHF_MERGE;
+diff --git a/lib/MC/MCELFStreamer.cpp b/lib/MC/MCELFStreamer.cpp
+index bdc4a84..14537be 100644
+--- a/lib/MC/MCELFStreamer.cpp
++++ b/llvm/lib/MC/MCELFStreamer.cpp
+@@ -397,7 +397,7 @@ void MCELFStreamer::fixSymbolsInTLSFixups(const MCExpr *expr) {
+       break;
+     }
+     getAssembler().registerSymbol(symRef.getSymbol());
+-    cast<MCSymbolELF>(symRef.getSymbol()).setType(ELF::STT_TLS);
++    //cast<MCSymbolELF>(symRef.getSymbol()).setType(ELF::STT_TLS);
+     break;
+   }
+diff --git a/lib/MC/MCObjectFileInfo.cpp b/lib/MC/MCObjectFileInfo.cpp
+index 8015ebb..0a2639f 100644
+--- a/lib/MC/MCObjectFileInfo.cpp
++++ b/llvm/lib/MC/MCObjectFileInfo.cpp
+@@ -448,10 +448,10 @@
+   TLSDataSection =
+       Ctx->getELFSection(".tdata", ELF::SHT_PROGBITS,
+-                         ELF::SHF_ALLOC | ELF::SHF_TLS | ELF::SHF_WRITE);
++                         ELF::SHF_ALLOC | /*ELF::SHF_TLS |*/ ELF::SHF_WRITE);
+   TLSBSSSection = Ctx->getELFSection(
+-      ".tbss", ELF::SHT_NOBITS, ELF::SHF_ALLOC | ELF::SHF_TLS | ELF::SHF_WRITE);
++      ".tbss", ELF::SHT_NOBITS, ELF::SHF_ALLOC | /*ELF::SHF_TLS |*/ ELF::SHF_WRITE);
+   DataRelROSection = Ctx->getELFSection(".data.rel.ro", ELF::SHT_PROGBITS,
+                                         ELF::SHF_ALLOC | ELF::SHF_WRITE);
+diff --git a/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp b/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp
+index a821a6b..d169ab1 100644
+--- a/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp
++++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp
+@@ -174,7 +174,7 @@ unsigned ARMELFObjectWriter::GetRelocTypeInner(const MCValue &Target,
+         Type = ELF::R_ARM_GOT_BREL;
+         break;
+       case MCSymbolRefExpr::VK_TLSGD:
+-        Type = ELF::R_ARM_TLS_GD32;
++        Type = ELF::R_ARM_GOT_PREL;
+         break;
+       case MCSymbolRefExpr::VK_TPOFF:
+         Type = ELF::R_ARM_TLS_LE32;
+diff --git a/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp b/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp
+index e8b0b4c..fcb9954 100644
+--- a/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp
++++ b/llvm/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp
+@@ -211,7 +211,7 @@
+   case MCSymbolRefExpr::VK_TLSGD:
+     assert(Type == RT32_32);
+     assert(!IsPCRel);
+-    return ELF::R_386_TLS_GD;
++    return ELF::R_386_GOT32;
+   case MCSymbolRefExpr::VK_GOTTPOFF:
+     assert(Type == RT32_32);
+     assert(!IsPCRel);