Re: const volatile behaviour change in GCC 7

2016-09-22 Thread Sergey Organov

Sebastian Huber  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;
  }
}

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;
  }
}

HTH

-- Sergey



Re: const volatile behaviour change in GCC 7

2016-09-22 Thread Sergey Organov
Sebastian Huber  writes:

> On 22/09/16 14:11, Sergey Organov wrote:
>> Sebastian Huber  writes:
>>> Hello,

[...]

>> 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.

Why? 8 more bytes in context of RTEMS? It likely doesn't matter. At all.

-- Sergey