This commit was generated by cvs2svn to compensate for changes in r122180,

which included commits to RCS files with non-trunk default branches.
This commit is contained in:
kan 2003-11-07 02:43:04 +00:00
commit 1f79a7c5d0
89 changed files with 4546 additions and 2665 deletions

File diff suppressed because it is too large Load Diff

View File

@ -431,7 +431,7 @@ else
# Systems known to be in this category are Windows (all variants),
# VMS, and Darwin.
case "$host_os" in
vms* | cygwin* | pe | mingw* | darwin*)
vms* | cygwin* | pe | mingw* | darwin* | ultrix* | hpux10* | hpux11.00)
gcc_cv_func_mmap_dev_zero=no ;;
*)
gcc_cv_func_mmap_dev_zero=yes;;

View File

@ -796,7 +796,7 @@ find_base_value (src)
return reg_base_value[regno];
}
return src;
return 0;
case MEM:
/* Check for an argument passed in memory. Only record in the

View File

@ -94,6 +94,8 @@ inline_forbidden_p (nodep, walk_subtrees, fn)
arguments. */
case BUILT_IN_VA_START:
case BUILT_IN_STDARG_START:
case BUILT_IN_NEXT_ARG:
case BUILT_IN_VA_END:
#if 0
/* Functions that need information about the address of the
caller can't (shouldn't?) be inlined. */

View File

@ -4247,6 +4247,11 @@ convert_for_assignment (type, rhs, errtype, fundecl, funname, parmnum)
errtype, funname, parmnum);
return convert (type, rhs);
}
else if (codel == POINTER_TYPE && coder == ARRAY_TYPE)
{
error ("invalid use of non-lvalue array");
return error_mark_node;
}
else if (codel == POINTER_TYPE && coder == INTEGER_TYPE)
{
/* An explicit constant 0 can convert to a pointer,
@ -4765,8 +4770,14 @@ digest_init (type, init, require_constant)
if (code == VECTOR_TYPE
&& comptypes (TREE_TYPE (inside_init), type)
&& TREE_CONSTANT (inside_init))
return build_vector (type, TREE_OPERAND (inside_init, 1));
{
if (TREE_CODE (inside_init) == VECTOR_CST
&& comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (inside_init)),
TYPE_MAIN_VARIANT (type)))
return inside_init;
else
return build_vector (type, CONSTRUCTOR_ELTS (inside_init));
}
/* Any type can be initialized
from an expression of the same type, optionally with braces. */
@ -4785,8 +4796,16 @@ digest_init (type, init, require_constant)
TREE_TYPE (type)))))
{
if (code == POINTER_TYPE)
inside_init = default_function_array_conversion (inside_init);
{
inside_init = default_function_array_conversion (inside_init);
if (TREE_CODE (TREE_TYPE (inside_init)) == ARRAY_TYPE)
{
error_init ("invalid use of non-lvalue array");
return error_mark_node;
}
}
if (require_constant && !flag_isoc99
&& TREE_CODE (inside_init) == COMPOUND_LITERAL_EXPR)
{
@ -5742,6 +5761,8 @@ set_init_index (first, last)
error_init ("nonconstant array index in initializer");
else if (TREE_CODE (constructor_type) != ARRAY_TYPE)
error_init ("array index in non-array initializer");
else if (tree_int_cst_sgn (first) == -1)
error_init ("array index in initializer exceeds array bounds");
else if (constructor_max_index
&& tree_int_cst_lt (constructor_max_index, first))
error_init ("array index in initializer exceeds array bounds");

View File

@ -641,6 +641,10 @@ emit_call_1 (funexp, fndecl, funtype, stack_size, rounded_stack_size,
if the context of the call as a whole permits. */
inhibit_defer_pop = old_inhibit_defer_pop;
/* Don't bother cleaning up after a noreturn function. */
if (ecf_flags & (ECF_NORETURN | ECF_LONGJMP))
return;
if (n_popped > 0)
{
if (!already_popped)
@ -3101,6 +3105,7 @@ expand_call (exp, target, ignore)
/* Verify that we've deallocated all the stack we used. */
if (pass
&& ! (flags & (ECF_NORETURN | ECF_LONGJMP))
&& old_stack_allocated != stack_pointer_delta - pending_stack_adjust)
abort ();
@ -3194,6 +3199,10 @@ expand_call (exp, target, ignore)
}
emit_barrier_after (last);
/* Stack adjustments after a noreturn call are dead code. */
stack_pointer_delta = old_stack_allocated;
pending_stack_adjust = 0;
}
if (flags & ECF_LONGJMP)
@ -4017,9 +4026,23 @@ emit_library_call_value_1 (retval, orgfun, value, fn_type, outmode, nargs, p)
(save_mode,
plus_constant (argblock,
argvec[argnum].offset.constant)));
argvec[argnum].save_area = gen_reg_rtx (save_mode);
if (save_mode == BLKmode)
{
argvec[argnum].save_area
= assign_stack_temp (BLKmode,
argvec[argnum].size.constant, 0);
emit_move_insn (argvec[argnum].save_area, stack_area);
emit_block_move (validize_mem (argvec[argnum].save_area),
stack_area,
GEN_INT (argvec[argnum].size.constant),
BLOCK_OP_CALL_PARM);
}
else
{
argvec[argnum].save_area = gen_reg_rtx (save_mode);
emit_move_insn (argvec[argnum].save_area, stack_area);
}
}
}
@ -4259,7 +4282,13 @@ emit_library_call_value_1 (retval, orgfun, value, fn_type, outmode, nargs, p)
plus_constant (argblock,
argvec[count].offset.constant)));
emit_move_insn (stack_area, argvec[count].save_area);
if (save_mode == BLKmode)
emit_block_move (stack_area,
validize_mem (argvec[count].save_area),
GEN_INT (argvec[count].size.constant),
BLOCK_OP_CALL_PARM);
else
emit_move_insn (stack_area, argvec[count].save_area);
}
highest_outgoing_arg_in_use = initial_highest_arg_in_use;

View File

@ -125,6 +125,8 @@ try_simplify_condjump (cbranch_block)
basic_block jump_block, jump_dest_block, cbranch_dest_block;
edge cbranch_jump_edge, cbranch_fallthru_edge;
rtx cbranch_insn;
rtx insn, next;
rtx end;
/* Verify that there are exactly two successors. */
if (!cbranch_block->succ
@ -177,6 +179,26 @@ try_simplify_condjump (cbranch_block)
cbranch_fallthru_edge->flags &= ~EDGE_FALLTHRU;
update_br_prob_note (cbranch_block);
end = jump_block->end;
/* Deleting a block may produce unreachable code warning even when we are
not deleting anything live. Supress it by moving all the line number
notes out of the block. */
for (insn = jump_block->head; insn != NEXT_INSN (jump_block->end);
insn = next)
{
next = NEXT_INSN (insn);
if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0)
{
if (insn == jump_block->end)
{
jump_block->end = PREV_INSN (insn);
if (insn == end)
break;
}
reorder_insns_nobb (insn, insn, end);
end = insn;
}
}
/* Delete the block with the unconditional jump, and clean up the mess. */
flow_delete_block (jump_block);
tidy_fallthru_edge (cbranch_jump_edge, cbranch_block, cbranch_dest_block);

View File

@ -804,19 +804,20 @@ flow_loops_find (loops, flags)
header->loop_depth = 0;
/* If we have an abnormal predecessor, do not consider the
loop (not worth the problems). */
for (e = header->pred; e; e = e->pred_next)
if (e->flags & EDGE_ABNORMAL)
break;
if (e)
continue;
for (e = header->pred; e; e = e->pred_next)
{
basic_block latch = e->src;
if (e->flags & EDGE_ABNORMAL)
{
if (more_latches)
{
RESET_BIT (headers, header->index);
num_loops--;
}
break;
}
abort ();
/* Look for back edges where a predecessor is dominated
by this block. A natural loop has a single entry

View File

@ -2261,8 +2261,12 @@ purge_dead_edges (bb)
continue;
else if ((e->flags & EDGE_EH) && can_throw_internal (insn))
/* Keep the edges that correspond to exceptions thrown by
this instruction. */
continue;
this instruction and rematerialize the EDGE_ABNORMAL flag
we just cleared above. */
{
e->flags |= EDGE_ABNORMAL;
continue;
}
/* We do not need this edge. */
bb->flags |= BB_DIRTY;

View File

@ -234,7 +234,7 @@ struct obstack temporary_obstack;
char * temporary_firstobj;
/* Holds the return value of pexecute. */
int pexecute_pid;
int pid;
/* Structure to hold all the directories in which to search for files to
execute. */
@ -1499,7 +1499,7 @@ collect_wait (prog)
{
int status;
pwait (pexecute_pid, &status, 0);
pwait (pid, &status, 0);
if (status)
{
if (WIFSIGNALED (status))
@ -1588,9 +1588,9 @@ collect_execute (prog, argv, redir)
dup2 (redir_handle, STDERR_FILENO);
}
pexecute_pid = pexecute (argv[0], argv, argv[0], NULL,
&errmsg_fmt, &errmsg_arg,
(PEXECUTE_FIRST | PEXECUTE_LAST | PEXECUTE_SEARCH));
pid = pexecute (argv[0], argv, argv[0], NULL,
&errmsg_fmt, &errmsg_arg,
(PEXECUTE_FIRST | PEXECUTE_LAST | PEXECUTE_SEARCH));
if (redir)
{
@ -1602,7 +1602,7 @@ collect_execute (prog, argv, redir)
close (redir_handle);
}
if (pexecute_pid == -1)
if (pid == -1)
fatal_perror (errmsg_fmt, errmsg_arg);
}
@ -2069,7 +2069,6 @@ scan_prog_file (prog_name, which_pass)
void (*quit_handler) PARAMS ((int));
char *real_nm_argv[4];
const char **nm_argv = (const char **) real_nm_argv;
int pid;
int argc = 0;
int pipe_fd[2];
char *p, buf[1024];
@ -2514,7 +2513,6 @@ scan_libraries (prog_name)
void (*quit_handler) PARAMS ((int));
char *real_ldd_argv[4];
const char **ldd_argv = (const char **) real_ldd_argv;
int pid;
int argc = 0;
int pipe_fd[2];
char buf[1024];

View File

@ -424,6 +424,7 @@ static int insn_cuid PARAMS ((rtx));
static void record_promoted_value PARAMS ((rtx, rtx));
static rtx reversed_comparison PARAMS ((rtx, enum machine_mode, rtx, rtx));
static enum rtx_code combine_reversed_comparison_code PARAMS ((rtx));
static void adjust_for_new_dest PARAMS ((rtx));
/* Substitute NEWVAL, an rtx expression, into INTO, a place in some
insn. The substitution can be undone by undo_all. If INTO is already
@ -1502,6 +1503,34 @@ cant_combine_insn_p (insn)
return 0;
}
/* Adjust INSN after we made a change to its destination.
Changing the destination can invalidate notes that say something about
the results of the insn and a LOG_LINK pointing to the insn. */
static void
adjust_for_new_dest (insn)
rtx insn;
{
rtx *loc;
/* For notes, be conservative and simply remove them. */
loc = &REG_NOTES (insn);
while (*loc)
{
enum reg_note kind = REG_NOTE_KIND (*loc);
if (kind == REG_EQUAL || kind == REG_EQUIV)
*loc = XEXP (*loc, 1);
else
loc = &XEXP (*loc, 1);
}
/* The new insn will have a destination that was previously the destination
of an insn just above it. Call distribute_links to make a LOG_LINK from
the next use of that destination. */
distribute_links (gen_rtx_INSN_LIST (VOIDmode, insn, NULL_RTX));
}
/* Try to combine the insns I1 and I2 into I3.
Here I1 and I2 appear earlier than I3.
I1 can be zero; then we combine just I2 into I3.
@ -2124,6 +2153,14 @@ try_combine (i3, i2, i1, new_direct_jump_p)
{
newpat = XVECEXP (newpat, 0, 1);
insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
if (insn_code_number >= 0)
{
/* If we will be able to accept this, we have made a change to the
destination of I3. This requires us to do a few adjustments. */
PATTERN (i3) = newpat;
adjust_for_new_dest (i3);
}
}
/* If we were combining three insns and the result is a simple SET
@ -2394,16 +2431,9 @@ try_combine (i3, i2, i1, new_direct_jump_p)
rtx link;
/* If we will be able to accept this, we have made a change to the
destination of I3. This can invalidate a LOG_LINKS pointing
to I3. No other part of combine.c makes such a transformation.
The new I3 will have a destination that was previously the
destination of I1 or I2 and which was used in i2 or I3. Call
distribute_links to make a LOG_LINK from the next use of
that destination. */
destination of I3. This requires us to do a few adjustments. */
PATTERN (i3) = newpat;
distribute_links (gen_rtx_INSN_LIST (VOIDmode, i3, NULL_RTX));
adjust_for_new_dest (i3);
/* I3 now uses what used to be its destination and which is
now I2's destination. That means we need a LOG_LINK from
@ -7812,6 +7842,7 @@ make_field_assignment (x)
&& (GET_MODE_SIZE (GET_MODE (XEXP (src, 0)))
< GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (src, 0)))))
&& GET_CODE (SUBREG_REG (XEXP (src, 0))) == ROTATE
&& GET_CODE (XEXP (SUBREG_REG (XEXP (src, 0)), 0)) == CONST_INT
&& INTVAL (XEXP (SUBREG_REG (XEXP (src, 0)), 0)) == -2
&& rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
{
@ -10209,6 +10240,11 @@ gen_binary (code, mode, op0, op1)
rtx result;
rtx tem;
if (GET_CODE (op0) == CLOBBER)
return op0;
else if (GET_CODE (op1) == CLOBBER)
return op1;
if (GET_RTX_CLASS (code) == 'c'
&& swap_commutative_operands_p (op0, op1))
tem = op0, op0 = op1, op1 = tem;
@ -12569,6 +12605,7 @@ distribute_notes (notes, from_insn, i3, i2, elim_i2, elim_i1)
abort ();
break;
case REG_ALWAYS_RETURN:
case REG_NORETURN:
case REG_SETJMP:
/* These notes must remain with the call. It should not be
@ -13070,8 +13107,8 @@ distribute_notes (notes, from_insn, i3, i2, elim_i2, elim_i1)
}
/* Similarly to above, distribute the LOG_LINKS that used to be present on
I3, I2, and I1 to new locations. This is also called in one case to
add a link pointing at I3 when I3's destination is changed. */
I3, I2, and I1 to new locations. This is also called to add a link
pointing at I3 when I3's destination is changed. */
static void
distribute_links (links)

View File

@ -298,11 +298,11 @@ xscale-*-*)
;;
i[34567]86-*-*)
cpu_type=i386
extra_headers="mmintrin.h xmmintrin.h"
extra_headers="mmintrin.h xmmintrin.h emmintrin.h pmmintrin.h"
;;
x86_64-*-*)
cpu_type=i386
extra_headers="mmintrin.h xmmintrin.h"
extra_headers="mmintrin.h xmmintrin.h emmintrin.h pmmintrin.h"
;;
ia64-*-*)
extra_headers=ia64intrin.h
@ -961,13 +961,11 @@ hppa*64*-*-hpux11*)
then
target_cpu_default="${target_cpu_default}|MASK_GNU_LD"
fi
# if [ x$enable_threads = x ]; then
# enable_threads=$have_pthread_h
# fi
# if [ x$enable_threads = xyes ]; then
# thread_file='dce'
# tmake_file="${tmake_file} pa/t-dce-thr"
# fi
case x${enable_threads} in
xyes | xposix )
thread_file=posix
;;
esac
install_headers_dir=install-headers-cpio
;;
hppa1.1-*-hpux11* | hppa2*-*-hpux11*)
@ -976,13 +974,11 @@ hppa1.1-*-hpux11* | hppa2*-*-hpux11*)
xm_defines=POSIX
tmake_file="pa/t-pa pa/t-pa-hpux pa/t-hpux-shlib"
xmake_file="pa/x-ada"
# if test x$enable_threads = x; then
# enable_threads=$have_pthread_h
# fi
# if test x$enable_threads = xyes; then
# thread_file='dce'
# tmake_file="${tmake_file} pa/t-dce-thr"
# fi
case x${enable_threads} in
xyes | xposix )
thread_file=posix
;;
esac
install_headers_dir=install-headers-cpio
use_collect2=yes
;;
@ -991,13 +987,11 @@ hppa1.0-*-hpux11*)
xm_defines=POSIX
tmake_file="pa/t-pa pa/t-pa-hpux pa/t-hpux-shlib"
xmake_file="pa/x-ada"
# if test x$enable_threads = x; then
# enable_threads=$have_pthread_h
# fi
# if test x$enable_threads = xyes; then
# thread_file='dce'
# tmake_file="${tmake_file} pa/t-dce-thr"
# fi
case x${enable_threads} in
xyes | xposix )
thread_file=posix
;;
esac
install_headers_dir=install-headers-cpio
use_collect2=yes
;;
@ -1244,15 +1238,13 @@ i[34567]86-*-rtems*)
i[34567]86-*-sco3.2v5*) # 80386 running SCO Open Server 5
xm_defines=POSIX
install_headers_dir=install-headers-cpio
tm_file="${tm_file} i386/unix.h i386/att.h i386/sco5.h"
tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h i386/sco5.h"
if test x$gas = xyes
then
tm_file="usegas.h ${tm_file}"
tmake_file=i386/t-sco5gas
else
tmake_file=i386/t-sco5
fi
extra_parts="crti.o crtbegin.o crtend.o crtbeginS.o crtendS.o"
tmake_file=i386/t-sco5
extra_parts="crtbegin.o crtend.o"
;;
i[34567]86-*-solaris2*)
xm_defines="POSIX SMALL_ARG_MAX"
@ -1486,14 +1478,19 @@ ia64*-*-linux*)
tmake_file="t-slibgcc-elf-ver t-linux ia64/t-ia64 ia64/t-glibc"
target_cpu_default="MASK_GNU_AS|MASK_GNU_LD"
extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtfastmath.o"
if test x"$use_libunwind_exceptions" = xyes; then
tmake_file="$tmake_file t-libunwind"
fi
;;
ia64*-*-hpux*)
tm_file="${tm_file} dbxelf.h elfos.h svr4.h ia64/sysv4.h ia64/hpux.h ia64/hpux_longdouble.h"
tmake_file="ia64/t-ia64 ia64/t-hpux"
target_cpu_default="MASK_GNU_AS"
if test x$enable_threads = xyes; then
thread_file='posix'
fi
case x$enable_threads in
xyes | xposix )
thread_file=posix
;;
esac
use_collect2=no
c_target_objs="ia64-c.o"
cxx_target_objs="ia64-c.o"
@ -1751,7 +1748,7 @@ m68k-*-rtemscoff*) # would otherwise be caught by m68k-*-rtems*
;;
m68k-*-rtems*)
xm_defines=POSIX
tmake_file="m68k/t-m68kbare t-rtems m68k/t-crtstuff"
tmake_file="m68k/t-m68kbare m68k/t-crtstuff t-rtems m68k/t-rtems"
tm_file="m68k/m68k-none.h m68k/m68kelf.h dbxelf.h elfos.h m68k/m68kemb.h m68k/m68020-elf.h m68k/rtemself.h rtems.h"
extra_parts="crtbegin.o crtend.o"
if test x$enable_threads = xyes; then
@ -1968,7 +1965,7 @@ mips64orion-*-rtems*)
mips*-*-rtems*)
xm_defines=POSIX
tm_file="${tm_file} mips/elf.h mips/rtems.h rtems.h"
tmake_file="mips/t-elf t-rtems"
tmake_file="mips/t-elf t-rtems mips/t-rtems"
if test x$enable_threads = xyes; then
thread_file='rtems'
fi
@ -2308,7 +2305,7 @@ sh-*-rtems*)
fi
;;
sh-*-linux* | sh[2346lbe]*-*-linux*)
tmake_file="sh/t-sh sh/t-elf sh/t-linux"
tmake_file="sh/t-sh sh/t-elf"
case $machine in
sh*be-*-* | sh*eb-*-*) ;;
*)
@ -2316,6 +2313,7 @@ sh-*-linux* | sh[2346lbe]*-*-linux*)
tmake_file="${tmake_file} sh/t-le"
;;
esac
tmake_file="${tmake_file} sh/t-linux"
tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/linux.h"
gas=yes gnu_ld=yes
case $machine in
@ -2525,7 +2523,7 @@ sparc-*-solaris2*)
tm_file="${tm_file} sparc/sol26-sld.h"
fi
;;
*-*-solaris2.[789])
*-*-solaris2.[789] | *-*-solaris2.1[0-9])
tm_file="sparc/biarch64.h ${tm_file} sparc/sol2-bi.h"
if test x$gnu_ld = xyes; then
tm_file="${tm_file} sparc/sol2-gld-bi.h"

View File

@ -1,4 +1,4 @@
/* config.in. Generated automatically from configure.in by autoheader 2.13. */
/* config.in. Generated automatically from configure.in by autoheader. */
/* Define if using alloca.c. */
#undef C_ALLOCA
@ -501,6 +501,12 @@
/* Define if host mkdir takes a single argument. */
#undef MKDIR_TAKES_ONE_ARG
/* Define 0/1 to force the choice for exception handling model. */
#undef CONFIG_SJLJ_EXCEPTIONS
/* Define if gcc should use -lunwind. */
#undef USE_LIBUNWIND_EXCEPTIONS
/* Define to the name of a file containing a list of extra machine modes
for this architecture. */
#undef EXTRA_MODES_FILE
@ -582,6 +588,9 @@
/* Define if your assembler supports offsetable %lo(). */
#undef HAVE_AS_OFFSETABLE_LO10
/* Define if your assembler supports the Sun syntax for cmov. */
#undef HAVE_AS_IX86_CMOV_SUN_SYNTAX
/* Define true if the assembler supports '.long foo@GOTOFF'. */
#undef HAVE_AS_GOTOFF_IN_DATA
@ -608,12 +617,6 @@
/* Define if your MIPS libgloss linker scripts consistently include STARTUP directives. */
#undef HAVE_MIPS_LIBGLOSS_STARTUP_DIRECTIVES
/* Define 0/1 to force the choice for exception handling model. */
#undef CONFIG_SJLJ_EXCEPTIONS
/* Define if gcc should use -lunwind. */
#undef USE_LIBUNWIND_EXCEPTIONS
/* Bison unconditionally undefines `const' if neither `__STDC__' nor
__cplusplus are defined. That's a problem since we use `const' in

View File

@ -1276,6 +1276,7 @@ do { \
/* Before the prologue, RA lives in $26. */
#define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, 26)
#define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (26)
#define DWARF_ALT_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (64)
/* Describe how we implement __builtin_eh_return. */
#define EH_RETURN_DATA_REGNO(N) ((N) < 4 ? (N) + 16 : INVALID_REGNUM)

View File

@ -5399,7 +5399,7 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi,none"
[(set (match_operand:DI 0 "register_operand" "=r")
(unspec:DI [(match_operand:DI 1 "symbolic_operand" "")]
UNSPEC_SYMBOL))]
"TARGET_EXPLICIT_RELOCS && flag_inline_functions"
"TARGET_EXPLICIT_RELOCS"
"#"
""
[(set (match_dup 0) (match_dup 1))]

View File

@ -61,6 +61,9 @@ Boston, MA 02111-1307, USA. */
#define TARGET_HAS_F_SETLKW
#define LINK_GCC_C_SEQUENCE_SPEC \
"%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}"
/* Do code reading to identify a signal frame, and set the frame
state data appropriately. See unwind-dw2.c for the structs. */
@ -78,6 +81,8 @@ Boston, MA 02111-1307, USA. */
if (pc_[0] != 0x47fe0410 /* mov $30,$16 */ \
|| pc_[2] != 0x00000083 /* callsys */) \
break; \
if ((CONTEXT)->cfa == 0) \
break; \
if (pc_[1] == 0x201f0067) /* lda $0,NR_sigreturn */ \
sc_ = (CONTEXT)->cfa; \
else if (pc_[1] == 0x201f015f) /* lda $0,NR_rt_sigreturn */ \
@ -106,8 +111,8 @@ Boston, MA 02111-1307, USA. */
(FS)->regs.reg[i_+32].loc.offset \
= (long)&sc_->sc_fpregs[i_] - new_cfa_; \
} \
(FS)->regs.reg[31].how = REG_SAVED_OFFSET; \
(FS)->regs.reg[31].loc.offset = (long)&sc_->sc_pc - new_cfa_; \
(FS)->retaddr_column = 31; \
(FS)->regs.reg[64].how = REG_SAVED_OFFSET; \
(FS)->regs.reg[64].loc.offset = (long)&sc_->sc_pc - new_cfa_; \
(FS)->retaddr_column = 64; \
goto SUCCESS; \
} while (0)

View File

@ -123,3 +123,6 @@ Boston, MA 02111-1307, USA. */
#undef CC1_SPEC
#define CC1_SPEC "%{profile:-p}"
#define LINK_GCC_C_SEQUENCE_SPEC \
"%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}"

View File

@ -380,6 +380,10 @@ do { text_section (); \
|| DECL_INITIAL (DECL)) \
(* targetm.encode_section_info) (DECL, false); \
ASM_OUTPUT_LABEL (FILE, xname); \
/* Darwin doesn't support zero-size objects, so give them a \
byte. */ \
if (tree_low_cst (DECL_SIZE_UNIT (DECL), 1) == 0) \
assemble_zeros (1); \
} while (0)
#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
@ -401,6 +405,15 @@ do { text_section (); \
machopic_output_possible_stub_label (FILE, xname); \
} while (0)
#define ASM_DECLARE_CONSTANT_NAME(FILE, NAME, EXP, SIZE) \
do { \
ASM_OUTPUT_LABEL (FILE, NAME); \
/* Darwin doesn't support zero-size objects, so give them a \
byte. */ \
if ((SIZE) == 0) \
assemble_zeros (1); \
} while (0)
/* Wrap new method names in quotes so the assembler doesn't gag.
Make Objective-C internal symbols local. */

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2002 Free Software Foundation, Inc.
/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -25,7 +25,7 @@
Public License. */
/* Implemented from the specification included in the Intel C++ Compiler
User Guide and Reference, version 5.0. */
User Guide and Reference, version 8.0. */
#ifndef _MMINTRIN_H_INCLUDED
#define _MMINTRIN_H_INCLUDED
@ -48,6 +48,12 @@ _mm_empty (void)
__builtin_ia32_emms ();
}
static __inline void
_m_empty (void)
{
_mm_empty ();
}
/* Convert I to a __m64 object. The integer is zero-extended to 64-bits. */
static __inline __m64
_mm_cvtsi32_si64 (int __i)
@ -56,6 +62,12 @@ _mm_cvtsi32_si64 (int __i)
return (__m64) __tmp;
}
static __inline __m64
_m_from_int (int __i)
{
return _mm_cvtsi32_si64 (__i);
}
#ifdef __x86_64__
/* Convert I to a __m64 object. */
static __inline __m64
@ -80,6 +92,12 @@ _mm_cvtsi64_si32 (__m64 __i)
return __tmp;
}
static __inline int
_m_to_int (__m64 __i)
{
return _mm_cvtsi64_si32 (__i);
}
#ifdef __x86_64__
/* Convert the lower 32 bits of the __m64 object into an integer. */
static __inline long long
@ -98,6 +116,12 @@ _mm_packs_pi16 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_packsswb ((__v4hi)__m1, (__v4hi)__m2);
}
static __inline __m64
_m_packsswb (__m64 __m1, __m64 __m2)
{
return _mm_packs_pi16 (__m1, __m2);
}
/* Pack the two 32-bit values from M1 in to the lower two 16-bit values of
the result, and the two 32-bit values from M2 into the upper two 16-bit
values of the result, all with signed saturation. */
@ -107,6 +131,12 @@ _mm_packs_pi32 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_packssdw ((__v2si)__m1, (__v2si)__m2);
}
static __inline __m64
_m_packssdw (__m64 __m1, __m64 __m2)
{
return _mm_packs_pi32 (__m1, __m2);
}
/* Pack the four 16-bit values from M1 into the lower four 8-bit values of
the result, and the four 16-bit values from M2 into the upper four 8-bit
values of the result, all with unsigned saturation. */
@ -116,6 +146,12 @@ _mm_packs_pu16 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_packuswb ((__v4hi)__m1, (__v4hi)__m2);
}
static __inline __m64
_m_packuswb (__m64 __m1, __m64 __m2)
{
return _mm_packs_pu16 (__m1, __m2);
}
/* Interleave the four 8-bit values from the high half of M1 with the four
8-bit values from the high half of M2. */
static __inline __m64
@ -124,6 +160,12 @@ _mm_unpackhi_pi8 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_punpckhbw ((__v8qi)__m1, (__v8qi)__m2);
}
static __inline __m64
_m_punpckhbw (__m64 __m1, __m64 __m2)
{
return _mm_unpackhi_pi8 (__m1, __m2);
}
/* Interleave the two 16-bit values from the high half of M1 with the two
16-bit values from the high half of M2. */
static __inline __m64
@ -132,6 +174,12 @@ _mm_unpackhi_pi16 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_punpckhwd ((__v4hi)__m1, (__v4hi)__m2);
}
static __inline __m64
_m_punpckhwd (__m64 __m1, __m64 __m2)
{
return _mm_unpackhi_pi16 (__m1, __m2);
}
/* Interleave the 32-bit value from the high half of M1 with the 32-bit
value from the high half of M2. */
static __inline __m64
@ -140,6 +188,12 @@ _mm_unpackhi_pi32 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_punpckhdq ((__v2si)__m1, (__v2si)__m2);
}
static __inline __m64
_m_punpckhdq (__m64 __m1, __m64 __m2)
{
return _mm_unpackhi_pi32 (__m1, __m2);
}
/* Interleave the four 8-bit values from the low half of M1 with the four
8-bit values from the low half of M2. */
static __inline __m64
@ -148,6 +202,12 @@ _mm_unpacklo_pi8 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_punpcklbw ((__v8qi)__m1, (__v8qi)__m2);
}
static __inline __m64
_m_punpcklbw (__m64 __m1, __m64 __m2)
{
return _mm_unpacklo_pi8 (__m1, __m2);
}
/* Interleave the two 16-bit values from the low half of M1 with the two
16-bit values from the low half of M2. */
static __inline __m64
@ -156,6 +216,12 @@ _mm_unpacklo_pi16 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_punpcklwd ((__v4hi)__m1, (__v4hi)__m2);
}
static __inline __m64
_m_punpcklwd (__m64 __m1, __m64 __m2)
{
return _mm_unpacklo_pi16 (__m1, __m2);
}
/* Interleave the 32-bit value from the low half of M1 with the 32-bit
value from the low half of M2. */
static __inline __m64
@ -164,6 +230,12 @@ _mm_unpacklo_pi32 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_punpckldq ((__v2si)__m1, (__v2si)__m2);
}
static __inline __m64
_m_punpckldq (__m64 __m1, __m64 __m2)
{
return _mm_unpacklo_pi32 (__m1, __m2);
}
/* Add the 8-bit values in M1 to the 8-bit values in M2. */
static __inline __m64
_mm_add_pi8 (__m64 __m1, __m64 __m2)
@ -171,6 +243,12 @@ _mm_add_pi8 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_paddb ((__v8qi)__m1, (__v8qi)__m2);
}
static __inline __m64
_m_paddb (__m64 __m1, __m64 __m2)
{
return _mm_add_pi8 (__m1, __m2);
}
/* Add the 16-bit values in M1 to the 16-bit values in M2. */
static __inline __m64
_mm_add_pi16 (__m64 __m1, __m64 __m2)
@ -178,6 +256,12 @@ _mm_add_pi16 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_paddw ((__v4hi)__m1, (__v4hi)__m2);
}
static __inline __m64
_m_paddw (__m64 __m1, __m64 __m2)
{
return _mm_add_pi16 (__m1, __m2);
}
/* Add the 32-bit values in M1 to the 32-bit values in M2. */
static __inline __m64
_mm_add_pi32 (__m64 __m1, __m64 __m2)
@ -185,6 +269,12 @@ _mm_add_pi32 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_paddd ((__v2si)__m1, (__v2si)__m2);
}
static __inline __m64
_m_paddd (__m64 __m1, __m64 __m2)
{
return _mm_add_pi32 (__m1, __m2);
}
/* Add the 64-bit values in M1 to the 64-bit values in M2. */
static __inline __m64
_mm_add_si64 (__m64 __m1, __m64 __m2)
@ -200,6 +290,12 @@ _mm_adds_pi8 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_paddsb ((__v8qi)__m1, (__v8qi)__m2);
}
static __inline __m64
_m_paddsb (__m64 __m1, __m64 __m2)
{
return _mm_adds_pi8 (__m1, __m2);
}
/* Add the 16-bit values in M1 to the 16-bit values in M2 using signed
saturated arithmetic. */
static __inline __m64
@ -208,6 +304,12 @@ _mm_adds_pi16 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_paddsw ((__v4hi)__m1, (__v4hi)__m2);
}
static __inline __m64
_m_paddsw (__m64 __m1, __m64 __m2)
{
return _mm_adds_pi16 (__m1, __m2);
}
/* Add the 8-bit values in M1 to the 8-bit values in M2 using unsigned
saturated arithmetic. */
static __inline __m64
@ -216,6 +318,12 @@ _mm_adds_pu8 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_paddusb ((__v8qi)__m1, (__v8qi)__m2);
}
static __inline __m64
_m_paddusb (__m64 __m1, __m64 __m2)
{
return _mm_adds_pu8 (__m1, __m2);
}
/* Add the 16-bit values in M1 to the 16-bit values in M2 using unsigned
saturated arithmetic. */
static __inline __m64
@ -224,6 +332,12 @@ _mm_adds_pu16 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_paddusw ((__v4hi)__m1, (__v4hi)__m2);
}
static __inline __m64
_m_paddusw (__m64 __m1, __m64 __m2)
{
return _mm_adds_pu16 (__m1, __m2);
}
/* Subtract the 8-bit values in M2 from the 8-bit values in M1. */
static __inline __m64
_mm_sub_pi8 (__m64 __m1, __m64 __m2)
@ -231,6 +345,12 @@ _mm_sub_pi8 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_psubb ((__v8qi)__m1, (__v8qi)__m2);
}
static __inline __m64
_m_psubb (__m64 __m1, __m64 __m2)
{
return _mm_sub_pi8 (__m1, __m2);
}
/* Subtract the 16-bit values in M2 from the 16-bit values in M1. */
static __inline __m64
_mm_sub_pi16 (__m64 __m1, __m64 __m2)
@ -238,6 +358,12 @@ _mm_sub_pi16 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_psubw ((__v4hi)__m1, (__v4hi)__m2);
}
static __inline __m64
_m_psubw (__m64 __m1, __m64 __m2)
{
return _mm_sub_pi16 (__m1, __m2);
}
/* Subtract the 32-bit values in M2 from the 32-bit values in M1. */
static __inline __m64
_mm_sub_pi32 (__m64 __m1, __m64 __m2)
@ -245,6 +371,12 @@ _mm_sub_pi32 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_psubd ((__v2si)__m1, (__v2si)__m2);
}
static __inline __m64
_m_psubd (__m64 __m1, __m64 __m2)
{
return _mm_sub_pi32 (__m1, __m2);
}
/* Add the 64-bit values in M1 to the 64-bit values in M2. */
static __inline __m64
_mm_sub_si64 (__m64 __m1, __m64 __m2)
@ -260,6 +392,12 @@ _mm_subs_pi8 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_psubsb ((__v8qi)__m1, (__v8qi)__m2);
}
static __inline __m64
_m_psubsb (__m64 __m1, __m64 __m2)
{
return _mm_subs_pi8 (__m1, __m2);
}
/* Subtract the 16-bit values in M2 from the 16-bit values in M1 using
signed saturating arithmetic. */
static __inline __m64
@ -268,6 +406,12 @@ _mm_subs_pi16 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_psubsw ((__v4hi)__m1, (__v4hi)__m2);
}
static __inline __m64
_m_psubsw (__m64 __m1, __m64 __m2)
{
return _mm_subs_pi16 (__m1, __m2);
}
/* Subtract the 8-bit values in M2 from the 8-bit values in M1 using
unsigned saturating arithmetic. */
static __inline __m64
@ -276,6 +420,12 @@ _mm_subs_pu8 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_psubusb ((__v8qi)__m1, (__v8qi)__m2);
}
static __inline __m64
_m_psubusb (__m64 __m1, __m64 __m2)
{
return _mm_subs_pu8 (__m1, __m2);
}
/* Subtract the 16-bit values in M2 from the 16-bit values in M1 using
unsigned saturating arithmetic. */
static __inline __m64
@ -284,6 +434,12 @@ _mm_subs_pu16 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_psubusw ((__v4hi)__m1, (__v4hi)__m2);
}
static __inline __m64
_m_psubusw (__m64 __m1, __m64 __m2)
{
return _mm_subs_pu16 (__m1, __m2);
}
/* Multiply four 16-bit values in M1 by four 16-bit values in M2 producing
four 32-bit intermediate results, which are then summed by pairs to
produce two 32-bit results. */
@ -293,6 +449,12 @@ _mm_madd_pi16 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_pmaddwd ((__v4hi)__m1, (__v4hi)__m2);
}
static __inline __m64
_m_pmaddwd (__m64 __m1, __m64 __m2)
{
return _mm_madd_pi16 (__m1, __m2);
}
/* Multiply four signed 16-bit values in M1 by four signed 16-bit values in
M2 and produce the high 16 bits of the 32-bit results. */
static __inline __m64
@ -301,6 +463,12 @@ _mm_mulhi_pi16 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_pmulhw ((__v4hi)__m1, (__v4hi)__m2);
}
static __inline __m64
_m_pmulhw (__m64 __m1, __m64 __m2)
{
return _mm_mulhi_pi16 (__m1, __m2);
}
/* Multiply four 16-bit values in M1 by four 16-bit values in M2 and produce
the low 16 bits of the results. */
static __inline __m64
@ -309,6 +477,12 @@ _mm_mullo_pi16 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_pmullw ((__v4hi)__m1, (__v4hi)__m2);
}
static __inline __m64
_m_pmullw (__m64 __m1, __m64 __m2)
{
return _mm_mullo_pi16 (__m1, __m2);
}
/* Shift four 16-bit values in M left by COUNT. */
static __inline __m64
_mm_sll_pi16 (__m64 __m, __m64 __count)
@ -316,12 +490,24 @@ _mm_sll_pi16 (__m64 __m, __m64 __count)
return (__m64) __builtin_ia32_psllw ((__v4hi)__m, (long long)__count);
}
static __inline __m64
_m_psllw (__m64 __m, __m64 __count)
{
return _mm_sll_pi16 (__m, __count);
}
static __inline __m64
_mm_slli_pi16 (__m64 __m, int __count)
{
return (__m64) __builtin_ia32_psllw ((__v4hi)__m, __count);
}
static __inline __m64
_m_psllwi (__m64 __m, int __count)
{
return _mm_slli_pi16 (__m, __count);
}
/* Shift two 32-bit values in M left by COUNT. */
static __inline __m64
_mm_sll_pi32 (__m64 __m, __m64 __count)
@ -329,12 +515,24 @@ _mm_sll_pi32 (__m64 __m, __m64 __count)
return (__m64) __builtin_ia32_pslld ((__v2si)__m, (long long)__count);
}
static __inline __m64
_m_pslld (__m64 __m, __m64 __count)
{
return _mm_sll_pi32 (__m, __count);
}
static __inline __m64
_mm_slli_pi32 (__m64 __m, int __count)
{
return (__m64) __builtin_ia32_pslld ((__v2si)__m, __count);
}
static __inline __m64
_m_pslldi (__m64 __m, int __count)
{
return _mm_slli_pi32 (__m, __count);
}
/* Shift the 64-bit value in M left by COUNT. */
static __inline __m64
_mm_sll_si64 (__m64 __m, __m64 __count)
@ -342,12 +540,24 @@ _mm_sll_si64 (__m64 __m, __m64 __count)
return (__m64) __builtin_ia32_psllq ((long long)__m, (long long)__count);
}
static __inline __m64
_m_psllq (__m64 __m, __m64 __count)
{
return _mm_sll_si64 (__m, __count);
}
static __inline __m64
_mm_slli_si64 (__m64 __m, int __count)
{
return (__m64) __builtin_ia32_psllq ((long long)__m, (long long)__count);
}
static __inline __m64
_m_psllqi (__m64 __m, int __count)
{
return _mm_slli_si64 (__m, __count);
}
/* Shift four 16-bit values in M right by COUNT; shift in the sign bit. */
static __inline __m64
_mm_sra_pi16 (__m64 __m, __m64 __count)
@ -355,12 +565,24 @@ _mm_sra_pi16 (__m64 __m, __m64 __count)
return (__m64) __builtin_ia32_psraw ((__v4hi)__m, (long long)__count);
}
static __inline __m64
_m_psraw (__m64 __m, __m64 __count)
{
return _mm_sra_pi16 (__m, __count);
}
static __inline __m64
_mm_srai_pi16 (__m64 __m, int __count)
{
return (__m64) __builtin_ia32_psraw ((__v4hi)__m, __count);
}
static __inline __m64
_m_psrawi (__m64 __m, int __count)
{
return _mm_srai_pi16 (__m, __count);
}
/* Shift two 32-bit values in M right by COUNT; shift in the sign bit. */
static __inline __m64
_mm_sra_pi32 (__m64 __m, __m64 __count)
@ -368,12 +590,24 @@ _mm_sra_pi32 (__m64 __m, __m64 __count)
return (__m64) __builtin_ia32_psrad ((__v2si)__m, (long long)__count);
}
static __inline __m64
_m_psrad (__m64 __m, __m64 __count)
{
return _mm_sra_pi32 (__m, __count);
}
static __inline __m64
_mm_srai_pi32 (__m64 __m, int __count)
{
return (__m64) __builtin_ia32_psrad ((__v2si)__m, __count);
}
static __inline __m64
_m_psradi (__m64 __m, int __count)
{
return _mm_srai_pi32 (__m, __count);
}
/* Shift four 16-bit values in M right by COUNT; shift in zeros. */
static __inline __m64
_mm_srl_pi16 (__m64 __m, __m64 __count)
@ -381,12 +615,24 @@ _mm_srl_pi16 (__m64 __m, __m64 __count)
return (__m64) __builtin_ia32_psrlw ((__v4hi)__m, (long long)__count);
}
static __inline __m64
_m_psrlw (__m64 __m, __m64 __count)
{
return _mm_srl_pi16 (__m, __count);
}
static __inline __m64
_mm_srli_pi16 (__m64 __m, int __count)
{
return (__m64) __builtin_ia32_psrlw ((__v4hi)__m, __count);
}
static __inline __m64
_m_psrlwi (__m64 __m, int __count)
{
return _mm_srli_pi16 (__m, __count);
}
/* Shift two 32-bit values in M right by COUNT; shift in zeros. */
static __inline __m64
_mm_srl_pi32 (__m64 __m, __m64 __count)
@ -394,12 +640,24 @@ _mm_srl_pi32 (__m64 __m, __m64 __count)
return (__m64) __builtin_ia32_psrld ((__v2si)__m, (long long)__count);
}
static __inline __m64
_m_psrld (__m64 __m, __m64 __count)
{
return _mm_srl_pi32 (__m, __count);
}
static __inline __m64
_mm_srli_pi32 (__m64 __m, int __count)
{
return (__m64) __builtin_ia32_psrld ((__v2si)__m, __count);
}
static __inline __m64
_m_psrldi (__m64 __m, int __count)
{
return _mm_srli_pi32 (__m, __count);
}
/* Shift the 64-bit value in M left by COUNT; shift in zeros. */
static __inline __m64
_mm_srl_si64 (__m64 __m, __m64 __count)
@ -407,12 +665,24 @@ _mm_srl_si64 (__m64 __m, __m64 __count)
return (__m64) __builtin_ia32_psrlq ((long long)__m, (long long)__count);
}
static __inline __m64
_m_psrlq (__m64 __m, __m64 __count)
{
return _mm_srl_si64 (__m, __count);
}
static __inline __m64
_mm_srli_si64 (__m64 __m, int __count)
{
return (__m64) __builtin_ia32_psrlq ((long long)__m, (long long)__count);
}
static __inline __m64
_m_psrlqi (__m64 __m, int __count)
{
return _mm_srli_si64 (__m, __count);
}
/* Bit-wise AND the 64-bit values in M1 and M2. */
static __inline __m64
_mm_and_si64 (__m64 __m1, __m64 __m2)
@ -420,6 +690,12 @@ _mm_and_si64 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_pand ((long long)__m1, (long long)__m2);
}
static __inline __m64
_m_pand (__m64 __m1, __m64 __m2)
{
return _mm_and_si64 (__m1, __m2);
}
/* Bit-wise complement the 64-bit value in M1 and bit-wise AND it with the
64-bit value in M2. */
static __inline __m64
@ -428,6 +704,12 @@ _mm_andnot_si64 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_pandn ((long long)__m1, (long long)__m2);
}
static __inline __m64
_m_pandn (__m64 __m1, __m64 __m2)
{
return _mm_andnot_si64 (__m1, __m2);
}
/* Bit-wise inclusive OR the 64-bit values in M1 and M2. */
static __inline __m64
_mm_or_si64 (__m64 __m1, __m64 __m2)
@ -435,6 +717,12 @@ _mm_or_si64 (__m64 __m1, __m64 __m2)
return (__m64)__builtin_ia32_por ((long long)__m1, (long long)__m2);
}
static __inline __m64
_m_por (__m64 __m1, __m64 __m2)
{
return _mm_or_si64 (__m1, __m2);
}
/* Bit-wise exclusive OR the 64-bit values in M1 and M2. */
static __inline __m64
_mm_xor_si64 (__m64 __m1, __m64 __m2)
@ -442,6 +730,12 @@ _mm_xor_si64 (__m64 __m1, __m64 __m2)
return (__m64)__builtin_ia32_pxor ((long long)__m1, (long long)__m2);
}
static __inline __m64
_m_pxor (__m64 __m1, __m64 __m2)
{
return _mm_xor_si64 (__m1, __m2);
}
/* Compare eight 8-bit values. The result of the comparison is 0xFF if the
test is true and zero if false. */
static __inline __m64
@ -450,12 +744,24 @@ _mm_cmpeq_pi8 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_pcmpeqb ((__v8qi)__m1, (__v8qi)__m2);
}
static __inline __m64
_m_pcmpeqb (__m64 __m1, __m64 __m2)
{
return _mm_cmpeq_pi8 (__m1, __m2);
}
static __inline __m64
_mm_cmpgt_pi8 (__m64 __m1, __m64 __m2)
{
return (__m64) __builtin_ia32_pcmpgtb ((__v8qi)__m1, (__v8qi)__m2);
}
static __inline __m64
_m_pcmpgtb (__m64 __m1, __m64 __m2)
{
return _mm_cmpgt_pi8 (__m1, __m2);
}
/* Compare four 16-bit values. The result of the comparison is 0xFFFF if
the test is true and zero if false. */
static __inline __m64
@ -464,12 +770,24 @@ _mm_cmpeq_pi16 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_pcmpeqw ((__v4hi)__m1, (__v4hi)__m2);
}
static __inline __m64
_m_pcmpeqw (__m64 __m1, __m64 __m2)
{
return _mm_cmpeq_pi16 (__m1, __m2);
}
static __inline __m64
_mm_cmpgt_pi16 (__m64 __m1, __m64 __m2)
{
return (__m64) __builtin_ia32_pcmpgtw ((__v4hi)__m1, (__v4hi)__m2);
}
static __inline __m64
_m_pcmpgtw (__m64 __m1, __m64 __m2)
{
return _mm_cmpgt_pi16 (__m1, __m2);
}
/* Compare two 32-bit values. The result of the comparison is 0xFFFFFFFF if
the test is true and zero if false. */
static __inline __m64
@ -478,12 +796,24 @@ _mm_cmpeq_pi32 (__m64 __m1, __m64 __m2)
return (__m64) __builtin_ia32_pcmpeqd ((__v2si)__m1, (__v2si)__m2);
}
static __inline __m64
_m_pcmpeqd (__m64 __m1, __m64 __m2)
{
return _mm_cmpeq_pi32 (__m1, __m2);
}
static __inline __m64
_mm_cmpgt_pi32 (__m64 __m1, __m64 __m2)
{
return (__m64) __builtin_ia32_pcmpgtd ((__v2si)__m1, (__v2si)__m2);
}
static __inline __m64
_m_pcmpgtd (__m64 __m1, __m64 __m2)
{
return _mm_cmpgt_pi32 (__m1, __m2);
}
/* Creates a 64-bit zero. */
static __inline __m64
_mm_setzero_si64 (void)
@ -574,7 +904,7 @@ _mm_set1_pi16 (short __w)
return _mm_set1_pi32 (__i);
}
/* Creates a vector of four 16-bit values, all elements containing B. */
/* Creates a vector of eight 8-bit values, all elements containing B. */
static __inline __m64
_mm_set1_pi8 (char __b)
{

View File

@ -0,0 +1,132 @@
/* Copyright (C) 2003 Free Software Foundation, Inc.
This file is part of GNU CC.
GNU CC 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.
GNU CC 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 GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* As a special exception, if you include this header file into source
files compiled by GCC, this header file does not by itself cause
the resulting executable to be covered by the GNU General Public
License. This exception does not however invalidate any other
reasons why the executable file might be covered by the GNU General
Public License. */
/* Implemented from the specification included in the Intel C++ Compiler
User Guide and Reference, version 8.0. */
#ifndef _PMMINTRIN_H_INCLUDED
#define _PMMINTRIN_H_INCLUDED
#ifdef __PNI__
#include <xmmintrin.h>
#include <emmintrin.h>
/* Additional bits in the MXCSR. */
#define _MM_DENORMALS_ZERO_MASK 0x0040
#define _MM_DENORMALS_ZERO_ON 0x0040
#define _MM_DENORMALS_ZERO_OFF 0x0000
#define _MM_SET_DENORMALS_ZERO_MODE(mode) \
_mm_setcsr ((_mm_getcsr () & ~_MM_DENORMALS_ZERO_MASK) | (mode))
#define _MM_GET_DENORMALS_ZERO_MODE() \
(_mm_getcsr() & _MM_DENORMALS_ZERO_MASK)
static __inline __m128
_mm_addsub_ps (__m128 __X, __m128 __Y)
{
return (__m128) __builtin_ia32_addsubps ((__v4sf)__X, (__v4sf)__Y);
}
static __inline __m128
_mm_hadd_ps (__m128 __X, __m128 __Y)
{
return (__m128) __builtin_ia32_haddps ((__v4sf)__X, (__v4sf)__Y);
}
static __inline __m128
_mm_hsub_ps (__m128 __X, __m128 __Y)
{
return (__m128) __builtin_ia32_hsubps ((__v4sf)__X, (__v4sf)__Y);
}
static __inline __m128
_mm_movehdup_ps (__m128 __X)
{
return (__m128) __builtin_ia32_movshdup ((__v4sf)__X);
}
static __inline __m128
_mm_moveldup_ps (__m128 __X)
{
return (__m128) __builtin_ia32_movsldup ((__v4sf)__X);
}
static __inline __m128d
_mm_addsub_pd (__m128d __X, __m128d __Y)
{
return (__m128d) __builtin_ia32_addsubpd ((__v2df)__X, (__v2df)__Y);
}
static __inline __m128d
_mm_hadd_pd (__m128d __X, __m128d __Y)
{
return (__m128d) __builtin_ia32_haddpd ((__v2df)__X, (__v2df)__Y);
}
static __inline __m128d
_mm_hsub_pd (__m128d __X, __m128d __Y)
{
return (__m128d) __builtin_ia32_hsubpd ((__v2df)__X, (__v2df)__Y);
}
static __inline __m128d
_mm_loaddup_pd (double const *__P)
{
return (__m128d) __builtin_ia32_loadddup (__P);
}
static __inline __m128d
_mm_movedup_pd (__m128d __X)
{
return (__m128d) __builtin_ia32_movddup ((__v2df)__X);
}
static __inline __m128i
_mm_lddqu_si128 (__m128i const *__P)
{
return (__m128i) __builtin_ia32_lddqu ((char const *)__P);
}
#if 0
static __inline void
_mm_monitor (void const * __P, unsigned int __E, unsigned int __H)
{
__builtin_ia32_monitor (__P, __E, __H);
}
static __inline void
_mm_mwait (unsigned int __E, unsigned int __H)
{
__builtin_ia32_mwait (__E, __H);
}
#else
#define _mm_monitor(P, E, H) __builtin_ia32_monitor ((P), (E), (H))
#define _mm_mwait(E, H) __builtin_ia32_mwait ((E), (H))
#endif
#endif /* __PNI__ */
#endif /* _PMMINTRIN_H_INCLUDED */

View File

@ -1,7 +1,7 @@
/* Definitions for Intel 386 running SCO Unix System V 3.2 Version 5.
Copyright (C) 1992, 1995, 1996, 1997, 1998, 1999, 2000, 2002
Copyright (C) 1992, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003
Free Software Foundation, Inc.
Contributed by Kean Johnston (hug@netcom.com)
Contributed by Kean Johnston (jkj@sco.com)
This file is part of GNU CC.
@ -20,230 +20,36 @@ along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#undef TARGET_VERSION
#define TARGET_VERSION fprintf (stderr, " (i386, SCO OpenServer 5 Syntax)");
#undef LPREFIX
#define LPREFIX ".L"
#undef ALIGN_ASM_OP
#define ALIGN_ASM_OP "\t.align\t"
#undef ASCII_DATA_ASM_OP
#define ASCII_DATA_ASM_OP "\t.ascii\t"
#undef IDENT_ASM_OP
#define IDENT_ASM_OP "\t.ident\t"
#undef COMMON_ASM_OP
#define COMMON_ASM_OP "\t.comm\t"
#undef SET_ASM_OP
#define SET_ASM_OP "\t.set\t"
#undef LOCAL_ASM_OP
#define LOCAL_ASM_OP "\t.local\t"
#undef ASM_SHORT
#define ASM_SHORT "\t.value\t"
#undef ASM_LONG
#define ASM_LONG "\t.long\t"
/* The native link editor does not support linkonce stuff */
#define SUPPORTS_ONE_ONLY 0
#undef ASM_QUAD
#undef TYPE_ASM_OP
#define TYPE_ASM_OP "\t.type\t"
#undef SIZE_ASM_OP
#define SIZE_ASM_OP "\t.size\t"
#undef STRING_ASM_OP
#define STRING_ASM_OP "\t.string\t"
#undef SKIP_ASM_OP
#define SKIP_ASM_OP "\t.zero\t"
#undef GLOBAL_ASM_OP
#define GLOBAL_ASM_OP "\t.globl\t"
#undef EH_FRAME_SECTION_ASM_OP
#define EH_FRAME_SECTION_NAME_COFF ".ehfram"
#define EH_FRAME_SECTION_NAME_ELF ".eh_frame"
#define EH_FRAME_SECTION_NAME \
((TARGET_ELF) ? EH_FRAME_SECTION_NAME_ELF : EH_FRAME_SECTION_NAME_COFF)
/* Avoid problems (long sectino names, forward assembler refs) with DWARF
exception unwinding when we're generating COFF */
#define DWARF2_UNWIND_INFO \
((TARGET_ELF) ? 1 : 0 )
#undef READONLY_DATA_SECTION_ASM_OP
#define READONLY_DATA_SECTION_ASM_OP_COFF "\t.section\t.rodata, \"x\""
#define READONLY_DATA_SECTION_ASM_OP_ELF "\t.section\t.rodata"
#define READONLY_DATA_SECTION_ASM_OP \
((TARGET_ELF) \
? READONLY_DATA_SECTION_ASM_OP_ELF \
: READONLY_DATA_SECTION_ASM_OP_COFF)
#undef INIT_SECTION_ASM_OP
#define INIT_SECTION_ASM_OP_ELF "\t.section\t.init"
/* Rename these for COFF because crt1.o will try to run them. */
#define INIT_SECTION_ASM_OP_COFF "\t.section\t.ctor ,\"x\""
#define INIT_SECTION_ASM_OP \
((TARGET_ELF) ? INIT_SECTION_ASM_OP_ELF : INIT_SECTION_ASM_OP_COFF)
#undef CTORS_SECTION_ASM_OP
#define CTORS_SECTION_ASM_OP_ELF "\t.section\t.ctors,\"aw\""
#define CTORS_SECTION_ASM_OP_COFF INIT_SECTION_ASM_OP_COFF
#define CTORS_SECTION_ASM_OP \
((TARGET_ELF) ? CTORS_SECTION_ASM_OP_ELF : CTORS_SECTION_ASM_OP_COFF)
#undef DTORS_SECTION_ASM_OP
#define DTORS_SECTION_ASM_OP_ELF "\t.section\t.dtors, \"aw\""
#define DTORS_SECTION_ASM_OP_COFF FINI_SECTION_ASM_OP_COFF
#define DTORS_SECTION_ASM_OP \
((TARGET_ELF) ? DTORS_SECTION_ASM_OP_ELF : DTORS_SECTION_ASM_OP_COFF)
#undef FINI_SECTION_ASM_OP
#define FINI_SECTION_ASM_OP_ELF "\t.section\t.fini"
#define FINI_SECTION_ASM_OP_COFF "\t.section\t.dtor, \"x\""
#define FINI_SECTION_ASM_OP \
((TARGET_ELF) ? FINI_SECTION_ASM_OP_ELF : FINI_SECTION_ASM_OP_COFF)
#undef BSS_SECTION_ASM_OP
#define BSS_SECTION_ASM_OP "\t.data"
#define BSS_SECTION_ASM_OP "\t.section\t.bss, \"aw\", @nobits"
/*
* NOTE: We really do want CTORS_SECTION_ASM_OP and DTORS_SECTION_ASM_OP.
* Here's the reason why. If we dont define them, and we dont define them
* to always emit to the same section, the default is to emit to "named"
* ctors and dtors sections. This would be great if we could use GNU ld,
* but we can't. The native linker could possibly be trained to coalesce
* named ctors sections, but that hasn't been done either. So if we don't
* define these, many C++ ctors and dtors dont get run, because they never
* wind up in the ctors/dtors arrays.
*/
#define CTORS_SECTION_ASM_OP "\t.section\t.ctors, \"aw\""
#define DTORS_SECTION_ASM_OP "\t.section\t.dtors, \"aw\""
#undef TEXT_SECTION_ASM_OP
#define TEXT_SECTION_ASM_OP "\t.text"
#undef DATA_SECTION_ASM_OP
#define DATA_SECTION_ASM_OP "\t.data"
#undef TYPE_OPERAND_FMT
#define TYPE_OPERAND_FMT "@%s"
#undef APPLY_RESULT_SIZE
#define APPLY_RESULT_SIZE \
(TARGET_ELF) ? size : 116
#ifndef ASM_DECLARE_RESULT
#define ASM_DECLARE_RESULT(FILE, RESULT)
#endif
#define SCO_DEFAULT_ASM_COFF(FILE,NAME) \
do { \
ASM_OUTPUT_LABEL (FILE, NAME); \
} while (0)
#undef ASM_DECLARE_FUNCTION_NAME
#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
do { \
if (TARGET_ELF) { \
ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function"); \
ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \
ASM_OUTPUT_LABEL (FILE, NAME); \
} else \
SCO_DEFAULT_ASM_COFF(FILE, NAME); \
} while (0)
#undef ASM_DECLARE_FUNCTION_SIZE
#define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \
do { \
if (TARGET_ELF && !flag_inhibit_size_directive) \
ASM_OUTPUT_MEASURED_SIZE (FILE, FNAME); \
} while (0)
#undef ASM_DECLARE_OBJECT_NAME
#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \
do { \
if (TARGET_ELF) { \
HOST_WIDE_INT size; \
\
ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object"); \
\
size_directive_output = 0; \
if (!flag_inhibit_size_directive \
&& (DECL) && DECL_SIZE (DECL)) \
{ \
size_directive_output = 1; \
size = int_size_in_bytes (TREE_TYPE (DECL)); \
ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, size); \
} \
\
ASM_OUTPUT_LABEL (FILE, NAME); \
} else \
SCO_DEFAULT_ASM_COFF(FILE, NAME); \
} while (0)
#undef ASM_FILE_START_1
#define ASM_FILE_START_1(FILE)
#undef ASM_FILE_START
#define ASM_FILE_START(FILE) \
do { \
output_file_directive((FILE),main_input_filename); \
fprintf ((FILE), "\t.version\t\"01.01\"\n"); \
} while (0)
#undef ASM_FINISH_DECLARE_OBJECT
#define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END) \
do { \
if (TARGET_ELF) { \
const char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \
HOST_WIDE_INT size; \
if (!flag_inhibit_size_directive && DECL_SIZE (DECL) \
&& ! AT_END && TOP_LEVEL \
&& DECL_INITIAL (DECL) == error_mark_node \
&& !size_directive_output) \
{ \
size_directive_output = 1; \
size = int_size_in_bytes (TREE_TYPE (DECL)); \
ASM_OUTPUT_SIZE_DIRECTIVE (FILE, name, size); \
} \
} \
} while (0)
#undef ASM_GENERATE_INTERNAL_LABEL
#define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \
do { \
if (TARGET_ELF) \
sprintf (LABEL, "*.%s%ld", (PREFIX), (long)(NUM)); \
else \
sprintf (LABEL, ".%s%ld", (PREFIX), (long)(NUM)); \
} while (0)
#undef ASM_OUTPUT_ALIGNED_COMMON
#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \
do { \
fprintf ((FILE), "%s", COMMON_ASM_OP); \
assemble_name ((FILE), (NAME)); \
if (TARGET_ELF) \
fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \
else \
fprintf ((FILE), ",%u\n", (SIZE)); \
} while (0)
#undef ASM_OUTPUT_ALIGNED_LOCAL
#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
do { \
if (TARGET_ELF) { \
fprintf ((FILE), "%s", LOCAL_ASM_OP); \
assemble_name ((FILE), (NAME)); \
fprintf ((FILE), "\n"); \
ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN); \
} else { \
int align = exact_log2 (ALIGN); \
if (align > 2) align = 2; \
if (TARGET_SVR3_SHLIB) \
data_section (); \
else \
bss_section (); \
ASM_OUTPUT_ALIGN ((FILE), align == -1 ? 2 : align); \
fprintf ((FILE), "%s\t", "\t.lcomm"); \
assemble_name ((FILE), (NAME)); \
fprintf ((FILE), ",%u\n", (SIZE)); \
} \
} while (0)
#define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
#undef X86_FILE_START_VERSION_DIRECTIVE
#define X86_FILE_START_VERSION_DIRECTIVE true
/* A C statement (sans semicolon) to output to the stdio stream
FILE the assembler definition of uninitialized global DECL named
@ -251,248 +57,23 @@ do { \
Try to use asm_output_aligned_bss to implement this macro. */
#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN)
#undef ESCAPES
#define ESCAPES \
"\1\1\1\1\1\1\1\1btn\1fr\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
\0\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\\\0\0\0\
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\
\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1"
#undef STRING_LIMIT
#define STRING_LIMIT ((unsigned) 256)
#undef ASM_OUTPUT_LIMITED_STRING
#define ASM_OUTPUT_LIMITED_STRING(FILE, STR) \
do \
{ \
register const unsigned char *_limited_str = \
(const unsigned char *) (STR); \
register unsigned ch; \
fprintf ((FILE), "%s\"", STRING_ASM_OP); \
for (; (ch = *_limited_str); _limited_str++) \
{ \
register int escape; \
switch (escape = ESCAPES[ch]) \
{ \
case 0: \
putc (ch, (FILE)); \
break; \
case 1: \
fprintf ((FILE), "\\%03o", ch); \
break; \
default: \
putc ('\\', (FILE)); \
putc (escape, (FILE)); \
break; \
} \
} \
fprintf ((FILE), "\"\n"); \
} \
while (0)
#undef ASM_OUTPUT_ASCII
#define ASM_OUTPUT_ASCII(FILE, STR, LENGTH) \
do { \
register const unsigned char *_ascii_bytes = \
(const unsigned char *) (STR); \
register const unsigned char *limit = _ascii_bytes + (LENGTH); \
register unsigned bytes_in_chunk = 0; \
for (; _ascii_bytes < limit; _ascii_bytes++) \
{ \
register unsigned const char *p; \
if (bytes_in_chunk >= 64) \
{ \
fputc ('\n', (FILE)); \
bytes_in_chunk = 0; \
} \
for (p = _ascii_bytes; p < limit && *p != '\0'; p++) \
continue; \
if (p < limit && (p - _ascii_bytes) <= (long) STRING_LIMIT) \
{ \
if (bytes_in_chunk > 0) \
{ \
fputc ('\n', (FILE)); \
bytes_in_chunk = 0; \
} \
ASM_OUTPUT_LIMITED_STRING ((FILE), _ascii_bytes); \
_ascii_bytes = p; \
} \
else \
{ \
if (bytes_in_chunk == 0) \
fputs ("\t.byte\t", (FILE)); \
else \
fputc (',', (FILE)); \
fprintf ((FILE), "0x%02x", *_ascii_bytes); \
bytes_in_chunk += 5; \
} \
} \
if (bytes_in_chunk > 0) \
fprintf ((FILE), "\n"); \
} while (0)
#undef ASM_OUTPUT_CASE_LABEL
#define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,JUMPTABLE) \
do { \
if (TARGET_ELF) \
ASM_OUTPUT_ALIGN ((FILE), 2); \
ASM_OUTPUT_INTERNAL_LABEL((FILE),(PREFIX),(NUM)); \
} while (0)
#undef ASM_OUTPUT_IDENT
#define ASM_OUTPUT_IDENT(FILE, NAME) \
fprintf (FILE, "%s\"%s\"\n", IDENT_ASM_OP, NAME);
#undef ASM_OUTPUT_EXTERNAL_LIBCALL
#define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \
if (TARGET_ELF) (*targetm.asm_out.globalize_label) (FILE, XSTR (FUN, 0))
#undef ASM_OUTPUT_INTERNAL_LABEL
#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
fprintf (FILE, ".%s%d:\n", PREFIX, NUM)
/* The prefix to add to user-visible assembler symbols. */
#undef USER_LABEL_PREFIX
#define USER_LABEL_PREFIX ""
/*
* We rename 'gcc_except_table' to the shorter name in preparation
* for the day when we're ready to do DWARF2 eh unwinding under COFF.
*/
/* #define EXCEPTION_SECTION() named_section (NULL, ".gccexc", 1) */
/* Switch into a generic section. */
#define TARGET_ASM_NAMED_SECTION default_elf_asm_named_section
#undef ASM_OUTPUT_SKIP
#define ASM_OUTPUT_SKIP(FILE,SIZE) \
do { \
if (TARGET_ELF) \
fprintf (FILE, "%s%u\n", SKIP_ASM_OP, (SIZE)); \
else \
fprintf ((FILE), "%s.,.+%u\n", SET_ASM_OP, (SIZE)); \
} while (0)
#undef CTOR_LIST_BEGIN
#define CTOR_LIST_BEGIN \
do { \
asm (CTORS_SECTION_ASM_OP); \
if (TARGET_ELF) \
STATIC func_ptr __CTOR_LIST__[1] = { (func_ptr) (-1) }; \
else \
asm ("pushl $0"); \
} while (0)
#undef CTOR_LIST_END
#define CTOR_LIST_END \
do { \
if (TARGET_ELF) { \
asm (CTORS_SECTION_ASM_OP); \
STATIC func_ptr __CTOR_LIST__[1] = { (func_ptr) (0) }; \
} else { \
CTOR_LIST_BEGIN; \
} \
} while (0)
#undef DBX_BLOCKS_FUNCTION_RELATIVE
#define DBX_BLOCKS_FUNCTION_RELATIVE 1
#undef DBX_FUNCTION_FIRST
#define DBX_FUNCTION_FIRST 1
asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN)
#undef DBX_REGISTER_NUMBER
#define DBX_REGISTER_NUMBER(n) \
((TARGET_ELF) ? svr4_dbx_register_map[n] : dbx_register_map[n])
#define DBX_REGISTER_NUMBER(n) svr4_dbx_register_map[n]
#define DWARF2_DEBUGGING_INFO 1
#define DWARF_DEBUGGING_INFO 1
#define SDB_DEBUGGING_INFO 1
#define DBX_DEBUGGING_INFO 1
#define DWARF2_DEBUGGING_INFO 1
#define DWARF_DEBUGGING_INFO 1
#define DBX_DEBUGGING_INFO 1
#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE \
((TARGET_ELF) ? DWARF2_DEBUG: SDB_DEBUG)
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
#undef EXTRA_SECTIONS
#define EXTRA_SECTIONS in_init, in_fini
#undef EXTRA_SECTION_FUNCTIONS
#define EXTRA_SECTION_FUNCTIONS \
INIT_SECTION_FUNCTION \
FINI_SECTION_FUNCTION
#undef FINI_SECTION_FUNCTION
#define FINI_SECTION_FUNCTION \
void \
fini_section () \
{ \
if ((!TARGET_ELF) && in_section != in_fini) \
{ \
fprintf (asm_out_file, "%s\n", FINI_SECTION_ASM_OP); \
in_section = in_fini; \
} \
}
#undef INIT_SECTION_FUNCTION
#define INIT_SECTION_FUNCTION \
void \
init_section () \
{ \
if ((!TARGET_ELF) && in_section != in_init) \
{ \
fprintf (asm_out_file, "%s\n", INIT_SECTION_ASM_OP); \
in_section = in_init; \
} \
}
#undef SUBTARGET_FRAME_POINTER_REQUIRED
#define SUBTARGET_FRAME_POINTER_REQUIRED \
((TARGET_ELF) ? 0 : \
(current_function_calls_setjmp || current_function_calls_longjmp))
#undef LOCAL_LABEL_PREFIX
#define LOCAL_LABEL_PREFIX \
((TARGET_ELF) ? "" : ".")
#undef MD_EXEC_PREFIX
#undef MD_STARTFILE_PREFIX
#define MD_EXEC_PREFIX "/usr/ccs/bin/"
#define MD_STARTFILE_PREFIX "/usr/ccs/lib/"
#undef NON_SAVING_SETJMP
#define NON_SAVING_SETJMP \
((TARGET_ELF) ? 0 : \
(current_function_calls_setjmp && current_function_calls_longjmp))
#undef DWARF2_UNWIND_INFO
#define DWARF2_UNWIND_INFO 1
#undef NO_IMPLICIT_EXTERN_C
#define NO_IMPLICIT_EXTERN_C 1
/* JKJ FIXME - examine the ramifications of RETURN_IN_MEMORY and
RETURN_POPS_ARGS */
#undef RETURN_POPS_ARGS
#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) \
((TARGET_ELF) ? \
(ix86_return_pops_args (FUNDECL, FUNTYPE, SIZE)) : \
(((FUNDECL) && (TREE_CODE (FUNDECL) == IDENTIFIER_NODE)) ? 0 \
: (TARGET_RTD \
&& (TYPE_ARG_TYPES (FUNTYPE) == 0 \
|| (TREE_VALUE (tree_last (TYPE_ARG_TYPES (FUNTYPE))) \
== void_type_node))) ? (SIZE) \
: 0))
/* ??? Ignore coff. */
#undef TARGET_ASM_SELECT_SECTION
#define TARGET_ASM_SELECT_SECTION default_elf_select_section
#define NO_IMPLICIT_EXTERN_C 1
#undef SWITCH_TAKES_ARG
#define SWITCH_TAKES_ARG(CHAR) \
@ -511,17 +92,6 @@ init_section () \
#undef TARGET_SUBTARGET_DEFAULT
#define TARGET_SUBTARGET_DEFAULT (MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS)
#define HANDLE_SYSV_PRAGMA 1
/* Though OpenServer supports .weak in COFF, we don't use it.
* G++ will frequently emit a symol as .weak and then (in the same .s
* file) declare it global. The COFF assembler finds this unamusing.
*/
#define SUPPORTS_WEAK (TARGET_ELF)
#define ASM_WEAKEN_LABEL(FILE,NAME) \
do { fputs ("\t.weak\t", FILE); assemble_name (FILE, NAME); \
fputc ('\n', FILE); } while (0)
/*
* Define sizes and types
*/
@ -529,12 +99,14 @@ init_section () \
#undef PTRDIFF_TYPE
#undef WCHAR_TYPE
#undef WCHAR_TYPE_SIZE
#undef WINT_TYPE
#undef LONG_DOUBLE_TYPE_SIZE
#define LONG_DOUBLE_TYPE_SIZE 96
#define SIZE_TYPE "unsigned int"
#define PTRDIFF_TYPE "int"
#define WCHAR_TYPE "long int"
#define WCHAR_TYPE_SIZE BITS_PER_WORD
#define WINT_TYPE "long int"
#define LONG_DOUBLE_TYPE_SIZE 96
/*
* New for multilib support. Set the default switches for multilib,
@ -548,7 +120,7 @@ init_section () \
With SCO Open Server 5.0, you now get the linker and assembler free,
so that is what these specs are targeted for. These utilities are
very argument sensitive: a space in the wrong place breaks everything.
So RMS, please forgive this mess. It works.
So please forgive this mess. It works.
Parameters which can be passed to gcc, and their SCO equivalents:
GCC Parameter SCO Equivalent
@ -564,77 +136,109 @@ init_section () \
does.
SCO also allows you to compile, link and generate either ELF or COFF
binaries. With gcc, unlike the SCO compiler, the default is ELF.
Specify -mcoff to gcc to produce COFF binaries. -fpic will get the
assembler and linker to produce PIC code.
binaries. With gcc, we now only support ELF mode.
GCC also requires that the user has installed OSS646, the Execution
Environment Update, or is running release 5.0.7 or later. This has
many fixes to the ELF link editor and assembler, and a considerably
improved libc and RTLD.
In terms of tool usage, we want to use the standard link editor always,
and either the GNU assembler or the native assembler. With OSS646 the
native assembler has grown up quite a bit. Some of the specs below
assume that /usr/gnu is the prefix for the GNU tools, because thats
where the SCO provided ones go. This is especially important for
include and library search path ordering. We want to look in /usr/gnu
first, becuase frequently people are linking against -lintl, and they
MEAN to link with gettext. What they get is the SCO intl library. Its
a REAL pity that GNU gettext chose that name; perhaps in a future
version they can be persuaded to change it to -lgnuintl and have a
link so that -lintl will work for other systems. The same goes for
header files. We want /usr/gnu/include searched for before the system
header files. Hence the -isystem /usr/gnu/include in the CPP_SPEC.
We get /usr/gnu/lib first by virtue of the MD_STARTFILE_PREFIX below.
*/
#define MD_STARTFILE_PREFIX "/usr/gnu/lib/"
#define MD_STARTFILE_PREFIX_1 "/usr/ccs/lib/"
#if USE_GAS
# define MD_EXEC_PREFIX "/usr/gnu/bin/"
#else
# define MD_EXEC_PREFIX "/usr/ccs/bin/elf/"
#endif
/* Always use the system linker, please. */
#ifndef DEFAULT_LINKER
# define DEFAULT_LINKER "/usr/ccs/bin/elf/ld"
#endif
/* Set up assembler flags for PIC and ELF compilations */
#undef ASM_SPEC
#if USE_GAS
/* Leave ASM_SPEC undefined so we pick up the master copy from gcc.c
* Undef MD_EXEC_PREFIX because we don't know where GAS is, but it's not
* likely in /usr/ccs/bin/
*/
#undef MD_EXEC_PREFIX
/* Leave ASM_SPEC undefined so we pick up the master copy from gcc.c */
#else
#define ASM_SPEC \
"-b %{!mcoff:elf}%{mcoff:coff \
%{static:%e-static not valid with -mcoff} \
%{shared:%e-shared not valid with -mcoff} \
%{symbolic:%e-symbolic not valid with -mcoff}} \
%{Ym,*} %{Yd,*} %{Wa,*:%*} \
%{!mcoff:-E%{Xa:a}%{!Xa:%{Xc:c}%{!Xc:%{Xk:k}%{!Xk:%{Xt:t}%{!Xt:a}}}},%{ansi:ansi}%{!ansi:%{posix:posix}%{!posix:%{Xpg4:xpg4}%{!Xpg4:%{Xpg4plus:XPG4PLUS}%{!Xpg4plus:%{Xods30:ods30}%{!Xods30:XPG4PLUS}}}}},ELF %{Qn:} %{!Qy:-Qn}}"
"%{Ym,*} %{Yd,*} %{Wa,*:%*} \
-E%{Xa:a}%{!Xa:%{Xc:c}%{!Xc:%{Xk:k}%{!Xk:%{Xt:t}%{!Xt:a}}}},%{ansi:ansi}%{!ansi:%{posix:posix}%{!posix:%{Xpg4:xpg4}%{!Xpg4:%{Xpg4plus:XPG4PLUS}%{!Xpg4plus:%{Xods30:ods30}%{!Xods30:XPG4PLUS}}}}},ELF %{Qn:} %{!Qy:-Qn}"
#endif
/* Use crt1.o as a startup file and crtn.o as a closing file. */
/*
* Use crti.o for shared objects, crt1.o for normal executables. Make sure
* to recognize both -G and -shared as a valid way of introducing shared
* library generation. This is important for backwards compatibility.
*/
#undef STARTFILE_SPEC
#define STARTFILE_SPEC \
"%{shared: %{!mcoff: crti.o%s}} \
%{!shared:\
"%{pg:%e-pg not supported on this platform} \
%{p:%{pp:%e-p and -pp specified - pick one}} \
%{!shared:\
%{!symbolic: \
%{pg:gcrt.o%s}%{!pg:%{p:mcrt1.o%s}%{!p:crt1.o%s}}}} \
%{!G: \
%{pp:pcrt1elf.o%s}%{p:mcrt1.o%s}%{!p:%{!pp:crt1.o%s}}}}} \
crti.o%s \
%{ansi:values-Xc.o%s} \
%{!ansi: \
%{Xa:values-Xa.o%s} \
%{!Xa:%{Xc:values-Xc.o%s} \
%{!Xc:%{Xk:values-Xk.o%s} \
%{!Xk:%{Xt:values-Xt.o%s} \
%{!Xt:values-Xa.o%s}}}}} \
%{mcoff:crtbeginS.o%s} %{!mcoff:crtbegin.o%s}"
%{traditional:values-Xt.o%s} \
%{!traditional: \
%{Xa:values-Xa.o%s} \
%{!Xa:%{Xc:values-Xc.o%s} \
%{!Xc:%{Xk:values-Xk.o%s} \
%{!Xk:%{Xt:values-Xt.o%s} \
%{!Xt:values-Xa.o%s}}}}}} \
crtbegin.o%s"
#undef ENDFILE_SPEC
#define ENDFILE_SPEC \
"%{!mcoff:crtend.o%s} \
%{mcoff:crtendS.o%s} \
%{pg:gcrtn.o%s}%{!pg:crtn.o%s}"
"crtend.o%s crtn.o%s"
#define TARGET_OS_CPP_BUILTINS() \
do \
{ \
builtin_define ("__unix"); \
builtin_define ("_SCO_DS"); \
builtin_define ("_M_I386"); \
builtin_define ("_M_XENIX"); \
builtin_define ("_M_UNIX"); \
builtin_assert ("system=svr3"); \
if (flag_iso) \
cpp_define (pfile, "_STRICT_ANSI"); \
if (flag_pic) \
{ \
builtin_define ("__PIC__"); \
builtin_define ("__pic__"); \
} \
} \
#define TARGET_OS_CPP_BUILTINS() \
do \
{ \
builtin_define ("__unix"); \
builtin_define ("_SCO_DS"); \
builtin_define ("_SCO_DS_LL"); \
builtin_define ("_SCO_ELF"); \
builtin_define ("_M_I386"); \
builtin_define ("_M_XENIX"); \
builtin_define ("_M_UNIX"); \
builtin_assert ("system=svr3"); \
if (flag_iso) \
cpp_define (pfile, "_STRICT_ANSI"); \
if (flag_pic) \
{ \
builtin_define ("__PIC__"); \
builtin_define ("__pic__"); \
} \
} \
while (0)
#undef CPP_SPEC
#define CPP_SPEC "\
%{fpic:%{mcoff:%e-fpic is not valid with -mcoff}} \
%{fPIC:%{mcoff:%e-fPIC is not valid with -mcoff}} \
-isystem /usr/gnu/include \
%{pthread:-D_REENTRANT} \
%{!Xods30:-D_STRICT_NAMES} \
%{!ansi:%{!posix:%{!Xods30:-D_SCO_XPG_VERS=4}}} \
%{ansi:-isystem include/ansi%s -isystem /usr/include/ansi} \
@ -652,8 +256,6 @@ init_section () \
-DM_BITFIELDS -DM_SYS5 -DM_SYSV -DM_INTERNAT -DM_SYSIII \
-DM_WORDSWAP}}}} \
%{scointl:-DM_INTERNAT -D_M_INTERNAT} \
%{!mcoff:-D_SCO_ELF} \
%{mcoff:-D_M_COFF -D_SCO_COFF} \
%{Xa:-D_SCO_C_DIALECT=1} \
%{!Xa:%{Xc:-D_SCO_C_DIALECT=3} \
%{!Xc:%{Xk:-D_SCO_C_DIALECT=4} \
@ -662,109 +264,38 @@ init_section () \
#undef LINK_SPEC
#define LINK_SPEC \
"-b %{!mcoff:elf}%{mcoff:coff \
%{static:%e-static not valid with -mcoff} \
%{shared:%e-shared not valid with -mcoff} \
%{symbolic:%e-symbolic not valid with -mcoff} \
%{fpic:%e-fpic not valid with -mcoff} \
%{fPIC:%e-fPIC not valid with -mcoff}} \
-R%{Xa:a}%{!Xa:%{Xc:c}%{!Xc:%{Xk:k}%{!Xk:%{Xt:t}%{!Xt:a}}}},%{ansi:ansi}%{!ansi:%{posix:posix}%{!posix:%{Xpg4:xpg4}%{!Xpg4:%{Xpg4plus:XPG4PLUS}%{!Xpg4plus:%{Xods30:ods30}%{!Xods30:XPG4PLUS}}}}},%{mcoff:COFF}%{!mcoff:ELF} \
%{Wl,*%*} %{YP,*} %{YL,*} %{YU,*} \
"%{!shared:%{!symbolic:%{!G:-E%{Xa:a}%{!Xa:%{Xc:c}%{!Xc:%{Xk:k}%{!Xk:%{Xt:t}%{!Xt:a}}}},%{ansi:ansi}%{!ansi:%{posix:posix}%{!posix:%{Xpg4:xpg4}%{!Xpg4:%{Xpg4plus:XPG4PLUS}%{!Xpg4plus:%{Xods30:ods30}%{!Xods30:XPG4PLUS}}}}},ELF}}} \
%{Wl,*:%*} %{YP,*} %{YL,*} %{YU,*} \
%{!YP,*:%{p:-YP,/usr/ccs/libp:/lib/libp:/usr/lib/libp:/usr/ccs/lib:/lib:/usr/lib} \
%{!p:-YP,/usr/ccs/lib:/lib:/usr/lib}} \
%{h*} %{static:-dn -Bstatic} %{shared:-G -dy %{!z*:-z text}} \
%{symbolic:-Bsymbolic -G -dy %{!z*:-z text}} %{z*} %{R*} %{Y*} \
%{G:-G} %{!mcoff:%{Qn:} %{!Qy:-Qn}}"
/* The SCO COFF linker gets confused on the difference between "-ofoo"
and "-o foo". So we just always force a single space. */
#define SWITCHES_NEED_SPACES "o"
%{h*} %{static:-dn -Bstatic %{G:%e-G and -static are mutually exclusive}} \
%{shared:%{!G:-G}} %{G:%{!shared:-G}} %{shared:%{G:-G}} \
%{shared:-dy %{symbolic:-Bsymbolic -G} %{z*}} %{R*} %{Y*} \
%{Qn:} %{!Qy:-Qn} -z alt_resolve"
/* Library spec. If we are not building a shared library, provide the
standard libraries, as per the SCO compiler. */
#undef LIB_SPEC
#define LIB_SPEC \
"%{shared:pic/libgcc.a%s}%{!shared:%{!symbolic:-lcrypt -lgen -lc}}"
"%{shared:%{!G:pic/libgcc.a%s}} \
%{G:%{!shared:pic/libgcc.a%s}} \
%{shared:%{G:pic/libgcc.a%s}} \
%{p:%{!pp:-lelfprof -lelf}} %{pp:%{!p:-lelfprof -lelf}} \
%{!shared:%{!symbolic:%{!G:-lcrypt -lgen -lc %{pthread:-lpthread}}}}"
#undef LIBGCC_SPEC
#define LIBGCC_SPEC \
"%{!shared:-lgcc}"
"%{!shared:%{!G:-lgcc}}"
#define MASK_COFF 010000000000 /* Mask for elf generation */
#define TARGET_ELF (1) /* (!(target_flags & MASK_COFF)) */
/* Here for legacy support only so we still accept -melf flag */
#define MASK_COFF 010000000000 /* Mask for COFF generation */
#define TARGET_ELF (1)
#undef SUBTARGET_SWITCHES
#define SUBTARGET_SWITCHES \
{ "elf", -MASK_COFF, N_("Generate ELF output") },
#define NO_DOLLAR_IN_LABEL
/* Implicit library calls should use memcpy, not bcopy, etc. They are
faster on OpenServer libraries. */
#define TARGET_MEM_FUNCTIONS
/* Biggest alignment supported by the object file format of this
machine. Use this macro to limit the alignment which can be
specified using the `__attribute__ ((aligned (N)))' construct. If
not defined, the default value is `BIGGEST_ALIGNMENT'. */
#define MAX_OFILE_ALIGNMENT (32768*8)
/* Define the `__builtin_va_list' type for the ABI. On OpenServer, this
type is `char *'. */
#undef BUILD_VA_LIST_TYPE
#define BUILD_VA_LIST_TYPE(VALIST) \
(VALIST) = build_pointer_type (char_type_node)
/*
Here comes some major hackery to get the crt stuff to compile properly.
Since we can (and do) compile for both COFF and ELF environments, we
set things up accordingly, based on the pre-processor defines for ELF
and COFF. This is insane, but then I guess having one compiler with a
single back-end supporting two vastly different file format types is
a little insane too. But it is not impossible and we get a useful
compiler at the end of the day. Onward we go ...
*/
#if defined(CRT_BEGIN) || defined(CRT_END) || defined(IN_LIBGCC2)
# undef OBJECT_FORMAT_ELF
# undef INIT_SECTION_ASM_OP
# undef FINI_SECTION_ASM_OP
# undef CTORS_SECTION_ASM_OP
# undef DTORS_SECTION_ASM_OP
# undef EH_FRAME_SECTION_NAME
# undef CTOR_LIST_BEGIN
# undef CTOR_LIST_END
# undef DO_GLOBAL_CTORS_BODY
# if defined (_SCO_ELF)
# define OBJECT_FORMAT_ELF
# define INIT_SECTION_ASM_OP INIT_SECTION_ASM_OP_ELF
# define FINI_SECTION_ASM_OP FINI_SECTION_ASM_OP_ELF
# define DTORS_SECTION_ASM_OP DTORS_SECTION_ASM_OP_ELF
# define CTORS_SECTION_ASM_OP CTORS_SECTION_ASM_OP_ELF
# define EH_FRAME_SECTION_NAME EH_FRAME_SECTION_NAME_ELF
# else /* ! _SCO_ELF */
# define INIT_SECTION_ASM_OP INIT_SECTION_ASM_OP_COFF
# define FINI_SECTION_ASM_OP FINI_SECTION_ASM_OP_COFF
# define DTORS_SECTION_ASM_OP DTORS_SECTION_ASM_OP_COFF
# define CTORS_SECTION_ASM_OP CTORS_SECTION_ASM_OP_COFF
# define EH_FRAME_SECTION_NAME EH_FRAME_SECTION_NAME_COFF
# define CTOR_LIST_BEGIN asm (INIT_SECTION_ASM_OP); asm ("pushl $0")
# define CTOR_LIST_END CTOR_LIST_BEGIN
# define DO_GLOBAL_CTORS_BODY \
do { \
func_ptr *p, *beg = alloca(0); \
for (p = beg; *p;) \
(*p++) (); \
} while (0)
# endif /* ! _SCO_ELF */
#endif /* CRT_BEGIN !! CRT_END */
/* Handle special EH pointer encodings. Absolute, pc-relative, and
indirect are handled automatically. */
#define ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX(FILE, ENCODING, SIZE, ADDR, DONE) \
@ -798,10 +329,3 @@ do { \
: "=d"(BASE))
#endif
/* Select a format to encode pointers in exception handling data. CODE
is 0 for data, 1 for code labels, 2 for function pointers. GLOBAL is
true if the symbol may be affected by dynamic relocations. */
#undef ASM_PREFERRED_EH_DATA_FORMAT
#define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \
(flag_pic ? (GLOBAL ? DW_EH_PE_indirect : 0) | DW_EH_PE_datarel \
: DW_EH_PE_absptr)

View File

@ -1,5 +1,5 @@
/* Target definitions for GNU compiler for Intel 80386 running Solaris 2
Copyright (C) 1993, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
Copyright (C) 1993, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
Free Software Foundation, Inc.
Contributed by Fred Fish (fnf@cygnus.com).
@ -20,8 +20,6 @@ along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#define CMOV_SUN_AS_SYNTAX 1
/* The Solaris 2.0 x86 linker botches alignment of code sections.
It tries to align to a 16 byte boundary by padding with 0x00000090
ints, rather than 0x90 bytes (nop). This generates trash in the

View File

@ -1,18 +1,16 @@
# We need to use -fPIC when we are using gcc to compile the routines in
# crtstuff.c. This is only really needed when we are going to use gcc/g++
# to produce a shared library, but since we don't know ahead of time when
# we will be doing that, we just always use -fPIC when compiling the
# routines in crtstuff.c. Likewise for libgcc2.c. This is less painful
# than multilibbing everything with PIC and PIC-not variants.
# The pushl in CTOR initialization interferes with frame pointer elimination.
# We multilib libgcc for -fPIC, to get real PIC code in it.
# NOTE: We must use -fPIC on crt{begi,end}.o else we get an RTLD error
# "cant set protections on segment of length blah at 0x8048000".
CRTSTUFF_T_CFLAGS = -fPIC -fno-omit-frame-pointer
TARGET_LIBGCC2_CFLAGS = -fPIC
crti.o: $(srcdir)/config/i386/sol2-ci.asm $(GCC_PASSES)
sed -e '/^!/d' <$(srcdir)/config/i386/sol2-ci.asm >crti.s
$(GCC_FOR_TARGET) -c -o crti.o crti.s
MULTILIB_OPTIONS = fPIC
MULTILIB_DIRNAMES = pic
MUTLILIB_EXCEPTIONS =
MULTILIB_MATCHES = fPIC=fpic
MULTILIB_EXTRA_OPTS =
LIBGCC=stmp-multilib
INSTALL_LIBGCC=install-multilib
# See all the declarations.
FIXPROTO_DEFINES = -D_XOPEN_SOURCE -D_POSIX_C_SOURCE=2

File diff suppressed because it is too large Load Diff

View File

@ -49,6 +49,13 @@ do { \
} \
} while (0)
#undef CPP_SPEC
#define CPP_SPEC \
"%{mt|pthread:-D_REENTRANT -D_THREAD_SAFE -D_POSIX_C_SOURCE=199506L}"
/* aCC defines also -DRWSTD_MULTI_THREAD, -DRW_MULTI_THREAD. These
affect only aCC's C++ library (Rogue Wave-derived) which we do not
use, and they violate the user's name space. */
#undef ASM_EXTRA_SPEC
#define ASM_EXTRA_SPEC "%{milp32:-milp32} %{mlp64:-mlp64}"
@ -68,6 +75,7 @@ do { \
#undef LIB_SPEC
#define LIB_SPEC \
"%{!shared: \
%{mt|pthread:-lpthread} \
%{p:%{!mlp64:-L/usr/lib/hpux32/libp} \
%{mlp64:-L/usr/lib/hpux64/libp} -lprof} \
%{pg:%{!mlp64:-L/usr/lib/hpux32/libp} \
@ -134,6 +142,10 @@ do { \
#undef TARGET_HPUX_LD
#define TARGET_HPUX_LD 1
/* The HPUX dynamic linker objects to weak symbols with no
definitions, so do not use them in gthr-posix.h. */
#define GTHREAD_USE_WEAK 0
/* Put out the needed function declarations at the end. */
#define ASM_FILE_END(STREAM) ia64_hpux_asm_file_end(STREAM)
@ -144,6 +156,10 @@ do { \
#undef DTORS_SECTION_ASM_OP
#define DTORS_SECTION_ASM_OP "\t.section\t.fini_array,\t\"aw\",\"fini_array\""
/* The init_array/fini_array technique does not permit the use of
initialization priorities. */
#define SUPPORTS_INIT_PRIORITY 0
#undef READONLY_DATA_SECTION_ASM_OP
#define READONLY_DATA_SECTION_ASM_OP "\t.section\t.rodata,\t\"a\",\t\"progbits\""

View File

@ -135,6 +135,9 @@ extern void ia64_override_options PARAMS((void));
extern int ia64_dbx_register_number PARAMS((int));
extern bool ia64_function_ok_for_sibcall PARAMS ((tree));
extern rtx ia64_return_addr_rtx PARAMS ((HOST_WIDE_INT, rtx));
extern void ia64_split_return_addr_rtx PARAMS ((rtx));
#ifdef SDATA_SECTION_ASM_OP
extern void sdata_section PARAMS ((void));
#endif

View File

@ -175,8 +175,9 @@ static rtx ia64_expand_fetch_and_op PARAMS ((optab, enum machine_mode,
tree, rtx));
static rtx ia64_expand_op_and_fetch PARAMS ((optab, enum machine_mode,
tree, rtx));
static rtx ia64_expand_compare_and_swap PARAMS ((enum machine_mode, int,
tree, rtx));
static rtx ia64_expand_compare_and_swap PARAMS ((enum machine_mode,
enum machine_mode,
int, tree, rtx));
static rtx ia64_expand_lock_test_and_set PARAMS ((enum machine_mode,
tree, rtx));
static rtx ia64_expand_lock_release PARAMS ((enum machine_mode, tree, rtx));
@ -1154,6 +1155,7 @@ ia64_expand_move (op0, op1)
if ((tls_kind = tls_symbolic_operand (op1, Pmode)))
{
rtx tga_op1, tga_op2, tga_ret, tga_eqv, tmp, insns;
rtx orig_op0 = op0;
switch (tls_kind)
{
@ -1177,8 +1179,10 @@ ia64_expand_move (op0, op1)
insns = get_insns ();
end_sequence ();
if (GET_MODE (op0) != Pmode)
op0 = tga_ret;
emit_libcall_block (insns, op0, tga_ret, op1);
return NULL_RTX;
break;
case TLS_MODEL_LOCAL_DYNAMIC:
/* ??? This isn't the completely proper way to do local-dynamic
@ -1206,20 +1210,15 @@ ia64_expand_move (op0, op1)
tmp = gen_reg_rtx (Pmode);
emit_libcall_block (insns, tmp, tga_ret, tga_eqv);
if (register_operand (op0, Pmode))
tga_ret = op0;
else
tga_ret = gen_reg_rtx (Pmode);
if (!register_operand (op0, Pmode))
op0 = gen_reg_rtx (Pmode);
if (TARGET_TLS64)
{
emit_insn (gen_load_dtprel (tga_ret, op1));
emit_insn (gen_adddi3 (tga_ret, tmp, tga_ret));
emit_insn (gen_load_dtprel (op0, op1));
emit_insn (gen_adddi3 (op0, tmp, op0));
}
else
emit_insn (gen_add_dtprel (tga_ret, tmp, op1));
if (tga_ret == op0)
return NULL_RTX;
op1 = tga_ret;
emit_insn (gen_add_dtprel (op0, tmp, op1));
break;
case TLS_MODEL_INITIAL_EXEC:
@ -1229,35 +1228,32 @@ ia64_expand_move (op0, op1)
RTX_UNCHANGING_P (tmp) = 1;
tmp = force_reg (Pmode, tmp);
if (register_operand (op0, Pmode))
op1 = op0;
else
op1 = gen_reg_rtx (Pmode);
emit_insn (gen_adddi3 (op1, tmp, gen_thread_pointer ()));
if (op1 == op0)
return NULL_RTX;
if (!register_operand (op0, Pmode))
op0 = gen_reg_rtx (Pmode);
emit_insn (gen_adddi3 (op0, tmp, gen_thread_pointer ()));
break;
case TLS_MODEL_LOCAL_EXEC:
if (register_operand (op0, Pmode))
tmp = op0;
else
tmp = gen_reg_rtx (Pmode);
if (!register_operand (op0, Pmode))
op0 = gen_reg_rtx (Pmode);
if (TARGET_TLS64)
{
emit_insn (gen_load_tprel (tmp, op1));
emit_insn (gen_adddi3 (tmp, gen_thread_pointer (), tmp));
emit_insn (gen_load_tprel (op0, op1));
emit_insn (gen_adddi3 (op0, gen_thread_pointer (), op0));
}
else
emit_insn (gen_add_tprel (tmp, gen_thread_pointer (), op1));
if (tmp == op0)
return NULL_RTX;
op1 = tmp;
emit_insn (gen_add_tprel (op0, gen_thread_pointer (), op1));
break;
default:
abort ();
}
if (orig_op0 == op0)
return NULL_RTX;
if (GET_MODE (orig_op0) == Pmode)
return op0;
return gen_lowpart (GET_MODE (orig_op0), op0);
}
else if (!TARGET_NO_PIC &&
(symbolic_operand (op1, Pmode) ||
@ -2015,10 +2011,6 @@ ia64_initial_elimination_offset (from, to)
abort ();
break;
case RETURN_ADDRESS_POINTER_REGNUM:
offset = 0;
break;
default:
abort ();
}
@ -2369,17 +2361,6 @@ ia64_expand_prologue ()
reg_names[current_frame_info.reg_fp] = tmp;
}
/* Fix up the return address placeholder. */
/* ??? We can fail if __builtin_return_address is used, and we didn't
allocate a register in which to save b0. I can't think of a way to
eliminate RETURN_ADDRESS_POINTER_REGNUM to a local register and
then be sure that I got the right one. Further, reload doesn't seem
to care if an eliminable register isn't used, and "eliminates" it
anyway. */
if (regs_ever_live[RETURN_ADDRESS_POINTER_REGNUM]
&& current_frame_info.reg_save_b0 != 0)
XINT (return_address_pointer_rtx, 0) = current_frame_info.reg_save_b0;
/* We don't need an alloc instruction if we've used no outputs or locals. */
if (current_frame_info.n_local_regs == 0
&& current_frame_info.n_output_regs == 0
@ -2936,6 +2917,72 @@ ia64_direct_return ()
return 0;
}
/* Return the magic cookie that we use to hold the return address
during early compilation. */
rtx
ia64_return_addr_rtx (count, frame)
HOST_WIDE_INT count;
rtx frame ATTRIBUTE_UNUSED;
{
if (count != 0)
return NULL;
return gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx), UNSPEC_RET_ADDR);
}
/* Split this value after reload, now that we know where the return
address is saved. */
void
ia64_split_return_addr_rtx (dest)
rtx dest;
{
rtx src;
if (TEST_HARD_REG_BIT (current_frame_info.mask, BR_REG (0)))
{
if (current_frame_info.reg_save_b0 != 0)
src = gen_rtx_REG (DImode, current_frame_info.reg_save_b0);
else
{
HOST_WIDE_INT off;
unsigned int regno;
/* Compute offset from CFA for BR0. */
/* ??? Must be kept in sync with ia64_expand_prologue. */
off = (current_frame_info.spill_cfa_off
+ current_frame_info.spill_size);
for (regno = GR_REG (1); regno <= GR_REG (31); ++regno)
if (TEST_HARD_REG_BIT (current_frame_info.mask, regno))
off -= 8;
/* Convert CFA offset to a register based offset. */
if (frame_pointer_needed)
src = hard_frame_pointer_rtx;
else
{
src = stack_pointer_rtx;
off += current_frame_info.total_size;
}
/* Load address into scratch register. */
if (CONST_OK_FOR_I (off))
emit_insn (gen_adddi3 (dest, src, GEN_INT (off)));
else
{
emit_move_insn (dest, GEN_INT (off));
emit_insn (gen_adddi3 (dest, src, dest));
}
src = gen_rtx_MEM (Pmode, dest);
}
}
else
src = gen_rtx_REG (DImode, BR_REG (0));
emit_move_insn (dest, src);
}
int
ia64_hard_regno_rename_ok (from, to)
int from;
@ -3085,9 +3132,6 @@ ia64_output_function_epilogue (file, size)
{
int i;
/* Reset from the function's potential modifications. */
XINT (return_address_pointer_rtx, 0) = RETURN_ADDRESS_POINTER_REGNUM;
if (current_frame_info.reg_fp)
{
const char *tmp = reg_names[HARD_FRAME_POINTER_REGNUM];
@ -7060,7 +7104,8 @@ ia64_emit_nops ()
{
while (bundle_pos < 3)
{
emit_insn_before (gen_nop_type (b->t[bundle_pos]), insn);
if (b->t[bundle_pos] != TYPE_L)
emit_insn_before (gen_nop_type (b->t[bundle_pos]), insn);
bundle_pos++;
}
continue;
@ -7666,11 +7711,16 @@ ia64_init_builtins ()
psi_type_node, integer_type_node,
integer_type_node, NULL_TREE);
/* __sync_val_compare_and_swap_di, __sync_bool_compare_and_swap_di */
/* __sync_val_compare_and_swap_di */
tree di_ftype_pdi_di_di
= build_function_type_list (long_integer_type_node,
pdi_type_node, long_integer_type_node,
long_integer_type_node, NULL_TREE);
/* __sync_bool_compare_and_swap_di */
tree si_ftype_pdi_di_di
= build_function_type_list (integer_type_node,
pdi_type_node, long_integer_type_node,
long_integer_type_node, NULL_TREE);
/* __sync_synchronize */
tree void_ftype_void
= build_function_type (void_type_node, void_list_node);
@ -7703,7 +7753,7 @@ ia64_init_builtins ()
IA64_BUILTIN_VAL_COMPARE_AND_SWAP_DI);
def_builtin ("__sync_bool_compare_and_swap_si", si_ftype_psi_si_si,
IA64_BUILTIN_BOOL_COMPARE_AND_SWAP_SI);
def_builtin ("__sync_bool_compare_and_swap_di", di_ftype_pdi_di_di,
def_builtin ("__sync_bool_compare_and_swap_di", si_ftype_pdi_di_di,
IA64_BUILTIN_BOOL_COMPARE_AND_SWAP_DI);
def_builtin ("__sync_synchronize", void_ftype_void,
@ -7943,7 +7993,8 @@ ia64_expand_op_and_fetch (binoptab, mode, arglist, target)
*/
static rtx
ia64_expand_compare_and_swap (mode, boolp, arglist, target)
ia64_expand_compare_and_swap (rmode, mode, boolp, arglist, target)
enum machine_mode rmode;
enum machine_mode mode;
int boolp;
tree arglist;
@ -7991,7 +8042,7 @@ ia64_expand_compare_and_swap (mode, boolp, arglist, target)
if (boolp)
{
if (! target)
target = gen_reg_rtx (mode);
target = gen_reg_rtx (rmode);
return emit_store_flag_force (target, EQ, tmp, old, mode, 1, 1);
}
else
@ -8066,11 +8117,16 @@ ia64_expand_builtin (exp, target, subtarget, mode, ignore)
tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
tree arglist = TREE_OPERAND (exp, 1);
enum machine_mode rmode = VOIDmode;
switch (fcode)
{
case IA64_BUILTIN_BOOL_COMPARE_AND_SWAP_SI:
case IA64_BUILTIN_VAL_COMPARE_AND_SWAP_SI:
mode = SImode;
rmode = SImode;
break;
case IA64_BUILTIN_LOCK_TEST_AND_SET_SI:
case IA64_BUILTIN_LOCK_RELEASE_SI:
case IA64_BUILTIN_FETCH_AND_ADD_SI:
@ -8089,7 +8145,15 @@ ia64_expand_builtin (exp, target, subtarget, mode, ignore)
break;
case IA64_BUILTIN_BOOL_COMPARE_AND_SWAP_DI:
mode = DImode;
rmode = SImode;
break;
case IA64_BUILTIN_VAL_COMPARE_AND_SWAP_DI:
mode = DImode;
rmode = DImode;
break;
case IA64_BUILTIN_LOCK_TEST_AND_SET_DI:
case IA64_BUILTIN_LOCK_RELEASE_DI:
case IA64_BUILTIN_FETCH_AND_ADD_DI:
@ -8115,11 +8179,13 @@ ia64_expand_builtin (exp, target, subtarget, mode, ignore)
{
case IA64_BUILTIN_BOOL_COMPARE_AND_SWAP_SI:
case IA64_BUILTIN_BOOL_COMPARE_AND_SWAP_DI:
return ia64_expand_compare_and_swap (mode, 1, arglist, target);
return ia64_expand_compare_and_swap (rmode, mode, 1, arglist,
target);
case IA64_BUILTIN_VAL_COMPARE_AND_SWAP_SI:
case IA64_BUILTIN_VAL_COMPARE_AND_SWAP_DI:
return ia64_expand_compare_and_swap (mode, 0, arglist, target);
return ia64_expand_compare_and_swap (rmode, mode, 0, arglist,
target);
case IA64_BUILTIN_SYNCHRONIZE:
emit_insn (gen_mf ());
@ -8368,6 +8434,9 @@ ia64_output_mi_thunk (file, thunk, delta, vcall_offset, function)
emit_note (NULL, NOTE_INSN_PROLOGUE_END);
this = gen_rtx_REG (Pmode, IN_REG (0));
if (TARGET_ILP32)
emit_insn (gen_ptr_extend (this,
gen_rtx_REG (ptr_mode, IN_REG (0))));
/* Apply the constant offset, if required. */
if (delta)
@ -8389,7 +8458,14 @@ ia64_output_mi_thunk (file, thunk, delta, vcall_offset, function)
rtx vcall_offset_rtx = GEN_INT (vcall_offset);
rtx tmp = gen_rtx_REG (Pmode, 2);
emit_move_insn (tmp, gen_rtx_MEM (Pmode, this));
if (TARGET_ILP32)
{
rtx t = gen_rtx_REG (ptr_mode, 2);
emit_move_insn (t, gen_rtx_MEM (ptr_mode, this));
emit_insn (gen_ptr_extend (tmp, t));
}
else
emit_move_insn (tmp, gen_rtx_MEM (Pmode, this));
if (!CONST_OK_FOR_J (vcall_offset))
{
@ -8399,7 +8475,11 @@ ia64_output_mi_thunk (file, thunk, delta, vcall_offset, function)
}
emit_insn (gen_adddi3 (tmp, tmp, vcall_offset_rtx));
emit_move_insn (tmp, gen_rtx_MEM (Pmode, tmp));
if (TARGET_ILP32)
emit_move_insn (gen_rtx_REG (ptr_mode, 2),
gen_rtx_MEM (ptr_mode, tmp));
else
emit_move_insn (tmp, gen_rtx_MEM (Pmode, tmp));
emit_insn (gen_adddi3 (this, this, tmp));
}

View File

@ -436,7 +436,7 @@ while (0)
64 predicate registers, 8 branch registers, one frame pointer,
and several "application" registers. */
#define FIRST_PSEUDO_REGISTER 335
#define FIRST_PSEUDO_REGISTER 334
/* Ranges for the various kinds of registers. */
#define ADDL_REGNO_P(REGNO) ((unsigned HOST_WIDE_INT) (REGNO) <= 3)
@ -445,9 +445,7 @@ while (0)
#define PR_REGNO_P(REGNO) ((REGNO) >= 256 && (REGNO) <= 319)
#define BR_REGNO_P(REGNO) ((REGNO) >= 320 && (REGNO) <= 327)
#define GENERAL_REGNO_P(REGNO) \
(GR_REGNO_P (REGNO) \
|| (REGNO) == FRAME_POINTER_REGNUM \
|| (REGNO) == RETURN_ADDRESS_POINTER_REGNUM)
(GR_REGNO_P (REGNO) || (REGNO) == FRAME_POINTER_REGNUM)
#define GR_REG(REGNO) ((REGNO) + 0)
#define FR_REG(REGNO) ((REGNO) + 128)
@ -457,11 +455,11 @@ while (0)
#define IN_REG(REGNO) ((REGNO) + 112)
#define LOC_REG(REGNO) ((REGNO) + 32)
#define AR_CCV_REGNUM 330
#define AR_UNAT_REGNUM 331
#define AR_PFS_REGNUM 332
#define AR_LC_REGNUM 333
#define AR_EC_REGNUM 334
#define AR_CCV_REGNUM 329
#define AR_UNAT_REGNUM 330
#define AR_PFS_REGNUM 331
#define AR_LC_REGNUM 332
#define AR_EC_REGNUM 333
#define IN_REGNO_P(REGNO) ((REGNO) >= IN_REG (0) && (REGNO) <= IN_REG (7))
#define LOC_REGNO_P(REGNO) ((REGNO) >= LOC_REG (0) && (REGNO) <= LOC_REG (79))
@ -524,8 +522,8 @@ while (0)
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
/* Branch registers. */ \
0, 0, 0, 0, 0, 0, 0, 0, \
/*FP RA CCV UNAT PFS LC EC */ \
1, 1, 1, 1, 1, 0, 1 \
/*FP CCV UNAT PFS LC EC */ \
1, 1, 1, 1, 0, 1 \
}
/* Like `FIXED_REGISTERS' but has 1 for each register that is clobbered
@ -559,8 +557,8 @@ while (0)
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
/* Branch registers. */ \
1, 0, 0, 0, 0, 0, 1, 1, \
/*FP RA CCV UNAT PFS LC EC */ \
1, 1, 1, 1, 1, 0, 1 \
/*FP CCV UNAT PFS LC EC */ \
1, 1, 1, 1, 0, 1 \
}
/* Like `CALL_USED_REGISTERS' but used to overcome a historical
@ -597,8 +595,8 @@ while (0)
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
/* Branch registers. */ \
1, 0, 0, 0, 0, 0, 1, 1, \
/*FP RA CCV UNAT PFS LC EC */ \
0, 0, 1, 0, 1, 0, 0 \
/*FP CCV UNAT PFS LC EC */ \
0, 1, 0, 1, 0, 0 \
}
@ -744,7 +742,7 @@ while (0)
/* Special branch registers. */ \
R_BR (0), \
/* Other fixed registers. */ \
FRAME_POINTER_REGNUM, RETURN_ADDRESS_POINTER_REGNUM, \
FRAME_POINTER_REGNUM, \
AR_CCV_REGNUM, AR_UNAT_REGNUM, AR_PFS_REGNUM, AR_LC_REGNUM, \
AR_EC_REGNUM \
}
@ -873,11 +871,11 @@ enum reg_class
/* AR_M_REGS. */ \
{ 0x00000000, 0x00000000, 0x00000000, 0x00000000, \
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
0x00000000, 0x00000000, 0x0C00 }, \
0x00000000, 0x00000000, 0x0600 }, \
/* AR_I_REGS. */ \
{ 0x00000000, 0x00000000, 0x00000000, 0x00000000, \
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
0x00000000, 0x00000000, 0x7000 }, \
0x00000000, 0x00000000, 0x3800 }, \
/* ADDL_REGS. */ \
{ 0x0000000F, 0x00000000, 0x00000000, 0x00000000, \
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
@ -885,7 +883,7 @@ enum reg_class
/* GR_REGS. */ \
{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, \
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
0x00000000, 0x00000000, 0x0300 }, \
0x00000000, 0x00000000, 0x0100 }, \
/* FR_REGS. */ \
{ 0x00000000, 0x00000000, 0x00000000, 0x00000000, \
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, \
@ -893,15 +891,15 @@ enum reg_class
/* GR_AND_BR_REGS. */ \
{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, \
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
0x00000000, 0x00000000, 0x03FF }, \
0x00000000, 0x00000000, 0x01FF }, \
/* GR_AND_FR_REGS. */ \
{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, \
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, \
0x00000000, 0x00000000, 0x0300 }, \
0x00000000, 0x00000000, 0x0100 }, \
/* ALL_REGS. */ \
{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, \
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, \
0xFFFFFFFF, 0xFFFFFFFF, 0x7FFF }, \
0xFFFFFFFF, 0xFFFFFFFF, 0x3FFF }, \
}
/* A C expression whose value is a register class containing hard register
@ -1119,7 +1117,7 @@ enum reg_class
DYNAMIC_CHAIN_ADDRESS and SETUP_FRAME_ADDRESS (for the reg stack flush). */
#define RETURN_ADDR_RTX(COUNT, FRAME) \
((COUNT) == 0 ? return_address_pointer_rtx : const0_rtx)
ia64_return_addr_rtx (COUNT, FRAME)
/* A C expression whose value is RTL representing the location of the incoming
return address at the beginning of any function, before the prologue. This
@ -1180,13 +1178,6 @@ enum reg_class
REGNO_POINTER_ALIGN (ARG_POINTER_REGNUM) = 64; \
} while (0)
/* The register number for the return address register. For IA-64, this
is not actually a pointer as the name suggests, but that's a name that
gen_rtx_REG already takes care to keep unique. We modify
return_address_pointer_rtx in ia64_expand_prologue to reference the
final output regnum. */
#define RETURN_ADDRESS_POINTER_REGNUM 329
/* Register numbers used for passing a function's static chain pointer. */
/* ??? The ABI sez the static chain should be passed as a normal parameter. */
#define STATIC_CHAIN_REGNUM 15
@ -1210,7 +1201,6 @@ enum reg_class
{ARG_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}, \
{FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
{FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}, \
{RETURN_ADDRESS_POINTER_REGNUM, BR_REG (0)}, \
}
/* A C expression that returns nonzero if the compiler is allowed to try to
@ -1934,8 +1924,8 @@ do { \
"p60", "p61", "p62", "p63", \
/* Branch registers. */ \
"b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7", \
/* Frame pointer. Return address. */ \
"sfp", "retaddr", "ar.ccv", "ar.unat", "ar.pfs", "ar.lc", "ar.ec", \
/* Frame pointer. Application registers. */ \
"sfp", "ar.ccv", "ar.unat", "ar.pfs", "ar.lc", "ar.ec", \
}
/* If defined, a C initializer for an array of structures containing a name and

View File

@ -73,6 +73,7 @@
(UNSPEC_BUNDLE_SELECTOR 23)
(UNSPEC_ADDP4 24)
(UNSPEC_PROLOGUE_USE 25)
(UNSPEC_RET_ADDR 26)
])
(define_constants
@ -416,6 +417,25 @@
DONE;
})
;; This is used as a placeholder for the return address during early
;; compilation. We won't know where we've placed this until during
;; reload, at which point it can wind up in b0, a general register,
;; or memory. The only safe destination under these conditions is a
;; general register.
(define_insn_and_split "*movdi_ret_addr"
[(set (match_operand:DI 0 "register_operand" "=r")
(unspec:DI [(const_int 0)] UNSPEC_RET_ADDR))]
""
"#"
"reload_completed"
[(const_int 0)]
{
ia64_split_return_addr_rtx (operands[0]);
DONE;
}
[(set_attr "itanium_class" "ialu")])
(define_insn "*movdi_internal"
[(set (match_operand:DI 0 "destination_operand"
"=r,r,r,r, m, r,*f,*f,*f, Q, r,*b, r,*e, r,*d, r,*c")

View File

@ -19,13 +19,11 @@ extern long __sync_val_compare_and_swap_di (long *, long, long);
__sync_val_compare_and_swap_di((long *)(PTR),(long)(OLD),(long)(NEW)))
extern int __sync_bool_compare_and_swap_si (int *, int, int);
extern long __sync_bool_compare_and_swap_di (long *, long, long);
extern int __sync_bool_compare_and_swap_di (long *, long, long);
#define __sync_bool_compare_and_swap(PTR, OLD, NEW) \
((sizeof (*(PTR)) == sizeof(int)) \
? (__typeof__(*(PTR))) \
__sync_bool_compare_and_swap_si((int *)(PTR),(int)(OLD),(int)(NEW)) \
: (__typeof__(*(PTR))) \
__sync_bool_compare_and_swap_di((long *)(PTR),(long)(OLD),(long)(NEW)))
? __sync_bool_compare_and_swap_si((int *)(PTR),(int)(OLD),(int)(NEW)) \
: __sync_bool_compare_and_swap_di((long *)(PTR),(long)(OLD),(long)(NEW)))
extern void __sync_lock_release_si (int *);
extern void __sync_lock_release_di (long *);

View File

@ -7,3 +7,6 @@ GCC_3.0 {
__ia64_trampoline
__ia64_backtrace
}
GCC_3.3.2 {
_Unwind_GetBSP
}

View File

@ -1665,6 +1665,14 @@ _Unwind_GetCFA (struct _Unwind_Context *context)
return (_Unwind_Ptr) context->psp;
}
/* Get the value of the Backing Store Pointer as saved in CONTEXT. */
_Unwind_Word
_Unwind_GetBSP (struct _Unwind_Context *context)
{
return (_Unwind_Ptr) context->bsp;
}
static _Unwind_Reason_Code
uw_frame_state_for (struct _Unwind_Context *context, _Unwind_FrameState *fs)
@ -1786,6 +1794,11 @@ uw_update_reg_address (struct _Unwind_Context *context,
addr = ia64_rse_skip_regs ((unsigned long *) context->bsp, rval - 32);
else if (rval >= 2)
addr = context->ireg[rval - 2].loc;
else if (rval == 0)
{
static const unsigned long dummy;
addr = (void *) &dummy;
}
else
abort ();
break;
@ -1837,6 +1850,11 @@ uw_update_reg_address (struct _Unwind_Context *context,
context->ireg[regno - UNW_REG_R2].nat
= context->ireg[rval - 2].nat;
}
else if (rval == 0)
{
context->ireg[regno - UNW_REG_R2].nat.type = UNW_NAT_NONE;
context->ireg[regno - UNW_REG_R2].nat.off = 0;
}
else
abort ();
break;

View File

@ -108,6 +108,9 @@ Boston, MA 02111-1307, USA. */
#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
#endif
#define LINK_GCC_C_SEQUENCE_SPEC \
"%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}"
/* Define this so we can compile MS code for use with WINE. */
#define HANDLE_PRAGMA_PACK_PUSH_POP

View File

@ -48,6 +48,9 @@ Boston, MA 02111-1307, USA. */
#undef LINK_SHLIB_SPEC
#define LINK_SHLIB_SPEC "%{shared:-shared} %{!shared: %{static:-static}}"
#define LINK_GCC_C_SEQUENCE_SPEC \
"%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}"
#undef LIB_DEFAULT_SPEC
#define LIB_DEFAULT_SPEC "%(lib_linux)"

View File

@ -137,6 +137,9 @@ Boston, MA 02111-1307, USA. */
#undef LINK_SHLIB_SPEC
#define LINK_SHLIB_SPEC "%{shared:-shared} %{!shared: %{static:-static}}"
#define LINK_GCC_C_SEQUENCE_SPEC \
"%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}"
#undef LIB_DEFAULT_SPEC
#define LIB_DEFAULT_SPEC "%(lib_linux)"

View File

@ -3310,7 +3310,7 @@ function_arg_pass_by_reference (cum, mode, type, named)
return 1;
}
return type && int_size_in_bytes (type) <= 0;
return type && int_size_in_bytes (type) < 0;
}
/* Perform any needed actions needed for a function that is receiving a
@ -3551,7 +3551,7 @@ rs6000_va_arg (valist, type)
if (DEFAULT_ABI != ABI_V4)
{
/* Variable sized types are passed by reference. */
if (int_size_in_bytes (type) <= 0)
if (int_size_in_bytes (type) < 0)
{
u = build_pointer_type (type);

View File

@ -14308,7 +14308,7 @@
return \"bdz $+8\;b %l0\";
}"
[(set_attr "type" "branch")
(set_attr "length" "4,12,16")])
(set_attr "length" "*,12,16")])
(define_insn "*ctrsi_internal2"
[(set (pc)
@ -14332,7 +14332,7 @@
return \"{bdn|bdnz} $+8\;b %l0\";
}"
[(set_attr "type" "branch")
(set_attr "length" "4,12,16")])
(set_attr "length" "*,12,16")])
(define_insn "*ctrdi_internal1"
[(set (pc)
@ -14356,7 +14356,7 @@
return \"bdz $+8\;b %l0\";
}"
[(set_attr "type" "branch")
(set_attr "length" "4,12,16")])
(set_attr "length" "*,12,16")])
(define_insn "*ctrdi_internal2"
[(set (pc)
@ -14380,7 +14380,7 @@
return \"{bdn|bdnz} $+8\;b %l0\";
}"
[(set_attr "type" "branch")
(set_attr "length" "4,12,16")])
(set_attr "length" "*,12,16")])
;; Similar, but we can use GE since we have a REG_NONNEG.
@ -14406,7 +14406,7 @@
return \"bdz $+8\;b %l0\";
}"
[(set_attr "type" "branch")
(set_attr "length" "4,12,16")])
(set_attr "length" "*,12,16")])
(define_insn "*ctrsi_internal4"
[(set (pc)
@ -14430,7 +14430,7 @@
return \"{bdn|bdnz} $+8\;b %l0\";
}"
[(set_attr "type" "branch")
(set_attr "length" "4,12,16")])
(set_attr "length" "*,12,16")])
(define_insn "*ctrdi_internal3"
[(set (pc)
@ -14454,7 +14454,7 @@
return \"bdz $+8\;b %l0\";
}"
[(set_attr "type" "branch")
(set_attr "length" "4,12,16")])
(set_attr "length" "*,12,16")])
(define_insn "*ctrdi_internal4"
[(set (pc)
@ -14478,7 +14478,7 @@
return \"{bdn|bdnz} $+8\;b %l0\";
}"
[(set_attr "type" "branch")
(set_attr "length" "4,12,16")])
(set_attr "length" "*,12,16")])
;; Similar but use EQ
@ -14504,7 +14504,7 @@
return \"{bdn|bdnz} $+8\;b %l0\";
}"
[(set_attr "type" "branch")
(set_attr "length" "4,12,16")])
(set_attr "length" "*,12,16")])
(define_insn "*ctrsi_internal6"
[(set (pc)
@ -14528,7 +14528,7 @@
return \"bdz $+8\;b %l0\";
}"
[(set_attr "type" "branch")
(set_attr "length" "4,12,16")])
(set_attr "length" "*,12,16")])
(define_insn "*ctrdi_internal5"
[(set (pc)
@ -14552,7 +14552,7 @@
return \"{bdn|bdnz} $+8\;b %l0\";
}"
[(set_attr "type" "branch")
(set_attr "length" "4,12,16")])
(set_attr "length" "*,12,16")])
(define_insn "*ctrdi_internal6"
[(set (pc)
@ -14576,7 +14576,7 @@
return \"bdz $+8\;b %l0\";
}"
[(set_attr "type" "branch")
(set_attr "length" "4,12,16")])
(set_attr "length" "*,12,16")])
;; Now the splitters if we could not allocate the CTR register

View File

@ -383,6 +383,21 @@ do { \
#undef STACK_BOUNDARY
#define STACK_BOUNDARY (TARGET_ALTIVEC_ABI ? 128 : 64)
/* Define this macro if you wish to preserve a certain alignment for
the stack pointer, greater than what the hardware enforces. The
definition is a C expression for the desired alignment (measured
in bits). This macro must evaluate to a value equal to or larger
than STACK_BOUNDARY.
For the SYSV ABI and variants the alignment of the stack pointer
is usually controlled manually in rs6000.c. However, to maintain
alignment across alloca () in all circumstances,
PREFERRED_STACK_BOUNDARY needs to be set as well.
This has the additional advantage of allowing a bigger maximum
alignment of user objects on the stack. */
#undef PREFERRED_STACK_BOUNDARY
#define PREFERRED_STACK_BOUNDARY 128
/* Real stack boundary as mandated by the appropriate ABI. */
#define ABI_STACK_BOUNDARY ((TARGET_EABI && !TARGET_ALTIVEC_ABI) ? 64 : 128)

View File

@ -256,6 +256,10 @@ do { \
#undef CTORS_SECTION_ASM_OP
#undef DTORS_SECTION_ASM_OP
#undef LINK_GCC_C_SEQUENCE_SPEC
#define LINK_GCC_C_SEQUENCE_SPEC \
"%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}"
/* Do code reading to identify a signal frame, and set the frame
state data appropriately. See unwind-dw2.c for the structs. */

View File

@ -319,6 +319,10 @@ do { \
#undef CTORS_SECTION_ASM_OP
#undef DTORS_SECTION_ASM_OP
#undef LINK_GCC_C_SEQUENCE_SPEC
#define LINK_GCC_C_SEQUENCE_SPEC \
"%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}"
/* Do code reading to identify a signal frame, and set the frame
state data appropriately. See unwind-dw2.c for the structs. */

View File

@ -92,6 +92,10 @@ _start:
! access those data anyway. Instead, go straight to main:
mov %l0, %o0 ! argc
mov %l1, %o1 ! argv
#ifdef GCRT1
setn(___Argv, %o4, %o3)
stn %o1, [%o3] ! *___Argv
#endif
! Skip argc words past argv, to env:
sll %l0, CPTRSHIFT, %o2
add %o2, CPTRSIZE, %o2

View File

@ -8028,6 +8028,10 @@ sparc_v8plus_shift (operands, insn, opcode)
if (which_alternative != 2)
operands[3] = operands[0];
/* We can only shift by constants <= 63. */
if (GET_CODE (operands[2]) == CONST_INT)
operands[2] = GEN_INT (INTVAL (operands[2]) & 0x3f);
if (GET_CODE (operands[1]) == CONST_INT)
{
output_asm_insn ("mov\t%1, %3", operands);

View File

@ -148,8 +148,12 @@
(eq_attr "branch_type" "fcc")
(if_then_else (match_operand 0 "fcc0_reg_operand" "")
(if_then_else (eq_attr "empty_delay_slot" "true")
(const_int 2)
(const_int 1))
(if_then_else (eq (symbol_ref "TARGET_V9") (const_int 0))
(const_int 3)
(const_int 2))
(if_then_else (eq (symbol_ref "TARGET_V9") (const_int 0))
(const_int 2)
(const_int 1)))
(if_then_else (lt (pc) (match_dup 2))
(if_then_else (lt (minus (match_dup 2) (pc)) (const_int 260000))
(if_then_else (eq_attr "empty_delay_slot" "true")
@ -6881,6 +6885,8 @@
{
if (operands[2] == const1_rtx)
return "add\t%1, %1, %0";
if (GET_CODE (operands[2]) == CONST_INT)
operands[2] = GEN_INT (INTVAL (operands[2]) & 0x1f);
return "sll\t%1, %2, %0";
}
[(set (attr "type")
@ -6910,6 +6916,8 @@
{
if (operands[2] == const1_rtx)
return "add\t%1, %1, %0";
if (GET_CODE (operands[2]) == CONST_INT)
operands[2] = GEN_INT (INTVAL (operands[2]) & 0x3f);
return "sllx\t%1, %2, %0";
}
[(set (attr "type")
@ -6969,7 +6977,11 @@
(ashiftrt:SI (match_operand:SI 1 "register_operand" "r")
(match_operand:SI 2 "arith_operand" "rI")))]
""
"sra\t%1, %2, %0"
{
if (GET_CODE (operands[2]) == CONST_INT)
operands[2] = GEN_INT (INTVAL (operands[2]) & 0x1f);
return "sra\t%1, %2, %0";
}
[(set_attr "type" "shift")])
(define_insn "*ashrsi3_extend"
@ -7016,12 +7028,17 @@
}
})
(define_insn ""
(define_insn "*ashrdi3_sp64"
[(set (match_operand:DI 0 "register_operand" "=r")
(ashiftrt:DI (match_operand:DI 1 "register_operand" "r")
(match_operand:SI 2 "arith_operand" "rI")))]
"TARGET_ARCH64"
"srax\t%1, %2, %0"
{
if (GET_CODE (operands[2]) == CONST_INT)
operands[2] = GEN_INT (INTVAL (operands[2]) & 0x3f);
return "srax\t%1, %2, %0";
}
[(set_attr "type" "shift")])
;; XXX
@ -7040,7 +7057,11 @@
(lshiftrt:SI (match_operand:SI 1 "register_operand" "r")
(match_operand:SI 2 "arith_operand" "rI")))]
""
"srl\t%1, %2, %0"
{
if (GET_CODE (operands[2]) == CONST_INT)
operands[2] = GEN_INT (INTVAL (operands[2]) & 0x1f);
return "srl\t%1, %2, %0";
}
[(set_attr "type" "shift")])
;; This handles the case where
@ -7097,12 +7118,16 @@
}
})
(define_insn ""
(define_insn "*lshrdi3_sp64"
[(set (match_operand:DI 0 "register_operand" "=r")
(lshiftrt:DI (match_operand:DI 1 "register_operand" "r")
(match_operand:SI 2 "arith_operand" "rI")))]
"TARGET_ARCH64"
"srlx\t%1, %2, %0"
{
if (GET_CODE (operands[2]) == CONST_INT)
operands[2] = GEN_INT (INTVAL (operands[2]) & 0x3f);
return "srlx\t%1, %2, %0";
}
[(set_attr "type" "shift")])
;; XXX

View File

@ -12,7 +12,7 @@ gt-darwin.h : s-gtype ; @true
# Explain how to build crt2.o
$(T)crt2$(objext): $(srcdir)/config/darwin-crt2.c $(GCC_PASSES) \
$(TCONFIG_H) tsystem.h
$(TCONFIG_H) stmp-int-hdrs tsystem.h
$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) \
-c $(srcdir)/config/darwin-crt2.c -o $(T)crt2$(objext)

View File

@ -0,0 +1 @@
LIB2ADDEH = $(srcdir)/unwind-libunwind.c $(srcdir)/unwind-sjlj.c

View File

@ -797,6 +797,25 @@ objext='.o'
AC_SUBST(manext)
AC_SUBST(objext)
# With Setjmp/Longjmp based exception handling.
AC_ARG_ENABLE(sjlj-exceptions,
[ --enable-sjlj-exceptions
arrange to use setjmp/longjmp exception handling],
[sjlj=`if test $enableval = yes; then echo 1; else echo 0; fi`
AC_DEFINE_UNQUOTED(CONFIG_SJLJ_EXCEPTIONS, $sjlj,
[Define 0/1 to force the choice for exception handling model.])])
AC_CHECK_LIB(unwind, main, use_libunwind_default=yes, use_libunwind_default=no)
# Use libunwind based exception handling.
AC_ARG_ENABLE(libunwind-exceptions,
[ --enable-libunwind-exceptions force use libunwind for exceptions],
use_libunwind_exceptions=$enableval,
use_libunwind_exceptions=$use_libunwind_default)
if test x"$use_libunwind_exceptions" = xyes; then
AC_DEFINE(USE_LIBUNWIND_EXCEPTIONS, 1,
[Define if gcc should use -lunwind.])
fi
target_gtfiles=
build_xm_file=
build_xm_defines=
@ -1641,6 +1660,9 @@ changequote(,)dnl
fi
fi
changequote([,])dnl
else
# non-GNU linkers don't seem to support .hidden yet
gcc_cv_as_hidden=no
fi
fi
if test x"$gcc_cv_as_hidden" = xyes; then
@ -1649,19 +1671,6 @@ if test x"$gcc_cv_as_hidden" = xyes; then
fi
AC_MSG_RESULT($gcc_cv_as_hidden)
libgcc_visibility=$gcc_cv_as_hidden
case "$target" in
mips-sgi-irix6*)
if test x"$gnu_ld_flag" = x"no"; then
# Even if using gas with .hidden support, the resulting object files
# cannot be linked with the IRIX 6 O32 linker. With the N32 and
# N64 linkers, the problem is that the linker refuses to accept
# -call_shared (passed by default to the linker) and -r (used to
# link the object file generated without .hidden directives with
# one that hides symbols), so we also lose.
libgcc_visibility=no
fi
;;
esac
AC_SUBST(libgcc_visibility)
AC_MSG_CHECKING(assembler leb128 support)
@ -2131,6 +2140,21 @@ changequote([,])dnl
fi
AC_MSG_RESULT($gcc_cv_as_instructions)
AC_MSG_CHECKING(cmov syntax)
gcc_cv_as_ix86_cmov_sun_syntax=no
if test x$gcc_cv_as != x; then
echo 'cmovl.l %edx, %eax' > conftest.s
if $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1; then
gcc_cv_as_ix86_cmov_sun_syntax=yes
fi
rm -f conftest.s conftest.o
fi
if test "x$gcc_cv_as_ix86_cmov_sun_syntax" = xyes; then
AC_DEFINE(HAVE_AS_IX86_CMOV_SUN_SYNTAX, 1,
[Define if your assembler supports the Sun syntax for cmov.])
fi
AC_MSG_RESULT($gcc_cv_as_ix86_cmov_sun_syntax)
AC_MSG_CHECKING(assembler GOTOFF in data directives)
gcc_cv_as_gotoff_in_data=no
if test x$gcc_cv_gas_major_version != x -a x$gcc_cv_gas_minor_version != x
@ -2581,24 +2605,6 @@ else
fi
AC_SUBST(MAINT)dnl
# With Setjmp/Longjmp based exception handling.
AC_ARG_ENABLE(sjlj-exceptions,
[ --enable-sjlj-exceptions
arrange to use setjmp/longjmp exception handling],
[sjlj=`if test $enableval = yes; then echo 1; else echo 0; fi`
AC_DEFINE_UNQUOTED(CONFIG_SJLJ_EXCEPTIONS, $sjlj,
[Define 0/1 to force the choice for exception handling model.])])
# Use libunwind based exception handling.
AC_ARG_ENABLE(libunwind-exceptions,
[ --enable-libunwind-exceptions force use libunwind for exceptions],
use_libunwind_exceptions=$enableval,
use_libunwind_exceptions=no)
if test x"$use_libunwind_exceptions" = xyes; then
AC_DEFINE(USE_LIBUNWIND_EXCEPTIONS, 1,
[Define if gcc should use -lunwind.])
fi
# Make empty files to contain the specs and options for each language.
# Then add #include lines to for a compiler that has specs and/or options.

View File

@ -1,6 +1,181 @@
2003-08-04 Release Manager
2003-10-23 Jason Merrill <jason@redhat.com>
* GCC 3.3.1 Released.
PR c++/12726
* tree.c (build_target_expr_with_type): Don't call force_rvalue
for CONSTRUCTORs.
2003-10-16 Release Manager
* GCC 3.3.2 Released.
2003-10-15 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/12369
* decl.c (grokdeclarator): Handle TEMPLATE_ID_EXPR if friend
is a member of other class.
* friend.c (do_friend): Don't build TEMPLATE_DECL if friend
is a specialization of function template.
2003-10-15 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/7939
* typeck.c (comptypes): Don't ICE when its first argument is
error_mark_node.
(compparms): Reverse the arguments of same_type_p.
2003-10-14 Jason Merrill <jason@redhat.com>
PR c++/11878
* tree.c (build_target_expr_with_type): Call force_rvalue for
classes with non-trivial copy ctors.
PR c++/11063
* typeck.c (build_modify_expr): Call convert rather than abort.
2003-10-06 Mark Mitchell <mark@codesourcery.com>
PR c++/10147
* call.c (initialize_reference): Tweak error message.
PR c++/12337
* init.c (build_new_1): Make sure that the expression returned is
not an lvalue.
PR c++/12344, c++/12236, c++/8656
* decl.c (start_function): Do not ignore attributes embedded in a
function declarator.
2003-10-04 Roger Sayle <roger@eyesopen.com>
PR c++/11409
* class.c (resolve_address_of_overloaded_function): When building
list of matching non-template function decls, ignore anticipated
declarations of undeclared or shadowed GCC builtins.
2003-10-02 Mark Mitchell <mark@codesourcery.com>
PR c++/12486
* typeck.c (finish_class_member_access_expr): Issue diagnostic
on erroneous use of qualified name.
2003-07-09 Mark Mitchell <mark@codesourcery.com>
* cp-tree.h (break_out_calls): Remove declaration.
* tree.c (break_out_calls): Remove.
* typeck.c (build_modify_expr): Avoid invalid sharing of trees.
2003-09-18 Mark Mitchell <mark@codesourcery.com>
* class.c (resolve_address_of_overloaded_function): Replace
complain parameter with flags parameter.
(instantiate_type): Adjust accordingly.
2003-09-17 Mark Mitchell <mark@codesourcery.com>
PR c++/11991
* typeck2.c (incomplete_type_diagnostic): Robustify.
PR c++/12266
* cp-tree.h (tsubst_flags_t): Add tf_conv.
* class.c (standard_conversion): Pass tf_conv to
instantiate_type.
(resolve_address_of_overloaded_function): Do not call mark_used
when just checking conversions.
2003-09-14 Mark Mitchell <mark@codesourcery.com>
PR c++/3907
* cp-tree.h (innermost_scope_is_class_p): New function.
* class.c (maybe_note_name_used_in_class): Refine test for whether
or not we are in a class scope.
* decl.c (innermost_scope_is_class_p): Define.
2003-09-14 Mark Mitchell <mark@codesourcery.com>
* class.c (layout_class_type): Make DECL_MODE match TYPE_MODE for
an bit-field whose width exceeds that of its type.
2003-09-09 Steven Bosscher <steven@gcc.gnu.org>
PR c++/11595
* decl.c (define_label): Remove unreachable timevar pop.
Always return the decl, even if the definition is invalid.
2003-09-08 Mark Mitchell <mark@codesourcery.com>
PR c++/11786
* decl2.c (add_function): Do not complain about seeing the same
non-function twice.
2003-09-08 Mark Mitchell <mark@codesourcery.com>
PR c++/5296
* pt.c (try_one_overload): Add addr_p parameter.
(resolve_overloaded_unification): Pass it.
2003-09-07 Jason Merrill <jason@redhat.com>
PR c++/12181
* typeck.c (build_modify_expr): Don't always stabilize the lhs and
rhs. Do stabilize the lhs of a MODIFY_EXPR used on the lhs.
2003-09-06 Mark Mitchell <mark@codesourcery.com>
PR c++/11867
* call.c (standard_conversion): Improve comments.
(perform_direct_initialization): Make sure we return an expression
of the correct type.
* typeck.c (build_static_cast): Check for ambiguity and
accessibility when performing conversions.
2003-09-05 Mark Mitchell <mark@codesourcery.com>
PR c++/12163
* call.c (perform_direct_initialization): Correct logic for
direct-initialization of a class type.
PR c++/12146
* pt.c (lookup_template_function): Robustify.
2003-09-04 Mark Mitchell <mark@codesourcery.com>
Revert this patch:
* class.c (include_empty_classes): Correct logic for ABI version 1.
2003-09-03 Mark Mitchell <mark@codesourcery.com>
PR c++/12053
* class.c (include_empty_classes): Correct logic for ABI version 1.
2003-09-01 Mark Mitchell <mark@codesourcery.com>
PR c++/12114
* cp-tree.h (initialize_reference): Change prototype.
* call.c (initialize_reference): Add cleanup parameter.
* decl.c (grok_reference_init): Likewise.
(check_initializer): Likewise.
(cp_finish_decl): Insert a CLEANUP_STMT if necessary.
(duplicate_decls): When replacing an anticipated builtin, do not
honor TREE_NOTHROW.
* typeck.c (convert_for_initialization): Correct call to
initialize_reference.
2003-08-29 Mark Mitchell <mark@codesourcery.com>
PR c++/11928
* search.c (add_conversions): Avoid adding two conversion
operators for the same type.
2003-08-20 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* cp-tree.h (build_function_call_real): Remove unused parameter.
* typeck.c (build_function_call_real): Likewise. Caller changed.
* decl.c (binding_table_reverse_maybe_remap): Initialize variable.
2003-08-19 Gabriel Dos Reis <gdr@integrable-solutions.net>
PR c++/5293
* call.c (initialize_reference): Improve diagnostic.
2003-08-04 Release Manager

View File

@ -756,7 +756,7 @@ standard_conversion (to, from, expr)
if ((TYPE_PTRFN_P (to) || TYPE_PTRMEMFUNC_P (to))
&& expr && type_unknown_p (expr))
{
expr = instantiate_type (to, expr, tf_none);
expr = instantiate_type (to, expr, tf_conv);
if (expr == error_mark_node)
return NULL_TREE;
from = TREE_TYPE (expr);
@ -857,16 +857,25 @@ standard_conversion (to, from, expr)
}
}
else if (IS_AGGR_TYPE (TREE_TYPE (from))
&& IS_AGGR_TYPE (TREE_TYPE (to)))
&& IS_AGGR_TYPE (TREE_TYPE (to))
/* [conv.ptr]
An rvalue of type "pointer to cv D," where D is a
class type, can be converted to an rvalue of type
"pointer to cv B," where B is a base class (clause
_class.derived_) of D. If B is an inaccessible
(clause _class.access_) or ambiguous
(_class.member.lookup_) base class of D, a program
that necessitates this conversion is ill-formed. */
/* Therefore, we use DERIVED_FROM_P, and not
ACESSIBLY_UNIQUELY_DERIVED_FROM_P, in this test. */
&& DERIVED_FROM_P (TREE_TYPE (to), TREE_TYPE (from)))
{
if (DERIVED_FROM_P (TREE_TYPE (to), TREE_TYPE (from)))
{
from =
cp_build_qualified_type (TREE_TYPE (to),
cp_type_quals (TREE_TYPE (from)));
from = build_pointer_type (from);
conv = build_conv (PTR_CONV, from, conv);
}
from =
cp_build_qualified_type (TREE_TYPE (to),
cp_type_quals (TREE_TYPE (from)));
from = build_pointer_type (from);
conv = build_conv (PTR_CONV, from, conv);
}
if (same_type_p (from, to))
@ -5993,7 +6002,8 @@ perform_implicit_conversion (type, expr)
/* Convert EXPR to TYPE (as a direct-initialization) if that is
permitted. If the conversion is valid, the converted expression is
returned. Otherwise, NULL_TREE is returned. */
returned. Otherwise, NULL_TREE is returned, except in the case
that TYPE is a class type; in that case, an error is issued. */
tree
perform_direct_initialization_if_possible (tree type, tree expr)
@ -6002,6 +6012,22 @@ perform_direct_initialization_if_possible (tree type, tree expr)
if (type == error_mark_node || error_operand_p (expr))
return error_mark_node;
/* [dcl.init]
If the destination type is a (possibly cv-qualified) class type:
-- If the initialization is direct-initialization ...,
constructors are considered. ... If no constructor applies, or
the overload resolution is ambiguous, the initialization is
ill-formed. */
if (CLASS_TYPE_P (type))
{
expr = build_special_member_call (NULL_TREE, complete_ctor_identifier,
build_tree_list (NULL_TREE, expr),
TYPE_BINFO (type),
LOOKUP_NORMAL);
return build_cplus_new (type, expr);
}
conv = implicit_conversion (type, TREE_TYPE (expr), expr,
LOOKUP_NORMAL);
if (!conv || ICS_BAD_FLAG (conv))
@ -6048,18 +6074,23 @@ make_temporary_var_for_ref_to_temp (tree decl, tree type)
return var;
}
/* Convert EXPR to the indicated reference TYPE, in a way suitable for
initializing a variable of that TYPE. If DECL is non-NULL, it is
the VAR_DECL being initialized with the EXPR. (In that case, the
type of DECL will be TYPE.)
/* Convert EXPR to the indicated reference TYPE, in a way suitable
for initializing a variable of that TYPE. If DECL is non-NULL,
it is the VAR_DECL being initialized with the EXPR. (In that
case, the type of DECL will be TYPE.) If DECL is non-NULL, then
CLEANUP must also be non-NULL, and with *CLEANUP initialized to
NULL. Upon return, if *CLEANUP is no longer NULL, it will be a
CLEANUP_STMT that should be inserted after the returned
expression is used to initialize DECL.
Return the converted expression. */
Return the converted expression. */
tree
initialize_reference (type, expr, decl)
initialize_reference (type, expr, decl, cleanup)
tree type;
tree expr;
tree decl;
tree *cleanup;
{
tree conv;
@ -6069,7 +6100,15 @@ initialize_reference (type, expr, decl)
conv = reference_binding (type, TREE_TYPE (expr), expr, LOOKUP_NORMAL);
if (!conv || ICS_BAD_FLAG (conv))
{
error ("could not convert `%E' to `%T'", expr, type);
if (!(TYPE_QUALS (TREE_TYPE (type)) & TYPE_QUAL_CONST)
&& !real_lvalue_p (expr))
error ("invalid initialization of non-const reference of "
"type '%T' from a temporary of type '%T'",
type, TREE_TYPE (expr));
else
error ("invalid initialization of reference of type "
"'%T' from expression of type '%T'", type,
TREE_TYPE (expr));
return error_mark_node;
}
@ -6135,14 +6174,33 @@ initialize_reference (type, expr, decl)
type = TREE_TYPE (expr);
var = make_temporary_var_for_ref_to_temp (decl, type);
layout_decl (var, 0);
/* Create the INIT_EXPR that will initialize the temporary
variable. */
init = build (INIT_EXPR, type, var, expr);
if (at_function_scope_p ())
{
tree cleanup;
add_decl_stmt (var);
cleanup = cxx_maybe_build_cleanup (var);
if (cleanup)
finish_decl_cleanup (var, cleanup);
*cleanup = cxx_maybe_build_cleanup (var);
if (*cleanup)
/* We must be careful to destroy the temporary only
after its initialization has taken place. If the
initialization throws an exception, then the
destructor should not be run. We cannot simply
transform INIT into something like:
(INIT, ({ CLEANUP_STMT; }))
because emit_local_var always treats the
initializer as a full-expression. Thus, the
destructor would run too early; it would run at the
end of initializing the reference variable, rather
than at the end of the block enclosing the
reference variable.
The solution is to pass back a CLEANUP_STMT which
the caller is responsible for attaching to the
statement tree. */
*cleanup = build_stmt (CLEANUP_STMT, var, *cleanup);
}
else
{
@ -6151,7 +6209,6 @@ initialize_reference (type, expr, decl)
static_aggregates = tree_cons (NULL_TREE, var,
static_aggregates);
}
init = build (INIT_EXPR, type, var, expr);
/* Use its address to initialize the reference variable. */
expr = build_address (var);
expr = build (COMPOUND_EXPR, TREE_TYPE (expr), init, expr);

View File

@ -127,8 +127,9 @@ static int field_decl_cmp PARAMS ((const tree *, const tree *));
static int method_name_cmp PARAMS ((const tree *, const tree *));
static void add_implicitly_declared_members PARAMS ((tree, int, int, int));
static tree fixed_type_or_null PARAMS ((tree, int *, int *));
static tree resolve_address_of_overloaded_function PARAMS ((tree, tree, int,
int, int, tree));
static tree resolve_address_of_overloaded_function PARAMS ((tree, tree,
tsubst_flags_t,
int, int, tree));
static tree build_vtable_entry_ref PARAMS ((tree, tree, tree));
static tree build_vtbl_ref_1 PARAMS ((tree, tree));
static tree build_vtbl_initializer PARAMS ((tree, tree, tree, tree, int *));
@ -5042,6 +5043,15 @@ layout_class_type (tree t, tree *virtuals_p)
field to the size of its declared type; the rest of the
field is effectively invisible. */
DECL_SIZE (field) = TYPE_SIZE (type);
/* We must also reset the DECL_MODE of the field. */
if (abi_version_at_least (2))
DECL_MODE (field) = TYPE_MODE (type);
else if (warn_abi
&& DECL_MODE (field) != TYPE_MODE (type))
/* Versions of G++ before G++ 3.4 did not reset the
DECL_MODE. */
warning ("the offset of `%D' may not be ABI-compliant and may "
"change in a future version of GCC", field);
}
else
{
@ -5994,13 +6004,13 @@ pop_lang_context ()
static tree
resolve_address_of_overloaded_function (target_type,
overload,
complain,
flags,
ptrmem,
template_only,
explicit_targs)
tree target_type;
tree overload;
int complain;
tsubst_flags_t flags;
int ptrmem;
int template_only;
tree explicit_targs;
@ -6064,7 +6074,7 @@ resolve_address_of_overloaded_function (target_type,
}
else
{
if (complain)
if (flags & tf_error)
error ("\
cannot resolve overloaded function `%D' based on conversion to type `%T'",
DECL_NAME (OVL_FUNCTION (overload)), target_type);
@ -6093,7 +6103,11 @@ cannot resolve overloaded function `%D' based on conversion to type `%T'",
/* We're looking for a non-static member, and this isn't
one, or vice versa. */
continue;
/* Ignore anticipated decls of undeclared builtins. */
if (DECL_ANTICIPATED (fn))
continue;
/* See if there's a match. */
fntype = TREE_TYPE (fn);
if (is_ptrmem)
@ -6184,7 +6198,7 @@ cannot resolve overloaded function `%D' based on conversion to type `%T'",
if (matches == NULL_TREE)
{
/* There were *no* matches. */
if (complain)
if (flags & tf_error)
{
error ("no matches converting function `%D' to type `%#T'",
DECL_NAME (OVL_FUNCTION (overload)),
@ -6205,7 +6219,7 @@ cannot resolve overloaded function `%D' based on conversion to type `%T'",
{
/* There were too many matches. */
if (complain)
if (flags & tf_error)
{
tree match;
@ -6232,7 +6246,7 @@ cannot resolve overloaded function `%D' based on conversion to type `%T'",
{
static int explained;
if (!complain)
if (!(flags & tf_error))
return error_mark_node;
pedwarn ("assuming pointer to member `%D'", fn);
@ -6242,7 +6256,13 @@ cannot resolve overloaded function `%D' based on conversion to type `%T'",
explained = 1;
}
}
mark_used (fn);
/* If we're doing overload resolution purely for the purpose of
determining conversion sequences, we should not consider the
function used. If this conversion sequence is selected, the
function will be marked as used at this point. */
if (!(flags & tf_conv))
mark_used (fn);
if (TYPE_PTRFN_P (target_type) || TYPE_PTRMEMFUNC_P (target_type))
return build_unary_op (ADDR_EXPR, fn, 0);
@ -6272,6 +6292,7 @@ instantiate_type (lhstype, rhs, flags)
tree lhstype, rhs;
tsubst_flags_t flags;
{
tsubst_flags_t flags_in = flags;
int complain = (flags & tf_error);
int strict = (flags & tf_no_attributes)
? COMPARE_NO_ATTRIBUTES : COMPARE_STRICT;
@ -6362,7 +6383,7 @@ instantiate_type (lhstype, rhs, flags)
return
resolve_address_of_overloaded_function (lhstype,
fns,
complain,
flags_in,
allow_ptrmem,
/*template_only=*/1,
args);
@ -6372,7 +6393,7 @@ instantiate_type (lhstype, rhs, flags)
return
resolve_address_of_overloaded_function (lhstype,
rhs,
complain,
flags_in,
allow_ptrmem,
/*template_only=*/0,
/*explicit_targs=*/NULL_TREE);
@ -6678,7 +6699,7 @@ maybe_note_name_used_in_class (name, decl)
splay_tree names_used;
/* If we're not defining a class, there's nothing to do. */
if (!current_class_type || !TYPE_BEING_DEFINED (current_class_type))
if (!innermost_scope_is_class_p ())
return;
/* If there's already a binding for this NAME, then we don't have

View File

@ -3149,8 +3149,12 @@ typedef enum tsubst_flags_t {
(make_typename_type use) */
tf_ptrmem_ok = 1 << 5, /* pointers to member ok (internal
instantiate_type use) */
tf_parsing = 1 << 6 /* called from parser
tf_parsing = 1 << 6, /* called from parser
(make_typename_type use) */
tf_conv = 1 << 8, /* We are determining what kind of
conversion might be permissible, not
actually performing the
conversion. */
} tsubst_flags_t;
/* The kind of checking we can do looking in a class hierarchy. */
@ -3623,7 +3627,7 @@ extern tree type_passed_as PARAMS ((tree));
extern tree convert_for_arg_passing PARAMS ((tree, tree));
extern tree cp_convert_parm_for_inlining PARAMS ((tree, tree, tree));
extern int is_properly_derived_from PARAMS ((tree, tree));
extern tree initialize_reference PARAMS ((tree, tree, tree));
extern tree initialize_reference PARAMS ((tree, tree, tree, tree *));
extern tree make_temporary_var_for_ref_to_temp (tree, tree);
extern tree strip_top_quals PARAMS ((tree));
extern tree perform_implicit_conversion PARAMS ((tree, tree));
@ -3696,6 +3700,7 @@ extern void adjust_clone_args PARAMS ((tree));
/* decl.c */
extern int global_bindings_p PARAMS ((void));
extern int kept_level_p PARAMS ((void));
extern bool innermost_scope_is_class_p (void);
extern tree getdecls PARAMS ((void));
extern void pushlevel PARAMS ((int));
extern tree poplevel PARAMS ((int,int, int));
@ -4312,7 +4317,6 @@ extern tree build_min PARAMS ((enum tree_code, tree,
extern tree build_min_nt PARAMS ((enum tree_code, ...));
extern tree build_cplus_new PARAMS ((tree, tree));
extern tree get_target_expr PARAMS ((tree));
extern tree break_out_calls PARAMS ((tree));
extern tree build_cplus_method_type PARAMS ((tree, tree, tree));
extern tree build_cplus_staticfn_type PARAMS ((tree, tree, tree));
extern tree build_cplus_array_type PARAMS ((tree, tree));
@ -4405,7 +4409,7 @@ extern tree build_x_indirect_ref PARAMS ((tree, const char *));
extern tree build_indirect_ref PARAMS ((tree, const char *));
extern tree build_array_ref PARAMS ((tree, tree));
extern tree get_member_function_from_ptrfunc PARAMS ((tree *, tree));
extern tree build_function_call_real PARAMS ((tree, tree, int, int));
extern tree build_function_call_real PARAMS ((tree, tree, int));
extern tree build_function_call_maybe PARAMS ((tree, tree));
extern tree convert_arguments PARAMS ((tree, tree, tree, int));
extern tree build_x_binary_op PARAMS ((enum tree_code, tree, tree));

View File

@ -4137,6 +4137,8 @@ add_function (k, fn)
/* We must find only functions, or exactly one non-function. */
if (!k->functions)
k->functions = fn;
else if (fn == k->functions)
;
else if (is_overloaded_fn (k->functions) && is_overloaded_fn (fn))
k->functions = build_overload (fn, k->functions);
else

View File

@ -352,6 +352,8 @@ do_friend (ctype, declarator, decl, parmdecls, attrlist,
if (is_friend_template)
decl = DECL_TI_TEMPLATE (push_template_decl (decl));
else if (DECL_TEMPLATE_INFO (decl))
;
else if (template_class_depth (current_class_type))
decl = push_template_decl_real (decl, /*is_friend=*/1);

View File

@ -2517,6 +2517,10 @@ build_new_1 (exp)
element. */
rval = convert (build_pointer_type (type), rval);
/* A new-expression is never an lvalue. */
if (real_lvalue_p (rval))
rval = build1 (NON_LVALUE_EXPR, TREE_TYPE (rval), rval);
return rval;
}

View File

@ -95,7 +95,7 @@ static void pop_access_scope PARAMS ((tree));
static int resolve_overloaded_unification PARAMS ((tree, tree, tree, tree,
unification_kind_t, int));
static int try_one_overload PARAMS ((tree, tree, tree, tree, tree,
unification_kind_t, int));
unification_kind_t, int, bool));
static int unify PARAMS ((tree, tree, tree, tree, int));
static void add_pending_template PARAMS ((tree));
static void reopen_tinst_level PARAMS ((tree));
@ -3991,7 +3991,8 @@ lookup_template_function (fns, arglist)
if (fns == error_mark_node || arglist == error_mark_node)
return error_mark_node;
if (fns == NULL_TREE)
if (fns == NULL_TREE
|| TREE_CODE (fns) == FUNCTION_DECL)
{
error ("non-template used as template");
return error_mark_node;
@ -8437,9 +8438,15 @@ resolve_overloaded_unification (tparms, targs, parm, arg, strict,
{
tree tempargs = copy_node (targs);
int good = 0;
bool addr_p;
if (TREE_CODE (arg) == ADDR_EXPR)
arg = TREE_OPERAND (arg, 0);
{
arg = TREE_OPERAND (arg, 0);
addr_p = true;
}
else
addr_p = false;
if (TREE_CODE (arg) == COMPONENT_REF)
/* Handle `&x' where `x' is some static or non-static member
@ -8475,10 +8482,8 @@ resolve_overloaded_unification (tparms, targs, parm, arg, strict,
if (subargs)
{
elem = tsubst (TREE_TYPE (fn), subargs, tf_none, NULL_TREE);
if (TREE_CODE (elem) == METHOD_TYPE)
elem = build_ptrmemfunc_type (build_pointer_type (elem));
good += try_one_overload (tparms, targs, tempargs, parm, elem,
strict, sub_strict);
good += try_one_overload (tparms, targs, tempargs, parm,
elem, strict, sub_strict, addr_p);
}
}
}
@ -8486,14 +8491,9 @@ resolve_overloaded_unification (tparms, targs, parm, arg, strict,
|| TREE_CODE (arg) == FUNCTION_DECL)
{
for (; arg; arg = OVL_NEXT (arg))
{
tree type = TREE_TYPE (OVL_CURRENT (arg));
if (TREE_CODE (type) == METHOD_TYPE)
type = build_ptrmemfunc_type (build_pointer_type (type));
good += try_one_overload (tparms, targs, tempargs, parm,
type,
strict, sub_strict);
}
good += try_one_overload (tparms, targs, tempargs, parm,
TREE_TYPE (OVL_CURRENT (arg)),
strict, sub_strict, addr_p);
}
else
abort ();
@ -8522,14 +8522,20 @@ resolve_overloaded_unification (tparms, targs, parm, arg, strict,
/* Subroutine of resolve_overloaded_unification; does deduction for a single
overload. Fills TARGS with any deduced arguments, or error_mark_node if
different overloads deduce different arguments for a given parm.
ADDR_P is true if the expression for which deduction is being
performed was of the form "& fn" rather than simply "fn".
Returns 1 on success. */
static int
try_one_overload (tparms, orig_targs, targs, parm, arg, strict,
sub_strict)
tree tparms, orig_targs, targs, parm, arg;
unification_kind_t strict;
int sub_strict;
try_one_overload (tree tparms,
tree orig_targs,
tree targs,
tree parm,
tree arg,
unification_kind_t strict,
int sub_strict,
bool addr_p)
{
int nargs;
tree tempargs;
@ -8545,6 +8551,11 @@ try_one_overload (tparms, orig_targs, targs, parm, arg, strict,
if (uses_template_parms (arg))
return 1;
if (TREE_CODE (arg) == METHOD_TYPE)
arg = build_ptrmemfunc_type (build_pointer_type (arg));
else if (addr_p)
arg = build_pointer_type (arg);
sub_strict |= maybe_adjust_types_for_deduction (strict, &parm, &arg);
/* We don't copy orig_targs for this because if we have already deduced

View File

@ -2855,8 +2855,27 @@ add_conversions (binfo, data)
/* Make sure we don't already have this conversion. */
if (! IDENTIFIER_MARKED (name))
{
*conversions = tree_cons (binfo, tmp, *conversions);
IDENTIFIER_MARKED (name) = 1;
tree t;
/* Make sure that we do not already have a conversion
operator for this type. Merely checking the NAME is not
enough because two conversion operators to the same type
may not have the same NAME. */
for (t = *conversions; t; t = TREE_CHAIN (t))
{
tree fn;
for (fn = TREE_VALUE (t); fn; fn = OVL_NEXT (fn))
if (same_type_p (TREE_TYPE (name),
DECL_CONV_FN_TYPE (OVL_CURRENT (fn))))
break;
if (fn)
break;
}
if (!t)
{
*conversions = tree_cons (binfo, tmp, *conversions);
IDENTIFIER_MARKED (name) = 1;
}
}
}
return NULL_TREE;

View File

@ -357,6 +357,14 @@ build_target_expr_with_type (init, type)
if (TREE_CODE (init) == TARGET_EXPR)
return init;
else if (CLASS_TYPE_P (type) && !TYPE_HAS_TRIVIAL_INIT_REF (type)
&& TREE_CODE (init) != COND_EXPR
&& TREE_CODE (init) != CONSTRUCTOR)
/* We need to build up a copy constructor call. COND_EXPR is a special
case because we already have copies on the arms and we don't want
another one here. A CONSTRUCTOR is aggregate initialization, which
is handled separately. */
return force_rvalue (init);
slot = build (VAR_DECL, type);
DECL_ARTIFICIAL (slot) = 1;
@ -375,97 +383,6 @@ get_target_expr (init)
{
return build_target_expr_with_type (init, TREE_TYPE (init));
}
/* Recursively perform a preorder search EXP for CALL_EXPRs, making
copies where they are found. Returns a deep copy all nodes transitively
containing CALL_EXPRs. */
tree
break_out_calls (exp)
tree exp;
{
register tree t1, t2 = NULL_TREE;
register enum tree_code code;
register int changed = 0;
register int i;
if (exp == NULL_TREE)
return exp;
code = TREE_CODE (exp);
if (code == CALL_EXPR)
return copy_node (exp);
/* Don't try and defeat a save_expr, as it should only be done once. */
if (code == SAVE_EXPR)
return exp;
switch (TREE_CODE_CLASS (code))
{
default:
abort ();
case 'c': /* a constant */
case 't': /* a type node */
case 'x': /* something random, like an identifier or an ERROR_MARK. */
return exp;
case 'd': /* A decl node */
#if 0 /* This is bogus. jason 9/21/94 */
t1 = break_out_calls (DECL_INITIAL (exp));
if (t1 != DECL_INITIAL (exp))
{
exp = copy_node (exp);
DECL_INITIAL (exp) = t1;
}
#endif
return exp;
case 'b': /* A block node */
{
/* Don't know how to handle these correctly yet. Must do a
break_out_calls on all DECL_INITIAL values for local variables,
and also break_out_calls on all sub-blocks and sub-statements. */
abort ();
}
return exp;
case 'e': /* an expression */
case 'r': /* a reference */
case 's': /* an expression with side effects */
for (i = TREE_CODE_LENGTH (code) - 1; i >= 0; i--)
{
t1 = break_out_calls (TREE_OPERAND (exp, i));
if (t1 != TREE_OPERAND (exp, i))
{
exp = copy_node (exp);
TREE_OPERAND (exp, i) = t1;
}
}
return exp;
case '<': /* a comparison expression */
case '2': /* a binary arithmetic expression */
t2 = break_out_calls (TREE_OPERAND (exp, 1));
if (t2 != TREE_OPERAND (exp, 1))
changed = 1;
case '1': /* a unary arithmetic expression */
t1 = break_out_calls (TREE_OPERAND (exp, 0));
if (t1 != TREE_OPERAND (exp, 0))
changed = 1;
if (changed)
{
if (TREE_CODE_LENGTH (code) == 1)
return build1 (code, TREE_TYPE (exp), t1);
else
return build (code, TREE_TYPE (exp), t1, t2);
}
return exp;
}
}
/* Construct, lay out and return the type of methods belonging to class
BASETYPE and whose arguments are described by ARGTYPES and whose values

View File

@ -909,10 +909,8 @@ comptypes (t1, t2, strict)
if (t1 == t2)
return 1;
/* This should never happen. */
my_friendly_assert (t1 != error_mark_node, 307);
if (t2 == error_mark_node)
/* Suppress errors caused by previously reported errors */
if (t1 == error_mark_node || t2 == error_mark_node)
return 0;
/* If either type is the internal version of sizetype, return the
@ -1405,7 +1403,7 @@ compparms (parms1, parms2)
they fail to match. */
if (t1 == 0 || t2 == 0)
return 0;
if (!same_type_p (TREE_VALUE (t2), TREE_VALUE (t1)))
if (!same_type_p (TREE_VALUE (t1), TREE_VALUE (t2)))
return 0;
t1 = TREE_CHAIN (t1);
@ -2174,8 +2172,13 @@ finish_class_member_access_expr (tree object, tree name)
/* Find the base of OBJECT_TYPE corresponding to SCOPE. */
access_path = lookup_base (object_type, scope, ba_check, NULL);
if (!access_path || access_path == error_mark_node)
if (access_path == error_mark_node)
return error_mark_node;
if (!access_path)
{
error ("`%T' is not a base of `%T'", scope, object_type);
return error_mark_node;
}
/* Look up the member. */
member = lookup_member (access_path, name, /*protect=*/1,
@ -2641,9 +2644,9 @@ get_member_function_from_ptrfunc (instance_ptrptr, function)
}
tree
build_function_call_real (function, params, require_complete, flags)
build_function_call_real (function, params, flags)
tree function, params;
int require_complete, flags;
int flags;
{
register tree fntype, fndecl;
register tree coerced_params;
@ -2757,7 +2760,7 @@ tree
build_function_call (function, params)
tree function, params;
{
return build_function_call_real (function, params, 1, LOOKUP_NORMAL);
return build_function_call_real (function, params, LOOKUP_NORMAL);
}
/* Convert the actual parameter expressions in the list VALUES
@ -4739,12 +4742,13 @@ build_static_cast (type, expr)
(TREE_TYPE (type))))
&& at_least_as_qualified_p (TREE_TYPE (type), intype))
{
/* At this point we have checked all of the conditions except
that B is not a virtual base class of D. That will be
checked by build_base_path. */
tree base = lookup_base (TREE_TYPE (type), intype, ba_any, NULL);
/* There is a standard conversion from "D*" to "B*" even if "B"
is ambiguous or inaccessible. Therefore, we ask lookup_base
to check these conditions. */
tree base = lookup_base (TREE_TYPE (type), intype, ba_check, NULL);
/* Convert from B* to D*. */
/* Convert from "B*" to "D*". This function will check that "B"
is not a virtual base of "D". */
expr = build_base_path (MINUS_EXPR, build_address (expr),
base, /*nonnull=*/false);
/* Convert the pointer to a reference -- but then remember that
@ -4803,7 +4807,7 @@ build_static_cast (type, expr)
check_for_casting_away_constness (intype, type);
base = lookup_base (TREE_TYPE (type), TREE_TYPE (intype),
ba_check | ba_quiet, NULL);
ba_check, NULL);
return build_base_path (MINUS_EXPR, expr, base, /*nonnull=*/false);
}
if ((TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype))
@ -5237,6 +5241,10 @@ build_modify_expr (lhs, modifycode, rhs)
TREE_OPERAND (lhs, 0), newrhs);
case MODIFY_EXPR:
if (TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 0)))
lhs = build (TREE_CODE (lhs), TREE_TYPE (lhs),
stabilize_reference (TREE_OPERAND (lhs, 0)),
TREE_OPERAND (lhs, 1));
newrhs = build_modify_expr (TREE_OPERAND (lhs, 0), modifycode, rhs);
if (newrhs == error_mark_node)
return error_mark_node;
@ -5288,8 +5296,9 @@ build_modify_expr (lhs, modifycode, rhs)
{
if (TREE_CODE (rhs) == CONSTRUCTOR)
{
my_friendly_assert (same_type_p (TREE_TYPE (rhs), lhstype),
20011220);
if (! same_type_p (TREE_TYPE (rhs), lhstype))
/* Call convert to generate an error; see PR 11063. */
rhs = convert (lhstype, rhs);
result = build (INIT_EXPR, lhstype, lhs, rhs);
TREE_SIDE_EFFECTS (result) = 1;
return result;
@ -5442,14 +5451,6 @@ build_modify_expr (lhs, modifycode, rhs)
}
}
if (TREE_CODE (lhstype) != REFERENCE_TYPE)
{
if (TREE_SIDE_EFFECTS (lhs))
lhs = stabilize_reference (lhs);
if (TREE_SIDE_EFFECTS (newrhs))
newrhs = stabilize_reference (newrhs);
}
/* Convert new value to destination type. */
if (TREE_CODE (lhstype) == ARRAY_TYPE)
@ -5505,44 +5506,8 @@ build_modify_expr (lhs, modifycode, rhs)
if (newrhs == error_mark_node)
return error_mark_node;
if (TREE_CODE (newrhs) == COND_EXPR)
{
tree lhs1;
tree cond = TREE_OPERAND (newrhs, 0);
if (TREE_SIDE_EFFECTS (lhs))
cond = build_compound_expr (tree_cons
(NULL_TREE, lhs,
build_tree_list (NULL_TREE, cond)));
/* Cannot have two identical lhs on this one tree (result) as preexpand
calls will rip them out and fill in RTL for them, but when the
rtl is generated, the calls will only be in the first side of the
condition, not on both, or before the conditional jump! (mrs) */
lhs1 = break_out_calls (lhs);
if (lhs == lhs1)
/* If there's no change, the COND_EXPR behaves like any other rhs. */
result = build (modifycode == NOP_EXPR ? MODIFY_EXPR : INIT_EXPR,
lhstype, lhs, newrhs);
else
{
tree result_type = TREE_TYPE (newrhs);
/* We have to convert each arm to the proper type because the
types may have been munged by constant folding. */
result
= build (COND_EXPR, result_type, cond,
build_modify_expr (lhs, modifycode,
cp_convert (result_type,
TREE_OPERAND (newrhs, 1))),
build_modify_expr (lhs1, modifycode,
cp_convert (result_type,
TREE_OPERAND (newrhs, 2))));
}
}
else
result = build (modifycode == NOP_EXPR ? MODIFY_EXPR : INIT_EXPR,
lhstype, lhs, newrhs);
result = build (modifycode == NOP_EXPR ? MODIFY_EXPR : INIT_EXPR,
lhstype, lhs, newrhs);
TREE_SIDE_EFFECTS (result) = 1;
@ -6100,7 +6065,8 @@ convert_for_initialization (exp, type, rhs, flags, errtype, fndecl, parmnum)
if (fndecl)
savew = warningcount, savee = errorcount;
rhs = initialize_reference (type, rhs, /*decl=*/NULL_TREE);
rhs = initialize_reference (type, rhs, /*decl=*/NULL_TREE,
/*cleanup=*/NULL);
if (fndecl)
{
if (warningcount > savew)

View File

@ -279,7 +279,8 @@ cxx_incomplete_type_diagnostic (value, type, diag_type)
break;
default:
abort ();
(*p_msg) ("invalid use of incomplete type");
break;
}
}

View File

@ -1,6 +1,6 @@
/* CPP Library. (Directive handling.)
Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002 Free Software Foundation, Inc.
1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
Contributed by Per Bothner, 1994-95.
Based on CCCP program by Paul Rubin, June 1986
Adapted to ANSI C, Richard Stallman, Jan 1987
@ -1094,7 +1094,7 @@ do_pragma (pfile)
cpp_reader *pfile;
{
const struct pragma_entry *p = NULL;
const cpp_token *token;
const cpp_token *token, *pragma_token = pfile->cur_token;
unsigned int count = 1;
pfile->state.prevent_expansion++;
@ -1114,16 +1114,18 @@ do_pragma (pfile)
}
}
/* FIXME. This is an awful kludge to get the front ends to update
their notion of line number for diagnostic purposes. The line
number should be passed to the handler and they should do it
themselves. Stand-alone CPP must ignore us, otherwise it will
prefix the directive with spaces, hence the 1. Ugh. */
if (pfile->cb.line_change)
(*pfile->cb.line_change)(pfile, token, 1);
if (p)
(*p->u.handler) (pfile);
{
/* Since the handler below doesn't get the line number, that it
might need for diagnostics, make sure it has the right
numbers in place. */
if (pfile->cb.line_change)
(*pfile->cb.line_change) (pfile, pragma_token, false);
(*p->u.handler) (pfile);
if (pfile->cb.line_change)
(*pfile->cb.line_change) (pfile, pfile->cur_token, false);
}
else if (pfile->cb.def_pragma)
{
_cpp_backup_tokens (pfile, count);

View File

@ -1,5 +1,5 @@
/* Preprocess only, using cpplib.
Copyright (C) 1995, 1997, 1998, 1999, 2000, 2001, 2002
Copyright (C) 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003
Free Software Foundation, Inc.
Written by Per Bothner, 1994-95.

View File

@ -6844,7 +6844,15 @@ cse_set_around_loop (x, insn, loop_start)
abort ();
}
else
emit_insn_after (move, p);
{
if (control_flow_insn_p (p))
/* p can cause a control flow transfer so it
is the last insn of a basic block. We can't
therefore use emit_insn_after. */
emit_insn_before (move, next_nonnote_insn (p));
else
emit_insn_after (move, p);
}
}
break;
}

View File

@ -31,6 +31,9 @@ the Intel 80387 register stack.
@item
Alasdair Baird for various bug fixes.
@item
Giovanni Bajo for analyzing lots of complicated C++ problem reports.
@item
Gerald Baumgartner added the signature extension to the C++ front end.
@ -296,6 +299,9 @@ Michael Hayes for various thankless work he's done trying to get
the c30/c40 ports functional. Lots of loop and unroll improvements and
fixes.
@item
Dara Hazeghi for wading through myriads of target-specific bug reports.
@item
Kate Hedstrom for staking the g77 folks with an initial testsuite.
@ -326,6 +332,9 @@ Steve Holmgren for MachTen patches.
@item
Jan Hubicka for his x86 port improvements.
@item
Falk Hueffner for working on C and optimization bug reports.
@item
Christian Iseli for various bug fixes.
@ -619,6 +628,9 @@ Gerald Pfeifer for his direction via the steering committee, pointing
out lots of problems we need to solve, maintenance of the web pages, and
taking care of documentation maintenance in general.
@item
Andrew Pinski for processing bug reports by the dozen.
@item
Ovidiu Predescu for his work on the Objective-C front end and runtime
libraries.

View File

@ -2554,7 +2554,7 @@ Currently, the attribute is ignored for inlined functions. If the
attribute is applied to a symbol @emph{definition}, an error is reported.
If a symbol previously declared @code{dllimport} is later defined, the
attribute is ignored in subsequent references, and a warning is emitted.
The attribute is also overriden by a subsequent declaration as
The attribute is also overridden by a subsequent declaration as
@code{dllexport}.
When applied to C++ classes, the attribute marks non-inlined
@ -2636,7 +2636,7 @@ found convenient to use @code{__attribute__} to achieve a natural
attachment of attributes to their corresponding declarations, whereas
@code{#pragma GCC} is of use for constructs that do not naturally form
part of the grammar. @xref{Other Directives,,Miscellaneous
Preprocessing Directives, cpp, The C Preprocessor}.
Preprocessing Directives, cpp, The GNU C Preprocessor}.
@node Attribute Syntax
@section Attribute Syntax
@ -3666,7 +3666,7 @@ the single copy in the library.
Since GCC eventually will implement ISO C99 semantics for
inline functions, it is best to use @code{static inline} only
to guarentee compatibility. (The
to guarantee compatibility. (The
existing semantics will remain available when @option{-std=gnu89} is
specified, but eventually the default will be @option{-std=gnu99} and
that will implement the C99 semantics, though it does not do so yet.)
@ -5315,6 +5315,31 @@ Generates the @code{movhps} machine instruction as a store to memory.
Generates the @code{movlps} machine instruction as a store to memory.
@end table
The following built-in functions are available when @option{-mpni} is used.
All of them generate the machine instruction that is part of the name.
@example
v2df __builtin_ia32_addsubpd (v2df, v2df)
v2df __builtin_ia32_addsubps (v2df, v2df)
v2df __builtin_ia32_haddpd (v2df, v2df)
v2df __builtin_ia32_haddps (v2df, v2df)
v2df __builtin_ia32_hsubpd (v2df, v2df)
v2df __builtin_ia32_hsubps (v2df, v2df)
v16qi __builtin_ia32_lddqu (char const *)
void __builtin_ia32_monitor (void *, unsigned int, unsigned int)
v2df __builtin_ia32_movddup (v2df)
v4sf __builtin_ia32_movshdup (v4sf)
v4sf __builtin_ia32_movsldup (v4sf)
void __builtin_ia32_mwait (unsigned int, unsigned int)
@end example
The following built-in functions are available when @option{-mpni} is used.
@table @code
@item v2df __builtin_ia32_loadddup (double const *)
Generates the @code{movddup} machine instruction as a load from memory.
@end table
The following built-in functions are available when @option{-m3dnow} is used.
All of them generate the machine instruction that is part of the name.
@ -6895,8 +6920,8 @@ can also use most of the C language extensions in your C++ programs). If you
want to write code that checks whether these features are available, you can
test for the GNU compiler the same way as for C programs: check for a
predefined macro @code{__GNUC__}. You can also use @code{__GNUG__} to
test specifically for GNU C++ (@pxref{Standard Predefined,,Standard
Predefined Macros,cpp.info,The C Preprocessor}).
test specifically for GNU C++ (@pxref{Common Predefined Macros,,
Predefined Macros,cpp,The GNU C Preprocessor}).
@menu
* Min and Max:: C++ Minimum and maximum operators.

View File

@ -4,7 +4,7 @@
@c Common values used in the GCC manuals:
@set version-GCC 3.3.1
@set version-GCC 3.3.3
@c DEVELOPMENT is set to indicate an in-development version,
@c as compared to a release version. When making a release

View File

@ -473,7 +473,7 @@ in the following sections.
-mno-fp-ret-in-387 -msoft-float -msvr3-shlib @gol
-mno-wide-multiply -mrtd -malign-double @gol
-mpreferred-stack-boundary=@var{num} @gol
-mmmx -msse -msse2 -m3dnow @gol
-mmmx -msse -msse2 -mpni -m3dnow @gol
-mthreads -mno-align-stringops -minline-all-stringops @gol
-mpush-args -maccumulate-outgoing-args -m128bit-long-double @gol
-m96bit-long-double -mregparm=@var{num} -momit-leaf-frame-pointer @gol
@ -7904,6 +7904,13 @@ code that expects temporaries to be 80bit.
This is the default choice for x86-64 compiler.
@item pni
Use all SSE extensions enabled by @option{-msse2} as well as the new
SSE extensions in Prescott New Intrunctions. @option{-mpni} also
enables 2 builtin functions, @code{__builtin_ia32_monitor} and
@code{__builtin_ia32_mwait}, for new intrunctions @code{monitor} and
@code{mwait}.
@item sse,387
Attempt to utilize both instruction sets at once. This effectively double the
amount of available registers and on chips with separate execution units for
@ -8085,6 +8092,8 @@ preferred alignment to @option{-mpreferred-stack-boundary=2}.
@itemx -mno-sse
@item -msse2
@itemx -mno-sse2
@item -mpni
@itemx -mno-pni
@item -m3dnow
@itemx -mno-3dnow
@opindex mmmx

View File

@ -6589,6 +6589,22 @@ usual manner as a label (by means of @code{ASM_OUTPUT_LABEL}).
You may wish to use @code{ASM_OUTPUT_TYPE_DIRECTIVE} and/or
@code{ASM_OUTPUT_SIZE_DIRECTIVE} in the definition of this macro.
@findex ASM_DECLARE_CONSTANT_NAME
@item ASM_DECLARE_CONSTANT_NAME (@var{stream}, @var{name}, @var{exp}, @var{size})
A C statement (sans semicolon) to output to the stdio stream
@var{stream} any text necessary for declaring the name @var{name} of a
constant which is being defined. This macro is responsible for
outputting the label definition (perhaps using
@code{ASM_OUTPUT_LABEL}). The argument @var{exp} is the
value of the constant, and @var{size} is the size of the constant
in bytes. @var{name} will be an internal label.
If this macro is not defined, then the @var{name} is defined in the
usual manner as a label (by means of @code{ASM_OUTPUT_LABEL}).
You may wish to use @code{ASM_OUTPUT_TYPE_DIRECTIVE} in the definition
of this macro.
@findex ASM_DECLARE_REGISTER_GLOBAL
@item ASM_DECLARE_REGISTER_GLOBAL (@var{stream}, @var{decl}, @var{regno}, @var{name})
A C statement (sans semicolon) to output to the stdio stream

View File

@ -432,6 +432,15 @@ expand_builtin_init_dwarf_reg_sizes (address)
emit_move_insn (adjust_address (mem, mode, offset), GEN_INT (size));
}
#ifdef DWARF_ALT_FRAME_RETURN_COLUMN
{
enum machine_mode save_mode = Pmode;
HOST_WIDE_INT offset = DWARF_ALT_FRAME_RETURN_COLUMN * GET_MODE_SIZE (mode);
HOST_WIDE_INT size = GET_MODE_SIZE (save_mode);
emit_move_insn (adjust_address (mem, mode, offset), GEN_INT (size));
}
#endif
}
/* Convert a DWARF call frame info. operation to its string name */
@ -11051,16 +11060,20 @@ gen_inlined_subroutine_die (stmt, context_die, depth)
dw_die_ref context_die;
int depth;
{
tree decl = block_ultimate_origin (stmt);
/* Emit info for the abstract instance first, if we haven't yet. We
must emit this even if the block is abstract, otherwise when we
emit the block below (or elsewhere), we may end up trying to emit
a die whose origin die hasn't been emitted, and crashing. */
dwarf2out_abstract_function (decl);
if (! BLOCK_ABSTRACT (stmt))
{
dw_die_ref subr_die
= new_die (DW_TAG_inlined_subroutine, context_die, stmt);
tree decl = block_ultimate_origin (stmt);
char label[MAX_ARTIFICIAL_LABEL_BYTES];
/* Emit info for the abstract instance first, if we haven't yet. */
dwarf2out_abstract_function (decl);
add_abstract_origin_attribute (subr_die, decl);
ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_BEGIN_LABEL,
BLOCK_NUMBER (stmt));

View File

@ -1425,6 +1425,15 @@ convert_modes (mode, oldmode, x, unsignedp)
return gen_lowpart (mode, x);
}
/* Converting from integer constant into mode is always equivalent to an
subreg operation. */
if (VECTOR_MODE_P (mode) && GET_MODE (x) == VOIDmode)
{
if (GET_MODE_BITSIZE (mode) != GET_MODE_BITSIZE (oldmode))
abort ();
return simplify_gen_subreg (mode, x, oldmode, 0);
}
temp = gen_reg_rtx (mode);
convert_move (temp, x, unsignedp);
return temp;

View File

@ -1,3 +1,7 @@
2003-10-16 Release Manager
* GCC 3.3.2 Released.
2003-08-04 Release Manager
* GCC 3.3.1 Released.

View File

@ -190,3 +190,7 @@ GCC_3.3.1 {
__gcc_personality_sj0
__gcc_personality_v0
}
%inherit GCC_3.3.2 GCC_3.3.1
GCC_3.3.2 {
}

View File

@ -6275,7 +6275,7 @@ basic_induction_var (loop, x, mode, dest_reg, p, inc_val, mult_val, location)
{
enum rtx_code code;
rtx *argp, arg;
rtx insn, set = 0;
rtx insn, set = 0, last, inc;
code = GET_CODE (x);
*location = NULL;
@ -6303,7 +6303,26 @@ basic_induction_var (loop, x, mode, dest_reg, p, inc_val, mult_val, location)
if (loop_invariant_p (loop, arg) != 1)
return 0;
*inc_val = convert_modes (GET_MODE (dest_reg), GET_MODE (x), arg, 0);
/* convert_modes can emit new instructions, e.g. when arg is a loop
invariant MEM and dest_reg has a different mode.
These instructions would be emitted after the end of the function
and then *inc_val would be an unitialized pseudo.
Detect this and bail in this case.
Other alternatives to solve this can be introducing a convert_modes
variant which is allowed to fail but not allowed to emit new
instructions, emit these instructions before loop start and let
it be garbage collected if *inc_val is never used or saving the
*inc_val initialization sequence generated here and when *inc_val
is going to be actually used, emit it at some suitable place. */
last = get_last_insn ();
inc = convert_modes (GET_MODE (dest_reg), GET_MODE (x), arg, 0);
if (get_last_insn () != last)
{
delete_insns_since (last);
return 0;
}
*inc_val = inc;
*mult_val = const1_rtx;
*location = argp;
return 1;
@ -6384,7 +6403,15 @@ basic_induction_var (loop, x, mode, dest_reg, p, inc_val, mult_val, location)
&& GET_MODE_CLASS (mode) != MODE_CC)
{
/* Possible bug here? Perhaps we don't know the mode of X. */
*inc_val = convert_modes (GET_MODE (dest_reg), mode, x, 0);
last = get_last_insn ();
inc = convert_modes (GET_MODE (dest_reg), mode, x, 0);
if (get_last_insn () != last)
{
delete_insns_since (last);
return 0;
}
*inc_val = inc;
*mult_val = const0_rtx;
return 1;
}

View File

@ -143,9 +143,12 @@ struct induction
based on the same biv. For bivs, links
together all biv entries that refer to the
same biv register. */
struct induction *same; /* If this giv has been combined with another
giv, this points to the base giv. The base
giv will have COMBINED_WITH nonzero. */
struct induction *same; /* For givs, if the giv has been combined with
another giv, this points to the base giv.
The base giv will have COMBINED_WITH nonzero.
For bivs, if the biv has the same LOCATION
than another biv, this points to the base
biv. */
HOST_WIDE_INT const_adjust; /* Used by loop unrolling, when an address giv
is split, and a constant is eliminated from
the address, the -constant is stored here

View File

@ -308,8 +308,14 @@ for ml in $MULTILIBS; do
done
fi
# Each of these .a files depends on stmp-dirs. It would seem that
# this dependency is redundant, since each of the object files
# itself depends on stmp-dirs. However, it is possible that there
# are in fact no object files. In that case, the stmp-dirs
# dependency is required; the directory containing the archive must
# exist before the archive itself can be created.
echo ""
echo "${dir}/libgcc.a: $libgcc_a_objs"
echo "${dir}/libgcc.a: stmp-dirs $libgcc_a_objs"
echo " -rm -rf ${dir}/libgcc.a"
echo ' $(AR_CREATE_FOR_TARGET)' ${dir}/libgcc.a $libgcc_a_objs
echo ' if $(RANLIB_TEST_FOR_TARGET) ; then' \\
@ -319,7 +325,7 @@ for ml in $MULTILIBS; do
if [ "$SHLIB_LINK" ]; then
echo ""
echo "${dir}/libgcc_eh.a: $libgcc_eh_objs"
echo "${dir}/libgcc_eh.a: stmp-dirs $libgcc_eh_objs"
echo " -rm -rf ${dir}/libgcc_eh.a"
echo ' $(AR_CREATE_FOR_TARGET)' ${dir}/libgcc_eh.a $libgcc_eh_objs
echo ' if $(RANLIB_TEST_FOR_TARGET) ; then' \\

View File

@ -95,22 +95,28 @@ function output(lib) {
if (inherit[lib])
output(inherit[lib]);
printf("%s {\n", lib);
sawglobal = 0;
empty=1
for (sym in ver)
if ((ver[sym] == lib) && (sym in def))
{
if (!sawglobal)
if (empty)
{
printf("%s {\n", lib);
printf(" global:\n");
sawglobal = 1;
empty = 0;
}
printf("\t%s;\n", sym);
if (dotsyms)
printf("\t.%s;\n", sym);
}
if (inherit[lib])
if (empty)
{
for (l in libs)
if (inherit[l] == lib)
inherit[l] = inherit[lib];
}
else if (inherit[lib])
printf("} %s;\n", inherit[lib]);
else
printf ("\n local:\n\t*;\n};\n");

View File

@ -2612,9 +2612,10 @@ encode_ieee_single (fmt, buf, r)
const REAL_VALUE_TYPE *r;
{
unsigned long image, sig, exp;
unsigned long sign = r->sign;
bool denormal = (r->sig[SIGSZ-1] & SIG_MSB) == 0;
image = r->sign << 31;
image = sign << 31;
sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0x7fffff;
switch (r->class)

View File

@ -2616,11 +2616,12 @@ convert_regs_1 (file, block)
{
struct stack_def regstack;
block_info bi = BLOCK_INFO (block);
int inserted, reg;
int deleted, inserted, reg;
rtx insn, next;
edge e, beste = NULL;
inserted = 0;
deleted = 0;
any_malformed_asm = false;
/* Find the edge we will copy stack from. It should be the most frequent
@ -2652,10 +2653,24 @@ convert_regs_1 (file, block)
beste = e;
}
/* Entry block does have stack already initialized. */
/* Initialize stack at block entry. */
if (bi->stack_in.top == -2)
inserted |= compensate_edge (beste, file);
{
if (beste)
inserted |= compensate_edge (beste, file);
else
{
/* No predecessors. Create an arbitrary input stack. */
int reg;
bi->stack_in.top = -1;
for (reg = LAST_STACK_REG; reg >= FIRST_STACK_REG; --reg)
if (TEST_HARD_REG_BIT (bi->stack_in.reg_set, reg))
bi->stack_in.reg[++bi->stack_in.top] = reg;
}
}
else
/* Entry blocks do have stack already initialized. */
beste = NULL;
current_block = block;
@ -2693,6 +2708,7 @@ convert_regs_1 (file, block)
print_stack (file, &regstack);
}
subst_stack_regs (insn, &regstack);
deleted |= (GET_CODE (insn) == NOTE || INSN_DELETED_P (insn));
}
}
while (next);
@ -2732,8 +2748,23 @@ convert_regs_1 (file, block)
nan);
insn = emit_insn_after (set, insn);
subst_stack_regs (insn, &regstack);
deleted |= (GET_CODE (insn) == NOTE || INSN_DELETED_P (insn));
}
}
/* Amongst the insns possibly deleted during the substitution process above,
might have been the only trapping insn in the block. We purge the now
possibly dead EH edges here to avoid an ICE from fixup_abnormal_edges,
called at the end of convert_regs. The order in which we process the
blocks ensures that we never delete an already processed edge.
??? We are normally supposed not to delete trapping insns, so we pretend
that the insns deleted above don't actually trap. It would have been
better to detect this earlier and avoid creating the EH edge in the first
place, still, but we don't have enough information at that time. */
if (deleted)
purge_dead_edges (block);
/* Something failed if the stack lives don't match. If we had malformed
asms, we zapped the instruction itself, but that didn't produce the
@ -2780,6 +2811,10 @@ convert_regs_2 (file, block)
basic_block *stack, *sp;
int inserted;
/* We process the blocks in a top-down manner, in a way such that one block
is only processed after all its predecessors. The number of predecessors
of every block has already been computed. */
stack = (basic_block *) xmalloc (sizeof (*stack) * n_basic_blocks);
sp = stack;
@ -2791,8 +2826,19 @@ convert_regs_2 (file, block)
edge e;
block = *--sp;
inserted |= convert_regs_1 (file, block);
BLOCK_INFO (block)->done = 1;
/* Processing BLOCK is achieved by convert_regs_1, which may purge
some dead EH outgoing edge after the deletion of the trapping
insn inside the block. Since the number of predecessors of
BLOCK's successors was computed based on the initial edge set,
we check the necessity to process some of these successors
before such an edge deletion may happen. However, there is
a pitfall: if BLOCK is the only predecessor of a successor and
the edge between them happens to be deleted, the successor
becomes unreachable and should not be processed. The problem
is that there is no way to preventively detect this case so we
stack the successor in all cases and hand over the task of
fixing up the discrepancy to convert_regs_1. */
for (e = block->succ; e ; e = e->succ_next)
if (! (e->flags & EDGE_DFS_BACK))
@ -2801,6 +2847,9 @@ convert_regs_2 (file, block)
if (!BLOCK_INFO (e->dest)->predecessors)
*sp++ = e->dest;
}
inserted |= convert_regs_1 (file, block);
BLOCK_INFO (block)->done = 1;
}
while (sp != stack);
@ -2841,17 +2890,7 @@ convert_regs (file)
block_info bi = BLOCK_INFO (b);
if (! bi->done)
{
int reg;
/* Create an arbitrary input stack. */
bi->stack_in.top = -1;
for (reg = LAST_STACK_REG; reg >= FIRST_STACK_REG; --reg)
if (TEST_HARD_REG_BIT (bi->stack_in.reg_set, reg))
bi->stack_in.reg[++bi->stack_in.top] = reg;
inserted |= convert_regs_2 (file, b);
}
inserted |= convert_regs_2 (file, b);
}
clear_aux_for_blocks ();

View File

@ -236,6 +236,12 @@ stop_search_p (insn, labels_p)
if (insn == 0)
return 1;
/* If the insn can throw an exception that is caught within the function,
it may effectively perform a jump from the viewpoint of the function.
Therefore act like for a jump. */
if (can_throw_internal (insn))
return 1;
switch (GET_CODE (insn))
{
case NOTE:

View File

@ -32,7 +32,9 @@ int brace_nesting = 0;
indicate the (brace nesting levels of) left braces that were
prefixed by extern "C". */
int extern_C_braces_length = 0;
char extern_C_braces[20];
/* 20 is not enough anymore on Solaris 9. */
#define MAX_EXTERN_C_BRACES 200
char extern_C_braces[MAX_EXTERN_C_BRACES];
#define in_extern_C_brace (extern_C_braces_length>0)
/* True if the function declaration currently being scanned is
@ -222,6 +224,12 @@ scan_decls (pfile, argc, argv)
brace_nesting++;
extern_C_braces[extern_C_braces_length++]
= brace_nesting;
if (extern_C_braces_length >= MAX_EXTERN_C_BRACES)
{
fprintf (stderr,
"Internal error: out-of-bounds index\n");
exit (FATAL_EXIT_CODE);
}
goto new_statement;
}
}

View File

@ -1735,8 +1735,8 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
}
else
{
warning ("use of memory input without lvalue in "
"asm operand %d is deprecated", i + noutputs);
warning ("use of memory input without lvalue in asm operand %d is deprecated",
i + noutputs);
if (CONSTANT_P (op))
{

View File

@ -711,6 +711,9 @@ update_alignment_for_field (rli, field, known_align)
desired_align = DECL_ALIGN (field);
user_align = DECL_USER_ALIGN (field);
}
else if (!DECL_BIT_FIELD_TYPE (field))
/* Even packed non-bit-fields get byte alignment. */
desired_align = MAX (desired_align, BITS_PER_UNIT);
/* Some targets (i.e. i386, VMS) limit struct field alignment
to a lower boundary than alignment of variables unless

View File

@ -465,8 +465,8 @@ recompile_files ()
{
file *f;
putenv (xstrdup ("COMPILER_PATH"));
putenv (xstrdup ("LIBRARY_PATH"));
putenv (xstrdup ("COMPILER_PATH="));
putenv (xstrdup ("LIBRARY_PATH="));
while ((f = file_pop ()) != NULL)
{

View File

@ -4351,7 +4351,7 @@ const char *flag_random_seed;
/* Set up a default flag_random_seed value, if there wasn't one already. */
void
default_flag_random_seed (void)
default_flag_random_seed ()
{
unsigned HOST_WIDE_INT value;
char *new_random_seed;

View File

@ -174,7 +174,7 @@ struct tree_common GTY(())
TREE_STATIC in
VAR_DECL, FUNCTION_DECL, CONSTRUCTOR, ADDR_EXPR
TREE_NO_UNUSED_WARNING in
CONVERT_EXPR, NOP_EXPR, COMPOUND_EXPR
CONVERT_EXPR, NOP_EXPR, COMPOUND_EXPR, NON_LVALUE_EXPR
TREE_VIA_VIRTUAL in
TREE_LIST or TREE_VEC
TREE_CONSTANT_OVERFLOW in

View File

@ -2478,7 +2478,13 @@ biv_total_increment (bl)
if (v->always_computable && v->mult_val == const1_rtx
&& ! v->maybe_multiple
&& SCALAR_INT_MODE_P (v->mode))
result = fold_rtx_mult_add (result, const1_rtx, v->add_val, v->mode);
{
/* If we have already counted it, skip it. */
if (v->same)
continue;
result = fold_rtx_mult_add (result, const1_rtx, v->add_val, v->mode);
}
else
return 0;
}
@ -3539,6 +3545,10 @@ loop_iterations (loop)
return 0;
}
/* If we have already counted it, skip it. */
if (biv_inc->same)
continue;
offset -= INTVAL (biv_inc->add_val);
}
}

View File

@ -62,7 +62,7 @@ struct _Unwind_Context
};
/* Byte size of every register managed by these routines. */
static unsigned char dwarf_reg_size_table[DWARF_FRAME_REGISTERS];
static unsigned char dwarf_reg_size_table[DWARF_FRAME_REGISTERS+1];
/* The result of interpreting the frame unwind info for a frame.
@ -171,7 +171,7 @@ _Unwind_GetGR (struct _Unwind_Context *context, int index)
_Unwind_Word
_Unwind_GetCFA (struct _Unwind_Context *context)
{
return (_Unwind_Ptr) context->cfa;
return (_Unwind_Word) context->cfa;
}
/* Overwrite the saved value for register REG in CONTEXT with VAL. */
@ -929,6 +929,9 @@ uw_frame_state_for (struct _Unwind_Context *context, _Unwind_FrameState *fs)
context->args_size = 0;
context->lsda = 0;
if (context->ra == 0)
return _URC_END_OF_STACK;
fde = _Unwind_Find_FDE (context->ra - 1, &context->bases);
if (fde == NULL)
{

View File

@ -0,0 +1,172 @@
/* Subroutines needed for unwinding stack frames via the libunwind API.
Copyright (C) 2002, 2003
Free Software Foundation, Inc.
Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
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. */
/* As a special exception, if you link this library with other files,
some of which are compiled with GCC, to produce an executable,
this library does not by itself cause the resulting executable
to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why
the executable file might be covered by the GNU General Public License. */
#include "tconfig.h"
#include "tsystem.h"
#include "unwind.h"
#ifndef __USING_SJLJ_EXCEPTIONS__
#define UNW_LOCAL_ONLY
#include <libunwind.h>
typedef struct {
_Unwind_Personality_Fn personality;
} _Unwind_FrameState;
struct _Unwind_Context {
unw_cursor_t cursor;
};
/* First come the helper-routines that are needed by unwind.inc. */
static _Unwind_Reason_Code
uw_frame_state_for (struct _Unwind_Context *context, _Unwind_FrameState *fs)
{
unw_proc_info_t pi;
if (unw_step (&context->cursor) <= 0)
return _URC_END_OF_STACK;
unw_get_proc_info(&context->cursor, &pi);
fs->personality = (_Unwind_Personality_Fn) pi.handler;
return _URC_NO_REASON;
}
#define uw_update_context(context,fs) do { ; } while (0)
static inline _Unwind_Ptr
uw_identify_context (struct _Unwind_Context *context)
{
unw_word_t ip;
unw_get_reg (&context->cursor, UNW_REG_IP, &ip);
return (_Unwind_Ptr) ip;
}
#define uw_init_context(context) \
do \
{ \
unw_context_t uc; \
unw_getcontext (&uc); \
unw_init_local (&(context)->cursor, &uc); \
} \
while (0)
static inline void __attribute__ ((noreturn))
uw_install_context (struct _Unwind_Context *current __attribute__ ((unused)),
struct _Unwind_Context *target)
{
unw_resume (&(target)->cursor);
abort ();
}
/* Now come the helper-routines which may be called from an exception
handler. The interface for these routines are defined by the C++
ABI. See: http://www.codesourcery.com/cxx-abi/abi-eh.html */
_Unwind_Word
_Unwind_GetGR (struct _Unwind_Context *context, int index)
{
unw_word_t ret;
/* Note: here we depend on the fact that general registers are
expected to start with register number 0! */
unw_get_reg (&context->cursor, index, &ret);
return ret;
}
/* Get the value of the CFA as saved in CONTEXT. */
_Unwind_Word
_Unwind_GetCFA (struct _Unwind_Context *context)
{
/* ??? Is there any way to get this information? */
return NULL;
}
/* Overwrite the saved value for register REG in CONTEXT with VAL. */
void
_Unwind_SetGR (struct _Unwind_Context *context, int index, _Unwind_Word val)
{
/* Note: here we depend on the fact that general registers are
expected to start with register number 0! */
unw_set_reg (&context->cursor, index, val);
}
/* Retrieve the return address for CONTEXT. */
inline _Unwind_Ptr
_Unwind_GetIP (struct _Unwind_Context *context)
{
unw_word_t ret;
unw_get_reg (&context->cursor, UNW_REG_IP, &ret);
return ret;
}
/* Overwrite the return address for CONTEXT with VAL. */
inline void
_Unwind_SetIP (struct _Unwind_Context *context, _Unwind_Ptr val)
{
unw_set_reg (&context->cursor, UNW_REG_IP, val);
}
void *
_Unwind_GetLanguageSpecificData (struct _Unwind_Context *context)
{
unw_proc_info_t pi;
unw_get_proc_info(&context->cursor, &pi);
return (void *) pi.lsda;
}
_Unwind_Ptr
_Unwind_GetRegionStart (struct _Unwind_Context *context)
{
unw_proc_info_t pi;
unw_get_proc_info(&context->cursor, &pi);
return (_Unwind_Ptr) pi.start_ip;
}
void *
_Unwind_FindEnclosingFunction (void *pc)
{
return NULL;
}
#include "unwind.inc"
#endif /* !__USING_SJLJ_EXCEPTIONS__ */

View File

@ -210,6 +210,9 @@ _Unwind_GetTextRelBase (struct _Unwind_Context *_C)
abort ();
return 0;
}
/* @@@ Retrieve the Backing Store Pointer of the given context. */
extern _Unwind_Word _Unwind_GetBSP (struct _Unwind_Context *);
#else
extern _Unwind_Ptr _Unwind_GetDataRelBase (struct _Unwind_Context *);
extern _Unwind_Ptr _Unwind_GetTextRelBase (struct _Unwind_Context *);

View File

@ -2411,7 +2411,7 @@ compare_constant (t1, t2)
if (get_set_constructor_bytes (t2, tmp2, len) != NULL_TREE)
return 0;
return memcmp (tmp1, tmp2, len) != 0;
return memcmp (tmp1, tmp2, len) == 0;
}
else
{
@ -2662,6 +2662,7 @@ output_constant_def (exp, defer)
int labelno = -1;
rtx rtl;
/* We can't just use the saved RTL if this is a deferred string constant
and we are not to defer anymore. */
if (TREE_CODE (exp) != INTEGER_CST && TREE_CST_RTL (exp)
@ -2825,6 +2826,7 @@ output_constant_def_contents (exp, reloc, labelno)
int labelno;
{
int align;
HOST_WIDE_INT size;
/* Align the location counter as required by EXP's data type. */
align = TYPE_ALIGN (TREE_TYPE (exp));
@ -2842,17 +2844,24 @@ output_constant_def_contents (exp, reloc, labelno)
ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
}
/* Output the label itself. */
size = int_size_in_bytes (TREE_TYPE (exp));
if (TREE_CODE (exp) == STRING_CST)
size = MAX (TREE_STRING_LENGTH (exp), size);
/* Do any machine/system dependent processing of the constant. */
#ifdef ASM_DECLARE_CONSTANT_NAME
{
char label[256];
ASM_GENERATE_INTERNAL_LABEL (label, "LC", labelno);
ASM_DECLARE_CONSTANT_NAME (asm_out_file, label, exp, size);
}
#else
/* Standard thing is just output label for the constant. */
ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LC", labelno);
#endif /* ASM_DECLARE_CONSTANT_NAME */
/* Output the value of EXP. */
output_constant (exp,
(TREE_CODE (exp) == STRING_CST
? MAX (TREE_STRING_LENGTH (exp),
int_size_in_bytes (TREE_TYPE (exp)))
: int_size_in_bytes (TREE_TYPE (exp))),
align);
output_constant (exp, size, align);
}
/* Used in the hash tables to avoid outputting the same constant
@ -3767,11 +3776,27 @@ initializer_constant_valid_p (value, endtype)
|| TREE_CODE (TREE_TYPE (value)) == RECORD_TYPE)
&& TREE_CONSTANT (value)
&& CONSTRUCTOR_ELTS (value))
return
initializer_constant_valid_p (TREE_VALUE (CONSTRUCTOR_ELTS (value)),
endtype);
{
tree elt;
bool absolute = true;
return TREE_STATIC (value) ? null_pointer_node : 0;
for (elt = CONSTRUCTOR_ELTS (value); elt; elt = TREE_CHAIN (elt))
{
tree reloc;
value = TREE_VALUE (elt);
reloc = initializer_constant_valid_p (value, TREE_TYPE (value));
if (!reloc)
return NULL_TREE;
if (reloc != null_pointer_node)
absolute = false;
}
/* For a non-absolute relocation, there is no single
variable that can be "the variable that determines the
relocation." */
return absolute ? null_pointer_node : error_mark_node;
}
return TREE_STATIC (value) ? null_pointer_node : NULL_TREE;
case INTEGER_CST:
case VECTOR_CST: