const volatile behaviour change in GCC 7

Sebastian Huber sebastian.huber@embedded-brains.de
Thu Sep 22 12:38:00 GMT 2016



On 22/09/16 14:11, Sergey Organov wrote:
> Sebastian Huber <sebastian.huber@embedded-brains.de> writes:
>> Hello,
>>
>> for RTEMS we use linker sets to initialize the system. The following
>> code worked up to GCC 6, but no longer in GCC 7:
>>
>> typedef void ( *rtems_sysinit_handler )( void );
>>
>> typedef struct {
>>    rtems_sysinit_handler handler;
>> } rtems_sysinit_item;
>>
>> rtems_sysinit_item volatile const _Linker_set__Sysinit_begin[0]
>> __attribute__((__section__(".rtemsroset." "_Sysinit" ".begin")))
>> __attribute__((__used__));
>>
>> rtems_sysinit_item volatile const _Linker_set__Sysinit_end[0]
>> __attribute__((__section__(".rtemsroset." "_Sysinit" ".end")))
>> __attribute__((__used__));
>>
>> void rtems_initialize_executive(void)
>> {
>>    const volatile rtems_sysinit_item *cur = _Linker_set__Sysinit_begin;
>>    const volatile rtems_sysinit_item *end = _Linker_set__Sysinit_end;
> You likely have 'volatile' in a wrong place. Try (untested):
>
> rtems_sysinit_item const _Linker_set__Sysinit_begin[0]
> __attribute__((__section__(".rtemsroset." "_Sysinit" ".begin")))
> __attribute__((__used__));
>
> rtems_sysinit_item const _Linker_set__Sysinit_end[0]
> __attribute__((__section__(".rtemsroset." "_Sysinit" ".end")))
> __attribute__((__used__));
>
> void rtems_initialize_executive(void)
> {
>    rtems_sysinit_item const *volatile cur = _Linker_set__Sysinit_begin;
>    rtems_sysinit_item const *volatile end = _Linker_set__Sysinit_end;
>
>    while(cur != end) {
>      cur->handler();
>      ++cur;
>    }
> }

No, I don't want to load/store the pointers from/to memory all the time 
in this loop.

>
> Alternatively, try (untested, and I removed attributes to make my point
> clearer):
>
> /* Linker-defined symbols */
>
> rtems_sysinit_item const _Linker_set__Sysinit_begin[0]
> __attribute__((__section__(".rtemsroset." "_Sysinit" ".begin")))
> __attribute__((__used__));
>
> rtems_sysinit_item const _Linker_set__Sysinit_end[0]
> __attribute__((__section__(".rtemsroset." "_Sysinit" ".end")))
> __attribute__((__used__));
>
> /* Get volatile pointers to the above */
> static rtems_sysinit_item const *volatile begin_ = _Linker_set__Sysinit_begin;
> static rtems_sysinit_item const *volatile end_   = _Linker_set__Sysinit_end;
>
> void rtems_initialize_executive(void)
> {
>    rtems_sysinit_item const *cur = begin_;
>    rtems_sysinit_item const *end = end_;
>
>    while(cur != end) {
>      cur->handler();
>      ++cur;
>    }
> }
>
>

I don't want any storage for these begin/end markers.

-- 
Sebastian Huber, embedded brains GmbH

Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone   : +49 89 189 47 41-16
Fax     : +49 89 189 47 41-09
E-Mail  : sebastian.huber@embedded-brains.de
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.



More information about the Gcc mailing list