Skip to content

Commit 919e810

Browse files
authored
add thread_bss support (#21848)
1 parent f407ee7 commit 919e810

File tree

3 files changed

+47
-11
lines changed

3 files changed

+47
-11
lines changed

compiler/src/dmd/backend/debugprint.d

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,10 @@ const(char)* tym_str(tym_t ty)
150150
strcat(p, "mTYxmmgpr|");
151151
if (ty & mTYgprxmm)
152152
strcat(p, "mTYgprxmm|");
153+
if (ty & mTYthread)
154+
strcat(p, "mTYthread|");
155+
if (ty & mTYthreadData)
156+
strcat(p, "mTYthreadData|");
153157
const tyb = tybasic(ty);
154158
if (tyb >= TYMAX)
155159
{

compiler/src/dmd/backend/dout.d

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ void outdata(Symbol* s)
8080
debug
8181
debugy && printf("outdata('%s')\n",s.Sident.ptr);
8282

83-
//printf("outdata('%s', ty=x%x)\n",s.Sident.ptr,s.Stype.Tty);
83+
//printf("outdata('%s', ty=%s)\n",s.Sident.ptr,tym_str(s.Stype.Tty));
8484
//symbol_print(*s);
8585

8686
// Data segment variables are always live on exit from a function
@@ -152,6 +152,25 @@ void outdata(Symbol* s)
152152
assert(config.objfmt == OBJ_MACH && I64);
153153
goto case;
154154
case mTYthread:
155+
if (config.objfmt == OBJ_MACH && config.target_cpu == TARGET_AArch64)
156+
{
157+
// Special handling
158+
import dmd.backend.machobj : MachObj_thread_vars;
159+
targ_size_t offseti;
160+
int segi = MachObj_thread_vars(*s, offseti, true);
161+
seg_data* pseg = objmod.tlsseg_bss();
162+
s.Sseg = pseg.SDseg;
163+
objmod.data_start(s, datasize, pseg.SDseg);
164+
objmod.lidata(pseg.SDseg, pseg.SDoffset, datasize); // I think this section is readonly, so data should overlap
165+
// instead of being consecutive as gcc emits it
166+
s.Sfl = FL.tlsdata;
167+
168+
// if (s.Sclass == SC.global || s.Sclass == SC.static_)
169+
// objmod.pubdefsize(seg,s,s.Soffset,datasize); // do the definition
170+
171+
// BUG AArch64: symbolic debug info?
172+
break;
173+
}
155174
{ seg_data* pseg = objmod.tlsseg_bss();
156175
s.Sseg = pseg.SDseg;
157176
objmod.data_start(s, datasize, pseg.SDseg);
@@ -273,7 +292,7 @@ void outdata(Symbol* s)
273292
// Special handling
274293
import dmd.backend.machobj : MachObj_thread_vars;
275294
targ_size_t offseti;
276-
int segi = MachObj_thread_vars(*s, offseti);
295+
int segi = MachObj_thread_vars(*s, offseti, false);
277296
dt_writeToObj(objmod, dtstart, segi, offseti);
278297
Offset(segi) = offseti;
279298
dt_free(dtstart);

compiler/src/dmd/backend/machobj.d

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1091,9 +1091,9 @@ void MachObj_term(const(char)[] objfilename)
10911091
fobjbuf.write(&rel, rel.sizeof);
10921092
foffset += rel.sizeof;
10931093
nreloc++;
1094-
int32_t* p = patchAddr64(seg, r.offset);
1094+
//int32_t* p = patchAddr64(seg, r.offset);
10951095
// Absolute address; add in addr of start of targ seg
1096-
*p += SecHdrTab64[SegData[s.Sseg].SDshtidx].addr + s.Soffset;
1096+
// *p += SecHdrTab64[SegData[s.Sseg].SDshtidx].addr + s.Soffset;
10971097
//patch(pseg, r.offset, s.Sseg, s.Soffset);
10981098
}
10991099
else if (s.Sclass == SC.extern_ ||
@@ -1994,14 +1994,18 @@ seg_data* MachObj_tlsseg()
19941994

19951995
/*******************************************
19961996
* Emit 24 byte __thread_vars section for AArch64.
1997+
* Params:
1998+
* s = Symbol for variable to be added to __thread_vars section
1999+
* offset = set to offset to start of where to write initializer data
2000+
* bss = true to write to __thread_bss, false to __thread_data
19972001
* Returns:
19982002
* segment to write initialization data to
19992003
*/
20002004
@trusted
2001-
int MachObj_thread_vars(ref Symbol s, out targ_size_t offset)
2005+
int MachObj_thread_vars(ref Symbol s, out targ_size_t offset, bool bss)
20022006
{
2003-
printf("MachObj_thread_vars(s)\n");
2004-
symbol_print(s);
2007+
//printf("MachObj_thread_vars(s)\n");
2008+
//symbol_print(s);
20052009
/* create _ident$tlv$init Symbol si
20062010
*/
20072011
Symbol* si;
@@ -2020,12 +2024,21 @@ int MachObj_thread_vars(ref Symbol s, out targ_size_t offset)
20202024
mem_free(dest.ptr);
20212025
}
20222026

2023-
/* write _ident$tlv$init to __thread_data section
2027+
/* write _ident$tlv$init to __thread_bss / __thread_data section
20242028
*/
2025-
MachObj_tlsseg_data();
2026-
si.Sseg = seg_tlsseg_data;
2029+
if (bss)
2030+
{
2031+
MachObj_tlsseg_bss();
2032+
si.Sseg = seg_tlsseg_bss;
2033+
offset = 0;
2034+
}
2035+
else
2036+
{
2037+
MachObj_tlsseg_data();
2038+
si.Sseg = seg_tlsseg_data;
2039+
offset = SegData[si.Sseg].SDbuf.length();
2040+
}
20272041
si.Sfl = FL.tlsdata;
2028-
offset = SegData[si.Sseg].SDbuf.length();
20292042
MachObj_pubdef(si.Sseg, si, offset);
20302043

20312044
/* Create __thread_vars section, and s will refer to it

0 commit comments

Comments
 (0)