diff options
Diffstat (limited to 'gcc/config/pa/pa64-hpux.h')
-rw-r--r-- | gcc/config/pa/pa64-hpux.h | 242 |
1 files changed, 173 insertions, 69 deletions
diff --git a/gcc/config/pa/pa64-hpux.h b/gcc/config/pa/pa64-hpux.h index 6d9728d6bff..aa7dac75382 100644 --- a/gcc/config/pa/pa64-hpux.h +++ b/gcc/config/pa/pa64-hpux.h @@ -31,14 +31,16 @@ Boston, MA 02111-1307, USA. */ N_("Assume code will be linked by HP ld") }, /* We can debug dynamically linked executables on hpux11; we also - want dereferencing of a NULL pointer to cause a SEGV. */ + want dereferencing of a NULL pointer to cause a SEGV. Do not move + the "+Accept TypeMismatch" switch. We check for it in collect2 + to determine which init/fini is needed. */ #undef LINK_SPEC #if ((TARGET_DEFAULT | TARGET_CPU_DEFAULT) & MASK_GNU_LD) #define LINK_SPEC \ - "-E %{mlinker-opt:-O} %{!shared:-u main} %{static:-a archive} %{shared:%{mhp-ld:-b}%{!mhp-ld:-shared}} %{mhp-ld:+Accept TypeMismatch}" + "%{mhp-ld:+Accept TypeMismatch} -E %{mlinker-opt:-O} %{!shared:-u main} %{static:-a archive} %{shared:%{mhp-ld:-b}%{!mhp-ld:-shared}}" #else #define LINK_SPEC \ - "-E %{mlinker-opt:-O} %{!shared:-u main} %{static:-a archive} %{shared:%{mgnu-ld:-shared}%{!mgnu-ld:-b}} %{!mgnu-ld:+Accept TypeMismatch}" + "%{!mgnu-ld:+Accept TypeMismatch} -E %{mlinker-opt:-O} %{!shared:-u main} %{static:-a archive} %{shared:%{mgnu-ld:-shared}%{!mgnu-ld:-b}}" #endif /* Like the default, except no -lg. */ @@ -72,50 +74,165 @@ Boston, MA 02111-1307, USA. */ #define MD_STARTFILE_PREFIX_1 "/opt/langtools/lib/pa20_64/" #endif -/* hpux11 has the new HP assembler. It's still lousy, but it's a whole lot - better than the assembler shipped with older versions of hpux. */ -#undef NEW_HP_ASSEMBLER -#define NEW_HP_ASSEMBLER 1 +/* Due to limitations in the target structure, it isn't currently possible + to dynamically switch between the GNU and HP assemblers. */ +#undef TARGET_GAS + +/* Configure selects the standard ELFOS defines for use with GAS. */ +#ifdef USING_ELFOS_H + +/* We are using GAS. */ +#define TARGET_GAS 1 #undef ASM_FILE_START #define ASM_FILE_START(FILE) \ -do { \ - if (TARGET_64BIT) \ - fputs("\t.LEVEL 2.0w\n", FILE); \ - else if (TARGET_PA_20) \ - fputs("\t.LEVEL 2.0\n", FILE); \ - else if (TARGET_PA_11) \ - fputs("\t.LEVEL 1.1\n", FILE); \ - else \ - fputs("\t.LEVEL 1.0\n", FILE); \ - if (profile_flag)\ - fprintf (FILE, "\t.IMPORT _mcount, CODE\n");\ - if (write_symbols != NO_DEBUG) \ - output_file_directive ((FILE), main_input_filename); \ - } while (0) +do { \ + if (TARGET_64BIT) \ + fputs("\t.LEVEL 2.0w\n", FILE); \ + else if (TARGET_PA_20) \ + fputs("\t.LEVEL 2.0\n", FILE); \ + else if (TARGET_PA_11) \ + fputs("\t.LEVEL 1.1\n", FILE); \ + else \ + fputs("\t.LEVEL 1.0\n", FILE); \ + if (profile_flag) \ + ASM_OUTPUT_TYPE_DIRECTIVE (FILE, "_mcount", "function"); \ + if (write_symbols != NO_DEBUG) \ + { \ + output_file_directive ((FILE), main_input_filename); \ + fputs ("\t.version\t\"01.01\"\n", FILE); \ + } \ +} while (0) + +/* This is how we output a null terminated string. */ +#undef STRING_ASM_OP +#define STRING_ASM_OP "\t.stringz\t" + +#define TEXT_SECTION_ASM_OP "\t.text" +#define DATA_SECTION_ASM_OP "\t.data" +#define BSS_SECTION_ASM_OP "\t.section\t.bss" + +#undef ASM_OUTPUT_ALIGNED_COMMON +#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \ +do { \ + bss_section (); \ + assemble_name ((FILE), (NAME)); \ + fputs ("\t.comm ", (FILE)); \ + fprintf ((FILE), "%d\n", MAX ((SIZE), ((ALIGN) / BITS_PER_UNIT))); \ +} while (0) + +#undef ASM_OUTPUT_ALIGNED_LOCAL +#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \ +do { \ + bss_section (); \ + fprintf ((FILE), "\t.align %d\n", ((ALIGN) / BITS_PER_UNIT)); \ + assemble_name ((FILE), (NAME)); \ + fprintf ((FILE), "\n\t.block %d\n", (SIZE)); \ +} while (0) + +/* The define in pa.h doesn't work with the alias attribute. The + default is ok with the following define for GLOBAL_ASM_OP. */ +#undef TARGET_ASM_GLOBALIZE_LABEL + +/* This is how we globalize a label. */ +#define GLOBAL_ASM_OP "\t.globl\t" + +/* Hacked version from elfos.h that doesn't output a label. */ +#undef ASM_DECLARE_FUNCTION_NAME +#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ +do { \ + ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function"); \ + ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \ +} while (0) + +/* The type of external references must be set correctly for the + dynamic loader to work correctly. This is equivalent to the + HP assembler's .IMPORT directive but relates more directly to + ELF object file types. */ +#define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME) \ +do { \ + int save_referenced; \ + save_referenced = TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (DECL));\ + if (FUNCTION_NAME_P (NAME)) \ + ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function"); \ + else \ + ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object"); \ + TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (DECL)) = save_referenced;\ +} while (0) + +/* We need set the type for external libcalls. Also note that not all + libcall names are passed to targetm.encode_section_info (e.g., __main). + Thus, we also have to do the section encoding if it hasn't been done + already. */ +#undef ASM_OUTPUT_EXTERNAL_LIBCALL +#define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \ +do { \ + if (!FUNCTION_NAME_P (XSTR (FUN, 0))) \ + hppa_encode_label (FUN); \ + ASM_OUTPUT_TYPE_DIRECTIVE (FILE, XSTR (FUN, 0), "function"); \ +} while (0) + +/* We need to use the HP style for internal labels. */ +#undef ASM_OUTPUT_INTERNAL_LABEL +#define ASM_OUTPUT_INTERNAL_LABEL(FILE, PREFIX, NUM) \ + fprintf (FILE, "%c$%s%04d\n", (PREFIX)[0], (PREFIX) + 1, NUM) + +#undef ASM_GENERATE_INTERNAL_LABEL +#define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \ + sprintf (LABEL, "*%c$%s%04ld", (PREFIX)[0], (PREFIX) + 1, (long)(NUM)) + +#else /* USING_ELFOS_H */ + +/* We are not using GAS. */ +#define TARGET_GAS 0 + +/* HPUX 11 has the "new" HP assembler. It's still lousy, but it's a whole + lot better than the assembler shipped with older versions of hpux. + However, it doesn't support weak symbols and is a bad fit with ELF. */ +#undef NEW_HP_ASSEMBLER +#define NEW_HP_ASSEMBLER 1 /* It looks like DWARF2 will be the easiest debug format to handle on this platform. */ -#define OBJECT_FORMAT_ELF #define DWARF2_DEBUGGING_INFO 1 #define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG -/* This isn't quite ready yet. I'm seeing it mess up some line - tables. For example, we're getting lines starting/ending at - impossible addresses. */ -#define DWARF2_ASM_LINE_DEBUG_INFO 1 +/* This target uses the ELF object file format. */ +#define OBJECT_FORMAT_ELF -/* The rest of this file is copied from the generic svr4.h. One day we - would like to simply include svr4.h instead of copying all these - definitions. */ +#undef ASM_FILE_START +#define ASM_FILE_START(FILE) \ +do { \ + if (TARGET_64BIT) \ + fputs("\t.LEVEL 2.0w\n", FILE); \ + else if (TARGET_PA_20) \ + fputs("\t.LEVEL 2.0\n", FILE); \ + else if (TARGET_PA_11) \ + fputs("\t.LEVEL 1.1\n", FILE); \ + else \ + fputs("\t.LEVEL 1.0\n", FILE); \ + fputs("\t.SPACE $PRIVATE$,SORT=16\n\ +\t.SUBSPA $DATA$,QUAD=1,ALIGN=8,ACCESS=31\n\ +\t.SUBSPA $BSS$,QUAD=1,ALIGN=8,ACCESS=31,ZERO,SORT=82\n\ +\t.SPACE $TEXT$,SORT=8\n\ +\t.SUBSPA $LIT$,QUAD=0,ALIGN=8,ACCESS=44\n\ +\t.SUBSPA $CODE$,QUAD=0,ALIGN=8,ACCESS=44,CODE_ONLY\n", FILE); \ + if (profile_flag) \ + fprintf (FILE, "\t.IMPORT _mcount, CODE\n"); \ + if (write_symbols != NO_DEBUG) \ + output_file_directive ((FILE), main_input_filename); \ +} while (0) -#define READONLY_DATA_SECTION_ASM_OP "\t.section\t.rodata" +#undef TEXT_SECTION_ASM_OP +#define TEXT_SECTION_ASM_OP "\t.SUBSPA $CODE$\n" +#undef READONLY_DATA_SECTION_ASM_OP +#define READONLY_DATA_SECTION_ASM_OP "\t.SUBSPA $LIT$\n" +#undef DATA_SECTION_ASM_OP +#define DATA_SECTION_ASM_OP "\t.SUBSPA $DATA$\n" +#undef BSS_SECTION_ASM_OP +#define BSS_SECTION_ASM_OP "\t.SUBSPA $BSS$\n" -/* On svr4, we *do* have support for the .init and .fini sections, and we - can put stuff in there to be executed before and after `main'. We let - crtstuff.c and other files know this by defining the following symbols. - The definitions say how to change sections to the .init and .fini - sections. This is the same for all known svr4 assemblers. */ +#endif /* USING_ELFOS_H */ /* For the time being, we aren't using init sections. `P' relocations are currently used for function references. However, P relocations are @@ -124,10 +241,9 @@ do { \ weak symbols in crtbegin.o (e.g., __register_frame_info). Possibly Q relocations might avoid this problem but the GNU assembler doesn't support them. */ -#if 0 -#define INIT_SECTION_ASM_OP "\t.section\t.init" -#define FINI_SECTION_ASM_OP "\t.section\t.fini" -#else +#undef INIT_SECTION_ASM_OP +#undef FINI_SECTION_ASM_OP + #define EH_FRAME_IN_DATA_SECTION 1 #undef ENDFILE_SPEC @@ -138,37 +254,25 @@ do { \ /* Since we are not yet using .init and .fini sections, we need to explicitly arrange to run the global constructors and destructors. - HPUX 11 has ldd and we use it to determine the dependencies of - dynamic objects. It might be possible to use the ld options for - running initializers and terminators and thereby avoid the necessity - of running ldd, but unfortunately the options are different for - the two linkers. */ -#define LDD_SUFFIX "/usr/ccs/bin/ldd" -/* Skip to first '>' then advance to '/' at the beginning of the filename. */ -#define PARSE_LDD_OUTPUT(PTR) \ -do { \ - while (*PTR != '>') PTR++; \ - while (*PTR != '/') PTR++; \ -} while (0) -#endif - -/* Switch into a generic section. */ -#define TARGET_ASM_NAMED_SECTION default_elf_asm_named_section + We could use ldd for this but it depends on LD_LIBRARY_PATH being + correctly set. So, we use the ld init and fini switches. However, + we need to support different switches for the GNU and HP linkers. + We can't check TARGET_GNU_LD in collect2, so we need a different + test. The +Accept switch is always the first switch when we are + using the HP linker (see define for LINK_SPEC). Checking for it + is a somewhat fragile as it depends on internal details of the + collect2 program but it is better than testing ld_file_name. -#define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1) - -/* This is how we tell the assembler that a symbol is weak. */ - -#define ASM_WEAKEN_LABEL(FILE,NAME) \ - do { fputs ("\t.weak\t", FILE); assemble_name (FILE, NAME); \ - fputc ('\n', FILE); } while (0) - -/* Write the extra assembler code needed to declare a function's result. - Most svr4 assemblers don't require any special declaration of the - result value, but there are exceptions. */ - -#ifndef ASM_DECLARE_RESULT -#define ASM_DECLARE_RESULT(FILE, RESULT) + FIXME: The GNU linker is broken. The -init/-fini switches don't + work and ldd can't determine the dynamic dependences of executables + linked with GNU ld. The init and fini routines are not executed + although DT_INIT and DT_FINI appear ok. As a result, defining + LD_INIT_SWITCH and LD_FINI_SWITCH causes more harm than good when + using GNU ld. However, the definitions appear to work fine with + the HP linker. */ +#if 0 +#define LD_INIT_SWITCH (strcmp ("+Accept", ld2_argv[1]) ? "-init" : "+init") +#define LD_FINI_SWITCH (strcmp ("+Accept", ld2_argv[1]) ? "-fini" : "+fini") #endif /* If using HP ld do not call pxdb. Use size as a program that does nothing |