This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

alias: Varying struct and fixed scalar question


Hi,

in true_dependence (alias.c) a varying struct
address is considered to never alias a fixed scalar value. This
rule is triggered also in something like the following:

struct foo { int n; };
extern unsigned long c = 0;

{
  int b;

  b = 2;
  ((struct foo*)(&b + c))->n = 3;
}

This is a bit oversimplifyfied. The real testcase unfortunately fails
only on s390 but there with gcc 2.95, 3.4 and 4.2.

true_dependence asks fixed_scalar_and_varying_struct_p whether these
MEMs may be an alias for each other.

The address of b on the stack (%fp - frame pointer):
(mem/f:DI (plus:DI (reg/f:DI 34 %fp)
        (const_int 160 [0xa0])) [4 b+0 S8 A64])

&b + c
(mem/s:DI (plus:DI (reg:DI 74)
        (plus:DI (reg/f:DI 34 %fp)
            (const_int 160 [0xa0]))) [0 <variable>.n+0 S8 A64])

It can be seen that the first MEM has a 'scalar' flag and the second
an 'in struct' flag.

Although I must admit that this doesn't seem to be very sane code
I was wondering why gcc considers these MEMs to not alias each other although
both have the same base address? What c99 rule would back this behaviour?

According to c99 I would say the memory of b should be safely accessible
using a pointer cast to (struct foo*) because the struct member has the
same type as b:

'An object shall have its stored value accessed only by an lvalue
expression that has one of the following types:
	...
	an aggregate or union type that includes one of the aforementioned 
     	types among its members (including, recursively, a member of a     
	subaggregate or contained union), or
	...'

Bye,

-Andreas-


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]