diff options
author | Neil Booth <neil@gcc.gnu.org> | 2001-07-06 18:40:17 +0000 |
---|---|---|
committer | Neil Booth <neil@gcc.gnu.org> | 2001-07-06 18:40:17 +0000 |
commit | 08c148a85ce39064798592a90839497c098fbc93 (patch) | |
tree | 0ff4b9170093f108e4988c09e21e8b9ff5dd462a /gcc/config/i370 | |
parent | b62c888152fb7d3245bbea7464c50aef8fe1c8fa (diff) | |
download | gcc-08c148a85ce39064798592a90839497c098fbc93.zip gcc-08c148a85ce39064798592a90839497c098fbc93.tar.gz gcc-08c148a85ce39064798592a90839497c098fbc93.tar.bz2 |
Makefile.in (final.o): Depend on target.h.
* Makefile.in (final.o): Depend on target.h.
* final.c: Include target.h.
(default_function_pro_epilogue): New.
(final_start_function): Use target structure for function prologues.
(final_end_function): Use target structure for function epilogues.
* fold-const.c (real_hex_to_f): Constify s and p.
* output.h (default_function_pro_epilogue): New.
* real.h (real_hex_to_f): Update prototype.
* target-def.h (TARGET_ASM_FUNCTION_PROLOGUE,
TARGET_ASM_FUNCTION_EPILOGUE, TARGET_ASM_OUT): New.
(TARGET_INITIALIZER): Update.
* target.h (gcc_target): Add struct asm_out.
* doc/tm.texi: Update.
config:
Update each arch to use TARGET_ASM_FUNCTION_PROLOGUE and
TARGET_ASM_FUNCTION_EPILOGUE. Move macro code to functions
in cpu/cpu.c, or rename old functions consistently. Take
a HOST_WIDE INT not an int as the SIZE parameter. Remove now
redundant macros and prototypes. Make new functions static.
* 1750a/1750a.c: Similarly.
* 1750a/1750a.h: Similarly.
* a29k/a29k-protos.h: Similarly.
* a29k/a29k.c: Similarly.
* a29k/a29k.h: Similarly.
* arc/arc-protos.h: Similarly.
* arc/arc.c: Similarly.
* arc/arc.h: Similarly.
* arm/arm-protos.h: Similarly.
* arm/arm.c: Similarly.
* arm/arm.h: Similarly.
* avr/avr-protos.h: Similarly.
* avr/avr.c: Similarly.
* avr/avr.h: Similarly.
* clipper/clipper-protos.h: Similarly.
* clipper/clipper.c: Similarly.
* clipper/clipper.h: Similarly.
* convex/convex.c: Similarly.
* convex/convex.h: Similarly.
* d30v/d30v-protos.h: Similarly.
* d30v/d30v.c: Similarly.
* d30v/d30v.h: Similarly.
* d30v/d30v.md: Similarly.
* dsp16xx/dsp16xx-protos.h: Similarly.
* dsp16xx/dsp16xx.c: Similarly.
* dsp16xx/dsp16xx.h: Similarly.
* elxsi/elxsi.c: Similarly.
* elxsi/elxsi.h: Similarly.
* fr30/fr30.c: Similarly.
* fr30/fr30.md: Similarly.
* h8300/h8300-protos.h: Similarly.
* h8300/h8300.c: Similarly.
* h8300/h8300.h: Similarly.
* i370/i370-protos.h: Similarly.
* i370/i370.c: Similarly.
* i370/i370.h: Similarly.
* i386/i386.c: Similarly.
* i386/osf1elf.h: Similarly.
* i386/osfrose.h: Similarly.
* i860/i860-protos.h: Similarly.
* i860/i860.c: Similarly.
* i860/i860.h: Similarly.
* i960/i960-protos.h: Similarly.
* i960/i960.c: Similarly.
* i960/i960.h: Similarly.
* ia64/ia64-protos.h: Similarly.
* ia64/ia64.c: Similarly.
* ia64/ia64.h: Similarly.
* m32r/m32r-protos.h: Similarly.
* m32r/m32r.c: Similarly.
* m32r/m32r.h: Similarly.
* m68hc11/m68hc11-protos.h: Similarly.
* m68hc11/m68hc11.c: Similarly.
* m68hc11/m68hc11.h: Similarly.
* m68k/crds.h: Similarly.
* m68k/dpx2.h: Similarly.
* m68k/m68k-protos.h: Similarly.
* m68k/m68k.c: Similarly.
* m68k/m68k.h: Similarly.
* m68k/news.h: Similarly.
* m88k/m88k-protos.h: Similarly.
* m88k/m88k.c: Similarly.
* m88k/m88k.h: Similarly.
* mips/mips-protos.h: Similarly.
* mips/mips.c: Similarly.
* mips/mips.h: Similarly.
* ns32k/merlin.h: Similarly.
* ns32k/ns32k.c: Similarly.
* ns32k/ns32k.h: Similarly.
* ns32k/tek6000.h: Similarly.
* pa/pa-protos.h: Similarly.
* pa/pa.c: Similarly.
* pa/pa.h: Similarly.
* pdp11/2bsd.h: Similarly.
* pdp11/pdp11-protos.h: Similarly.
* pdp11/pdp11.c: Similarly.
* pdp11/pdp11.h: Similarly.
* romp/romp-protos.h: Similarly.
* romp/romp.c: Similarly.
* romp/romp.h: Similarly.
* rs6000/rs6000-protos.h: Similarly.
* rs6000/rs6000.c: Similarly.
* rs6000/rs6000.h: Similarly.
* rs6000/sysv4.h: Similarly.
* sh/sh-protos.h: Similarly.
* sh/sh.c: Similarly.
* sh/sh.h: Similarly.
* sparc/sparc-protos.h: Similarly.
* sparc/sparc.c: Similarly.
* sparc/sparc.h: Similarly.
* vax/vax.c: Similarly.
* vax/vax.h: Similarly.
* vax/vms.h: Similarly.
* we32k/we32k.c: Similarly.
* we32k/we32k.h: Similarly.
From-SVN: r43817
Diffstat (limited to 'gcc/config/i370')
-rw-r--r-- | gcc/config/i370/i370-protos.h | 1 | ||||
-rw-r--r-- | gcc/config/i370/i370.c | 70 | ||||
-rw-r--r-- | gcc/config/i370/i370.h | 94 |
3 files changed, 64 insertions, 101 deletions
diff --git a/gcc/config/i370/i370-protos.h b/gcc/config/i370/i370-protos.h index eff8546..8ca7ca6 100644 --- a/gcc/config/i370/i370-protos.h +++ b/gcc/config/i370/i370-protos.h @@ -46,7 +46,6 @@ extern void mvs_add_alias PARAMS ((const char *, const char *, int)); extern int mvs_need_alias PARAMS ((const char *)); extern int mvs_get_alias PARAMS ((const char *, char *)); extern int mvs_check_alias PARAMS ((const char *, char *)); -extern void i370_function_prolog PARAMS ((FILE *, int)); extern void check_label_emit PARAMS ((void)); extern void mvs_free_label_list PARAMS ((void)); diff --git a/gcc/config/i370/i370.c b/gcc/config/i370/i370.c index ebd1d85..43b5929 100644 --- a/gcc/config/i370/i370.c +++ b/gcc/config/i370/i370.c @@ -100,6 +100,8 @@ static FILE *assembler_source = 0; static label_node_t * mvs_get_label PARAMS ((int)); static void i370_label_scan PARAMS ((void)); +static void i370_output_function_prologue PARAMS ((FILE *, HOST_WIDE_INT)); +static void i370_output_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT)); /* ===================================================== */ /* defines and functions specific to the HLASM assembler */ @@ -287,6 +289,10 @@ static const unsigned char ebcasc[256] = }; /* Initialize the GCC target structure. */ +#undef TARGET_ASM_FUNCTION_PROLOGUE +#define TARGET_ASM_FUNCTION_PROLOGUE i370_output_function_prologue +#undef TARGET_ASM_FUNCTION_EPILOGUE +#define TARGET_ASM_FUNCTION_EPILOGUE i370_output_function_epilogue struct gcc_target target = TARGET_INITIALIZER; @@ -1195,13 +1201,21 @@ unsigned_jump_follows_p (insn) } } +/* Generate the assembly code for function entry. FILE is a stdio + stream to output the code to. SIZE is an int: how many units of + temporary storage to allocate. + + Refer to the array `regs_ever_live' to determine which registers to + save; `regs_ever_live[I]' is nonzero if register number I is ever + used in the function. This function is responsible for knowing + which registers should not be saved even if used. */ #ifdef TARGET_HLASM -void -i370_function_prolog (f, l) +static void +i370_output_function_prologue (f, l) FILE *f; - int l; + HOST_WIDE_INT l; { #if MACROPROLOGUE == 1 fprintf (f, "* Function %s prologue\n", mvs_function_name); @@ -1388,10 +1402,10 @@ i370_function_prolog (f, l) also, to quite using addresses 136, 140, etc. */ -void -i370_function_prolog (f, frame_size) +static void +i370_output_function_prologue (f, frame_size) FILE *f; - int frame_size; + HOST_WIDE_INT frame_size; { static int function_label_index = 1; static int function_first = 0; @@ -1461,3 +1475,47 @@ i370_function_prolog (f, frame_size) i370_label_scan (); } #endif /* TARGET_ELF_ABI */ + +/* This function generates the assembly code for function exit. + Args are as for output_function_prologue (). + + The function epilogue should not depend on the current stack + pointer! It should use the frame pointer only. This is mandatory + because of alloca; we also take advantage of it to omit stack + adjustments before returning. */ + +static void +i370_output_function_epilogue (file, l) + FILE *file; + HOST_WIDE_INT l ATTRIBUTE_UNUSED; +{ + int i; + + check_label_emit (); + mvs_check_page (file, 14, 0); + fprintf (file, "* Function %s epilogue\n", mvs_function_name); + mvs_page_num++; + +#if MACROEPILOGUE == 1 + fprintf (file, "\tEDCEPIL\n"); +#else /* MACROEPILOGUE != 1 */ + fprintf (file, "\tL\t13,4(,13)\n"); + fprintf (file, "\tL\t14,12(,13)\n"); + fprintf (file, "\tLM\t2,12,28(13)\n"); + fprintf (file, "\tBALR\t1,14\n"); + fprintf (file, "\tDC\tA("); + assemble_name (file, mvs_function_name); + fprintf (file, ")\n" ); +#endif /* MACROEPILOGUE */ + + fprintf (file, "* Function %s literal pool\n", mvs_function_name); + fprintf (file, "\tDS\t0F\n" ); + fprintf (file, "\tLTORG\n"); + fprintf (file, "* Function %s page table\n", mvs_function_name); + fprintf (file, "\tDS\t0F\n"); + fprintf (file, "PGT%d\tEQU\t*\n", function_base_page); + + mvs_free_label_list(); + for (i = function_base_page; i < mvs_page_num; i++) + fprintf (file, "\tDC\tA(PG%d)\n", i); +} diff --git a/gcc/config/i370/i370.h b/gcc/config/i370/i370.h index 71e95c4..fa187f3 100644 --- a/gcc/config/i370/i370.h +++ b/gcc/config/i370/i370.h @@ -1590,10 +1590,6 @@ enum reg_class } \ } -/* This macro generates the assembly code for function entry. - All of the C/370 environment is preserved. */ -#define FUNCTION_PROLOGUE(FILE, LSIZE) i370_function_prolog ((FILE), (LSIZE)); - #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ { \ if (strlen (NAME) + 1 > mvs_function_name_length) \ @@ -1618,62 +1614,6 @@ enum reg_class fputs ("\tCSECT\n", FILE); \ } -/* This macro generates the assembly code for function exit, on machines - that need it. If FUNCTION_EPILOGUE is not defined then individual - return instructions are generated for each return statement. Args are - same as for FUNCTION_PROLOGUE. - - The function epilogue should not depend on the current stack pointer! - It should use the frame pointer only. This is mandatory because - of alloca; we also take advantage of it to omit stack adjustments - before returning. */ - -#if MACROEPILOGUE == 1 -#define FUNCTION_EPILOGUE(FILE, LSIZE) \ -{ \ - int i; \ - check_label_emit(); \ - mvs_check_page (FILE,14,0); \ - fprintf (FILE, "* Function %s epilogue\n", mvs_function_name); \ - fprintf (FILE, "\tEDCEPIL\n"); \ - mvs_page_num++; \ - fprintf (FILE, "* Function %s literal pool\n", mvs_function_name); \ - fprintf (FILE, "\tDS\t0F\n" ); \ - fprintf (FILE, "\tLTORG\n"); \ - fprintf (FILE, "* Function %s page table\n", mvs_function_name); \ - fprintf (FILE, "\tDS\t0F\n"); \ - fprintf (FILE, "PGT%d\tEQU\t*\n", function_base_page); \ - mvs_free_label_list(); \ - for ( i = function_base_page; i < mvs_page_num; i++ ) \ - fprintf (FILE, "\tDC\tA(PG%d)\n", i); \ -} -#else /* MACROEPILOGUE != 1 */ -#define FUNCTION_EPILOGUE(FILE, LSIZE) \ -{ \ - int i; \ - check_label_emit(); \ - mvs_check_page (FILE,14,0); \ - fprintf (FILE, "* Function %s epilogue\n", mvs_function_name); \ - fprintf (FILE, "\tL\t13,4(,13)\n"); \ - fprintf (FILE, "\tL\t14,12(,13)\n"); \ - fprintf (FILE, "\tLM\t2,12,28(13)\n"); \ - fprintf (FILE, "\tBALR\t1,14\n"); \ - fprintf (FILE, "\tDC\tA("); \ - mvs_page_num++; \ - assemble_name (FILE, mvs_function_name); \ - fprintf (FILE, ")\n" ); \ - fprintf (FILE, "* Function %s literal pool\n", mvs_function_name); \ - fprintf (FILE, "\tDS\t0F\n" ); \ - fprintf (FILE, "\tLTORG\n"); \ - fprintf (FILE, "* Function %s page table\n", mvs_function_name); \ - fprintf (FILE, "\tDS\t0F\n"); \ - fprintf (FILE, "PGT%d\tEQU\t*\n", function_base_page); \ - mvs_free_label_list(); \ - for ( i = function_base_page; i < mvs_page_num; i++ ) \ - fprintf (FILE, "\tDC\tA(PG%d)\n", i); \ -} -#endif /* MACROEPILOGUE */ - /* Output assembler code to FILE to increment profiler label # LABELNO for profiling a function entry. */ @@ -1951,40 +1891,6 @@ abort(); \ } \ } -/* This macro generates the assembly code for function exit, on machines - that need it. If FUNCTION_EPILOGUE is not defined then individual - return instructions are generated for each return statement. Args are - same as for FUNCTION_PROLOGUE. - - The function epilogue should not depend on the current stack pointer! - It should use the frame pointer only. This is mandatory because - of alloca; we also take advantage of it to omit stack adjustments - before returning. */ - -#define FUNCTION_EPILOGUE(FILE, LSIZE) \ -{ \ - int i; \ - check_label_emit(); \ - mvs_check_page (FILE,14,0); \ - fprintf (FILE, "# Function epilogue\n"); \ - fprintf (FILE, "\tL\tsp,4(0,sp)\n"); \ - fprintf (FILE, "\tL\tlr,12(0,sp)\n"); \ - fprintf (FILE, "\tLM\t2,12,28(sp)\n"); \ - fprintf (FILE, "\tBASR\t1,lr\n"); \ - mvs_page_num++; \ - fprintf (FILE, "# Function literal pool\n"); \ - fprintf (FILE, "\t.balign\t4\n"); \ - fprintf (FILE, "\t.ltorg\n"); \ - fprintf (FILE, "# Function page table\n"); \ - fprintf (FILE, "\t.balign\t4\n"); \ - fprintf (FILE, ".LPGT%d:\n", function_base_page); \ - mvs_free_label_list(); \ - for ( i = function_base_page; i < mvs_page_num; i++ ) \ - fprintf (FILE, "\t.long\t.LPG%d\n", i); \ -} - -#define FUNCTION_PROLOGUE(FILE, LSIZE) i370_function_prolog ((FILE), (LSIZE)); - /* Output assembler code to FILE to increment profiler label # LABELNO for profiling a function entry. */ /* Make it a no-op for now, so we can at least compile glibc */ |