Hi Claudiu,

Thanks a lot for the clarifications! Unfortunately, though I have looked at
what you suggested, I still can't quite understand how to emit and work
with RTL that will ultimately lower into the assembly required for TLS on
Windows in legitimize_tls_address :( I shall not test your patience and
bother you any more by bombarding you with repeated questions over and
over, but once again, thanks for the help!

CC-ing Jan Hubicka, who is an i386 maintainer, which is the platform that I
aim to implement TLS for an OS for (x86 and x64 Windows) and who's area of
expertise may help here

best regards,
Julian

On Wed, Jul 24, 2024 at 4:18 PM Claudiu Zissulescu Ianculescu <
claz...@gmail.com> wrote:

> Hi Julian,
>
> I hope you have Ulrich's document about TLS, if not please google it:
> "ELF Handling for Thread-Local Storage - Ulrich Drepper"
>
> In ARC, I used unspec constructions to emit TLS addresses. If you
> wanna simplify it, in the legitimzie_tls_address you can only
> implement the most general case, namely TLS_GLOBAL_DYNAMIC, and all
> the others to fall back to it. For TLS, you need to reserve a tls
> register which will hold the tls pointer (in arc is a register holded
> by arc_tp_regno variable, but in ur case u can fix it).
> U can use the tls examples in the gcc's dejagnu test folder, compile
> arc backend and check the output assembly to see how it works.
> In case of ARC, the global dynamic model generates two relocs:
>
>        add   r0,pcl,@x@tlsgd        # R_ARC_TLS_GD_GOT x
>        bl    @__tls_get_addr@plt    # R_ARC_S21_PCREL_PLT __tls_get_addr
>        # Address of x in r0
>
> where __tls_get_addr is a function provided by the OS which will
> return the address of variable x in r0 (return reg). You should
> already have the PLT reloc, and you need to implement the TLS_GD_GOT
> reloc to GOT table. In GOT table you need additionally two relocs:
> GOT[n]          R_ARC_TLS_DTPMOD x
> GOT[n+1]      R_ARC_TLS_DTPOFF x
>
> I hope this may clarify it a bit, cheers,
> Claudiu
>
> On Thu, Jul 18, 2024 at 12:43 PM Julian Waters via Gcc <gcc@gcc.gnu.org>
> wrote:
> >
> > I guess I'll just say what platform I want to implement this for, since
> the
> > roundabout way of talking about it is probably confusing to everyone.
> It's
> > Windows, and hopefully implementing TLS for it should be relatively
> easier
> > since there is only 1 TLS model on Windows
> >
> > best regards,
> > Julian
> >
> > On Thu, Jul 18, 2024 at 5:39 PM Julian Waters <tanksherma...@gmail.com>
> > wrote:
> >
> > > Hi Claudiu,
> > >
> > > Thanks for the tip, I've since looked at and drawn inspiration from
> > > arc.cc. The main issue I have now is how to implement the code in
> > > legitimize_tls_address under i386.cc and the corresponding i386.md
> machine
> > > description file to get the following assembly for a TLS read (Assuming
> > > that local is the name of the thread local variable, that the last mov
> > > depends on the size of the variable, since it would be movq if it was
> an 8
> > > byte variable, that rscratch refers to scratch registers, and that
> > > rscratch1 holds the read TLS value at the end of the operation):
> > >
> > >     movl _tls_index(%rip), %rscratch1
> > >     movq %gs:88, %rscratch2
> > >     movq (%rscratch2, %rscratch1, 8), %rscratch1
> > >     movl local@SECREL32(%rscratch1), %rscratch1
> > >
> > > With some reference from the arc.cc code and another (unofficial) patch
> > > for the platform that I want to implement TLS for, I've managed a half
> > > finished implementation of TLS, but the final blocker so to speak is my
> > > lack of understanding on how the RTL manipulating code in
> > > legitimize_tls_address works. If you have any pointers on how to
> manipulate
> > > RTL to get the assembly required as seen above, I would be very much
> > > grateful :)
> > >
> > > best regards,
> > > Julian
> > >
> > > On Tue, Jul 16, 2024 at 8:16 PM Claudiu Zissulescu Ianculescu <
> > > claz...@gmail.com> wrote:
> > >
> > >> Hi Julian,
> > >>
> > >> You can check how we did it for ARC. In a nutshell, you need to define
> > >> HAVS_AS_TLS macro, you need to legitimize the new TLS address and
> > >> calls. Please have a look in arc.cc and search for TLS, also use git
> > >> blame to see the original patches. Of course, there are different ways
> > >> to implement TLS, in ARC is the simplest solution. Also, u need to
> > >> hack the assembler, linker and the OS for a full implementation.
> > >>
> > >> Cheers,
> > >> Claudiu
> > >>
> > >> On Tue, Jul 9, 2024 at 7:14 PM Julian Waters via Gcc <gcc@gcc.gnu.org
> >
> > >> wrote:
> > >> >
> > >> > Hi all,
> > >> >
> > >> > I'm currently trying to implement Native TLS on a platform that gcc
> uses
> > >> > emutls for at the moment, but I can't seem to figure out where and
> how
> > >> to
> > >> > implement it. I have a rough idea of the assembly required for TLS
> on
> > >> this
> > >> > platform, but I don't know where to plug it in to the compiler to
> make
> > >> it
> > >> > work. Could someone point me in the right direction for
> implementing TLS
> > >> > for a platform that doesn't have it implemented at the moment?
> > >> >
> > >> > I'm aware that I am being vague as to which platform I want to
> > >> implement it
> > >> > for. It's a platform that is likely low priority in the eyes of
> most gcc
> > >> > maintainers, so I'm deliberately avoiding mentioning what platform
> it
> > >> is so
> > >> > I don't get crickets for a reply :)
> > >> >
> > >> > best regards,
> > >> > Julian
> > >>
> > >
>

Reply via email to