Backend Stack-/Framepointer

Frank Riese hippo@informatik.uni-bremen.de
Sun Jan 15 11:23:00 GMT 2006


Hi,

I'm writing a backend for gcc (gcc 4.0.2) for a target machine that neither 
has its stack pointer accessible through any register visible to GCC nor does 
it have a seperate frame pointer. The only instructions to access the stack I 
have on that machine are PUSH and POP. 

I have thought about using one of the general purpose registers to substitute 
for the stackpointer as the machine has a simple load/store architecture 
where I can LOAD and STORE a word at an address specified in a register and 
thus do my own POP and PUSH through LOAD and STORE. However, this seemed a 
blind alley because the only way to return from a function on that machine is 
through a RET instruction that takes the instruction pointer to return to 
from that internal stack.

My Problem is that GCC keeps generating code like this (obtained from gcc -dP) 
where it tries to access the stack pointer like a hardware register and 
expects a frame pointer:

example function:

int foo (short i) {
        i = 100;
        return i+50;
}

(insn 3 6 4 (set (reg/f:HI 3 R[3] [15])
        (reg/f:HI 6 BP)) 22 {movhi} (nil) <-- frame pointer access
    (nil))
(insn 9 4 29 (set (mem/i:HI (reg/f:HI 3 R[3] [15]) [0 i+0 S2 A16])
        (const_int 100 [0x64])) 5 {*zykluno.md:37} (nil)
    (nil))
(insn 29 9 11 (set (reg:HI 3 R[3] [orig:13 D.1079 ] [13])
        (mem/i:HI (reg/f:HI 3 R[3] [15]) [0 i+0 S2 A16])) 22 {movhi} (nil)
    (nil))
(insn 11 29 12 (set (reg:HI 3 R[3] [orig:13 D.1079 ] [13])
        (plus:HI (reg:HI 3 R[3] [orig:13 D.1079 ] [13])
            (const_int 50 [0x32]))) 27 {addhi3} (nil)
    (nil))
(insn/f 31 30 32 (set (reg/f:HI 7 SP)
        (reg/f:HI 6 BP)) 22 {movhi} (nil)
    (nil))
(jump_insn 32 31 33 (return) 7 {return} (nil)
    (nil))

If compiled with -fomit-frame-pointer:

(insn 29 6 3 (set (reg/f:HI 3 R[3] [15])
        (reg/f:HI 7 SP)) 22 {movhi} (nil) <-- stack pointer access
    (nil))
(insn 3 29 4 (set (reg/f:HI 3 R[3] [15])
        (plus:HI (reg/f:HI 3 R[3] [15])
            (const_int 13 [0xd]))) 27 {addhi3} (nil)
    (nil))
(insn 9 4 30 (set (mem/i:HI (reg/f:HI 3 R[3] [15]) [0 i+0 S2 A16])
        (const_int 100 [0x64])) 5 {*zykluno.md:37} (nil)
    (nil))
(insn 30 9 11 (set (reg:HI 3 R[3] [orig:13 D.1079 ] [13])
        (mem/i:HI (reg/f:HI 3 R[3] [15]) [0 i+0 S2 A16])) 22 {movhi} (nil)
    (nil))
(insn 11 30 12 (set (reg:HI 3 R[3] [orig:13 D.1079 ] [13])
        (plus:HI (reg:HI 3 R[3] [orig:13 D.1079 ] [13])
            (const_int 50 [0x32]))) 27 {addhi3} (nil)
    (nil))
(jump_insn 32 31 33 (return) 7 {return} (nil)
    (nil))

I've tried to eliminate the frame pointer wherever possible by defining the 
following in <machine.h>:

#define ELIMINABLE_REGS \
        {{ARG_POINTER_REGNUM,   STACK_POINTER_REGNUM},                  \
         {ARG_POINTER_REGNUM,   FRAME_POINTER_REGNUM},                  \
         {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}}

#define CAN_ELIMINATE(FROM, TO) 1

This did not seem to have helped as I still get the unwanted access to the 
frame pointer as in the first code above. 

Could I be missing instructions in <machine>.md? I have defined the following 
instructions but GCC only seems to use PSH:

(define_insn "pushhi1"
  [(match_operand:HI 0 "register_operand" "")]
  ""
  "PSH %0"
)
(define_insn "pushsi1"
  [(match_operand:SI 0 "general_operand" "")]
  ""
  "PSH %0"
)
(define_insn "pophi1"
  [(match_operand:HI 0 "general_operand" "")]
  ""
  "POP %0"
)
(define_insn "popsi1"
  [(match_operand:SI 0 "register_operand" "")]
  ""
  "POP %0"
)

I have read most of the documentation about backends under 
http://gcc.gnu.org/onlinedocs/gccint/ and had a look at other backend.  
However, I haven't been able to come up with any solution yet on how to write 
a backend for such a machine.  

I would be eternally grateful if someone could provide me with pointers to 
resources where I can find out more, to what I've overlooked or has a 
solution.

I hope I have posted everything of relevance to my problem. If you need 
anything else, please don't hesitate to ask.

Thanks,
Frank
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <https://gcc.gnu.org/pipermail/gcc-help/attachments/20060115/b384a2a6/attachment.sig>


More information about the Gcc-help mailing list