Hi !

While porting a GCC 4.9 private port to GCC 7, I've encountered an issue with 
named address space support.

I have defined the following target macros:

#define K1_ADDR_SPACE_UNCACHED 1
#define K1_ADDR_SPACE_CONVERT 2

 TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P (returns false for CONVERT, regular 
legitimate hook for other as)
 TARGET_ADDR_SPACE_LEGITIMIZE_ADDRESS (raises an error if using CONVERT as or 
calls regular legitimize_address hook)
 TARGET_ADDR_SPACE_SUBSET_P (always true)
 TARGET_ADDR_SPACE_CONVERT (emits a warning if not to/from CONVERT as and 
always returns first operand)

#define REGISTER_TARGET_PRAGMAS() do {                               \
   c_register_addr_space ("__uncached", K1_ADDR_SPACE_UNCACHED); \
   c_register_addr_space ("__convert", K1_ADDR_SPACE_CONVERT); \
 } while (0)

The usage is very basic and is used to drive the insn selection to use 
cached/uncached variants for load/store.
Pointers are declared with `__uncached` to use uncached variants and 
`__convert` is used when converting pointers to/from this uncached space.
It works as expected on GCC 4.9.

On our current port on GCC 7 (using latest gcc-7-branch branch), we have an 
issue with simple code:

```
typedef struct {
 unsigned long count;
} foo_t;  

unsigned long foobar(foo_t *cond, int bar)
{
  if (bar == 1 ) {
  }
  __uncached foo_t *ucond = cond;
  return ucond->count;
}
```

Raises the following error:

```
<source>: In function 'foobar':
<source>:9:3: error: unknown type name '__uncached'
   __uncached foo_t *ucond = cond;
   ^~~~~~~~~~

<source>:9:20: error: expected '=', ',', ';', 'asm' or '__attribute__' before 
'*' token
   __uncached foo_t *ucond = cond;
                    ^
<source>:10:10: error: 'ucond' undeclared (first use in this function); did you 
mean 'cond'?
   return ucond->count;
          ^~~~~
          cond
<source>:10:10: note: each undeclared identifier is reported only once for each 
function it appears in
Compiler returned: 1
```

The following changes make the code compile as expected:

 - moving the variable declaration at the beginning of the block
 - opening a block before the declaration and closing it after the return stmt.

I could not find a matching PR in bugzilla.
Do you know of any issue with this ? Maybe this has been fixed in later 
versions.

Thanks,
Marc

Reply via email to