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:
commit
1f79a7c5d0
File diff suppressed because it is too large
Load Diff
2
contrib/gcc/aclocal.m4
vendored
2
contrib/gcc/aclocal.m4
vendored
@ -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;;
|
||||
|
@ -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
|
||||
|
@ -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. */
|
||||
|
@ -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");
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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];
|
||||
|
@ -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 = ®_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)
|
||||
|
@ -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"
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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))]
|
||||
|
@ -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)
|
||||
|
@ -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}"
|
||||
|
@ -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. */
|
||||
|
||||
|
1499
contrib/gcc/config/i386/emmintrin.h
Normal file
1499
contrib/gcc/config/i386/emmintrin.h
Normal file
File diff suppressed because it is too large
Load Diff
@ -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)
|
||||
{
|
||||
|
132
contrib/gcc/config/i386/pmmintrin.h
Normal file
132
contrib/gcc/config/i386/pmmintrin.h
Normal 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 */
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
@ -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\""
|
||||
|
||||
|
@ -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
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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")
|
||||
|
@ -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 *);
|
||||
|
@ -7,3 +7,6 @@ GCC_3.0 {
|
||||
__ia64_trampoline
|
||||
__ia64_backtrace
|
||||
}
|
||||
GCC_3.3.2 {
|
||||
_Unwind_GetBSP
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
||||
|
@ -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)"
|
||||
|
||||
|
@ -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)"
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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. */
|
||||
|
||||
|
@ -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. */
|
||||
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
||||
|
1
contrib/gcc/config/t-libunwind
Normal file
1
contrib/gcc/config/t-libunwind
Normal file
@ -0,0 +1 @@
|
||||
LIB2ADDEH = $(srcdir)/unwind-libunwind.c $(srcdir)/unwind-sjlj.c
|
@ -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.
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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));
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -279,7 +279,8 @@ cxx_incomplete_type_diagnostic (value, type, diag_type)
|
||||
break;
|
||||
|
||||
default:
|
||||
abort ();
|
||||
(*p_msg) ("invalid use of incomplete type");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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.
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
|
@ -1,3 +1,7 @@
|
||||
2003-10-16 Release Manager
|
||||
|
||||
* GCC 3.3.2 Released.
|
||||
|
||||
2003-08-04 Release Manager
|
||||
|
||||
* GCC 3.3.1 Released.
|
||||
|
@ -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 {
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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' \\
|
||||
|
@ -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");
|
||||
|
@ -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)
|
||||
|
@ -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, ®stack);
|
||||
}
|
||||
subst_stack_regs (insn, ®stack);
|
||||
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, ®stack);
|
||||
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 ();
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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))
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
172
contrib/gcc/unwind-libunwind.c
Normal file
172
contrib/gcc/unwind-libunwind.c
Normal 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__ */
|
@ -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 *);
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user