Skip to content

Commit

Permalink
start for TLS for OSX
Browse files Browse the repository at this point in the history
  • Loading branch information
Walter Bright committed Jan 8, 2010
1 parent 1a061df commit 6f8a61a
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 19 deletions.
48 changes: 31 additions & 17 deletions src/backend/el.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,10 @@ static int eprm_cnt; /* max # of allocs at any point */
#include "xcoff.h"
#endif

#if TARGET_OSX
extern void slist_add(Symbol *s);
#endif

/*******************************
* Do our own storage allocation of elems.
*/
Expand Down Expand Up @@ -1255,9 +1259,11 @@ elem *el_picvar(symbol *s)
case SCcomdef:
case SCglobal:
case SCextern:
#if 0
if (s->Stype->Tty & mTYthread)
x = 0;
else
#endif
x = 1;
case_got:
{ if (!localgot)
Expand All @@ -1276,7 +1282,7 @@ elem *el_picvar(symbol *s)
e->Eoper = OPrelconst;
e->Ety = TYnptr;
e = el_bin(OPadd, TYnptr, e, el_var(localgot));

#if 1
if (s->Stype->Tty & mTYthread)
{
if (!tls_get_addr_sym)
Expand All @@ -1286,26 +1292,33 @@ elem *el_picvar(symbol *s)
*/
tls_get_addr_sym = symbol_name("___tls_get_addr",SCglobal,type_fake(TYjfunc));
symbol_keep(tls_get_addr_sym);
slist_add(tls_get_addr_sym);
}
if (x == 1)
e = el_una(OPind, TYnptr, e);
e = el_bin(OPcall, TYnptr, el_var(tls_get_addr_sym), e);
if (op == OPvar)
e = el_una(OPind, TYnptr, e);
}


switch (op * 2 + x)
else
#endif
{
case OPvar * 2 + 1:
e = el_una(OPind, TYnptr, e);
e = el_una(OPind, TYnptr, e);
break;
case OPvar * 2 + 0:
case OPrelconst * 2 + 1:
e = el_una(OPind, TYnptr, e);
break;
case OPrelconst * 2 + 0:
break;
default:
assert(0);
break;
switch (op * 2 + x)
{
case OPvar * 2 + 1:
e = el_una(OPind, TYnptr, e);
e = el_una(OPind, TYnptr, e);
break;
case OPvar * 2 + 0:
case OPrelconst * 2 + 1:
e = el_una(OPind, TYnptr, e);
break;
case OPrelconst * 2 + 0:
break;
default:
assert(0);
break;
}
}
e->Ety = tym;
break;
Expand Down Expand Up @@ -1425,6 +1438,7 @@ elem * el_var(symbol *s)
//printf("el_var(s = '%s')\n", s->Sident);
//printf("%x\n", s->Stype->Tty);
#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS
// OSX is currently always pic
if (config.flags3 & CFG3pic &&
#if TARGET_LINUX || TARGET_FREEBSD || TARGET_SOLARIS
!(s->Stype->Tty & mTYthread) &&
Expand Down
7 changes: 5 additions & 2 deletions src/backend/machobj.c
Original file line number Diff line number Diff line change
Expand Up @@ -1335,8 +1335,9 @@ void obj_ehsections()
objpubdef(seg, s_tls_beg, 0);
if (MacVersion >= MacOSX_10_6)
obj_bytes(seg, 0, 4, NULL);
seg = mach_getsegment("__tlsdata", "__DATA", 2, S_REGULAR);
seg = mach_getsegment("__tls_data", "__DATA", 2, S_REGULAR);
if (MacVersion >= MacOSX_10_6)
// Don't need to write if the size is already non-zero
SegData[seg]->SDbuf->writezeros(4);

seg = mach_getsegment("__tls_end", "__DATA", 2, S_REGULAR);
Expand Down Expand Up @@ -1559,7 +1560,9 @@ seg_data *obj_tlsseg()

if (seg_tlsseg == UNKNOWN)
{
seg_tlsseg = mach_getsegment("__tlsdata", "__DATA", 2, S_REGULAR);
mach_getsegment("__tls_beg", "__DATA", 2, S_REGULAR);
seg_tlsseg = mach_getsegment("__tls_data", "__DATA", 2, S_REGULAR);
mach_getsegment("__tls_end", "__DATA", 2, S_REGULAR);
}
return SegData[seg_tlsseg];
}
Expand Down

0 comments on commit 6f8a61a

Please sign in to comment.