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
>

Reply via email to