On Mon, Nov 8, 2010 at 3:39 PM, Georg Lay <a...@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 >