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?