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? Georg