Index: gcc/gcc/config/alpha/vms.h |
diff --git a/gcc/gcc/config/alpha/vms.h b/gcc/gcc/config/alpha/vms.h |
index 4f043a5dc8affa53973ea82e6322a3721fe7cbd7..c0b20f89d61b1bfc3eaa50cfa85697aed15265d6 100644 |
--- a/gcc/gcc/config/alpha/vms.h |
+++ b/gcc/gcc/config/alpha/vms.h |
@@ -1,5 +1,6 @@ |
/* Output variables, constants and external declarations, for GNU compiler. |
- Copyright (C) 1996, 1997, 1998, 2000, 2001, 2002, 2004, 2005, 2007, 2008 |
+ Copyright (C) 1996, 1997, 1998, 2000, 2001, 2002, 2004, 2005, 2007, 2008, |
+ 2009 |
Free Software Foundation, Inc. |
This file is part of GCC. |
@@ -21,6 +22,10 @@ along with GCC; see the file COPYING3. If not see |
#define TARGET_OBJECT_SUFFIX ".obj" |
#define TARGET_EXECUTABLE_SUFFIX ".exe" |
+/* Alpha/VMS object format is not really Elf, but this makes compiling |
+ crtstuff.c and dealing with shared library initialization much easier. */ |
+#define OBJECT_FORMAT_ELF |
+ |
/* This enables certain macros in alpha.h, which will make an indirect |
reference to an external symbol an invalid address. This needs to be |
defined before we include alpha.h, since it determines which macros |
@@ -50,6 +55,8 @@ along with GCC; see the file COPYING3. If not see |
#undef TARGET_VERSION |
#define TARGET_VERSION fprintf (stderr, " (%s)", TARGET_NAME); |
+#define VMS_DEBUG_MAIN_POINTER "TRANSFER$BREAK$GO" |
+ |
#undef PCC_STATIC_STRUCT_RETURN |
/* "long" is 32 bits, but 64 bits for Ada. */ |
@@ -62,8 +69,14 @@ along with GCC; see the file COPYING3. If not see |
#define POINTER_SIZE 32 |
#define POINTERS_EXTEND_UNSIGNED 0 |
+#define HANDLE_SYSV_PRAGMA 1 |
+ |
#define MAX_OFILE_ALIGNMENT 524288 /* 8 x 2^16 by DEC Ada Test CD40VRA */ |
+/* The maximum alignment 'malloc' honors. */ |
+#undef MALLOC_ALIGNMENT |
+#define MALLOC_ALIGNMENT ((TARGET_MALLOC64 ? 16 : 8) * BITS_PER_UNIT) |
+ |
#undef FIXED_REGISTERS |
#define FIXED_REGISTERS \ |
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ |
@@ -129,29 +142,10 @@ along with GCC; see the file COPYING3. If not see |
#undef EPILOGUE_USES |
#define EPILOGUE_USES(REGNO) ((REGNO) == 26 || (REGNO) == 29) |
-#undef CAN_ELIMINATE |
-#define CAN_ELIMINATE(FROM, TO) \ |
-((TO) != STACK_POINTER_REGNUM || ! alpha_using_fp ()) |
- |
#undef INITIAL_ELIMINATION_OFFSET |
#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \ |
-{ switch (FROM) \ |
- { \ |
- case FRAME_POINTER_REGNUM: \ |
- (OFFSET) = alpha_sa_size () + alpha_pv_save_size (); \ |
- break; \ |
- case ARG_POINTER_REGNUM: \ |
- (OFFSET) = (ALPHA_ROUND (alpha_sa_size () + alpha_pv_save_size () \ |
- + get_frame_size () \ |
- + crtl->args.pretend_args_size) \ |
- - crtl->args.pretend_args_size); \ |
- break; \ |
- default: \ |
- gcc_unreachable (); \ |
- } \ |
- if ((TO) == STACK_POINTER_REGNUM) \ |
- (OFFSET) += ALPHA_ROUND (crtl->outgoing_args_size); \ |
-} |
+ ((OFFSET) = alpha_vms_initial_elimination_offset(FROM, TO)) |
+ |
/* Define a data type for recording info about an argument list |
during the scan of that argument list. This data type should |
@@ -193,13 +187,19 @@ typedef struct {int num_args; enum avms_arg_type atypes[6];} avms_arg_info; |
(CUM).num_args += ALPHA_ARG_SIZE (MODE, TYPE, NAMED); \ |
} |
-/* ABI has stack checking, but it's broken. */ |
-#undef STACK_CHECK_BUILTIN |
-#define STACK_CHECK_BUILTIN 0 |
+#define DEFAULT_PCC_STRUCT_RETURN 0 |
+ |
+#undef ASM_WEAKEN_LABEL |
+#define ASM_WEAKEN_LABEL(FILE, NAME) \ |
+ do { fputs ("\t.weak\t", FILE); assemble_name (FILE, NAME); \ |
+ fputc ('\n', FILE); } while (0) |
#define READONLY_DATA_SECTION_ASM_OP "\t.rdata" |
#define CTORS_SECTION_ASM_OP "\t.ctors" |
#define DTORS_SECTION_ASM_OP "\t.dtors" |
+#define SDATA_SECTION_ASM_OP "\t.sdata" |
+#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \ |
+ asm (SECTION_OP "\n\t.long " #FUNC"\n"); |
#undef ASM_OUTPUT_ADDR_DIFF_ELT |
#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) gcc_unreachable () |
@@ -221,49 +221,10 @@ typedef struct {int num_args; enum avms_arg_type atypes[6];} avms_arg_info; |
#define COMMON_ASM_OP "\t.comm\t" |
-#undef ASM_OUTPUT_ALIGNED_COMMON |
-#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \ |
-do { \ |
- fprintf ((FILE), "%s", COMMON_ASM_OP); \ |
- assemble_name ((FILE), (NAME)); \ |
- fprintf ((FILE), "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \ |
-} while (0) |
- |
+#undef ASM_OUTPUT_ALIGNED_DECL_COMMON |
+#define ASM_OUTPUT_ALIGNED_DECL_COMMON(FILE, DECL, NAME, SIZE, ALIGN) \ |
+ vms_output_aligned_decl_common (FILE, DECL, NAME, SIZE, ALIGN) |
-/* Output assembler code for a block containing the constant parts |
- of a trampoline, leaving space for the variable parts. |
- |
- The trampoline should set the static chain pointer to value placed |
- into the trampoline and should branch to the specified routine. |
- Note that $27 has been set to the address of the trampoline, so we can |
- use it for addressability of the two data items. */ |
- |
-#undef TRAMPOLINE_TEMPLATE |
-#define TRAMPOLINE_TEMPLATE(FILE) \ |
-{ \ |
- fprintf (FILE, "\t.quad 0\n"); \ |
- fprintf (FILE, "\t.linkage __tramp\n"); \ |
- fprintf (FILE, "\t.quad 0\n"); \ |
-} |
- |
-/* Length in units of the trampoline for entering a nested function. */ |
- |
-#undef TRAMPOLINE_SIZE |
-#define TRAMPOLINE_SIZE 32 |
- |
-/* The alignment of a trampoline, in bits. */ |
- |
-#undef TRAMPOLINE_ALIGNMENT |
-#define TRAMPOLINE_ALIGNMENT 64 |
- |
-/* Emit RTL insns to initialize the variable parts of a trampoline. |
- FNADDR is an RTX for the address of the function's pure code. |
- CXT is an RTX for the static chain value for the function. */ |
- |
-#undef INITIALIZE_TRAMPOLINE |
-#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \ |
- alpha_initialize_trampoline (TRAMP, FNADDR, CXT, 16, 24, -1) |
- |
/* Control how constructors and destructors are emitted. */ |
#define TARGET_ASM_CONSTRUCTOR vms_asm_out_constructor |
#define TARGET_ASM_DESTRUCTOR vms_asm_out_destructor |
@@ -282,8 +243,64 @@ do { \ |
gen_rtx_MEM (Pmode, plus_constant (stack_pointer_rtx, 8)) |
#define LINK_EH_SPEC "vms-dwarf2eh.o%s " |
+#define LINK_GCC_C_SEQUENCE_SPEC "%G" |
+ |
+#ifdef IN_LIBGCC2 |
+/* Get the definition for MD_FALLBACK_FRAME_STATE_FOR from a separate |
+ file. This avoids having to recompile the world instead of libgcc only |
+ when changes to this macro are exercised. */ |
#define MD_UNWIND_SUPPORT "config/alpha/vms-unwind.h" |
+#endif |
+ |
+#define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME) \ |
+ avms_asm_output_external (FILE, DECL, NAME) |
+ |
+typedef struct crtl_name_spec |
+{ |
+ const char *const name; |
+ const char *deccname; |
+ int referenced; |
+} crtl_name_spec; |
+ |
+#include "config/vms/vms-crtl.h" |
+ |
+/* Alias CRTL names to 32/64bit DECCRTL functions. |
+ Fixme: This should do a binary search. */ |
+#define DO_CRTL_NAMES \ |
+ do \ |
+ { \ |
+ int i; \ |
+ static crtl_name_spec vms_crtl_names[] = CRTL_NAMES; \ |
+ static int malloc64_init = 0; \ |
+ \ |
+ if ((malloc64_init == 0) && TARGET_MALLOC64) \ |
+ { \ |
+ for (i=0; vms_crtl_names [i].name; i++) \ |
+ { \ |
+ if (strcmp ("calloc", vms_crtl_names [i].name) == 0) \ |
+ vms_crtl_names [i].deccname = "decc$_calloc64"; \ |
+ else \ |
+ if (strcmp ("malloc", vms_crtl_names [i].name) == 0) \ |
+ vms_crtl_names [i].deccname = "decc$_malloc64"; \ |
+ else \ |
+ if (strcmp ("realloc", vms_crtl_names [i].name) == 0) \ |
+ vms_crtl_names [i].deccname = "decc$_realloc64"; \ |
+ else \ |
+ if (strcmp ("strdup", vms_crtl_names [i].name) == 0) \ |
+ vms_crtl_names [i].deccname = "decc$_strdup64"; \ |
+ } \ |
+ malloc64_init = 1; \ |
+ } \ |
+ for (i=0; vms_crtl_names [i].name; i++) \ |
+ if (!vms_crtl_names [i].referenced && \ |
+ (strcmp (name, vms_crtl_names [i].name) == 0)) \ |
+ { \ |
+ fprintf (file, "\t%s=%s\n", \ |
+ name, vms_crtl_names [i].deccname); \ |
+ vms_crtl_names [i].referenced = 1; \ |
+ } \ |
+ } while (0) |
/* This is how to output an assembler line |
that says to advance the location counter |
@@ -318,22 +335,18 @@ do { \ |
#undef ASM_FINAL_SPEC |
/* The VMS convention is to always provide minimal debug info |
- for a traceback unless specifically overridden. Defaulting this here |
- is a kludge. */ |
- |
-#define OPTIMIZATION_OPTIONS(OPTIMIZE, OPTIMIZE_SIZE) \ |
-{ \ |
- write_symbols = VMS_DEBUG; \ |
- debug_info_level = (enum debug_info_level) 1; \ |
-} |
+ for a traceback unless specifically overridden. */ |
-/* Override traceback debug info on -g0. */ |
#undef OVERRIDE_OPTIONS |
-#define OVERRIDE_OPTIONS \ |
-{ \ |
- if (write_symbols == NO_DEBUG) \ |
- debug_info_level = (enum debug_info_level) 0; \ |
- override_options (); \ |
+#define OVERRIDE_OPTIONS \ |
+{ \ |
+ if (write_symbols == NO_DEBUG \ |
+ && debug_info_level == DINFO_LEVEL_NONE) \ |
+ { \ |
+ write_symbols = VMS_DEBUG; \ |
+ debug_info_level = DINFO_LEVEL_TERSE; \ |
+ } \ |
+ override_options (); \ |
} |
/* Link with vms-dwarf2.o if -g (except -g0). This causes the |
@@ -343,26 +356,20 @@ do { \ |
%{g2:-g2 vms-dwarf2.o%s} %{g3:-g3 vms-dwarf2.o%s} %{shared} %{v} %{map}" |
#undef STARTFILE_SPEC |
-#define STARTFILE_SPEC "%{!shared:%{mvms-return-codes:vcrt0.o%s} \ |
-%{!mvms-return-codes:pcrt0.o%s}}" |
+#define STARTFILE_SPEC \ |
+"%{!shared:%{mvms-return-codes:vcrt0.o%s} %{!mvms-return-codes:pcrt0.o%s} \ |
+ crtbegin.o%s} \ |
+ %{!static:%{shared:crtbeginS.o%s}}" |
-#undef LIB_SPEC |
-#define LIB_SPEC "-lc" |
+#define ENDFILE_SPEC \ |
+"%{!shared:crtend.o%s} %{!static:%{shared:crtendS.o%s}}" |
#define NAME__MAIN "__gccmain" |
#define SYMBOL__MAIN __gccmain |
-#define MD_EXEC_PREFIX "/gnu/lib/gcc-lib/" |
-#define MD_STARTFILE_PREFIX "/gnu/lib/gcc-lib/" |
- |
-/* Specify the list of include file directories. */ |
-#define INCLUDE_DEFAULTS \ |
-{ \ |
- { "/gnu/lib/gcc-lib/include", 0, 0, 0 }, \ |
- { "/gnu_gxx_include", 0, 1, 1 }, \ |
- { "/gnu_cc_include", 0, 0, 0 }, \ |
- { "/gnu/include", 0, 0, 0 }, \ |
- { 0, 0, 0, 0 } \ |
-} |
+#define INIT_SECTION_ASM_OP "\t.section LIB$INITIALIZE,GBL,NOWRT" |
#define LONGLONG_STANDALONE 1 |
+ |
+#undef TARGET_VALID_POINTER_MODE |
+#define TARGET_VALID_POINTER_MODE vms_valid_pointer_mode |