This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
PATCH: Add .type pseudo-op to 68K soft-float routines
- From: Mark Mitchell <mark at codesourcery dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: law at redhat dot com, schwab at suse dot de
- Date: Sun, 29 Jul 2007 13:36:34 -0700
- Subject: PATCH: Add .type pseudo-op to 68K soft-float routines
- Reply-to: mark at codesourcery dot com
When building for soft-float GNU/Linux, we use the software
floating-point emulation routines in lb1sf68.asm. The symbols for
these routines had ELF symbol type STT_NOTYPE because the .asm file
did not include any explicit .type pseudo-ops. The linker complains
about that when linking with a shared libgcc.
This patch adds .type directives to the various entry points defined
in the file. Because there are non-ELF 68K ports, we can't do this
unconditionally. So, I used a preprocessor test on __ELF__ (as is
also done in the ARM port) to decide whether or not to issue the .type
directive.
I wasn't able to fully test this patch because I don't have soft-float
68K hardware. However, I did test that small programs that didn't
link without the patch do link afterwards. I also verified that there
are no longer any exported STT_NOTYPE symbols in libgcc_s.so.
If there are no objections from the 68K maintainers, I will commit
this in 48 hours.
--
Mark Mitchell
CodeSourcery
mark@codesourcery.com
(650) 331-3385 x713
2007-07-29 Mark Mitchell <mark@codesourcery.com>
gcc/
* config/m68k/lb1sf68.asm (FUNC): New macro.
(__mulsi3): Use it.
(__udivsi3): Likewise.
(__divsi3): Likewise.
(__umodsi3): Likewise.
(__modsi3): Likewise.
(__subdf3): Likewise.
(__adddf3): Likewise.
(__muldf3): Likewise.
(__divdf3): Likewise.
(__negdf2): Likewise.
(__cmpdf2): Likewise.
(__subsf3): Likewise.
(__addsf3): Likewise.
(__mulsf3): Likewise.
(__divsf3): Likewise.
(__negsf2): Likewise.
(__cmpsf2): Likewise.
(__eqdf2): Likewise.
(__nedf2): Likewise.
(__gtdf2): Likewise.
(__gedf2): Likewise.
(__ltdf2): Likewise.
(__ledf2): Likewise.
(__eqsf2): Likewise.
(__nesf2): Likewise.
(__gtsf2): Likewise.
(__gesf2): Likewise.
(__ltsf2): Likewise.
(__lesf2): Likewise.
# gcc diff
pushd /home/mitchell/scratch/cf-elf/src/gcc-4.2
svn diff
Index: gcc/config/m68k/lb1sf68.asm
===================================================================
--- gcc/config/m68k/lb1sf68.asm (revision 177048)
+++ gcc/config/m68k/lb1sf68.asm (working copy)
@@ -61,6 +61,17 @@ Boston, MA 02110-1301, USA. */
#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+/* Note that X is a function. */
+
+#ifdef __ELF__
+#define FUNC(x) .type SYM(x),function
+#else
+/* The .proc pseudo-op is accepted, but ignored, by GAS. We could just define this to the empty string for non-ELF systems, but defining it
+ to .proc means that the information is available to the assembler if
+ the need arises. */
+#define FUNC(x) .proc
+#endif
+
/* Use the right prefix for registers. */
#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
@@ -377,7 +388,7 @@ $_exception_handler:
#ifdef L_mulsi3
.text
- .proc
+ FUNC(__mulsi3)
.globl SYM (__mulsi3)
SYM (__mulsi3):
movew sp@(4), d0 /* x0 -> d0 */
@@ -400,7 +411,7 @@ SYM (__mulsi3):
#ifdef L_udivsi3
.text
- .proc
+ FUNC(__udivsi3)
.globl SYM (__udivsi3)
SYM (__udivsi3):
#ifndef __mcoldfire__
@@ -476,7 +487,7 @@ L2: subql IMM (1),d4
#ifdef L_divsi3
.text
- .proc
+ FUNC(__divsi3)
.globl SYM (__divsi3)
SYM (__divsi3):
movel d2, sp@-
@@ -514,7 +525,7 @@ L3: movel sp@+, d2
#ifdef L_umodsi3
.text
- .proc
+ FUNC(__umodsi3)
.globl SYM (__umodsi3)
SYM (__umodsi3):
movel sp@(8), d1 /* d1 = divisor */
@@ -540,7 +551,7 @@ SYM (__umodsi3):
#ifdef L_modsi3
.text
- .proc
+ FUNC(__modsi3)
.globl SYM (__modsi3)
SYM (__modsi3):
movel sp@(8), d1 /* d1 = divisor */
@@ -683,6 +694,7 @@ Ld$div$0:
|=============================================================================
| double __subdf3(double, double);
+ FUNC(__subdf3)
SYM (__subdf3):
bchg IMM (31),sp@(12) | change sign of second operand
| and fall through, so we always add
@@ -691,6 +703,7 @@ SYM (__subdf3):
|=============================================================================
| double __adddf3(double, double);
+ FUNC(__adddf3)
SYM (__adddf3):
#ifndef __mcoldfire__
link a6,IMM (0) | everything will be done in registers
@@ -1414,6 +1427,7 @@ Ladddf$nf:
|=============================================================================
| double __muldf3(double, double);
+ FUNC(__muldf3)
SYM (__muldf3):
#ifndef __mcoldfire__
link a6,IMM (0)
@@ -1746,6 +1760,7 @@ Lmuldf$b$den:
|=============================================================================
| double __divdf3(double, double);
+ FUNC(__divdf3)
SYM (__divdf3):
#ifndef __mcoldfire__
link a6,IMM (0)
@@ -2187,6 +2202,7 @@ Lround$0:
|=============================================================================
| double __negdf2(double, double);
+ FUNC(__negdf2)
SYM (__negdf2):
#ifndef __mcoldfire__
link a6,IMM (0)
@@ -2359,6 +2375,7 @@ Lcmpd$inop:
PICJUMP $_exception_handler
| int __cmpdf2(double, double);
+ FUNC(__cmpdf2)
SYM (__cmpdf2):
link a6,IMM (0)
pea 1
@@ -2587,6 +2604,7 @@ Lf$div$0:
|=============================================================================
| float __subsf3(float, float);
+ FUNC(__subsf3)
SYM (__subsf3):
bchg IMM (31),sp@(8) | change sign of second operand
| and fall through
@@ -2595,6 +2613,7 @@ SYM (__subsf3):
|=============================================================================
| float __addsf3(float, float);
+ FUNC(__addsf3)
SYM (__addsf3):
#ifndef __mcoldfire__
link a6,IMM (0) | everything will be done in registers
@@ -3081,6 +3100,7 @@ Laddsf$nf:
|=============================================================================
| float __mulsf3(float, float);
+ FUNC(__mulsf3)
SYM (__mulsf3):
#ifndef __mcoldfire__
link a6,IMM (0)
@@ -3295,6 +3315,7 @@ Lmulsf$b$den:
|=============================================================================
| float __divsf3(float, float);
+ FUNC(__divsf3)
SYM (__divsf3):
#ifndef __mcoldfire__
link a6,IMM (0)
@@ -3620,6 +3641,7 @@ Lround$0:
| and +/-INFINITY.
| float __negsf2(float);
+ FUNC(__negsf2)
SYM (__negsf2):
#ifndef __mcoldfire__
link a6,IMM (0)
@@ -3761,6 +3783,7 @@ Lcmpf$inop:
PICJUMP $_exception_handler
| int __cmpsf2(float, float);
+ FUNC(__cmpsf2)
SYM (__cmpsf2):
link a6,IMM (0)
pea 1
@@ -3859,7 +3882,7 @@ Lround$to$minus:
#ifdef L_eqdf2
.text
- .proc
+ FUNC(__eqdf2)
.globl SYM (__eqdf2)
SYM (__eqdf2):
link a6,IMM (0)
@@ -3875,7 +3898,7 @@ SYM (__eqdf2):
#ifdef L_nedf2
.text
- .proc
+ FUNC(__nedf2)
.globl SYM (__nedf2)
SYM (__nedf2):
link a6,IMM (0)
@@ -3891,7 +3914,7 @@ SYM (__nedf2):
#ifdef L_gtdf2
.text
- .proc
+ FUNC(__gtdf2)
.globl SYM (__gtdf2)
SYM (__gtdf2):
link a6,IMM (0)
@@ -3907,7 +3930,7 @@ SYM (__gtdf2):
#ifdef L_gedf2
.text
- .proc
+ FUNC(__gedf2)
.globl SYM (__gedf2)
SYM (__gedf2):
link a6,IMM (0)
@@ -3923,7 +3946,7 @@ SYM (__gedf2):
#ifdef L_ltdf2
.text
- .proc
+ FUNC(__ltdf2)
.globl SYM (__ltdf2)
SYM (__ltdf2):
link a6,IMM (0)
@@ -3939,7 +3962,7 @@ SYM (__ltdf2):
#ifdef L_ledf2
.text
- .proc
+ FUNC(__ledf2)
.globl SYM (__ledf2)
SYM (__ledf2):
link a6,IMM (0)
@@ -3958,7 +3981,7 @@ SYM (__ledf2):
#ifdef L_eqsf2
.text
- .proc
+ FUNC(__eqsf2)
.globl SYM (__eqsf2)
SYM (__eqsf2):
link a6,IMM (0)
@@ -3972,7 +3995,7 @@ SYM (__eqsf2):
#ifdef L_nesf2
.text
- .proc
+ FUNC(__nesf2)
.globl SYM (__nesf2)
SYM (__nesf2):
link a6,IMM (0)
@@ -3986,7 +4009,7 @@ SYM (__nesf2):
#ifdef L_gtsf2
.text
- .proc
+ FUNC(__gtsf2)
.globl SYM (__gtsf2)
SYM (__gtsf2):
link a6,IMM (0)
@@ -4000,7 +4023,7 @@ SYM (__gtsf2):
#ifdef L_gesf2
.text
- .proc
+ FUNC(__gesf2)
.globl SYM (__gesf2)
SYM (__gesf2):
link a6,IMM (0)
@@ -4014,7 +4037,7 @@ SYM (__gesf2):
#ifdef L_ltsf2
.text
- .proc
+ FUNC(__ltsf2)
.globl SYM (__ltsf2)
SYM (__ltsf2):
link a6,IMM (0)
@@ -4028,7 +4051,7 @@ SYM (__ltsf2):
#ifdef L_lesf2
.text
- .proc
+ FUNC(__lesf2)
.globl SYM (__lesf2)
SYM (__lesf2):
link a6,IMM (0)
popd