named address spaces: addr_space_convert never called
Richard Guenther
richard.guenther@gmail.com
Mon Nov 8 17:42:00 GMT 2010
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
>
More information about the Gcc
mailing list