This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
named address spaces: addr_space_convert never called
- From: Georg Lay <avr at gjlay dot de>
- To: gcc at gcc dot gnu dot org
- Date: Mon, 08 Nov 2010 15:39:22 +0100
- Subject: named address spaces: addr_space_convert never called
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