summaryrefslogtreecommitdiff
path: root/gcc/config/vax/vax.c
diff options
context:
space:
mode:
authorneil <neil@138bc75d-0d04-0410-961f-82ee72b054a4>2001-07-06 18:40:17 +0000
committerneil <neil@138bc75d-0d04-0410-961f-82ee72b054a4>2001-07-06 18:40:17 +0000
commit17d9b0c371c482b48e92d6556c5f4b2096a4c6e7 (patch)
tree0ff4b9170093f108e4988c09e21e8b9ff5dd462a /gcc/config/vax/vax.c
parent8faa719fbc0bd299bfbc7005ddef0e3a734f49f0 (diff)
downloadgcc-17d9b0c371c482b48e92d6556c5f4b2096a4c6e7.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@43817 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/vax/vax.c')
-rw-r--r--gcc/config/vax/vax.c77
1 files changed, 74 insertions, 3 deletions
diff --git a/gcc/config/vax/vax.c b/gcc/config/vax/vax.c
index 43d6a9cc7bd..50d9f708b2a 100644
--- a/gcc/config/vax/vax.c
+++ b/gcc/config/vax/vax.c
@@ -30,17 +30,88 @@ Boston, MA 02111-1307, USA. */
#include "function.h"
#include "output.h"
#include "insn-attr.h"
-#ifdef VMS_TARGET
#include "tree.h"
-#endif
+#include "recog.h"
#include "tm_p.h"
#include "target.h"
#include "target-def.h"
+
+static void vax_output_function_prologue PARAMS ((FILE *, HOST_WIDE_INT));
/* Initialize the GCC target structure. */
+#undef TARGET_ASM_FUNCTION_PROLOGUE
+#define TARGET_ASM_FUNCTION_PROLOGUE vax_output_function_prologue
struct gcc_target target = TARGET_INITIALIZER;
+/* 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. */
+
+static void
+vax_output_function_prologue (file, size)
+ FILE * file;
+ HOST_WIDE_INT size;
+{
+ register int regno;
+ register int mask = 0;
+ extern char call_used_regs[];
+
+ for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
+ if (regs_ever_live[regno] && !call_used_regs[regno])
+ mask |= 1 << regno;
+
+ fprintf (file, "\t.word 0x%x\n", mask);
+
+ if (VMS_TARGET)
+ {
+ /*
+ * This works for both gcc and g++. It first checks to see if
+ * the current routine is "main", which will only happen for
+ * GCC, and add the jsb if it is. If is not the case then try
+ * and see if __MAIN_NAME is part of current_function_name,
+ * which will only happen if we are running g++, and add the jsb
+ * if it is. In gcc there should never be a paren in the
+ * function name, and in g++ there is always a "(" in the
+ * function name, thus there should never be any confusion.
+ *
+ * Adjusting the stack pointer by 4 before calling C$MAIN_ARGS
+ * is required when linking with the VMS POSIX version of the C
+ * run-time library; using `subl2 $4,r0' is adequate but we use
+ * `clrl -(sp)' instead. The extra 4 bytes could be removed
+ * after the call because STARTING_FRAME_OFFSET's setting of -4
+ * will end up adding them right back again, but don't bother.
+ */
+
+ const char *p = current_function_name;
+ int is_main = strcmp ("main", p) == 0;
+# define __MAIN_NAME " main("
+
+ while (!is_main && *p != '\0')
+ {
+ if (*p == *__MAIN_NAME
+ && strncmp (p, __MAIN_NAME, sizeof __MAIN_NAME - sizeof "") == 0)
+ is_main = 1;
+ else
+ p++;
+ }
+
+ if (is_main)
+ fprintf (file, "\t%s\n\t%s\n", "clrl -(sp)", "jsb _C$MAIN_ARGS");
+ }
+
+ size -= STARTING_FRAME_OFFSET;
+ if (size >= 64)
+ fprintf (file, "\tmovab %d(sp),sp\n", -size);
+ else if (size)
+ fprintf (file, "\tsubl2 $%d,sp\n", size);
+}
+
/* This is like nonimmediate_operand with a restriction on the type of MEM. */
void
@@ -665,7 +736,7 @@ check_float_value (mode, d, overflow)
return 0;
}
-#ifdef VMS_TARGET
+#if VMS_TARGET
/* Additional support code for VMS target. */
/* Linked list of all externals that are to be emitted when optimizing