pa.h (ASM_OUTPUT_EXTERNAL): Don't let assemble_name clobber the value of TREE_SYMBOL_REFERENCED.

* pa.h (ASM_OUTPUT_EXTERNAL): Don't let assemble_name clobber
	the value of TREE_SYMBOL_REFERENCED.

	* pa-ghpux9.h (LINK_SPEC): Pass "-z" to the linker to enable
	trap on null pointer dereference for programs built on hpux9.
	* pa-hpux9.h, pa1-ghpux9.h, pa1-hpux9.h: Likewise.

	* pa.c (output_function_prologue): No longer need to keep
	track of the total number code bytes when TARGET_GAS &&
	not TARGET_PORTABLE_RUNTIME.
	* pa.h (DBX_OUTPUT_MAIN_SOURCE_FILE_END): Use .NSUBSPA when
	not TARGET_PORTABLE_RUNTIME.
	(ASM_OUTPUT_FUNCTION_PREFIX): Define.  Prefix functions with
	.NSUBSPA when TARGET_GAS and not TARGET_PORTABLE_RUNTIME.

	* pa.md (symbolic high patterns): Use 'H' to print the symbolic
	address so that the constant part gets rounded.
	* pa.c (print_operand): Handle 'H' operand for high part of a
	symbolic address with a rounded constant.
	(output_global_address): New argument "rounded_constant".  All
	callers changed appropriately.

	* x-pa-hpux (FIXPROTO_DEFINES): Add -D_HPUX_SOURCE.

	* pa.h (CPP_SPEC): Only pass -D_HPUX_SOURCE and -D_HIUX_SOURCE if
	-ansi is not present.
	(CPP_PREDEFINES): Remove -D_HPUX_SOURCE and/or -D_HIUX_SOURCE.
	* pa-ghiux.h (CPP_PREDEFINES): Likewise.
	* pa-gux7.h (CPP_PREDEFINES): Likewise.
	* pa-hiux.h (CPP_PREDEFINES): Likewise.
	* pa-hpux.h (CPP_PREDEFINES): Likewise.
	* pa-hpux7.h (CPP_PREDEFINES): Likewise.
	* pa1-ghiux.h (CPP_PREDEFINES): Likewise.
	* pa1-hiux.h (CPP_PREDEFINES): Likewise.

	* pa-hpux.h (LINK_SPEC): If -mlinker-opt, then pass -O to the
	linker.
	* pa-ghpux.h, pa-hpux9.h, pa-ghpux9.h: Likewise.
	* pa1-ghpux9.h, pa1-hpux9.h: Likewise.
	* pa.h (LINK_SPEC): Likewise.
	(TARGET_SWITCHES): Add -mlinker-opt.

	* pa.md (all peepholes): Disable if TARGET_SOFT_FLOAT.

	* pa.c (pa_reorg): If TARGET_GAS, then emit insns to mark
	the beginning and end of the branch table.
	* pa.md (begin_brtab): New insn.  Just a marker so GCC knows
	where to put the .begin_brtab pseudo-op.
	(end_brtab): Similarly.

	* pa.h (EXTRA_SECTIONS): Add in_ctors and in_dtors if
	CTORS_SECTION_FUNCTION is defined.  Else define dummy
	versions of CTORS_SECTION_FUNCTION and DTORS_SECTION_FUNCTION.
	(EXTRA_SECTION_FUNCTIONS): Add CTORS_SECTION_FUNCTION and
	DTORS_SECTION_FUNCTION.

	* pa.md: Add peepholes to improve spill code generated
	by reload when we run out of FP registers.

From-SVN: r10612
This commit is contained in:
Jeff Law 1995-11-27 01:31:46 -07:00
parent 4f26a76615
commit ad238e4b39
8 changed files with 159 additions and 29 deletions

View File

@ -24,4 +24,4 @@ Boston, MA 02111-1307, USA. */
/* Predefines are the one noteworthy difference between HPUX and HIUX. */
#undef CPP_PREDEFINES
#define CPP_PREDEFINES "-Dhppa -DPWB -Dunix -D_HIUX_SOURCE -D__H3050R -D__H3050RX -Asystem(unix) -Asystem(hiux) -Acpu(hppa) -Amachine(hppa)"
#define CPP_PREDEFINES "-Dhppa -DPWB -Dunix -D__H3050R -D__H3050RX -Asystem(unix) -Asystem(hiux) -Acpu(hppa) -Amachine(hppa)"

View File

@ -41,11 +41,11 @@ Boston, MA 02111-1307, USA. */
#define LIB_SPEC "%{!shared:%{!p:%{!pg:-lc}}%{p: -L/lib/libp/ -lc}%{pg: -L/lib/libp/ -lc}}"
#undef CPP_PREDEFINES
#define CPP_PREDEFINES "-Dhppa -Dhp9000s800 -D__hp9000s800 -Dhp9k8 -DPWB -Dhpux -Dunix -D_HPUX_SOURCE -Asystem(unix) -Asystem(hpux) -Acpu(hppa) -Amachine(hppa)"
#define CPP_PREDEFINES "-Dhppa -Dhp9000s800 -D__hp9000s800 -Dhp9k8 -DPWB -Dhpux -Dunix -Asystem(unix) -Asystem(hpux) -Acpu(hppa) -Amachine(hppa)"
#undef LINK_SPEC
#define LINK_SPEC \
"%{!shared:-u main} %{static:-a archive} %{g*:-a archive} %{shared:-b}"
"%{mlinker-opt:-O} %{!shared:-u main} %{static:-a archive} %{g*:-a archive} %{shared:-b}"
/* hpux8 and later have C++ compatible include files, so do not
pretend they are `extern "C"'. */

View File

@ -44,4 +44,4 @@ Boston, MA 02111-1307, USA. */
#define LIB_SPEC "%{!p:%{!pg:-lc}}%{p: -L/lib/libp/ -lc}%{pg: -L/lib/libp/ -lc}"
#undef CPP_PREDEFINES
#define CPP_PREDEFINES "-Dhppa -Dhp9000s800 -D__hp9000s800 -Dhp9k8 -DPWB -Dhpux -Dunix -D_HPUX_SOURCE -Asystem(unix) -Asystem(hpux) -Acpu(hppa) -Amachine(hppa)"
#define CPP_PREDEFINES "-Dhppa -Dhp9000s800 -D__hp9000s800 -Dhp9k8 -DPWB -Dhpux -Dunix -Asystem(unix) -Asystem(hpux) -Acpu(hppa) -Amachine(hppa)"

View File

@ -23,7 +23,8 @@ Boston, MA 02111-1307, USA. */
#include "pa/pa-hpux.h"
/* We can debug dynamically linked executables on hpux9. */
/* We can debug dynamically linked executables on hpux9; we also want
dereferecing of a NULL pointer to cause a SEGV. */
#undef LINK_SPEC
#define LINK_SPEC \
"%{!shared:-u main} %{static:-a archive} %{shared:-b}"
"-z %{mlinker-opt:-O} %{!shared:-u main} %{static:-a archive} %{shared:-b}"

View File

@ -2012,12 +2012,16 @@ output_function_prologue (file, size)
ASM_GENERATE_INTERNAL_LABEL (hp_profile_label_name, "LP",
hp_profile_labelno);
if (insn_addresses)
/* If we're using GAS and not using the portable runtime model, then
we don't need to accumulate the total number of code bytes. */
if (TARGET_GAS && ! TARGET_PORTABLE_RUNTIME)
total_code_bytes = 0;
else if (insn_addresses)
{
unsigned int old_total = total_code_bytes;
total_code_bytes += insn_addresses[INSN_UID (get_last_insn())];
total_code_bytes += FUNCTION_BOUNDARY /BITS_PER_UNIT;
total_code_bytes += FUNCTION_BOUNDARY / BITS_PER_UNIT;
/* Be prepared to handle overflows. */
total_code_bytes = old_total > total_code_bytes ? -1 : total_code_bytes;
@ -3032,7 +3036,10 @@ print_operand (file, x, code)
}
return;
case 'G':
output_global_address (file, x);
output_global_address (file, x, 0);
return;
case 'H':
output_global_address (file, x, 1);
return;
case 0: /* Don't do anything special */
break;
@ -3079,9 +3086,10 @@ print_operand (file, x, code)
/* output a SYMBOL_REF or a CONST expression involving a SYMBOL_REF. */
void
output_global_address (file, x)
output_global_address (file, x, round_constant)
FILE *file;
rtx x;
int round_constant;
{
/* Imagine (high (const (plus ...))). */
@ -3119,6 +3127,18 @@ output_global_address (file, x)
offset = INTVAL (XEXP (XEXP (x, 0),1));
else abort ();
/* How bogus. The compiler is apparently responsible for
rounding the constant if it uses an LR field selector.
The linker and/or assembler seem a better place since
they have to do this kind of thing already.
If we fail to do this, HP's optimizing linker may eliminate
an addil, but not update the ldw/stw/ldo instruction that
uses the result of the addil. */
if (round_constant)
offset = ((offset + 0x1000) & ~0x1fff);
if (GET_CODE (XEXP (x, 0)) == PLUS)
{
if (offset < 0)
@ -3136,8 +3156,8 @@ output_global_address (file, x)
if (!read_only_operand (base) && !flag_pic)
fprintf (file, "-$global$");
fprintf (file, "%s", sep);
if (offset) fprintf (file,"%d", offset);
if (offset)
fprintf (file,"%s%d", sep, offset);
}
else
output_addr_const (file, x);
@ -4756,9 +4776,14 @@ pa_reorg (insns)
|| GET_CODE (PATTERN (insn)) != ADDR_VEC)
continue;
/* If needed, emit marker for the beginning of the branch table. */
if (TARGET_GAS)
emit_insn_before (gen_begin_brtab (), insn);
pattern = PATTERN (insn);
location = PREV_INSN (insn);
length = XVECLEN (pattern, 0);
for (i = 0; i < length; i++)
{
/* Emit the jump itself. */
@ -4779,8 +4804,29 @@ pa_reorg (insns)
emit_label_after (tmp, location);
location = NEXT_INSN (location);
}
/* If needed, emit marker for the end of the branch table. */
if (TARGET_GAS)
emit_insn_before (gen_end_brtab (), location);
/* Delete the ADDR_VEC. */
delete_insn (insn);
}
}
else if (TARGET_GAS)
{
/* Sill need an end_brtab insn. */
insns = get_insns ();
for (insn = insns; insn; insn = NEXT_INSN (insn))
{
/* Find an ADDR_VEC insn. */
if (GET_CODE (insn) != JUMP_INSN
|| GET_CODE (PATTERN (insn)) != ADDR_VEC)
continue;
/* Now generate markers for the beginning and end of the
branc table. */
emit_insn_before (gen_begin_brtab (), insn);
emit_insn_after (gen_end_brtab (), insn);
}
}
}

View File

@ -126,6 +126,7 @@ extern int target_flags;
{"no-gas", -128}, \
{"soft-float", 256}, \
{"no-soft-float", -256}, \
{"linker-opt", 0}, \
{ "", TARGET_DEFAULT}}
#ifndef TARGET_DEFAULT
@ -196,23 +197,27 @@ extern int target_flags;
/* gdb needs a null N_SO at the end of each file for scattered loading. */
#undef DBX_OUTPUT_MAIN_SOURCE_FILE_END
#define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \
#define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \
if (!TARGET_PORTABLE_RUNTIME) \
fputs ("\t.NSUBSPA $CODE$,QUAD=0,ALIGN=8,ACCESS=44,CODE_ONLY\n", FILE); \
else \
fprintf (FILE, "%s\n", TEXT_SECTION_ASM_OP); \
fprintf (FILE, \
"%s\n\t.stabs \"%s\",%d,0,0,L$text_end\nL$text_end:\n",\
TEXT_SECTION_ASM_OP, "" , N_SO)
"\t.stabs \"\",%d,0,0,L$text_end0000\nL$text_end0000:\n", N_SO)
#if (TARGET_DEFAULT & 1) == 0
#define CPP_SPEC "%{msnake:-D__hp9000s700 -D_PA_RISC1_1}\
%{mpa-risc-1-1:-D__hp9000s700 -D_PA_RISC1_1}"
%{mpa-risc-1-1:-D__hp9000s700 -D_PA_RISC1_1}\
%{!ansi: -D_HPUX_SOURCE -D_HIUX_SOURCE}"
#else
#define CPP_SPEC "%{!mpa-risc-1-0:%{!mnosnake:%{!msoft-float:-D__hp9000s700 -D_PA_RISC1_1}}}"
#define CPP_SPEC "%{!mpa-risc-1-0:%{!mnosnake:%{!msoft-float:-D__hp9000s700 -D_PA_RISC1_1}}} %{!ansi: -D_HPUX_SOURCE -D_HIUX_SOURCE}"
#endif
/* Defines for a K&R CC */
#define CC1_SPEC "%{pg:} %{p:}"
#define LINK_SPEC "%{!shared:-u main} %{shared:-b}"
#define LINK_SPEC "%{mlinker-opt:-O} %{!shared:-u main} %{shared:-b}"
/* We don't want -lg. */
#ifndef LIB_SPEC
@ -237,7 +242,7 @@ extern int target_flags;
/* Names to predefine in the preprocessor for this target machine. */
#define CPP_PREDEFINES "-Dhppa -Dhp9000s800 -D__hp9000s800 -Dhp9k8 -Dunix -D_HPUX_SOURCE -Dhp9000 -Dhp800 -Dspectrum -DREVARGV -Asystem(unix) -Asystem(bsd) -Acpu(hppa) -Amachine(hppa)"
#define CPP_PREDEFINES "-Dhppa -Dhp9000s800 -D__hp9000s800 -Dhp9k8 -Dunix -Dhp9000 -Dhp800 -Dspectrum -DREVARGV -Asystem(unix) -Asystem(bsd) -Acpu(hppa) -Amachine(hppa)"
/* HPUX has a program 'chatr' to list the dependencies of dynamically
linked executables and shared libraries. */
@ -1005,6 +1010,10 @@ extern enum cmp_type hppa_branch_type;
fprintf (FILE, ",ARGW%d=FR", (ARG1));} while (0)
#endif
#define ASM_OUTPUT_FUNCTION_PREFIX(FILE, NAME) \
if (!TARGET_PORTABLE_RUNTIME && TARGET_GAS && in_section == in_text) \
fputs ("\t.NSUBSPA $CODE$,QUAD=0,ALIGN=8,ACCESS=44,CODE_ONLY\n", FILE);
#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
do { tree fntype = TREE_TYPE (TREE_TYPE (DECL)); \
tree tree_type = TREE_TYPE (DECL); \
@ -1794,7 +1803,13 @@ do { fprintf (FILE, "\t.SPACE $PRIVATE$\n\
/* Define the .bss section for ASM_OUTPUT_LOCAL to use. */
#ifndef CTORS_SECTION_FUNCTION
#define EXTRA_SECTIONS in_bss, in_readonly_data
#define CTORS_SECTION_FUNCTION
#define DTORS_SECTION_FUNCTION
#else
#define EXTRA_SECTIONS in_bss, in_readonly_data, in_ctors, in_dtors
#endif
/* FIXME: HPUX ld generates incorrect GOT entries for "T" fixups
which reference data within the $TEXT$ space (for example constant
@ -1830,7 +1845,9 @@ readonly_data () \
fprintf (asm_out_file, "%s\n", READONLY_DATA_ASM_OP); \
in_section = in_readonly_data; \
} \
}
} \
CTORS_SECTION_FUNCTION \
DTORS_SECTION_FUNCTION
/* How to refer to registers in assembler output.
@ -1880,15 +1897,22 @@ readonly_data () \
fputc ('\n', FILE); } while (0)
/* This is how to output a command to make the user-level label named NAME
defined for reference from other files. */
defined for reference from other files.
We call assemble_name, which in turn sets TREE_SYMBOL_REFERENCED. This
macro will restore the original value of TREE_SYMBOL_REFERENCED to avoid
placing useless function definitions in the output file. */
#define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME) \
do { fputs ("\t.IMPORT ", FILE); \
do { int save_referenced; \
save_referenced = TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (DECL)); \
fputs ("\t.IMPORT ", FILE); \
assemble_name (FILE, NAME); \
if (FUNCTION_NAME_P (NAME)) \
fputs (",CODE\n", FILE); \
else \
fputs (",DATA\n", FILE); \
TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (DECL)) = save_referenced; \
} while (0)
/* The bogus HP assembler requires ALL external references to be
@ -2110,7 +2134,7 @@ readonly_data () \
abort (); \
else if (flag_pic == 2) \
fputs ("RT'", FILE); \
output_global_address (FILE, XEXP (addr, 1)); \
output_global_address (FILE, XEXP (addr, 1), 0); \
fputs ("(", FILE); \
output_operand (XEXP (addr, 0), 0); \
fputs (")", FILE); \
@ -2132,10 +2156,12 @@ extern char *output_fp_move_double ();
extern char *output_block_move ();
extern char *output_cbranch ();
extern char *output_bb ();
extern char *output_bvb ();
extern char *output_dbra ();
extern char *output_movb ();
extern char *output_return ();
extern char *output_call ();
extern char *output_millicode_call ();
extern char *output_mul_insn ();
extern char *output_div_insn ();
extern char *output_mod_insn ();

View File

@ -1694,7 +1694,7 @@
&& ! function_label_operand (operands[1])
&& ! read_only_operand (operands[1])
&& ! flag_pic"
"addil LR'%G1,%%r27"
"addil LR'%H1,%%r27"
[(set_attr "type" "binary")
(set_attr "length" "4")])
@ -1741,7 +1741,7 @@
"*
{
if (symbolic_operand (operands[1], Pmode))
return \"ldil LR'%G1,%0\";
return \"ldil LR'%H1,%0\";
else
return \"ldil L'%G1,%0\";
}"
@ -4332,6 +4332,22 @@
[(set_attr "type" "move")
(set_attr "length" "4")])
;; These are just placeholders so we know where branch tables
;; begin and end.
(define_insn "begin_brtab"
[(const_int 1)]
"TARGET_GAS"
".begin_brtab"
[(set_attr "type" "move")
(set_attr "length" "0")])
(define_insn "end_brtab"
[(const_int 2)]
"TARGET_GAS"
".end_brtab"
[(set_attr "type" "move")
(set_attr "length" "0")])
;;; Hope this is only within a function...
(define_insn "indirect_jump"
[(set (pc) (match_operand:SI 0 "register_operand" "r"))]
@ -4628,7 +4644,7 @@
(set (match_operand 3 "register_operand" "+f")
(plus (match_operand 4 "register_operand" "f")
(match_operand 5 "register_operand" "f")))]
"TARGET_SNAKE && fmpyaddoperands (operands)"
"! TARGET_SOFT_FLOAT && TARGET_SNAKE && fmpyaddoperands (operands)"
"*
{
if (GET_MODE (operands[0]) == DFmode)
@ -4654,7 +4670,7 @@
(set (match_operand 0 "register_operand" "=f")
(mult (match_operand 1 "register_operand" "f")
(match_operand 2 "register_operand" "f")))]
"TARGET_SNAKE && fmpyaddoperands (operands)"
"! TARGET_SOFT_FLOAT && TARGET_SNAKE && fmpyaddoperands (operands)"
"*
{
if (GET_MODE (operands[0]) == DFmode)
@ -4682,7 +4698,7 @@
(set (match_operand 3 "register_operand" "+f")
(minus (match_operand 4 "register_operand" "f")
(match_operand 5 "register_operand" "f")))]
"TARGET_SNAKE && fmpysuboperands (operands)"
"! TARGET_SOFT_FLOAT && TARGET_SNAKE && fmpysuboperands (operands)"
"*
{
if (GET_MODE (operands[0]) == DFmode)
@ -4698,7 +4714,7 @@
(set (match_operand 0 "register_operand" "=f")
(mult (match_operand 1 "register_operand" "f")
(match_operand 2 "register_operand" "f")))]
"TARGET_SNAKE && fmpysuboperands (operands)"
"! TARGET_SOFT_FLOAT && TARGET_SNAKE && fmpysuboperands (operands)"
"*
{
if (GET_MODE (operands[0]) == DFmode)
@ -4707,6 +4723,44 @@
return \"fmpysub,sgl %1,%2,%0,%5,%3\";
}")
;; Clean up turds left by reload.
(define_peephole
[(set (match_operand 0 "reg_or_nonsymb_mem_operand" "")
(match_operand 1 "register_operand" "f"))
(set (match_operand 2 "register_operand" "f")
(match_dup 0))]
"! TARGET_SOFT_FLOAT
&& GET_CODE (operands[0]) == MEM
&& ! MEM_VOLATILE_P (operands[0])
&& GET_MODE (operands[0]) == GET_MODE (operands[1])
&& GET_MODE (operands[0]) == GET_MODE (operands[2])
&& GET_MODE (operands[0]) == DFmode
&& REGNO_REG_CLASS (REGNO (operands[1]))
== REGNO_REG_CLASS (REGNO (operands[2]))"
"*
{
enum machine_mode mode = GET_MODE (operands[0]);
rtx xoperands[2];
if (FP_REG_P (operands[1]))
output_asm_insn (output_fp_move_double (operands), operands);
else
output_asm_insn (output_move_double (operands), operands);
if (rtx_equal_p (operands[1], operands[2]))
return \"\";
xoperands[0] = operands[2];
xoperands[1] = operands[1];
if (FP_REG_P (xoperands[1]))
output_asm_insn (output_fp_move_double (xoperands), xoperands);
else
output_asm_insn (output_move_double (xoperands), xoperands);
return \"\";
}")
;; Flush the I and D cache line found at the address in operand 0.
;; This is used by the trampoline code for nested functions.
;; So long as the trampoline itself is less than 32 bytes this

View File

@ -1 +1,4 @@
ALLOCA=alloca.o
# So putenv and other functions get seen by fixproto.
FIXPROTO_DEFINES = -D_HPUX_SOURCE