diff options
Diffstat (limited to 'gcc/config/pa/pa64-hpux.h')
| -rw-r--r-- | gcc/config/pa/pa64-hpux.h | 207 | 
1 files changed, 151 insertions, 56 deletions
diff --git a/gcc/config/pa/pa64-hpux.h b/gcc/config/pa/pa64-hpux.h index 6d9728d6bff..1966a40420f 100644 --- a/gcc/config/pa/pa64-hpux.h +++ b/gcc/config/pa/pa64-hpux.h @@ -72,50 +72,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 +239,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 @@ -144,32 +258,13 @@ do {  \     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 - -#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) -#endif  /* If using HP ld do not call pxdb.  Use size as a program that does nothing     and returns 0.  /bin/true cannot be used because it is a script without  | 

