This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH]: Update libgcc for -mlong-calls support (HC12)
- From: Stephane Carrez <stcarrez at nerim dot fr>
- To: gcc-patches at gcc dot gnu dot org
- Date: Wed, 14 Aug 2002 11:34:45 +0200
- Subject: [PATCH]: Update libgcc for -mlong-calls support (HC12)
Hi!
I've committed this patch on mainline to update the HC11/HC12 libgcc part and
startup file to use 'call/rtc' when the library is compiled with -mlong-calls.
A .mode is also inserted to specify the ELF abi flags (16/32-bit int).
Stephane
2002-08-14 Stephane Carrez <stcarrez@nerim.fr>
* config/m68hc11/t-m68hc11-gas (LIB1ASMFUNCS): Build __far_trampoline.
(MULTILIB_OPTIONS): Must also generate for -mlong-calls.
* config/m68hc11/larith.asm: Put a mode for ELF ABI flags.
(ret, declare, farsym): New gas macros.
(__premain, exit, abort, _cleanup, memcpy, memset, ___adddi3,
___subdi3, ___notdi2, __mulhi32, __mulsi3): Use them to use 'rtc'
and declare the symbol far when compiled with -mlong-calls.
(__far_trampoline): New for 68HC12 trampoline code to invoke a
far handler using jsr/bsr.
* config/m68hc11/m68hc11-crt0.S: Put a mode for ELF ABI flags.
(jsr): New macro to transform a 'jsr' into a 'call'.
Index: config/m68hc11/larith.asm
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/m68hc11/larith.asm,v
retrieving revision 1.9
diff -u -p -r1.9 larith.asm
--- config/m68hc11/larith.asm 9 Apr 2002 18:53:50 -0000 1.9
+++ config/m68hc11/larith.asm 14 Aug 2002 07:31:14 -0000
@@ -35,23 +35,63 @@ Boston, MA 02111-1307, USA. */
.file "larith.asm"
+#ifdef __HAVE_SHORT_INT__
+ .mode mshort
+#else
+ .mode mlong
+#endif
+
+#if defined(__USE_RTC__) && defined(mc68hc12)
+# define ARG(N) N+1
+
+ .macro ret
+ rtc
+ .endm
+
+ .macro declare name
+ .globl \name
+ .type \name,@function
+ .size \name,.Lend-\name
+ .far \name
+\name:
+ .endm
+
+ .macro farsym name
+ .far NAME
+ .endm
+
+#else
+# define ARG(N) N
+
+ .macro ret
+ rts
+ .endm
+
+ .macro farsym name
+ .endm
+
+ .macro declare name
+ .globl \name
+ .type \name,@function
+ .size \name,.Lend-\name
+\name:
+ .endm
+
+#endif
+
.sect .text
#define REG(NAME) \
-NAME: .word 0; \
+NAME: .dc.w 1; \
.type NAME,@object ; \
.size NAME,2
#ifdef L_regs_min
/* Pseudo hard registers used by gcc.
- They must be located in page0.
- They will normally appear at the end of .page0 section. */
-#ifdef mc68hc12
- .sect .bss
-#else
- .sect .page0
-#endif
+ They should be located in page0. */
+
+ .sect .softregs
.globl _.tmp
.globl _.z,_.xy
REG(_.tmp)
@@ -61,54 +101,34 @@ REG(_.xy)
#endif
#ifdef L_regs_frame
-#ifdef mc68hc12
- .sect .bss
-#else
- .sect .page0
-#endif
+ .sect .softregs
.globl _.frame
REG(_.frame)
#endif
#ifdef L_regs_d1_2
-#ifdef mc68hc12
- .sect .bss
-#else
- .sect .page0
-#endif
+ .sect .softregs
.globl _.d1,_.d2
REG(_.d1)
REG(_.d2)
#endif
#ifdef L_regs_d3_4
-#ifdef mc68hc12
- .sect .bss
-#else
- .sect .page0
-#endif
+ .sect .softregs
.globl _.d3,_.d4
REG(_.d3)
REG(_.d4)
#endif
#ifdef L_regs_d5_6
-#ifdef mc68hc12
- .sect .bss
-#else
- .sect .page0
-#endif
+ .sect .softregs
.globl _.d5,_.d6
REG(_.d5)
REG(_.d6)
#endif
#ifdef L_regs_d7_8
-#ifdef mc68hc12
- .sect .bss
-#else
- .sect .page0
-#endif
+ .sect .softregs
.globl _.d7,_.d8
REG(_.d7)
REG(_.d8)
@@ -116,9 +136,8 @@ REG(_.d8)
#ifdef L_regs_d9_16
/* Pseudo hard registers used by gcc.
- They must be located in page0.
- They will normally appear at the end of .page0 section. */
- .sect .page0
+ They should be located in page0. */
+ .sect .softregs
.globl _.d9,_.d10,_.d11,_.d12,_.d13,_.d14
.globl _.d15,_.d16
REG(_.d9)
@@ -134,13 +153,8 @@ REG(_.d16)
#ifdef L_regs_d17_32
/* Pseudo hard registers used by gcc.
- They must be located in page0.
- They will normally appear at the end of .page0 section. */
-#ifdef mc68hc12
- .sect .bss
-#else
- .sect .page0
-#endif
+ They should be located in page0. */
+ .sect .softregs
.globl _.d17,_.d18,_.d19,_.d20,_.d21,_.d22
.globl _.d23,_.d24,_.d25,_.d26,_.d27,_.d28
.globl _.d29,_.d30,_.d31,_.d32
@@ -167,12 +181,10 @@ REG(_.d32)
;; Specific initialization for 68hc11 before the main.
;; Nothing special for a generic routine; Just enable interrupts.
;;
- .sect .text
- .globl __premain
-__premain:
+ declare __premain
clra
tap ; Clear both I and X.
- rts
+ ret
#endif
#ifdef L__exit
@@ -195,6 +207,8 @@ __premain:
.globl _exit
.globl exit
.weak exit
+ farsym exit
+ farsym _exit
exit:
_exit:
@@ -209,9 +223,8 @@ fatal:
;;
;; Abort operation. This is defined for the GCC testsuite.
;;
- .sect .text
- .globl abort
-abort:
+ declare abort
+
ldd #255 ;
#ifdef mc68hc12
trap #0x30
@@ -226,20 +239,19 @@ abort:
;;
;; Cleanup operation used by exit().
;;
- .sect .text
- .globl _cleanup
-_cleanup:
- rts
+ declare _cleanup
+
+ ret
#endif
;-----------------------------------------
; required gcclib code
;-----------------------------------------
#ifdef L_memcpy
- .sect .text
+ declare memcpy
+ declare __memcpy
+
.weak memcpy
- .globl memcpy
- .globl __memcpy
;;;
;;; void* memcpy(void*, const void*, size_t)
;;;
@@ -247,11 +259,9 @@ _cleanup:
;;; 2,sp = src Pmode
;;; 4,sp = size HImode (size_t)
;;;
-__memcpy:
-memcpy:
#ifdef mc68hc12
- ldx 2,sp
- ldy 4,sp
+ ldx ARG(2),sp
+ ldy ARG(4),sp
pshd
xgdy
lsrd
@@ -264,7 +274,7 @@ Loop:
dbne d,Loop
Done:
puld
- rts
+ ret
#else
xgdy
tsx
@@ -294,9 +304,8 @@ End:
#endif
#ifdef L_memset
- .sect .text
- .globl memset
- .globl __memset
+ declare memset
+ declare __memset
;;;
;;; void* memset(void*, int value, size_t)
;;;
@@ -304,17 +313,15 @@ End:
;;; D = dst Pmode
;;; 2,sp = src SImode
;;; 6,sp = size HImode (size_t)
- val = 5
- size = 6
+ val = ARG(5)
+ size = ARG(6)
#else
;;; D = dst Pmode
;;; 2,sp = src SImode
;;; 6,sp = size HImode (size_t)
- val = 3
- size = 4
+ val = ARG(3)
+ size = ARG(4)
#endif
-__memset:
-memset:
#ifdef mc68hc12
xgdx
ldab val,sp
@@ -326,7 +333,7 @@ Loop:
dbne y,Loop
End:
puld
- rts
+ ret
#else
xgdx
tsy
@@ -345,95 +352,89 @@ End:
rts
#endif
#endif
-
+
#ifdef L_adddi3
- .sect .text
- .globl ___adddi3
+ declare ___adddi3
-___adddi3:
tsx
xgdy
- ldd 8,x ; Add LSB
- addd 16,x
- std 6,y ; Save (carry preserved)
-
- ldd 6,x
- adcb 15,x
- adca 14,x
- std 4,y
-
- ldd 4,x
- adcb 13,x
- adca 12,x
- std 2,y
+ ldd ARG(8),x ; Add LSB
+ addd ARG(16),x
+ std ARG(6),y ; Save (carry preserved)
+
+ ldd ARG(6),x
+ adcb ARG(15),x
+ adca ARG(14),x
+ std ARG(4),y
+
+ ldd ARG(4),x
+ adcb ARG(13),x
+ adca ARG(12),x
+ std ARG(2),y
- ldd 2,x
- adcb 11,x ; Add MSB
- adca 10,x
- std 0,y
+ ldd ARG(2),x
+ adcb ARG(11),x ; Add MSB
+ adca ARG(10),x
+ std ARG(0),y
xgdy
- rts
+ ret
#endif
#ifdef L_subdi3
- .sect .text
- .globl ___subdi3
+ declare ___subdi3
-___subdi3:
tsx
xgdy
- ldd 8,x ; Subtract LSB
- subd 16,x
- std 6,y ; Save, borrow preserved
-
- ldd 6,x
- sbcb 15,x
- sbca 14,x
- std 4,y
-
- ldd 4,x
- sbcb 13,x
- sbca 12,x
- std 2,y
+ ldd ARG(8),x ; Subtract LSB
+ subd ARG(16),x
+ std ARG(6),y ; Save, borrow preserved
+
+ ldd ARG(6),x
+ sbcb ARG(15),x
+ sbca ARG(14),x
+ std ARG(4),y
+
+ ldd ARG(4),x
+ sbcb ARG(13),x
+ sbca ARG(12),x
+ std ARG(2),y
- ldd 2,x ; Subtract MSB
- sbcb 11,x
- sbca 10,x
- std 0,y
+ ldd ARG(2),x ; Subtract MSB
+ sbcb ARG(11),x
+ sbca ARG(10),x
+ std ARG(0),y
xgdy ;
- rts
+ ret
#endif
#ifdef L_notdi2
- .sect .text
- .globl ___notdi2
+ declare ___notdi2
-___notdi2:
tsy
xgdx
- ldd 8,y
+ ldd ARG(8),y
coma
comb
- std 6,x
+ std ARG(6),x
- ldd 6,y
+ ldd ARG(6),y
coma
comb
- std 4,x
+ std ARG(4),x
- ldd 4,y
+ ldd ARG(4),y
coma
comb
- std 2,x
+ std ARG(2),x
- ldd 2,y
+ ldd ARG(2),y
coma
comb
- std 0,x
+ std ARG(0),x
xgdx
- rts
+ ret
#endif
#ifdef L_negsi2
@@ -845,8 +846,6 @@ ___mulhi3:
#endif
#ifdef L_mulhi32
- .sect .text
- .globl __mulhi32
;
;
@@ -880,12 +879,13 @@ ___mulhi3:
; <A-low> 1,x
; <A-high> 0,x
;
-__mulhi32:
+ declare __mulhi32
+
#ifdef mc68hc12
- ldy 2,sp
+ ldy ARG(2),sp
emul
exg x,y
- rts
+ ret
#else
pshx ; Room for temp value
pshb
@@ -925,8 +925,6 @@ Ret:
#endif
#ifdef L_mulsi3
- .sect .text
- .globl __mulsi3
;
; <B-low> 8,y
@@ -945,22 +943,23 @@ Ret:
;
;
-__mulsi3:
+ declare __mulsi3
+
#ifdef mc68hc12
pshd ; Save A.low
- ldy 4,sp
+ ldy ARG(4),sp
emul ; A.low * B.high
- ldy 6,sp
+ ldy ARG(6),sp
exg x,d
emul ; A.high * B.low
leax d,x
- ldy 6,sp
+ ldy ARG(6),sp
puld
emul ; A.low * B.low
exg d,y
leax d,x
exg d,y
- rts
+ ret
#else
B_low = 8
B_high = 6
@@ -1186,6 +1185,39 @@ dtors_done:
#endif
+#ifdef L_far_tramp
+#ifdef mc68hc12
+ .sect .text
+ .globl __far_trampoline
+
+;; This is a trampoline used by the linker to invoke a function
+;; using rtc to return and being called with jsr/bsr.
+;; The trampoline generated is:
+;;
+;; foo_tramp:
+;; ldy #foo
+;; call __far_trampoline,page(foo)
+;;
+;; The linker transforms:
+;;
+;; jsr foo
+;;
+;; into
+;; jsr foo_tramp
+;;
+;; The linker generated trampoline and _far_trampoline must be in
+;; non-banked memory.
+;;
+__far_trampoline:
+ movb 0,sp, 2,sp ; Copy page register below the caller's return
+ leas 2,sp ; address.
+ jmp 0,y ; We have a 'call/rtc' stack layout now
+ ; and can jump to the far handler
+ ; (whose memory bank is mapped due to the
+ ; call to the trampoline).
+#endif
+#endif
+.Lend:
;-----------------------------------------
; end required gcclib code
;-----------------------------------------
Index: config/m68hc11/m68hc11-crt0.S
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/m68hc11/m68hc11-crt0.S,v
retrieving revision 1.1
diff -u -p -r1.1 m68hc11-crt0.S
--- config/m68hc11/m68hc11-crt0.S 8 Sep 2000 20:54:44 -0000 1.1
+++ config/m68hc11/m68hc11-crt0.S 14 Aug 2002 07:31:14 -0000
@@ -1,5 +1,5 @@
/* Startup code for M68HC11.
- Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc.
This file is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
@@ -36,6 +36,17 @@ Boston, MA 02111-1307, USA. */
;-----------------------------------------
.file "crt0.s"
+#ifdef __HAVE_SHORT_INT__
+ .mode mshort
+#else
+ .mode mlong
+#endif
+
+#if defined(__USE_RTC__) && defined(mc68hc12)
+ .macro jsr name
+ call \name
+ .endm
+#endif
;;
;;
;; The linker concatenate the .install* sections in the following order:
Index: config/m68hc11/t-m68hc11-gas
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/m68hc11/t-m68hc11-gas,v
retrieving revision 1.5
diff -u -p -r1.5 t-m68hc11-gas
--- config/m68hc11/t-m68hc11-gas 3 Aug 2001 21:01:06 -0000 1.5
+++ config/m68hc11/t-m68hc11-gas 14 Aug 2002 07:31:14 -0000
@@ -25,7 +25,7 @@ LIB1ASMFUNCS = _mulsi3 \
_premain __exit _abort _cleanup \
_adddi3 _subdi3 _notdi2 \
_ashrhi3 _lshrhi3 _lshlhi3 _ashrqi3 _lshlqi3 _map_data _init_bss \
- _ctor _dtor
+ _ctor _dtor __far_trampoline
TARGET_LIBGCC2_CFLAGS = -DUSE_GAS -DIN_GCC
@@ -37,10 +37,10 @@ LIB2FUNCS_EXTRA = $(srcdir)/config/udivm
LIBGCC2_DEBUG_CFLAGS =
LIBGCC2_CFLAGS = -Os $(LIBGCC2_INCLUDES) $(TARGET_LIBGCC2_CFLAGS) $(LIBGCC2_DEBUG_CFLAGS) $(GTHREAD_FLAGS) -DIN_LIBGCC2
-MULTILIB_OPTIONS = m68hc11/m68hc12 mshort fshort-double
+MULTILIB_OPTIONS = m68hc11/m68hc12 mshort fshort-double mlong-calls
MULTILIB_DIRNAMES =
MULTILIB_MATCHES = m68hc11=m6811 m68hc12=m6812
-MULTILIB_EXCEPTIONS = -mnoshort -mno68hc11
+MULTILIB_EXCEPTIONS = -mnoshort -mno68hc11 -mnolong-calls
LIBGCC = stmp-multilib
INSTALL_LIBGCC = install-multilib