[named address] rejects-valid: error: initializer element is not computable at load time
Ulrich Weigand
uweigand@de.ibm.com
Thu Aug 4 16:10:00 GMT 2011
Georg-Johann Lay wrote:
> For the following 1-liner I get an error with current trunk r177267:
>
> const __pgm char * pallo = "pallo";
>
> __pgm as a named address space qualifier.
[snip]
> Moreover, if a user writes a line like
> const __pgm char * pallo = "pallo";
> he wants the string literal to be placed in the non-default address
> space. There is no other way to express that except something like
> const __pgm char * pallo = (const __pgm char*) "pallo";
> which doesn't work either and triggers
>
> pgm.c:1:1: error: initializer element is not constant
>
> with a tree dump similar to above.
This is pretty much working as expected. "pallo" is a string literal
which (always) resides in the default address space. According to the
named address space specification (TR 18037) there are no string literals
in non-default address spaces ...
The assignment above would therefore need to convert a pointer to the
string literal in the default space to a pointer to the __pgm address
space. This might be impossible (depending on whether __pgm encloses
the generic space), and even if it is possible, it is not guaranteed
that the conversion can be done as a constant expression at compile time.
What I'd do to get a string placed into the __pgm space is to explicitly
initialize an *array* in __pgm space, e.g. like so:
const __pgm char pallo[] = "pallo";
This is defined to work according to TR 18037, and it does actually
work for me on spu-elf.
Bye,
Ulrich
--
Dr. Ulrich Weigand
GNU Toolchain for Linux on System z and Cell BE
Ulrich.Weigand@de.ibm.com
More information about the Gcc
mailing list