* config/ia64/ia64.c (do_spill): Pass cfa offset to move expander.
(do_restore): Likewise.
(gen_movdi_x, gen_fr_spill_x, gen_fr_restore_x): New.
(ia64_expand_prologue, ia64_expand_epilogue): Use them.
(rtx_needs_barrier): Track actual bit manipulation for
ar.unat moves, gr_spill, and gr_restore.
(emit_insn_group_barriers): Special case gr_spill/gr_restore.
(process_set): Don't handle varargs spills.
* config/ia64/ia64.md (gr_spill): Accept cfa offset. Emit
.mem.offset here instead of in process_set.
(gr_restore): Likewise.
From-SVN: r35648
* config/ia64/ia64.c (ia64_function_arg): Fix last change. Verify
type exists before using it. Use number of words as alignment
otherwise.
(ia64_function_arg_partial_nregs, ia64_function_arg_advance,
ia64_va_arg): Propagate ia64_function_args changes here.
From-SVN: r35413
* config/ia64/ia64.md (movdi): Split out load address code.
New post-reload splitter for symbolic operands.
(movdi_internal): Abort if we didn't split symbolic operands
when we should have.
* config/ia64/ia64.c (ia64_expand_load_address): New, from movdi bits.
(ia64_reorg): Split insns when not optimizing.
* config/ia64/ia64-protos.h (ia64_expand_load_address): Declare.
From-SVN: r35106
* config/ia64/ia64.c (got_symbolic_operand): New.
(symbolic_operand, move_operand): Revert 0701 change.
* config/ia64/ia64.h (PREDICATE_CODES): Update.
* config/ia64/ia64-protos.h (got_symbolic_operand): Declare.
* config/ia64/ia64.md (movdi): Revert 0701 wrt symbolic_operand;
split the offset into a 14-bit low part instead of a 13-bit low part.
(load_fptr): Mark the mem as unchanging.
(load_symptr): Use got_symbolic_operand.
From-SVN: r34948
* config/ia64/ia64.c (symbolic_operand): Reject CONST expressions
with the low 13 bits set.
(move_operand): Check for CONST|SYMBOL_REF|LABEL_REF directly.
* config/ia64/ia64.md (movdi): Likewise. Expand a CONST with one
of the low 13 bits into a CONST plus an adddi3.
(load_symptr): Set RTX_UNCHANGING_P.
From-SVN: r34821
* libgcc2.c (ia64_throw_helper): Use __builtin_return_address.
(__throw): Don't pass the address of a label.
* config/ia64/ia64.c (ia64_compute_frame_size): Use
current_function_is_leaf.
(ia64_expand_prologue): Likewise. Modify return_address_pointer_rtx
instead of reg_names[RETURN_ADDRESS_REGNUM].
(ia64_init_machine_status): Reset return_address_pointer_rtx.
* config/ia64/ia64.h (RETURN_ADDRESS_POINTER_REGNUM): Rename
from RETURN_ADDRESS_REGNUM. Update all uses.
(RETURN_ADDR_RTX): Use return_address_pointer_rtx; return
zero instead of null on failure.
(ELIMINABLE_REGS): Add ra->b0 elimination.
(CAN_ELIMINATE): Update accordingly.
(INITIAL_ELIMINATION_OFFSET): Likewise.
(REGISTER_NAMES): Use an illegal assembler name for
RETURN_ADDRESS_POINTER_REGNUM.
From-SVN: r34531
* frame.h (struct unwind_info_ptr): Collapse version, flags, and length
fields into header field.
(IA64_UNW_HDR_LENGTH, IA64_UNW_HDR_FLAGS, IA64_UNW_HDR_VERSION): New
macros to access length, flags, and version info from header field.
* config/ia64/crtbegin.asm (__do_frame_setup_aux): Delete here.
...
From-SVN: r34441
2000-05-25 Andrew MacLeod <amacleod@cygnus.com>
Andrew Haley <aph@cygnus.com>
* except.c (func_eh_entry): Add emitted field.
(new_eh_region_entry): Set emitted field to 0;
(output_exception_table_entry): Only emit previously un-emitted data,
and send it to the eh_data section.
(output_exception_table): Break out common parts. Output
exception table for entire compilation unit to eh_data section.
(output_exception_table_data): Common parts of output_exception_table.
Send output to eh_data section.
(output_function_exception_table): Output exception table data for
a single function to eh_data section.
(free_exception_table): New external to free the table.
* except.h (free_exception_table): Add prototype.
(output_function_exception_table): Add prototype.
* final.c (final_end_function): Output function exception table
for IA64_UNWIND_INFO.
(final_scan_insn): Emit any unwind directives for an insn.
* frame-dwarf2.c: New file containing all DWARF 2 specific code
from frame.c.
* frame.c: Remove all DWARF 2 specific code.
* config/ia64/frame-ia64.c: New file.
(gthread_stuff): Make all gthread available with
IA64_UNWIND_INFO.
(dwarf_fde): Define an IA64 struct for dwarf_fde.
(__register_frame_info, __register_frame): Move to common area of file.
(__register_frame_info_table, __register_frame_table): Move to common i
area.
(__deregister_frame_info, __deregister_frame): Move to common area.
(__frame_init, find_fde): New versions for IA64_UNWIND_INFO.
(read_uleb128): New version for ia64.
(get_unwind_record): Read the next IA-64 unwind record.
(read_R_record): Read a region header record.
(process_a_b_reg_code): X record helper.
(read_X_record): Read an X format record.
(read_B_record): Read a B format record.
(P3_record_types): List of record types matching the P3 format.
(P7_record_types): List of record types matching the P7 format.
(P8_record_types): List of record types matching the P8 format.
(read_P_record): Read a P format record.
(init_ia64_reg_loc): Set default fields for a register.
(init_ia64_unwind_frame): Set defaults for all register records.
(execute_one_ia64_descriptor): Execute one descriptor record.
(rse_address_add): Calculate the position of a local reg in memory.
(normalize_reg_loc): Turn a location descriptor into a memory address.
(maybe_normalize_reg_loc): Only normalize a descriptor if it falls
within a specified PC offset range.
(get_real_reg_value): Given a register location, retrieve its value.
(set_real_reg_value): Change the value of a register location.
(copy_reg_value): Copy reg values, if needed.
(copy_saved_reg_state): Copy all registers that need to be copied.
(process_state_between): Normalize all frame register records that
fall within the specified PC range.
(frame_translate): Take a processed frame description, and turn
everything into addresses.
(build_ia64_frame_state ): Find and create frame state record for a PC.
(get_personality): Get the personality routine for a given frame.
(get_except_table): Get the exception table for a given frame.
(record_name): Unwind record names for debugging.
(print_record): Print and unwind record.
(print_all_records): Print an entire unwind image.
(__ia64_backtrace): Print a backtrace.
(ia64_backtrace_helper): New function.
(__register_frame_info_aux): New function.
* config/ia64/crtend.asm (__do_frame_setup_aux): New function.
* frame.h (enum unw_record_type): New unwind record types.
(struct unw_p_record, unw_b_record, unw_x_record) : New unwind records.
(struct unw_r_record, unwind_record): New unwind record structs.
(struct unwind_info_ptr): Unwind information layout.
(IA64_UNW_LOC_TYPE_*): Macros for different types for location
descriptors.
(struct ia64_reg_loc): Register location description.
(struct ia64_frame_state): Location of all registers in a frame.
(struct object): Add pc_base and fde_end for IA64_UNWIND_INFO.
* libgcc2.c (__ia64_personality_v1): Personality routine.
(__calc_caller_bsp): Calculate the bsp register for the caller's
frame.
(ia64_throw_helper): Figure out who to return to and set up the
registers.
(__throw): Throw routine.
* output.h (assemble_eh_align, assemble_eh_label): New functions
to generate EH info where we want it.
(assemble_eh_integer): New function.
* toplev.c (compile_file): Output module level exception table for
non-ia64 targets.
(main): Set exceptions_via_longjump and flag_new_exceptions based
on IA64_UNWIND_INFO too.
* varasm.c (assemble_eh_label): Generate a label via
ASM_OUTPUT_EH_LABEL if it has been specified.
(assemble_eh_align): Generate an alignment directive via
ASM_OUTPUT_EH_ALIGN if it has been specified.
(assemble_eh_label): Generate an integer value via
ASM_OUTPUT_EH_type if they have been specified.
* config/ia64/ia64.c (rtx_needs_barrier): Add flushrs.
(ia64_init_builtins): Add __builtin_ia64_bsp
and __builtin_ia64_flushrs.
(ia64_expand_builtin): Add IA64_BUILTIN_BSP and
IA64_BUILTIN_FLUSHRS.
* config/ia64/ia64.h (ia64_builtins): Add IA64_BUILTIN_BSP and
IA64_BUILTIN_FLUSHRS.
* config/ia64/ia64.md (flushrs): New insn to flush the register
stack. Add to unspec list.
* config/ia64/crtbegin.asm (frame_object): Change size.
(__do_frame_setup_aux): New function.
* config/ia64/crtend.asm: call __do_frame_setup_aux.
* config/ia64/t-ia64 (LIB2ADDEH): Add.
* Makefile.in (LIB2ADDEH): Add.
(LIB2ADD): Use LIB2ADDEH.
Co-Authored-By: Andrew Haley <aph@cygnus.com>
From-SVN: r34169
* config/ia64/ia64.c (ia64_encode_section_info): Exit early
for global register variables; don't special case __[CD]TOR_LIST__;
mind ggc_p for string allocation.
From-SVN: r33776
* c-decl.c: Include "tm_p.h".
* config/ia64/ia64-protos.h: Rearrange decls to reduce ifdef madness.
(fetchadd_operand, ia64_expand_fetch_and_op): Declare.
(ia64_expand_op_and_fetch): Declare.
* config/ia64/ia64.c: Include "toplev.h". Kill trailing whitespace.
(setjmp_operand): Constify variables for XSTR.
(ia64_encode_section_info): Likewise.
(ia64_print_operand): Use %d for exact_log2; cast 32-bit printed
values to int.
(ia64_asm_output_external): Constify name.
(process_set): Use HOST_WIDE_INT_PRINT_DEC for frame size.
(process_for_unwind_directive): Provide switch default.
(ia64_expand_compare_and_swap): Remove unused variables.
(ia64_expand_builtin): Likewise.
* config/ia64/ia64.h (ASM_OUTPUT_BYTE): Mask and cast value to int
for printing.
From-SVN: r33752
* config/ia64/ia64.c (ia64_encode_section_info): Add check for
TREE_ASM_WRITTEN.
* config/ia64/ia64.c (ia64_override_options): Force -mconstant-gp
if -mauto-pic is on.
...
From-SVN: r33638
2000-05-02 Andrew Haley <aph@cygnus.com>
* config/ia64/ia64.c (ia64_encode_section_info): Handle the case
where this function is called for the second time on a decl that
has had its section info changed in such a way as to move it out
of small data/bss.
* config/ia64/ia64.h (REDO_SECTION_INFO_P): New definition.
From-SVN: r33609
* config/ia64/ia64.c (rtx_needs_barrier, case UNSPEC): Move case 6...
(rtx_needs_barrier, case UNSPEC_VOLATILE): to here.
* config/ia64/ia64.md (pr_restore): Change UNSPEC to UNSPEC_VOLATILE.
From-SVN: r32714
* config/ia64/ia64.c (ia64_expand_prologue): Don't abort if leaf
function uses output registers. Don't save RP for leaf functions.
Do save RP even if no epilogue.
* config/ia64/ia64.h (FIXED_REGISTERS): Unmark in/out registers.
(CALL_USED_REGISTERS): Unmark in registers.
(REG_ALLOC_ORDER): Move out regs up, to near the top. Move in regs up,
to near the middle.
From-SVN: r32661