--- gcc/config/hp320.h 2018/04/24 17:51:33 1.1 +++ gcc/config/hp320.h 2018/04/24 18:04:24 1.1.1.4 @@ -31,6 +31,24 @@ the Free Software Foundation, 675 Mass A #define SGS /* Uses SGS assembler */ #define SGS_CMP_ORDER /* Takes cmp operands in reverse order */ #define HPUX_ASM + +#if !defined (CROSS_COMPILE) && !defined (NO_BUGS) +/* The assembler on HP 9k3xx machines running HPUX 8.0 doesn't translate + floating point constants behind some operands. The workaround is to + use hex constants. Reported by Thomas Nau (nau@medizin.uni-ulm.de). */ +#define AS_BUG_FLOATING_CONSTANT +/* The assembler on HP 9k3xx machines running HPUX 8.0 doesn't accept + labels followed by a text, data, or other section directive. Reported + by Thomas Nau (nau@medizin.uni-ulm.de). */ +#define AS_BUG_TRAILING_LABEL +#endif + +/* gcc.c should find libgcc.a itself rather than expecting linker to. */ +#define LINK_LIBGCC_SPECIAL +/* The arguments of -L must be a separate argv element. */ +#define SPACE_AFTER_L_OPTION +/* HP/UX doesn't have libg.a. */ +#define LIB_SPEC "%{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}" #endif /* Be compatible with system stddef.h. */ @@ -95,9 +113,6 @@ the Free Software Foundation, 675 Mass A #define ASM_SPEC \ "%{m68000:-mc68000}%{mc68000:-mc68000}%{!mc68000:%{!m68000:-mc68020}}" -/* special directory for gnu libs on hp-ux system */ -#define MD_STARTFILE_PREFIX "/usr/local/lib/gnu/" - /* Tell GCC to put a space after -L when generating such options. */ #define SPACE_AFTER_L_OPTION @@ -160,8 +175,8 @@ the Free Software Foundation, 675 Mass A #undef PRINT_OPERAND #undef PRINT_OPERAND_ADDRESS #undef FUNCTION_PROFILER -#undef ASM_GLOBALIZE_LABEL #undef ASM_OUTPUT_INTERNAL_LABEL +#undef GLOBAL_ASM_OP #define TARGET_VERSION fprintf (stderr, " (68k, SGS/hpux syntax)"); @@ -284,11 +299,20 @@ the Free Software Foundation, 675 Mass A #define ASM_APP_OFF "" +#ifdef AS_BUG_TRAILING_LABEL +#define TEXT_SECTION_ASM_OP "\tlalign\t1\ntext" +#define DATA_SECTION_ASM_OP "\tlalign\t1\ndata" +#else #define TEXT_SECTION_ASM_OP "text" - #define DATA_SECTION_ASM_OP "data" +#endif + +#define ASCII_DATA_ASM_OP "byte" + +/* This is the command to make the user-level label named NAME + defined for reference from other files. */ -#define ASCII_DATA_ASM_OP "\tbyte" +#define GLOBAL_ASM_OP "global" /* This says how to output an assembler line to define a global common symbol. */ @@ -314,12 +338,6 @@ the Free Software Foundation, 675 Mass A ( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 12), \ sprintf ((OUTPUT), "%s___%d", (NAME), (LABELNO))) -/* This is how to output a command to make the user-level label named NAME - defined for reference from other files. */ - -#define ASM_GLOBALIZE_LABEL(FILE,NAME) \ - do { fputs ("\tglobal ", FILE); assemble_name (FILE, NAME); fputs ("\n", FILE);} while (0) - #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ do{ if (PREFIX[0] == 'L' && PREFIX[1] == 'I') \ fprintf(FILE, "\tset %s%d,.+2\n", PREFIX, NUM); \ @@ -333,6 +351,24 @@ do{ if (PREFIX[0] == 'L' && PREFIX[1] = #define ASM_OUTPUT_FLOAT(FILE, VALUE) \ fprintf (FILE, "\tfloat 0f%.9g\n", (VALUE)) +#ifdef AS_BUG_FLOATING_CONSTANT +#undef ASM_OUTPUT_DOUBLE_OPERAND +#define ASM_OUTPUT_DOUBLE_OPERAND(FILE, VALUE) \ + do { \ + union { double d; int i[2]; } dummy_u; \ + dummy_u.d = (VALUE); \ + asm_fprintf (FILE, "%I0x%x%08x", dummy_u.i[0], dummy_u.i[1]); \ + } while (0) + +#undef ASM_OUTPUT_FLOAT_OPERAND +#define ASM_OUTPUT_FLOAT_OPERAND(FILE, VALUE) \ + do { \ + union { float f; int i; } dummy_u; \ + dummy_u.f = (VALUE); \ + asm_fprintf (FILE, "%I0x%08x", dummy_u.i); \ + } while (0) +#endif /* AS_BUG_FLOATING_CONSTANT */ + /* This is how to output an assembler line defining an `int' constant. */ #define ASM_OUTPUT_INT(FILE,VALUE) \ @@ -375,13 +411,24 @@ do{ if (PREFIX[0] == 'L' && PREFIX[1] = #define ASM_OUTPUT_SOURCE_FILENAME(FILE, FILENAME) #define ASM_OUTPUT_SOURCE_LINE(FILE, LINENO) +#ifdef AS_BUG_FLOATING_CONSTANT +#define PRINT_OPERAND_FLOAT(FILE,CODE,FLOAT,INT) \ + fprintf (FILE, "&0x%x", (INT)) +#else +#define PRINT_OPERAND_FLOAT(FILE,CODE,FLOAT,INT) \ + if (CODE == 'f') \ + fprintf (FILE, "&0f%.9g", (FLOAT)); \ + else \ + fprintf (FILE, "&0x%x", (INT)) +#endif /* AS_BUG_FLOATING_CONSTANT */ + #define PRINT_OPERAND(FILE, X, CODE) \ { if (CODE == '.') fprintf (FILE, "."); \ else if (CODE == '#') fprintf (FILE, "&"); \ else if (CODE == '-') fprintf (FILE, "-(%%sp)"); \ else if (CODE == '+') fprintf (FILE, "(%%sp)+"); \ else if (CODE == '@') fprintf (FILE, "(%%sp)"); \ - else if (CODE == '!') fprintf (FILE, "%%cc"); \ + else if (CODE == '!') fprintf (FILE, "%%fpcr"); \ else if (CODE == '$') { if (TARGET_68040_ONLY) fprintf (FILE, "s"); } \ else if (CODE == '&') { if (TARGET_68040_ONLY) fprintf (FILE, "d"); } \ else if (GET_CODE (X) == REG) \ @@ -393,10 +440,7 @@ do{ if (PREFIX[0] == 'L' && PREFIX[1] = union { float f; int i; } u1; \ u.i[0] = CONST_DOUBLE_LOW (X); u.i[1] = CONST_DOUBLE_HIGH (X); \ u1.f = u.d; \ - if (CODE == 'f') \ - fprintf (FILE, "&0f%.9g", u1.f); \ - else \ - fprintf (FILE, "&0x%x", u1.i); } \ + PRINT_OPERAND_FLOAT (FILE,CODE, u1.f, u1.i); } \ else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == DFmode) \ { union { double d; int i[2]; } u; \ u.i[0] = CONST_DOUBLE_LOW (X); u.i[1] = CONST_DOUBLE_HIGH (X); \ @@ -553,7 +597,7 @@ do{ if (PREFIX[0] == 'L' && PREFIX[1] = putc('\n', (f)); \ inside = FALSE; \ } \ - fprintf((f), "%s ", ASCII_DATA_ASM_OP); \ + fprintf((f), "\t%s ", ASCII_DATA_ASM_OP); \ } \ if ((p)[i] < 32 || (p)[i] == '\\' || (p)[i] == '"' || (p)[i] == 127) { \ if (inside) { \ @@ -608,7 +652,12 @@ do{ if (PREFIX[0] == 'L' && PREFIX[1] = #else /* not HPUX_ASM */ #undef FUNCTION_PROFILER -#define FUNCTION_PROFILER(FILE, LABELNO) \ - fprintf (FILE, "\tmovl #LP%d,d0\n\tjsr mcount\n", (LABELNO)); + +/* HP-UX needs the call to mcount before the link instruction. + Copy the return address onto the stack before the call to fake it out. */ +#define FUNCTION_PROFILER(FILE, LABEL_NO) \ + fprintf (FILE, "\tmovel a6@(4),sp@-\n" \ + "\tmovl #LP%d,a0\n\tjsr mcount\n" \ + "\taddqw #4,sp\n", (LABEL_NO)); #endif /* not HPUX_ASM */