From 75197b37816fefb9190984a16d994d97a6425529 Mon Sep 17 00:00:00 2001 From: Bernd Schmidt Date: Fri, 22 May 1998 00:01:23 +0000 Subject: [PATCH] final.c (JUMP_TABLES_IN_TEXT_SECTION): Provide a default value. * final.c (JUMP_TABLES_IN_TEXT_SECTION): Provide a default value. (shorten_branches, final_scan_insn): Test value of JUMP_TABLES_IN_TEXT_SECTION instead of just testing whether it is defined. * tm.texi (JUMP_TABLES_IN_TEXT_SECTION): Corresponding changes. * arm/coff.h: Define JUMP_TABLES_IN_TEXT_SECTION to 1. coff.h: Likewise. * i386/386bsd.h: Likewise. * i386/freebsd-elf.h: Likewise. * i386/freebsd.h: Likewise. * i386/netbsd.h: Likewise. * i386/ptx4-i.h: Likewise. * i386/sysv4.h: Likewise. * pa/pa.h: Likewise. * rs6000/linux.h: Likewise. * rs6000/rs6000.h: Likewise. * sh/sh.h: Likewise. * sparc/sp64-elf.h: Likewise. * v850/v850.h: Likewise. * rs6000/sysv4.h: Define JUMP_TABLES_IN_TEXT_SECTION to 0. * i386/linux.h: Define JUMP_TABLES_IN_TEXT_SECTION to (flag_pic). From-SVN: r19940 --- gcc/ChangeLog | 24 ++++++++++++ gcc/config/arm/coff.h | 4 +- gcc/config/arm/tcoff.h | 2 +- gcc/config/i386/386bsd.h | 2 +- gcc/config/i386/freebsd-elf.h | 2 +- gcc/config/i386/freebsd.h | 2 +- gcc/config/i386/linux.h | 2 +- gcc/config/i386/netbsd.h | 2 +- gcc/config/i386/ptx4-i.h | 2 +- gcc/config/i386/sysv4.h | 2 +- gcc/config/pa/pa.h | 2 +- gcc/config/rs6000/linux.h | 2 +- gcc/config/rs6000/rs6000.h | 2 +- gcc/config/rs6000/sysv4.h | 1 + gcc/config/sh/sh.h | 2 +- gcc/config/sparc/sp64-elf.h | 2 +- gcc/config/v850/v850.h | 2 +- gcc/final.c | 88 ++++++++++++++++++++++++++----------------- gcc/tm.texi | 7 ++-- 19 files changed, 99 insertions(+), 53 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8e88702..a4c7929 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,27 @@ +Fri May 22 00:57:00 1998 Bernd Schmidt (crux@pool.informatik.rwth-aachen.de> + + * final.c (JUMP_TABLES_IN_TEXT_SECTION): Provide a default value. + (shorten_branches, final_scan_insn): Test value of + JUMP_TABLES_IN_TEXT_SECTION instead of just testing whether it + is defined. + * tm.texi (JUMP_TABLES_IN_TEXT_SECTION): Corresponding changes. + * arm/coff.h: Define JUMP_TABLES_IN_TEXT_SECTION to 1. + coff.h: Likewise. + * i386/386bsd.h: Likewise. + * i386/freebsd-elf.h: Likewise. + * i386/freebsd.h: Likewise. + * i386/netbsd.h: Likewise. + * i386/ptx4-i.h: Likewise. + * i386/sysv4.h: Likewise. + * pa/pa.h: Likewise. + * rs6000/linux.h: Likewise. + * rs6000/rs6000.h: Likewise. + * sh/sh.h: Likewise. + * sparc/sp64-elf.h: Likewise. + * v850/v850.h: Likewise. + * rs6000/sysv4.h: Define JUMP_TABLES_IN_TEXT_SECTION to 0. + * i386/linux.h: Define JUMP_TABLES_IN_TEXT_SECTION to (flag_pic). + Thu May 21 19:50:13 1998 J"orn Rennecke * regmove.c (gen_add3_insn): New function. diff --git a/gcc/config/arm/coff.h b/gcc/config/arm/coff.h index abba7c6..4e568cb 100644 --- a/gcc/config/arm/coff.h +++ b/gcc/config/arm/coff.h @@ -30,7 +30,7 @@ Boston, MA 02111-1307, USA. */ point the default. NOT --nfp! --with{enable?} is supposed to replace it (right?), so let's stop using it. */ #undef TARGET_DEFAULT -#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT /*+ TARGET_CPU_DEFAULT*/) +#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32) /* ??? Is a big-endian default intended to be supported? */ #if 0 /*TARGET_CPU_DEFAULT & ARM_FLAG_BIG_END*/ @@ -104,7 +104,7 @@ do { \ /* Define this macro if jump tables (for `tablejump' insns) should be output in the text section, along with the assembler instructions. Otherwise, the readonly data section is used. */ -#define JUMP_TABLES_IN_TEXT_SECTION +#define JUMP_TABLES_IN_TEXT_SECTION 1 #undef READONLY_DATA_SECTION #define READONLY_DATA_SECTION rdata_section diff --git a/gcc/config/arm/tcoff.h b/gcc/config/arm/tcoff.h index 5fabe5d..fe047e7 100644 --- a/gcc/config/arm/tcoff.h +++ b/gcc/config/arm/tcoff.h @@ -87,7 +87,7 @@ do { \ /* Define this macro if jump tables (for `tablejump' insns) should be output in the text section, along with the assembler instructions. Otherwise, the readonly data section is used. */ -#define JUMP_TABLES_IN_TEXT_SECTION +#define JUMP_TABLES_IN_TEXT_SECTION 1 #undef READONLY_DATA_SECTION #define READONLY_DATA_SECTION rdata_section diff --git a/gcc/config/i386/386bsd.h b/gcc/config/i386/386bsd.h index 2599437..7962321 100644 --- a/gcc/config/i386/386bsd.h +++ b/gcc/config/i386/386bsd.h @@ -69,7 +69,7 @@ /* Indicate that jump tables go in the text section. This is necessary when compiling PIC code. */ -#define JUMP_TABLES_IN_TEXT_SECTION +#define JUMP_TABLES_IN_TEXT_SECTION 1 /* Don't default to pcc-struct-return, because gcc is the only compiler, and we want to retain compatibility with older gcc versions. */ diff --git a/gcc/config/i386/freebsd-elf.h b/gcc/config/i386/freebsd-elf.h index 196a76a..6f99a88 100644 --- a/gcc/config/i386/freebsd-elf.h +++ b/gcc/config/i386/freebsd-elf.h @@ -38,7 +38,7 @@ Boston, MA 02111-1307, USA. */ /* Indicate that jump tables go in the text section. This is necessary when compiling PIC code. */ -#define JUMP_TABLES_IN_TEXT_SECTION +#define JUMP_TABLES_IN_TEXT_SECTION 1 /* Copy this from the svr4 specifications... */ /* Define the register numbers to be used in Dwarf debugging information. diff --git a/gcc/config/i386/freebsd.h b/gcc/config/i386/freebsd.h index d5deacd..40f703e 100644 --- a/gcc/config/i386/freebsd.h +++ b/gcc/config/i386/freebsd.h @@ -84,7 +84,7 @@ Boston, MA 02111-1307, USA. */ /* Indicate that jump tables go in the text section. This is necessary when compiling PIC code. */ -#define JUMP_TABLES_IN_TEXT_SECTION +#define JUMP_TABLES_IN_TEXT_SECTION 1 /* Don't default to pcc-struct-return, because gcc is the only compiler, and we want to retain compatibility with older gcc versions. */ diff --git a/gcc/config/i386/linux.h b/gcc/config/i386/linux.h index e178015..50341bd 100644 --- a/gcc/config/i386/linux.h +++ b/gcc/config/i386/linux.h @@ -49,7 +49,7 @@ Boston, MA 02111-1307, USA. */ /* Indicate that jump tables go in the text section. This is necessary when compiling PIC code. */ -#define JUMP_TABLES_IN_TEXT_SECTION +#define JUMP_TABLES_IN_TEXT_SECTION (flag_pic) /* Copy this from the svr4 specifications... */ /* Define the register numbers to be used in Dwarf debugging information. diff --git a/gcc/config/i386/netbsd.h b/gcc/config/i386/netbsd.h index c7aeddf..5978aec 100644 --- a/gcc/config/i386/netbsd.h +++ b/gcc/config/i386/netbsd.h @@ -50,7 +50,7 @@ /* Indicate that jump tables go in the text section. This is necessary when compiling PIC code. */ -#define JUMP_TABLES_IN_TEXT_SECTION +#define JUMP_TABLES_IN_TEXT_SECTION 1 /* Don't default to pcc-struct-return, because gcc is the only compiler, and we want to retain compatibility with older gcc versions. */ diff --git a/gcc/config/i386/ptx4-i.h b/gcc/config/i386/ptx4-i.h index 36836f6..1537b4a 100644 --- a/gcc/config/i386/ptx4-i.h +++ b/gcc/config/i386/ptx4-i.h @@ -244,4 +244,4 @@ do { long value[3]; \ /* Indicate that jump tables go in the text section. This is necessary when compiling PIC code. */ -#define JUMP_TABLES_IN_TEXT_SECTION +#define JUMP_TABLES_IN_TEXT_SECTION 1 diff --git a/gcc/config/i386/sysv4.h b/gcc/config/i386/sysv4.h index 3a72cdd..0127d69 100644 --- a/gcc/config/i386/sysv4.h +++ b/gcc/config/i386/sysv4.h @@ -242,7 +242,7 @@ do { long value[3]; \ /* Indicate that jump tables go in the text section. This is necessary when compiling PIC code. */ -#define JUMP_TABLES_IN_TEXT_SECTION +#define JUMP_TABLES_IN_TEXT_SECTION 1 /* A C statement (sans semicolon) to output to the stdio stream FILE the assembler definition of uninitialized global DECL named diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h index 6f9c9be..5e506a4 100644 --- a/gcc/config/pa/pa.h +++ b/gcc/config/pa/pa.h @@ -2321,7 +2321,7 @@ DTORS_SECTION_FUNCTION fprintf (FILE, "\tb L$%04d\n\tnop\n", VALUE) /* Jump tables are executable code and live in the TEXT section on the PA. */ -#define JUMP_TABLES_IN_TEXT_SECTION +#define JUMP_TABLES_IN_TEXT_SECTION 1 /* This is how to output an element of a case-vector that is relative. This must be defined correctly as it is used when generating PIC code. diff --git a/gcc/config/rs6000/linux.h b/gcc/config/rs6000/linux.h index 21d9bc8..1843fb8 100644 --- a/gcc/config/rs6000/linux.h +++ b/gcc/config/rs6000/linux.h @@ -69,4 +69,4 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #endif #undef JUMP_TABLES_IN_TEXT_SECTION -#define JUMP_TABLES_IN_TEXT_SECTION +#define JUMP_TABLES_IN_TEXT_SECTION 1 diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index 7ac3cf60..66756a0 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -2375,7 +2375,7 @@ extern int rs6000_trunc_used; /* Indicate that jump tables go in the text section. */ -#define JUMP_TABLES_IN_TEXT_SECTION +#define JUMP_TABLES_IN_TEXT_SECTION 1 /* Define the routines to implement these extra sections. */ diff --git a/gcc/config/rs6000/sysv4.h b/gcc/config/rs6000/sysv4.h index 9cbb597..1a7439a 100644 --- a/gcc/config/rs6000/sysv4.h +++ b/gcc/config/rs6000/sysv4.h @@ -331,6 +331,7 @@ do { \ /* Put jump tables in read-only memory, rather than in .text. */ #undef JUMP_TABLES_IN_TEXT_SECTION +#define JUMP_TABLES_IN_TEXT_SECTION 0 /* Disable AIX-ism that disables turning -B into -L if the argument specifies a relative file name. This breaks setting GCC_EXEC_PREFIX to D:\path under diff --git a/gcc/config/sh/sh.h b/gcc/config/sh/sh.h index dce9acb..5c347fc 100644 --- a/gcc/config/sh/sh.h +++ b/gcc/config/sh/sh.h @@ -1518,7 +1518,7 @@ dtors_section() \ /* Define this so that jump tables go in same section as the current function, which could be text or it could be a user defined section. */ -#define JUMP_TABLES_IN_TEXT_SECTION +#define JUMP_TABLES_IN_TEXT_SECTION 1 /* A C statement to output something to the assembler file to switch to section NAME for object DECL which is either a FUNCTION_DECL, a VAR_DECL or diff --git a/gcc/config/sparc/sp64-elf.h b/gcc/config/sparc/sp64-elf.h index a6f3e72..2482866 100644 --- a/gcc/config/sparc/sp64-elf.h +++ b/gcc/config/sparc/sp64-elf.h @@ -104,7 +104,7 @@ crtbegin.o%s \ tables from other label refs (when we need to). */ /* ??? Revisit this. */ #undef JUMP_TABLES_IN_TEXT_SECTION -#define JUMP_TABLES_IN_TEXT_SECTION +#define JUMP_TABLES_IN_TEXT_SECTION 1 /* System V Release 4 uses DWARF debugging info. GDB doesn't support 64 bit stabs yet and the desired debug format is DWARF diff --git a/gcc/config/v850/v850.h b/gcc/config/v850/v850.h index 0161379..2ccbe98 100644 --- a/gcc/config/v850/v850.h +++ b/gcc/config/v850/v850.h @@ -1326,7 +1326,7 @@ do { char dstr[30]; \ /* The switch instruction requires that the jump table immediately follow it. */ -#define JUMP_TABLES_IN_TEXT_SECTION +#define JUMP_TABLES_IN_TEXT_SECTION 1 /* svr4.h defines this assuming that 4 byte alignment is required. */ #undef ASM_OUTPUT_BEFORE_CASE_LABEL diff --git a/gcc/final.c b/gcc/final.c index f6f6670..d30e5b2 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -130,6 +130,10 @@ Boston, MA 02111-1307, USA. */ #define IS_ASM_LOGICAL_LINE_SEPARATOR(C) ((C) == ';') #endif +#ifndef JUMP_TABLES_IN_TEXT_SECTION +#define JUMP_TABLES_IN_TEXT_SECTION 0 +#endif + /* Nonzero means this function is a leaf function, with no function calls. This variable exists to be examined in FUNCTION_PROLOGUE and FUNCTION_EPILOGUE. Always zero, unless set by some action. */ @@ -1062,23 +1066,27 @@ shorten_branches (first) max_skip = LABEL_ALIGN_MAX_SKIP; } next = NEXT_INSN (insn); -/* ADDR_VECs only take room if read-only data goes into the text section. */ -#if !defined(READONLY_DATA_SECTION) || defined(JUMP_TABLES_IN_TEXT_SECTION) - if (next && GET_CODE (next) == JUMP_INSN) - { - rtx nextbody = PATTERN (next); - if (GET_CODE (nextbody) == ADDR_VEC - || GET_CODE (nextbody) == ADDR_DIFF_VEC) - { - log = ADDR_VEC_ALIGN (next); - if (max_log < log) - { - max_log = log; - max_skip = LABEL_ALIGN_MAX_SKIP; - } - } - } + /* ADDR_VECs only take room if read-only data goes into the text + section. */ + if (JUMP_TABLES_IN_TEXT_SECTION +#if !defined(READONLY_DATA_SECTION) + || 1 #endif + ) + if (next && GET_CODE (next) == JUMP_INSN) + { + rtx nextbody = PATTERN (next); + if (GET_CODE (nextbody) == ADDR_VEC + || GET_CODE (nextbody) == ADDR_DIFF_VEC) + { + log = ADDR_VEC_ALIGN (next); + if (max_log < log) + { + max_log = log; + max_skip = LABEL_ALIGN_MAX_SKIP; + } + } + } LABEL_TO_ALIGNMENT (insn) = max_log; LABEL_TO_MAX_SKIP (insn) = max_skip; max_log = 0; @@ -1254,11 +1262,15 @@ shorten_branches (first) { /* This only takes room if read-only data goes into the text section. */ -#if !defined(READONLY_DATA_SECTION) || defined(JUMP_TABLES_IN_TEXT_SECTION) - insn_lengths[uid] = (XVECLEN (body, GET_CODE (body) == ADDR_DIFF_VEC) - * GET_MODE_SIZE (GET_MODE (body))); + if (JUMP_TABLES_IN_TEXT_SECTION +#if !defined(READONLY_DATA_SECTION) + || 1 +#endif + ) + insn_lengths[uid] = (XVECLEN (body, + GET_CODE (body) == ADDR_DIFF_VEC) + * GET_MODE_SIZE (GET_MODE (body))); /* Alignment is handled by ADDR_VEC_ALIGN. */ -#endif } else if (asm_noperands (body) >= 0) insn_lengths[uid] = asm_insn_count (body) * insn_default_length (insn); @@ -1449,13 +1461,19 @@ shorten_branches (first) PUT_MODE (body, CASE_VECTOR_SHORTEN_MODE (min_addr - rel_addr, max_addr - rel_addr, body)); -#if !defined(READONLY_DATA_SECTION) || defined(JUMP_TABLES_IN_TEXT_SECTION) - insn_lengths[uid] - = (XVECLEN (body, 1) * GET_MODE_SIZE (GET_MODE (body))); - insn_current_address += insn_lengths[uid]; - if (insn_lengths[uid] != old_length) - something_changed = 1; + if (JUMP_TABLES_IN_TEXT_SECTION +#if !defined(READONLY_DATA_SECTION) + || 1 #endif + ) + { + insn_lengths[uid] + = (XVECLEN (body, 1) * GET_MODE_SIZE (GET_MODE (body))); + insn_current_address += insn_lengths[uid]; + if (insn_lengths[uid] != old_length) + something_changed = 1; + } + continue; } #endif /* CASE_VECTOR_SHORTEN_MODE */ @@ -2307,16 +2325,18 @@ final_scan_insn (insn, file, optimize, prescan, nopeepholes) if (GET_CODE (nextbody) == ADDR_VEC || GET_CODE (nextbody) == ADDR_DIFF_VEC) { -#ifndef JUMP_TABLES_IN_TEXT_SECTION - readonly_data_section (); + if (! JUMP_TABLES_IN_TEXT_SECTION) + { + readonly_data_section (); #ifdef READONLY_DATA_SECTION - ASM_OUTPUT_ALIGN (file, - exact_log2 (BIGGEST_ALIGNMENT - / BITS_PER_UNIT)); + ASM_OUTPUT_ALIGN (file, + exact_log2 (BIGGEST_ALIGNMENT + / BITS_PER_UNIT)); #endif /* READONLY_DATA_SECTION */ -#else /* JUMP_TABLES_IN_TEXT_SECTION */ - function_section (current_function_decl); -#endif /* JUMP_TABLES_IN_TEXT_SECTION */ + } + else + function_section (current_function_decl); + #ifdef ASM_OUTPUT_CASE_LABEL ASM_OUTPUT_CASE_LABEL (file, "L", CODE_LABEL_NUMBER (insn), NEXT_INSN (insn)); diff --git a/gcc/tm.texi b/gcc/tm.texi index 120b497..0968754 100644 --- a/gcc/tm.texi +++ b/gcc/tm.texi @@ -4826,9 +4826,10 @@ data section. @findex JUMP_TABLES_IN_TEXT_SECTION @item JUMP_TABLES_IN_TEXT_SECTION -Define this macro if jump tables (for @code{tablejump} insns) should be -output in the text section, along with the assembler instructions. -Otherwise, the readonly data section is used. +Define this macro to be an expression with a non-zero value if jump +tables (for @code{tablejump} insns) should be output in the text +section, along with the assembler instructions. Otherwise, the +readonly data section is used. This macro is irrelevant if there is no separate readonly data section. -- 2.7.4