Gcc 3.4.6 as of 2006/08/25 #116475.

This commit is contained in:
Alexander Kabaev 2006-08-26 21:29:10 +00:00
parent 502dfb0aa3
commit e35cf0a56c
107 changed files with 3045 additions and 1076 deletions

View File

@ -1,3 +1,822 @@
2006-04-25 Nick Clifton <nickc@redhat.com>
* config/m32r/m32r.c (gen_compare): Fix reg/smallconst equal code,
the patch for which was accidentally omitted from the previous
commit.
2006-04-04 Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com>
PR target/26775
PR target/26776
* config/m32r/m32r.c (m32r_output_function_epilogue): Case for
a large stack frame at epilogue. Use fp to recover a stack
pointer for alloca function at epilogue.
PR target/36276
* config/m32r/m32r.c (gen_compare): Removed a rule addsi3 codes
to avoid a miss optimizing at simplify_relational_operation().
* config/m32r/m32r.md (seq): Ditto. Changed reg_or_eq_int16_operand
to reg_or_uint16_operand because seq_insn has not used addsi3 already.
(seq_insn): Ditto. Removed operand check mode "P". Changed
reg_or_eq_int16_operand to reg_or_uint16_operand.
2006-03-05 Release Manager
* GCC 3.4.6 released.
2006-03-01 Gabriel Dos Reis <gdr@integrable-solutions.net>
Backport
2005-11-03 James E Wilson <wilson@specifix.com>
PR preprocessor/24202
* cppfiles.c (_cpp_pop_file_buffer): Set buffer_valid to false.
2006-03-01 Alan Modra <amodra@bigpond.net.au>
PR target/21616
Revert most of 2004-03-10 changes, apply mainline 2005-01-07.
* config/rs6000/rs6000.c (invalid_gpr_mem): Delete.
(base_reg_operand): Delete.
(legitimate_offset_address_p): Revert 2004-03-10 changes.
(secondary_reload_class): Likewise.
(rs6000_legitimize_reload_address): Convert non-word aligned
offset address using ld/std into indirect address.
* config/rs6000/rs6000.h (SECONDARY_RELOAD_CLASS): Define.
(SECONDARY_INPUT_RELOAD_CLASS, SECONDARY_OUTPUT_RELOAD_CLASS): Delete.
(PREDICATE_CODES): Delete invalid_gpr_mem and base_reg_operand.
* config/rs6000/rs6000-protos.h (secondary_reload_class): Update.
* config/rs6000/rs6000.md (movdf_hardfloat64): Remove m->b
alternative and split.
(movdi_internal64): Likewise.
(reload_outdf, reload_indf, reload_outdi, reload_indi): Delete.
2006-02-28 Gabriel Dos Reis <gdr@integrable-solutions.net>
Backport
2004-04-28 Serge Belyshev <1319@bot.ru>
PR 14944
* coverage.c (read_counts_file): Fix usage of warning () call.
* pretty-print.c (pp_base_format_text): Fix typo in the comment.
2006-02-18 Olivier Hainque <hainque@adacore.com>
PR ada/13408
* pa.h (WIDEST_HARDWARE_FP_SIZE): Define.
2006-02-13 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
Backport:
2006-02-01 Steve Ellcey <sje@cup.hp.com>
PR middle-end/24901
* fold-const.c (fold_checksum_tree): Change type of buf.
2006-02-11 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* doc/contrib.texi: Update my entry.
2006-02-09 Eric Botcazou <ebotcazou@libertysurf.fr>
* config/sparc/sparc.c (tls_call_delay): Fix oversight.
2006-02-07 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
PR target/26109
* pa.c (attr_length_indirect_call): Don't return length 8 for distances
>= 240000 when generating code for SOM runtime.
(output_indirect_call): Don't use "b,l" instruction for indirect calls
to $$dyncall when generating code for SOM runtime..
2006-02-02 Nick Clifton <nickc@redhat.com>
PR 24376
* sched-rgn.c (add_branch_dependences): For cc0 targets extend
the dependencies inside a block back to the very first cc0 setter
in the block.
2006-01-21 Joseph S. Myers <joseph@codesourcery.com>
* gcc.c (process_command), gcov.c (print_version), gcov-dump.c
(print_version), mips-tdump.c (main), mips-tfile.c (main): Update
copyright notice dates.
2006-01-12 Kaz Kojima <kkojima@gcc.gnu.org>
PR target/25613
* config/sh/sh.h (CONSTRAINT_LEN): Use unchecking version.
2005-12-30 Roger Sayle <roger@eyesopen.com>
PR target/25213
Backport from mainline
2005-09-06 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/23098
* cse.c (fold_rtx_mem): Call delegitimize_address target hook.
* simplify-rtx.c (constant_pool_reference_p): New function.
* rtl.h (constant_pool_reference_p): New prototype.
* config/i386/i386.md (pushf split, mov[sdx]f split): Use
constant_pool_reference_p in condition and
avoid_constant_pool_reference in preparation statements.
2005-12-30 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
PR fortran/25586
* pa.md: Remove REG_POINTER check from REG+REG peephole2 floating-point
store patterns.
2005-12-29 Alan Modra <amodra@bigpond.net.au>
PR target/25572
* config/rs6000/rs6000.c (create_TOC_reference): Set regs_ever_live.
2005-12-17 Steven Bosscher <stevenb@suse.de>
PR rtl-optimization/23837
* optabs.c (expand_binop): For a multi-word rotate, never emit
a REG_NO_CONFLICT block.
2005-12-16 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
Backport from mainline:
2004-11-01 Mike Stump <mrs@apple.com>
* inclhack.def (stdio_va_list): Break out clients from here...
(stdio_va_list_clients): ...to here. Also, don't fix if stdarg.h is
included or ifdef va_start.
* fixincl.x: Regenerate.
2005-12-13 Alan Modra <amodra@bigpond.net.au>
* config/rs6000/linux64.h (TARGET_ALIGN_NATURAL): Define.
2005-12-10 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
PR target/25258
* pa.c (som_text_section_asm_op): Use .NSUBSPA directive when changing
to the text subspace to output debugging information.
2005-12-06 Alan Modra <amodra@bigpond.net.au>
PR other/13873
* longlong.h: Merge PPC tests from upstream.
2005-12-03 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
PR middle-end/25022
* builtins.c (expand_builtin_fputs, expand_builtin_printf,
expand_builtin_fprintf): Lookup the explicit replacement functions
for any unlocked stdio builtin transformations.
* builtins.c (expand_builtin_fputs): Defer check for missing
replacement functions.
2005-12-02 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/24103
Backport:
2002-08-22 Diego Novillo <dnovillo@redhat.com>
* tree.c (simple_cst_equal): Call simple_cst_list_equal to compare
CONSTRUCTOR_ELTS pointers.
2005-12-01 Gabriel Dos Reis <gdr@integrable-solutions.net>
* version.c: Bump version number.
* doc/include/gcc-common.texi: Likewise.
2005-11-30 Release Manager
* GCC 3.4.5 released.
2005-11-23 Alan Modra <amodra@bigpond.net.au>
PR middle-end/24950
* expmed.c (store_bit_field): Don't attempt to insv a field
larger than the reg.
Merge from trunk
2005-11-14 Dale Johannesen <dalej@apple.com>
* expmed.c (store_bit_field): Add offset unconditionally for
memory targets.
(extract_bit_field): Don't force extzv or extv operand into
a register if field is too big.
2004-12-01 Richard Henderson <rth@redhat.com>
* expmed.c (store_bit_field): Use simplify_gen_subreg instead
of gen_rtx_SUBREG directly.
2005-11-16 Steve Ellcey <sje@cup.hp.com>
PR target/24718
* mklibgcc.in: Create dummy object for libgcc_eh.a
* config/ia64/hpux.h (LIBGCC_SPEC): Remove.
2005-11-13 Andreas Jaeger <aj@suse.de>
* fixinc/check.tpl: Handle CVS additionally.
2005-11-10 Uros Bizjak <uros@kss-loka.si>
PR target/24315
* config/i386/i386.md (*pushdi2_rex64 splitter)
(*movdi_1_rex64 splitter): Delay splitting after
flow2 pass only when (optimize > 0 && flag_peephole2).
2005-11-10 Uros Bizjak <uros@kss-loka.si>
PR target/19340
* reg-stack.c (reg_to_stack): Update register liveness also
for flag_sched2_use_traces.
2005-11-09 Per Bothner <per@bothner.com>
Uros Bizjak <uros@kss-loka.si>
PR c/24101
* toplev.c (process_options): Initialize debug_hooks early
in case lang_hooks.post_options ends up calling a debug_hook.
* cppinit.c (read_original_filename): Temporarily set
state.in_directive before calling _cpp_lex_direct for
CPP_HASH tokens.
2005-11-07 Steve Ellcey <sje@cup.hp.com>
PR bootstrap/24688
* fixinc/inclhack.def (sco_math): Add bypass.
* fixinc/fixincl.x: Regenerate.
2005-11-07 James E Wilson <wilson@specifix.com>
PR preprocessor/15220
* cppfiles.c (_cpp_find_file): New parameter angle_brackets. Fix all
callers. Pass to open_file_failed.
(open_file_failed): New parameter angle_brackets. Fix
all callers. use in print_dep assignment.
* cpphash.h (_cpp_find_file): Add new parm to declaration.
* cppinit.c (cpp_read_main_file): Pass another arg to _cpp_find_file.
2005-11-05 Andreas Jaeger <aj@suse.de>
* fixinc/check.tpl: Adopt for move to subversion.
2005-11-03 Richard Guenther <rguenther@suse.de>
PR middle-end/24470
* fold-const.c (fold): Avoid running in circles if we
got some un-folded subtree.
2005-10-30 Alan Modra <amodra@bigpond.net.au>
PR target/23070
* config/rs6000/rs6000.c (function_arg): For ABI_V4 calls to
stdarg functions, set/clear the fp marker even when no variable
args are passed.
* config/rs6000/sysv4.h (SUBTARGET_SWITCHES): Describe
-mprototype and -mno-prototype.
2005-10-21 Alan Modra <amodra@bigpond.net.au>
PR target/24465
* config/rs6000/rs6000.c (rs6000_legitimize_tls_address): Always
use r2 for 64-bit tls .got access.
2005-10-19 Paolo Bonzini <bonzini@gnu.org>
* dojump.c (do_jump): Revert the last patch as it breaks Ada.
2005-10-19 Paolo Bonzini <bonzini@gnu.org>
PR #19672
* dojump.c (do_jump): Handle TRUTH_AND_EXPR and TRUTH_OR_EXPR
like TRUTH_ANDIF_EXPR and TRUTH_ORIF_EXPR, if the branch cost
is low enough.
2005-10-09 Eric Botcazou <ebotcazou@libertysurf.fr>
* config/sparc/gmon-sol2.c (internal_mcount): Mark as used.
2005-10-08 Janis Johnson <janis187@us.ibm.com>
PR debug/24267
Partial backport from mainline
2004-05-04 Paolo Bonzini <bonzini@gnu.org>
Richard Henderson <rth@redhat.com>
* tree.c (make_or_reuse_type): New.
(build_common_tree_nodes): Use it.
PR target/18583
Partial backport from mainline
2004-05-04 Paolo Bonzini <bonzini@gnu.org>
Richard Henderson <rth@redhat.com>
* c-common.c (vector_types_convertible_p): New function.
* c-common.h: Declare it.
* c-typeck.c (digest_init): Use it.
2005-10-07 James E Wilson <wilson@specifix.com>
PR target/23644
* doc/invoke.texi (IA-64 Options, item -mtune): Renamed from
-mtune-arch.
2005-10-01 Richard Earnshaw <richard.earnshaw@arm.com>
PR target/23985
Back-port 2004-08-19 Richard Henderson <rth@redhat.com>
* config/arm/arm.c (arm_gen_load_multiple): Use
adjust_automodify_address. Take base memory and offset instead
of unchanging/struct/scalar bits.
(arm_gen_store_multiple): Likewise.
(arm_gen_movstrqi): Use adjust_automodify_address.
* config/arm/arm-protos.h: Update decls.
* config/arm/arm.md (load_multiple): Update arm_gen_load_multiple call.
(store_multiple): Similarly.
2005-09-29 Alan Modra <amodra@bigpond.net.au>
PR target/24102
* config/rs6000/rs6000.md (floatdisf2_internal2): Correct range
check for numbers that need no bit twiddle.
2005-09-09 Richard Guenther <rguenther@suse.de>
PR c/20239
* cppinit.c (cpp_read_main_file): Avoid segfaulting on
NULL pfile->map.
2005-09-09 Richard Guenther <rguenther@suse.de>
PR c++/23624
* fold-const.c (fold): Check truth_value_p before calling
invert_truthvalue.
2005-09-08 Craig Rodrigues <rodrigc@gcc.gnu.org>
Backport from mainline
2005-09-01 Craig Rodrigues <rodrigc@gcc.gnu.org>
* c-decl.c (diagnose_mismatched_decls): With -Wredundant-decls,
do not issue warning for a variable definition following
a declaration.
2005-09-02 Richard Sandiford <richard@codesourcery.com>
PR c/22061
* c-decl.c (push_parm_decl): Push and pop x_dont_save_pending_sizes_p
around the call to grokdeclarator. Call grokdeclarator with the
field set to 0.
(store_parm_decls): Always store the pending_sizes in cfun.
(c_expand_body_1): Call put_pending_sizes.
* c-objc-common.c (c_cannot_inline_tree_fn): Always check
pending_sizes.
2005-09-01 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/23478
* regs.h (reg_info): Add throw_calls_crossed.
(REG_N_THROWING_CALLS_CROSSED): Define.
* flow.c (allocate_reg_life_data): Initialize
REG_N_THROWING_CALLS_CROSSED.
(propagate_one_insn, attempt_auto_inc): Update
REG_N_THROWING_CALLS_CROSSED.
* local-alloc.c (struct qty): Add n_throwing_calls_crossed field.
(alloc_qty): Initialize it.
(update_equiv_regs): Clear REG_N_THROWING_CALLS_CROSSED.
(combine_regs): Combine also n_throwing_calls_crossed fields.
(find_free_reg): Don't attempt to caller-save pseudos crossing
calls that might throw.
* global.c (struct allocno): Add throwing_calls_crossed field.
(global_alloc): Initialize throwing_calls_crossed.
(find_reg): Don't attempt to caller-save pseudos crossing calls that
might throw.
2005-09-01 Richard Earnshaw <richard.earnshaw@arm.com>
PR rtl-optimization/17810 target/15342
* regrename.c: Fix polluted patch in previous change.
2005-09-01 Richard Earnshaw <richard.earnshaw@arm.com>
PR rtl-optimization/17810
Backport
2004-11-04 Richard Sandiford <rsandifo@redhat.com>
PR target/15342
* regrename.c (scan_rtx): Treat the destinations of SETs and CLOBBERs
as OP_INOUT if the instruction is predicated.
2005-08-31 David Edelsohn <edelsohn@gnu.org>
PR target/23539
Backport from mainline:
2005-08-27 David Edelsohn <edelsohn@gnu.org>
* config/rs6000/rs6000.c (expand_block_move): Use HImode when
bytes >= 2 not bytes == 2.
2005-08-21 Jakub Jelinek <jakub@redhat.com>
* simplify-rtx.c (simplify_immed_subreg) <case CONST_DOUBLE>: Only
clear up to elem_bitsize bits, not max_bitsize.
2005-07-20 Steve Ellcey <sje@cup.hp.com>
PR target/21841
* doc/invoke.texi (-mgnu-ld): Update description.
(-mhp-ld): Ditto.
2005-08-09 Paolo Bonzini <bonzini@gnu.org>
PR rtl-optimization/17860
* loop.c (check_dbra_loop): Do not try to use an end condition
like "i != 0" in the reversed loop.
2005-08-08 Josh Conner <jconner@apple.com>
PR rtl-optimization/23241
* combine.c (simplify_comparison): Fix error in determining
whether to lift a subreg from comparison.
2005-08-08 Richard Sandiford <richard@codesourcery.com>
PR middle-end/21964
* stmt.c (tail_recursion_args): Insert a call to emit_queue.
2005-08-08 Richard Sandiford <richard@codesourcery.com>
PR c/22458
* c-decl.c (c_begin_compound_stmt): Set the initial body to
error_mark_node, not NULL.
2005-08-07 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
* pa64-regs.h (CONDITIONAL_REGISTER_USAGE): Fix loop upper bound.
2005-08-06 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
PR pch/14940
Backport from mainline:
* config.host (hppa*-*-hpux*, hppa*-*-linux): Define out_host_hook_obj
and host_xmake_file using new host configuration files.
* config/pa/pa-host.c, config/pa/x-hpux, config/pa/x-linux: New files.
2005-08-06 Christian Joensson <christian.joensson@gmail.com>
PR target/20673
Backport from mainline:
2005-04-15 David S. Miller <davem@davemloft.net>
* config/sparc/sparc.h (sparc_hard_reg_printed): Mark as GTY(()).
2005-08-05 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
* pa.c (function_arg): Fix typo in last change.
* pa.c (function_value): Handle small aggregates on 32-bit targets.
(function_arg): Pass small aggregates in general registers on 32-bit
targets.
* som.h (MEMBER_TYPE_FORCES_BLK): Delete define.
2005-08-04 Gerald Pfeifer <gerald@pfeifer.com>
* doc/install.texi (Specific): Adjust link to openavr.org.
(Specific): Remove broken reference to GCC 2.8.1 for OS/2.
(Binaries): Adjust HP-UX Porting Center link.
(Binaries): Adjust Free Software Foundation ordering link.
(Binaries): Remove broken link to Sinix/Reliant Unix binaries.
2005-08-04 Eric Botcazou <ebotcazou@adacore.com>
* doc/invoke.texi (Optimize Options): Document that -funswitch-loops
is enabled at -O3.
2005-08-03 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
PR target/21723
* pa.md: Remove fcpy alternative from movhi and movqi patterns.
* pa32-regs.h (HARD_REGNO_NREGS): Return two floating point registers
for complex modes when generating code for PA 1.0.
(VALID_FP_MODE_P): New macro.
(HARD_REGNO_MODE_OK): Use VALID_FP_MODE_P. Use non-overlapping register
sets for all general and floating point modes. Align wide floating
point modes to even register boundaries to comply with architectural
requirements.
(CLASS_MAX_NREGS): Update to align with change to HARD_REGNO_NREGS.
* pa64-regs.h (HARD_REGNO_NREGS): Update comment and formatting.
(VALID_FP_MODE_P): New macro.
(HARD_REGNO_MODE_OK): Use VALID_FP_MODE_P. Use non-overlapping register
sets for all general and floating point modes. Align wide floating
point modes to even register boundaries to comply with architectural
requirements.
2005-08-03 Richard Sandiford <richard@codesourcery.com>
PR target/18582
* config/i386/i386.c (ix86_expand_unop_builtin): Force the target
to be a register if do_load is true.
2005-08-02 Ian Lance Taylor <ian@airs.com>
PR pch/14400
Backport from mainline:
2005-08-01 Ian Lance Taylor <ian@airs.com>
* config/host-linux.c (linux_gt_pch_get_address): Add new name
randomize_va_space for virtual address randomization control.
2005-02-15 James A. Morrison <phython@gcc.gnu.org>
PR pch/14940
PR target/19300
* config/host-linux.c (linux_gt_pch_use_address): Copy from
config/pa/pa-host.c:pa_gt_pch_use_address.
2004-11-09 James A. Morrison <phython@gcc.gnu.org>
PR pch/14940
* config/host-linux.c (TRY_EMPTY_VM_SPACE): Add __sparc__
definitions.
2004-10-15 Jon Grimm <jgrimm2@us.ibm.com>
* config/host-linux.c (TRY_EMPTY_VM_SPACE): Add __powerpc__
definition.
2004-04-24 Ulrich Weigand <uweigand@de.ibm.com>
* config/host-linux.c (TRY_EMPTY_VM_SPACE): Define for __s390__
and __s390x__ hosts.
2004-04-08 Ian Lance Taylor <ian@wasabisystems.com>
* config/rs6000/host-darwin.c (darwin_rs6000_gt_pch_use_address):
Return 1 if file was successfully mapped.
2004-03-15 Ian Lance Taylor <ian@wasabisystems.com>
* config/rs6000/host-darwin.c (darwin_rs6000_gt_pch_use_address):
Fix the check for abort and only do the mmap if we can.
2004-03-12 Andrew Pinski <apinski@apple.com>
* config/rs6000/host-darwin.c (darwin_rs6000_gt_pch_use_address):
Use ret instead of result. Use addr instead of base.
2004-03-10 Richard Henderson <rth@redhat.com>
* c-pch.c (c_common_no_more_pch): Update for gt_pch_use_address
extra arguments.
* config.host (*-*-solaris2*, *-*-linux*): Add out_host_hook_obj
and host_xmake_file fragments.
* ggc-common.c (gt_pch_save): Update for gt_pch_get_address change.
(gt_pch_restore): Similarly for gt_pch_use_address.
(default_gt_pch_get_address): New.
(mmap_gt_pch_get_address): Split out of gt_pch_save.
(default_gt_pch_use_address): Split out of gt_pch_restore.
(mmap_gt_pch_use_address): Likewise.
* hooks.c (hook_voidp_size_t_null): Remove.
(hook_bool_voidp_size_t_false): Remove.
* hooks.h: Likewise.
* hosthooks-def.h (HOST_HOOKS_GT_PCH_GET_ADDRESS): Use one of the
default_ or mmap_ definitions.
(HOST_HOOKS_GT_PCH_USE_ADDRESS): Likewise.
* hosthooks.h (struct host_hooks): Update gt_pch_get_address
and gt_pch_use_address.
* config/host-linux.c, config/host-solaris.c: New files.
* config/x-linux, config/x-solaris: New files.
* config/rs6000/host-darwin.c darwin_rs6000_gt_pch_get_address):
Update for changed definition.
(darwin_rs6000_gt_pch_use_address): Likewise.
* doc/hostconfig.texi: Update docs.
2005-07-31 Richard Sandiford <richard@codesourcery.com>
PR target/20621
Backport from mainline:
2004-08-01 Richard Sandiford <rsandifo@redhat.com>
* config/mips/mips.md (cprestore): Provide two alternatives, one for
an in-range offset and one for an out-of-range offset. Wrap the latter
in .set macro/.set nomacro if it's inside a .set nomacro block.
2004-08-01 Richard Sandiford <rsandifo@redhat.com>
* config/mips/mips-protos.h (mips_gp_save_slot): Remove.
(mips_restore_gp): Declare.
* config/mips/mips.c (mips_add_offset): Add a scratch register
argument. Reimplement in rtl only, reusing MIPS16 logic from
mips_output_mi_thunk.
(mips_legitimize_address, mips_legitimize_const_move): Adjust calls
to mips_add_offset.
(mips_gp_save_slot): Delete.
(mips_restore_gp): New function.
(mips_set_return_address, mips_output_mi_thunk): Use mips_add_offset.
* config/mips/mips.md (exception_receiver): Turn into a
define_insn_and_split. Use mips_restore_gp to do the split.
(call_internal, call_value_internal, call_value_multiple_internal): Use
mips_restore_gp to restore $gp.
2005-07-29 Alan Modra <amodra@bigpond.net.au>
* config/rs6000/sysv4.h (TARGET_ASM_EXCEPTION_SECTION): Delete.
2005-07-28 Richard Henderson <rth@redhat.com>
PR rtl-opt/22619
* cfgcleanup.c (try_forward_edges): Watch out for end of
insn chain.
2005-07-28 Joseph S. Myers <joseph@codesourcery.com>
PR c/17188
PR c/21899
* c-decl.c (diagnose_mismatched_decls): Check for duplicate
declarations of enumerators.
(start_struct): Check TYPE_SIZE rather than TYPE_FIELDS to check
for redefinition. Check for nested redefinition.
(finish_struct): Don't check for nested redefinition.
(start_enum): Check for nested redefinition.
2005-07-28 Joseph S. Myers <joseph@codesourcery.com>
PR c/21873
* c-typeck.c (push_init_level): Don't pop levels without braces if
implicit == 1.
2005-07-28 Gerald Pfeifer <gerald@pfeifer.com>
* doc/install.texi (Configuration): Update Valgrind homepage.
2005-07-28 Richard Sandiford <richard@codesourcery.com>
PR c/20187
* fold-const.c (fold): When shortening comparisons of widened operands,
check whether the tree returned by get_unwidened really is wider.
2005-07-28 Richard Sandiford <richard@codesourcery.com>
PR c/22589
Backport from mainline:
2004-06-16 Alexandre Oliva <aoliva@redhat.com>
* tree.c (get_narrower): Don't narrow integral types into
non-integral types.
2005-07-26 Bernardo Innocenti <bernie@develer.com>
Backport from mainline:
2005-07-12 Peter Barada <peter@the-baradas.com>
PR middle-end/16719
PR middle-end/18421
* config/m68k/m68k.h (HARD_REGNO_MODE_OK): Disallow bytes
in address registers.
* config/m68k/m68k.c (hard_regno_mode_ok): Likewise.
* config/m68k/m68k.md: Replace 's' with 'i' in 4th
alternative of addsi3_5200.
2005-07-21 Janis Johnson <janis187@us.ibm.com>
PR target/20191
Backport from mainline:
2004-04-23 Dale Johannesen <dalej@apple.com>
* config/rs6000.md (movsf_hardfloat): Add POWER form of nop.
(movdf_hardfloat64): Ditto.
(movdf_softfloat64): Ditto.
* config/rs6000.md (movsf_hardfloat): Accept CTR-to-CTR copy.
(movdf_hardfloat64): Ditto.
2005-07-21 Richard Sandiford <richard@codesourcery.com>
PR rtl-optimization/22167
* gcse.c (hoist_code): Fix hoist_exprs[] check.
2005-07-19 Gerald Pfeifer <gerald@pfeifer.com>
* config.gcc: Add support for *-*-freebsd7, *-*-freebsd8,
and *-*-freebsd9.
* config/freebsd-spec.h (FBSD_TARGET_OS_CPP_BUILTINS): Ditto.
2005-07-09 Jakub Jelinek <jakub@redhat.com>
* config/i386/i386.c (output_set_got): Don't omit OFFSET FLAT:
in Intel syntax add %reg, OFFSET FLAT:_GLOBAL_OFFSET_TABLE_+(.-.Lx).
2005-07-08 David Edelsohn <edelsohn@gnu.org>
Backport from mainline:
2005-06-18 Roger Sayle <roger@eyesopen.com>
PR target/22083
* config/rs6000/aix51.h (TARGET_C99_FUNCTIONS): Remove definition.
2005-07-05 Joseph S. Myers <joseph@codesourcery.com>
PR c/22308
* c-decl.c (finish_struct): Also copy C_TYPE_FIELDS_READONLY,
C_TYPE_FIELDS_VOLATILE and C_TYPE_VARIABLE_SIZE to type variants.
2005-06-14 Eric Botcazou <ebotcazou@libertysurf.fr>
PR target/20301
* config/sparc/sol2.h (ASM_GENERATE_INTERNAL_LABEL): Emit
unsigned index numbers.
2005-06-08 Eric Botcazou <ebotcazou@libertysurf.fr>
PR target/21889
* config/sparc/sol2.h (ASM_OUTPUT_DWARF_DTPREL): Undefine.
* config/sparc/sol2-gas.h (ASM_OUTPUT_DWARF_DTPREL): Redefine.
2005-06-04 Richard Henderson <rth@redhat.com>
PR target/21888
* config/alpha/alpha.c (alpha_align_insns): Don't insert nops
until we've passed initial ldgp.
2005-06-01 Richard Henderson <rth@redhat.com>
* configure.ac (HAVE_AS_JSRDIRECT_RELOCS): New.
* config.in, configure: Rebuild.
* config/alpha/alpha.c (print_operand): Add 'j'.
* alpha.md (divmodsi_internal_er_1): Use it.
(divmoddi_internal_er_1): Likewise.
2005-05-31 Eric Botcazou <ebotcazou@libertysurf.fr>
* doc/install.texi (sparc-sun-solaris2*): Update note
about Sun bug 4910101.
2005-05-29 Eric Botcazou <ebotcazou@libertysurf.fr>
PR target/19933
* fixinc/inclhack.def (solaris_math_6_1): New fix.
(solaris_math_9): Rewrite and guard with #ifdef __sparc__.
* fixinc/fixincl.x: Regenerate.
* fixinc/tests/base/iso/math_c99.h: Adjust for above changes.
Backport from mainline:
2005-05-19 Eric Botcazou <ebotcazou@libertysurf.fr>
Joseph S. Myers <joseph@codesourcery.com>
* fixinc/inclhack.def: New fixes solaris_math_[1-9].
* fixinc/fixincl.x: Regenerate.
* fixinc/tests/base/iso/math_c99.h: New.
Backport from mainline:
2005-05-10 Joseph S. Myers <joseph@codesourcery.com>
* fixinc/inclhack.def (stdio_stdarg_h, stdio_va_list): Bypass on
*-*-solaris2.1[0-9]*, not just *-*-solaris2.1[0-9].
* fixinc/fixincl.x: Regenerate.
Backport from mainline:
2004-11-26 Mark Mitchell <mark@codesourcery.com>
* fixinc/inclhack.def (gnu_types): Do not use on Solaris 2.1x.
(stdio_va_list): Likewise.
(stdio_stdarg.h): Likewise.
(solaris_stdio_tag): Add bypass.
* fixinc/fixincl.x: Regenerated.
2005-05-26 Jakub Jelinek <jakub@redhat.com>
PR target/21716
* reg-stack.c (swap_rtx_condition): Don't crash if %ax user was not
found in the basic block and last insn in the basic block is not
INSN_P. Remove explicit unspec numbers that are no longer valid
from comments.
2005-05-25 Roger Sayle <roger@eyesopen.com>
PR middle-end/21709
* fold-const.c (const_binop): Check for division by zero during
complex division.
2005-05-24 Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com>
* config/m32r/m32r.c (m32r_expand_block_move): Return 0 if
nothing was done.
* config/m32r/m32r.md (movmemsi): If m32r_expand_block_move did
nothing then FAIL.
* config/m32r/m32r/m32r-protos.h (m32r_expand_block_move): Update
prototype.
2005-05-23 Ulrich Weigand <uweigand@de.ibm.com>
* unroll.c (loop_iterations): Remove common term from initial
and final value only if it is loop invariant.
2005-05-20 Mark Mitchell <mark@codesourcery.com>
* version.c (version_string): Mark as 3.4.5.
2005-05-19 Mark Mitchell <mark@codesourcery.com>
* version.c (version_string): Restore pre-release marker.
2005-05-19 Release Manager
* GCC 3.4.4 released.
@ -87,7 +906,7 @@
(m68hc11_split_move): Likewise.
2005-05-06 Bruce Korb <bkorb@gnu.org>
Joseph S. Myers <joseph@codesourcery.com>
Joseph S. Myers <joseph@codesourcery.com>
* fixinc/inclhack.def: Correct backslashes
* fixinc/fixincl.x: regen

View File

@ -305,6 +305,15 @@ So instead we use the macro below and test it against specific values. */
# define ATTRIBUTE_NULL_PRINTF_5 ATTRIBUTE_NULL_PRINTF(5, 6)
#endif /* ATTRIBUTE_NULL_PRINTF */
#ifndef ATTRIBUTE_ALIGNED_ALIGNOF
# if (GCC_VERSION >= 3000)
# define ATTRIBUTE_ALIGNED_ALIGNOF(m) __attribute__ ((__aligned__ (__alignof__ (m))))
# else
# define ATTRIBUTE_ALIGNED_ALIGNOF(m)
# endif /* GNUC >= 3.0 */
#endif /* ATTRIBUTE_ALIGNED_ALIGNOF */
/* We use __extension__ in some places to suppress -pedantic warnings
about GCC extensions. This feature didn't work properly before
gcc 2.8. */

View File

@ -4329,14 +4329,15 @@ static rtx
expand_builtin_fputs (tree arglist, rtx target, bool unlocked)
{
tree len, fn;
tree fn_fputc = unlocked ? implicit_built_in_decls[BUILT_IN_FPUTC_UNLOCKED]
/* If we're using an unlocked function, assume the other unlocked
functions exist explicitly. */
tree const fn_fputc = unlocked ? built_in_decls[BUILT_IN_FPUTC_UNLOCKED]
: implicit_built_in_decls[BUILT_IN_FPUTC];
tree fn_fwrite = unlocked ? implicit_built_in_decls[BUILT_IN_FWRITE_UNLOCKED]
tree const fn_fwrite = unlocked ? built_in_decls[BUILT_IN_FWRITE_UNLOCKED]
: implicit_built_in_decls[BUILT_IN_FWRITE];
/* If the return value is used, or the replacement _DECL isn't
initialized, don't do the transformation. */
if (target != const0_rtx || !fn_fputc || !fn_fwrite)
/* If the return value is used, don't do the transformation. */
if (target != const0_rtx)
return 0;
/* Verify the arguments in the original call. */
@ -4397,6 +4398,11 @@ expand_builtin_fputs (tree arglist, rtx target, bool unlocked)
abort ();
}
/* If the replacement _DECL isn't initialized, don't do the
transformation. */
if (!fn)
return 0;
return expand_expr (build_function_call_expr (fn, arglist),
const0_rtx, VOIDmode, EXPAND_NORMAL);
}
@ -4651,11 +4657,12 @@ static rtx
expand_builtin_printf (tree arglist, rtx target, enum machine_mode mode,
bool unlocked)
{
tree fn_putchar = unlocked
? implicit_built_in_decls[BUILT_IN_PUTCHAR_UNLOCKED]
: implicit_built_in_decls[BUILT_IN_PUTCHAR];
tree fn_puts = unlocked ? implicit_built_in_decls[BUILT_IN_PUTS_UNLOCKED]
: implicit_built_in_decls[BUILT_IN_PUTS];
/* If we're using an unlocked function, assume the other unlocked
functions exist explicitly. */
tree const fn_putchar = unlocked ? built_in_decls[BUILT_IN_PUTCHAR_UNLOCKED]
: implicit_built_in_decls[BUILT_IN_PUTCHAR];
tree const fn_puts = unlocked ? built_in_decls[BUILT_IN_PUTS_UNLOCKED]
: implicit_built_in_decls[BUILT_IN_PUTS];
const char *fmt_str;
tree fn, fmt, arg;
@ -4754,10 +4761,12 @@ static rtx
expand_builtin_fprintf (tree arglist, rtx target, enum machine_mode mode,
bool unlocked)
{
tree fn_fputc = unlocked ? implicit_built_in_decls[BUILT_IN_FPUTC_UNLOCKED]
: implicit_built_in_decls[BUILT_IN_FPUTC];
tree fn_fputs = unlocked ? implicit_built_in_decls[BUILT_IN_FPUTS_UNLOCKED]
: implicit_built_in_decls[BUILT_IN_FPUTS];
/* If we're using an unlocked function, assume the other unlocked
functions exist explicitly. */
tree const fn_fputc = unlocked ? built_in_decls[BUILT_IN_FPUTC_UNLOCKED]
: implicit_built_in_decls[BUILT_IN_FPUTC];
tree const fn_fputs = unlocked ? built_in_decls[BUILT_IN_FPUTS_UNLOCKED]
: implicit_built_in_decls[BUILT_IN_FPUTS];
const char *fmt_str;
tree fn, fmt, fp, arg;

View File

@ -1273,6 +1273,18 @@ constant_fits_type_p (tree c, tree type)
return !TREE_OVERFLOW (c);
}
/* Nonzero if vector types T1 and T2 can be converted to each other
without an explicit cast. */
int
vector_types_convertible_p (tree t1, tree t2)
{
return targetm.vector_opaque_p (t1)
|| targetm.vector_opaque_p (t2)
|| (tree_int_cst_equal (TYPE_SIZE (t1), TYPE_SIZE (t2))
&& INTEGRAL_TYPE_P (TREE_TYPE (t1))
== INTEGRAL_TYPE_P (TREE_TYPE (t2)));
}
/* Convert EXPR to TYPE, warning about conversion problems with constants.
Invoke this function on every expression that is converted implicitly,
i.e. because of language rules and not because of an explicit cast. */

View File

@ -1261,6 +1261,8 @@ extern tree finish_label_address_expr (tree);
different implementations. Used in c-common.c. */
extern tree lookup_label (tree);
extern int vector_types_convertible_p (tree t1, tree t2);
extern rtx c_expand_expr (tree, rtx, enum machine_mode, int, rtx *);
extern int c_safe_from_p (rtx, tree);

View File

@ -955,6 +955,15 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
return false;
}
/* Enumerators have no linkage, so may only be declared once in a
given scope. */
if (TREE_CODE (olddecl) == CONST_DECL)
{
error ("%Jredeclaration of enumerator `%D'", newdecl, newdecl);
locate_old_decl (olddecl, error);
return false;
}
if (!comptypes (oldtype, newtype, COMPARE_STRICT))
{
if (TREE_CODE (olddecl) == FUNCTION_DECL
@ -1262,7 +1271,10 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
&& !(DECL_EXTERNAL (olddecl) && !DECL_EXTERNAL (newdecl))
/* Don't warn about forward parameter decls. */
&& !(TREE_CODE (newdecl) == PARM_DECL
&& TREE_ASM_WRITTEN (olddecl) && !TREE_ASM_WRITTEN (newdecl)))
&& TREE_ASM_WRITTEN (olddecl) && !TREE_ASM_WRITTEN (newdecl))
/* Don't warn about a variable definition following a declaration. */
&& !(TREE_CODE (newdecl) == VAR_DECL
&& DECL_INITIAL (newdecl) && !DECL_INITIAL (olddecl)))
{
warning ("%Jredundant redeclaration of '%D'", newdecl, newdecl);
warned = true;
@ -2951,12 +2963,21 @@ void
push_parm_decl (tree parm)
{
tree decl;
int old_dont_save_pending_sizes_p = 0;
/* Don't attempt to expand sizes while parsing this decl.
(We can get here with i_s_e 1 somehow from Objective-C.) */
int save_immediate_size_expand = immediate_size_expand;
immediate_size_expand = 0;
/* If this is a nested function, we do want to keep SAVE_EXPRs for
the argument sizes, regardless of the parent's setting. */
if (cfun)
{
old_dont_save_pending_sizes_p = cfun->x_dont_save_pending_sizes_p;
cfun->x_dont_save_pending_sizes_p = 0;
}
decl = grokdeclarator (TREE_VALUE (TREE_PURPOSE (parm)),
TREE_PURPOSE (TREE_PURPOSE (parm)),
PARM, 0, NULL);
@ -2966,6 +2987,8 @@ push_parm_decl (tree parm)
finish_decl (decl, NULL_TREE, NULL_TREE);
if (cfun)
cfun->x_dont_save_pending_sizes_p = old_dont_save_pending_sizes_p;
immediate_size_expand = save_immediate_size_expand;
}
@ -4779,13 +4802,22 @@ start_struct (enum tree_code code, tree name)
ref = lookup_tag (code, name, 1);
if (ref && TREE_CODE (ref) == code)
{
if (TYPE_FIELDS (ref))
if (TYPE_SIZE (ref))
{
if (code == UNION_TYPE)
error ("redefinition of `union %s'", IDENTIFIER_POINTER (name));
else
error ("redefinition of `struct %s'", IDENTIFIER_POINTER (name));
}
else if (C_TYPE_BEING_DEFINED (ref))
{
if (code == UNION_TYPE)
error ("nested redefinition of `union %s'",
IDENTIFIER_POINTER (name));
else
error ("nested redefinition of `struct %s'",
IDENTIFIER_POINTER (name));
}
}
else
{
@ -5000,11 +5032,6 @@ finish_struct (tree t, tree fieldlist, tree attributes)
if (C_DECL_VARIABLE_SIZE (x))
C_TYPE_VARIABLE_SIZE (t) = 1;
/* Detect invalid nested redefinition. */
if (TREE_TYPE (x) == t)
error ("nested redefinition of `%s'",
IDENTIFIER_POINTER (TYPE_NAME (t)));
if (DECL_INITIAL (x))
{
unsigned HOST_WIDE_INT width = tree_low_cst (DECL_INITIAL (x), 1);
@ -5126,6 +5153,9 @@ finish_struct (tree t, tree fieldlist, tree attributes)
TYPE_LANG_SPECIFIC (x) = TYPE_LANG_SPECIFIC (t);
TYPE_ALIGN (x) = TYPE_ALIGN (t);
TYPE_USER_ALIGN (x) = TYPE_USER_ALIGN (t);
C_TYPE_FIELDS_READONLY (x) = C_TYPE_FIELDS_READONLY (t);
C_TYPE_FIELDS_VOLATILE (x) = C_TYPE_FIELDS_VOLATILE (t);
C_TYPE_VARIABLE_SIZE (x) = C_TYPE_VARIABLE_SIZE (t);
}
/* If this was supposed to be a transparent union, but we can't
@ -5199,6 +5229,9 @@ start_enum (tree name)
pushtag (name, enumtype);
}
if (C_TYPE_BEING_DEFINED (enumtype))
error ("nested redefinition of `enum %s'", IDENTIFIER_POINTER (name));
C_TYPE_BEING_DEFINED (enumtype) = 1;
if (TYPE_VALUES (enumtype) != 0)
@ -5971,9 +6004,6 @@ store_parm_decls (void)
{
tree fndecl = current_function_decl;
/* The function containing FNDECL, if any. */
tree context = decl_function_context (fndecl);
/* True if this definition is written with a prototype. */
bool prototype = (current_function_parms
&& TREE_CODE (current_function_parms) != TREE_LIST);
@ -5998,20 +6028,9 @@ store_parm_decls (void)
/* Begin the statement tree for this function. */
begin_stmt_tree (&DECL_SAVED_TREE (fndecl));
/* If this is a nested function, save away the sizes of any
variable-size types so that we can expand them when generating
RTL. */
if (context)
{
tree t;
DECL_LANG_SPECIFIC (fndecl)->pending_sizes
= nreverse (get_pending_sizes ());
for (t = DECL_LANG_SPECIFIC (fndecl)->pending_sizes;
t;
t = TREE_CHAIN (t))
SAVE_EXPR_CONTEXT (TREE_VALUE (t)) = context;
}
/* Save away the sizes of any variable-size types so that we can
expand them when generating RTL. */
DECL_LANG_SPECIFIC (fndecl)->pending_sizes = get_pending_sizes ();
/* This function is being processed in whole-function mode. */
cfun->x_whole_function_mode_p = 1;
@ -6162,15 +6181,12 @@ static void
c_expand_body_1 (tree fndecl, int nested_p)
{
if (nested_p)
{
/* Make sure that we will evaluate variable-sized types involved
in our function's type. */
expand_pending_sizes (DECL_LANG_SPECIFIC (fndecl)->pending_sizes);
/* Squirrel away our current state. */
push_function_context ();
}
/* Squirrel away our current state. */
push_function_context ();
/* Make sure that we will evaluate variable-sized types involved
in our function's type. */
put_pending_sizes (DECL_LANG_SPECIFIC (fndecl)->pending_sizes);
tree_rest_of_compilation (fndecl, nested_p);
if (nested_p)
@ -6391,7 +6407,7 @@ c_begin_compound_stmt (void)
tree stmt;
/* Create the COMPOUND_STMT. */
stmt = add_stmt (build_stmt (COMPOUND_STMT, NULL_TREE));
stmt = add_stmt (build_stmt (COMPOUND_STMT, error_mark_node));
return stmt;
}

View File

@ -118,17 +118,12 @@ c_cannot_inline_tree_fn (tree *fnp)
}
}
if (! DECL_FILE_SCOPE_P (fn))
if (DECL_LANG_SPECIFIC (fn)->pending_sizes)
{
/* If a nested function has pending sizes, we may have already
saved them. */
if (DECL_LANG_SPECIFIC (fn)->pending_sizes)
{
if (do_warning)
warning ("%Jnested function '%F' can never be inlined because it "
"has possibly saved pending sizes", fn, fn);
goto cannot_inline;
}
if (do_warning)
warning ("%Jfunction '%F' can never be inlined because it has "
"pending sizes", fn, fn);
goto cannot_inline;
}
return 0;

View File

@ -428,6 +428,6 @@ c_common_no_more_pch (void)
if (cpp_get_callbacks (parse_in)->valid_pch)
{
cpp_get_callbacks (parse_in)->valid_pch = NULL;
host_hooks.gt_pch_use_address (NULL, 0);
host_hooks.gt_pch_use_address (NULL, 0, -1, 0);
}
}

View File

@ -4098,7 +4098,8 @@ digest_init (tree type, tree init, int require_constant)
vector constructor is not constant (e.g. {1,2,3,foo()}) then punt
below and handle as a constructor. */
if (code == VECTOR_TYPE
&& comptypes (TREE_TYPE (inside_init), type, COMPARE_STRICT)
&& TREE_CODE (TREE_TYPE (inside_init)) == VECTOR_TYPE
&& vector_types_convertible_p (TREE_TYPE (inside_init), type)
&& TREE_CONSTANT (inside_init))
{
if (TREE_CODE (inside_init) == VECTOR_CST
@ -4634,19 +4635,27 @@ push_init_level (int implicit)
tree value = NULL_TREE;
/* If we've exhausted any levels that didn't have braces,
pop them now. */
while (constructor_stack->implicit)
pop them now. If implicit == 1, this will have been done in
process_init_element; do not repeat it here because in the case
of excess initializers for an empty aggregate this leads to an
infinite cycle of popping a level and immediately recreating
it. */
if (implicit != 1)
{
if ((TREE_CODE (constructor_type) == RECORD_TYPE
|| TREE_CODE (constructor_type) == UNION_TYPE)
&& constructor_fields == 0)
process_init_element (pop_init_level (1));
else if (TREE_CODE (constructor_type) == ARRAY_TYPE
&& constructor_max_index
&& tree_int_cst_lt (constructor_max_index, constructor_index))
process_init_element (pop_init_level (1));
else
break;
while (constructor_stack->implicit)
{
if ((TREE_CODE (constructor_type) == RECORD_TYPE
|| TREE_CODE (constructor_type) == UNION_TYPE)
&& constructor_fields == 0)
process_init_element (pop_init_level (1));
else if (TREE_CODE (constructor_type) == ARRAY_TYPE
&& constructor_max_index
&& tree_int_cst_lt (constructor_max_index,
constructor_index))
process_init_element (pop_init_level (1));
else
break;
}
}
/* Unless this is an explicit brace, we need to preserve previous

View File

@ -521,7 +521,7 @@ try_forward_edges (int mode, basic_block b)
&& NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
break;
if (GET_CODE (insn) == NOTE)
if (insn && GET_CODE (insn) == NOTE)
break;
/* Do not clean up branches to just past the end of a loop

View File

@ -10739,7 +10739,7 @@ simplify_comparison (enum rtx_code code, rtx *pop0, rtx *pop1)
/* (A - C1) always sign-extends, like C2. */
&& num_sign_bit_copies (a, inner_mode)
> (unsigned int) (GET_MODE_BITSIZE (inner_mode)
- mode_width - 1)))
- (mode_width - 1))))
{
op0 = SUBREG_REG (op0);
continue;

View File

@ -406,6 +406,12 @@ case ${target} in
tm_defines="${tm_defines} FBSD_MAJOR=5" ;;
*-*-freebsd6 | *-*-freebsd[6].*)
tm_defines="${tm_defines} FBSD_MAJOR=6" ;;
*-*-freebsd7 | *-*-freebsd[7].*)
tm_defines="${tm_defines} FBSD_MAJOR=7" ;;
*-*-freebsd8 | *-*-freebsd[8].*)
tm_defines="${tm_defines} FBSD_MAJOR=8" ;;
*-*-freebsd9 | *-*-freebsd[9].*)
tm_defines="${tm_defines} FBSD_MAJOR=9" ;;
*)
echo 'Please update *-*-freebsd* in gcc/config.gcc'
exit 1

View File

@ -103,7 +103,12 @@ case ${host} in
hppa1.0-*-hpux10* | hppa1.1-*-hpux10* | hppa2*-*-hpux10* | \
hppa1.0-*-hpux11* | hppa1.1-*-hpux11* | hppa2*-*-hpux11* | \
hppa*64*-*-hpux11*)
host_xmake_file="pa/x-ada"
out_host_hook_obj=pa-host.o
host_xmake_file=pa/x-hpux
;;
hppa*-*-linux*)
out_host_hook_obj=pa-host.o
host_xmake_file=pa/x-linux
;;
i370-*-opened* | i370-*-mvs* ) # IBM 360/370/390 Architecture
host_xm_defines='FATAL_EXIT_CODE=12'
@ -113,6 +118,8 @@ case ${host} in
;;
i[34567]86-*-solaris2*)
host_xm_defines="SMALL_ARG_MAX"
out_host_hook_obj=host-solaris.o
host_xmake_file=x-solaris
;;
i[34567]86-*-sysv4*) # Intel 80386's running System V Release 4
host_xm_defines="SMALL_ARG_MAX"
@ -152,4 +159,12 @@ case ${host} in
out_host_hook_obj=host-darwin.o
host_xmake_file=rs6000/x-darwin
;;
*-*-solaris2*)
out_host_hook_obj=host-solaris.o
host_xmake_file=x-solaris
;;
*-*-linux*)
out_host_hook_obj=host-linux.o
host_xmake_file=x-linux
;;
esac

View File

@ -97,6 +97,9 @@
/* Define if your assembler supports the Sun syntax for cmov. */
#undef HAVE_AS_IX86_CMOV_SUN_SYNTAX
/* Define if your assembler supports the lituse_jsrdirect relocation. */
#undef HAVE_AS_JSRDIRECT_RELOCS
/* Define if your assembler supports .sleb128 and .uleb128. */
#undef HAVE_AS_LEB128

View File

@ -5469,6 +5469,21 @@ print_operand (FILE *file, rtx x, int code)
}
break;
case 'j':
{
const char *lituse;
#ifdef HAVE_AS_JSRDIRECT_RELOCS
lituse = "lituse_jsrdirect";
#else
lituse = "lituse_jsr";
#endif
if (INTVAL (x) == 0)
abort ();
fprintf (file, "\t\t!%s!%d", lituse, (int) INTVAL (x));
}
break;
case 'r':
/* If this operand is the constant zero, write it as "$31". */
if (GET_CODE (x) == REG)
@ -8814,7 +8829,7 @@ alpha_align_insns (unsigned int max_align,
unsigned int align;
/* OFS is the offset of the current insn in the insn group. */
int ofs;
int prev_in_use, in_use, len;
int prev_in_use, in_use, len, ldgp;
rtx i, next;
/* Let shorten branches care for assigning alignments to code labels. */
@ -8832,6 +8847,8 @@ alpha_align_insns (unsigned int max_align,
if (GET_CODE (i) == NOTE)
i = next_nonnote_insn (i);
ldgp = alpha_function_needs_gp ? 8 : 0;
while (i)
{
next = (*next_group) (i, &in_use, &len);
@ -8888,6 +8905,10 @@ alpha_align_insns (unsigned int max_align,
}
}
/* We may not insert padding inside the initial ldgp sequence. */
else if (ldgp > 0)
ldgp -= len;
/* If the group won't fit in the same INT16 as the previous,
we need to add padding to keep the group together. Rather
than simply leaving the insn filling to the assembler, we

View File

@ -967,7 +967,7 @@
(clobber (reg:DI 23))
(clobber (reg:DI 28))]
"TARGET_EXPLICIT_RELOCS && ! TARGET_ABI_OPEN_VMS"
"ldq $27,__%E3($29)\t\t!literal!%#\;jsr $23,($27),__%E3\t\t!lituse_jsr!%#"
"#"
"&& reload_completed"
[(parallel [(set (match_dup 0)
(sign_extend:DI (match_dup 3)))
@ -1012,7 +1012,7 @@
(clobber (reg:DI 23))
(clobber (reg:DI 28))]
"TARGET_EXPLICIT_RELOCS && ! TARGET_ABI_OPEN_VMS"
"jsr $23,($27),__%E3%J5"
"jsr $23,($27),__%E3%j5"
[(set_attr "type" "jsr")
(set_attr "length" "4")])
@ -1036,7 +1036,7 @@
(clobber (reg:DI 23))
(clobber (reg:DI 28))]
"TARGET_EXPLICIT_RELOCS && ! TARGET_ABI_OPEN_VMS"
"ldq $27,__%E3($29)\t\t!literal!%#\;jsr $23,($27),__%E3\t\t!lituse_jsr!%#"
"#"
"&& reload_completed"
[(parallel [(set (match_dup 0) (match_dup 3))
(use (match_dup 0))
@ -1080,7 +1080,7 @@
(clobber (reg:DI 23))
(clobber (reg:DI 28))]
"TARGET_EXPLICIT_RELOCS && ! TARGET_ABI_OPEN_VMS"
"jsr $23,($27),__%E3%J5"
"jsr $23,($27),__%E3%j5"
[(set_attr "type" "jsr")
(set_attr "length" "4")])

View File

@ -105,8 +105,10 @@ extern int load_multiple_sequence (rtx *, int, int *, int *, HOST_WIDE_INT *);
extern const char *emit_ldm_seq (rtx *, int);
extern int store_multiple_sequence (rtx *, int, int *, int *, HOST_WIDE_INT *);
extern const char * emit_stm_seq (rtx *, int);
extern rtx arm_gen_load_multiple (int, int, rtx, int, int, int, int, int);
extern rtx arm_gen_store_multiple (int, int, rtx, int, int, int, int, int);
extern rtx arm_gen_load_multiple (int, int, rtx, int, int,
rtx, HOST_WIDE_INT *);
extern rtx arm_gen_store_multiple (int, int, rtx, int, int,
rtx, HOST_WIDE_INT *);
extern int arm_gen_movstrqi (rtx *);
extern rtx arm_gen_rotated_half_load (rtx);
extern enum machine_mode arm_select_cc_mode (RTX_CODE, rtx, rtx);

View File

@ -5158,13 +5158,13 @@ multi_register_push (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
rtx
arm_gen_load_multiple (int base_regno, int count, rtx from, int up,
int write_back, int unchanging_p, int in_struct_p,
int scalar_p)
int write_back, rtx basemem, HOST_WIDE_INT *offsetp)
{
HOST_WIDE_INT offset = *offsetp;
int i = 0, j;
rtx result;
int sign = up ? 1 : -1;
rtx mem;
rtx mem, addr;
/* XScale has load-store double instructions, but they have stricter
alignment requirements than load-store multiple, so we can not
@ -5202,15 +5202,17 @@ arm_gen_load_multiple (int base_regno, int count, rtx from, int up,
for (i = 0; i < count; i++)
{
mem = gen_rtx_MEM (SImode, plus_constant (from, i * 4 * sign));
RTX_UNCHANGING_P (mem) = unchanging_p;
MEM_IN_STRUCT_P (mem) = in_struct_p;
MEM_SCALAR_P (mem) = scalar_p;
addr = plus_constant (from, i * 4 * sign);
mem = adjust_automodify_address (basemem, SImode, addr, offset);
emit_move_insn (gen_rtx_REG (SImode, base_regno + i), mem);
offset += 4 * sign;
}
if (write_back)
emit_move_insn (from, plus_constant (from, count * 4 * sign));
{
emit_move_insn (from, plus_constant (from, count * 4 * sign));
*offsetp = offset;
}
seq = get_insns ();
end_sequence ();
@ -5231,26 +5233,28 @@ arm_gen_load_multiple (int base_regno, int count, rtx from, int up,
for (j = 0; i < count; i++, j++)
{
mem = gen_rtx_MEM (SImode, plus_constant (from, j * 4 * sign));
RTX_UNCHANGING_P (mem) = unchanging_p;
MEM_IN_STRUCT_P (mem) = in_struct_p;
MEM_SCALAR_P (mem) = scalar_p;
addr = plus_constant (from, j * 4 * sign);
mem = adjust_automodify_address_nv (basemem, SImode, addr, offset);
XVECEXP (result, 0, i)
= gen_rtx_SET (VOIDmode, gen_rtx_REG (SImode, base_regno + j), mem);
offset += 4 * sign;
}
if (write_back)
*offsetp = offset;
return result;
}
rtx
arm_gen_store_multiple (int base_regno, int count, rtx to, int up,
int write_back, int unchanging_p, int in_struct_p,
int scalar_p)
int write_back, rtx basemem, HOST_WIDE_INT *offsetp)
{
HOST_WIDE_INT offset = *offsetp;
int i = 0, j;
rtx result;
int sign = up ? 1 : -1;
rtx mem;
rtx mem, addr;
/* See arm_gen_load_multiple for discussion of
the pros/cons of ldm/stm usage for XScale. */
@ -5262,15 +5266,17 @@ arm_gen_store_multiple (int base_regno, int count, rtx to, int up,
for (i = 0; i < count; i++)
{
mem = gen_rtx_MEM (SImode, plus_constant (to, i * 4 * sign));
RTX_UNCHANGING_P (mem) = unchanging_p;
MEM_IN_STRUCT_P (mem) = in_struct_p;
MEM_SCALAR_P (mem) = scalar_p;
addr = plus_constant (to, i * 4 * sign);
mem = adjust_automodify_address (basemem, SImode, addr, offset);
emit_move_insn (mem, gen_rtx_REG (SImode, base_regno + i));
offset += 4 * sign;
}
if (write_back)
emit_move_insn (to, plus_constant (to, count * 4 * sign));
{
emit_move_insn (to, plus_constant (to, count * 4 * sign));
*offsetp = offset;
}
seq = get_insns ();
end_sequence ();
@ -5291,15 +5297,16 @@ arm_gen_store_multiple (int base_regno, int count, rtx to, int up,
for (j = 0; i < count; i++, j++)
{
mem = gen_rtx_MEM (SImode, plus_constant (to, j * 4 * sign));
RTX_UNCHANGING_P (mem) = unchanging_p;
MEM_IN_STRUCT_P (mem) = in_struct_p;
MEM_SCALAR_P (mem) = scalar_p;
addr = plus_constant (to, j * 4 * sign);
mem = adjust_automodify_address_nv (basemem, SImode, addr, offset);
XVECEXP (result, 0, i)
= gen_rtx_SET (VOIDmode, mem, gen_rtx_REG (SImode, base_regno + j));
offset += 4 * sign;
}
if (write_back)
*offsetp = offset;
return result;
}
@ -5307,13 +5314,11 @@ int
arm_gen_movstrqi (rtx *operands)
{
HOST_WIDE_INT in_words_to_go, out_words_to_go, last_bytes;
HOST_WIDE_INT srcoffset, dstoffset;
int i;
rtx src, dst;
rtx st_src, st_dst, fin_src, fin_dst;
rtx src, dst, srcbase, dstbase;
rtx part_bytes_reg = NULL;
rtx mem;
int dst_unchanging_p, dst_in_struct_p, src_unchanging_p, src_in_struct_p;
int dst_scalar_p, src_scalar_p;
if (GET_CODE (operands[2]) != CONST_INT
|| GET_CODE (operands[3]) != CONST_INT
@ -5321,23 +5326,17 @@ arm_gen_movstrqi (rtx *operands)
|| INTVAL (operands[3]) & 3)
return 0;
st_dst = XEXP (operands[0], 0);
st_src = XEXP (operands[1], 0);
dst_unchanging_p = RTX_UNCHANGING_P (operands[0]);
dst_in_struct_p = MEM_IN_STRUCT_P (operands[0]);
dst_scalar_p = MEM_SCALAR_P (operands[0]);
src_unchanging_p = RTX_UNCHANGING_P (operands[1]);
src_in_struct_p = MEM_IN_STRUCT_P (operands[1]);
src_scalar_p = MEM_SCALAR_P (operands[1]);
fin_dst = dst = copy_to_mode_reg (SImode, st_dst);
fin_src = src = copy_to_mode_reg (SImode, st_src);
dstbase = operands[0];
srcbase = operands[1];
dst = copy_to_mode_reg (SImode, XEXP (dstbase, 0));
src = copy_to_mode_reg (SImode, XEXP (srcbase, 0));
in_words_to_go = ARM_NUM_INTS (INTVAL (operands[2]));
out_words_to_go = INTVAL (operands[2]) / 4;
last_bytes = INTVAL (operands[2]) & 3;
dstoffset = srcoffset = 0;
if (out_words_to_go != in_words_to_go && ((in_words_to_go - 1) & 3) != 0)
part_bytes_reg = gen_rtx_REG (SImode, (in_words_to_go - 1) & 3);
@ -5345,38 +5344,32 @@ arm_gen_movstrqi (rtx *operands)
{
if (in_words_to_go > 4)
emit_insn (arm_gen_load_multiple (0, 4, src, TRUE, TRUE,
src_unchanging_p,
src_in_struct_p,
src_scalar_p));
srcbase, &srcoffset));
else
emit_insn (arm_gen_load_multiple (0, in_words_to_go, src, TRUE,
FALSE, src_unchanging_p,
src_in_struct_p, src_scalar_p));
FALSE, srcbase, &srcoffset));
if (out_words_to_go)
{
if (out_words_to_go > 4)
emit_insn (arm_gen_store_multiple (0, 4, dst, TRUE, TRUE,
dst_unchanging_p,
dst_in_struct_p,
dst_scalar_p));
dstbase, &dstoffset));
else if (out_words_to_go != 1)
emit_insn (arm_gen_store_multiple (0, out_words_to_go,
dst, TRUE,
(last_bytes == 0
? FALSE : TRUE),
dst_unchanging_p,
dst_in_struct_p,
dst_scalar_p));
dstbase, &dstoffset));
else
{
mem = gen_rtx_MEM (SImode, dst);
RTX_UNCHANGING_P (mem) = dst_unchanging_p;
MEM_IN_STRUCT_P (mem) = dst_in_struct_p;
MEM_SCALAR_P (mem) = dst_scalar_p;
mem = adjust_automodify_address (dstbase, SImode, dst, dstoffset);
emit_move_insn (mem, gen_rtx_REG (SImode, 0));
if (last_bytes != 0)
emit_insn (gen_addsi3 (dst, dst, GEN_INT (4)));
{
emit_insn (gen_addsi3 (dst, dst, GEN_INT (4)));
dstoffset += 4;
}
}
}
@ -5388,20 +5381,12 @@ arm_gen_movstrqi (rtx *operands)
if (out_words_to_go)
{
rtx sreg;
mem = gen_rtx_MEM (SImode, src);
RTX_UNCHANGING_P (mem) = src_unchanging_p;
MEM_IN_STRUCT_P (mem) = src_in_struct_p;
MEM_SCALAR_P (mem) = src_scalar_p;
emit_move_insn (sreg = gen_reg_rtx (SImode), mem);
emit_move_insn (fin_src = gen_reg_rtx (SImode), plus_constant (src, 4));
mem = gen_rtx_MEM (SImode, dst);
RTX_UNCHANGING_P (mem) = dst_unchanging_p;
MEM_IN_STRUCT_P (mem) = dst_in_struct_p;
MEM_SCALAR_P (mem) = dst_scalar_p;
mem = adjust_automodify_address (srcbase, SImode, src, srcoffset);
sreg = copy_to_reg (mem);
mem = adjust_automodify_address (dstbase, SImode, dst, dstoffset);
emit_move_insn (mem, sreg);
emit_move_insn (fin_dst = gen_reg_rtx (SImode), plus_constant (dst, 4));
in_words_to_go--;
if (in_words_to_go) /* Sanity check */
@ -5413,10 +5398,7 @@ arm_gen_movstrqi (rtx *operands)
if (in_words_to_go < 0)
abort ();
mem = gen_rtx_MEM (SImode, src);
RTX_UNCHANGING_P (mem) = src_unchanging_p;
MEM_IN_STRUCT_P (mem) = src_in_struct_p;
MEM_SCALAR_P (mem) = src_scalar_p;
mem = adjust_automodify_address (srcbase, SImode, src, srcoffset);
part_bytes_reg = copy_to_mode_reg (SImode, mem);
}
@ -5434,10 +5416,9 @@ arm_gen_movstrqi (rtx *operands)
while (last_bytes)
{
mem = gen_rtx_MEM (QImode, plus_constant (dst, last_bytes - 1));
RTX_UNCHANGING_P (mem) = dst_unchanging_p;
MEM_IN_STRUCT_P (mem) = dst_in_struct_p;
MEM_SCALAR_P (mem) = dst_scalar_p;
mem = adjust_automodify_address (dstbase, QImode,
plus_constant (dst, last_bytes - 1),
dstoffset + last_bytes - 1);
emit_move_insn (mem, gen_lowpart (QImode, part_bytes_reg));
if (--last_bytes)
@ -5453,10 +5434,7 @@ arm_gen_movstrqi (rtx *operands)
{
if (last_bytes > 1)
{
mem = gen_rtx_MEM (HImode, dst);
RTX_UNCHANGING_P (mem) = dst_unchanging_p;
MEM_IN_STRUCT_P (mem) = dst_in_struct_p;
MEM_SCALAR_P (mem) = dst_scalar_p;
mem = adjust_automodify_address (dstbase, HImode, dst, dstoffset);
emit_move_insn (mem, gen_lowpart (HImode, part_bytes_reg));
last_bytes -= 2;
if (last_bytes)
@ -5466,15 +5444,13 @@ arm_gen_movstrqi (rtx *operands)
emit_insn (gen_addsi3 (dst, dst, GEN_INT (2)));
emit_insn (gen_lshrsi3 (tmp, part_bytes_reg, GEN_INT (16)));
part_bytes_reg = tmp;
dstoffset += 2;
}
}
if (last_bytes)
{
mem = gen_rtx_MEM (QImode, dst);
RTX_UNCHANGING_P (mem) = dst_unchanging_p;
MEM_IN_STRUCT_P (mem) = dst_in_struct_p;
MEM_SCALAR_P (mem) = dst_scalar_p;
mem = adjust_automodify_address (dstbase, QImode, dst, dstoffset);
emit_move_insn (mem, gen_lowpart (QImode, part_bytes_reg));
}
}

View File

@ -5043,7 +5043,9 @@
(match_operand:SI 1 "" ""))
(use (match_operand:SI 2 "" ""))])]
"TARGET_ARM"
"
{
HOST_WIDE_INT offset = 0;
/* Support only fixed point registers. */
if (GET_CODE (operands[2]) != CONST_INT
|| INTVAL (operands[2]) > 14
@ -5057,11 +5059,9 @@
operands[3]
= arm_gen_load_multiple (REGNO (operands[0]), INTVAL (operands[2]),
force_reg (SImode, XEXP (operands[1], 0)),
TRUE, FALSE, RTX_UNCHANGING_P(operands[1]),
MEM_IN_STRUCT_P(operands[1]),
MEM_SCALAR_P (operands[1]));
"
)
TRUE, FALSE, operands[1], &offset);
})
;; Load multiple with write-back
@ -5165,7 +5165,9 @@
(match_operand:SI 1 "" ""))
(use (match_operand:SI 2 "" ""))])]
"TARGET_ARM"
"
{
HOST_WIDE_INT offset = 0;
/* Support only fixed point registers. */
if (GET_CODE (operands[2]) != CONST_INT
|| INTVAL (operands[2]) > 14
@ -5179,11 +5181,8 @@
operands[3]
= arm_gen_store_multiple (REGNO (operands[1]), INTVAL (operands[2]),
force_reg (SImode, XEXP (operands[0], 0)),
TRUE, FALSE, RTX_UNCHANGING_P (operands[0]),
MEM_IN_STRUCT_P(operands[0]),
MEM_SCALAR_P (operands[0]));
"
)
TRUE, FALSE, operands[0], &offset);
})
;; Store multiple with write-back

View File

@ -51,7 +51,13 @@ Boston, MA 02111-1307, USA. */
#define FBSD_TARGET_OS_CPP_BUILTINS() \
do \
{ \
if (FBSD_MAJOR == 6) \
if (FBSD_MAJOR == 9) \
builtin_define ("__FreeBSD__=9"); \
else if (FBSD_MAJOR == 8) \
builtin_define ("__FreeBSD__=8"); \
if (FBSD_MAJOR == 7) \
builtin_define ("__FreeBSD__=7"); \
else if (FBSD_MAJOR == 6) \
builtin_define ("__FreeBSD__=6"); \
else if (FBSD_MAJOR == 5) \
builtin_define ("__FreeBSD__=5"); \

View File

@ -0,0 +1,219 @@
/* Linux host-specific hook definitions.
Copyright (C) 2004, 2005 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published
by the Free Software Foundation; either version 2, or (at your
option) any later version.
GCC is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
License for more details.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA. */
#include "config.h"
#include "system.h"
#include "coretypes.h"
#include <sys/mman.h>
#include <limits.h>
#include "hosthooks.h"
#include "hosthooks-def.h"
/* Linux has a feature called exec-shield-randomize that perturbs the
address of non-fixed mapped segments by a (relatively) small amount.
The feature is intended to make it harder to attack the system with
buffer overflow attacks, since every invocation of a program will
have its libraries and data segments at slightly different addresses.
This feature causes us problems with PCH because it makes it that
much harder to acquire a stable location at which to map our PCH
data file.
[ The feature causes other points of non-determinism within the
compiler as well, so we'd *really* like to be able to have the
driver disable exec-shield-randomize for the process group, but
that isn't possible at present. ]
We're going to try several things:
* Select an architecture specific address as "likely" and see
if that's free. For our 64-bit hosts, we can easily choose
an address in Never Never Land.
* If exec-shield-randomize is disabled, then just use the
address chosen by mmap in step one.
* If exec-shield-randomize is enabled, then temporarily allocate
32M of memory as a buffer, then allocate PCH memory, then
free the buffer. The theory here is that the perturbation is
no more than 16M, and so by allocating our buffer larger than
that we make it considerably more likely that the address will
be free when we want to load the data back.
*/
#undef HOST_HOOKS_GT_PCH_GET_ADDRESS
#define HOST_HOOKS_GT_PCH_GET_ADDRESS linux_gt_pch_get_address
#undef HOST_HOOKS_GT_PCH_USE_ADDRESS
#define HOST_HOOKS_GT_PCH_USE_ADDRESS linux_gt_pch_use_address
/* For various ports, try to guess a fixed spot in the vm space
that's probably free. */
#if defined(__alpha)
# define TRY_EMPTY_VM_SPACE 0x10000000000
#elif defined(__ia64)
# define TRY_EMPTY_VM_SPACE 0x2000000100000000
#elif defined(__x86_64)
# define TRY_EMPTY_VM_SPACE 0x1000000000
#elif defined(__i386)
# define TRY_EMPTY_VM_SPACE 0x60000000
#elif defined(__powerpc__)
# define TRY_EMPTY_VM_SPACE 0x60000000
#elif defined(__s390x__)
# define TRY_EMPTY_VM_SPACE 0x8000000000
#elif defined(__s390__)
# define TRY_EMPTY_VM_SPACE 0x60000000
#elif defined(__sparc__) && defined(__LP64__)
# define TRY_EMPTY_VM_SPACE 0x8000000000
#elif defined(__sparc__)
# define TRY_EMPTY_VM_SPACE 0x60000000
#else
# define TRY_EMPTY_VM_SPACE 0
#endif
/* Determine a location where we might be able to reliably allocate SIZE
bytes. FD is the PCH file, though we should return with the file
unmapped. */
static void *
linux_gt_pch_get_address (size_t size, int fd)
{
size_t buffer_size = 32 * 1024 * 1024;
void *addr, *buffer;
FILE *f;
bool randomize_on;
addr = mmap ((void *)TRY_EMPTY_VM_SPACE, size, PROT_READ | PROT_WRITE,
MAP_PRIVATE, fd, 0);
/* If we failed the map, that means there's *no* free space. */
if (addr == (void *) MAP_FAILED)
return NULL;
/* Unmap the area before returning. */
munmap (addr, size);
/* If we got the exact area we requested, then that's great. */
if (TRY_EMPTY_VM_SPACE && addr == (void *) TRY_EMPTY_VM_SPACE)
return addr;
/* If we didn't, then we need to look to see if virtual address
randomization is on. That is recorded in
kernel.randomize_va_space. An older implementation used
kernel.exec-shield-randomize. */
f = fopen ("/proc/sys/kernel/randomize_va_space", "r");
if (f == NULL)
f = fopen ("/proc/sys/kernel/exec-shield-randomize", "r");
randomize_on = false;
if (f != NULL)
{
char buf[100];
size_t c;
c = fread (buf, 1, sizeof buf - 1, f);
if (c > 0)
{
buf[c] = '\0';
randomize_on = (atoi (buf) > 0);
}
fclose (f);
}
/* If it isn't, then accept the address that mmap selected as fine. */
if (!randomize_on)
return addr;
/* Otherwise, we need to try again with buffer space. */
buffer = mmap (0, buffer_size, PROT_NONE, MAP_PRIVATE | MAP_ANON, -1, 0);
addr = mmap (0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
if (buffer != (void *) MAP_FAILED)
munmap (buffer, buffer_size);
if (addr == (void *) MAP_FAILED)
return NULL;
munmap (addr, size);
return addr;
}
/* Map SIZE bytes of FD+OFFSET at BASE. Return 1 if we succeeded at
mapping the data at BASE, -1 if we couldn't.
It's not possibly to reliably mmap a file using MAP_PRIVATE to
a specific START address on either hpux or linux. First we see
if mmap with MAP_PRIVATE works. If it does, we are off to the
races. If it doesn't, we try an anonymous private mmap since the
kernel is more likely to honor the BASE address in anonymous maps.
We then copy the data to the anonymous private map. This assumes
of course that we don't need to change the data in the PCH file
after it is created.
This approach obviously causes a performance penalty but there is
little else we can do given the current PCH implementation. */
static int
linux_gt_pch_use_address (void *base, size_t size, int fd, size_t offset)
{
void *addr;
/* We're called with size == 0 if we're not planning to load a PCH
file at all. This allows the hook to free any static space that
we might have allocated at link time. */
if (size == 0)
return -1;
/* Try to map the file with MAP_PRIVATE. */
addr = mmap (base, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, offset);
if (addr == base)
return 1;
if (addr != (void *) MAP_FAILED)
munmap (addr, size);
/* Try to make an anonymous private mmap at the desired location. */
addr = mmap (base, size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (addr != base)
{
if (addr != (void *) MAP_FAILED)
munmap (addr, size);
return -1;
}
if (lseek (fd, offset, SEEK_SET) == (off_t)-1)
return -1;
while (size)
{
ssize_t nbytes;
nbytes = read (fd, base, MIN (size, SSIZE_MAX));
if (nbytes <= 0)
return -1;
base = (char *) base + nbytes;
size -= nbytes;
}
return 1;
}
const struct host_hooks host_hooks = HOST_HOOKS_INITIALIZER;

View File

@ -0,0 +1,79 @@
/* Solaris host-specific hook definitions.
Copyright (C) 2004 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published
by the Free Software Foundation; either version 2, or (at your
option) any later version.
GCC is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
License for more details.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA. */
#include "config.h"
#include "system.h"
#include "coretypes.h"
#include <sys/mman.h>
#include "hosthooks.h"
#include "hosthooks-def.h"
#undef HOST_HOOKS_GT_PCH_USE_ADDRESS
#define HOST_HOOKS_GT_PCH_USE_ADDRESS sol_gt_pch_use_address
/* Map SIZE bytes of FD+OFFSET at BASE. Return 1 if we succeeded at
mapping the data at BASE, -1 if we couldn't. */
static int
sol_gt_pch_use_address (void *base, size_t size, int fd, size_t offset)
{
void *addr;
/* We're called with size == 0 if we're not planning to load a PCH
file at all. This allows the hook to free any static space that
we might have allocated at link time. */
if (size == 0)
return -1;
addr = mmap (base, size, PROT_READ | PROT_WRITE, MAP_PRIVATE,
fd, offset);
/* Solaris isn't good about honoring the mmap START parameter
without MAP_FIXED set. Before we give up, search the desired
address space with mincore to see if the space is really free. */
if (addr != base)
{
size_t page_size = getpagesize();
char one_byte;
size_t i;
if (addr != (void *) MAP_FAILED)
munmap (addr, size);
errno = 0;
for (i = 0; i < size; i += page_size)
if (mincore ((char *)base + i, page_size, (void *)&one_byte) == -1
&& errno == ENOMEM)
continue; /* The page is not mapped. */
else
break;
if (i >= size)
addr = mmap (base, size,
PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED,
fd, offset);
}
return addr == base ? 1 : -1;
}
const struct host_hooks host_hooks = HOST_HOOKS_INITIALIZER;

View File

@ -4899,7 +4899,7 @@ output_set_got (rtx dest)
if (!flag_pic || TARGET_DEEP_BRANCH_PREDICTION)
output_asm_insn ("add{l}\t{%1, %0|%0, %1}", xops);
else if (!TARGET_MACHO)
output_asm_insn ("add{l}\t{%1+[.-%a2], %0|%0, %a1+(.-%a2)}", xops);
output_asm_insn ("add{l}\t{%1+[.-%a2], %0|%0, %1+(.-%a2)}", xops);
return "";
}
@ -13956,6 +13956,7 @@ ix86_expand_unop_builtin (enum insn_code icode, tree arglist,
if (! target
|| GET_MODE (target) != tmode
|| (do_load && GET_CODE (target) == MEM)
|| ! (*insn_data[icode].operand[0].predicate) (target, tmode))
target = gen_reg_rtx (tmode);
if (do_load)

View File

@ -1850,7 +1850,8 @@
(define_split
[(set (match_operand:DI 0 "push_operand" "")
(match_operand:DI 1 "immediate_operand" ""))]
"TARGET_64BIT && (flow2_completed || (reload_completed && !flag_peephole2))
"TARGET_64BIT && ((optimize > 0 && flag_peephole2)
? flow2_completed : reload_completed)
&& !symbolic_operand (operands[1], DImode)
&& !x86_64_immediate_operand (operands[1], DImode)"
[(set (match_dup 0) (match_dup 1))
@ -2105,7 +2106,8 @@
(define_split
[(set (match_operand:DI 0 "memory_operand" "")
(match_operand:DI 1 "immediate_operand" ""))]
"TARGET_64BIT && (flow2_completed || (reload_completed && !flag_peephole2))
"TARGET_64BIT && ((optimize > 0 && flag_peephole2)
? flow2_completed : reload_completed)
&& !symbolic_operand (operands[1], DImode)
&& !x86_64_immediate_operand (operands[1], DImode)"
[(set (match_dup 2) (match_dup 3))
@ -2172,11 +2174,10 @@
(match_operand:SF 1 "memory_operand" ""))]
"reload_completed
&& GET_CODE (operands[1]) == MEM
&& GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
&& CONSTANT_POOL_ADDRESS_P (XEXP (operands[1], 0))"
&& constant_pool_reference_p (operands[1])"
[(set (match_dup 0)
(match_dup 1))]
"operands[1] = get_pool_constant (XEXP (operands[1], 0));")
"operands[1] = avoid_constant_pool_reference (operands[1]);")
;; %%% Kill this when call knows how to work this out.
@ -2889,11 +2890,10 @@
&& GET_CODE (operands[1]) == MEM
&& (GET_MODE (operands[0]) == XFmode
|| GET_MODE (operands[0]) == SFmode || GET_MODE (operands[0]) == DFmode)
&& GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
&& CONSTANT_POOL_ADDRESS_P (XEXP (operands[1], 0))"
&& constant_pool_reference_p (operands[1])"
[(set (match_dup 0) (match_dup 1))]
{
rtx c = get_pool_constant (XEXP (operands[1], 0));
rtx c = avoid_constant_pool_reference (operands[1]);
rtx r = operands[0];
if (GET_CODE (r) == SUBREG)

View File

@ -84,13 +84,6 @@ do { \
%{mlp64:-L/usr/lib/hpux64/libp} -lgprof} \
%{!symbolic:-lc}}"
#ifndef CROSS_COMPILE
#undef LIBGCC_SPEC
#define LIBGCC_SPEC \
"%{shared-libgcc:%{!mlp64:-lgcc_s}%{mlp64:-lgcc_s_hpux64} -lgcc} \
%{!shared-libgcc:-lgcc}"
#endif
#undef SUBTARGET_SWITCHES
#define SUBTARGET_SWITCHES \
{ "ilp32", MASK_ILP32, "Generate ILP32 code" }, \

View File

@ -197,7 +197,3 @@ do { \
#undef LD_INIT_SWITCH
#define LD_INIT_SWITCH "-binitfini"
/* AIX 5.1 has the float and long double forms of math functions. */
#undef TARGET_C99_FUNCTIONS
#define TARGET_C99_FUNCTIONS 1

View File

@ -1,5 +1,5 @@
/* Darwin/powerpc host-specific hook definitions.
Copyright (C) 2003 Free Software Foundation, Inc.
Copyright (C) 2003, 2004 Free Software Foundation, Inc.
This file is part of GCC.
@ -137,22 +137,18 @@ darwin_rs6000_extra_signals (void)
fatal_error ("While setting up signal handler: %m");
}
static void * darwin_rs6000_gt_pch_get_address (size_t);
static bool darwin_rs6000_gt_pch_use_address (void *, size_t);
#undef HOST_HOOKS_GT_PCH_GET_ADDRESS
#define HOST_HOOKS_GT_PCH_GET_ADDRESS darwin_rs6000_gt_pch_get_address
#undef HOST_HOOKS_GT_PCH_USE_ADDRESS
#define HOST_HOOKS_GT_PCH_USE_ADDRESS darwin_rs6000_gt_pch_use_address
/* Yes, this is really supposed to work. */
static char pch_address_space[1024*1024*1024] __attribute__((aligned (4096)));
/* Return the address of the PCH address space, if the PCH will fit in it. */
static void *
darwin_rs6000_gt_pch_get_address (size_t sz)
darwin_rs6000_gt_pch_get_address (size_t sz, int fd ATTRIBUTE_UNUSED)
{
if (sz <= sizeof (pch_address_space))
return pch_address_space;
@ -163,18 +159,19 @@ darwin_rs6000_gt_pch_get_address (size_t sz)
/* Check ADDR and SZ for validity, and deallocate (using munmap) that part of
pch_address_space beyond SZ. */
static bool
darwin_rs6000_gt_pch_use_address (void *addr, size_t sz)
static int
darwin_rs6000_gt_pch_use_address (void *addr, size_t sz, int fd, size_t off)
{
const size_t pagesize = getpagesize();
bool result;
void *mmap_result;
int ret;
if ((size_t)pch_address_space % pagesize != 0
|| sizeof (pch_address_space) % pagesize != 0)
abort ();
result = (addr == pch_address_space && sz <= sizeof (pch_address_space));
if (! result)
ret = (addr == pch_address_space && sz <= sizeof (pch_address_space));
if (! ret)
sz = 0;
/* Round the size to a whole page size. Normally this is a no-op. */
@ -183,7 +180,22 @@ darwin_rs6000_gt_pch_use_address (void *addr, size_t sz)
if (munmap (pch_address_space + sz, sizeof (pch_address_space) - sz) != 0)
fatal_error ("couldn't unmap pch_address_space: %m\n");
return result;
if (ret)
{
mmap_result = mmap (addr, sz,
PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED,
fd, off);
/* The file might not be mmap-able. */
ret = mmap_result != (void *) MAP_FAILED;
/* Sanity check for broken MAP_FIXED. */
if (ret && mmap_result != addr)
abort ();
}
return ret;
}
const struct host_hooks host_hooks = HOST_HOOKS_INITIALIZER;

View File

@ -244,6 +244,12 @@
? rs6000_special_round_type_align (STRUCT, COMPUTED, SPECIFIED) \
: MAX ((COMPUTED), (SPECIFIED)))
/* Use the default for compiling target libs. */
#ifdef IN_TARGET_LIBS
#undef TARGET_ALIGN_NATURAL
#define TARGET_ALIGN_NATURAL 1
#endif
/* Indicate that jump tables go in the text section. */
#undef JUMP_TABLES_IN_TEXT_SECTION
#define JUMP_TABLES_IN_TEXT_SECTION TARGET_64BIT

View File

@ -105,7 +105,7 @@ extern int registers_ok_for_quad_peep (rtx, rtx);
extern int addrs_ok_for_quad_peep (rtx, rtx);
extern bool gpr_or_gpr_p (rtx, rtx);
extern enum reg_class secondary_reload_class (enum reg_class,
enum machine_mode, rtx, int);
enum machine_mode, rtx);
extern int ccr_bit (rtx, int);
extern int extract_MB (rtx);
extern int extract_ME (rtx);

View File

@ -2497,43 +2497,6 @@ word_offset_memref_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
return (off % 4) == 0;
}
/* Return true if operand is a (MEM (PLUS (REG) (offset))) where offset
is not divisible by four. */
int
invalid_gpr_mem (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
{
rtx addr;
long off;
if (GET_CODE (op) != MEM)
return 0;
addr = XEXP (op, 0);
if (GET_CODE (addr) != PLUS
|| GET_CODE (XEXP (addr, 0)) != REG
|| GET_CODE (XEXP (addr, 1)) != CONST_INT)
return 0;
off = INTVAL (XEXP (addr, 1));
return (off & 3) != 0;
}
/* Return true if operand is a hard register that can be used as a base
register. */
int
base_reg_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
{
unsigned int regno;
if (!REG_P (op))
return 0;
regno = REGNO (op);
return regno != 0 && regno <= 31;
}
/* Return true if either operand is a general purpose register. */
bool
@ -2658,16 +2621,18 @@ legitimate_offset_address_p (enum machine_mode mode, rtx x, int strict)
case DFmode:
case DImode:
/* Both DFmode and DImode may end up in gprs. If gprs are 32-bit,
then we need to load/store at both offset and offset+4. */
if (!TARGET_POWERPC64)
if (mode == DFmode || !TARGET_POWERPC64)
extra = 4;
else if (offset & 3)
return false;
break;
case TFmode:
case TImode:
if (!TARGET_POWERPC64)
if (mode == TFmode || !TARGET_POWERPC64)
extra = 12;
else if (offset & 3)
return false;
else
extra = 8;
break;
@ -2989,7 +2954,7 @@ rs6000_legitimize_tls_address (rtx addr, enum tls_model model)
rtx r3, got, tga, tmp1, tmp2, eqv;
if (TARGET_64BIT)
got = gen_rtx_REG (Pmode, TOC_REGISTER);
got = gen_rtx_REG (Pmode, 2);
else
{
if (flag_pic == 1)
@ -3206,6 +3171,26 @@ rs6000_legitimize_reload_address (rtx x, enum machine_mode mode,
return x;
}
#endif
/* Force ld/std non-word aligned offset into base register by wrapping
in offset 0. */
if (GET_CODE (x) == PLUS
&& GET_CODE (XEXP (x, 0)) == REG
&& REGNO (XEXP (x, 0)) < 32
&& REG_MODE_OK_FOR_BASE_P (XEXP (x, 0), mode)
&& GET_CODE (XEXP (x, 1)) == CONST_INT
&& (INTVAL (XEXP (x, 1)) & 3) != 0
&& GET_MODE_SIZE (mode) >= UNITS_PER_WORD
&& TARGET_POWERPC64)
{
x = gen_rtx_PLUS (GET_MODE (x), x, GEN_INT (0));
push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
opnum, (enum reload_type) type);
*win = 1;
return x;
}
if (GET_CODE (x) == PLUS
&& GET_CODE (XEXP (x, 0)) == REG
&& REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
@ -3240,6 +3225,7 @@ rs6000_legitimize_reload_address (rtx x, enum machine_mode mode,
*win = 1;
return x;
}
#if TARGET_MACHO
if (GET_CODE (x) == SYMBOL_REF
&& DEFAULT_ABI == ABI_DARWIN
@ -3269,6 +3255,7 @@ rs6000_legitimize_reload_address (rtx x, enum machine_mode mode,
return x;
}
#endif
if (TARGET_TOC
&& constant_pool_expr_p (x)
&& ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), mode))
@ -4369,9 +4356,10 @@ function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
if (mode == VOIDmode)
{
if (abi == ABI_V4
&& cum->nargs_prototype < 0
&& (cum->call_cookie & CALL_LIBCALL) == 0
&& (cum->prototype || TARGET_NO_PROTOTYPE))
&& (cum->stdarg
|| (cum->nargs_prototype < 0
&& (cum->prototype || TARGET_NO_PROTOTYPE))))
{
/* For the SPE, we need to crxor CR6 always. */
if (TARGET_SPE_ABI)
@ -7856,7 +7844,7 @@ expand_block_move (rtx operands[])
mode = SImode;
gen_func.mov = gen_movsi;
}
else if (bytes == 2 && (align >= 2 || ! STRICT_ALIGNMENT))
else if (bytes >= 2 && (align >= 2 || ! STRICT_ALIGNMENT))
{ /* move 2 bytes */
move_bytes = 2;
mode = HImode;
@ -8725,14 +8713,12 @@ addrs_ok_for_quad_peep (rtx addr1, rtx addr2)
/* Return the register class of a scratch register needed to copy IN into
or out of a register in CLASS in MODE. If it can be done directly,
NO_REGS is returned. INP is nonzero if we are loading the reg, zero
for storing. */
NO_REGS is returned. */
enum reg_class
secondary_reload_class (enum reg_class class,
enum machine_mode mode,
rtx in,
int inp)
rtx in)
{
int regno;
@ -8757,14 +8743,6 @@ secondary_reload_class (enum reg_class class,
return BASE_REGS;
}
/* A 64-bit gpr load or store using an offset that isn't a multiple of
four needs a secondary reload. */
if (TARGET_POWERPC64
&& GET_MODE_UNIT_SIZE (mode) >= 8
&& (!inp || class != BASE_REGS)
&& invalid_gpr_mem (in, mode))
return BASE_REGS;
if (GET_CODE (in) == REG)
{
regno = REGNO (in);
@ -11620,6 +11598,8 @@ uses_TOC (void)
rtx
create_TOC_reference (rtx symbol)
{
if (no_new_pseudos)
regs_ever_live[TOC_REGISTER] = 1;
return gen_rtx_PLUS (Pmode,
gen_rtx_REG (Pmode, TOC_REGISTER),
gen_rtx_CONST (Pmode,

View File

@ -1492,11 +1492,8 @@ enum reg_class
or out of a register in CLASS in MODE. If it can be done directly,
NO_REGS is returned. */
#define SECONDARY_INPUT_RELOAD_CLASS(CLASS, MODE, IN) \
secondary_reload_class (CLASS, MODE, IN, 1)
#define SECONDARY_OUTPUT_RELOAD_CLASS(CLASS, MODE, IN) \
secondary_reload_class (CLASS, MODE, IN, 0)
#define SECONDARY_RELOAD_CLASS(CLASS, MODE, IN) \
secondary_reload_class (CLASS, MODE, IN)
/* If we are copying between FP or AltiVec registers and anything
else, we need a memory location. */
@ -2671,8 +2668,6 @@ extern char rs6000_reg_names[][8]; /* register names (0 vs. %r0). */
{"lwa_operand", {SUBREG, MEM, REG}}, \
{"volatile_mem_operand", {MEM}}, \
{"offsettable_mem_operand", {MEM}}, \
{"invalid_gpr_mem", {MEM}}, \
{"base_reg_operand", {REG}}, \
{"mem_or_easy_const_operand", {SUBREG, MEM, CONST_DOUBLE}}, \
{"add_operand", {SUBREG, REG, CONST_INT}}, \
{"non_add_cint_operand", {CONST_INT}}, \

View File

@ -5236,7 +5236,7 @@
(set (match_dup 0) (plus:DI (match_dup 0)
(const_int 2047)))
(set (match_dup 4) (compare:CCUNS (match_dup 3)
(const_int 3)))
(const_int 2)))
(set (match_dup 0) (ior:DI (match_dup 0)
(match_dup 1)))
(parallel [(set (match_dup 0) (and:DI (match_dup 0)
@ -7839,8 +7839,8 @@
}")
(define_insn "*movsf_hardfloat"
[(set (match_operand:SF 0 "nonimmediate_operand" "=!r,!r,m,f,f,m,!cl,!q,!r,!r,!r")
(match_operand:SF 1 "input_operand" "r,m,r,f,m,f,r,r,h,G,Fn"))]
[(set (match_operand:SF 0 "nonimmediate_operand" "=!r,!r,m,f,f,m,!cl,!q,!r,!h,!r,!r")
(match_operand:SF 1 "input_operand" "r,m,r,f,m,f,r,r,h,0,G,Fn"))]
"(gpc_reg_operand (operands[0], SFmode)
|| gpc_reg_operand (operands[1], SFmode))
&& (TARGET_HARD_FLOAT && TARGET_FPRS)"
@ -7854,10 +7854,11 @@
mt%0 %1
mt%0 %1
mf%1 %0
{cror 0,0,0|nop}
#
#"
[(set_attr "type" "*,load,store,fp,fpload,fpstore,*,mtjmpr,*,*,*")
(set_attr "length" "4,4,4,4,4,4,4,4,4,4,8")])
[(set_attr "type" "*,load,store,fp,fpload,fpstore,*,mtjmpr,*,*,*,*")
(set_attr "length" "4,4,4,4,4,4,4,4,4,4,4,8")])
(define_insn "*movsf_softfloat"
[(set (match_operand:SF 0 "nonimmediate_operand" "=r,cl,q,r,r,m,r,r,r,r,r,*h")
@ -8114,67 +8115,26 @@
; ld/std require word-aligned displacements -> 'Y' constraint.
; List Y->r and r->Y before r->r for reload.
(define_insn "*movdf_hardfloat64"
[(set (match_operand:DF 0 "nonimmediate_operand" "=Y,r,b,!r,f,f,m,!cl,!r,!r,!r,!r")
(match_operand:DF 1 "input_operand" "r,Y,m,r,f,m,f,r,h,G,H,F"))]
[(set (match_operand:DF 0 "nonimmediate_operand" "=Y,r,!r,f,f,m,!cl,!r,!h,!r,!r,!r")
(match_operand:DF 1 "input_operand" "r,Y,r,f,m,f,r,h,0,G,H,F"))]
"TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_FPRS
&& (gpc_reg_operand (operands[0], DFmode)
|| gpc_reg_operand (operands[1], DFmode))"
"@
std%U0%X0 %1,%0
ld%U1%X1 %0,%1
#
mr %0,%1
fmr %0,%1
lfd%U1%X1 %0,%1
stfd%U0%X0 %1,%0
mt%0 %1
mf%1 %0
{cror 0,0,0|nop}
#
#
#"
[(set_attr "type" "store,load,load,*,fp,fpload,fpstore,mtjmpr,*,*,*,*")
(set_attr "length" "4,4,8,4,4,4,4,4,4,8,12,16")])
(define_split
[(set (match_operand:DF 0 "base_reg_operand" "")
(match_operand:DF 1 "invalid_gpr_mem" ""))]
"TARGET_POWERPC64 && no_new_pseudos"
[(set (match_dup 2) (match_dup 3))
(set (match_dup 0) (match_dup 4))]
"
{
operands[2] = gen_rtx_REG (Pmode, REGNO (operands[0]));
operands[3] = XEXP (operands[1], 0);
operands[4] = replace_equiv_address (operands[1], operands[2]);
}")
(define_expand "reload_outdf"
[(parallel [(match_operand:DF 0 "invalid_gpr_mem" "")
(match_operand:DF 1 "register_operand" "")
(match_operand:DI 2 "register_operand" "=&b")])]
"TARGET_POWERPC64"
{
if (!TARGET_64BIT)
operands[2] = gen_rtx_REG (SImode, REGNO (operands[2]));
emit_move_insn (operands[2], XEXP (operands[0], 0));
operands[0] = replace_equiv_address (operands[0], operands[2]);
emit_move_insn (operands[0], operands[1]);
DONE;
})
(define_expand "reload_indf"
[(parallel [(match_operand:DF 0 "register_operand" "")
(match_operand:DF 1 "invalid_gpr_mem" "")
(match_operand:DI 2 "register_operand" "=&b")])]
"TARGET_POWERPC64"
{
if (!TARGET_64BIT)
operands[2] = gen_rtx_REG (SImode, REGNO (operands[2]));
emit_move_insn (operands[2], XEXP (operands[1], 0));
operands[1] = replace_equiv_address (operands[1], operands[2]);
emit_move_insn (operands[0], operands[1]);
DONE;
})
[(set_attr "type" "store,load,*,fp,fpload,fpstore,mtjmpr,*,*,*,*,*")
(set_attr "length" "4,4,4,4,4,4,4,4,4,8,12,16")])
(define_insn "*movdf_softfloat64"
[(set (match_operand:DF 0 "nonimmediate_operand" "=r,Y,r,cl,r,r,r,r,*h")
@ -8191,7 +8151,7 @@
#
#
#
nop"
{cror 0,0,0|nop}"
[(set_attr "type" "load,store,*,*,*,*,*,*,*")
(set_attr "length" "4,4,4,4,4,8,12,16,4")])
@ -8519,15 +8479,14 @@
}")
(define_insn "*movdi_internal64"
[(set (match_operand:DI 0 "nonimmediate_operand" "=Y,r,b,r,r,r,r,r,??f,f,m,r,*h,*h")
(match_operand:DI 1 "input_operand" "r,Y,m,r,I,L,nF,R,f,m,f,*h,r,0"))]
[(set (match_operand:DI 0 "nonimmediate_operand" "=Y,r,r,r,r,r,r,??f,f,m,r,*h,*h")
(match_operand:DI 1 "input_operand" "r,Y,r,I,L,nF,R,f,m,f,*h,r,0"))]
"TARGET_POWERPC64
&& (gpc_reg_operand (operands[0], DImode)
|| gpc_reg_operand (operands[1], DImode))"
"@
std%U0%X0 %1,%0
ld%U1%X1 %0,%1
#
mr %0,%1
li %0,%1
lis %0,%v1
@ -8539,51 +8498,8 @@
mf%1 %0
mt%0 %1
{cror 0,0,0|nop}"
[(set_attr "type" "store,load,load,*,*,*,*,*,fp,fpload,fpstore,mfjmpr,mtjmpr,*")
(set_attr "length" "4,4,8,4,4,4,20,4,4,4,4,4,4,4")])
(define_split
[(set (match_operand:DI 0 "base_reg_operand" "")
(match_operand:DI 1 "invalid_gpr_mem" ""))]
"TARGET_POWERPC64 && no_new_pseudos"
[(set (match_dup 2) (match_dup 3))
(set (match_dup 0) (match_dup 4))]
"
{
operands[2] = operands[0];
if (!TARGET_64BIT)
operands[2] = gen_rtx_REG (SImode, REGNO (operands[0]));
operands[3] = XEXP (operands[1], 0);
operands[4] = replace_equiv_address (operands[1], operands[2]);
}")
(define_expand "reload_outdi"
[(parallel [(match_operand:DI 0 "invalid_gpr_mem" "")
(match_operand:DI 1 "register_operand" "")
(match_operand:DI 2 "register_operand" "=&b")])]
"TARGET_POWERPC64"
{
if (!TARGET_64BIT)
operands[2] = gen_rtx_REG (SImode, REGNO (operands[2]));
emit_move_insn (operands[2], XEXP (operands[0], 0));
operands[0] = replace_equiv_address (operands[0], operands[2]);
emit_move_insn (operands[0], operands[1]);
DONE;
})
(define_expand "reload_indi"
[(parallel [(match_operand:DI 0 "register_operand" "")
(match_operand:DI 1 "invalid_gpr_mem" "")
(match_operand:DI 2 "register_operand" "=&b")])]
"TARGET_POWERPC64"
{
if (!TARGET_64BIT)
operands[2] = gen_rtx_REG (SImode, REGNO (operands[2]));
emit_move_insn (operands[2], XEXP (operands[1], 0));
operands[1] = replace_equiv_address (operands[1], operands[2]);
emit_move_insn (operands[0], operands[1]);
DONE;
})
[(set_attr "type" "store,load,*,*,*,*,*,fp,fpload,fpstore,mfjmpr,mtjmpr,*")
(set_attr "length" "4,4,4,4,4,20,4,4,4,4,4,4,4")])
;; immediate value valid for a single instruction hiding in a const_double
(define_insn ""

View File

@ -1,6 +1,6 @@
/* Target definitions for GNU compiler for PowerPC running System V.4
Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
2004 Free Software Foundation, Inc.
2004, 2005 Free Software Foundation, Inc.
Contributed by Cygnus Support.
This file is part of GCC.
@ -123,8 +123,10 @@ extern const char *rs6000_tls_size_string; /* For -mtls-size= */
{ "no-toc", 0, N_("no description yet") }, \
{ "toc", MASK_MINIMAL_TOC, N_("no description yet") }, \
{ "full-toc", MASK_MINIMAL_TOC, N_("no description yet") }, \
{ "prototype", MASK_PROTOTYPE, N_("no description yet") }, \
{ "no-prototype", -MASK_PROTOTYPE, N_("no description yet") }, \
{ "prototype", MASK_PROTOTYPE, \
N_("Assume all variable arg functions are prototyped") }, \
{ "no-prototype", -MASK_PROTOTYPE, \
N_("Non-prototyped functions might take a variable number of args") }, \
{ "no-traceback", 0, N_("no description yet") }, \
{ "eabi", MASK_EABI, N_("Use EABI") }, \
{ "no-eabi", -MASK_EABI, N_("Don't use EABI") }, \
@ -1354,8 +1356,6 @@ ncrtn.o%s"
? (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_sdata4) \
: DW_EH_PE_absptr)
#define TARGET_ASM_EXCEPTION_SECTION readonly_data_section
#define DOUBLE_INT_ASM_OP "\t.quad\t"
/* Generate entries in .fixup for relocatable addresses. */

View File

@ -267,8 +267,7 @@ _mcleanup(void)
* -- [eichin:19920702.1107EST]
*/
static void internal_mcount (char *, unsigned short *)
__attribute__ ((__unused__));
static void internal_mcount (char *, unsigned short *) __attribute__ ((used));
/* i7 == last ret, -> frompcindex */
/* o7 == current ret, -> selfpc */

View File

@ -3,3 +3,9 @@
#undef AS_SPARC64_FLAG
#define AS_SPARC64_FLAG "-TSO -64 -Av9"
/* Emit a DTP-relative reference to a TLS variable. */
#ifdef HAVE_AS_TLS
#define ASM_OUTPUT_DWARF_DTPREL(FILE, SIZE, X) \
sparc_output_dwarf_dtprel (FILE, SIZE, X)
#endif

View File

@ -84,7 +84,7 @@ Boston, MA 02111-1307, USA. */
#undef ASM_GENERATE_INTERNAL_LABEL
#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \
sprintf ((LABEL), "*.L%s%ld", (PREFIX), (long)(NUM))
sprintf ((LABEL), "*.L%s%lu", (PREFIX), (unsigned long)(NUM))
/* The native TLS-enabled assembler requires the directive #tls_object
to be put on objects in TLS sections (as of v7.1). This is not
@ -113,6 +113,12 @@ Boston, MA 02111-1307, USA. */
} \
while (0)
/* The Solaris assembler cannot grok r_tls_dtpoff. This is
a kludge as ASM_OUTPUT_DWARF_DTPREL is defined in sparc.h,
undefined here and defined again in sol2-gas-bi.h. */
#ifdef HAVE_AS_TLS
#undef ASM_OUTPUT_DWARF_DTPREL
#endif
#undef ENDFILE_SPEC

View File

@ -2946,26 +2946,34 @@ eligible_for_epilogue_delay (rtx trial, int slot)
int
tls_call_delay (rtx trial)
{
rtx pat, unspec;
rtx pat;
/* Binutils allows
call __tls_get_addr, %tgd_call (foo)
add %l7, %o0, %o0, %tgd_add (foo)
call __tls_get_addr, %tgd_call (foo)
add %l7, %o0, %o0, %tgd_add (foo)
while Sun as/ld does not. */
if (TARGET_GNU_TLS || !TARGET_TLS)
return 1;
pat = PATTERN (trial);
if (GET_CODE (pat) != SET || GET_CODE (SET_DEST (pat)) != PLUS)
return 1;
unspec = XEXP (SET_DEST (pat), 1);
if (GET_CODE (unspec) != UNSPEC
|| (XINT (unspec, 1) != UNSPEC_TLSGD
&& XINT (unspec, 1) != UNSPEC_TLSLDM))
return 1;
/* We must reject tgd_add{32|64}, i.e.
(set (reg) (plus (reg) (unspec [(reg) (symbol_ref)] UNSPEC_TLSGD)))
and tldm_add{32|64}, i.e.
(set (reg) (plus (reg) (unspec [(reg) (symbol_ref)] UNSPEC_TLSLDM)))
for Sun as/ld. */
if (GET_CODE (pat) == SET
&& GET_CODE (SET_SRC (pat)) == PLUS)
{
rtx unspec = XEXP (SET_SRC (pat), 1);
return 0;
if (GET_CODE (unspec) == UNSPEC
&& (XINT (unspec, 1) == UNSPEC_TLSGD
|| XINT (unspec, 1) == UNSPEC_TLSLDM))
return 0;
}
return 1;
}
/* Return nonzero if TRIAL can go into the sibling call

View File

@ -1892,7 +1892,7 @@ extern GTY(()) rtx sparc_compare_op1;
case of a global register variable occupying more than one register
we prefix the second and following registers with .gnu.part1. etc. */
extern char sparc_hard_reg_printed[8];
extern GTY(()) char sparc_hard_reg_printed[8];
#ifdef HAVE_AS_REGISTER_PSEUDO_OP
#define ASM_DECLARE_REGISTER_GLOBAL(FILE, DECL, REGNO, NAME) \

View File

@ -0,0 +1,4 @@
host-linux.o : $(srcdir)/config/host-linux.c $(CONFIG_H) $(SYSTEM_H) \
coretypes.h hosthooks.h hosthooks-def.h
$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
$(srcdir)/config/host-linux.c

View File

@ -0,0 +1,4 @@
host-solaris.o : $(srcdir)/config/host-solaris.c $(CONFIG_H) $(SYSTEM_H) \
coretypes.h hosthooks.h hosthooks-def.h
$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
$(srcdir)/config/host-solaris.c

39
contrib/gcc/configure vendored
View File

@ -11090,6 +11090,45 @@ cat >>confdefs.h <<\_ACEOF
#define HAVE_AS_EXPLICIT_RELOCS 1
_ACEOF
fi
echo "$as_me:$LINENO: checking assembler for jsrdirect relocation support" >&5
echo $ECHO_N "checking assembler for jsrdirect relocation support... $ECHO_C" >&6
if test "${gcc_cv_as_alpha_jsrdirect_relocs+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
gcc_cv_as_alpha_jsrdirect_relocs=no
if test $in_tree_gas = yes; then
if test $gcc_cv_gas_vers -ge `expr \( \( 2 \* 1000 \) + 16 \) \* 1000 + 90`
then gcc_cv_as_alpha_jsrdirect_relocs=yes
fi
elif test x$gcc_cv_as != x; then
echo ' .set nomacro
.text
ldq $27, a($29) !literal!1
jsr $26, ($27), a !lituse_jsrdirect!1' > conftest.s
if { ac_try='$gcc_cv_as -o conftest.o conftest.s >&5'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }
then
gcc_cv_as_alpha_jsrdirect_relocs=yes
else
echo "configure: failed program was" >&5
cat conftest.s >&5
fi
rm -f conftest.o conftest.s
fi
fi
echo "$as_me:$LINENO: result: $gcc_cv_as_alpha_jsrdirect_relocs" >&5
echo "${ECHO_T}$gcc_cv_as_alpha_jsrdirect_relocs" >&6
if test $gcc_cv_as_alpha_jsrdirect_relocs = yes; then
cat >>confdefs.h <<\_ACEOF
#define HAVE_AS_JSRDIRECT_RELOCS 1
_ACEOF
fi
;;

View File

@ -2327,6 +2327,14 @@ case "$target" in
lda $29, 0($29) !gpdisp!3],,
[AC_DEFINE(HAVE_AS_EXPLICIT_RELOCS, 1,
[Define if your assembler supports explicit relocations.])])
gcc_GAS_CHECK_FEATURE([jsrdirect relocation support],
gcc_cv_as_alpha_jsrdirect_relocs, [2,16,90],,
[ .set nomacro
.text
ldq $27, a($29) !literal!1
jsr $26, ($27), a !lituse_jsrdirect!1],,
[AC_DEFINE(HAVE_AS_JSRDIRECT_RELOCS, 1,
[Define if your assembler supports the lituse_jsrdirect relocation.])])
;;
cris-*-*)

View File

@ -172,8 +172,8 @@ read_counts_file (void)
GCOV_UNSIGNED2STRING (v, tag);
GCOV_UNSIGNED2STRING (e, GCOV_VERSION);
warning ("`%s' is version `%.4s', expected version `%.4s'",
da_file_name, v, e);
warning ("`%s' is version `%.*s', expected version `%.*s'",
da_file_name, 4, v, 4, e);
gcov_close ();
return;
}

View File

@ -1,3 +1,466 @@
2006-03-05 Release Manager
* GCC 3.4.6 released.
2006-02-23 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/26291
* decl.c (grok_op_properties): Check for ellipsis in arguments of
operators.
2006-02-08 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/26070
* decl.c (grokdeclarator): Clear RID_STATIC together with staticp.
2006-02-01 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
Backport:
2005-12-22 Mark Mitchell <mark@codesourcery.com>
PR c++/25369
* pt.c (tsubst_copy): Call mark_used on the member referenced by an
OFFSET_REF.
* decl2.c (mark_used): Accept BASELINKs.
2006-02-01 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
Backport:
2005-12-19 Mark Mitchell <mark@codesourcery.com>
PR c++/24915
* class.c (add_method): Do not treat templates as identical unless
their return types are the same.
2006-02-01 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
Backport:
2005-12-19 Mark Mitchell <mark@codesourcery.com>
PR c++/24278
* init.c (expand_member_init): Print messages about baseclasses
using %T rather than %D.
2006-01-24 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/16829
* decl.c (start_preparsed_function): Check default arguments
unconditionally.
* name-lookup.c (pushdecl_maybe_friend): Check default arguments
of all functions and function templates.
* parser.c (cp_parser_late_parsing_default_args): Check default
arguments.
* decl2.c (check_default_args): Set missing default arguments to
error_mark_node.
2006-01-19 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/25854
* pt.c (maybe_process_partial_specialization): Return early on
error_mark_node.
2005-12-19 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/20552
Backport:
2004-03-08 Mark Mitchell <mark@codesourcery.com>
* decl.c (duplicate_decls): Don't check IDENTIFIER_ERROR_LOCUS.
2005-12-07 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/19397
PR c++/19762
PR c++/19764
* parser.c (cp_parser_declarator_id): Check for error_mark_node
before building a SCOPE_REF.
2005-12-07 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
Backport:
2005-10-20 Mark Mitchell <mark@codesourcery.com>
PR c++/22618
* search.c (accessible_p): Check access in the outermost set of
template parameters.
2005-12-06 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
Backport:
2005-10-18 Nathan Sidwell <nathan@codesourcery.com>
PR c++/21383
* name-lookup.c (arg_assoc): Template args can be null in a
template-id-expr.
2005-12-05 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
Backport:
2005-10-13 Mark Mitchell <mark@codesourcery.com>
PR c++/22352
* pt.c (tsubst_template_parms): Set processing_template_decl while
processing the parameters.
(tsubst_decl): Set processing_template_decl when substituting into
a TEMPLATE_DECL.
2005-12-05 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
Backport:
2005-10-13 Mark Mitchell <mark@codesourcery.com>
PR c++/22464
* semantics.c (finish_id_expression): Issue errors about uses of
local variables in containing functions even in templates.
2005-12-05 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
Backport:
2005-10-13 Mark Mitchell <mark@codesourcery.com>
PR c++/23307
* pt.c (push_template_decl_real): Complain about attempts to
declare template variables.
2005-11-30 Release Manager
* GCC 3.4.5 released.
2005-11-23 Jakub Jelinek <jakub@redhat.com>
PR c++/21983
* class.c (find_final_overrider): Move diagnostic about no unique final
overrider to...
(update_vtable_entry_for_fn): ... here.
2005-11-15 Jason Merrill <jason@redhat.com>
PR c++/24580
* method.c (locate_copy): Also use skip_artificial_parms here.
(synthesize_exception_spec): Use CLASS_TYPE_P rather than checking
for RECORD_TYPE.
2005-11-16 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
Backport from mainline:
2005-10-12 Nathan Sidwell <nathan@codesourcery.com>
PR c++/23797
* parser.c (cp_parser_functional_cast): Cope when TYPE is not a
TYPE_DECL. Use dependent_type_p to check type.
* pt.c (uses_template_parms_p): Use dependent_type_p for a
TYPE_DECL.
(type_dependent_expression_p): Assert we've not been given a
TYPE_DECL.
2005-11-15 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/19253
PR c++/22172
Backport from mainline:
2005-11-02 Mark Mitchell <mark@codesourcery.com>
* parser.c (cp_parser_postfix_expression): Use
cp_parser_elaborated_type_specifier to handle typename-types in
functional casts.
(cp_parser_enclosed_argument_list): Skip ahead to the end of the
template argument list if the closing ">" is not found.
2005-11-14 Jason Merrill <jason@redhat.com>
PR c++/24580
* method.c (locate_ctor): Skip all artificial parms, not just
'this'.
2005-10-28 Josh Conner <jconner@apple.com>
PR c++/22153
* parser.c (cp_parser_member_declaration): Detect and handle
a template specialization.
2005-10-20 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/22508
* init.c (build_new_1): Remove misleading comment.
2005-10-12 Paolo Bonzini <bonzini@gnu.org>
PR c++/24052
* error.c (dump_expr): Pass LABEL_DECL to dump_decl. Print
an ADDR_EXPR of a LABEL_DECL as &&.
2005-10-11 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
Backport:
2004-09-23 Andrew Pinski <pinskia@physics.uc.edu>
PR c++/17618
* cvt.c (cp_convert_to_pointer): Return early when the type is
an error_mark_node.
2004-05-22 Roger Sayle <roger@eyesopen.com>
* name-lookup.c (check_for_out_of_scope_variable): Avoid ICE by
returning when TREE_TYPE is error_mark_node.
* typeck.c (require_complete_type): Return error_mark_node if
value's type is an error_mark_node.
2004-11-02 Mark Mitchell <mark@codesourcery.com>
PR c++/18177
* typeck.c (build_const_cast): Use error_operand_p.
2005-10-06 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
* call.c (resolve_args): Remove redundant test.
2005-09-21 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/23965
* call.c (resolve_args): Return error_mark_node on arguments
whose TREE_TYPE is error_mark_node.
2005-09-21 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/17609
Backport:
2004-03-08 Mark Mitchell <mark@codesourcery.com>
* lex.c (unqualified_name_lookup_error): Create a dummy VAR_DECL
in the innermost scope, rather than at namespace scope.
* name-lookup.c (push_local_binding): Give it external linkage.
* name-lookup.h (push_local_binding): Declare it.
2005-09-17 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
Backport:
2004-11-27 Mark Mitchell <mark@codesourcery.com>
PR c++/18368
* parser.c (cp_parser_check_for_definition_in_return_type): Take
the defined type as a parameter, and inform the user about the
possibility of a missing semicolon.
(cp_parser_explicit_instantiation): Adjust call to
cp_parser_check_for_definition_in_return_type.
(cp_parser_init_declarator): Likewise.
(cp_parser_member_declaration): Likewise.
2005-09-17 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/18803
Revert:
2005-09-02 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/18445
* class.c (instantiate_type): Treat NON_DEPENDENT_EXPRs with
unknown_type as non matching.
* pt.c (build_non_dependent_expr): Do not build a
NON_DEPENDENT_EXPR for a VAR_DECL.
2005-09-06 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
Backport:
2004-12-14 Mark Mitchell <mark@codesourcery.com>
PR c++/18738
* decl.c (make_typename_type): Do not handle namespace-scoped
names here.
(tag_name): Handle typename_type.
(check_elaborated_type_specifier): Handle typenames.
* parser.c (cp_parser_diagnose_invalid_type_name): Do not call
make_typename_type for namespace-scoped names here.
(cp_parser_elaborated_type_specifier): Use
cp_parser_diagnose_invalid_type_name.
2005-09-03 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
Backport:
2005-08-26 Mark Mitchell <mark@codesourcery.com>
PR c++/19004
* pt.c (uses_template_parms): Handle IDENTIFIER_NODE.
(type_dependent_expression_p): Allow BASELINKs whose associated
functions are simply a FUNCTION_DECL.
2005-09-02 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/22233
* pt.c (push_template_decl_real): Return error_mark_node if the
number of template parameters does not match previous definition.
* decl.c (start_function): Handle error_mark_node returned by
push_template_decl.
2005-09-02 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
Backport:
2004-11-25 Mark Mitchell <mark@codesourcery.com>
PR c++/18466
* decl.c (grokvardecl): Keep track of whether or not a there was
explicit qualification.
* name-lookup.c (set_decl_namespace): Complain about explicit
qualification of a name within its own namespace.
2005-09-02 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
Backport:
2004-11-25 Mark Mitchell <mark@codesourcery.com>
PR c++/18445
* class.c (instantiate_type): Treat NON_DEPENDENT_EXPRs with
unknown_type as non matching.
* pt.c (build_non_dependent_expr): Do not build a
NON_DEPENDENT_EXPR for a VAR_DECL.
2005-09-01 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
Backport:
2004-11-27 Mark Mitchell <mark@codesourcery.com>
PR c++/18512
* parser.c (cp_parser_postfix_expression): Robustify.
2005-09-01 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
Backport:
2004-11-25 Mark Mitchell <mark@codesourcery.com>
PR c++/18545
* typeck.c (check_return_expr): Robustify.
2005-09-01 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
Backport:
2005-02-22 Mark Mitchell <mark@codesourcery.com>
PR c++/20153
* decl2.c (build_anon_union_vars): Add type parameter.
(finish_anon_union): Pass it.
2005-07-28 Mark Mitchell <mark@codesourcery.com>
PR c++/22545
* call.c (add_builtin_candidate): Adjust for changes in
representation of pointer-to-member types.
2005-09-01 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/13377
* parser.c (cp_parser_lookup_name): Pass LOOKUP_COMPLAIN to
lookup_name_real on final parse.
2005-08-31 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/23586
* parser.c (cp_parser_namespace_name): Move diagnostic for
invalid namespace-name to here from ...
* name-lookup.c (do_namespace_alias): ... here and ...
(do_using_directive): ... here. Remove dead code.
2005-08-31 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/23639
* semantics.c (qualified_name_lookup_error): Do not complain again
on invalid scope.
2005-07-28 Giovanni Bajo <giovannibajo@gcc.gnu.org>
Backport:
2004-09-16 Mark Mitchell <mark@codesourcery.com>
PR c++/16002
* parser.c (cp_parser_simple_declaration): Commit to tentative
parses after seeing a decl-specifier.
(cp_parser_simple_declaration): Eliminate spurious message.
(cp_parser_init_declarator): Adjust error message.
2005-06-17 Geoffrey Keating <geoffk@apple.com>
PR c++/17413
* pt.c (type_unification_real): Apply template type deduction even
to procedure parameters that are not dependent on a template
parameter.
2004-11-02 Mark Mitchell <mark@codesourcery.com>
PR c++/18124
* parser.c (cp_parser_type_parameter): Robustify.
PR c++/18155
* parser.c (cp_parser_single_declaration): Disallow template
typedefs.
(cp_parser_typedef_p): New function.
2004-12-21 Mark Mitchell <mark@codesourcery.com>
PR c++/18378
* call.c (convert_like_real): Do not permit the use of a copy
constructor to copy a packed field.
2005-07-25 Giovanni Bajo <giovannibajo@gcc.gnu.org>
PR c++/19208
* pt.c (tsubst): Use fold_non_dependent_expr to fold array domains.
2005-06-14 Mark Mitchell <mark@codesourcery.com>
PR c++/21987
* decl.c (grok_op_properties): Add missing warn_conversion check.
2005-06-13 Nathan Sidwell <nathan@codesourcery.com>
PR c++/20789
* decl.c (cp_finish_decl): Clear runtime runtime initialization if
in-class decl's initializer is bad.
2005-06-10 Aldy Hernandez <aldyh@redhat.com>
PR c++/10611
* cvt.c (build_expr_type_conversion): Same.
* typeck.c (build_binary_op): Handle vectors.
(common_type): Same.
(type_after_usual_arithmetic_conversions): Same.
* testsuite/g++.dg/conversion/simd2.C: New.
2005-06-08 Nathan Sidwell <nathan@codesourcery.com>
PR c++/21903
* cp-tree.def (DEFAULT_ARG): Document TREE_CHAIN use.
* parser.c (cp_parser_late_parsing_default_args): Propagate parsed
argument to any early instantiations.
* pt.c (tsubst_arg_types): Chain early instantiation of default
arg.
PR c++/19884
* pt.c (check_explicit_specialization): Make sure namespace
binding lookup found an overloaded function.
(lookup_template_function): Just assert FNS is an overloaded
function.
PR c++/19608
* parser.c (cp_parser_late_parsing_for_member): Use
current_function_decl as scope to push to and from.
testsuite:
2005-06-08 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/20563
* parser.c (cp_parser_label_declaration): Deal with invalid/missing
identifiers.
2005-06-03 Mark Mitchell <mark@codesourcery.com>
PR c++/21853
* typeck.c (casts_away_constness_r): Do not drop cv-qualifiers on
the pointed-to type for a pointer-to-member.
2005-06-03 Mark Mitchell <mark@codesourcery.com>
PR c++/21336
* cp-tree.h (grok_op_properties): Remove friendp parameter.
* decl.c (grokfndecl): Adjust call.
(grok_op_properties): Determine the class of which the function is
a member by looking at its DECL_CONTEXT, not current_class_type.
* pt.c (tsubst_decl): Adjust call to grok_op_properties.
2005-05-26 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/21768
* pt.c (redeclare_class_template): Change error message according
to coding conventions.
2005-05-19 Release Manager
* GCC 3.4.4 released.

View File

@ -1556,7 +1556,7 @@ add_builtin_candidate (struct z_candidate **candidates, enum tree_code code,
if (IS_AGGR_TYPE (c1) && DERIVED_FROM_P (c2, c1)
&& (TYPE_PTRMEMFUNC_P (type2)
|| is_complete (TREE_TYPE (TREE_TYPE (type2)))))
|| is_complete (TYPE_PTRMEM_POINTED_TO_TYPE (type2))))
break;
}
return;
@ -2544,7 +2544,7 @@ resolve_args (tree args)
{
tree arg = TREE_VALUE (t);
if (arg == error_mark_node)
if (error_operand_p (arg))
return error_mark_node;
else if (VOID_TYPE_P (TREE_TYPE (arg)))
{
@ -4080,13 +4080,12 @@ convert_like_real (tree convs, tree expr, tree fn, int argnum, int inner,
if (NEED_TEMPORARY_P (convs) || !lvalue_p (expr))
{
tree type = TREE_TYPE (TREE_OPERAND (convs, 0));
cp_lvalue_kind lvalue = real_lvalue_p (expr);
if (!CP_TYPE_CONST_NON_VOLATILE_P (TREE_TYPE (ref_type)))
{
/* If the reference is volatile or non-const, we
cannot create a temporary. */
cp_lvalue_kind lvalue = real_lvalue_p (expr);
if (lvalue & clk_bitfield)
error ("cannot bind bitfield `%E' to `%T'",
expr, ref_type);
@ -4097,6 +4096,20 @@ convert_like_real (tree convs, tree expr, tree fn, int argnum, int inner,
error ("cannot bind rvalue `%E' to `%T'", expr, ref_type);
return error_mark_node;
}
/* If the source is a packed field, and we must use a copy
constructor, then building the target expr will require
binding the field to the reference parameter to the
copy constructor, and we'll end up with an infinite
loop. If we can use a bitwise copy, then we'll be
OK. */
if ((lvalue & clk_packed)
&& CLASS_TYPE_P (type)
&& !TYPE_HAS_TRIVIAL_INIT_REF (type))
{
error ("cannot bind packed field `%E' to `%T'",
expr, ref_type);
return error_mark_node;
}
expr = build_target_expr_with_type (expr, type);
}

View File

@ -879,9 +879,10 @@ add_method (tree type, tree method, int error_p)
fns = OVL_NEXT (fns))
{
tree fn = OVL_CURRENT (fns);
tree fn_type;
tree method_type;
tree parms1;
tree parms2;
bool same = 1;
if (TREE_CODE (fn) != TREE_CODE (method))
continue;
@ -896,8 +897,10 @@ add_method (tree type, tree method, int error_p)
functions in the derived class override and/or hide member
functions with the same name and parameter types in a base
class (rather than conflicting). */
parms1 = TYPE_ARG_TYPES (TREE_TYPE (fn));
parms2 = TYPE_ARG_TYPES (TREE_TYPE (method));
fn_type = TREE_TYPE (fn);
method_type = TREE_TYPE (method);
parms1 = TYPE_ARG_TYPES (fn_type);
parms2 = TYPE_ARG_TYPES (method_type);
/* Compare the quals on the 'this' parm. Don't compare
the whole types, as used functions are treated as
@ -906,23 +909,25 @@ add_method (tree type, tree method, int error_p)
&& ! DECL_STATIC_FUNCTION_P (method)
&& (TYPE_QUALS (TREE_TYPE (TREE_VALUE (parms1)))
!= TYPE_QUALS (TREE_TYPE (TREE_VALUE (parms2)))))
same = 0;
continue;
/* For templates, the template parms must be identical. */
if (TREE_CODE (fn) == TEMPLATE_DECL
&& !comp_template_parms (DECL_TEMPLATE_PARMS (fn),
DECL_TEMPLATE_PARMS (method)))
same = 0;
&& (!same_type_p (TREE_TYPE (fn_type),
TREE_TYPE (method_type))
|| !comp_template_parms (DECL_TEMPLATE_PARMS (fn),
DECL_TEMPLATE_PARMS (method))))
continue;
if (! DECL_STATIC_FUNCTION_P (fn))
parms1 = TREE_CHAIN (parms1);
if (! DECL_STATIC_FUNCTION_P (method))
parms2 = TREE_CHAIN (parms2);
if (same && compparms (parms1, parms2)
if (compparms (parms1, parms2)
&& (!DECL_CONV_FN_P (fn)
|| same_type_p (TREE_TYPE (TREE_TYPE (fn)),
TREE_TYPE (TREE_TYPE (method)))))
|| same_type_p (TREE_TYPE (fn_type),
TREE_TYPE (method_type))))
{
if (using && DECL_CONTEXT (fn) == type)
/* Defer to the local function. */
@ -2035,11 +2040,7 @@ find_final_overrider (tree derived, tree binfo, tree fn)
/* If there was no winner, issue an error message. */
if (!ffod.candidates || TREE_CHAIN (ffod.candidates))
{
error ("no unique final overrider for `%D' in `%T'", fn,
BINFO_TYPE (derived));
return error_mark_node;
}
return error_mark_node;
return ffod.candidates;
}
@ -2099,7 +2100,10 @@ update_vtable_entry_for_fn (tree t, tree binfo, tree fn, tree* virtuals,
/* Find the final overrider. */
overrider = find_final_overrider (TYPE_BINFO (t), b, target_fn);
if (overrider == error_mark_node)
return;
{
error ("no unique final overrider for `%D' in `%T'", target_fn, t);
return;
}
overrider_target = overrider_fn = TREE_PURPOSE (overrider);
/* Check for adjusting covariant return types. */

View File

@ -203,7 +203,9 @@ DEFTREECODE (USING_DECL, "using_decl", 'd', 0)
/* A using directive. The operand is USING_STMT_NAMESPACE. */
DEFTREECODE (USING_STMT, "using_directive", 'e', 1)
/* An un-parsed default argument. Looks like an IDENTIFIER_NODE. */
/* An un-parsed default argument.
TREE_CHAIN is used to hold instantiations of functions that had to
be instantiated before the argument was parsed. */
DEFTREECODE (DEFAULT_ARG, "default_arg", 'x', 0)
/* A template-id, like foo<int>. The first operand is the template.

View File

@ -3683,7 +3683,7 @@ extern int copy_fn_p (tree);
extern tree get_scope_of_declarator (tree);
extern void grok_special_member_properties (tree);
extern int grok_ctor_properties (tree, tree);
extern bool grok_op_properties (tree, int, bool);
extern bool grok_op_properties (tree, bool);
extern tree xref_tag (enum tag_types, tree, bool, bool);
extern tree xref_tag_from_type (tree, tree, int);
extern void xref_basetypes (tree, tree);

View File

@ -79,6 +79,8 @@ cp_convert_to_pointer (tree type, tree expr, bool force)
tree intype = TREE_TYPE (expr);
enum tree_code form;
tree rval;
if (intype == error_mark_node)
return error_mark_node;
if (IS_AGGR_TYPE (intype))
{
@ -1029,6 +1031,7 @@ build_expr_type_conversion (int desires, tree expr, bool complain)
return expr;
/* else fall through... */
case VECTOR_TYPE:
case BOOLEAN_TYPE:
return (desires & WANT_INT) ? expr : NULL_TREE;
case ENUMERAL_TYPE:

View File

@ -1380,10 +1380,7 @@ duplicate_decls (tree newdecl, tree olddecl)
else
return NULL_TREE;
}
/* Already complained about this, so don't do so again. */
else if (current_class_type == NULL_TREE
|| IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (newdecl)) != current_class_type)
else
{
error ("conflicting declaration '%#D'", newdecl);
cp_error_at ("'%D' has a previous declaration as `%#D'",
@ -2647,16 +2644,7 @@ make_typename_type (tree context, tree name, tsubst_flags_t complain)
return error_mark_node;
}
my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 20030802);
if (TREE_CODE (context) == NAMESPACE_DECL)
{
/* We can get here from typename_sub0 in the explicit_template_type
expansion. Just fail. */
if (complain & tf_error)
error ("no class template named `%#T' in `%#T'",
name, context);
return error_mark_node;
}
my_friendly_assert (TYPE_P (context), 20050905);
if (!dependent_type_p (context)
|| currently_open_class (context))
@ -4919,6 +4907,16 @@ cp_finish_decl (tree decl, tree init, tree asmspec_tree, int flags)
"initialized", decl);
init = NULL_TREE;
}
if (DECL_EXTERNAL (decl) && init)
{
/* The static data member cannot be initialized by a
non-constant when being declared. */
error ("`%D' cannot be initialized by a non-constant expression"
" when being declared", decl);
DECL_INITIALIZED_IN_CLASS_P (decl) = 0;
init = NULL_TREE;
}
/* Handle:
[dcl.init]
@ -5718,7 +5716,7 @@ grokfndecl (tree ctype,
}
if (IDENTIFIER_OPNAME_P (DECL_NAME (decl)))
grok_op_properties (decl, friendp, /*complain=*/true);
grok_op_properties (decl, /*complain=*/true);
if (ctype && decl_function_context (decl))
DECL_NO_STATIC_CHAIN (decl) = 1;
@ -5893,6 +5891,7 @@ grokvardecl (tree type,
tree scope)
{
tree decl;
tree explicit_scope;
RID_BIT_TYPE specbits;
my_friendly_assert (!name || TREE_CODE (name) == IDENTIFIER_NODE,
@ -5900,7 +5899,9 @@ grokvardecl (tree type,
specbits = *specbits_in;
/* Compute the scope in which to place the variable. */
/* Compute the scope in which to place the variable, but remember
whether or not that scope was explicitly specified by the user. */
explicit_scope = scope;
if (!scope)
{
/* An explicit "extern" specifier indicates a namespace-scope
@ -5929,8 +5930,8 @@ grokvardecl (tree type,
else
decl = build_decl (VAR_DECL, name, type);
if (scope && TREE_CODE (scope) == NAMESPACE_DECL)
set_decl_namespace (decl, scope, 0);
if (explicit_scope && TREE_CODE (explicit_scope) == NAMESPACE_DECL)
set_decl_namespace (decl, explicit_scope, 0);
else
DECL_CONTEXT (decl) = scope;
@ -7187,8 +7188,8 @@ grokdeclarator (tree declarator,
if (virtualp && staticp == 2)
{
error ("member `%D' cannot be declared both virtual and static",
dname);
error ("member `%D' cannot be declared both virtual and static", dname);
RIDBIT_RESET (RID_STATIC, specbits);
staticp = 0;
}
friendp = RIDBIT_SETP (RID_FRIEND, specbits);
@ -9004,7 +9005,7 @@ unary_op_p (enum tree_code code)
errors are issued for invalid declarations. */
bool
grok_op_properties (tree decl, int friendp, bool complain)
grok_op_properties (tree decl, bool complain)
{
tree argtypes = TYPE_ARG_TYPES (TREE_TYPE (decl));
tree argtype;
@ -9012,20 +9013,24 @@ grok_op_properties (tree decl, int friendp, bool complain)
tree name = DECL_NAME (decl);
enum tree_code operator_code;
int arity;
bool ellipsis_p;
bool ok;
tree class_type;
/* Assume that the declaration is valid. */
ok = true;
/* Count the number of arguments. */
/* Count the number of arguments. and check for ellipsis */
for (argtype = argtypes, arity = 0;
argtype && argtype != void_list_node;
argtype = TREE_CHAIN (argtype))
++arity;
ellipsis_p = !argtype;
if (current_class_type == NULL_TREE)
friendp = 1;
class_type = DECL_CONTEXT (decl);
if (class_type && !CLASS_TYPE_P (class_type))
class_type = NULL_TREE;
if (DECL_CONV_FN_P (decl))
operator_code = TYPE_EXPR;
else
@ -9053,30 +9058,28 @@ grok_op_properties (tree decl, int friendp, bool complain)
my_friendly_assert (operator_code != LAST_CPLUS_TREE_CODE, 20000526);
SET_OVERLOADED_OPERATOR_CODE (decl, operator_code);
if (! friendp)
{
switch (operator_code)
{
case NEW_EXPR:
TYPE_HAS_NEW_OPERATOR (current_class_type) = 1;
break;
if (class_type)
switch (operator_code)
{
case NEW_EXPR:
TYPE_HAS_NEW_OPERATOR (class_type) = 1;
break;
case DELETE_EXPR:
TYPE_GETS_DELETE (current_class_type) |= 1;
break;
case DELETE_EXPR:
TYPE_GETS_DELETE (class_type) |= 1;
break;
case VEC_NEW_EXPR:
TYPE_HAS_ARRAY_NEW_OPERATOR (current_class_type) = 1;
break;
case VEC_NEW_EXPR:
TYPE_HAS_ARRAY_NEW_OPERATOR (class_type) = 1;
break;
case VEC_DELETE_EXPR:
TYPE_GETS_DELETE (current_class_type) |= 2;
break;
case VEC_DELETE_EXPR:
TYPE_GETS_DELETE (class_type) |= 2;
break;
default:
break;
}
}
default:
break;
}
if (operator_code == NEW_EXPR || operator_code == VEC_NEW_EXPR)
TREE_TYPE (decl) = coerce_new_type (TREE_TYPE (decl));
@ -9130,37 +9133,46 @@ grok_op_properties (tree decl, int friendp, bool complain)
if (operator_code == CALL_EXPR)
return ok;
if (IDENTIFIER_TYPENAME_P (name) && ! DECL_TEMPLATE_INFO (decl))
/* Warn about conversion operators that will never be used. */
if (IDENTIFIER_TYPENAME_P (name)
&& ! DECL_TEMPLATE_INFO (decl)
&& warn_conversion
/* Warn only declaring the function; there is no need to
warn again about out-of-class definitions. */
&& class_type == current_class_type)
{
tree t = TREE_TYPE (name);
if (! friendp)
int ref = (TREE_CODE (t) == REFERENCE_TYPE);
const char *what = 0;
if (ref)
t = TYPE_MAIN_VARIANT (TREE_TYPE (t));
if (TREE_CODE (t) == VOID_TYPE)
what = "void";
else if (class_type)
{
int ref = (TREE_CODE (t) == REFERENCE_TYPE);
const char *what = 0;
if (ref)
t = TYPE_MAIN_VARIANT (TREE_TYPE (t));
if (TREE_CODE (t) == VOID_TYPE)
what = "void";
else if (t == current_class_type)
if (t == class_type)
what = "the same type";
/* Don't force t to be complete here. */
else if (IS_AGGR_TYPE (t)
&& COMPLETE_TYPE_P (t)
&& DERIVED_FROM_P (t, current_class_type))
&& DERIVED_FROM_P (t, class_type))
what = "a base class";
if (what && warn_conversion)
warning ("conversion to %s%s will never use a type conversion operator",
ref ? "a reference to " : "", what);
}
if (what)
warning ("conversion to %s%s will never use a type conversion operator",
ref ? "a reference to " : "", what);
}
if (operator_code == COND_EXPR)
{
/* 13.4.0.3 */
error ("ISO C++ prohibits overloading operator ?:");
}
else if (ellipsis_p)
error ("`%D' must not have variable number of arguments", decl);
else if (ambi_op_p (operator_code))
{
if (arity == 1)
@ -9325,9 +9337,11 @@ tag_name (enum tag_types code)
case class_type:
return "class";
case union_type:
return "union ";
return "union";
case enum_type:
return "enum";
case typename_type:
return "typename";
default:
abort ();
}
@ -9365,7 +9379,8 @@ check_elaborated_type_specifier (enum tag_types tag_code,
In other words, the only legitimate declaration to use in the
elaborated type specifier is the implicit typedef created when
the type is declared. */
if (!DECL_IMPLICIT_TYPEDEF_P (decl))
if (!DECL_IMPLICIT_TYPEDEF_P (decl)
&& tag_code != typename_type)
{
error ("using typedef-name `%D' after `%s'", decl, tag_name (tag_code));
return IS_AGGR_TYPE (type) ? type : error_mark_node;
@ -9379,7 +9394,8 @@ check_elaborated_type_specifier (enum tag_types tag_code,
}
else if (TREE_CODE (type) != RECORD_TYPE
&& TREE_CODE (type) != UNION_TYPE
&& tag_code != enum_type)
&& tag_code != enum_type
&& tag_code != typename_type)
{
error ("`%T' referred to as `%s'", type, tag_name (tag_code));
return error_mark_node;
@ -10301,7 +10317,11 @@ start_function (tree declspecs, tree declarator, tree attrs, int flags)
class scope, current_class_type will be NULL_TREE until set above
by push_nested_class.) */
if (processing_template_decl)
decl1 = push_template_decl (decl1);
{
tree newdecl1 = push_template_decl (decl1);
if (newdecl1 != error_mark_node)
decl1 = newdecl1;
}
/* We are now in the scope of the function being defined. */
current_function_decl = decl1;
@ -10315,6 +10335,8 @@ start_function (tree declspecs, tree declarator, tree attrs, int flags)
must be complete when you define the function. */
if (! processing_template_decl)
check_function_type (decl1, current_function_parms);
/* Make sure no default arg is missing. */
check_default_args (decl1);
/* Build the return declaration for the function. */
restype = TREE_TYPE (fntype);
@ -10378,8 +10400,6 @@ start_function (tree declspecs, tree declarator, tree attrs, int flags)
/* We need to set the DECL_CONTEXT. */
if (!DECL_CONTEXT (decl1) && DECL_TEMPLATE_INFO (decl1))
DECL_CONTEXT (decl1) = DECL_CONTEXT (DECL_TI_TEMPLATE (decl1));
/* And make sure we have enough default args. */
check_default_args (decl1);
}
fntype = TREE_TYPE (decl1);
}

View File

@ -64,7 +64,6 @@ typedef struct priority_info_s {
static void mark_vtable_entries (tree);
static void grok_function_init (tree, tree);
static bool maybe_emit_vtables (tree);
static tree build_anon_union_vars (tree);
static bool acceptable_java_type (tree);
static tree start_objects (int, int);
static void finish_objects (int, int, tree);
@ -1131,14 +1130,13 @@ defer_fn (tree fn)
VARRAY_PUSH_TREE (deferred_fns, fn);
}
/* Walks through the namespace- or function-scope anonymous union OBJECT,
building appropriate ALIAS_DECLs. Returns one of the fields for use in
the mangled name. */
/* Walks through the namespace- or function-scope anonymous union
OBJECT, with the indicated TYPE, building appropriate ALIAS_DECLs.
Returns one of the fields for use in the mangled name. */
static tree
build_anon_union_vars (tree object)
build_anon_union_vars (tree type, tree object)
{
tree type = TREE_TYPE (object);
tree main_decl = NULL_TREE;
tree field;
@ -1185,7 +1183,7 @@ build_anon_union_vars (tree object)
decl = pushdecl (decl);
}
else if (ANON_AGGR_TYPE_P (TREE_TYPE (field)))
decl = build_anon_union_vars (ref);
decl = build_anon_union_vars (TREE_TYPE (field), ref);
else
decl = 0;
@ -1225,7 +1223,7 @@ finish_anon_union (tree anon_union_decl)
return;
}
main_decl = build_anon_union_vars (anon_union_decl);
main_decl = build_anon_union_vars (type, anon_union_decl);
if (main_decl == NULL_TREE)
{
warning ("anonymous union with no members");
@ -2961,7 +2959,7 @@ check_default_args (tree x)
{
cp_error_at ("default argument missing for parameter %P of `%+#D'",
i, x);
break;
TREE_PURPOSE (arg) = error_mark_node;
}
}
}
@ -2969,6 +2967,18 @@ check_default_args (tree x)
void
mark_used (tree decl)
{
/* If DECL is a BASELINK for a single function, then treat it just
like the DECL for the function. Otherwise, if the BASELINK is
for an overloaded function, we don't know which function was
actually used until after overload resolution. */
if (TREE_CODE (decl) == BASELINK)
{
decl = BASELINK_FUNCTIONS (decl);
if (really_overloaded_fn (decl))
return;
decl = OVL_CURRENT (decl);
}
TREE_USED (decl) = 1;
if (processing_template_decl || skip_evaluation)
return;

View File

@ -1307,6 +1307,7 @@ dump_expr (tree t, int flags)
case FUNCTION_DECL:
case TEMPLATE_DECL:
case NAMESPACE_DECL:
case LABEL_DECL:
case OVERLOAD:
case IDENTIFIER_NODE:
dump_decl (t, (flags & ~TFF_DECL_SPECIFIERS) | TFF_NO_FUNCTION_ARGUMENTS);
@ -1547,6 +1548,8 @@ dump_expr (tree t, int flags)
|| (TREE_TYPE (t)
&& TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE))
dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
else if (TREE_CODE (TREE_OPERAND (t, 0)) == LABEL_DECL)
dump_unary_op ("&&", t, flags);
else
dump_unary_op ("&", t, flags);
break;

View File

@ -1015,11 +1015,11 @@ expand_member_init (tree name)
if (!direct_binfo && !virtual_binfo)
{
if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))
error ("type `%D' is not a direct or virtual base of `%T'",
name, current_class_type);
error ("type `%T' is not a direct or virtual base of `%T'",
basetype, current_class_type);
else
error ("type `%D' is not a direct base of `%T'",
name, current_class_type);
error ("type `%T' is not a direct base of `%T'",
basetype, current_class_type);
return NULL_TREE;
}
@ -2075,9 +2075,6 @@ build_new_1 (tree exp)
fns = lookup_fnfields (true_type, fnname, /*protect=*/2);
if (!fns)
{
/* See PR 15967. This should never happen (and it is
fixed correctly in mainline), but on the release branch
we prefer this less-intrusive approacch. */
error ("no suitable or ambiguous `%D' found in class `%T'",
fnname, true_type);
return error_mark_node;

View File

@ -627,26 +627,18 @@ unqualified_name_lookup_error (tree name)
if (name != ansi_opname (ERROR_MARK))
error ("`%D' not defined", name);
}
else if (current_function_decl == 0)
error ("`%D' was not declared in this scope", name);
else
{
if (IDENTIFIER_NAMESPACE_VALUE (name) != error_mark_node
|| IDENTIFIER_ERROR_LOCUS (name) != current_function_decl)
error ("`%D' was not declared in this scope", name);
/* Prevent repeated error messages by creating a VAR_DECL with
this NAME in the innermost block scope. */
if (current_function_decl)
{
static int undeclared_variable_notice;
error ("`%D' undeclared (first use this function)", name);
if (! undeclared_variable_notice)
{
error ("(Each undeclared identifier is reported only once for each function it appears in.)");
undeclared_variable_notice = 1;
}
tree decl;
decl = build_decl (VAR_DECL, name, error_mark_node);
DECL_CONTEXT (decl) = current_function_decl;
push_local_binding (name, decl, 0);
}
/* Prevent repeated error messages. */
SET_IDENTIFIER_NAMESPACE_VALUE (name, error_mark_node);
SET_IDENTIFIER_ERROR_LOCUS (name, current_function_decl);
}
return error_mark_node;

View File

@ -851,7 +851,7 @@ synthesize_exception_spec (tree type, tree (*extractor) (tree, void*),
continue;
while (TREE_CODE (type) == ARRAY_TYPE)
type = TREE_TYPE (type);
if (TREE_CODE (type) != RECORD_TYPE)
if (!CLASS_TYPE_P (type))
continue;
fn = (*extractor) (type, client);
@ -896,7 +896,9 @@ locate_ctor (tree type, void *client ATTRIBUTE_UNUSED)
tree fn = OVL_CURRENT (fns);
tree parms = TYPE_ARG_TYPES (TREE_TYPE (fn));
if (sufficient_parms_p (TREE_CHAIN (parms)))
parms = skip_artificial_parms_for (fn, parms);
if (sufficient_parms_p (parms))
return fn;
}
return NULL_TREE;
@ -940,7 +942,7 @@ locate_copy (tree type, void *client_)
int excess;
int quals;
parms = TREE_CHAIN (parms);
parms = skip_artificial_parms_for (fn, parms);
if (!parms)
continue;
src_type = non_reference (TREE_VALUE (parms));

View File

@ -35,7 +35,6 @@ static cxx_scope *innermost_nonclass_level (void);
static tree select_decl (cxx_binding *, int);
static cxx_binding *binding_for_name (cxx_scope *, tree);
static tree lookup_name_current_level (tree);
static void push_local_binding (tree, tree, int);
static tree push_overloaded_decl (tree, int);
static bool lookup_using_namespace (tree, cxx_binding *, tree,
tree, int);
@ -607,6 +606,9 @@ pushdecl (tree x)
{
int different_binding_level = 0;
if (TREE_CODE (x) == FUNCTION_DECL || DECL_FUNCTION_TEMPLATE_P (x))
check_default_args (x);
if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
name = TREE_OPERAND (name, 0);
@ -718,8 +720,6 @@ pushdecl (tree x)
{
if (TREE_CODE (t) == TYPE_DECL)
SET_IDENTIFIER_TYPE_VALUE (name, TREE_TYPE (t));
else if (TREE_CODE (t) == FUNCTION_DECL)
check_default_args (t);
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t);
}
@ -1002,9 +1002,6 @@ pushdecl (tree x)
}
}
if (TREE_CODE (x) == FUNCTION_DECL)
check_default_args (x);
if (TREE_CODE (x) == VAR_DECL)
maybe_register_incomplete_var (x);
}
@ -1052,7 +1049,7 @@ maybe_push_decl (tree decl)
doesn't really belong to this binding level, that it got here
through a using-declaration. */
static void
void
push_local_binding (tree id, tree decl, int flags)
{
struct cp_binding_level *b;
@ -1180,6 +1177,10 @@ check_for_out_of_scope_variable (tree decl)
return decl;
DECL_ERROR_REPORTED (decl) = 1;
if (TREE_TYPE (decl) == error_mark_node)
return decl;
if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (decl)))
{
error ("name lookup of `%D' changed for new ISO `for' scoping",
@ -3021,7 +3022,13 @@ set_decl_namespace (tree decl, tree scope, bool friendp)
return;
}
else
return;
{
/* Writing "int N::i" to declare a variable within "N" is invalid. */
if (at_namespace_scope_p ())
error ("explicit qualification in declaration of `%D'", decl);
return;
}
complain:
error ("`%D' should have been declared inside `%D'",
decl, scope);
@ -3199,12 +3206,10 @@ namespace_ancestor (tree ns1, tree ns2)
void
do_namespace_alias (tree alias, tree namespace)
{
if (TREE_CODE (namespace) != NAMESPACE_DECL)
{
/* The parser did not find it, so it's not there. */
error ("unknown namespace `%D'", namespace);
return;
}
if (namespace == error_mark_node)
return;
my_friendly_assert (TREE_CODE (namespace) == NAMESPACE_DECL, 20050830);
namespace = ORIGINAL_NAMESPACE (namespace);
@ -3345,26 +3350,15 @@ do_toplevel_using_decl (tree decl, tree scope, tree name)
void
do_using_directive (tree namespace)
{
if (namespace == error_mark_node)
return;
my_friendly_assert (TREE_CODE (namespace) == NAMESPACE_DECL, 20050830);
if (building_stmt_tree ())
add_stmt (build_stmt (USING_STMT, namespace));
/* using namespace A::B::C; */
if (TREE_CODE (namespace) == SCOPE_REF)
namespace = TREE_OPERAND (namespace, 1);
if (TREE_CODE (namespace) == IDENTIFIER_NODE)
{
/* Lookup in lexer did not find a namespace. */
if (!processing_template_decl)
error ("namespace `%T' undeclared", namespace);
return;
}
if (TREE_CODE (namespace) != NAMESPACE_DECL)
{
if (!processing_template_decl)
error ("`%T' is not a namespace", namespace);
return;
}
namespace = ORIGINAL_NAMESPACE (namespace);
if (!toplevel_bindings_p ())
push_using_directive (namespace);
else
@ -4437,9 +4431,10 @@ arg_assoc (struct arg_lookup *k, tree n)
return true;
/* Now the arguments. */
for (ix = TREE_VEC_LENGTH (args); ix--;)
if (arg_assoc_template_arg (k, TREE_VEC_ELT (args, ix)) == 1)
return true;
if (args)
for (ix = TREE_VEC_LENGTH (args); ix--;)
if (arg_assoc_template_arg (k, TREE_VEC_ELT (args, ix)) == 1)
return true;
}
else if (TREE_CODE (n) == OVERLOAD)
{

View File

@ -287,6 +287,7 @@ extern tree lookup_namespace_name (tree, tree);
extern tree lookup_qualified_name (tree, tree, bool, bool);
extern tree lookup_name_nonclass (tree);
extern tree lookup_function_nonclass (tree, tree);
extern void push_local_binding (tree, tree, int);
extern int push_class_binding (tree, tree);
extern bool pushdecl_class_level (tree);
extern tree pushdecl_namespace_level (tree);

View File

@ -1672,6 +1672,8 @@ static bool cp_parser_declares_only_class_p
(cp_parser *);
static bool cp_parser_friend_p
(tree);
static bool cp_parser_typedef_p
(tree);
static cp_token *cp_parser_require
(cp_parser *, enum cpp_ttype, const char *);
static cp_token *cp_parser_require_keyword
@ -1717,7 +1719,7 @@ static bool cp_parser_simulate_error
static void cp_parser_check_type_definition
(cp_parser *);
static void cp_parser_check_for_definition_in_return_type
(tree, int);
(tree, tree);
static void cp_parser_check_for_invalid_template_id
(cp_parser *, tree);
static bool cp_parser_non_integral_constant_expression
@ -1849,14 +1851,13 @@ cp_parser_check_type_definition (cp_parser* parser)
error ("%s", parser->type_definition_forbidden_message);
}
/* This function is called when a declaration is parsed. If
DECLARATOR is a function declarator and DECLARES_CLASS_OR_ENUM
indicates that a type was defined in the decl-specifiers for DECL,
then an error is issued. */
/* This function is called when the DECLARATOR is processed. The TYPE
was a type defined in the decl-specifiers. If it is invalid to
define a type in the decl-specifiers for DECLARATOR, an error is
issued. */
static void
cp_parser_check_for_definition_in_return_type (tree declarator,
int declares_class_or_enum)
cp_parser_check_for_definition_in_return_type (tree declarator, tree type)
{
/* [dcl.fct] forbids type definitions in return types.
Unfortunately, it's not easy to know whether or not we are
@ -1866,9 +1867,12 @@ cp_parser_check_for_definition_in_return_type (tree declarator,
|| TREE_CODE (declarator) == ADDR_EXPR))
declarator = TREE_OPERAND (declarator, 0);
if (declarator
&& TREE_CODE (declarator) == CALL_EXPR
&& declares_class_or_enum & 2)
error ("new types may not be defined in a return type");
&& TREE_CODE (declarator) == CALL_EXPR)
{
error ("new types may not be defined in a return type");
inform ("(perhaps a semicolon is missing after the definition of `%T')",
type);
}
}
/* A type-specifier (TYPE) has been parsed which cannot be followed by
@ -3548,52 +3552,13 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p)
case RID_TYPENAME:
{
bool template_p = false;
tree id;
tree type;
tree scope;
/* Consume the `typename' token. */
cp_lexer_consume_token (parser->lexer);
/* Look for the optional `::' operator. */
cp_parser_global_scope_opt (parser,
/*current_scope_valid_p=*/false);
/* Look for the nested-name-specifier. In case of error here,
consume the trailing id to avoid subsequent error messages
for usual cases. */
scope = cp_parser_nested_name_specifier (parser,
/*typename_keyword_p=*/true,
/*check_dependency_p=*/true,
/*type_p=*/true,
/*is_declaration=*/true);
/* Look for the optional `template' keyword. */
template_p = cp_parser_optional_template_keyword (parser);
/* We don't know whether we're looking at a template-id or an
identifier. */
cp_parser_parse_tentatively (parser);
/* Try a template-id. */
id = cp_parser_template_id (parser, template_p,
/*check_dependency_p=*/true,
/*is_declaration=*/true);
/* If that didn't work, try an identifier. */
if (!cp_parser_parse_definitely (parser))
id = cp_parser_identifier (parser);
/* Don't process id if nested name specifier is invalid. */
if (scope == error_mark_node)
return error_mark_node;
/* If we look up a template-id in a non-dependent qualifying
scope, there's no need to create a dependent type. */
else if (TREE_CODE (id) == TYPE_DECL
&& !dependent_type_p (parser->scope))
type = TREE_TYPE (id);
/* Create a TYPENAME_TYPE to represent the type to which the
functional cast is being performed. */
else
type = make_typename_type (parser->scope, id,
/*complain=*/1);
/* The syntax permitted here is the same permitted for an
elaborated-type-specifier. */
type = cp_parser_elaborated_type_specifier (parser,
/*is_friend=*/false,
/*is_declaration=*/false);
postfix_expression = cp_parser_functional_cast (parser, type);
}
break;
@ -3964,20 +3929,29 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p)
if (parser->scope)
idk = CP_ID_KIND_QUALIFIED;
if (name != error_mark_node
&& !BASELINK_P (name)
&& parser->scope)
/* If the name is a template-id that names a type, we will
get a TYPE_DECL here. That is invalid code. */
if (TREE_CODE (name) == TYPE_DECL)
{
name = build_nt (SCOPE_REF, parser->scope, name);
parser->scope = NULL_TREE;
parser->qualifying_scope = NULL_TREE;
parser->object_scope = NULL_TREE;
error ("invalid use of `%D'", name);
postfix_expression = error_mark_node;
}
else
{
if (name != error_mark_node && !BASELINK_P (name)
&& parser->scope)
{
name = build_nt (SCOPE_REF, parser->scope, name);
parser->scope = NULL_TREE;
parser->qualifying_scope = NULL_TREE;
parser->object_scope = NULL_TREE;
}
if (scope && name && BASELINK_P (name))
adjust_result_of_qualified_name_lookup
(name, BINFO_TYPE (BASELINK_BINFO (name)), scope);
postfix_expression = finish_class_member_access_expr
(postfix_expression, name);
}
if (scope && name && BASELINK_P (name))
adjust_result_of_qualified_name_lookup
(name, BINFO_TYPE (BASELINK_BINFO (name)), scope);
postfix_expression
= finish_class_member_access_expr (postfix_expression, name);
}
/* We no longer need to look up names in the scope of the
@ -6523,6 +6497,13 @@ cp_parser_simple_declaration (cp_parser* parser,
/* Give up. */
goto done;
}
/* If we have seen at least one decl-specifier, and the next token
is not a parenthesis, then we must be looking at a declaration.
(After "int (" we might be looking at a functional cast.) */
if (decl_specifiers
&& cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_PAREN))
cp_parser_commit_to_tentative_parse (parser);
/* Keep going until we hit the `;' at the end of the simple
declaration. */
@ -6576,7 +6557,12 @@ cp_parser_simple_declaration (cp_parser* parser,
/* Anything else is an error. */
else
{
cp_parser_error (parser, "expected `,' or `;'");
/* If we have already issued an error message we don't need
to issue another one. */
if (decl != error_mark_node
|| (cp_parser_parsing_tentatively (parser)
&& !cp_parser_committed_to_tentative_parse (parser)))
cp_parser_error (parser, "expected `,' or `;'");
/* Skip tokens until we reach the end of the statement. */
cp_parser_skip_to_end_of_statement (parser);
/* If the next token is now a `;', consume it. */
@ -7802,9 +7788,15 @@ cp_parser_type_parameter (cp_parser* parser)
if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ)
&& cp_lexer_next_token_is_not (parser->lexer, CPP_GREATER)
&& cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
identifier = cp_parser_identifier (parser);
{
identifier = cp_parser_identifier (parser);
/* Treat invalid names as if the parameter were nameless. */
if (identifier == error_mark_node)
identifier = NULL_TREE;
}
else
identifier = NULL_TREE;
/* Create the template parameter. */
parameter = finish_template_template_parm (class_type_node,
identifier);
@ -7846,15 +7838,13 @@ cp_parser_type_parameter (cp_parser* parser)
/* Create the combined representation of the parameter and the
default argument. */
parameter = build_tree_list (default_argument, parameter);
parameter = build_tree_list (default_argument, parameter);
}
break;
default:
/* Anything else is an error. */
cp_parser_error (parser,
"expected `class', `typename', or `template'");
parameter = error_mark_node;
abort ();
break;
}
return parameter;
@ -8610,8 +8600,9 @@ cp_parser_explicit_instantiation (cp_parser* parser)
/*ctor_dtor_or_conv_p=*/NULL,
/*parenthesized_p=*/NULL,
/*member_p=*/false);
cp_parser_check_for_definition_in_return_type (declarator,
declares_class_or_enum);
if (declares_class_or_enum & 2)
cp_parser_check_for_definition_in_return_type
(declarator, TREE_VALUE (decl_specifiers));
if (declarator != error_mark_node)
{
decl = grokdeclarator (declarator, decl_specifiers,
@ -9218,7 +9209,8 @@ cp_parser_elaborated_type_specifier (cp_parser* parser,
}
/* For a `typename', we needn't call xref_tag. */
if (tag_type == typename_type)
if (tag_type == typename_type
&& TREE_CODE (parser->scope) != NAMESPACE_DECL)
return make_typename_type (parser->scope, identifier,
/*complain=*/1);
/* Look up a qualified name in the usual way. */
@ -9262,7 +9254,7 @@ cp_parser_elaborated_type_specifier (cp_parser* parser,
if (TREE_CODE (decl) != TYPE_DECL)
{
error ("expected type-name");
cp_parser_diagnose_invalid_type_name (parser);
return error_mark_node;
}
@ -9514,6 +9506,9 @@ cp_parser_namespace_name (cp_parser* parser)
if (namespace_decl == error_mark_node
|| TREE_CODE (namespace_decl) != NAMESPACE_DECL)
{
if (!cp_parser_parsing_tentatively (parser)
|| cp_parser_committed_to_tentative_parse (parser))
error ("`%D' is not a namespace-name", identifier);
cp_parser_error (parser, "expected namespace-name");
namespace_decl = error_mark_node;
}
@ -9982,8 +9977,9 @@ cp_parser_init_declarator (cp_parser* parser,
if (declarator == error_mark_node)
return error_mark_node;
cp_parser_check_for_definition_in_return_type (declarator,
declares_class_or_enum);
if (declares_class_or_enum & 2)
cp_parser_check_for_definition_in_return_type
(declarator, TREE_VALUE (decl_specifiers));
/* Figure out what scope the entity declared by the DECLARATOR is
located in. `grokdeclarator' sometimes changes the scope, so
@ -10069,7 +10065,7 @@ cp_parser_init_declarator (cp_parser* parser,
&& token->type != CPP_COMMA
&& token->type != CPP_SEMICOLON)
{
cp_parser_error (parser, "expected init-declarator");
cp_parser_error (parser, "expected initializer");
return error_mark_node;
}
@ -10909,7 +10905,7 @@ cp_parser_declarator_id (cp_parser* parser)
/*declarator_p=*/true);
/* If the name was qualified, create a SCOPE_REF to represent
that. */
if (parser->scope)
if (parser->scope && id_expression != error_mark_node)
{
id_expression = build_nt (SCOPE_REF, parser->scope, id_expression);
parser->scope = NULL_TREE;
@ -12483,8 +12479,13 @@ cp_parser_member_declaration (cp_parser* parser)
/* Check for a template-declaration. */
if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
{
/* Parse the template-declaration. */
cp_parser_template_declaration (parser, /*member_p=*/true);
/* An explicit specialization here is an error condition, and we
expect the specialization handler to detect and report this. */
if (cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_LESS
&& cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_GREATER)
cp_parser_explicit_specialization (parser);
else
cp_parser_template_declaration (parser, /*member_p=*/true);
return;
}
@ -12685,8 +12686,9 @@ cp_parser_member_declaration (cp_parser* parser)
return;
}
cp_parser_check_for_definition_in_return_type
(declarator, declares_class_or_enum);
if (declares_class_or_enum & 2)
cp_parser_check_for_definition_in_return_type
(declarator, TREE_VALUE (decl_specifiers));
/* Look for an asm-specification. */
asm_specification = cp_parser_asm_specification_opt (parser);
@ -13639,7 +13641,10 @@ cp_parser_label_declaration (cp_parser* parser)
/* Look for an identifier. */
identifier = cp_parser_identifier (parser);
/* Declare it as a lobel. */
/* If we failed, stop. */
if (identifier == error_mark_node)
break;
/* Declare it as a label. */
finish_label_decl (identifier);
/* If the next token is a `;', stop. */
if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
@ -13689,6 +13694,7 @@ cp_parser_lookup_name (cp_parser *parser, tree name,
bool is_type, bool is_template, bool is_namespace,
bool check_dependency)
{
int flags = 0;
tree decl;
tree object_type = parser->context->object_type;
@ -13700,6 +13706,10 @@ cp_parser_lookup_name (cp_parser *parser, tree name,
if (name == error_mark_node)
return error_mark_node;
if (!cp_parser_parsing_tentatively (parser)
|| cp_parser_committed_to_tentative_parse (parser))
flags |= LOOKUP_COMPLAIN;
/* A template-id has already been resolved; there is no lookup to
do. */
if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
@ -13813,8 +13823,7 @@ cp_parser_lookup_name (cp_parser *parser, tree name,
/*protect=*/0, is_type);
/* Look it up in the enclosing context, too. */
decl = lookup_name_real (name, is_type, /*nonclass=*/0,
is_namespace,
/*flags=*/0);
is_namespace, flags);
parser->object_scope = object_type;
parser->qualifying_scope = NULL_TREE;
if (object_decl)
@ -13823,8 +13832,7 @@ cp_parser_lookup_name (cp_parser *parser, tree name,
else
{
decl = lookup_name_real (name, is_type, /*nonclass=*/0,
is_namespace,
/*flags=*/0);
is_namespace, flags);
parser->qualifying_scope = NULL_TREE;
parser->object_scope = NULL_TREE;
}
@ -14508,6 +14516,12 @@ cp_parser_single_declaration (cp_parser* parser,
tree attributes;
bool function_definition_p = false;
/* This function is only used when processing a template
declaration. */
if (innermost_scope_kind () != sk_template_parms
&& innermost_scope_kind () != sk_template_spec)
abort ();
/* Defer access checks until we know what is being declared. */
push_deferring_access_checks (dk_deferred);
@ -14520,6 +14534,14 @@ cp_parser_single_declaration (cp_parser* parser,
&declares_class_or_enum);
if (friend_p)
*friend_p = cp_parser_friend_p (decl_specifiers);
/* There are no template typedefs. */
if (cp_parser_typedef_p (decl_specifiers))
{
error ("template declaration of `typedef'");
decl = error_mark_node;
}
/* Gather up the access checks that occurred the
decl-specifier-seq. */
stop_deferring_access_checks ();
@ -14536,8 +14558,6 @@ cp_parser_single_declaration (cp_parser* parser,
decl = error_mark_node;
}
}
else
decl = NULL_TREE;
/* If it's not a template class, try for a template function. If
the next token is a `;', then this declaration does not declare
anything. But, if there were errors in the decl-specifiers, then
@ -14563,7 +14583,8 @@ cp_parser_single_declaration (cp_parser* parser,
parser->object_scope = NULL_TREE;
/* Look for a trailing `;' after the declaration. */
if (!function_definition_p
&& !cp_parser_require (parser, CPP_SEMICOLON, "`;'"))
&& (decl == error_mark_node
|| !cp_parser_require (parser, CPP_SEMICOLON, "`;'")))
cp_parser_skip_to_end_of_block_or_statement (parser);
return decl;
@ -14593,8 +14614,10 @@ cp_parser_functional_cast (cp_parser* parser, tree type)
cast = build_functional_cast (type, expression_list);
/* [expr.const]/1: In an integral constant expression "only type
conversions to integral or enumeration type can be used". */
if (cast != error_mark_node && !type_dependent_expression_p (type)
&& !INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (type)))
if (TREE_CODE (type) == TYPE_DECL)
type = TREE_TYPE (type);
if (cast != error_mark_node && !dependent_type_p (type)
&& !INTEGRAL_OR_ENUMERATION_TYPE_P (type))
{
if (cp_parser_non_integral_constant_expression
(parser, "a call to a constructor"))
@ -14716,8 +14739,8 @@ cp_parser_enclosed_template_argument_list (cp_parser* parser)
cp_lexer_consume_token (parser->lexer);
}
}
else if (!cp_parser_require (parser, CPP_GREATER, "`>'"))
error ("missing `>' to terminate the template argument list");
else
cp_parser_skip_until_found (parser, CPP_GREATER, "`>'");
/* The `>' token might be a greater-than operator again now. */
parser->greater_than_is_operator_p
= saved_greater_than_is_operator_p;
@ -14768,9 +14791,10 @@ cp_parser_late_parsing_for_member (cp_parser* parser, tree member_function)
tokens = DECL_PENDING_INLINE_INFO (member_function);
DECL_PENDING_INLINE_INFO (member_function) = NULL;
DECL_PENDING_INLINE_P (member_function) = 0;
/* If this was an inline function in a local class, enter the scope
of the containing function. */
function_scope = decl_function_context (member_function);
/* If this is a local class, enter the scope of the containing
function. */
function_scope = current_function_decl;
if (function_scope)
push_function_context_to (function_scope);
@ -14851,33 +14875,49 @@ cp_parser_late_parsing_default_args (cp_parser *parser, tree fn)
parameters;
parameters = TREE_CHAIN (parameters))
{
if (!TREE_PURPOSE (parameters)
|| TREE_CODE (TREE_PURPOSE (parameters)) != DEFAULT_ARG)
tree default_arg = TREE_PURPOSE (parameters);
tree parsed_arg;
if (!default_arg)
continue;
if (TREE_CODE (default_arg) != DEFAULT_ARG)
/* This can happen for a friend declaration for a function
already declared with default arguments. */
continue;
/* Save away the current lexer. */
/* Save away the current lexer. */
saved_lexer = parser->lexer;
/* Create a new one, using the tokens we have saved. */
tokens = DEFARG_TOKENS (TREE_PURPOSE (parameters));
/* Create a new one, using the tokens we have saved. */
tokens = DEFARG_TOKENS (default_arg);
parser->lexer = cp_lexer_new_from_tokens (tokens);
/* Set the current source position to be the location of the
first token in the default argument. */
/* Set the current source position to be the location of the
first token in the default argument. */
cp_lexer_peek_token (parser->lexer);
/* Local variable names (and the `this' keyword) may not appear
in a default argument. */
/* Local variable names (and the `this' keyword) may not appear
in a default argument. */
saved_local_variables_forbidden_p = parser->local_variables_forbidden_p;
parser->local_variables_forbidden_p = true;
/* Parse the assignment-expression. */
/* Parse the assignment-expression. */
if (DECL_FRIEND_CONTEXT (fn))
push_nested_class (DECL_FRIEND_CONTEXT (fn));
else if (DECL_CLASS_SCOPE_P (fn))
push_nested_class (DECL_CONTEXT (fn));
TREE_PURPOSE (parameters) = cp_parser_assignment_expression (parser);
parsed_arg = cp_parser_assignment_expression (parser);
if (DECL_FRIEND_CONTEXT (fn) || DECL_CLASS_SCOPE_P (fn))
pop_nested_class ();
TREE_PURPOSE (parameters) = parsed_arg;
/* Update any instantiations we've already created. */
for (default_arg = TREE_CHAIN (default_arg);
default_arg;
default_arg = TREE_CHAIN (default_arg))
TREE_PURPOSE (TREE_PURPOSE (default_arg)) = parsed_arg;
/* If the token stream has not been completely used up, then
there was extra junk after the end of the default
argument. */
@ -14889,6 +14929,9 @@ cp_parser_late_parsing_default_args (cp_parser *parser, tree fn)
parser->local_variables_forbidden_p = saved_local_variables_forbidden_p;
}
/* Make sure no default arg is missing. */
check_default_args (fn);
/* Restore the queue. */
parser->unparsed_functions_queues
= TREE_CHAIN (parser->unparsed_functions_queues);
@ -15012,6 +15055,27 @@ cp_parser_friend_p (tree decl_specifiers)
return false;
}
/* DECL_SPECIFIERS is the representation of a decl-specifier-seq.
Returns TRUE iff `typedef' appears among the DECL_SPECIFIERS. */
static bool
cp_parser_typedef_p (tree decl_specifiers)
{
while (decl_specifiers)
{
/* See if this decl-specifier is `typedef'. */
if (TREE_CODE (TREE_VALUE (decl_specifiers)) == IDENTIFIER_NODE
&& C_RID_CODE (TREE_VALUE (decl_specifiers)) == RID_TYPEDEF)
return true;
/* Go on to the next decl-specifier. */
decl_specifiers = TREE_CHAIN (decl_specifiers);
}
return false;
}
/* If the next token is of the indicated TYPE, consume it. Otherwise,
issue an error message indicating that TOKEN_DESC was expected.

View File

@ -744,8 +744,12 @@ check_specialization_namespace (tree tmpl)
void
maybe_process_partial_specialization (tree type)
{
/* TYPE maybe an ERROR_MARK_NODE. */
tree context = TYPE_P (type) ? TYPE_CONTEXT (type) : NULL_TREE;
tree context;
if (type == error_mark_node)
return;
context = TYPE_CONTEXT (type);
if (CLASS_TYPE_P (type) && CLASSTYPE_USE_TEMPLATE (type))
{
@ -1779,6 +1783,11 @@ check_explicit_specialization (tree declarator,
/* Find the namespace binding, using the declaration
context. */
fns = namespace_binding (dname, CP_DECL_CONTEXT (decl));
if (!fns || !is_overloaded_fn (fns))
{
error ("`%D' is not a template function", dname);
fns = error_mark_node;
}
}
declarator = lookup_template_function (fns, NULL_TREE);
@ -2832,9 +2841,8 @@ push_template_decl_real (tree decl, int is_friend)
return decl;
}
}
else if ((DECL_IMPLICIT_TYPEDEF_P (decl)
&& CLASS_TYPE_P (TREE_TYPE (decl)))
|| (TREE_CODE (decl) == VAR_DECL && ctx && CLASS_TYPE_P (ctx)))
else if (DECL_IMPLICIT_TYPEDEF_P (decl)
&& CLASS_TYPE_P (TREE_TYPE (decl)))
/* OK */;
else
{
@ -2973,6 +2981,7 @@ push_template_decl_real (tree decl, int is_friend)
error ("got %d template parameters for `%#T'",
TREE_VEC_LENGTH (a), current);
error (" but %d required", TREE_VEC_LENGTH (t));
return error_mark_node;
}
/* Perhaps we should also check that the parms are used in the
@ -3074,10 +3083,9 @@ redeclare_class_template (tree type, tree parms)
if (TREE_VEC_LENGTH (parms) != TREE_VEC_LENGTH (tmpl_parms))
{
cp_error_at ("previous declaration `%D'", tmpl);
error ("used %d template parameter%s instead of %d",
TREE_VEC_LENGTH (tmpl_parms),
TREE_VEC_LENGTH (tmpl_parms) == 1 ? "" : "s",
TREE_VEC_LENGTH (parms));
error ("used %d template parameter(s) instead of %d",
TREE_VEC_LENGTH (tmpl_parms),
TREE_VEC_LENGTH (parms));
return;
}
@ -4067,18 +4075,9 @@ lookup_template_function (tree fns, tree arglist)
return error_mark_node;
my_friendly_assert (!arglist || TREE_CODE (arglist) == TREE_VEC, 20030726);
if (fns == NULL_TREE
|| TREE_CODE (fns) == FUNCTION_DECL)
{
error ("non-template used as template");
return error_mark_node;
}
my_friendly_assert (TREE_CODE (fns) == TEMPLATE_DECL
|| TREE_CODE (fns) == OVERLOAD
|| BASELINK_P (fns)
|| TREE_CODE (fns) == IDENTIFIER_NODE,
20020730);
my_friendly_assert (fns && (is_overloaded_fn (fns)
|| TREE_CODE (fns) == IDENTIFIER_NODE),
20050608);
if (BASELINK_P (fns))
{
@ -4809,11 +4808,14 @@ uses_template_parms (tree t)
else if (TREE_CODE (t) == TREE_LIST)
dependent_p = (uses_template_parms (TREE_VALUE (t))
|| uses_template_parms (TREE_CHAIN (t)));
else if (TREE_CODE (t) == TYPE_DECL)
dependent_p = dependent_type_p (TREE_TYPE (t));
else if (DECL_P (t)
|| EXPR_P (t)
|| TREE_CODE (t) == TEMPLATE_PARM_INDEX
|| TREE_CODE (t) == OVERLOAD
|| TREE_CODE (t) == BASELINK
|| TREE_CODE (t) == IDENTIFIER_NODE
|| TREE_CODE_CLASS (TREE_CODE (t)) == 'c')
dependent_p = (type_dependent_expression_p (t)
|| value_dependent_expression_p (t));
@ -5787,6 +5789,12 @@ tsubst_template_parms (tree parms, tree args, tsubst_flags_t complain)
tree r = NULL_TREE;
tree* new_parms;
/* When substituting into a template, we must set
PROCESSING_TEMPLATE_DECL as the template parameters may be
dependent if they are based on one-another, and the dependency
predicates are short-circuit outside of templates. */
++processing_template_decl;
for (new_parms = &r;
TMPL_PARMS_DEPTH (parms) > TMPL_ARGS_DEPTH (args);
new_parms = &(TREE_CHAIN (*new_parms)),
@ -5816,6 +5824,8 @@ tsubst_template_parms (tree parms, tree args, tsubst_flags_t complain)
new_vec, NULL_TREE);
}
--processing_template_decl;
return r;
}
@ -6001,8 +6011,14 @@ tsubst_decl (tree t, tree args, tree type, tsubst_flags_t complain)
: DECL_TI_ARGS (DECL_TEMPLATE_RESULT (t));
tree full_args;
/* Because this is a template, the arguments will still be
dependent, even after substitution. If
PROCESSING_TEMPLATE_DECL is not set, the dependency
predicates will short-circuit. */
++processing_template_decl;
full_args = tsubst_template_args (tmpl_args, args,
complain, in_decl);
--processing_template_decl;
/* tsubst_template_args doesn't copy the vector if
nothing changed. But, *something* should have
@ -6034,15 +6050,14 @@ tsubst_decl (tree t, tree args, tree type, tsubst_flags_t complain)
break;
}
DECL_CONTEXT (r)
= tsubst_aggr_type (DECL_CONTEXT (t), args,
complain, in_decl,
/*entering_scope=*/1);
DECL_TEMPLATE_INFO (r) = build_tree_list (t, args);
if (TREE_CODE (decl) == TYPE_DECL)
{
tree new_type = tsubst (TREE_TYPE (t), args, complain, in_decl);
tree new_type;
++processing_template_decl;
new_type = tsubst (TREE_TYPE (t), args, complain, in_decl);
--processing_template_decl;
if (new_type == error_mark_node)
return error_mark_node;
@ -6050,10 +6065,14 @@ tsubst_decl (tree t, tree args, tree type, tsubst_flags_t complain)
CLASSTYPE_TI_TEMPLATE (new_type) = r;
DECL_TEMPLATE_RESULT (r) = TYPE_MAIN_DECL (new_type);
DECL_TI_ARGS (r) = CLASSTYPE_TI_ARGS (new_type);
DECL_CONTEXT (r) = TYPE_CONTEXT (new_type);
}
else
{
tree new_decl = tsubst (decl, args, complain, in_decl);
tree new_decl;
++processing_template_decl;
new_decl = tsubst (decl, args, complain, in_decl);
--processing_template_decl;
if (new_decl == error_mark_node)
return error_mark_node;
@ -6061,6 +6080,7 @@ tsubst_decl (tree t, tree args, tree type, tsubst_flags_t complain)
DECL_TI_TEMPLATE (new_decl) = r;
TREE_TYPE (r) = TREE_TYPE (new_decl);
DECL_TI_ARGS (r) = DECL_TI_ARGS (new_decl);
DECL_CONTEXT (r) = DECL_CONTEXT (new_decl);
}
SET_DECL_IMPLICIT_INSTANTIATION (r);
@ -6292,8 +6312,7 @@ tsubst_decl (tree t, tree args, tree type, tsubst_flags_t complain)
clone_function_decl (r, /*update_method_vec_p=*/0);
}
else if (IDENTIFIER_OPNAME_P (DECL_NAME (r)))
grok_op_properties (r, DECL_FRIEND_P (r),
(complain & tf_error) != 0);
grok_op_properties (r, (complain & tf_error) != 0);
if (DECL_FRIEND_P (t) && DECL_FRIEND_CONTEXT (t))
SET_DECL_FRIEND_CONTEXT (r,
@ -6486,6 +6505,8 @@ tsubst_arg_types (tree arg_types,
{
tree remaining_arg_types;
tree type;
tree default_arg;
tree result = NULL_TREE;
if (!arg_types || arg_types == void_list_node)
return arg_types;
@ -6513,12 +6534,25 @@ tsubst_arg_types (tree arg_types,
top-level qualifiers as required. */
type = TYPE_MAIN_VARIANT (type_decays_to (type));
/* Note that we do not substitute into default arguments here. The
standard mandates that they be instantiated only when needed,
which is done in build_over_call. */
return hash_tree_cons (TREE_PURPOSE (arg_types), type,
remaining_arg_types);
/* We do not substitute into default arguments here. The standard
mandates that they be instantiated only when needed, which is
done in build_over_call. */
default_arg = TREE_PURPOSE (arg_types);
if (default_arg && TREE_CODE (default_arg) == DEFAULT_ARG)
{
/* We've instantiated a template before its default arguments
have been parsed. This can happen for a nested template
class, and is not an error unless we require the default
argument in a call of this function. */
result = tree_cons (default_arg, type, remaining_arg_types);
TREE_CHAIN (default_arg) = tree_cons (result, NULL_TREE,
TREE_CHAIN (default_arg));
}
else
result = hash_tree_cons (default_arg, type, remaining_arg_types);
return result;
}
/* Substitute into a FUNCTION_TYPE or METHOD_TYPE. This routine does
@ -6711,8 +6745,7 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
/* The array dimension behaves like a non-type template arg,
in that we want to fold it as much as possible. */
max = tsubst_template_arg (omax, args, complain, in_decl);
if (!processing_template_decl)
max = decl_constant_value (max);
max = fold_non_dependent_expr (max);
if (integer_zerop (omax))
{
@ -7774,6 +7807,10 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
in_decl),
tsubst (TREE_TYPE (t), args, complain, in_decl));
case OFFSET_REF:
mark_used (TREE_OPERAND (t, 1));
return t;
default:
return t;
}
@ -9158,17 +9195,12 @@ type_unification_real (tree tparms,
else
type = arg;
if (strict == DEDUCE_EXACT || strict == DEDUCE_ORDER)
{
if (same_type_p (parm, type))
continue;
}
else
/* It might work; we shouldn't check now, because we might
get into infinite recursion. Overload resolution will
handle it. */
if (same_type_p (parm, type))
continue;
if (strict != DEDUCE_EXACT
&& can_convert_arg (parm, type, TYPE_P (arg) ? NULL_TREE : arg))
continue;
return 1;
}
@ -12024,7 +12056,8 @@ type_dependent_expression_p (tree expression)
return true;
expression = TREE_OPERAND (expression, 0);
}
if (TREE_CODE (expression) == OVERLOAD)
if (TREE_CODE (expression) == OVERLOAD
|| TREE_CODE (expression) == FUNCTION_DECL)
{
while (expression)
{
@ -12037,6 +12070,8 @@ type_dependent_expression_p (tree expression)
abort ();
}
my_friendly_assert (TREE_CODE (expression) != TYPE_DECL, 20051116);
return (dependent_type_p (TREE_TYPE (expression)));
}

View File

@ -946,8 +946,12 @@ accessible_p (tree type, tree decl)
/* In a template declaration, we cannot be sure whether the
particular specialization that is instantiated will be a friend
or not. Therefore, all access checks are deferred until
instantiation. */
if (processing_template_decl)
instantiation. However, PROCESSING_TEMPLATE_DECL is set in the
parameter list for a template (because we may see dependent types
in default arguments for template parameters), and access
checking should be performed in the outermost parameter list. */
if (processing_template_decl
&& (!processing_template_parmlist || processing_template_decl > 1))
return 1;
if (!TYPE_P (type))

View File

@ -2295,7 +2295,9 @@ check_multiple_declarators (void)
void
qualified_name_lookup_error (tree scope, tree name)
{
if (TYPE_P (scope))
if (scope == error_mark_node)
; /* We already complained. */
else if (TYPE_P (scope))
{
if (!COMPLETE_TYPE_P (scope))
error ("incomplete type `%T' used in nested name specifier", scope);
@ -2398,6 +2400,21 @@ finish_id_expression (tree id_expression,
was entirely defined. */
if (!scope && decl != error_mark_node)
maybe_note_name_used_in_class (id_expression, decl);
/* Disallow uses of local variables from containing functions. */
if (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == PARM_DECL)
{
tree context = decl_function_context (decl);
if (context != NULL_TREE && context != current_function_decl
&& ! TREE_STATIC (decl))
{
error (TREE_CODE (decl) == VAR_DECL
? "use of `auto' variable from containing function"
: "use of parameter from containing function");
cp_error_at (" `%#D' declared here", decl);
return error_mark_node;
}
}
}
/* If we didn't find anything, or what we found was a type,
@ -2664,23 +2681,6 @@ finish_id_expression (tree id_expression,
}
else
{
if (TREE_CODE (decl) == VAR_DECL
|| TREE_CODE (decl) == PARM_DECL
|| TREE_CODE (decl) == RESULT_DECL)
{
tree context = decl_function_context (decl);
if (context != NULL_TREE && context != current_function_decl
&& ! TREE_STATIC (decl))
{
error ("use of %s from containing function",
(TREE_CODE (decl) == VAR_DECL
? "`auto' variable" : "parameter"));
cp_error_at (" `%#D' declared here", decl);
return error_mark_node;
}
}
if (DECL_P (decl) && DECL_NONLOCAL (decl)
&& DECL_CLASS_SCOPE_P (decl)
&& DECL_CONTEXT (decl) != current_class_type)

View File

@ -95,6 +95,9 @@ require_complete_type (tree value)
else
type = TREE_TYPE (value);
if (type == error_mark_node)
return error_mark_node;
/* First, detect a valid value with a complete type. */
if (COMPLETE_TYPE_P (type))
return value;
@ -265,10 +268,12 @@ type_after_usual_arithmetic_conversions (tree t1, tree t2)
/* FIXME: Attributes. */
my_friendly_assert (ARITHMETIC_TYPE_P (t1)
|| TREE_CODE (t1) == COMPLEX_TYPE
|| TREE_CODE (t1) == VECTOR_TYPE
|| TREE_CODE (t1) == ENUMERAL_TYPE,
19990725);
my_friendly_assert (ARITHMETIC_TYPE_P (t2)
|| TREE_CODE (t2) == COMPLEX_TYPE
|| TREE_CODE (t2) == VECTOR_TYPE
|| TREE_CODE (t2) == ENUMERAL_TYPE,
19990725);
@ -296,6 +301,16 @@ type_after_usual_arithmetic_conversions (tree t1, tree t2)
attributes);
}
if (code1 == VECTOR_TYPE)
{
/* When we get here we should have two vectors of the same size.
Just prefer the unsigned one if present. */
if (TREE_UNSIGNED (t1))
return build_type_attribute_variant (t1, attributes);
else
return build_type_attribute_variant (t2, attributes);
}
/* If only one is real, use it as the result. */
if (code1 == REAL_TYPE && code2 != REAL_TYPE)
return build_type_attribute_variant (t1, attributes);
@ -745,9 +760,9 @@ common_type (tree t1, tree t2)
code2 = TREE_CODE (t2);
if ((ARITHMETIC_TYPE_P (t1) || code1 == ENUMERAL_TYPE
|| code1 == COMPLEX_TYPE)
|| code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE)
&& (ARITHMETIC_TYPE_P (t2) || code2 == ENUMERAL_TYPE
|| code2 == COMPLEX_TYPE))
|| code2 == COMPLEX_TYPE || code2 == VECTOR_TYPE))
return type_after_usual_arithmetic_conversions (t1, t2);
else if ((TYPE_PTR_P (t1) && TYPE_PTR_P (t2))
@ -2878,9 +2893,9 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
case ROUND_DIV_EXPR:
case EXACT_DIV_EXPR:
if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
|| code0 == COMPLEX_TYPE)
|| code0 == COMPLEX_TYPE || code0 == VECTOR_TYPE)
&& (code1 == INTEGER_TYPE || code1 == REAL_TYPE
|| code1 == COMPLEX_TYPE))
|| code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE))
{
if (TREE_CODE (op1) == INTEGER_CST && integer_zerop (op1))
warning ("division by zero in `%E / 0'", op0);
@ -2907,7 +2922,8 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
case BIT_AND_EXPR:
case BIT_IOR_EXPR:
case BIT_XOR_EXPR:
if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
if ((code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
|| (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE))
shorten = -1;
break;
@ -3158,12 +3174,17 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
break;
}
if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE || code0 == COMPLEX_TYPE)
&&
(code1 == INTEGER_TYPE || code1 == REAL_TYPE || code1 == COMPLEX_TYPE))
if (((code0 == INTEGER_TYPE || code0 == REAL_TYPE || code0 == COMPLEX_TYPE)
&&
(code1 == INTEGER_TYPE || code1 == REAL_TYPE || code1 == COMPLEX_TYPE))
|| (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE))
{
int none_complex = (code0 != COMPLEX_TYPE && code1 != COMPLEX_TYPE);
if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE
&& !tree_int_cst_equal (TYPE_SIZE (type0), TYPE_SIZE (type1)))
error ("can't convert between vector values of different size");
if (shorten || common || short_compare)
result_type = common_type (type0, type1);
@ -4776,7 +4797,7 @@ build_const_cast (tree type, tree expr)
{
tree intype;
if (type == error_mark_node || expr == error_mark_node)
if (type == error_mark_node || error_operand_p (expr))
return error_mark_node;
if (processing_template_decl)
@ -6066,6 +6087,15 @@ check_return_expr (tree retval)
/* Remember that this function did return a value. */
current_function_returns_value = 1;
/* Check for erroneous operands -- but after giving ourselves a
chance to provide an error about returning a value from a void
function. */
if (error_operand_p (retval))
{
current_function_return_value = error_mark_node;
return error_mark_node;
}
/* Only operator new(...) throw(), can return NULL [expr.new/13]. */
if ((DECL_OVERLOADED_OPERATOR_P (current_function_decl) == NEW_EXPR
|| DECL_OVERLOADED_OPERATOR_P (current_function_decl) == VEC_NEW_EXPR)
@ -6122,8 +6152,8 @@ check_return_expr (tree retval)
/* We don't need to do any conversions when there's nothing being
returned. */
if (!retval || retval == error_mark_node)
return retval;
if (!retval)
return NULL_TREE;
/* Do any required conversions. */
if (retval == result || DECL_CONSTRUCTOR_P (current_function_decl))
@ -6314,11 +6344,6 @@ casts_away_constness_r (tree *t1, tree *t2)
and pointers to members (conv.qual), the "member" aspect of a
pointer to member level is ignored when determining if a const
cv-qualifier has been cast away. */
if (TYPE_PTRMEM_P (*t1))
*t1 = build_pointer_type (TYPE_PTRMEM_POINTED_TO_TYPE (*t1));
if (TYPE_PTRMEM_P (*t2))
*t2 = build_pointer_type (TYPE_PTRMEM_POINTED_TO_TYPE (*t2));
/* [expr.const.cast]
For two pointer types:
@ -6336,9 +6361,8 @@ casts_away_constness_r (tree *t1, tree *t2)
to
Tcv2,(M-K+1) * cv2,(M-K+2) * ... cv2,M *. */
if (TREE_CODE (*t1) != POINTER_TYPE
|| TREE_CODE (*t2) != POINTER_TYPE)
if ((!TYPE_PTR_P (*t1) && !TYPE_PTRMEM_P (*t1))
|| (!TYPE_PTR_P (*t2) && !TYPE_PTRMEM_P (*t2)))
{
*t1 = cp_build_qualified_type (void_type_node,
cp_type_quals (*t1));
@ -6349,8 +6373,16 @@ casts_away_constness_r (tree *t1, tree *t2)
quals1 = cp_type_quals (*t1);
quals2 = cp_type_quals (*t2);
*t1 = TREE_TYPE (*t1);
*t2 = TREE_TYPE (*t2);
if (TYPE_PTRMEM_P (*t1))
*t1 = TYPE_PTRMEM_POINTED_TO_TYPE (*t1);
else
*t1 = TREE_TYPE (*t1);
if (TYPE_PTRMEM_P (*t2))
*t2 = TYPE_PTRMEM_POINTED_TO_TYPE (*t2);
else
*t2 = TREE_TYPE (*t2);
casts_away_constness_r (t1, t2);
*t1 = build_pointer_type (*t1);
*t2 = build_pointer_type (*t2);

View File

@ -164,7 +164,7 @@ static bool should_stack_file (cpp_reader *, _cpp_file *file, bool import);
static struct cpp_dir *search_path_head (cpp_reader *, const char *fname,
int angle_brackets, enum include_type);
static const char *dir_name_of_file (_cpp_file *file);
static void open_file_failed (cpp_reader *pfile, _cpp_file *file);
static void open_file_failed (cpp_reader *pfile, _cpp_file *file, int);
static struct file_hash_entry *search_cache (struct file_hash_entry *head,
const cpp_dir *start_dir);
static _cpp_file *make_cpp_file (cpp_reader *, cpp_dir *, const char *fname);
@ -330,7 +330,7 @@ find_file_in_dir (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch)
if (file->err_no != ENOENT)
{
open_file_failed (pfile, file);
open_file_failed (pfile, file, 0);
return true;
}
@ -360,7 +360,7 @@ _cpp_find_failed (_cpp_file *file)
to open_file().
*/
_cpp_file *
_cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir, bool fake)
_cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir, bool fake, int angle_brackets)
{
struct file_hash_entry *entry, **hash_slot;
_cpp_file *file;
@ -391,7 +391,7 @@ _cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir, bool f
file->dir = file->dir->next;
if (file->dir == NULL)
{
open_file_failed (pfile, file);
open_file_failed (pfile, file, angle_brackets);
if (invalid_pch)
{
cpp_error (pfile, CPP_DL_ERROR,
@ -533,7 +533,7 @@ read_file (cpp_reader *pfile, _cpp_file *file)
if (file->fd == -1 && !open_file (file))
{
open_file_failed (pfile, file);
open_file_failed (pfile, file, 0);
return false;
}
@ -757,16 +757,17 @@ _cpp_stack_include (cpp_reader *pfile, const char *fname, int angle_brackets,
if (!dir)
return false;
return _cpp_stack_file (pfile, _cpp_find_file (pfile, fname, dir, false),
return _cpp_stack_file (pfile, _cpp_find_file (pfile, fname, dir, false,
angle_brackets),
type == IT_IMPORT);
}
/* Could not open FILE. The complication is dependency output. */
static void
open_file_failed (cpp_reader *pfile, _cpp_file *file)
open_file_failed (cpp_reader *pfile, _cpp_file *file, int angle_brackets)
{
int sysp = pfile->map ? pfile->map->sysp: 0;
bool print_dep = CPP_OPTION (pfile, deps.style) > !!sysp;
bool print_dep = CPP_OPTION (pfile, deps.style) > (angle_brackets || !!sysp);
errno = file->err_no;
if (print_dep && CPP_OPTION (pfile, deps.missing_files) && errno == ENOENT)
@ -948,7 +949,7 @@ _cpp_cleanup_files (cpp_reader *pfile)
void
_cpp_fake_include (cpp_reader *pfile, const char *fname)
{
_cpp_find_file (pfile, fname, pfile->buffer->file->dir, true);
_cpp_find_file (pfile, fname, pfile->buffer->file->dir, true, 0);
}
/* Not everyone who wants to set system-header-ness on a buffer can
@ -1030,7 +1031,7 @@ _cpp_compare_file_date (cpp_reader *pfile, const char *fname,
if (!dir)
return -1;
file = _cpp_find_file (pfile, fname, dir, false);
file = _cpp_find_file (pfile, fname, dir, false, angle_brackets);
if (file->err_no)
return -1;
@ -1070,6 +1071,7 @@ _cpp_pop_file_buffer (cpp_reader *pfile, _cpp_file *file)
{
free ((void *) file->buffer);
file->buffer = NULL;
file->buffer_valid = false;
}
}

View File

@ -516,7 +516,7 @@ extern void _cpp_destroy_hashtable (cpp_reader *);
/* In cppfiles.c */
typedef struct _cpp_file _cpp_file;
extern _cpp_file *_cpp_find_file (cpp_reader *, const char *fname,
cpp_dir *start_dir, bool fake);
cpp_dir *start_dir, bool fake, int);
extern bool _cpp_find_failed (_cpp_file *);
extern void _cpp_mark_file_once_only (cpp_reader *, struct _cpp_file *);
extern void _cpp_fake_include (cpp_reader *, const char *);

View File

@ -466,7 +466,7 @@ cpp_read_main_file (cpp_reader *pfile, const char *fname)
}
pfile->main_file
= _cpp_find_file (pfile, fname, &pfile->no_search_path, false);
= _cpp_find_file (pfile, fname, &pfile->no_search_path, false, 0);
if (_cpp_find_failed (pfile->main_file))
return NULL;
@ -477,6 +477,8 @@ cpp_read_main_file (cpp_reader *pfile, const char *fname)
if (CPP_OPTION (pfile, preprocessed))
{
read_original_filename (pfile);
if (!pfile->map)
return NULL;
fname = pfile->map->to_file;
}
return fname;
@ -496,8 +498,10 @@ read_original_filename (cpp_reader *pfile)
token = _cpp_lex_direct (pfile);
if (token->type == CPP_HASH)
{
pfile->state.in_directive = 1;
token1 = _cpp_lex_direct (pfile);
_cpp_backup_tokens (pfile, 1);
pfile->state.in_directive = 0;
/* If it's a #line directive, handle it. */
if (token1->type == CPP_NUMBER)

View File

@ -3518,6 +3518,9 @@ fold_rtx (rtx x, rtx insn)
addr = addr_ent->const_rtx;
}
/* Call target hook to avoid the effects of -fpic etc.... */
addr = targetm.delegitimize_address (addr);
/* If address is constant, split it into a base and integer offset. */
if (GET_CODE (addr) == SYMBOL_REF || GET_CODE (addr) == LABEL_REF)
base = addr;

View File

@ -269,9 +269,12 @@ Ivan Fontes Garcia for the Portugese translation of the GCJ FAQ.
Peter Gerwinski for various bug fixes and the Pascal front end.
@item
Kaveh Ghazi for his direction via the steering committee,
amazing work to make @samp{-W -Wall} useful, and continuously testing
GCC on a plethora of platforms.
Kaveh R.@: Ghazi for his direction via the steering committee, amazing
work to make @samp{-W -Wall -W* -Werror} useful, and continuously
testing GCC on a plethora of platforms. Kaveh extends his gratitude to
the @uref{http://www.caip.rutgers.edu,,CAIP Center} at Rutgers
University for providing him with computing resources to work on Free
Software since the late 1980s.
@item
John Gilmore for a donation to the FSF earmarked improving GNU Java.

View File

@ -42,35 +42,31 @@ This host hook is used to set up handling for extra signals. The most
common thing to do in this hook is to detect stack overflow.
@end deftypefn
@deftypefn {Host Hook} void * HOST_HOOKS_GT_PCH_GET_ADDRESS (size_t @var{size})
This host hook returns the address of some space in which a PCH may be
loaded with @samp{HOST_HOOKS_PCH_LOAD_PCH}. The space will need to
have @var{size} bytes. If insufficient space is available,
@samp{NULL} may be returned; the PCH machinery will try to find a
suitable address using a heuristic.
The memory does not have to be available now. In fact, usually
@samp{HOST_HOOKS_PCH_LOAD_PCH} will already have been called. The memory
need only be available in future invocations of GCC.
@deftypefn {Host Hook} void * HOST_HOOKS_GT_PCH_GET_ADDRESS (size_t @var{size}, int @var{fd})
This host hook returns the address of some space that is likely to be
free in some subsequent invocation of the compiler. We intend to load
the PCH data at this address such that the data need not be relocated.
The area should be able to hold @var{size} bytes. If the host uses
@code{mmap}, @var{fd} is an open file descriptor that can be used for
probing.
@end deftypefn
@deftypefn {Host Hook} bool HOST_HOOKS_GT_PCH_USE_ADDRESS (size_t @var{size}, void * @var{address})
This host hook is called when a PCH file is about to be loaded. If
@var{address} is the address that would have been returned by
@samp{HOST_HOOKS_PCH_MEMORY_ADDRESS}, and @var{size} is smaller than
the maximum than @samp{HOST_HOOKS_PCH_MEMORY_ADDRESS} would have
accepted, return true, otherwise return false.
@deftypefn {Host Hook} int HOST_HOOKS_GT_PCH_USE_ADDRESS (void * @var{address}, size_t @var{size}, int @var{fd}, size_t @var{offset})
This host hook is called when a PCH file is about to be loaded.
We want to load @var{size} bytes from @var{fd} at @var{offset}
into memory at @var{address}. The given address will be the result of
a previous invocation of @code{HOST_HOOKS_GT_PCH_GET_ADDRESS}.
Return @minus{}1 if we couldn't allocate @var{size} bytes at @var{address}.
Return 0 if the memory is allocated but the data is not loaded. Return 1
if the hook has performed everything.
In addition, free any address space reserved that isn't needed to hold
@var{size} bytes (whether or not true is returned). The PCH machinery will
use @samp{mmap} with @samp{MAP_FIXED} to load the PCH if @samp{HAVE_MMAP_FILE},
or will use @samp{fread} otherwise.
If no PCH will be loaded, this hook may be called with @var{size}
zero, in which case all reserved address space should be freed.
If the implementation uses reserved address space, free any reserved
space beyond @var{size}, regardless of the return value. If no PCH will
be loaded, this hook may be called with @var{size} zero, in which case
all reserved address space should be freed.
Do not try to handle values of @var{address} that could not have been
returned by this executable; just return false. Such values usually
returned by this executable; just return @minus{}1. Such values usually
indicate an out-of-date PCH file (built by some other GCC executable),
and such a PCH file won't work.
@end deftypefn

View File

@ -1,10 +1,10 @@
@c Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
@c Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
@c This is part of the GCC manual.
@c For copying conditions, see the file gcc.texi.
@c Common values used in the GCC manuals:
@set version-GCC 3.4.4
@set version-GCC 3.4.6
@c DEVELOPMENT is set to indicate an in-development version,
@c as compared to a release version. When making a release

View File

@ -3651,7 +3651,8 @@ invoking @option{-O2} on programs that use computed gotos.
@opindex O3
Optimize yet more. @option{-O3} turns on all optimizations specified by
@option{-O2} and also turns on the @option{-finline-functions},
@option{-fweb} and @option{-frename-registers} options.
@option{-fweb}, @option{-frename-registers} and @option{-funswitch-loops}
options.
@item -O0
@opindex O0
@ -8691,7 +8692,8 @@ have any affect on which ld is called, it only changes what parameters
are passed to that ld. The ld that is called is determined by the
@option{--with-ld} configure option, GCC's program search path, and
finally by the user's @env{PATH}. The linker used by GCC can be printed
using @samp{which `gcc -print-prog-name=ld`}.
using @samp{which `gcc -print-prog-name=ld`}. This option is only available
on the 64 bit HP-UX GCC, i.e. configured with @samp{hppa*64*-*-hpux*}.
@item -mhp-ld
@opindex hp-ld
@ -8703,7 +8705,8 @@ which ld is called, it only changes what parameters are passed to that
ld. The ld that is called is determined by the @option{--with-ld}
configure option, GCC's program search path, and finally by the user's
@env{PATH}. The linker used by GCC can be printed using @samp{which
`gcc -print-prog-name=ld`}.
`gcc -print-prog-name=ld`}. This option is only available on the 64 bit
HP-UX GCC, i.e. configured with @samp{hppa*64*-*-hpux*}.
@item -mlong-calls
@opindex mno-long-calls
@ -10075,8 +10078,8 @@ specified separated by a comma.
Specify bit size of immediate TLS offsets. Valid values are 14, 22, and
64.
@item -mtune-arch=@var{cpu-type}
@opindex mtune-arch
@item -mtune=@var{cpu-type}
@opindex mtune
Tune the instruction scheduling for a particular CPU, Valid values are
itanium, itanium1, merced, itanium2, and mckinley.

View File

@ -389,25 +389,11 @@ store_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
|| (offset * BITS_PER_UNIT % bitsize == 0
&& MEM_ALIGN (op0) % GET_MODE_BITSIZE (fieldmode) == 0))))
{
if (GET_MODE (op0) != fieldmode)
{
if (GET_CODE (op0) == SUBREG)
{
if (GET_MODE (SUBREG_REG (op0)) == fieldmode
|| GET_MODE_CLASS (fieldmode) == MODE_INT
|| GET_MODE_CLASS (fieldmode) == MODE_PARTIAL_INT)
op0 = SUBREG_REG (op0);
else
/* Else we've got some float mode source being extracted into
a different float mode destination -- this combination of
subregs results in Severe Tire Damage. */
abort ();
}
if (GET_CODE (op0) == REG)
op0 = gen_rtx_SUBREG (fieldmode, op0, byte_offset);
else
op0 = adjust_address (op0, fieldmode, offset);
}
if (GET_CODE (op0) == MEM)
op0 = adjust_address (op0, fieldmode, offset);
else if (GET_MODE (op0) != fieldmode)
op0 = simplify_gen_subreg (fieldmode, op0, GET_MODE (op0),
byte_offset);
emit_move_insn (op0, value);
return value;
}
@ -622,6 +608,7 @@ store_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
bestmode = GET_MODE (op0);
if (bestmode == VOIDmode
|| GET_MODE_SIZE (bestmode) < GET_MODE_SIZE (fieldmode)
|| (SLOW_UNALIGNED_ACCESS (bestmode, MEM_ALIGN (op0))
&& GET_MODE_BITSIZE (bestmode) > MEM_ALIGN (op0)))
goto insv_loses;
@ -1401,6 +1388,11 @@ extract_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
xbitpos = bitnum % unit;
xop0 = adjust_address (xop0, bestmode, xoffset);
/* Make sure register is big enough for the whole field. */
if (xoffset * BITS_PER_UNIT + unit
< offset * BITS_PER_UNIT + bitsize)
goto extzv_loses;
/* Fetch it to a register in that size. */
xop0 = force_reg (bestmode, xop0);
@ -1531,6 +1523,11 @@ extract_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
xbitpos = bitnum % unit;
xop0 = adjust_address (xop0, bestmode, xoffset);
/* Make sure register is big enough for the whole field. */
if (xoffset * BITS_PER_UNIT + unit
< offset * BITS_PER_UNIT + bitsize)
goto extv_loses;
/* Fetch it to a register in that size. */
xop0 = force_reg (bestmode, xop0);

View File

@ -1,3 +1,21 @@
2006-03-05 Release Manager
* GCC 3.4.6 released.
2006-01-21 Joseph Myers <joseph@codesourcery.com>
* g77spec.c (lang_specific_driver): Update copyright notice date.
2005-12-27 Toon Moene <toon@moene.indiv.nluug.nl>
PR/25494
* g77.texi: Corrected entry about catching
Floating Point Exceptions.
2005-11-30 Release Manager
* GCC 3.4.5 released.
2005-05-19 Release Manager
* GCC 3.4.4 released.

View File

@ -9415,12 +9415,13 @@ trapfpe ()
@}
@end smallexample
A convenient trick is to compile this something like:
Assuming the above source is in file @file{trapfpe.c},
then compile this routine as follows:
@smallexample
gcc -o libtrapfpe.a trapfpe.c
gcc -c trapfpe.c
@end smallexample
and then use it by adding @option{-trapfpe} to the @command{g77} command line
when linking.
and subsequently use it by adding @file{trapfpe.o} to the @command{g77}
command line when linking.
@node Nonportable Conversions
@subsection Nonportable Conversions

View File

@ -1,5 +1,5 @@
/* Specific flags and argument handling of the Fortran front-end.
Copyright (C) 1997, 1999, 2000, 2001, 2002, 2003, 2004
Copyright (C) 1997, 1999, 2000, 2001, 2002, 2003, 2004, 2006
Free Software Foundation, Inc.
This file is part of GCC.
@ -347,7 +347,7 @@ lang_specific_driver (int *in_argc, const char *const **in_argv,
case OPTION_version:
printf ("GNU Fortran (GCC) %s\n", version_string);
printf ("Copyright %s 2004 Free Software Foundation, Inc.\n",
printf ("Copyright %s 2006 Free Software Foundation, Inc.\n",
_("(C)"));
printf ("\n");
printf (_("\

View File

@ -104,7 +104,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
life_analysis fills in certain vectors containing information about
register usage: REG_N_REFS, REG_N_DEATHS, REG_N_SETS, REG_LIVE_LENGTH,
REG_N_CALLS_CROSSED and REG_BASIC_BLOCK.
REG_N_CALLS_CROSSED, REG_N_THROWING_CALLS_CROSSED and REG_BASIC_BLOCK.
life_analysis sets current_function_sp_is_unchanging if the function
doesn't modify the stack pointer. */
@ -1470,6 +1470,7 @@ allocate_reg_life_data (void)
REG_N_REFS (i) = 0;
REG_N_DEATHS (i) = 0;
REG_N_CALLS_CROSSED (i) = 0;
REG_N_THROWING_CALLS_CROSSED (i) = 0;
REG_LIVE_LENGTH (i) = 0;
REG_FREQ (i) = 0;
REG_BASIC_BLOCK (i) = REG_BLOCK_UNKNOWN;
@ -1688,8 +1689,13 @@ propagate_one_insn (struct propagate_block_info *pbi, rtx insn)
record this for them. */
if (GET_CODE (insn) == CALL_INSN && (flags & PROP_REG_INFO))
EXECUTE_IF_SET_IN_REG_SET (pbi->reg_live, 0, i,
{ REG_N_CALLS_CROSSED (i)++; });
{
EXECUTE_IF_SET_IN_REG_SET (pbi->reg_live, 0, i,
{ REG_N_CALLS_CROSSED (i)++; });
if (can_throw_internal (insn))
EXECUTE_IF_SET_IN_REG_SET (pbi->reg_live, 0, i,
{ REG_N_THROWING_CALLS_CROSSED (i)++; });
}
/* Record sets. Do this even for dead instructions, since they
would have killed the values if they hadn't been deleted. */
@ -3365,7 +3371,11 @@ attempt_auto_inc (struct propagate_block_info *pbi, rtx inc, rtx insn,
that REGNO now crosses them. */
for (temp = insn; temp != incr; temp = NEXT_INSN (temp))
if (GET_CODE (temp) == CALL_INSN)
REG_N_CALLS_CROSSED (regno)++;
{
REG_N_CALLS_CROSSED (regno)++;
if (can_throw_internal (temp))
REG_N_THROWING_CALLS_CROSSED (regno)++;
}
/* Invalidate alias info for Q since we just changed its value. */
clear_reg_alias_info (q);

View File

@ -1467,33 +1467,36 @@ const_binop (enum tree_code code, tree arg1, tree arg2, int notrunc)
case RDIV_EXPR:
{
tree t1, t2, real, imag;
tree magsquared
= const_binop (PLUS_EXPR,
const_binop (MULT_EXPR, r2, r2, notrunc),
const_binop (MULT_EXPR, i2, i2, notrunc),
notrunc);
t = build_complex (type,
const_binop
(INTEGRAL_TYPE_P (TREE_TYPE (r1))
? TRUNC_DIV_EXPR : RDIV_EXPR,
const_binop (PLUS_EXPR,
const_binop (MULT_EXPR, r1, r2,
notrunc),
const_binop (MULT_EXPR, i1, i2,
notrunc),
notrunc),
magsquared, notrunc),
const_binop
(INTEGRAL_TYPE_P (TREE_TYPE (r1))
? TRUNC_DIV_EXPR : RDIV_EXPR,
const_binop (MINUS_EXPR,
const_binop (MULT_EXPR, i1, r2,
notrunc),
const_binop (MULT_EXPR, r1, i2,
notrunc),
notrunc),
magsquared, notrunc));
t1 = const_binop (PLUS_EXPR,
const_binop (MULT_EXPR, r1, r2, notrunc),
const_binop (MULT_EXPR, i1, i2, notrunc),
notrunc);
t2 = const_binop (MINUS_EXPR,
const_binop (MULT_EXPR, i1, r2, notrunc),
const_binop (MULT_EXPR, r1, i2, notrunc),
notrunc);
if (INTEGRAL_TYPE_P (TREE_TYPE (r1)))
{
real = const_binop (TRUNC_DIV_EXPR, t1, magsquared, notrunc);
imag = const_binop (TRUNC_DIV_EXPR, t2, magsquared, notrunc);
}
else
{
real = const_binop (RDIV_EXPR, t1, magsquared, notrunc);
imag = const_binop (RDIV_EXPR, t2, magsquared, notrunc);
if (!real || !imag)
return NULL_TREE;
}
t = build_complex (type, real, imag);
}
break;
@ -7497,6 +7500,8 @@ fold (tree expr)
else if (TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE
&& TREE_CODE (arg0) == NOP_EXPR
&& (tem = get_unwidened (arg0, NULL_TREE)) != arg0
&& (TYPE_PRECISION (TREE_TYPE (tem))
> TYPE_PRECISION (TREE_TYPE (arg0)))
&& (code == EQ_EXPR || code == NE_EXPR
|| TREE_UNSIGNED (TREE_TYPE (arg0))
== TREE_UNSIGNED (TREE_TYPE (tem)))
@ -8137,7 +8142,12 @@ fold (tree expr)
if (INTEGRAL_TYPE_P (type)
&& TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
&& TREE_CODE (arg2) == INTEGER_CST)
&& TREE_CODE (arg2) == INTEGER_CST
/* ??? We somehow can end up here with
(unsigned int)1 == 1 ? 1U : 2U
for which we won't make any progress but recurse
indefinitely. Just stop here in this case. */
&& TREE_CODE (arg1) != INTEGER_CST)
switch (comp_code)
{
case EQ_EXPR:
@ -8194,8 +8204,9 @@ fold (tree expr)
/* If the second operand is simpler than the third, swap them
since that produces better jump optimization results. */
if (tree_swap_operands_p (TREE_OPERAND (t, 1),
TREE_OPERAND (t, 2), false))
if (truth_value_p (TREE_CODE (arg0))
&& tree_swap_operands_p (TREE_OPERAND (t, 1),
TREE_OPERAND (t, 2), false))
{
/* See if this can be inverted. If it can't, possibly because
it was a floating-point inequality comparison, don't do
@ -8431,7 +8442,7 @@ fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
{
void **slot;
enum tree_code code;
char buf[sizeof (struct tree_decl)];
struct tree_decl buf;
int i, len;
if (sizeof (struct tree_exp) + 5 * sizeof (tree)
@ -8448,23 +8459,23 @@ fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
if (code == SAVE_EXPR && SAVE_EXPR_NOPLACEHOLDER (expr))
{
/* Allow SAVE_EXPR_NOPLACEHOLDER flag to be modified. */
memcpy (buf, expr, tree_size (expr));
expr = (tree) buf;
memcpy (&buf, expr, tree_size (expr));
expr = (tree) &buf;
SAVE_EXPR_NOPLACEHOLDER (expr) = 0;
}
else if (TREE_CODE_CLASS (code) == 'd' && DECL_ASSEMBLER_NAME_SET_P (expr))
{
/* Allow DECL_ASSEMBLER_NAME to be modified. */
memcpy (buf, expr, tree_size (expr));
expr = (tree) buf;
memcpy (&buf, expr, tree_size (expr));
expr = (tree) &buf;
SET_DECL_ASSEMBLER_NAME (expr, NULL);
}
else if (TREE_CODE_CLASS (code) == 't'
&& (TYPE_POINTER_TO (expr) || TYPE_REFERENCE_TO (expr)))
{
/* Allow TYPE_POINTER_TO and TYPE_REFERENCE_TO to be modified. */
memcpy (buf, expr, tree_size (expr));
expr = (tree) buf;
memcpy (&buf, expr, tree_size (expr));
expr = (tree) &buf;
TYPE_POINTER_TO (expr) = NULL;
TYPE_REFERENCE_TO (expr) = NULL;
}

View File

@ -1,6 +1,8 @@
/* Compiler driver program that can handle many languages.
Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
Inc.
This file is part of GCC.
@ -3362,7 +3364,7 @@ process_command (int argc, const char **argv)
{
/* translate_options () has turned --version into -fversion. */
printf (_("%s (GCC) %s\n"), programname, version_string);
printf ("Copyright %s 2004 Free Software Foundation, Inc.\n",
printf ("Copyright %s 2006 Free Software Foundation, Inc.\n",
_("(C)"));
fputs (_("This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"),

View File

@ -1,5 +1,5 @@
/* Dump a gcov file, for debugging use.
Copyright (C) 2002, 2003 Free Software Foundation, Inc.
Copyright (C) 2002, 2003, 2006 Free Software Foundation, Inc.
Contributed by Nathan Sidwell <nathan@codesourcery.com>
Gcov is free software; you can redistribute it and/or modify
@ -118,7 +118,7 @@ static void
print_version (void)
{
printf ("gcov-dump (GCC) %s\n", version_string);
printf ("Copyright (C) 2003 Free Software Foundation, Inc.\n");
printf ("Copyright (C) 2006 Free Software Foundation, Inc.\n");
printf ("This is free software; see the source for copying conditions.\n"
"There is NO warranty; not even for MERCHANTABILITY or \n"
"FITNESS FOR A PARTICULAR PURPOSE.\n\n");

View File

@ -1,7 +1,7 @@
/* Gcov.c: prepend line execution counts and branch probabilities to a
source file.
Copyright (C) 1990, 1991, 1992, 1993, 1994, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
Copyright (C) 1990, 1991, 1992, 1993, 1994, 1996, 1997, 1998, 1999,
2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
Contributed by James E. Wilson of Cygnus Support.
Mangled by Bob Manson of Cygnus Support.
Mangled further by Nathan Sidwell <nathan@codesourcery.com>
@ -420,7 +420,7 @@ static void
print_version (void)
{
fnotice (stdout, "gcov (GCC) %s\n", version_string);
fprintf (stdout, "Copyright %s 2004 Free Software Foundation, Inc.\n",
fprintf (stdout, "Copyright %s 2006 Free Software Foundation, Inc.\n",
_("(C)"));
fnotice (stdout,
_("This is free software; see the source for copying conditions.\n"

View File

@ -6445,7 +6445,7 @@ hoist_code (void)
insn_inserted_p = 0;
/* These tests should be the same as the tests above. */
if (TEST_BIT (hoist_vbeout[bb->index], i))
if (TEST_BIT (hoist_exprs[bb->index], i))
{
/* We've found a potentially hoistable expression, now
we look at every block BB dominates to see if it

View File

@ -30,6 +30,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "toplev.h"
#include "params.h"
#include "hosthooks.h"
#include "hosthooks-def.h"
#ifdef HAVE_SYS_RESOURCE_H
# include <sys/resource.h>
@ -458,21 +459,8 @@ gt_pch_save (FILE *f)
and on the rest it's a lot of work to do better.
(The extra work goes in HOST_HOOKS_GT_PCH_GET_ADDRESS and
HOST_HOOKS_GT_PCH_USE_ADDRESS.) */
mmi.preferred_base = host_hooks.gt_pch_get_address (mmi.size);
mmi.preferred_base = host_hooks.gt_pch_get_address (mmi.size, fileno (f));
#if HAVE_MMAP_FILE
if (mmi.preferred_base == NULL)
{
mmi.preferred_base = mmap (NULL, mmi.size,
PROT_READ | PROT_WRITE, MAP_PRIVATE,
fileno (state.f), 0);
if (mmi.preferred_base == (void *) MAP_FAILED)
mmi.preferred_base = NULL;
else
munmap (mmi.preferred_base, mmi.size);
}
#endif /* HAVE_MMAP_FILE */
ggc_pch_this_base (state.d, mmi.preferred_base);
state.ptrs = xmalloc (state.count * sizeof (*state.ptrs));
@ -526,7 +514,8 @@ gt_pch_save (FILE *f)
state.ptrs[i]->note_ptr_cookie,
relocate_ptrs, &state);
ggc_pch_write_object (state.d, state.f, state.ptrs[i]->obj,
state.ptrs[i]->new_addr, state.ptrs[i]->size, state.ptrs[i]->note_ptr_fn == gt_pch_p_S);
state.ptrs[i]->new_addr, state.ptrs[i]->size,
state.ptrs[i]->note_ptr_fn == gt_pch_p_S);
if (state.ptrs[i]->note_ptr_fn != gt_pch_p_S)
memcpy (state.ptrs[i]->obj, this_object, state.ptrs[i]->size);
}
@ -546,8 +535,7 @@ gt_pch_restore (FILE *f)
const struct ggc_root_tab *rti;
size_t i;
struct mmap_info mmi;
void *addr;
bool needs_read;
int result;
/* Delete any deletable objects. This makes ggc_pch_read much
faster, as it can be sure that no GCable objects remain other
@ -580,110 +568,95 @@ gt_pch_restore (FILE *f)
if (fread (&mmi, sizeof (mmi), 1, f) != 1)
fatal_error ("can't read PCH file: %m");
if (host_hooks.gt_pch_use_address (mmi.preferred_base, mmi.size))
{
#if HAVE_MMAP_FILE
void *mmap_result;
mmap_result = mmap (mmi.preferred_base, mmi.size,
PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED,
fileno (f), mmi.offset);
/* The file might not be mmap-able. */
needs_read = mmap_result == (void *) MAP_FAILED;
/* Sanity check for broken MAP_FIXED. */
if (! needs_read && mmap_result != mmi.preferred_base)
abort ();
#else
needs_read = true;
#endif
addr = mmi.preferred_base;
}
else
{
#if HAVE_MMAP_FILE
addr = mmap (mmi.preferred_base, mmi.size,
PROT_READ | PROT_WRITE, MAP_PRIVATE,
fileno (f), mmi.offset);
#if HAVE_MINCORE
if (addr != mmi.preferred_base)
{
size_t page_size = getpagesize();
char one_byte;
if (addr != (void *) MAP_FAILED)
munmap (addr, mmi.size);
/* We really want to be mapped at mmi.preferred_base
so we're going to resort to MAP_FIXED. But before,
make sure that we can do so without destroying a
previously mapped area, by looping over all pages
that would be affected by the fixed mapping. */
errno = 0;
for (i = 0; i < mmi.size; i+= page_size)
if (mincore ((char *)mmi.preferred_base + i, page_size,
(void *)&one_byte) == -1
&& errno == ENOMEM)
continue; /* The page is not mapped. */
else
break;
if (i >= mmi.size)
addr = mmap (mmi.preferred_base, mmi.size,
PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED,
fileno (f), mmi.offset);
}
#endif /* HAVE_MINCORE */
needs_read = addr == (void *) MAP_FAILED;
#else /* HAVE_MMAP_FILE */
needs_read = true;
#endif /* HAVE_MMAP_FILE */
if (needs_read)
addr = xmalloc (mmi.size);
}
if (needs_read)
result = host_hooks.gt_pch_use_address (mmi.preferred_base, mmi.size,
fileno (f), mmi.offset);
if (result < 0)
fatal_error ("had to relocate PCH");
if (result == 0)
{
if (fseek (f, mmi.offset, SEEK_SET) != 0
|| fread (&mmi, mmi.size, 1, f) != 1)
|| fread (mmi.preferred_base, mmi.size, 1, f) != 1)
fatal_error ("can't read PCH file: %m");
}
else if (fseek (f, mmi.offset + mmi.size, SEEK_SET) != 0)
fatal_error ("can't read PCH file: %m");
ggc_pch_read (f, addr);
if (addr != mmi.preferred_base)
{
for (rt = gt_ggc_rtab; *rt; rt++)
for (rti = *rt; rti->base != NULL; rti++)
for (i = 0; i < rti->nelt; i++)
{
char **ptr = (char **)((char *)rti->base + rti->stride * i);
if (*ptr != NULL)
*ptr += (size_t)addr - (size_t)mmi.preferred_base;
}
for (rt = gt_pch_cache_rtab; *rt; rt++)
for (rti = *rt; rti->base != NULL; rti++)
for (i = 0; i < rti->nelt; i++)
{
char **ptr = (char **)((char *)rti->base + rti->stride * i);
if (*ptr != NULL)
*ptr += (size_t)addr - (size_t)mmi.preferred_base;
}
sorry ("had to relocate PCH");
}
ggc_pch_read (f, mmi.preferred_base);
gt_pch_restore_stringpool ();
}
/* Default version of HOST_HOOKS_GT_PCH_GET_ADDRESS when mmap is not present.
Select no address whatsoever, and let gt_pch_save choose what it will with
malloc, presumably. */
void *
default_gt_pch_get_address (size_t size ATTRIBUTE_UNUSED,
int fd ATTRIBUTE_UNUSED)
{
return NULL;
}
/* Default version of HOST_HOOKS_GT_PCH_USE_ADDRESS when mmap is not present.
Allocate SIZE bytes with malloc. Return 0 if the address we got is the
same as base, indicating that the memory has been allocated but needs to
be read in from the file. Return -1 if the address differs, to relocation
of the PCH file would be required. */
int
default_gt_pch_use_address (void *base, size_t size, int fd ATTRIBUTE_UNUSED,
size_t offset ATTRIBUTE_UNUSED)
{
void *addr = xmalloc (size);
return (addr == base) - 1;
}
#if HAVE_MMAP_FILE
/* Default version of HOST_HOOKS_GT_PCH_GET_ADDRESS when mmap is present.
We temporarily allocate SIZE bytes, and let the kernel place the data
whereever it will. If it worked, that's our spot, if not we're likely
to be in trouble. */
void *
mmap_gt_pch_get_address (size_t size, int fd)
{
void *ret;
ret = mmap (NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
if (ret == (void *) MAP_FAILED)
ret = NULL;
else
munmap (ret, size);
return ret;
}
/* Default version of HOST_HOOKS_GT_PCH_USE_ADDRESS when mmap is present.
Map SIZE bytes of FD+OFFSET at BASE. Return 1 if we succeeded at
mapping the data at BASE, -1 if we couldn't.
This version assumes that the kernel honors the START operand of mmap
even without MAP_FIXED if START through START+SIZE are not currently
mapped with something. */
int
mmap_gt_pch_use_address (void *base, size_t size, int fd, size_t offset)
{
void *addr;
/* We're called with size == 0 if we're not planning to load a PCH
file at all. This allows the hook to free any static space that
we might have allocated at link time. */
if (size == 0)
return -1;
addr = mmap (base, size, PROT_READ | PROT_WRITE, MAP_PRIVATE,
fd, offset);
return addr == base ? 1 : -1;
}
#endif /* HAVE_MMAP_FILE */
/* Modify the bound based on rlimits. Keep the smallest number found. */
static double
ggc_rlimit_bound (double limit)

View File

@ -96,6 +96,9 @@ struct allocno
/* Number of calls crossed by each allocno. */
int calls_crossed;
/* Number of calls that might throw crossed by each allocno. */
int throwing_calls_crossed;
/* Number of refs to each allocno. */
int n_refs;
@ -469,6 +472,8 @@ global_alloc (FILE *file)
allocno[num].reg = i;
allocno[num].size = PSEUDO_REGNO_SIZE (i);
allocno[num].calls_crossed += REG_N_CALLS_CROSSED (i);
allocno[num].throwing_calls_crossed
+= REG_N_THROWING_CALLS_CROSSED (i);
allocno[num].n_refs += REG_N_REFS (i);
allocno[num].freq += REG_FREQ (i);
if (allocno[num].live_length < REG_LIVE_LENGTH (i))
@ -1187,9 +1192,11 @@ find_reg (int num, HARD_REG_SET losers, int alt_regs_p, int accept_call_clobbere
{
/* Did not find a register. If it would be profitable to
allocate a call-clobbered register and save and restore it
around calls, do that. */
around calls, do that. Don't do this if it crosses any calls
that might throw. */
if (! accept_call_clobbered
&& allocno[num].calls_crossed != 0
&& allocno[num].throwing_calls_crossed == 0
&& CALLER_SAVE_PROFITABLE (allocno[num].n_refs,
allocno[num].calls_crossed))
{

View File

@ -213,21 +213,6 @@ hook_rtx_tree_int_null (tree a ATTRIBUTE_UNUSED, int b ATTRIBUTE_UNUSED)
return NULL;
}
/* Generic hook that takes a size_t and returns NULL. */
void *
hook_voidp_size_t_null (size_t a ATTRIBUTE_UNUSED)
{
return NULL;
}
/* Generic hook that takes a size_t and a pointer and returns false. */
bool
hook_bool_voidp_size_t_false (void * a ATTRIBUTE_UNUSED,
size_t b ATTRIBUTE_UNUSED)
{
return false;
}
/* Generic hook that takes a tree and returns a NULL string. */
const char *
hook_constcharptr_tree_null (tree t ATTRIBUTE_UNUSED)

View File

@ -58,7 +58,5 @@ extern bool hook_bool_tree_tree_false (tree, tree);
extern rtx hook_rtx_rtx_identity (rtx);
extern rtx hook_rtx_rtx_null (rtx);
extern rtx hook_rtx_tree_int_null (tree, int);
extern void * hook_voidp_size_t_null (size_t);
extern bool hook_bool_voidp_size_t_false (void *, size_t);
extern const char *hook_constcharptr_tree_null (tree);
#endif

View File

@ -24,8 +24,18 @@ Boston, MA 02111-1307, USA. */
#include "hooks.h"
#define HOST_HOOKS_EXTRA_SIGNALS hook_void_void
#define HOST_HOOKS_GT_PCH_GET_ADDRESS hook_voidp_size_t_null
#define HOST_HOOKS_GT_PCH_USE_ADDRESS hook_bool_voidp_size_t_false
#if HAVE_MMAP_FILE
#define HOST_HOOKS_GT_PCH_GET_ADDRESS mmap_gt_pch_get_address
#define HOST_HOOKS_GT_PCH_USE_ADDRESS mmap_gt_pch_use_address
#else
#define HOST_HOOKS_GT_PCH_GET_ADDRESS default_gt_pch_get_address
#define HOST_HOOKS_GT_PCH_USE_ADDRESS default_gt_pch_use_address
#endif
extern void* default_gt_pch_get_address (size_t, int);
extern int default_gt_pch_use_address (void *, size_t, int, size_t);
extern void* mmap_gt_pch_get_address (size_t, int);
extern int mmap_gt_pch_use_address (void *, size_t, int, size_t);
/* The structure is defined in hosthooks.h. */
#define HOST_HOOKS_INITIALIZER { \

View File

@ -25,8 +25,16 @@ struct host_hooks
{
void (*extra_signals) (void);
void * (*gt_pch_get_address) (size_t);
bool (*gt_pch_use_address) (void *, size_t);
/* Identify an address that's likely to be free in a subsequent invocation
of the compiler. The area should be able to hold SIZE bytes. FD is an
open file descriptor if the host would like to probe with mmap. */
void * (*gt_pch_get_address) (size_t size, int fd);
/* ADDR is an address returned by gt_pch_get_address. Attempt to allocate
SIZE bytes at the same address and load it with the data from FD at
OFFSET. Return -1 if we couldn't allocate memory at ADDR, return 0
if the memory is allocated but the data not loaded, return 1 if done. */
int (*gt_pch_use_address) (void *addr, size_t size, int fd, size_t offset);
/* Whenever you add entries here, make sure you adjust hosthooks-def.h. */
};

View File

@ -120,6 +120,11 @@ struct qty
int n_calls_crossed;
/* Number of times a reg tied to given qty lives across a CALL_INSN
that might throw. */
int n_throwing_calls_crossed;
/* The register number of one pseudo register whose reg_qty value is Q.
This register should be the head of the chain
maintained in reg_next_in_qty. */
@ -317,6 +322,7 @@ alloc_qty (int regno, enum machine_mode mode, int size, int birth)
qty[qtyno].mode = mode;
qty[qtyno].birth = birth;
qty[qtyno].n_calls_crossed = REG_N_CALLS_CROSSED (regno);
qty[qtyno].n_throwing_calls_crossed = REG_N_THROWING_CALLS_CROSSED (regno);
qty[qtyno].min_class = reg_preferred_class (regno);
qty[qtyno].alternate_class = reg_alternate_class (regno);
qty[qtyno].n_refs = REG_N_REFS (regno);
@ -1119,6 +1125,7 @@ update_equiv_regs (void)
REG_BASIC_BLOCK (regno) = bb->index;
REG_N_CALLS_CROSSED (regno) = 0;
REG_N_THROWING_CALLS_CROSSED (regno) = 0;
REG_LIVE_LENGTH (regno) = 2;
if (insn == BB_HEAD (bb))
@ -1946,6 +1953,8 @@ combine_regs (rtx usedreg, rtx setreg, int may_save_copy, int insn_number,
/* Update info about quantity SQTY. */
qty[sqty].n_calls_crossed += REG_N_CALLS_CROSSED (sreg);
qty[sqty].n_throwing_calls_crossed
+= REG_N_THROWING_CALLS_CROSSED (sreg);
qty[sqty].n_refs += REG_N_REFS (sreg);
qty[sqty].freq += REG_FREQ (sreg);
if (usize < ssize)
@ -2251,12 +2260,14 @@ find_free_reg (enum reg_class class, enum machine_mode mode, int qtyno,
/* We need not check to see if the current function has nonlocal
labels because we don't put any pseudos that are live over calls in
registers in that case. */
registers in that case. Avoid putting pseudos crossing calls that
might throw into call used registers. */
if (! accept_call_clobbered
&& flag_caller_saves
&& ! just_try_suggested
&& qty[qtyno].n_calls_crossed != 0
&& qty[qtyno].n_throwing_calls_crossed == 0
&& CALLER_SAVE_PROFITABLE (qty[qtyno].n_refs,
qty[qtyno].n_calls_crossed))
{

View File

@ -1,6 +1,6 @@
/* longlong.h -- definitions for mixed size 32/64 bit arithmetic.
Copyright (C) 1991, 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000
Free Software Foundation, Inc.
Copyright (C) 1991, 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
2005 Free Software Foundation, Inc.
This definition file is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public
@ -646,7 +646,9 @@ UDItype __umulsidi3 (USItype, USItype);
|| defined (__powerpc__) /* gcc */ \
|| defined (__POWERPC__) /* BEOS */ \
|| defined (__ppc__) /* Darwin */ \
|| defined (PPC) /* GNU/Linux, SysV */ \
|| (defined (PPC) && ! defined (CPU_FAMILY)) /* gcc 2.7.x GNU&SysV */ \
|| (defined (PPC) && defined (CPU_FAMILY) /* VxWorks */ \
&& CPU_FAMILY == PPC) \
) && W_TYPE_SIZE == 32
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
do { \
@ -684,7 +686,10 @@ UDItype __umulsidi3 (USItype, USItype);
__asm__ ("{cntlz|cntlzw} %0,%1" : "=r" (count) : "r" (x))
#define COUNT_LEADING_ZEROS_0 32
#if defined (_ARCH_PPC) || defined (__powerpc__) || defined (__POWERPC__) \
|| defined (__ppc__) || defined (PPC)
|| defined (__ppc__) \
|| (defined (PPC) && ! defined (CPU_FAMILY)) /* gcc 2.7.x GNU&SysV */ \
|| (defined (PPC) && defined (CPU_FAMILY) /* VxWorks */ \
&& CPU_FAMILY == PPC)
#define umul_ppmm(ph, pl, m0, m1) \
do { \
USItype __m0 = (m0), __m1 = (m1); \

View File

@ -8396,17 +8396,6 @@ check_dbra_loop (struct loop *loop, int insn_count)
/* First check if we can do a vanilla loop reversal. */
if (initial_value == const0_rtx
/* If we have a decrement_and_branch_on_count,
prefer the NE test, since this will allow that
instruction to be generated. Note that we must
use a vanilla loop reversal if the biv is used to
calculate a giv or has a non-counting use. */
#if ! defined (HAVE_decrement_and_branch_until_zero) \
&& defined (HAVE_decrement_and_branch_on_count)
&& (! (add_val == 1 && loop->vtop
&& (bl->biv_count == 0
|| no_use_except_counting)))
#endif
&& GET_CODE (comparison_value) == CONST_INT
/* Now do postponed overflow checks on COMPARISON_VAL. */
&& ! (((comparison_val - add_val) ^ INTVAL (comparison_value))
@ -8418,13 +8407,6 @@ check_dbra_loop (struct loop *loop, int insn_count)
nonneg = 1;
cmp_code = GE;
}
else if (add_val == 1 && loop->vtop
&& (bl->biv_count == 0
|| no_use_except_counting))
{
add_adjust = 0;
cmp_code = NE;
}
else
return 0;

View File

@ -236,6 +236,23 @@ md5_process_bytes (buffer, len, ctx)
/* Process available complete blocks. */
if (len > 64)
{
#if !_STRING_ARCH_unaligned
/* To check alignment gcc has an appropriate operator. Other
compilers don't. */
# if __GNUC__ >= 2
# define UNALIGNED_P(p) (((md5_uintptr) p) % __alignof__ (md5_uint32) != 0)
# else
# define UNALIGNED_P(p) (((md5_uintptr) p) % sizeof (md5_uint32) != 0)
# endif
if (UNALIGNED_P (buffer))
while (len > 64)
{
md5_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx);
buffer = (const char *) buffer + 64;
len -= 64;
}
else
#endif
md5_process_block (buffer, len & ~63, ctx);
buffer = (const void *) ((const char *) buffer + (len & ~63));
len &= 63;

View File

@ -27,6 +27,8 @@
# include <limits.h>
#endif
#include "ansidecl.h"
/* The following contortions are an attempt to use the C preprocessor
to determine an unsigned integral type that is 32 bits wide. An
alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
@ -37,6 +39,7 @@
#ifdef _LIBC
# include <sys/types.h>
typedef u_int32_t md5_uint32;
typedef uintptr_t md5_uintptr;
#else
# define INT_MAX_32_BITS 2147483647
@ -64,6 +67,9 @@ typedef u_int32_t md5_uint32;
# endif
# endif
# endif
/* We have to make a guess about the integer type equivalent in size
to pointers which should always be correct. */
typedef unsigned long int md5_uintptr;
#endif
#undef __P
@ -83,7 +89,7 @@ struct md5_ctx
md5_uint32 total[2];
md5_uint32 buflen;
char buffer[128];
char buffer[128] ATTRIBUTE_ALIGNED_ALIGNOF(md5_uint32);
};
/*

View File

@ -1,5 +1,5 @@
/* Read and manage MIPS symbol tables from object modules.
Copyright (C) 1991, 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2003
Copyright (C) 1991, 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2003, 2006
Free Software Foundation, Inc.
Contributed by hartzell@boulder.colorado.edu,
Rewritten by meissner@osf.org.
@ -1412,7 +1412,7 @@ main (int argc, char **argv)
if (version)
{
printf ("mips-tdump (GCC) %s\n", version_string);
fputs ("Copyright (C) 2003 Free Software Foundation, Inc.\n", stdout);
fputs ("Copyright (C) 2006 Free Software Foundation, Inc.\n", stdout);
fputs ("This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n",
stdout);

View File

@ -3,7 +3,7 @@
in the form of comments (the mips assembler does not support
assembly access to debug information).
Copyright (C) 1991, 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2001,
2002, 2003, 2004 Free Software Foundation, Inc.
2002, 2003, 2004, 2006 Free Software Foundation, Inc.
Contributed by Michael Meissner (meissner@cygnus.com).
This file is part of GCC.
@ -4774,7 +4774,7 @@ main (int argc, char **argv)
if (version)
{
printf (_("mips-tfile (GCC) %s\n"), version_string);
fputs ("Copyright (C) 2004 Free Software Foundation, Inc.\n", stdout);
fputs ("Copyright (C) 2006 Free Software Foundation, Inc.\n", stdout);
fputs (_("This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"),
stdout);

View File

@ -246,6 +246,9 @@ for file in $LIB2ADDEH; do
fi
done
# Flag whether we need eh_dummy.c
need_eh_dummy=
if [ "$SHLIB_LINK" ]; then
# Those should be in libgcc_eh.a.
for file in $LIB2ADDEHSTATIC; do
@ -260,6 +263,23 @@ if [ "$SHLIB_LINK" ]; then
oname=`echo $name | sed -e 's,.*/,,'`
libgcc2_eh_shared_objs="$libgcc2_eh_shared_objs ${oname}${objext}"
done
# If nothing went into libgcc_eh.a, create a dummy object -
# some linkers don't like totally empty archives.
if [ -z "$LIB2ADDEHSTATIC" ]; then
file=eh_dummy.c
libgcc2_eh_static_objs="$libgcc2_eh_static_objs eh_dummy${objext}"
need_eh_dummy=1
for ml in $MULTILIBS; do
dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
out="libgcc/${dir}/eh_dummy${objext}"
echo $out: stmp-dirs $file
echo " $gcc_compile" $flags -fexceptions -c $file -o $out
done
fi
fi
for file in $LIB2ADD_ST; do
@ -649,6 +669,11 @@ done
echo ""
echo "all: $all"
if [ "$need_eh_dummy" ]; then
echo "eh_dummy.c:"
echo " echo 'int __libgcc_eh_dummy;' > \$@"
fi
echo ""
echo "install: $all"
for ml in $MULTILIBS; do

View File

@ -1078,7 +1078,7 @@ expand_binop (enum machine_mode mode, optab binoptab, rtx op0, rtx op1,
&& ashl_optab->handlers[(int) word_mode].insn_code != CODE_FOR_nothing
&& lshr_optab->handlers[(int) word_mode].insn_code != CODE_FOR_nothing)
{
rtx insns, equiv_value;
rtx insns;
rtx into_target, outof_target;
rtx into_input, outof_input;
rtx inter;
@ -1174,20 +1174,7 @@ expand_binop (enum machine_mode mode, optab binoptab, rtx op0, rtx op1,
if (inter != 0)
{
if (binoptab->code != UNKNOWN)
equiv_value = gen_rtx_fmt_ee (binoptab->code, mode, op0, op1);
else
equiv_value = 0;
/* We can't make this a no conflict block if this is a word swap,
because the word swap case fails if the input and output values
are in the same register. */
if (shift_count != BITS_PER_WORD)
emit_no_conflict_block (insns, target, op0, op1, equiv_value);
else
emit_insn (insns);
emit_insn (insns);
return target;
}
}

View File

@ -178,7 +178,7 @@ pp_base_indent (pretty_printer *pp)
%p: pointer.
%m: strerror(text->err_no) - does not consume a value from args_ptr.
%%: `%'.
%*.s: a substring the length of which is specified by an integer.
%.*s: a substring the length of which is specified by an integer.
%H: location_t. */
void
pp_base_format_text (pretty_printer *pp, text_info *text)

View File

@ -429,7 +429,7 @@ reg_to_stack (rtx first, FILE *file)
Also need to rebuild life when superblock scheduling is done
as it don't update liveness yet. */
if (!optimize
|| (flag_sched2_use_superblocks
|| ((flag_sched2_use_superblocks || flag_sched2_use_traces)
&& flag_schedule_insns_after_reload))
{
count_or_remove_death_notes (NULL, 1);
@ -1231,9 +1231,9 @@ swap_rtx_condition (rtx insn)
pat = PATTERN (insn);
}
/* See if this is, or ends in, a fnstsw, aka unspec 9. If so, we're
not doing anything with the cc value right now. We may be able to
search for one though. */
/* See if this is, or ends in, a fnstsw. If so, we're not doing anything
with the cc value right now. We may be able to search for one
though. */
if (GET_CODE (pat) == SET
&& GET_CODE (SET_SRC (pat)) == UNSPEC
@ -1252,9 +1252,13 @@ swap_rtx_condition (rtx insn)
return 0;
}
/* We haven't found it. */
if (insn == BB_END (current_block))
return 0;
/* So we've found the insn using this value. If it is anything
other than sahf, aka unspec 10, or the value does not die
(meaning we'd have to search further), then we must give up. */
other than sahf or the value does not die (meaning we'd have
to search further), then we must give up. */
pat = PATTERN (insn);
if (GET_CODE (pat) != SET
|| GET_CODE (SET_SRC (pat)) != UNSPEC

View File

@ -675,7 +675,8 @@ scan_rtx (rtx insn, rtx *loc, enum reg_class class,
case SET:
scan_rtx (insn, &SET_SRC (x), class, action, OP_IN, 0);
scan_rtx (insn, &SET_DEST (x), class, action, OP_OUT, 0);
scan_rtx (insn, &SET_DEST (x), class, action,
GET_CODE (PATTERN (insn)) == COND_EXEC ? OP_INOUT : OP_OUT, 0);
return;
case STRICT_LOW_PART:
@ -700,7 +701,8 @@ scan_rtx (rtx insn, rtx *loc, enum reg_class class,
abort ();
case CLOBBER:
scan_rtx (insn, &SET_DEST (x), class, action, OP_OUT, 1);
scan_rtx (insn, &SET_DEST (x), class, action,
GET_CODE (PATTERN (insn)) == COND_EXEC ? OP_INOUT : OP_OUT, 1);
return;
case EXPR_LIST:

View File

@ -59,6 +59,7 @@ typedef struct reg_info_def
int deaths; /* # of times (REG n) dies */
int live_length; /* # of instructions (REG n) is live */
int calls_crossed; /* # of calls (REG n) is live across */
int throw_calls_crossed; /* # of calls that may throw (REG n) is live across */
int basic_block; /* # of basic blocks (REG n) is used in */
char changes_mode; /* whether (SUBREG (REG n)) exists and
is illegal. */
@ -125,6 +126,12 @@ extern varray_type reg_n_info;
#define REG_N_CALLS_CROSSED(N) (VARRAY_REG (reg_n_info, N)->calls_crossed)
/* Indexed by N, gives number of CALL_INSNS that may throw, across which
(REG n) is live. */
#define REG_N_THROWING_CALLS_CROSSED(N) \
(VARRAY_REG (reg_n_info, N)->throw_calls_crossed)
/* Total number of instructions at which (REG n) is live.
The larger this is, the less priority (REG n) gets for
allocation in a hard register (in global-alloc).

View File

@ -1639,6 +1639,7 @@ extern rtx simplify_gen_subreg (enum machine_mode, rtx, enum machine_mode,
extern rtx simplify_replace_rtx (rtx, rtx, rtx);
extern rtx simplify_rtx (rtx);
extern rtx avoid_constant_pool_reference (rtx);
extern bool constant_pool_reference_p (rtx);
/* In function.c */
extern rtx gen_mem_addressof (rtx, tree, int);

Some files were not shown because too many files have changed in this diff Show More