Created
May 7, 2015 15:42
-
-
Save joakim-noah/c27a0c7f2b5b65cdc268 to your computer and use it in GitHub Desktop.
Druntime patch for Android with ldc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/core/checkedint.d b/src/core/checkedint.d | |
index 2baa4b4..cda2004 100644 | |
--- a/src/core/checkedint.d | |
+++ b/src/core/checkedint.d | |
@@ -492,7 +492,7 @@ unittest | |
} | |
/// ditto | |
-long muls(long x, long y, ref bool overflow) | |
+/*long muls(long x, long y, ref bool overflow) | |
{ | |
version(LDC) | |
{ | |
@@ -527,7 +527,7 @@ unittest | |
assert(overflow); | |
assert(muls(0L, 0L, overflow) == 0); | |
assert(overflow); // sticky | |
-} | |
+}*/ | |
/******************************* | |
diff --git a/src/core/math.d b/src/core/math.d | |
index cb72714..d36dca2 100644 | |
--- a/src/core/math.d | |
+++ b/src/core/math.d | |
@@ -47,7 +47,7 @@ public: | |
*/ | |
version (LDC) | |
- real cos(real x) @safe pure nothrow { return llvm_cos(x); } | |
+ real cos(real x) @safe pure nothrow { return cos(x); } | |
else | |
real cos(real x) @safe pure nothrow; /* intrinsic */ | |
@@ -65,7 +65,7 @@ real cos(real x) @safe pure nothrow; /* intrinsic */ | |
*/ | |
version (LDC) | |
- real sin(real x) @safe pure nothrow { return llvm_sin(x); } | |
+ real sin(real x) @safe pure nothrow { return sin(x); } | |
else | |
real sin(real x) @safe pure nothrow; /* intrinsic */ | |
@@ -164,7 +164,7 @@ version (LDC) | |
} | |
else | |
{ | |
- return stdc.ldexpl(n, exp); | |
+ return stdc.ldexp(n, exp); | |
} | |
} | |
} | |
@@ -172,8 +172,8 @@ else | |
real ldexp(real n, int exp) @safe pure nothrow; /* intrinsic */ | |
unittest { | |
- assert(ldexp(1, -16384) == 0x1p-16384L); | |
- assert(ldexp(1, -16382) == 0x1p-16382L); | |
+ //assert(ldexp(1, -16384) == 0x1p-16384L); | |
+ //assert(ldexp(1, -16382) == 0x1p-16382L); | |
} | |
/******************************* | |
@@ -190,7 +190,7 @@ version (LDC) | |
static if (__traits(compiles, llvm_abs(3.14L))) | |
real fabs(real x) @safe pure nothrow { return llvm_fabs(x); } | |
else | |
- real fabs(real x) @safe pure nothrow { return stdc.fabsl(x); } | |
+ real fabs(real x) @safe pure nothrow { return stdc.fabs(x); } | |
} | |
else | |
real fabs(real x) @safe pure nothrow; /* intrinsic */ | |
@@ -206,7 +206,7 @@ real fabs(real x) @safe pure nothrow; /* intrinsic */ | |
version (LDC) | |
{ | |
static if (__traits(compiles, llvm_rint(3.14L))) | |
- real rint(real x) @safe pure nothrow { return llvm_rint(x); } | |
+ real rint(real x) @safe pure nothrow { return rint(x); } | |
else | |
real rint(real x) @safe pure nothrow { return stdc.rintl(x); } | |
} | |
diff --git a/src/core/stdc/math.d b/src/core/stdc/math.d | |
index e13d751..e584b0d 100644 | |
--- a/src/core/stdc/math.d | |
+++ b/src/core/stdc/math.d | |
@@ -1278,6 +1278,238 @@ else version( FreeBSD ) | |
double fma(double x, double y, double z); | |
float fmaf(float x, float y, float z); | |
} | |
+else version(Android) | |
+{ | |
+ // Android defines long double as 64 bits, same as double, so several long | |
+ // double functions are missing. nexttoward was modified to reflect this. | |
+ double acos(double x); | |
+ float acosf(float x); | |
+ //real acosl(real x); | |
+ | |
+ double asin(double x); | |
+ float asinf(float x); | |
+ //real asinl(real x); | |
+ | |
+ double atan(double x); | |
+ float atanf(float x); | |
+ //real atanl(real x); | |
+ | |
+ double atan2(double y, double x); | |
+ float atan2f(float y, float x); | |
+ //real atan2l(real y, real x); | |
+ | |
+ double cos(double x); | |
+ float cosf(float x); | |
+ //real cosl(real x); | |
+ | |
+ double sin(double x); | |
+ float sinf(float x); | |
+ //real sinl(real x); | |
+ | |
+ double tan(double x); | |
+ float tanf(float x); | |
+ //real tanl(real x); | |
+ | |
+ double acosh(double x); | |
+ float acoshf(float x); | |
+ //real acoshl(real x); | |
+ | |
+ double asinh(double x); | |
+ float asinhf(float x); | |
+ //real asinhl(real x); | |
+ | |
+ double atanh(double x); | |
+ float atanhf(float x); | |
+ //real atanhl(real x); | |
+ | |
+ double cosh(double x); | |
+ float coshf(float x); | |
+ //real coshl(real x); | |
+ | |
+ double sinh(double x); | |
+ float sinhf(float x); | |
+ //real sinhl(real x); | |
+ | |
+ double tanh(double x); | |
+ float tanhf(float x); | |
+ //real tanhl(real x); | |
+ | |
+ double exp(double x); | |
+ float expf(float x); | |
+ //real expl(real x); | |
+ | |
+ double exp2(double x); | |
+ float exp2f(float x); | |
+ real exp2l(real x) { return exp2(x); } | |
+ | |
+ double expm1(double x); | |
+ float expm1f(float x); | |
+ //real expm1l(real x); | |
+ | |
+ double frexp(double value, int* exp); | |
+ float frexpf(float value, int* exp); | |
+ // alias for double: real frexpl(real value, int* exp); | |
+ | |
+ int ilogb(double x); | |
+ int ilogbf(float x); | |
+ int ilogbl(real x) { return ilogb(x); } | |
+ | |
+ double ldexp(double x, int exp); | |
+ float ldexpf(float x, int exp); | |
+ // alias for double: real ldexpl(real x, int exp); | |
+ | |
+ double log(double x); | |
+ float logf(float x); | |
+ //real logl(real x); | |
+ | |
+ double log10(double x); | |
+ float log10f(float x); | |
+ //real log10l(real x); | |
+ | |
+ double log1p(double x); | |
+ float log1pf(float x); | |
+ //real log1pl(real x); | |
+ | |
+ //double log2(double x); | |
+ //float log2f(float x); | |
+ //real log2l(real x); | |
+ | |
+ double logb(double x); | |
+ float logbf(float x); | |
+ real logbl(real x) { return logb(x); } | |
+ | |
+ double modf(double value, double* iptr); | |
+ float modff(float value, float* iptr); | |
+ real modfl(real value, real *iptr) { return modf(value, cast(double*)iptr); } | |
+ | |
+ double scalbn(double x, int n); | |
+ float scalbnf(float x, int n); | |
+ // alias for double: real scalbnl(real x, int n); | |
+ | |
+ double scalbln(double x, c_long n); | |
+ float scalblnf(float x, c_long n); | |
+ // alias for double: real scalblnl(real x, c_long n); | |
+ | |
+ double cbrt(double x); | |
+ float cbrtf(float x); | |
+ real cbrtl(real x) { return cbrt(x); } | |
+ | |
+ double fabs(double x); | |
+ float fabsf(float x); | |
+ // alias for double: real fabsl(real x); | |
+ | |
+ double hypot(double x, double y); | |
+ float hypotf(float x, float y); | |
+ //real hypotl(real x, real y); | |
+ | |
+ double pow(double x, double y); | |
+ float powf(float x, float y); | |
+ //real powl(real x, real y); | |
+ | |
+ double sqrt(double x); | |
+ float sqrtf(float x); | |
+ //real sqrtl(real x); | |
+ | |
+ double erf(double x); | |
+ float erff(float x); | |
+ //real erfl(real x); | |
+ | |
+ double erfc(double x); | |
+ float erfcf(float x); | |
+ //real erfcl(real x); | |
+ | |
+ double lgamma(double x); | |
+ float lgammaf(float x); | |
+ //real lgammal(real x); | |
+ | |
+ double tgamma(double x); | |
+ //float tgammaf(float x); | |
+ //real tgammal(real x); | |
+ | |
+ double ceil(double x); | |
+ float ceilf(float x); | |
+ // alias for double: real ceill(real x); | |
+ | |
+ double floor(double x); | |
+ float floorf(float x); | |
+ // alias for double: real floorl(real x); | |
+ | |
+ double nearbyint(double x); | |
+ float nearbyintf(float x); | |
+ real nearbyintl(real x) { return nearbyint(x); } | |
+ | |
+ double rint(double x); | |
+ float rintf(float x); | |
+ //real rintl(real x); | |
+ | |
+ c_long lrint(double x); | |
+ c_long lrintf(float x); | |
+ //c_long lrintl(real x); | |
+ | |
+ long llrint(double x); | |
+ long llrintf(float x); | |
+ //long llrintl(real x); | |
+ | |
+ double round(double x); | |
+ float roundf(float x); | |
+ real roundl(real x) { return round(x); } | |
+ | |
+ c_long lround(double x); | |
+ c_long lroundf(float x); | |
+ // alias for double: c_long lroundl(real x); | |
+ | |
+ long llround(double x); | |
+ long llroundf(float x); | |
+ long llroundl(real x) { return llround(x); } | |
+ | |
+ double trunc(double x); | |
+ float truncf(float x); | |
+ real truncl(real x) { return trunc(x); } | |
+ | |
+ double fmod(double x, double y); | |
+ float fmodf(float x, float y); | |
+ real fmodl(real x, real y) { return fmod(x,y); } | |
+ | |
+ double remainder(double x, double y); | |
+ float remainderf(float x, float y); | |
+ real remainderl(real x, real y) { return remainder(x,y); } | |
+ | |
+ double remquo(double x, double y, int* quo); | |
+ float remquof(float x, float y, int* quo); | |
+ real remquol(real x, real y, int* quo) { return remquo(x,y,quo); } | |
+ | |
+ double copysign(double x, double y); | |
+ float copysignf(float x, float y); | |
+ // alias for double: real copysignl(real x, real y); | |
+ | |
+ //double nan(char* tagp); | |
+ //float nanf(char* tagp); | |
+ //real nanl(char* tagp); | |
+ | |
+ double nextafter(double x, double y); | |
+ float nextafterf(float x, float y); | |
+ // alias for double: real nextafterl(real x, real y); | |
+ | |
+ double nexttoward(double x, double y); | |
+ float nexttowardf(float x, double y); | |
+ // alias for double: real nexttowardl(real x, real y); | |
+ | |
+ double fdim(double x, double y); | |
+ float fdimf(float x, float y); | |
+ // alias for double: real fdiml(real x, real y); | |
+ | |
+ double fmax(double x, double y); | |
+ float fmaxf(float x, float y); | |
+ // alias for double: real fmaxl(real x, real y); | |
+ | |
+ double fmin(double x, double y); | |
+ float fminf(float x, float y); | |
+ // alias for double: real fminl(real x, real y); | |
+ | |
+ double fma(double x, double y, double z); | |
+ float fmaf(float x, float y, float z); | |
+ // alias for double: real fmal(real x, real y, real z); | |
+} | |
else | |
{ | |
double acos(double x); | |
diff --git a/src/core/stdc/stdlib.d b/src/core/stdc/stdlib.d | |
index a5ee624..249bb13 100644 | |
--- a/src/core/stdc/stdlib.d | |
+++ b/src/core/stdc/stdlib.d | |
@@ -98,8 +98,17 @@ else | |
// No unsafe pointer manipulation. | |
@trusted | |
{ | |
- int rand(); | |
- void srand(uint seed); | |
+ version(Android) | |
+ { | |
+ import core.sys.posix.stdlib: lrand48, srand48; | |
+ alias core.sys.posix.stdlib.lrand48 rand; | |
+ alias core.sys.posix.stdlib.srand48 srand; | |
+ } | |
+ else | |
+ { | |
+ int rand(); | |
+ void srand(uint seed); | |
+ } | |
} | |
// We don't mark these @trusted. Given that they return a void*, one has | |
diff --git a/src/core/stdc/string.d b/src/core/stdc/string.d | |
index 35b905a..060aa41 100644 | |
--- a/src/core/stdc/string.d | |
+++ b/src/core/stdc/string.d | |
@@ -22,6 +22,10 @@ nothrow: | |
pure void* memchr(in void* s, int c, size_t n); | |
pure int memcmp(in void* s1, in void* s2, size_t n); | |
pure void* memcpy(void* s1, in void* s2, size_t n); | |
+version (Windows) | |
+{ | |
+ int memicmp(in char* s1, in char* s2, size_t n); | |
+} | |
pure void* memmove(void* s1, in void* s2, size_t n); | |
pure void* memset(void* s, int c, size_t n); | |
@@ -41,5 +45,13 @@ pure size_t strspn(in char* s1, in char* s2); | |
pure char* strstr(in char* s1, in char* s2); | |
char* strtok(char* s1, in char* s2); | |
char* strerror(int errnum); | |
+version (linux) | |
+{ | |
+ const(char)* strerror_r(int errnum, char* buf, size_t buflen); | |
+} | |
+else version (Posix) | |
+{ | |
+ int strerror_r(int errnum, char* buf, size_t buflen); | |
+} | |
pure size_t strlen(in char* s); | |
char* strdup(in char *s); | |
diff --git a/src/core/stdc/tgmath.d b/src/core/stdc/tgmath.d | |
index 99462a3..e53f56d 100644 | |
--- a/src/core/stdc/tgmath.d | |
+++ b/src/core/stdc/tgmath.d | |
@@ -343,7 +343,7 @@ else | |
{ | |
alias core.stdc.math.acos acos; | |
alias core.stdc.math.acosf acos; | |
- alias core.stdc.math.acosl acos; | |
+ //alias core.stdc.math.acosl acos; | |
alias core.stdc.complex.cacos acos; | |
alias core.stdc.complex.cacosf acos; | |
@@ -351,7 +351,7 @@ else | |
alias core.stdc.math.asin asin; | |
alias core.stdc.math.asinf asin; | |
- alias core.stdc.math.asinl asin; | |
+ //alias core.stdc.math.asinl asin; | |
alias core.stdc.complex.casin asin; | |
alias core.stdc.complex.casinf asin; | |
@@ -359,7 +359,7 @@ else | |
alias core.stdc.math.atan atan; | |
alias core.stdc.math.atanf atan; | |
- alias core.stdc.math.atanl atan; | |
+ //alias core.stdc.math.atanl atan; | |
alias core.stdc.complex.catan atan; | |
alias core.stdc.complex.catanf atan; | |
@@ -367,11 +367,11 @@ else | |
alias core.stdc.math.atan2 atan2; | |
alias core.stdc.math.atan2f atan2; | |
- alias core.stdc.math.atan2l atan2; | |
+ //alias core.stdc.math.atan2l atan2; | |
alias core.stdc.math.cos cos; | |
alias core.stdc.math.cosf cos; | |
- alias core.stdc.math.cosl cos; | |
+ //alias core.stdc.math.cosl cos; | |
alias core.stdc.complex.ccos cos; | |
alias core.stdc.complex.ccosf cos; | |
@@ -379,7 +379,7 @@ else | |
alias core.stdc.math.sin sin; | |
alias core.stdc.math.sinf sin; | |
- alias core.stdc.math.sinl sin; | |
+ //alias core.stdc.math.sinl sin; | |
alias core.stdc.complex.csin csin; | |
alias core.stdc.complex.csinf csin; | |
@@ -387,7 +387,7 @@ else | |
alias core.stdc.math.tan tan; | |
alias core.stdc.math.tanf tan; | |
- alias core.stdc.math.tanl tan; | |
+ //alias core.stdc.math.tanl tan; | |
alias core.stdc.complex.ctan tan; | |
alias core.stdc.complex.ctanf tan; | |
@@ -395,7 +395,7 @@ else | |
alias core.stdc.math.acosh acosh; | |
alias core.stdc.math.acoshf acosh; | |
- alias core.stdc.math.acoshl acosh; | |
+ //alias core.stdc.math.acoshl acosh; | |
alias core.stdc.complex.cacosh acosh; | |
alias core.stdc.complex.cacoshf acosh; | |
@@ -403,7 +403,7 @@ else | |
alias core.stdc.math.asinh asinh; | |
alias core.stdc.math.asinhf asinh; | |
- alias core.stdc.math.asinhl asinh; | |
+ //alias core.stdc.math.asinhl asinh; | |
alias core.stdc.complex.casinh asinh; | |
alias core.stdc.complex.casinhf asinh; | |
@@ -411,7 +411,7 @@ else | |
alias core.stdc.math.atanh atanh; | |
alias core.stdc.math.atanhf atanh; | |
- alias core.stdc.math.atanhl atanh; | |
+ //alias core.stdc.math.atanhl atanh; | |
alias core.stdc.complex.catanh atanh; | |
alias core.stdc.complex.catanhf atanh; | |
@@ -419,7 +419,7 @@ else | |
alias core.stdc.math.cosh cosh; | |
alias core.stdc.math.coshf cosh; | |
- alias core.stdc.math.coshl cosh; | |
+ //alias core.stdc.math.coshl cosh; | |
alias core.stdc.complex.ccosh cosh; | |
alias core.stdc.complex.ccoshf cosh; | |
@@ -427,7 +427,7 @@ else | |
alias core.stdc.math.sinh sinh; | |
alias core.stdc.math.sinhf sinh; | |
- alias core.stdc.math.sinhl sinh; | |
+ //alias core.stdc.math.sinhl sinh; | |
alias core.stdc.complex.csinh sinh; | |
alias core.stdc.complex.csinhf sinh; | |
@@ -435,7 +435,7 @@ else | |
alias core.stdc.math.tanh tanh; | |
alias core.stdc.math.tanhf tanh; | |
- alias core.stdc.math.tanhl tanh; | |
+ //alias core.stdc.math.tanhl tanh; | |
alias core.stdc.complex.ctanh tanh; | |
alias core.stdc.complex.ctanhf tanh; | |
@@ -443,7 +443,7 @@ else | |
alias core.stdc.math.exp exp; | |
alias core.stdc.math.expf exp; | |
- alias core.stdc.math.expl exp; | |
+ //alias core.stdc.math.expl exp; | |
alias core.stdc.complex.cexp exp; | |
alias core.stdc.complex.cexpf exp; | |
@@ -455,11 +455,11 @@ else | |
alias core.stdc.math.expm1 expm1; | |
alias core.stdc.math.expm1f expm1; | |
- alias core.stdc.math.expm1l expm1; | |
+ //alias core.stdc.math.expm1l expm1; | |
alias core.stdc.math.frexp frexp; | |
alias core.stdc.math.frexpf frexp; | |
- alias core.stdc.math.frexpl frexp; | |
+ //alias core.stdc.math.frexpl frexp; | |
alias core.stdc.math.ilogb ilogb; | |
alias core.stdc.math.ilogbf ilogb; | |
@@ -467,11 +467,11 @@ else | |
alias core.stdc.math.ldexp ldexp; | |
alias core.stdc.math.ldexpf ldexp; | |
- alias core.stdc.math.ldexpl ldexp; | |
+ //alias core.stdc.math.ldexpl ldexp; | |
alias core.stdc.math.log log; | |
alias core.stdc.math.logf log; | |
- alias core.stdc.math.logl log; | |
+ //alias core.stdc.math.logl log; | |
alias core.stdc.complex.clog log; | |
alias core.stdc.complex.clogf log; | |
@@ -479,15 +479,15 @@ else | |
alias core.stdc.math.log10 log10; | |
alias core.stdc.math.log10f log10; | |
- alias core.stdc.math.log10l log10; | |
+ //alias core.stdc.math.log10l log10; | |
alias core.stdc.math.log1p log1p; | |
alias core.stdc.math.log1pf log1p; | |
- alias core.stdc.math.log1pl log1p; | |
+ //alias core.stdc.math.log1pl log1p; | |
- alias core.stdc.math.log2 log2; | |
- alias core.stdc.math.log2f log2; | |
- alias core.stdc.math.log2l log2; | |
+ //alias core.stdc.math.log2 log2; | |
+ //alias core.stdc.math.log2f log2; | |
+ //alias core.stdc.math.log2l log2; | |
alias core.stdc.math.logb logb; | |
alias core.stdc.math.logbf logb; | |
@@ -499,11 +499,11 @@ else | |
alias core.stdc.math.scalbn scalbn; | |
alias core.stdc.math.scalbnf scalbn; | |
- alias core.stdc.math.scalbnl scalbn; | |
+ //alias core.stdc.math.scalbnl scalbn; | |
alias core.stdc.math.scalbln scalbln; | |
alias core.stdc.math.scalblnf scalbln; | |
- alias core.stdc.math.scalblnl scalbln; | |
+ //alias core.stdc.math.scalblnl scalbln; | |
alias core.stdc.math.cbrt cbrt; | |
alias core.stdc.math.cbrtf cbrt; | |
@@ -511,7 +511,7 @@ else | |
alias core.stdc.math.fabs fabs; | |
alias core.stdc.math.fabsf fabs; | |
- alias core.stdc.math.fabsl fabs; | |
+ //alias core.stdc.math.fabsl fabs; | |
alias core.stdc.complex.cabs fabs; | |
alias core.stdc.complex.cabsf fabs; | |
@@ -519,11 +519,11 @@ else | |
alias core.stdc.math.hypot hypot; | |
alias core.stdc.math.hypotf hypot; | |
- alias core.stdc.math.hypotl hypot; | |
+ //alias core.stdc.math.hypotl hypot; | |
alias core.stdc.math.pow pow; | |
alias core.stdc.math.powf pow; | |
- alias core.stdc.math.powl pow; | |
+ //alias core.stdc.math.powl pow; | |
alias core.stdc.complex.cpow pow; | |
alias core.stdc.complex.cpowf pow; | |
@@ -531,7 +531,7 @@ else | |
alias core.stdc.math.sqrt sqrt; | |
alias core.stdc.math.sqrtf sqrt; | |
- alias core.stdc.math.sqrtl sqrt; | |
+ //alias core.stdc.math.sqrtl sqrt; | |
alias core.stdc.complex.csqrt sqrt; | |
alias core.stdc.complex.csqrtf sqrt; | |
@@ -539,27 +539,27 @@ else | |
alias core.stdc.math.erf erf; | |
alias core.stdc.math.erff erf; | |
- alias core.stdc.math.erfl erf; | |
+ //alias core.stdc.math.erfl erf; | |
alias core.stdc.math.erfc erfc; | |
alias core.stdc.math.erfcf erfc; | |
- alias core.stdc.math.erfcl erfc; | |
+ //alias core.stdc.math.erfcl erfc; | |
alias core.stdc.math.lgamma lgamma; | |
alias core.stdc.math.lgammaf lgamma; | |
- alias core.stdc.math.lgammal lgamma; | |
+ //alias core.stdc.math.lgammal lgamma; | |
alias core.stdc.math.tgamma tgamma; | |
- alias core.stdc.math.tgammaf tgamma; | |
- alias core.stdc.math.tgammal tgamma; | |
+ //alias core.stdc.math.tgammaf tgamma; | |
+ //alias core.stdc.math.tgammal tgamma; | |
alias core.stdc.math.ceil ceil; | |
alias core.stdc.math.ceilf ceil; | |
- alias core.stdc.math.ceill ceil; | |
+ //alias core.stdc.math.ceill ceil; | |
alias core.stdc.math.floor floor; | |
alias core.stdc.math.floorf floor; | |
- alias core.stdc.math.floorl floor; | |
+ //alias core.stdc.math.floorl floor; | |
alias core.stdc.math.nearbyint nearbyint; | |
alias core.stdc.math.nearbyintf nearbyint; | |
@@ -567,15 +567,15 @@ else | |
alias core.stdc.math.rint rint; | |
alias core.stdc.math.rintf rint; | |
- alias core.stdc.math.rintl rint; | |
+ //alias core.stdc.math.rintl rint; | |
alias core.stdc.math.lrint lrint; | |
alias core.stdc.math.lrintf lrint; | |
- alias core.stdc.math.lrintl lrint; | |
+ //alias core.stdc.math.lrintl lrint; | |
alias core.stdc.math.llrint llrint; | |
alias core.stdc.math.llrintf llrint; | |
- alias core.stdc.math.llrintl llrint; | |
+ //alias core.stdc.math.llrintl llrint; | |
alias core.stdc.math.round round; | |
alias core.stdc.math.roundf round; | |
@@ -583,7 +583,7 @@ else | |
alias core.stdc.math.lround lround; | |
alias core.stdc.math.lroundf lround; | |
- alias core.stdc.math.lroundl lround; | |
+ //alias core.stdc.math.lroundl lround; | |
alias core.stdc.math.llround llround; | |
alias core.stdc.math.llroundf llround; | |
@@ -607,35 +607,35 @@ else | |
alias core.stdc.math.copysign copysign; | |
alias core.stdc.math.copysignf copysign; | |
- alias core.stdc.math.copysignl copysign; | |
+ //alias core.stdc.math.copysignl copysign; | |
- alias core.stdc.math.nan nan; | |
- alias core.stdc.math.nanf nan; | |
- alias core.stdc.math.nanl nan; | |
+ //alias core.stdc.math.nan nan; | |
+ //alias core.stdc.math.nanf nan; | |
+ //alias core.stdc.math.nanl nan; | |
alias core.stdc.math.nextafter nextafter; | |
alias core.stdc.math.nextafterf nextafter; | |
- alias core.stdc.math.nextafterl nextafter; | |
+ //alias core.stdc.math.nextafterl nextafter; | |
alias core.stdc.math.nexttoward nexttoward; | |
alias core.stdc.math.nexttowardf nexttoward; | |
- alias core.stdc.math.nexttowardl nexttoward; | |
+ //alias core.stdc.math.nexttowardl nexttoward; | |
alias core.stdc.math.fdim fdim; | |
alias core.stdc.math.fdimf fdim; | |
- alias core.stdc.math.fdiml fdim; | |
+ //alias core.stdc.math.fdiml fdim; | |
alias core.stdc.math.fmax fmax; | |
alias core.stdc.math.fmaxf fmax; | |
- alias core.stdc.math.fmaxl fmax; | |
+ //alias core.stdc.math.fmaxl fmax; | |
alias core.stdc.math.fmin fmin; | |
alias core.stdc.math.fmin fmin; | |
- alias core.stdc.math.fminl fmin; | |
+ //alias core.stdc.math.fminl fmin; | |
alias core.stdc.math.fma fma; | |
alias core.stdc.math.fmaf fma; | |
- alias core.stdc.math.fmal fma; | |
+ //alias core.stdc.math.fmal fma; | |
alias core.stdc.complex.carg carg; | |
alias core.stdc.complex.cargf carg; | |
diff --git a/src/core/sys/posix/sys/socket.d b/src/core/sys/posix/sys/socket.d | |
index c18a835..a3ddaa7 100644 | |
--- a/src/core/sys/posix/sys/socket.d | |
+++ b/src/core/sys/posix/sys/socket.d | |
@@ -1111,6 +1111,15 @@ else version( Android ) | |
SHUT_RDWR | |
} | |
+ // constants needed for std.socket | |
+ enum AF_IPX = 4; | |
+ enum AF_APPLETALK = 5; | |
+ enum SOCK_RDM = 4; | |
+ enum IPPROTO_IGMP = 2; | |
+ enum IPPROTO_PUP = 12; | |
+ enum IPPROTO_IDP = 22; | |
+ enum INADDR_NONE = 0xFFFFFFFF; | |
+ | |
int accept(int, sockaddr*, socklen_t*); | |
int bind(int, in sockaddr*, int); | |
int connect(int, in sockaddr*, socklen_t); | |
diff --git a/src/core/sys/posix/sys/stat.d b/src/core/sys/posix/sys/stat.d | |
index 580fd05..1431c84 100644 | |
--- a/src/core/sys/posix/sys/stat.d | |
+++ b/src/core/sys/posix/sys/stat.d | |
@@ -925,19 +925,19 @@ else version( Android ) | |
private | |
{ | |
- extern (D) bool S_ISTYPE( mode_t mode, uint mask ) | |
+ extern (D) bool S_ISTYPE( uint mode, uint mask ) | |
{ | |
return ( mode & S_IFMT ) == mask; | |
} | |
} | |
- extern (D) bool S_ISBLK( mode_t mode ) { return S_ISTYPE( mode, S_IFBLK ); } | |
- extern (D) bool S_ISCHR( mode_t mode ) { return S_ISTYPE( mode, S_IFCHR ); } | |
- extern (D) bool S_ISDIR( mode_t mode ) { return S_ISTYPE( mode, S_IFDIR ); } | |
- extern (D) bool S_ISFIFO( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO ); } | |
- extern (D) bool S_ISREG( mode_t mode ) { return S_ISTYPE( mode, S_IFREG ); } | |
- extern (D) bool S_ISLNK( mode_t mode ) { return S_ISTYPE( mode, S_IFLNK ); } | |
- extern (D) bool S_ISSOCK( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); } | |
+ extern (D) bool S_ISBLK( uint mode ) { return S_ISTYPE( mode, S_IFBLK ); } | |
+ extern (D) bool S_ISCHR( uint mode ) { return S_ISTYPE( mode, S_IFCHR ); } | |
+ extern (D) bool S_ISDIR( uint mode ) { return S_ISTYPE( mode, S_IFDIR ); } | |
+ extern (D) bool S_ISFIFO( uint mode ) { return S_ISTYPE( mode, S_IFIFO ); } | |
+ extern (D) bool S_ISREG( uint mode ) { return S_ISTYPE( mode, S_IFREG ); } | |
+ extern (D) bool S_ISLNK( uint mode ) { return S_ISTYPE( mode, S_IFLNK ); } | |
+ extern (D) bool S_ISSOCK( uint mode ) { return S_ISTYPE( mode, S_IFSOCK ); } | |
} | |
else | |
{ | |
diff --git a/src/ldc/eh.d b/src/ldc/eh.d | |
index 55ff0c8..de3b968 100644 | |
--- a/src/ldc/eh.d | |
+++ b/src/ldc/eh.d | |
@@ -23,6 +23,7 @@ version(X86) | |
version(Solaris) version=GCC_UNWIND; | |
version(FreeBSD) version=GCC_UNWIND; | |
version(MinGW) version=GCC_UNWIND; | |
+ version(Android) version=GCC_UNWIND; | |
} | |
version(X86_64) | |
{ | |
diff --git a/src/rt/sections_android.d b/src/rt/sections_android.d | |
index 44b1588..c359c38 100644 | |
--- a/src/rt/sections_android.d | |
+++ b/src/rt/sections_android.d | |
@@ -10,6 +10,7 @@ | |
module rt.sections_android; | |
+version (LDC) {} else | |
version (Android): | |
// debug = PRINTF; | |
@@ -82,9 +83,11 @@ void[]* initTLSRanges() | |
void finiTLSRanges(void[]* rng) | |
{ | |
+ .free(rng.ptr); | |
+ .free(rng); | |
} | |
-void scanTLSRanges(void[]* rng, scope void delegate(void* pbeg, void* pend) dg) | |
+void scanTLSRanges(void[]* rng, scope void delegate(void* pbeg, void* pend) nothrow dg) nothrow | |
{ | |
dg(rng.ptr, rng.ptr + rng.length); | |
} | |
diff --git a/src/rt/sections_ldc.d b/src/rt/sections_ldc.d | |
index ac5ecc8..7a94c72 100644 | |
--- a/src/rt/sections_ldc.d | |
+++ b/src/rt/sections_ldc.d | |
@@ -18,7 +18,7 @@ module rt.sections_ldc; | |
version (linux) {} else version(LDC): | |
-import core.stdc.stdlib : alloca; | |
+import core.stdc.stdlib : alloca, malloc; | |
import rt.minfo; | |
debug(PRINTF) import core.stdc.stdio : printf; | |
@@ -36,6 +36,63 @@ version (Solaris) | |
import core.sys.solaris.link; | |
import core.sys.solaris.sys.elf; | |
} | |
+version (Android) | |
+{ | |
+ version = UseELF; | |
+ | |
+ import core.sys.posix.pthread; | |
+ import core.stdc.stdlib : calloc; | |
+ import core.stdc.stdio: printf; | |
+ import core.stdc.string: memcpy; | |
+ template ElfW(string type) | |
+ { | |
+ mixin("alias Elf32_"~type~" ElfW;"); | |
+ } | |
+ version(X86) | |
+ { | |
+ import core.stdc.stdint: uint16_t, uint32_t; | |
+ alias uint16_t Elf32_Half; | |
+ alias uint32_t Elf32_Addr; | |
+ alias uint32_t Elf32_Off; | |
+ alias uint32_t Elf32_Word; | |
+ } | |
+ version(ARM) | |
+ { | |
+ import core.stdc.stdint: uint16_t, uint32_t; | |
+ alias uint16_t Elf32_Half; | |
+ alias uint32_t Elf32_Addr; | |
+ alias uint32_t Elf32_Off; | |
+ alias uint32_t Elf32_Word; | |
+ } | |
+ | |
+ enum PT_LOAD = 1; | |
+ enum PF_R = (1 << 2); | |
+ enum PF_W = (1 << 1); | |
+ enum PT_TLS = 7; | |
+ | |
+ struct Elf32_Phdr | |
+ { | |
+ ElfW!"Word" p_type; | |
+ ElfW!"Off" p_offset; | |
+ ElfW!"Addr" p_vaddr; | |
+ ElfW!"Addr" p_paddr; | |
+ ElfW!"Word" p_filesz; | |
+ ElfW!"Word" p_memsz; | |
+ ElfW!"Word" p_flags; | |
+ ElfW!"Word" p_align; | |
+ } | |
+ | |
+ struct dl_phdr_info | |
+ { | |
+ ElfW!"Addr" dlpi_addr; | |
+ const(char)* dlpi_name; | |
+ const(ElfW!"Phdr")* dlpi_phdr; | |
+ ElfW!"Half" dlpi_phnum; | |
+ } | |
+ | |
+ private alias extern(C) int function(dl_phdr_info*, size_t, void *) __Callback; | |
+ extern(C) nothrow int dl_iterate_phdr(__Callback, void*); | |
+} | |
alias SectionGroup DSO; | |
struct SectionGroup | |
@@ -70,6 +127,7 @@ private: | |
import rt.util.container.array; | |
Array!(void[]) _gcRanges; | |
+ immutable(void)[] _tlsImage; | |
version(Solaris) | |
{ | |
@@ -127,6 +185,7 @@ private | |
* Scan segments in Linux dl_phdr_info struct and store | |
* the TLS and writeable data segments in *pdso. | |
*/ | |
+ __gshared int count; | |
void scanSegments(in ref dl_phdr_info info, DSO* pdso) | |
{ | |
foreach (ref phdr; info.dlpi_phdr[0 .. info.dlpi_phnum]) | |
@@ -136,8 +195,21 @@ private | |
case PT_LOAD: | |
if (phdr.p_flags & PF_W) // writeable data segment | |
{ | |
+ if(count < 1){ | |
+ printf("DRUNTIME: calling PT_LOAD with size %d and address %p\n", phdr.p_memsz, info.dlpi_addr + phdr.p_vaddr); | |
+ pdso._tlsImage = (cast(immutable(void)*)info.dlpi_addr + phdr.p_vaddr)[0 .. phdr.p_memsz]; | |
+ printf("DRUNTIME: address of pdso._tlsImage is %p\n", pdso._tlsImage.ptr); | |
+ auto inttls = cast(byte[])pdso._tlsImage; | |
+ printf("DRUNTIME: PT_TLS range is [ "); | |
+ foreach(i; inttls) printf("%d ", i); | |
+ printf("]\n"); | |
+ count++; | |
+ } | |
+ else { | |
+ printf("DRUNTIME: got to other load\n"); | |
auto beg = cast(void*)(info.dlpi_addr + phdr.p_vaddr); | |
pdso._gcRanges.insertBack(beg[0 .. phdr.p_memsz]); | |
+ } | |
} | |
break; | |
@@ -147,6 +219,9 @@ private | |
{ | |
pdso._tlsSize = phdr.p_memsz; | |
} | |
+ else version(Android) | |
+ { | |
+ } | |
else | |
{ | |
pdso._tlsMod = info.dlpi_tls_modid; | |
@@ -308,6 +383,42 @@ private | |
return (thptr - sz)[0 .. sz]; | |
} | |
} | |
+ else version(Android) | |
+ { | |
+ void[] getTLSRange(DSO* pdso) | |
+ { | |
+ return getTLSBlock(); | |
+ } | |
+ | |
+ ref void[] getTLSBlock() | |
+ { | |
+ auto pary = cast(void[]*)pthread_getspecific(_tlsKey); | |
+ if (pary is null) | |
+ { | |
+ pary = cast(void[]*).calloc(1, (void[]).sizeof); | |
+ if (pthread_setspecific(_tlsKey, pary) != 0) | |
+ { | |
+ import core.stdc.stdio; | |
+ perror("pthread_setspecific failed with"); | |
+ assert(0); | |
+ } | |
+ } | |
+ return *pary; | |
+ } | |
+ | |
+ ref void[] getTLSBlockAlloc() | |
+ { | |
+ auto pary = &getTLSBlock(); | |
+ if (!pary.length) | |
+ { | |
+ size_t tlsSize = globalSectionGroup._tlsImage.length; | |
+ auto p = .malloc(tlsSize); | |
+ memcpy(p, globalSectionGroup._tlsImage.ptr, tlsSize); | |
+ *pary = p[0 .. tlsSize]; | |
+ } | |
+ return *pary; | |
+ } | |
+ } | |
else | |
{ | |
struct tls_index | |
@@ -348,6 +459,7 @@ private | |
void initSections() | |
{ | |
debug(PRINTF) printf("initSections called\n"); | |
+ pthread_key_create(&_tlsKey, null); | |
globalSectionGroup.moduleGroup = ModuleGroup(getModuleInfos()); | |
static void pushRange(void* start, void* end) | |
@@ -407,6 +519,7 @@ void finiSections() | |
debug(PRINTF) printf("finiSections called\n"); | |
import core.stdc.stdlib : free; | |
free(cast(void*)globalSectionGroup.modules.ptr); | |
+ pthread_key_delete(_tlsKey); | |
} | |
private | |
@@ -416,6 +529,10 @@ private | |
extern(C) void _d_dyld_getTLSRange(void*, void**, size_t*); | |
private ubyte dummyTlsSymbol; | |
} | |
+ else version (Android) | |
+ { | |
+ __gshared pthread_key_t _tlsKey; | |
+ } | |
else version (Windows) | |
{ | |
extern(C) extern | |
@@ -473,6 +590,17 @@ void scanTLSRanges(void[] rng, scope void delegate(void* pbeg, void* pend) nothr | |
if (rng) dg(rng.ptr, rng.ptr + rng.length); | |
} | |
+version(Android) | |
+ extern(D) void* ___tls_get_addr( void** p ) | |
+ { | |
+ //printf("DRUNTIME: calling tlsget_addr with address %p referencing %p on tlsimage at %p\n", p, *p, globalSectionGroup._tlsImage.ptr); | |
+ immutable offset = cast(size_t)(*p - globalSectionGroup._tlsImage.ptr); | |
+ auto tls = getTLSBlockAlloc(); | |
+ //printf("DRUNTIME: calling tlsget_addr with tls.ptr %p and offset %d\n", tls.ptr, offset); | |
+ assert(offset < tls.length); | |
+ return tls.ptr + offset; | |
+ } | |
+ | |
extern (C) __gshared ModuleReference* _Dmodule_ref; // start of linked list | |
private: |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment