http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56263



--- Comment #2 from Georg-Johann Lay <gjl at gcc dot gnu.org> 2013-02-11 
15:09:40 UTC ---

Created attachment 29418

  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=29418

draft patch



    PR target/56263

    * config/avr/avr.opt (-mstrict-addr-space-subsets): New option and...

    (avr_strict_addr_space_subsets)... attached variable.

    * config/avr/avr.c (avr_addr_space_subset_p): Use it to determine

    whether of not an address spaces are subsets.

    * doc/invoke.texi (AVR Options) <-mstrict-addr-space-subsets>:

    Document it.





I had a look at this.



With strict address spaces, GCC will emit zeroes as result of casts across

address spaces.  This means that code like



char read_char (const char *address, int data_in_flash)

{

    if (data_in_flash)

        return *(const __flash char*) address;

    else

        return *address;

}



will no more operate correctly.  For the same reason, it is no more possible to

use PSTR from AVR-LibC with functions that get an address space pointer because

PSTR puts (and must put) the literal in generic space.



(In reply to comment #1)

> I think the next test case should also be considered.

> 

> const char __flash* const __flash names[] =

> {

>     "flash_str1",

>     "flash_str2"



This cannot work because ISO/IEC TR18037 forces these literals into generic

space.



> };

> 

> const char __flash* name1 = names[0]; // ok

> const char*         name2 = names[1]; // error



Attached is the draft patch that I used.  This means that in order to make this

work, the compiler proper has to be extended and the feature cannot be

implemented in the avr backend alone.  Thus suspending for now and for an other

stage.

Reply via email to