On Jan 21, 2009, at 8:14 PM, Mon Ping Wang wrote:

> Hi,
>
> This patch fixes a case where we lose the address space when  
> accessing a member of a structure.  For example,
> consider
>
> typedef struct S {
>  int arr[ 3 ];
> } S;
>
> __attribute__((address_space(1))) S* p1;
> p1->arr[2] = 4;
>
> The address space associated with p1->arr should be address space 1.

Hi Mon Ping,

I am not sure that this is the right approach.  The embedded C spec  
(which defines how address spaces work) says:

"The effective type of an object for an access to its stored value is  
the declared type of the object, if any, without any address-space  
qualifier that the declared type may have.72)  If a value is stored into
an object having no declared type through an lvalue having a type that  
is not a character type, then
the type of the lvalue, without any address-space qualifier, becomes  
the effective type of the object
for that access and for subsequent accesses that do not modify the  
stored value. "

I think that this means that the type of "p1->arr" should be "int[3]"  
in your example, not "int[3] __addrspace(1)".  In this case, the code  
generator should generate the right address space qualifiers from the  
l-value ("p1"), not from the expression type.

This is similar to how volatile or const works.

-Chris
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to