Joakim
6 years ago
committed by
Fredrik Fornwall
3 changed files with 91 additions and 12 deletions
@ -0,0 +1,80 @@ |
|||
diff --git a/src/rt/sections_android.d b/src/rt/sections_android.d
|
|||
index cd8d5535..6a7fcd11 100644
|
|||
--- a/runtime/druntime/src/rt/sections_android.d
|
|||
+++ b/runtime/druntime/src/rt/sections_android.d
|
|||
@@ -76,7 +76,11 @@ void initSections() nothrow @nogc
|
|||
_sections.moduleGroup = ModuleGroup(mbeg[0 .. mend - mbeg]); |
|||
|
|||
auto pbeg = cast(void*)&_tlsend; |
|||
- auto pend = cast(void*)&__bss_end__;
|
|||
+ version(X86) auto pend = cast(void*)&_end;
|
|||
+ else version(X86_64) auto pend = cast(void*)& _end;
|
|||
+ else version(ARM) auto pend = cast(void*)& __bss_end__;
|
|||
+ else version(AArch64) auto pend = cast(void*)& __bss_end__;
|
|||
+ else static assert( false, "Android architecture not supported." );
|
|||
// _tlsend is a 32-bit int and may not be 64-bit void*-aligned, so align pbeg. |
|||
version(D_LP64) pbeg = cast(void*)(cast(size_t)(pbeg + 7) & ~cast(size_t)7); |
|||
_sections._gcRanges[0] = pbeg[0 .. pend - pbeg]; |
|||
@@ -115,43 +119,14 @@ void scanTLSRanges(void[]* rng, scope void delegate(void* pbeg, void* pend) noth
|
|||
* the corresponding address in the TLS dynamic per-thread data. |
|||
*/ |
|||
|
|||
-version(X86)
|
|||
+extern(C) void* __tls_get_addr( void* p ) nothrow @nogc
|
|||
{ |
|||
- // NB: the compiler mangles this function as '___tls_get_addr'
|
|||
- // even though it is extern(D)
|
|||
- extern(D) void* ___tls_get_addr( void* p ) nothrow @nogc
|
|||
- {
|
|||
- debug(PRINTF) printf(" ___tls_get_addr input - %p\n", p);
|
|||
- immutable offset = cast(size_t)(p - cast(void*)&_tlsstart);
|
|||
- auto tls = getTLSBlockAlloc();
|
|||
- assert(offset < tls.length);
|
|||
- return tls.ptr + offset;
|
|||
- }
|
|||
-}
|
|||
-else version(ARM)
|
|||
-{
|
|||
- extern(C) void* __tls_get_addr( void** p ) nothrow @nogc
|
|||
- {
|
|||
- debug(PRINTF) printf(" __tls_get_addr input - %p\n", *p);
|
|||
- immutable offset = cast(size_t)(*p - cast(void*)&_tlsstart);
|
|||
- auto tls = getTLSBlockAlloc();
|
|||
- assert(offset < tls.length);
|
|||
- return tls.ptr + offset;
|
|||
- }
|
|||
-}
|
|||
-else version(AArch64)
|
|||
-{
|
|||
- extern(C) void* __tls_get_addr( void* p ) nothrow @nogc
|
|||
- {
|
|||
- debug(PRINTF) printf(" __tls_get_addr input - %p\n", p);
|
|||
- immutable offset = cast(size_t)(p - cast(void*)&_tlsstart);
|
|||
- auto tls = getTLSBlockAlloc();
|
|||
- assert(offset < tls.length);
|
|||
- return tls.ptr + offset;
|
|||
- }
|
|||
+ debug(PRINTF) printf(" __tls_get_addr input - %p\n", p);
|
|||
+ immutable offset = cast(size_t)(p - cast(void*)&_tlsstart);
|
|||
+ auto tls = getTLSBlockAlloc();
|
|||
+ assert(offset < tls.length);
|
|||
+ return tls.ptr + offset;
|
|||
} |
|||
-else
|
|||
- static assert( false, "Android architecture not supported." );
|
|||
|
|||
private: |
|||
|
|||
@@ -209,7 +184,11 @@ extern(C)
|
|||
void* __stop_minfo; |
|||
} |
|||
|
|||
- size_t __bss_end__;
|
|||
+ version(X86) size_t _end;
|
|||
+ else version(X86_64) size_t _end;
|
|||
+ else version(ARM) size_t __bss_end__;
|
|||
+ else version(AArch64) size_t __bss_end__;
|
|||
+ else static assert( false, "Android architecture not supported." );
|
|||
|
|||
int _tlsstart; |
|||
int _tlsend; |
Loading…
Reference in new issue