ldc: add package (#1078)

This commit is contained in:
joakim-noah 2017-07-01 06:13:00 +05:30 committed by Fredrik Fornwall
parent c4a1b6a804
commit 8f758f1ae2
10 changed files with 601 additions and 0 deletions

138
packages/ldc/build.sh Normal file
View File

@ -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
}

View File

@ -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.

View File

@ -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

View File

@ -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__;

View File

@ -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})

View File

@ -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()

View File

@ -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

View File

@ -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.

View File

@ -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!

View File

@ -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);