public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* Use -ftls-model=local-exec for RTEMS by default?
@ 2022-07-20  8:43 Sebastian Huber
  2022-07-20  9:28 ` Sebastian Huber
  0 siblings, 1 reply; 9+ messages in thread
From: Sebastian Huber @ 2022-07-20  8:43 UTC (permalink / raw)
  To: GCC Development

Hello,

RTEMS applications are usually fully statically linked together with the 
operating system. So, we can use the -ftls-model=local-exec TLS model. 
The default value for this option is defined in common.opt:

ftls-model=
Common Joined RejectNegative Enum(tls_model) Var(flag_tls_default) 
Init(TLS_MODEL_GLOBAL_DYNAMIC)
-ftls-model=[global-dynamic|local-dynamic|initial-exec|local-exec]	Set 
the default thread-local storage code generation model.

Would it be possible to customize the default value for RTEMS?

-- 
embedded brains GmbH
Herr Sebastian HUBER
Dornierstr. 4
82178 Puchheim
Germany
email: sebastian.huber@embedded-brains.de
phone: +49-89-18 94 741 - 16
fax:   +49-89-18 94 741 - 08

Registergericht: Amtsgericht München
Registernummer: HRB 157899
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Use -ftls-model=local-exec for RTEMS by default?
  2022-07-20  8:43 Use -ftls-model=local-exec for RTEMS by default? Sebastian Huber
@ 2022-07-20  9:28 ` Sebastian Huber
  2022-07-20 11:41   ` Alexander Monakov
  0 siblings, 1 reply; 9+ messages in thread
From: Sebastian Huber @ 2022-07-20  9:28 UTC (permalink / raw)
  To: GCC Development

On 20/07/2022 10:43, Sebastian Huber wrote:
> Hello,
> 
> RTEMS applications are usually fully statically linked together with the 
> operating system. So, we can use the -ftls-model=local-exec TLS model. 
> The default value for this option is defined in common.opt:
> 
> ftls-model=
> Common Joined RejectNegative Enum(tls_model) Var(flag_tls_default) 
> Init(TLS_MODEL_GLOBAL_DYNAMIC)
> -ftls-model=[global-dynamic|local-dynamic|initial-exec|local-exec]    
> Set the default thread-local storage code generation model.
> 
> Would it be possible to customize the default value for RTEMS?

I think this could be done by adding

#define CC1_SPEC "%{!ftls-model=*:-ftls-model=local-exec}"

to gcc/config/rtems.h. However, the CC1_SPEC is also defined by several 
targets. Would it be possible to add an OS_CC1_SPEC like this?

diff --git a/gcc/gcc.cc b/gcc/gcc.cc
index bb07cc244e3..7ddabc888b0 100644
--- a/gcc/gcc.cc
+++ b/gcc/gcc.cc
@@ -709,6 +709,12 @@ proper position among the other output files.  */
  #define CC1_SPEC ""
  #endif

+/* config.h can define OS_CC1_SPEC to provide extra args to cc1 and cc1plus
+   or operating system specific extra switch-translations.  */
+#ifndef OS_CC1_SPEC
+#define OS_CC1_SPEC ""
+#endif
+
  /* config.h can define CC1PLUS_SPEC to provide extra args to cc1plus
     or extra switch-translations.  */
  #ifndef CC1PLUS_SPEC
@@ -1194,7 +1200,7 @@ proper position among the other output files.  */
  static const char *asm_debug = ASM_DEBUG_SPEC;
  static const char *asm_debug_option = ASM_DEBUG_OPTION_SPEC;
  static const char *cpp_spec = CPP_SPEC;
-static const char *cc1_spec = CC1_SPEC;
+static const char *cc1_spec = CC1_SPEC OS_CC1_SPEC;
  static const char *cc1plus_spec = CC1PLUS_SPEC;
  static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC;
  static const char *link_ssp_spec = LINK_SSP_SPEC;

How does Ada get its default TLS model?

-- 
embedded brains GmbH
Herr Sebastian HUBER
Dornierstr. 4
82178 Puchheim
Germany
email: sebastian.huber@embedded-brains.de
phone: +49-89-18 94 741 - 16
fax:   +49-89-18 94 741 - 08

Registergericht: Amtsgericht München
Registernummer: HRB 157899
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Use -ftls-model=local-exec for RTEMS by default?
  2022-07-20  9:28 ` Sebastian Huber
@ 2022-07-20 11:41   ` Alexander Monakov
  2022-07-20 11:48     ` Sebastian Huber
  0 siblings, 1 reply; 9+ messages in thread
From: Alexander Monakov @ 2022-07-20 11:41 UTC (permalink / raw)
  To: Sebastian Huber; +Cc: GCC Development

On Wed, 20 Jul 2022, Sebastian Huber wrote:

> How does Ada get its default TLS model?

You shouldn't need to do anything special, GCC automatically selects
initial-exec or local-exec for non-PIC (including PIE).

Alexander

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Use -ftls-model=local-exec for RTEMS by default?
  2022-07-20 11:41   ` Alexander Monakov
@ 2022-07-20 11:48     ` Sebastian Huber
  2022-07-20 13:01       ` Alexander Monakov
  0 siblings, 1 reply; 9+ messages in thread
From: Sebastian Huber @ 2022-07-20 11:48 UTC (permalink / raw)
  To: Alexander Monakov; +Cc: GCC Development

On 20/07/2022 13:41, Alexander Monakov wrote:
> On Wed, 20 Jul 2022, Sebastian Huber wrote:
> 
>> How does Ada get its default TLS model?
> You shouldn't need to do anything special, GCC automatically selects
> initial-exec or local-exec for non-PIC (including PIE).

I am not sure, for this test program:

extern _Thread_local int i;
_Thread_local int j;

int f(void)
{
   return i + j;
}

I get:

powerpc-rtems6-gcc -S -O2 -o - tls.c
         .file   "tls.c"
         .machine ppc
         .section        ".text"
         .align 2
         .globl f
         .type   f, @function
f:
.LFB0:
         .cfi_startproc
         lis 9,_GLOBAL_OFFSET_TABLE_@ha
         addis 10,2,j@tprel@ha
         la 9,_GLOBAL_OFFSET_TABLE_@l(9)
         addi 10,10,j@tprel@l
         lwz 9,i@got@tprel(9)
         lwz 10,0(10)
         add 9,9,i@tls
         lwz 3,0(9)
         add 3,3,10
         blr
         .cfi_endproc
.LFE0:
         .size   f,.-f
         .globl j
         .section        .tbss,"awT",@nobits
         .align 2
         .type   j, @object
         .size   j, 4
j:
         .zero   4
         .ident  "GCC: (GNU) 12.1.1 20220711 [master 5efa23f3389]"
         .section        .note.GNU-stack,"",@progbits

and:

powerpc-rtems6-gcc -S -O2 -o - tls.c -ftls-model=local-exec
         .file   "tls.c"
         .machine ppc
         .section        ".text"
         .align 2
         .globl f
         .type   f, @function
f:
.LFB0:
         .cfi_startproc
         addis 10,2,i@tprel@ha
         addis 9,2,j@tprel@ha
         addi 10,10,i@tprel@l
         addi 9,9,j@tprel@l
         lwz 3,0(10)
         lwz 9,0(9)
         add 3,3,9
         blr
         .cfi_endproc
.LFE0:
         .size   f,.-f
         .globl j
         .section        .tbss,"awT",@nobits
         .align 2
         .type   j, @object
         .size   j, 4
j:
         .zero   4
         .ident  "GCC: (GNU) 12.1.1 20220711 [master 5efa23f3389]"
         .section        .note.GNU-stack,"",@progbits

-- 
embedded brains GmbH
Herr Sebastian HUBER
Dornierstr. 4
82178 Puchheim
Germany
email: sebastian.huber@embedded-brains.de
phone: +49-89-18 94 741 - 16
fax:   +49-89-18 94 741 - 08

Registergericht: Amtsgericht München
Registernummer: HRB 157899
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Use -ftls-model=local-exec for RTEMS by default?
  2022-07-20 11:48     ` Sebastian Huber
@ 2022-07-20 13:01       ` Alexander Monakov
  2022-07-21  5:25         ` Sebastian Huber
  0 siblings, 1 reply; 9+ messages in thread
From: Alexander Monakov @ 2022-07-20 13:01 UTC (permalink / raw)
  To: Sebastian Huber; +Cc: GCC Development


On Wed, 20 Jul 2022, Sebastian Huber wrote:

> On 20/07/2022 13:41, Alexander Monakov wrote:
> > On Wed, 20 Jul 2022, Sebastian Huber wrote:
> > 
> >> How does Ada get its default TLS model?
> > You shouldn't need to do anything special, GCC automatically selects
> > initial-exec or local-exec for non-PIC (including PIE).
> 
> I am not sure, for this test program:
> 
> extern _Thread_local int i;
> _Thread_local int j;
> 
> int f(void)
> {
>   return i + j;
> }
> 
> I get:
[snip]

Thanks, I missed that you are asking about promoting initial-exec to local-exec
rather than x-dynamic to y-exec. There's a pending patch that implements such
promotion based on visibility information:
https://gcc.gnu.org/pipermail/gcc-patches/2022-July/598017.html

With that patch, you'll get local-exec model for the extern variable 'i' if you
inform the compiler that its definition will end up in the current module:

__attribute__((visibility("hidden")))
extern _Thread_local int i;
_Thread_local int j;

int f(void)
{
  return i + j;
}

Thus I would try to enhance the binds_local_p target hook for RTEMS to inform
the compiler that there's no dynamic linking (although apart from TLS variables
I cannot instantly name other places where it would enhance optimization).

HTH
Alexander

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Use -ftls-model=local-exec for RTEMS by default?
  2022-07-20 13:01       ` Alexander Monakov
@ 2022-07-21  5:25         ` Sebastian Huber
  2022-07-21  8:03           ` Iain Sandoe
  0 siblings, 1 reply; 9+ messages in thread
From: Sebastian Huber @ 2022-07-21  5:25 UTC (permalink / raw)
  To: Alexander Monakov; +Cc: GCC Development

On 20.07.22 15:01, Alexander Monakov wrote:
> On Wed, 20 Jul 2022, Sebastian Huber wrote:
> 
>> On 20/07/2022 13:41, Alexander Monakov wrote:
>>> On Wed, 20 Jul 2022, Sebastian Huber wrote:
>>>
>>>> How does Ada get its default TLS model?
>>> You shouldn't need to do anything special, GCC automatically selects
>>> initial-exec or local-exec for non-PIC (including PIE).
>> I am not sure, for this test program:
>>
>> extern _Thread_local int i;
>> _Thread_local int j;
>>
>> int f(void)
>> {
>>    return i + j;
>> }
>>
>> I get:
> [snip]
> 
> Thanks, I missed that you are asking about promoting initial-exec to local-exec
> rather than x-dynamic to y-exec. There's a pending patch that implements such
> promotion based on visibility information:
> https://gcc.gnu.org/pipermail/gcc-patches/2022-July/598017.html
> 
> With that patch, you'll get local-exec model for the extern variable 'i' if you
> inform the compiler that its definition will end up in the current module:
> 
> __attribute__((visibility("hidden")))
> extern _Thread_local int i;
> _Thread_local int j;
> 
> int f(void)
> {
>    return i + j;
> }
> 
> Thus I would try to enhance the binds_local_p target hook for RTEMS to inform
> the compiler that there's no dynamic linking (although apart from TLS variables
> I cannot instantly name other places where it would enhance optimization).

This sounds like an interesting approach in the long run, however, I 
need a short term solution which I can back port to GCC 10, 11, and 12. 
I guess I will add a

MULTILIB_EXTRA_OPTS = ftls-model=local-exec

to all RTEMS multilib configurations.

In general I think the target hooks are hard to customize for operating 
systems.

-- 
embedded brains GmbH
Herr Sebastian HUBER
Dornierstr. 4
82178 Puchheim
Germany
email: sebastian.huber@embedded-brains.de
phone: +49-89-18 94 741 - 16
fax:   +49-89-18 94 741 - 08

Registergericht: Amtsgericht München
Registernummer: HRB 157899
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Use -ftls-model=local-exec for RTEMS by default?
  2022-07-21  5:25         ` Sebastian Huber
@ 2022-07-21  8:03           ` Iain Sandoe
  2022-07-22 11:19             ` Sebastian Huber
  0 siblings, 1 reply; 9+ messages in thread
From: Iain Sandoe @ 2022-07-21  8:03 UTC (permalink / raw)
  To: Sebastian Huber; +Cc: Alexander Monakov, GCC Development



> On 21 Jul 2022, at 06:25, Sebastian Huber <sebastian.huber@embedded-brains.de> wrote:
> 
> On 20.07.22 15:01, Alexander Monakov wrote:
>> On Wed, 20 Jul 2022, Sebastian Huber wrote:
>>> On 20/07/2022 13:41, Alexander Monakov wrote:
>>>> On Wed, 20 Jul 2022, Sebastian Huber wrote:
>>>> 
>>>>> How does Ada get its default TLS model?
>>>> You shouldn't need to do anything special, GCC automatically selects
>>>> initial-exec or local-exec for non-PIC (including PIE).
>>> I am not sure, for this test program:
>>> 
>>> extern _Thread_local int i;
>>> _Thread_local int j;
>>> 
>>> int f(void)
>>> {
>>>   return i + j;
>>> }
>>> 
>>> I get:
>> [snip]
>> Thanks, I missed that you are asking about promoting initial-exec to local-exec
>> rather than x-dynamic to y-exec. There's a pending patch that implements such
>> promotion based on visibility information:
>> https://gcc.gnu.org/pipermail/gcc-patches/2022-July/598017.html
>> With that patch, you'll get local-exec model for the extern variable 'i' if you
>> inform the compiler that its definition will end up in the current module:
>> __attribute__((visibility("hidden")))
>> extern _Thread_local int i;
>> _Thread_local int j;
>> int f(void)
>> {
>>   return i + j;
>> }
>> Thus I would try to enhance the binds_local_p target hook for RTEMS to inform
>> the compiler that there's no dynamic linking (although apart from TLS variables
>> I cannot instantly name other places where it would enhance optimization).
> 
> This sounds like an interesting approach in the long run, however, I need a short term solution which I can back port to GCC 10, 11, and 12. I guess I will add a
> 
> MULTILIB_EXTRA_OPTS = ftls-model=local-exec
> 
> to all RTEMS multilib configurations.
> 
> In general I think the target hooks are hard to customize for operating systems.

(IMO) It can be not too tricky -  Darwin customises several - you just have to override the default definition in your target-specific header and provide the replacement e.g ( override in config/darwin.h, replacement in config/darwin.cc):

#undef TARGET_ENCODE_SECTION_INFO
#define TARGET_ENCODE_SECTION_INFO  darwin_encode_section_info

0.02GBP only, as always ;)
Iain

> 
> -- 
> embedded brains GmbH
> Herr Sebastian HUBER
> Dornierstr. 4
> 82178 Puchheim
> Germany
> email: sebastian.huber@embedded-brains.de
> phone: +49-89-18 94 741 - 16
> fax:   +49-89-18 94 741 - 08
> 
> Registergericht: Amtsgericht München
> Registernummer: HRB 157899
> Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
> Unsere Datenschutzerklärung finden Sie hier:
> https://embedded-brains.de/datenschutzerklaerung/


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Use -ftls-model=local-exec for RTEMS by default?
  2022-07-21  8:03           ` Iain Sandoe
@ 2022-07-22 11:19             ` Sebastian Huber
  2022-07-22 11:35               ` Iain Sandoe
  0 siblings, 1 reply; 9+ messages in thread
From: Sebastian Huber @ 2022-07-22 11:19 UTC (permalink / raw)
  To: Iain Sandoe; +Cc: GCC Development

On 21.07.22 10:03, Iain Sandoe wrote:
>> This sounds like an interesting approach in the long run, however, I need a short term solution which I can back port to GCC 10, 11, and 12. I guess I will add a
>>
>> MULTILIB_EXTRA_OPTS = ftls-model=local-exec
>>
>> to all RTEMS multilib configurations.
>>
>> In general I think the target hooks are hard to customize for operating systems.
> (IMO) It can be not too tricky -  Darwin customises several - you just have to override the default definition in your target-specific header and provide the replacement e.g ( override in config/darwin.h, replacement in config/darwin.cc):
> 
> #undef TARGET_ENCODE_SECTION_INFO
> #define TARGET_ENCODE_SECTION_INFO  darwin_encode_section_info

The problem is that in this case you need a target-specific copy and 
paste solution. For example lets suppose you want to use

#define CC1_SPEC "%{!ftls-model=*:-ftls-model=local-exec}"

for RTEMS (in gcc/config/rtems.h), then you have a problem on for 
example microblaze (gcc/config/microblaze/microblaze.h):

#ifndef CC1_SPEC
#define CC1_SPEC " \
%{G*} \
%(subtarget_cc1_spec) \
%{mxl-multiply-high:-mcpu=v6.00.a} \
"
#endif

or nios2 (gcc/config/nios2/nios2.h):

#define CC1_SPEC "%{G*}"

For each target you would have to check if you have to provide some 
extra times for CC1_SPEC through copy and paste.

-- 
embedded brains GmbH
Herr Sebastian HUBER
Dornierstr. 4
82178 Puchheim
Germany
email: sebastian.huber@embedded-brains.de
phone: +49-89-18 94 741 - 16
fax:   +49-89-18 94 741 - 08

Registergericht: Amtsgericht München
Registernummer: HRB 157899
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Use -ftls-model=local-exec for RTEMS by default?
  2022-07-22 11:19             ` Sebastian Huber
@ 2022-07-22 11:35               ` Iain Sandoe
  0 siblings, 0 replies; 9+ messages in thread
From: Iain Sandoe @ 2022-07-22 11:35 UTC (permalink / raw)
  To: Sebastian Huber; +Cc: GCC Development



> On 22 Jul 2022, at 12:19, Sebastian Huber <sebastian.huber@embedded-brains.de> wrote:
> 
> On 21.07.22 10:03, Iain Sandoe wrote:
>>> This sounds like an interesting approach in the long run, however, I need a short term solution which I can back port to GCC 10, 11, and 12. I guess I will add a
>>> 
>>> MULTILIB_EXTRA_OPTS = ftls-model=local-exec
>>> 
>>> to all RTEMS multilib configurations.
>>> 
>>> In general I think the target hooks are hard to customize for operating systems.
>> (IMO) It can be not too tricky -  Darwin customises several - you just have to override the default definition in your target-specific header and provide the replacement e.g ( override in config/darwin.h, replacement in config/darwin.cc):
>> #undef TARGET_ENCODE_SECTION_INFO
>> #define TARGET_ENCODE_SECTION_INFO  darwin_encode_section_info
> 
> The problem is that in this case you need a target-specific copy and paste solution. For example lets suppose you want to use
> 
> #define CC1_SPEC "%{!ftls-model=*:-ftls-model=local-exec}"
> 
> for RTEMS (in gcc/config/rtems.h), then you have a problem on for example microblaze (gcc/config/microblaze/microblaze.h):
> 
> #ifndef CC1_SPEC
> #define CC1_SPEC " \
> %{G*} \
> %(subtarget_cc1_spec) \
> %{mxl-multiply-high:-mcpu=v6.00.a} \
> "
> #endif
> 
> or nios2 (gcc/config/nios2/nios2.h):
> 
> #define CC1_SPEC "%{G*}"
> 
> For each target you would have to check if you have to provide some extra times for CC1_SPEC through copy and paste.

Yes, there is a curious ‘inversion’ process where, to the OS, the architectures are sub-targets, but to the GCC implementation the OSs are sub-targets of the arch, it can be possible to work around this by declaring SUBTARGET_SPEC_XXXX and then appending that to the various users.  However, it could be that even that will not work easily in this case.
Iain


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2022-07-22 11:35 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-20  8:43 Use -ftls-model=local-exec for RTEMS by default? Sebastian Huber
2022-07-20  9:28 ` Sebastian Huber
2022-07-20 11:41   ` Alexander Monakov
2022-07-20 11:48     ` Sebastian Huber
2022-07-20 13:01       ` Alexander Monakov
2022-07-21  5:25         ` Sebastian Huber
2022-07-21  8:03           ` Iain Sandoe
2022-07-22 11:19             ` Sebastian Huber
2022-07-22 11:35               ` Iain Sandoe

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).