This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]