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]

Re: named address spaces: addr_space_convert never called


On Mon, Nov 8, 2010 at 3:39 PM, Georg Lay <avr@gjlay.de> wrote:
> Hi, I just started playing around with named address spaces for avr.
> Besides general space (ram), I introduced a second one, __pgm, which
> shall address program memory where also constants may live. avr is
> havard architecture, and both program memory and ram start at address 0.
>
> From this and the internals on TARGET_ADDR_SPACE_CONVERT I understand
> that pointer casting will not work as expected, because that hook will
> only get called if the respective address spaces are subsets. However,
> neither is space-1 a subset of space-0 nor vice versa (or am I midlead
> by internals?)
>
> Is there a way to make it work in the case where the address spaces
> are disjoint? Started this morning and everything went smooth until I
> started messing around with pointer casts:
>
>
> char cast_3 (char in_pgm, void * p)
> {
> ? ?return in_pgm ? (*((char __pgm *) p)) : (*((char *) p));
> }
>
> The cast looks fine from the trees perspective (excerpt from .expand):
>
> The first cast nullifies the pointer.
> ;; Function cast_3 (cast_3)
>
> cast_3 (char in_pgm, void * p)
> {
> ?<address-space-1> char * D.1934;
> ?char D.1930;
>
> ?# BLOCK 2 freq:10000
> ?# PRED: ENTRY [100.0%] ?(fallthru,exec)
> ?if (in_pgm_2(D) != 0)
> ? ?goto <bb 3>;
> ?else
> ? ?goto <bb 4>;
> ?# SUCC: 3 [39.0%] ?(true,exec) 4 [61.0%] ?(false,exec)
>
> ?# BLOCK 3 freq:3900
> ?# PRED: 2 [39.0%] ?(true,exec)
> ?D.1934_4 = (<address-space-1> char *) p_3(D);
> ?D.1930_5 = *D.1934_4;
> ?goto <bb 5>;
> ?# SUCC: 5 [100.0%] ?(fallthru,exec)
>
> ?# BLOCK 4 freq:6100
> ?# PRED: 2 [61.0%] ?(false,exec)
> ?D.1930_6 = MEM[(char *)p_3(D)];
> ?# SUCC: 5 [100.0%] ?(fallthru,exec)
>
> ?# BLOCK 5 freq:10000
> ?# PRED: 3 [100.0%] ?(fallthru,exec) 4 [100.0%] ?(fallthru,exec)
> ?# D.1930_1 = PHI <D.1930_5(3), D.1930_6(4)>
> ?return D.1930_1;
> ?# SUCC: EXIT [100.0%]
>
> }
>
> This produces the following RTL:
>
> ;; Generating RTL for gimple basic block 3
>
> ;; D.1930_5 = *D.1934_4;
>
> (insn 10 9 11 (set (reg/f:PHI 47)
> ? ? ? ?(const_int 0 [0])) pgm.c:97 -1
> ? ? (nil))
>
> (insn 11 10 0 (set (reg:QI 42 [ D.1930 ])
> ? ? ? ?(mem:QI (reg/f:PHI 47) [0 *D.1934_4+0 S1 A8 AS1])) pgm.c:97 -1
> ? ? (nil))
>
> ;; Generating RTL for gimple basic block 4
>
> So as of internals doc, named address spaces are not intended to
> implement this kind of memory?

If they are not subsets of each other how'd you convert a pointer
pointing into one to point into the other address-space?  I think
the frontend should diagnose this as invalid.

Richard.

> Georg
>


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