Skip to content

Instantly share code, notes, and snippets.

@joakim-noah
Last active April 21, 2016 05:15
Show Gist options
  • Save joakim-noah/d936d6a339426ad1fac3 to your computer and use it in GitHub Desktop.
Save joakim-noah/d936d6a339426ad1fac3 to your computer and use it in GitHub Desktop.
Android/ARM support for druntime, for ldc ltsmaster branch 2.068
diff --git a/src/core/internal/convert.d b/src/core/internal/convert.d
index eeb5580..e47c084 100644
--- a/src/core/internal/convert.d
+++ b/src/core/internal/convert.d
@@ -85,8 +85,23 @@ private Float parse(bool is_denormalized = false, T:real)(T x_) if(floatFormat!T
Unqual!T x = x_;
assert(floatFormat!T != FloatFormat.DoubleDouble && floatFormat!T != FloatFormat.Quadruple,
"doubledouble and quadruple float formats are not supported in CTFE");
+version(Android) { version(ARM) {
+ if(x == 0.0)
+ {
+ double y = 1.0/x;
+ if(y == double.infinity) // 0.0
+ return FloatTraits!T.ZERO;
+ else
+ return FloatTraits!T.NZERO; // -0.0
+ }
+ }
+} else {
+ // For some reason, the following compile-time check misses the
+ // sign bit when cross-compiling to Android/ARM, so it registers
+ // -0.0 as T.ZERO instead of T.NZERO, which the above code fixes.
if(x is cast(T)0.0) return FloatTraits!T.ZERO;
if(x is cast(T)-0.0) return FloatTraits!T.NZERO;
+}
if(x is T.nan) return FloatTraits!T.NAN;
if(x is -T.nan) return FloatTraits!T.NNAN;
if(x is T.infinity || x > T.max) return FloatTraits!T.INF;
diff --git a/src/gc/proxy.d b/src/gc/proxy.d
index e8d96cd..d905d32 100644
--- a/src/gc/proxy.d
+++ b/src/gc/proxy.d
@@ -25,6 +25,7 @@ private
alias BlkInfo = core.memory.GC.BlkInfo;
extern (C) void thread_init();
+ version(Android) extern (C) void thread_setGCSignals(int suspendSignalNo, int resumeSignalNo);
extern (C) void thread_term();
struct Proxy
@@ -107,6 +108,10 @@ extern (C)
_gc.initialize();
// NOTE: The GC must initialize the thread library
// before its first collection.
+ version(Android){
+ import core.sys.posix.signal : SIGUSR1, SIGUSR2;
+ thread_setGCSignals(SIGUSR2, SIGUSR1);
+ }
thread_init();
initProxy();
}
diff --git a/src/rt/lifetime.d b/src/rt/lifetime.d
index aabbbb6..ef10471 100644
--- a/src/rt/lifetime.d
+++ b/src/rt/lifetime.d
@@ -2656,7 +2656,7 @@ unittest
}
// test class finalizers exception handling
-unittest
+version(Android) {} else unittest //passes but causes problems for later tests
{
bool test(E)()
{
@@ -2694,8 +2694,7 @@ unittest
}
// test struct finalizers exception handling
-debug(SENTINEL) {} else
-unittest
+version(Android) {} else unittest //passes but causes problems for later tests
{
if (!callStructDtorsDuringGC)
return;
diff --git a/src/test_runner.d b/src/test_runner.d
index 46584d5..fb44097 100644
--- a/src/test_runner.d
+++ b/src/test_runner.d
@@ -1,7 +1,11 @@
+module test_runner;
import core.runtime, core.time : MonoTime;
import core.stdc.stdio;
+version(apk) import android.log, std.file: append;
+import std.stdio: File;
+import std.file: exists, isFile;
-ModuleInfo* getModuleInfo(string name)
+ModuleInfo* getModuleInfo(char[] name)
{
foreach (m; ModuleInfo)
if (m.name == name) return m;
@@ -10,8 +14,16 @@ ModuleInfo* getModuleInfo(string name)
bool tester()
{
- assert(Runtime.args.length == 2);
- auto name = Runtime.args[1];
+ //assert(Runtime.args.length == 2);
+ //auto name = Runtime.args[1];
+ string testList = "test.list";
+ if(!testList.exists() || !testList.isFile) {
+ testList = "/sdcard/" ~ testList;
+ if(!testList.exists() || !testList.isFile)
+ return false;
+ }
+ foreach(name; File(testList).byLine()){
+ version(apk) string output;
immutable pkg = ".package";
immutable pkgLen = pkg.length;
@@ -30,20 +42,35 @@ bool tester()
{
immutable t0 = MonoTime.currTime;
fp();
+ version(apk) {
+ char[11] time;
+ int timelen = snprintf(time.ptr, 11, "%.3f", (MonoTime.currTime - t0).total!"msecs" / 1000.0);
+ output ~= time[0 .. timelen] ~ "s PASS " ~ name ~ "\n";
+ } else {
printf("%.3fs PASS %.*s %.*s\n",
(MonoTime.currTime - t0).total!"msecs" / 1000.0,
cast(uint)mode.length, mode.ptr,
cast(uint)name.length, name.ptr);
+ }
}
catch (Throwable e)
{
auto msg = e.toString();
+ version(apk)
+ output ~= "****** FAIL " ~ name ~ "\n" ~ msg ~ "\n";
+ else {
printf("****** FAIL %.*s %.*s\n%.*s\n",
cast(uint)mode.length, mode.ptr,
cast(uint)name.length, name.ptr,
cast(uint)msg.length, msg.ptr);
- return false;
+ //return false;
+ }
}
+ version(apk){
+ __android_log_print(android_LogPriority.ANDROID_LOG_INFO, "test_runner", output.ptr);
+ append("/sdcard/test.log", output);
+ }
+ }
}
return true;
}
@@ -53,6 +80,6 @@ shared static this()
Runtime.moduleUnitTester = &tester;
}
-void main()
+version(apk) {} else void main()
{
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment