* Merge from gcc2 June 9, 1998 snapshot. See ChangeLog.13 for
details. From-SVN: r20808
This commit is contained in:
parent
ad2c71b764
commit
9ec36da574
|
@ -1,5 +1,8 @@
|
||||||
Mon Jun 29 22:12:06 1998 Jeffrey A Law (law@cygnus.com)
|
Mon Jun 29 22:12:06 1998 Jeffrey A Law (law@cygnus.com)
|
||||||
|
|
||||||
|
* Merge from gcc2 June 9, 1998 snapshot. See ChangeLog.13 for
|
||||||
|
details.
|
||||||
|
|
||||||
* pa.c, pa.h, pa.md: Convert to gen_rtx_FOO.
|
* pa.c, pa.h, pa.md: Convert to gen_rtx_FOO.
|
||||||
|
|
||||||
Mon Jun 29 20:12:41 1998 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
|
Mon Jun 29 20:12:41 1998 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -654,9 +654,8 @@ CCCP=@cpp_main@
|
||||||
# Files to be copied away after each stage in building.
|
# Files to be copied away after each stage in building.
|
||||||
STAGESTUFF = *$(objext) insn-flags.h insn-config.h insn-codes.h \
|
STAGESTUFF = *$(objext) insn-flags.h insn-config.h insn-codes.h \
|
||||||
insn-output.c insn-recog.c insn-emit.c insn-extract.c insn-peep.c \
|
insn-output.c insn-recog.c insn-emit.c insn-extract.c insn-peep.c \
|
||||||
insn-attr.h insn-attrtab.c insn-opinit.c genrtl.c genrtl.h tree-check.h \
|
s-flags s-config s-codes s-mlib s-under\
|
||||||
s-flags s-config s-codes s-mlib \
|
s-output s-recog s-emit s-extract s-peep s-check \
|
||||||
s-output s-recog s-emit s-extract s-peep \
|
|
||||||
s-attr s-attrtab s-opinit s-crt s-crtS s-crt0 \
|
s-attr s-attrtab s-opinit s-crt s-crtS s-crt0 \
|
||||||
genemit$(build_exeext) genoutput$(build_exeext) genrecog$(build_exeext) \
|
genemit$(build_exeext) genoutput$(build_exeext) genrecog$(build_exeext) \
|
||||||
genextract$(build_exeext) genflags$(build_exeext) gencodes$(build_exeext) \
|
genextract$(build_exeext) genflags$(build_exeext) gencodes$(build_exeext) \
|
||||||
|
@ -1560,7 +1559,7 @@ s-codes : $(md_file) gencodes $(srcdir)/move-if-change
|
||||||
touch s-codes
|
touch s-codes
|
||||||
|
|
||||||
insn-emit.o : insn-emit.c $(CONFIG_H) $(RTL_H) $(EXPR_H) real.h output.h \
|
insn-emit.o : insn-emit.c $(CONFIG_H) $(RTL_H) $(EXPR_H) real.h output.h \
|
||||||
insn-config.h insn-flags.h insn-codes.h system.h
|
insn-config.h insn-flags.h insn-codes.h system.h reload.h
|
||||||
$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c insn-emit.c
|
$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c insn-emit.c
|
||||||
|
|
||||||
insn-emit.c: s-emit ; @true
|
insn-emit.c: s-emit ; @true
|
||||||
|
@ -2500,11 +2499,13 @@ uninstall: lang.uninstall
|
||||||
-rm -rf $(bindir)/$(GCC_CROSS_NAME)$(exeext)
|
-rm -rf $(bindir)/$(GCC_CROSS_NAME)$(exeext)
|
||||||
-rm -rf $(bindir)/protoize$(exeext)
|
-rm -rf $(bindir)/protoize$(exeext)
|
||||||
-rm -rf $(bindir)/unprotoize$(exeext)
|
-rm -rf $(bindir)/unprotoize$(exeext)
|
||||||
|
-rm -rf $(bindir)/gcov$(exeext)
|
||||||
-rm -rf $(mandir)/$(GCC_INSTALL_NAME)$(manext)
|
-rm -rf $(mandir)/$(GCC_INSTALL_NAME)$(manext)
|
||||||
-rm -rf $(mandir)/$(GCC_CROSS_NAME)$(manext)
|
-rm -rf $(mandir)/$(GCC_CROSS_NAME)$(manext)
|
||||||
-rm -rf $(mandir)/cccp$(manext)
|
-rm -rf $(mandir)/cccp$(manext)
|
||||||
-rm -rf $(mandir)/protoize$(manext)
|
-rm -rf $(mandir)/protoize$(manext)
|
||||||
-rm -rf $(mandir)/unprotoize$(manext)
|
-rm -rf $(mandir)/unprotoize$(manext)
|
||||||
|
-rm -f $(infodir)/cpp.info* $(infodir)/gcc.info*
|
||||||
#
|
#
|
||||||
# These targets are for the dejagnu testsuites. The file site.exp
|
# These targets are for the dejagnu testsuites. The file site.exp
|
||||||
# contains global variables that all the testsuites will use.
|
# contains global variables that all the testsuites will use.
|
||||||
|
|
|
@ -64,4 +64,7 @@
|
||||||
|
|
||||||
/* Whether getwd must be declared even if <unistd.h> is included. */
|
/* Whether getwd must be declared even if <unistd.h> is included. */
|
||||||
#undef NEED_DECLARATION_GETWD
|
#undef NEED_DECLARATION_GETWD
|
||||||
|
|
||||||
|
/* Define if you want expensive run-time checks. */
|
||||||
|
#undef ENABLE_CHECKING
|
||||||
@TOP@
|
@TOP@
|
||||||
|
|
|
@ -3798,6 +3798,10 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes)
|
||||||
if (! flag_no_common || ! TREE_PUBLIC (decl))
|
if (! flag_no_common || ! TREE_PUBLIC (decl))
|
||||||
DECL_COMMON (decl) = 1;
|
DECL_COMMON (decl) = 1;
|
||||||
|
|
||||||
|
#ifdef SET_DEFAULT_DECL_ATTRIBUTES
|
||||||
|
SET_DEFAULT_DECL_ATTRIBUTES (decl, attributes);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Set attributes here so if duplicate decl, will have proper attributes. */
|
/* Set attributes here so if duplicate decl, will have proper attributes. */
|
||||||
decl_attributes (decl, attributes, prefix_attributes);
|
decl_attributes (decl, attributes, prefix_attributes);
|
||||||
|
|
||||||
|
|
|
@ -544,6 +544,11 @@ check_newline ()
|
||||||
token = yylex ();
|
token = yylex ();
|
||||||
if (token != IDENTIFIER)
|
if (token != IDENTIFIER)
|
||||||
goto skipline;
|
goto skipline;
|
||||||
|
if (nextchar >= 0)
|
||||||
|
c = nextchar, nextchar = -1;
|
||||||
|
else
|
||||||
|
c = GETC ();
|
||||||
|
ungetc (c, finput);
|
||||||
if (HANDLE_PRAGMA (finput, yylval.ttype))
|
if (HANDLE_PRAGMA (finput, yylval.ttype))
|
||||||
{
|
{
|
||||||
c = GETC ();
|
c = GETC ();
|
||||||
|
|
|
@ -3771,9 +3771,8 @@ simplify_rtx (x, op0_mode, last, in_dest)
|
||||||
|
|
||||||
/* If we know that the value is already truncated, we can
|
/* If we know that the value is already truncated, we can
|
||||||
replace the TRUNCATE with a SUBREG. */
|
replace the TRUNCATE with a SUBREG. */
|
||||||
if (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) <= HOST_BITS_PER_WIDE_INT
|
if (num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
|
||||||
&& (nonzero_bits (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
|
>= GET_MODE_BITSIZE (mode) + 1)
|
||||||
&~ GET_MODE_MASK (mode)) == 0)
|
|
||||||
return gen_lowpart_for_combine (mode, XEXP (x, 0));
|
return gen_lowpart_for_combine (mode, XEXP (x, 0));
|
||||||
|
|
||||||
/* A truncate of a comparison can be replaced with a subreg if
|
/* A truncate of a comparison can be replaced with a subreg if
|
||||||
|
@ -4702,7 +4701,7 @@ simplify_set (x)
|
||||||
we only care about the low bits of the result.
|
we only care about the low bits of the result.
|
||||||
|
|
||||||
However, on machines without WORD_REGISTER_OPERATIONS defined, we cannot
|
However, on machines without WORD_REGISTER_OPERATIONS defined, we cannot
|
||||||
perform a narrower operation that requested since the high-order bits will
|
perform a narrower operation than requested since the high-order bits will
|
||||||
be undefined. On machine where it is defined, this transformation is safe
|
be undefined. On machine where it is defined, this transformation is safe
|
||||||
as long as M1 and M2 have the same number of words. */
|
as long as M1 and M2 have the same number of words. */
|
||||||
|
|
||||||
|
@ -6953,8 +6952,6 @@ rtx_equal_for_field_assignment_p (x, y)
|
||||||
rtx x;
|
rtx x;
|
||||||
rtx y;
|
rtx y;
|
||||||
{
|
{
|
||||||
rtx last_x, last_y;
|
|
||||||
|
|
||||||
if (x == y || rtx_equal_p (x, y))
|
if (x == y || rtx_equal_p (x, y))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
@ -6976,19 +6973,12 @@ rtx_equal_for_field_assignment_p (x, y)
|
||||||
gen_lowpart_for_combine (GET_MODE (SUBREG_REG (x)), y)))
|
gen_lowpart_for_combine (GET_MODE (SUBREG_REG (x)), y)))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
last_x = get_last_value (x);
|
/* We used to see if get_last_value of X and Y were the same but that's
|
||||||
last_y = get_last_value (y);
|
not correct. In one direction, we'll cause the assignment to have
|
||||||
|
the wrong destination and in the case, we'll import a register into this
|
||||||
return ((last_x != 0
|
insn that might have already have been dead. So fail if none of the
|
||||||
&& GET_CODE (last_x) != CLOBBER
|
above cases are true. */
|
||||||
&& rtx_equal_for_field_assignment_p (last_x, y))
|
return 0;
|
||||||
|| (last_y != 0
|
|
||||||
&& GET_CODE (last_y) != CLOBBER
|
|
||||||
&& rtx_equal_for_field_assignment_p (x, last_y))
|
|
||||||
|| (last_x != 0 && last_y != 0
|
|
||||||
&& GET_CODE (last_x) != CLOBBER
|
|
||||||
&& GET_CODE (last_y) != CLOBBER
|
|
||||||
&& rtx_equal_for_field_assignment_p (last_x, last_y)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* See if X, a SET operation, can be rewritten as a bit-field assignment.
|
/* See if X, a SET operation, can be rewritten as a bit-field assignment.
|
||||||
|
@ -10160,14 +10150,20 @@ simplify_comparison (code, pop0, pop1)
|
||||||
if (GET_CODE (XEXP (op0, 0)) == SUBREG
|
if (GET_CODE (XEXP (op0, 0)) == SUBREG
|
||||||
&& ((mode_width
|
&& ((mode_width
|
||||||
>= GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (XEXP (op0, 0)))))
|
>= GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (XEXP (op0, 0)))))
|
||||||
|| subreg_lowpart_p (XEXP (op0, 0)))
|
#ifdef WORD_REGISTER_OPERATIONS
|
||||||
|
|| subreg_lowpart_p (XEXP (op0, 0))
|
||||||
|
#endif
|
||||||
|
)
|
||||||
&& GET_CODE (XEXP (op0, 1)) == CONST_INT
|
&& GET_CODE (XEXP (op0, 1)) == CONST_INT
|
||||||
&& mode_width <= HOST_BITS_PER_WIDE_INT
|
&& mode_width <= HOST_BITS_PER_WIDE_INT
|
||||||
&& (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (XEXP (op0, 0))))
|
&& (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (XEXP (op0, 0))))
|
||||||
<= HOST_BITS_PER_WIDE_INT)
|
<= HOST_BITS_PER_WIDE_INT)
|
||||||
&& (INTVAL (XEXP (op0, 1)) & ~ mask) == 0
|
&& (INTVAL (XEXP (op0, 1)) & ~ mask) == 0
|
||||||
&& 0 == (~ GET_MODE_MASK (GET_MODE (SUBREG_REG (XEXP (op0, 0))))
|
&& 0 == (~ GET_MODE_MASK (GET_MODE (SUBREG_REG (XEXP (op0, 0))))
|
||||||
& INTVAL (XEXP (op0, 1))))
|
& INTVAL (XEXP (op0, 1)))
|
||||||
|
&& INTVAL (XEXP (op0, 1)) != mask
|
||||||
|
&& (INTVAL (XEXP (op0, 1))
|
||||||
|
!= GET_MODE_MASK (GET_MODE (SUBREG_REG (XEXP (op0, 0))))))
|
||||||
|
|
||||||
{
|
{
|
||||||
op0
|
op0
|
||||||
|
|
|
@ -2808,6 +2808,51 @@ print_operand (file, x, code)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Emit RTL insns to initialize the variable parts of a trampoline at
|
||||||
|
TRAMP. FNADDR is an RTX for the address of the function's pure
|
||||||
|
code. CXT is an RTX for the static chain value for the function.
|
||||||
|
We assume here that a function will be called many more times than
|
||||||
|
its address is taken (e.g., it might be passed to qsort), so we
|
||||||
|
take the trouble to initialize the "hint" field in the JMP insn.
|
||||||
|
Note that the hint field is PC (new) + 4 * bits 13:0. */
|
||||||
|
|
||||||
|
void
|
||||||
|
alpha_initialize_trampoline (tramp, fnaddr, cxt)
|
||||||
|
rtx tramp;
|
||||||
|
rtx fnaddr;
|
||||||
|
rtx cxt;
|
||||||
|
{
|
||||||
|
rtx temp, temp1, addr;
|
||||||
|
|
||||||
|
/* Store function address and CXT. */
|
||||||
|
addr = memory_address (Pmode, plus_constant (tramp, 16));
|
||||||
|
emit_move_insn (gen_rtx (MEM, Pmode, addr), fnaddr);
|
||||||
|
addr = memory_address (Pmode, plus_constant (tramp, 24));
|
||||||
|
emit_move_insn (gen_rtx (MEM, Pmode, addr), cxt);
|
||||||
|
|
||||||
|
/* Compute hint value. */
|
||||||
|
temp = force_operand (plus_constant (tramp, 12), NULL_RTX);
|
||||||
|
temp = expand_binop (DImode, sub_optab, fnaddr, temp, temp, 1, OPTAB_WIDEN);
|
||||||
|
temp = expand_shift (RSHIFT_EXPR, Pmode, temp,
|
||||||
|
build_int_2 (2, 0), NULL_RTX, 1);
|
||||||
|
temp = expand_and (gen_lowpart (SImode, temp), GEN_INT (0x3fff), 0);
|
||||||
|
|
||||||
|
/* Merge in the hint. */
|
||||||
|
addr = memory_address (SImode, plus_constant (tramp, 8));
|
||||||
|
temp1 = force_reg (SImode, gen_rtx (MEM, SImode, addr));
|
||||||
|
temp1 = expand_and (temp1, GEN_INT (0xffffc000), NULL_RTX);
|
||||||
|
temp1 = expand_binop (SImode, ior_optab, temp1, temp, temp1, 1, OPTAB_WIDEN);
|
||||||
|
emit_move_insn (gen_rtx (MEM, SImode, addr), temp1);
|
||||||
|
|
||||||
|
#ifdef TRANSFER_FROM_TRAMPOLINE
|
||||||
|
emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "__enable_execute_stack"),
|
||||||
|
0, VOIDmode, 1, addr, Pmode);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
emit_insn (gen_rtx (UNSPEC_VOLATILE, VOIDmode,
|
||||||
|
gen_rtvec (1, const0_rtx), 0));
|
||||||
|
}
|
||||||
|
|
||||||
/* Do what is necessary for `va_start'. The argument is ignored;
|
/* Do what is necessary for `va_start'. The argument is ignored;
|
||||||
We look at the current function to determine if stdarg or varargs
|
We look at the current function to determine if stdarg or varargs
|
||||||
is used and fill in an initial va_list. A pointer to this constructor
|
is used and fill in an initial va_list. A pointer to this constructor
|
||||||
|
|
|
@ -676,12 +676,17 @@ enum reg_class { NO_REGS, GENERAL_REGS, FLOAT_REGS, ALL_REGS,
|
||||||
|
|
||||||
For the Alpha, `Q' means that this is a memory operand but not a
|
For the Alpha, `Q' means that this is a memory operand but not a
|
||||||
reference to an unaligned location.
|
reference to an unaligned location.
|
||||||
|
|
||||||
`R' is a SYMBOL_REF that has SYMBOL_REF_FLAG set or is the current
|
`R' is a SYMBOL_REF that has SYMBOL_REF_FLAG set or is the current
|
||||||
function. */
|
function.
|
||||||
|
|
||||||
|
'S' is a 6-bit constant (valid for a shift insn). */
|
||||||
|
|
||||||
#define EXTRA_CONSTRAINT(OP, C) \
|
#define EXTRA_CONSTRAINT(OP, C) \
|
||||||
((C) == 'Q' ? GET_CODE (OP) == MEM && GET_CODE (XEXP (OP, 0)) != AND \
|
((C) == 'Q' ? GET_CODE (OP) == MEM && GET_CODE (XEXP (OP, 0)) != AND \
|
||||||
: (C) == 'R' ? current_file_function_operand (OP, Pmode) \
|
: (C) == 'R' ? current_file_function_operand (OP, Pmode) \
|
||||||
|
: (C) == 'S' ? (GET_CODE (OP) == CONST_INT \
|
||||||
|
&& (unsigned HOST_WIDE_INT) INTVAL (OP) < 64) \
|
||||||
: 0)
|
: 0)
|
||||||
|
|
||||||
/* Given an rtx X being reloaded into a reg required to be
|
/* Given an rtx X being reloaded into a reg required to be
|
||||||
|
@ -1203,37 +1208,7 @@ extern void output_end_prologue ();
|
||||||
field is PC (new) + 4 * bits 13:0. */
|
field is PC (new) + 4 * bits 13:0. */
|
||||||
|
|
||||||
#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
|
#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
|
||||||
{ \
|
alpha_initialize_trampoline (TRAMP, FNADDR, CXT)
|
||||||
rtx _temp, _temp1, _addr; \
|
|
||||||
\
|
|
||||||
_addr = memory_address (Pmode, plus_constant ((TRAMP), 16)); \
|
|
||||||
emit_move_insn (gen_rtx (MEM, Pmode, _addr), (FNADDR)); \
|
|
||||||
_addr = memory_address (Pmode, plus_constant ((TRAMP), 24)); \
|
|
||||||
emit_move_insn (gen_rtx (MEM, Pmode, _addr), (CXT)); \
|
|
||||||
\
|
|
||||||
_temp = force_operand (plus_constant ((TRAMP), 12), NULL_RTX); \
|
|
||||||
_temp = expand_binop (DImode, sub_optab, (FNADDR), _temp, _temp, 1, \
|
|
||||||
OPTAB_WIDEN); \
|
|
||||||
_temp = expand_shift (RSHIFT_EXPR, Pmode, _temp, \
|
|
||||||
build_int_2 (2, 0), NULL_RTX, 1); \
|
|
||||||
_temp = expand_and (gen_lowpart (SImode, _temp), \
|
|
||||||
GEN_INT (0x3fff), 0); \
|
|
||||||
\
|
|
||||||
_addr = memory_address (SImode, plus_constant ((TRAMP), 8)); \
|
|
||||||
_temp1 = force_reg (SImode, gen_rtx (MEM, SImode, _addr)); \
|
|
||||||
_temp1 = expand_and (_temp1, GEN_INT (0xffffc000), NULL_RTX); \
|
|
||||||
_temp1 = expand_binop (SImode, ior_optab, _temp1, _temp, _temp1, 1, \
|
|
||||||
OPTAB_WIDEN); \
|
|
||||||
\
|
|
||||||
emit_move_insn (gen_rtx (MEM, SImode, _addr), _temp1); \
|
|
||||||
\
|
|
||||||
emit_library_call (gen_rtx (SYMBOL_REF, Pmode, \
|
|
||||||
"__enable_execute_stack"), \
|
|
||||||
0, VOIDmode, 1,_addr, Pmode); \
|
|
||||||
\
|
|
||||||
emit_insn (gen_rtx (UNSPEC_VOLATILE, VOIDmode, \
|
|
||||||
gen_rtvec (1, const0_rtx), 0)); \
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Attempt to turn on access permissions for the stack. */
|
/* Attempt to turn on access permissions for the stack. */
|
||||||
|
|
||||||
|
@ -2127,6 +2102,7 @@ do { \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
/* Define results of standard character escape sequences. */
|
/* Define results of standard character escape sequences. */
|
||||||
#define TARGET_BELL 007
|
#define TARGET_BELL 007
|
||||||
#define TARGET_BS 010
|
#define TARGET_BS 010
|
||||||
|
|
|
@ -1177,7 +1177,7 @@
|
||||||
(define_insn "ashldi3"
|
(define_insn "ashldi3"
|
||||||
[(set (match_operand:DI 0 "register_operand" "=r,r")
|
[(set (match_operand:DI 0 "register_operand" "=r,r")
|
||||||
(ashift:DI (match_operand:DI 1 "reg_or_0_operand" "rJ,rJ")
|
(ashift:DI (match_operand:DI 1 "reg_or_0_operand" "rJ,rJ")
|
||||||
(match_operand:DI 2 "reg_or_6bit_operand" "P,rI")))]
|
(match_operand:DI 2 "reg_or_6bit_operand" "P,rS")))]
|
||||||
""
|
""
|
||||||
"*
|
"*
|
||||||
{
|
{
|
||||||
|
@ -1218,7 +1218,7 @@
|
||||||
(define_insn "lshrdi3"
|
(define_insn "lshrdi3"
|
||||||
[(set (match_operand:DI 0 "register_operand" "=r")
|
[(set (match_operand:DI 0 "register_operand" "=r")
|
||||||
(lshiftrt:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
|
(lshiftrt:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
|
||||||
(match_operand:DI 2 "reg_or_6bit_operand" "rI")))]
|
(match_operand:DI 2 "reg_or_6bit_operand" "rS")))]
|
||||||
""
|
""
|
||||||
"srl %r1,%2,%0"
|
"srl %r1,%2,%0"
|
||||||
[(set_attr "type" "shift")])
|
[(set_attr "type" "shift")])
|
||||||
|
@ -1226,7 +1226,7 @@
|
||||||
(define_insn "ashrdi3"
|
(define_insn "ashrdi3"
|
||||||
[(set (match_operand:DI 0 "register_operand" "=r")
|
[(set (match_operand:DI 0 "register_operand" "=r")
|
||||||
(ashiftrt:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
|
(ashiftrt:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
|
||||||
(match_operand:DI 2 "reg_or_6bit_operand" "rI")))]
|
(match_operand:DI 2 "reg_or_6bit_operand" "rS")))]
|
||||||
""
|
""
|
||||||
"sra %r1,%2,%0"
|
"sra %r1,%2,%0"
|
||||||
[(set_attr "type" "shift")])
|
[(set_attr "type" "shift")])
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* Definitions of target machine for GNU compiler,
|
/* Definitions of target machine for GNU compiler, for Alpha Linux-based GNU
|
||||||
for Alpha Linux-based GNU systems.
|
systems using ECOFF.
|
||||||
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
|
Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
Contributed by Richard Henderson.
|
Contributed by Bob Manson.
|
||||||
|
|
||||||
This file is part of GNU CC.
|
This file is part of GNU CC.
|
||||||
|
|
||||||
|
@ -44,28 +44,4 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
#undef TARGET_CAN_FAULT_IN_PROLOGUE
|
#undef TARGET_CAN_FAULT_IN_PROLOGUE
|
||||||
#define TARGET_CAN_FAULT_IN_PROLOGUE 1
|
#define TARGET_CAN_FAULT_IN_PROLOGUE 1
|
||||||
|
|
||||||
/* Emit RTL insns to initialize the variable parts of a trampoline.
|
#undef ASM_FINAL_SPEC
|
||||||
FNADDR is an RTX for the address of the function's pure code.
|
|
||||||
CXT is an RTX for the static chain value for the function.
|
|
||||||
|
|
||||||
This differs from the standard version in that:
|
|
||||||
|
|
||||||
We do not initialize the "hint" field because it only has an 8k
|
|
||||||
range and so the target is in range of something on the stack.
|
|
||||||
Omitting the hint saves a bogus branch-prediction cache line load.
|
|
||||||
|
|
||||||
GNU/Linux always has an executable stack -- no need for a system call. */
|
|
||||||
|
|
||||||
#undef INITIALIZE_TRAMPOLINE
|
|
||||||
#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
|
|
||||||
{ \
|
|
||||||
rtx _addr; \
|
|
||||||
\
|
|
||||||
_addr = memory_address (Pmode, plus_constant ((TRAMP), 16)); \
|
|
||||||
emit_move_insn (gen_rtx (MEM, Pmode, _addr), (FNADDR)); \
|
|
||||||
_addr = memory_address (Pmode, plus_constant ((TRAMP), 24)); \
|
|
||||||
emit_move_insn (gen_rtx (MEM, Pmode, _addr), (CXT)); \
|
|
||||||
\
|
|
||||||
emit_insn (gen_rtx (UNSPEC_VOLATILE, VOIDmode, \
|
|
||||||
gen_rtvec (1, const0_rtx), 0)); \
|
|
||||||
}
|
|
||||||
|
|
|
@ -1910,7 +1910,7 @@ arc_final_prescan_insn (insn, opvec, noperands)
|
||||||
record_cc_ref (insn);
|
record_cc_ref (insn);
|
||||||
|
|
||||||
/* Allow -mdebug-ccfsm to turn this off so we can see how well it does.
|
/* Allow -mdebug-ccfsm to turn this off so we can see how well it does.
|
||||||
We can't do this in macro FINAL_PRESCAN_INSN because it's called from
|
We can't do this in macro FINAL_PRESCAN_INSN because its called from
|
||||||
final_scan_insn which has `optimize' as a local. */
|
final_scan_insn which has `optimize' as a local. */
|
||||||
if (optimize < 2 || TARGET_NO_COND_EXEC)
|
if (optimize < 2 || TARGET_NO_COND_EXEC)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -1583,7 +1583,7 @@ do { if ((LOG) != 0) fprintf (FILE, "\t.align %d\n", 1 << (LOG)); } while (0)
|
||||||
After generation of rtl, the compiler makes no further distinction
|
After generation of rtl, the compiler makes no further distinction
|
||||||
between pointers and any other objects of this machine mode. */
|
between pointers and any other objects of this machine mode. */
|
||||||
/* ??? The arc doesn't have full 32 bit pointers, but making this PSImode has
|
/* ??? The arc doesn't have full 32 bit pointers, but making this PSImode has
|
||||||
it's own problems (you have to add extendpsisi2 and trucnsipsi2 but how does
|
its own problems (you have to add extendpsisi2 and trucnsipsi2 but how does
|
||||||
one do it without getting excess code?). Try to avoid it. */
|
one do it without getting excess code?). Try to avoid it. */
|
||||||
#define Pmode SImode
|
#define Pmode SImode
|
||||||
|
|
||||||
|
|
|
@ -138,7 +138,7 @@ extern char *output_block_move();
|
||||||
/* Tell gcc where to look for the startfile */
|
/* Tell gcc where to look for the startfile */
|
||||||
#define STANDARD_STARTFILE_PREFIX "/d1600/lib"
|
#define STANDARD_STARTFILE_PREFIX "/d1600/lib"
|
||||||
|
|
||||||
/* Tell gcc where to look for it's executables */
|
/* Tell gcc where to look for its executables */
|
||||||
#define STANDARD_EXEC_PREFIX "/d1600/bin"
|
#define STANDARD_EXEC_PREFIX "/d1600/bin"
|
||||||
|
|
||||||
/* Command line options to the AT&T assembler */
|
/* Command line options to the AT&T assembler */
|
||||||
|
|
|
@ -3037,7 +3037,7 @@ output_simode_bld (bild, log2, operands)
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Given INSN and it's current length LENGTH, return the adjustment
|
/* Given INSN and its current length LENGTH, return the adjustment
|
||||||
(in bytes) to correctly compute INSN's length.
|
(in bytes) to correctly compute INSN's length.
|
||||||
|
|
||||||
We use this to get the lengths of various memory references correct. */
|
We use this to get the lengths of various memory references correct. */
|
||||||
|
|
|
@ -439,8 +439,8 @@
|
||||||
[(set (cc0)
|
[(set (cc0)
|
||||||
(match_operator 2 "VOIDmode_compare_op"
|
(match_operator 2 "VOIDmode_compare_op"
|
||||||
[(float_extend:XF
|
[(float_extend:XF
|
||||||
(match_operand:DF 1 "nonimmediate_operand" "fm"))
|
(match_operand:DF 0 "nonimmediate_operand" "fm"))
|
||||||
(match_operand:XF 0 "register_operand" "f")]))
|
(match_operand:XF 1 "register_operand" "f")]))
|
||||||
(clobber (match_scratch:HI 3 "=a"))]
|
(clobber (match_scratch:HI 3 "=a"))]
|
||||||
"TARGET_80387"
|
"TARGET_80387"
|
||||||
"* return output_float_compare (insn, operands);")
|
"* return output_float_compare (insn, operands);")
|
||||||
|
@ -455,6 +455,16 @@
|
||||||
"TARGET_80387"
|
"TARGET_80387"
|
||||||
"* return output_float_compare (insn, operands);")
|
"* return output_float_compare (insn, operands);")
|
||||||
|
|
||||||
|
(define_insn ""
|
||||||
|
[(set (cc0)
|
||||||
|
(match_operator 2 "VOIDmode_compare_op"
|
||||||
|
[(float_extend:XF
|
||||||
|
(match_operand:SF 0 "nonimmediate_operand" "fm"))
|
||||||
|
(match_operand:XF 1 "register_operand" "f")]))
|
||||||
|
(clobber (match_scratch:HI 3 "=a"))]
|
||||||
|
"TARGET_80387"
|
||||||
|
"* return output_float_compare (insn, operands);")
|
||||||
|
|
||||||
(define_insn ""
|
(define_insn ""
|
||||||
[(set (cc0)
|
[(set (cc0)
|
||||||
(compare:CCFPEQ (match_operand:XF 0 "register_operand" "f")
|
(compare:CCFPEQ (match_operand:XF 0 "register_operand" "f")
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Definitions for Intel 386 running Linux-based GNU systems using a.out.
|
/* Definitions for Intel 386 running Linux-based GNU systems using a.out.
|
||||||
Copyright (C) 1992, 1994, 1995, 1997 Free Software Foundation, Inc.
|
Copyright (C) 1992, 1994, 1995, 1997, 1998 Free Software Foundation, Inc.
|
||||||
Contributed by H.J. Lu (hjl@nynexst.com)
|
Contributed by H.J. Lu (hjl@nynexst.com)
|
||||||
|
|
||||||
This file is part of GNU CC.
|
This file is part of GNU CC.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* Definitions for Intel 386 running Linux-based GNU systems with pre-BFD
|
/* Definitions for Intel 386 running Linux-based GNU systems with pre-BFD
|
||||||
a.out linkers.
|
a.out linkers.
|
||||||
Copyright (C) 1995, 1997 Free Software Foundation, Inc.
|
Copyright (C) 1995, 1997, 1998 Free Software Foundation, Inc.
|
||||||
Contributed by Michael Meissner (meissner@cygnus.com)
|
Contributed by Michael Meissner (meissner@cygnus.com)
|
||||||
|
|
||||||
This file is part of GNU CC.
|
This file is part of GNU CC.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Definitions for Intel 386 running Linux with ELF format
|
/* Definitions for Intel 386 running Linux-based GNU systems with ELF format.
|
||||||
Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
|
Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
Contributed by Eric Youngdale.
|
Contributed by Eric Youngdale.
|
||||||
Modified for stabs-in-ELF by H.J. Lu.
|
Modified for stabs-in-ELF by H.J. Lu.
|
||||||
|
|
||||||
|
|
|
@ -1910,7 +1910,7 @@ do { \
|
||||||
After generation of rtl, the compiler makes no further distinction
|
After generation of rtl, the compiler makes no further distinction
|
||||||
between pointers and any other objects of this machine mode. */
|
between pointers and any other objects of this machine mode. */
|
||||||
/* ??? The M32R doesn't have full 32 bit pointers, but making this PSImode has
|
/* ??? The M32R doesn't have full 32 bit pointers, but making this PSImode has
|
||||||
it's own problems (you have to add extendpsisi2 and truncsipsi2).
|
its own problems (you have to add extendpsisi2 and truncsipsi2).
|
||||||
Try to avoid it. */
|
Try to avoid it. */
|
||||||
#define Pmode SImode
|
#define Pmode SImode
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* libgcc1 routines for 68000 w/o floating-point hardware.
|
/* libgcc1 routines for 68000 w/o floating-point hardware.
|
||||||
Copyright (C) 1994, 1996, 1997 Free Software Foundation, Inc.
|
Copyright (C) 1994, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU CC.
|
This file is part of GNU CC.
|
||||||
|
|
||||||
|
|
|
@ -2079,7 +2079,7 @@ do { \
|
||||||
sprintf (LABEL, TARGET_SVR4 ? "*.%s%d" : "*@%s%d", PREFIX, NUM)
|
sprintf (LABEL, TARGET_SVR4 ? "*.%s%d" : "*@%s%d", PREFIX, NUM)
|
||||||
|
|
||||||
/* Internal macro to get a single precision floating point value into
|
/* Internal macro to get a single precision floating point value into
|
||||||
an int, so we can print it's value in hex. */
|
an int, so we can print its value in hex. */
|
||||||
#define FLOAT_TO_INT_INTERNAL( FVALUE, IVALUE ) \
|
#define FLOAT_TO_INT_INTERNAL( FVALUE, IVALUE ) \
|
||||||
{ union { \
|
{ union { \
|
||||||
REAL_VALUE_TYPE d; \
|
REAL_VALUE_TYPE d; \
|
||||||
|
|
|
@ -1125,7 +1125,7 @@
|
||||||
;; The comparison operations store the comparison into a register and
|
;; The comparison operations store the comparison into a register and
|
||||||
;; record that register. The following Bxx or Sxx insn uses that
|
;; record that register. The following Bxx or Sxx insn uses that
|
||||||
;; register as an input. To facilitate use of bcnd instead of cmp/bb1,
|
;; register as an input. To facilitate use of bcnd instead of cmp/bb1,
|
||||||
;; cmpsi records it's operands and produces no code when any operand
|
;; cmpsi records its operands and produces no code when any operand
|
||||||
;; is constant. In this case, the Bxx insns use gen_bcnd and the
|
;; is constant. In this case, the Bxx insns use gen_bcnd and the
|
||||||
;; Sxx insns use gen_test to ensure a cmp has been emitted.
|
;; Sxx insns use gen_test to ensure a cmp has been emitted.
|
||||||
;;
|
;;
|
||||||
|
@ -3972,7 +3972,7 @@
|
||||||
;; This insn is used for some loop tests, typically loops reversed when
|
;; This insn is used for some loop tests, typically loops reversed when
|
||||||
;; strength reduction is used. It is actually created when the instruction
|
;; strength reduction is used. It is actually created when the instruction
|
||||||
;; combination phase combines the special loop test. Since this insn
|
;; combination phase combines the special loop test. Since this insn
|
||||||
;; is both a jump insn and has an output, it must deal with it's own
|
;; is both a jump insn and has an output, it must deal with its own
|
||||||
;; reloads, hence the `m' constraints. The `!' constraints direct reload
|
;; reloads, hence the `m' constraints. The `!' constraints direct reload
|
||||||
;; to not choose the register alternatives in the event a reload is needed.
|
;; to not choose the register alternatives in the event a reload is needed.
|
||||||
|
|
||||||
|
|
|
@ -96,6 +96,9 @@ Boston, MA 02111-1307, USA. */
|
||||||
#undef PREFERRED_DEBUGGING_TYPE
|
#undef PREFERRED_DEBUGGING_TYPE
|
||||||
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
|
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
|
||||||
|
|
||||||
|
/* Force the generation of dwarf .debug_frame sections even if not
|
||||||
|
compiling -g. This guarantees that we can unwind the stack. */
|
||||||
|
#define DWARF2_FRAME_INFO 1
|
||||||
/* The size in bytes of a DWARF field indicating an offset or length
|
/* The size in bytes of a DWARF field indicating an offset or length
|
||||||
relative to a debug info section, specified to be 4 bytes in the DWARF-2
|
relative to a debug info section, specified to be 4 bytes in the DWARF-2
|
||||||
specification. The SGI/MIPS ABI defines it to be the same as PTR_SIZE. */
|
specification. The SGI/MIPS ABI defines it to be the same as PTR_SIZE. */
|
||||||
|
|
|
@ -3992,7 +3992,7 @@ while (0)
|
||||||
#define ASM_OUTPUT_SOURCE_LINE(STREAM, LINE) \
|
#define ASM_OUTPUT_SOURCE_LINE(STREAM, LINE) \
|
||||||
mips_output_lineno (STREAM, LINE)
|
mips_output_lineno (STREAM, LINE)
|
||||||
|
|
||||||
/* The MIPS implementation uses some labels for it's own purpose. The
|
/* The MIPS implementation uses some labels for its own purpose. The
|
||||||
following lists what labels are created, and are all formed by the
|
following lists what labels are created, and are all formed by the
|
||||||
pattern $L[a-z].*. The machine independent portion of GCC creates
|
pattern $L[a-z].*. The machine independent portion of GCC creates
|
||||||
labels matching: $L[A-Z][0-9]+ and $L[0-9]+.
|
labels matching: $L[A-Z][0-9]+ and $L[0-9]+.
|
||||||
|
|
|
@ -4626,7 +4626,7 @@ move\\t%0,%z4\\n\\
|
||||||
|
|
||||||
(define_expand "reload_indi"
|
(define_expand "reload_indi"
|
||||||
[(set (match_operand:DI 0 "register_operand" "=b")
|
[(set (match_operand:DI 0 "register_operand" "=b")
|
||||||
(match_operand:DI 1 "movdi_operand" "b"))
|
(match_operand:DI 1 "" "b"))
|
||||||
(clobber (match_operand:TI 2 "register_operand" "=&d"))]
|
(clobber (match_operand:TI 2 "register_operand" "=&d"))]
|
||||||
"TARGET_64BIT"
|
"TARGET_64BIT"
|
||||||
"
|
"
|
||||||
|
@ -4641,10 +4641,12 @@ move\\t%0,%z4\\n\\
|
||||||
if (GET_CODE (operands[1]) == MEM)
|
if (GET_CODE (operands[1]) == MEM)
|
||||||
{
|
{
|
||||||
rtx memword, offword, hiword, loword;
|
rtx memword, offword, hiword, loword;
|
||||||
|
rtx addr = find_replacement (&XEXP (operands[1], 0));
|
||||||
|
rtx op1 = change_address (operands[1], VOIDmode, addr);
|
||||||
|
|
||||||
scratch = gen_rtx (REG, SImode, REGNO (scratch));
|
scratch = gen_rtx (REG, SImode, REGNO (scratch));
|
||||||
memword = change_address (operands[1], SImode, NULL_RTX);
|
memword = change_address (op1, SImode, NULL_RTX);
|
||||||
offword = change_address (adj_offsettable_operand (operands[1], 4),
|
offword = change_address (adj_offsettable_operand (op1, 4),
|
||||||
SImode, NULL_RTX);
|
SImode, NULL_RTX);
|
||||||
if (BYTES_BIG_ENDIAN)
|
if (BYTES_BIG_ENDIAN)
|
||||||
{
|
{
|
||||||
|
@ -4693,7 +4695,7 @@ move\\t%0,%z4\\n\\
|
||||||
;; use a TImode scratch reg.
|
;; use a TImode scratch reg.
|
||||||
|
|
||||||
(define_expand "reload_outdi"
|
(define_expand "reload_outdi"
|
||||||
[(set (match_operand:DI 0 "general_operand" "=b")
|
[(set (match_operand:DI 0 "" "=b")
|
||||||
(match_operand:DI 1 "se_register_operand" "b"))
|
(match_operand:DI 1 "se_register_operand" "b"))
|
||||||
(clobber (match_operand:TI 2 "register_operand" "=&d"))]
|
(clobber (match_operand:TI 2 "register_operand" "=&d"))]
|
||||||
"TARGET_64BIT"
|
"TARGET_64BIT"
|
||||||
|
@ -4715,10 +4717,12 @@ move\\t%0,%z4\\n\\
|
||||||
if (GET_CODE (operands[0]) == MEM)
|
if (GET_CODE (operands[0]) == MEM)
|
||||||
{
|
{
|
||||||
rtx scratch, memword, offword, hiword, loword;
|
rtx scratch, memword, offword, hiword, loword;
|
||||||
|
rtx addr = find_replacement (&XEXP (operands[0], 0));
|
||||||
|
rtx op0 = change_address (operands[0], VOIDmode, addr);
|
||||||
|
|
||||||
scratch = gen_rtx (REG, SImode, REGNO (operands[2]));
|
scratch = gen_rtx (REG, SImode, REGNO (operands[2]));
|
||||||
memword = change_address (operands[0], SImode, NULL_RTX);
|
memword = change_address (op0, SImode, NULL_RTX);
|
||||||
offword = change_address (adj_offsettable_operand (operands[0], 4),
|
offword = change_address (adj_offsettable_operand (op0, 4),
|
||||||
SImode, NULL_RTX);
|
SImode, NULL_RTX);
|
||||||
if (BYTES_BIG_ENDIAN)
|
if (BYTES_BIG_ENDIAN)
|
||||||
{
|
{
|
||||||
|
|
|
@ -495,7 +495,7 @@ print_operand (file, x, code)
|
||||||
u.i[0] = CONST_DOUBLE_LOW (x); u.i[1] = CONST_DOUBLE_HIGH (x);
|
u.i[0] = CONST_DOUBLE_LOW (x); u.i[1] = CONST_DOUBLE_HIGH (x);
|
||||||
PUT_IMMEDIATE_PREFIX(file);
|
PUT_IMMEDIATE_PREFIX(file);
|
||||||
#ifdef SEQUENT_ASM
|
#ifdef SEQUENT_ASM
|
||||||
/* Sequent likes it's floating point constants as integers */
|
/* Sequent likes its floating point constants as integers */
|
||||||
fprintf (file, "0Dx%08x%08x", u.i[1], u.i[0]);
|
fprintf (file, "0Dx%08x%08x", u.i[1], u.i[0]);
|
||||||
#else
|
#else
|
||||||
#ifdef ENCORE_ASM
|
#ifdef ENCORE_ASM
|
||||||
|
|
|
@ -1390,7 +1390,7 @@ extern char leaf_reg_remap[];
|
||||||
: gen_rtx_MEM (MODE, gen_rtx_PLUS (Pmode, frame_pointer_rtx, \
|
: gen_rtx_MEM (MODE, gen_rtx_PLUS (Pmode, frame_pointer_rtx, \
|
||||||
GEN_INT (STARTING_FRAME_OFFSET))))
|
GEN_INT (STARTING_FRAME_OFFSET))))
|
||||||
|
|
||||||
/* Get_secondary_mem widens it's argument to BITS_PER_WORD which loses on v9
|
/* Get_secondary_mem widens its argument to BITS_PER_WORD which loses on v9
|
||||||
because the movsi and movsf patterns don't handle r/f moves.
|
because the movsi and movsf patterns don't handle r/f moves.
|
||||||
For v8 we copy the default definition. */
|
For v8 we copy the default definition. */
|
||||||
#define SECONDARY_MEMORY_NEEDED_MODE(MODE) \
|
#define SECONDARY_MEMORY_NEEDED_MODE(MODE) \
|
||||||
|
|
|
@ -5614,7 +5614,7 @@ if (! TARGET_ARCH64)
|
||||||
if (GET_CODE (XEXP (operands[0], 0)) == LABEL_REF)
|
if (GET_CODE (XEXP (operands[0], 0)) == LABEL_REF)
|
||||||
{
|
{
|
||||||
/* This is really a PIC sequence. We want to represent
|
/* This is really a PIC sequence. We want to represent
|
||||||
it as a funny jump so it's delay slots can be filled.
|
it as a funny jump so its delay slots can be filled.
|
||||||
|
|
||||||
??? But if this really *is* a CALL, will not it clobber the
|
??? But if this really *is* a CALL, will not it clobber the
|
||||||
call-clobbered registers? We lose this if it is a JUMP_INSN.
|
call-clobbered registers? We lose this if it is a JUMP_INSN.
|
||||||
|
|
|
@ -2261,6 +2261,14 @@ for machine in $build $host $target; do
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
|
alpha*-*-vxworks*)
|
||||||
|
tm_file="${tm_file} dbx.h alpha/vxworks.h"
|
||||||
|
if x$gas != xyes
|
||||||
|
then
|
||||||
|
extra_passes="mips-tfile mips-tdump"
|
||||||
|
fi
|
||||||
|
use_collect2=yes
|
||||||
|
;;
|
||||||
alpha*-*-winnt*)
|
alpha*-*-winnt*)
|
||||||
tm_file="${tm_file} alpha/win-nt.h"
|
tm_file="${tm_file} alpha/win-nt.h"
|
||||||
xm_file="${xm_file} config/winnt/xm-winnt.h alpha/xm-winnt.h"
|
xm_file="${xm_file} config/winnt/xm-winnt.h alpha/xm-winnt.h"
|
||||||
|
@ -5139,7 +5147,7 @@ fi
|
||||||
|
|
||||||
# Figure out what assembler alignment features are present.
|
# Figure out what assembler alignment features are present.
|
||||||
echo $ac_n "checking assembler alignment features""... $ac_c" 1>&6
|
echo $ac_n "checking assembler alignment features""... $ac_c" 1>&6
|
||||||
echo "configure:5143: checking assembler alignment features" >&5
|
echo "configure:5151: checking assembler alignment features" >&5
|
||||||
gcc_cv_as=
|
gcc_cv_as=
|
||||||
gcc_cv_as_alignment_features=
|
gcc_cv_as_alignment_features=
|
||||||
if [ -x as$host_exeext ]; then
|
if [ -x as$host_exeext ]; then
|
||||||
|
|
|
@ -417,6 +417,14 @@ for machine in $build $host $target; do
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
|
alpha*-*-vxworks*)
|
||||||
|
tm_file="${tm_file} dbx.h alpha/vxworks.h"
|
||||||
|
if [ x$gas != xyes ]
|
||||||
|
then
|
||||||
|
extra_passes="mips-tfile mips-tdump"
|
||||||
|
fi
|
||||||
|
use_collect2=yes
|
||||||
|
;;
|
||||||
alpha*-*-winnt*)
|
alpha*-*-winnt*)
|
||||||
tm_file="${tm_file} alpha/win-nt.h"
|
tm_file="${tm_file} alpha/win-nt.h"
|
||||||
xm_file="${xm_file} config/winnt/xm-winnt.h alpha/xm-winnt.h"
|
xm_file="${xm_file} config/winnt/xm-winnt.h alpha/xm-winnt.h"
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
# subdirectories which conform to the old GCC configure mechanism
|
# subdirectories which conform to the old GCC configure mechanism
|
||||||
# for such subdirectories.
|
# for such subdirectories.
|
||||||
|
|
||||||
# Copyright (C) 1997 Free Software Foundation, Inc.
|
# Copyright (C) 1997, 1998 Free Software Foundation, Inc.
|
||||||
|
|
||||||
#This file is part of GNU CC.
|
#This file is part of GNU CC.
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Demangler for GNU C++
|
/* Demangler for GNU C++
|
||||||
Copyright 1989, 1991, 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
|
Copyright 1989, 91, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
|
||||||
Written by James Clark (jjc@jclark.uucp)
|
Written by James Clark (jjc@jclark.uucp)
|
||||||
Rewritten by Fred Fish (fnf@cygnus.com) for ARM and Lucid demangling
|
Rewritten by Fred Fish (fnf@cygnus.com) for ARM and Lucid demangling
|
||||||
|
|
||||||
|
@ -3128,8 +3128,8 @@ forget_types (work)
|
||||||
foo__FiR3fooT1T2T1T2
|
foo__FiR3fooT1T2T1T2
|
||||||
__ct__3fooFiR3fooT1T2T1T2
|
__ct__3fooFiR3fooT1T2T1T2
|
||||||
|
|
||||||
Note that g++ bases it's type numbers starting at zero and counts all
|
Note that g++ bases its type numbers starting at zero and counts all
|
||||||
previously seen types, while lucid/ARM bases it's type numbers starting
|
previously seen types, while lucid/ARM bases its type numbers starting
|
||||||
at one and only considers types after it has seen the 'F' character
|
at one and only considers types after it has seen the 'F' character
|
||||||
indicating the start of the function args. For lucid/ARM style, we
|
indicating the start of the function args. For lucid/ARM style, we
|
||||||
account for this difference by discarding any previously seen types when
|
account for this difference by discarding any previously seen types when
|
||||||
|
|
|
@ -1541,7 +1541,7 @@ invalidate (x, full_mode)
|
||||||
register unsigned hash = HASH (x, GET_MODE (x));
|
register unsigned hash = HASH (x, GET_MODE (x));
|
||||||
|
|
||||||
/* Remove REGNO from any quantity list it might be on and indicate
|
/* Remove REGNO from any quantity list it might be on and indicate
|
||||||
that it's value might have changed. If it is a pseudo, remove its
|
that its value might have changed. If it is a pseudo, remove its
|
||||||
entry from the hash table.
|
entry from the hash table.
|
||||||
|
|
||||||
For a hard register, we do the first two actions above for any
|
For a hard register, we do the first two actions above for any
|
||||||
|
|
|
@ -1960,7 +1960,7 @@ dbxout_symbol_location (decl, type, suffix, home)
|
||||||
/* Don't mention a variable at all
|
/* Don't mention a variable at all
|
||||||
if it was completely optimized into nothingness.
|
if it was completely optimized into nothingness.
|
||||||
|
|
||||||
If the decl was from an inline function, then it's rtl
|
If the decl was from an inline function, then its rtl
|
||||||
is not identically the rtl that was used in this
|
is not identically the rtl that was used in this
|
||||||
particular compilation. */
|
particular compilation. */
|
||||||
if (GET_CODE (home) == REG)
|
if (GET_CODE (home) == REG)
|
||||||
|
|
|
@ -59,6 +59,9 @@ int
|
||||||
dwarf2out_do_frame ()
|
dwarf2out_do_frame ()
|
||||||
{
|
{
|
||||||
return (write_symbols == DWARF2_DEBUG
|
return (write_symbols == DWARF2_DEBUG
|
||||||
|
#ifdef DWARF2_FRAME_INFO
|
||||||
|
|| DWARF2_FRAME_INFO
|
||||||
|
#endif
|
||||||
#ifdef DWARF2_UNWIND_INFO
|
#ifdef DWARF2_UNWIND_INFO
|
||||||
|| (flag_exceptions && ! exceptions_via_longjmp)
|
|| (flag_exceptions && ! exceptions_via_longjmp)
|
||||||
#endif
|
#endif
|
||||||
|
@ -9188,7 +9191,7 @@ gen_block_die (stmt, context_die, depth)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Generate all of the decls declared within a given scope and (recursively)
|
/* Generate all of the decls declared within a given scope and (recursively)
|
||||||
all of it's sub-blocks. */
|
all of its sub-blocks. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
decls_for_scope (stmt, context_die, depth)
|
decls_for_scope (stmt, context_die, depth)
|
||||||
|
|
|
@ -59,6 +59,7 @@ Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
enum machine_mode byte_mode; /* Mode whose width is BITS_PER_UNIT. */
|
enum machine_mode byte_mode; /* Mode whose width is BITS_PER_UNIT. */
|
||||||
enum machine_mode word_mode; /* Mode whose width is BITS_PER_WORD. */
|
enum machine_mode word_mode; /* Mode whose width is BITS_PER_WORD. */
|
||||||
|
enum machine_mode double_mode; /* Mode whose width is DOUBLE_TYPE_SIZE. */
|
||||||
enum machine_mode ptr_mode; /* Mode whose width is POINTER_SIZE. */
|
enum machine_mode ptr_mode; /* Mode whose width is POINTER_SIZE. */
|
||||||
|
|
||||||
/* This is reset to LAST_VIRTUAL_REGISTER + 1 at the start of each function.
|
/* This is reset to LAST_VIRTUAL_REGISTER + 1 at the start of each function.
|
||||||
|
@ -3385,6 +3386,7 @@ init_emit_once (line_numbers)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
enum machine_mode mode;
|
enum machine_mode mode;
|
||||||
|
enum machine_mode double_mode;
|
||||||
|
|
||||||
no_line_numbers = ! line_numbers;
|
no_line_numbers = ! line_numbers;
|
||||||
|
|
||||||
|
@ -3394,6 +3396,7 @@ init_emit_once (line_numbers)
|
||||||
|
|
||||||
byte_mode = VOIDmode;
|
byte_mode = VOIDmode;
|
||||||
word_mode = VOIDmode;
|
word_mode = VOIDmode;
|
||||||
|
double_mode = VOIDmode;
|
||||||
|
|
||||||
for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
|
for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
|
||||||
mode = GET_MODE_WIDER_MODE (mode))
|
mode = GET_MODE_WIDER_MODE (mode))
|
||||||
|
@ -3407,6 +3410,18 @@ init_emit_once (line_numbers)
|
||||||
word_mode = mode;
|
word_mode = mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef DOUBLE_TYPE_SIZE
|
||||||
|
#define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode;
|
||||||
|
mode = GET_MODE_WIDER_MODE (mode))
|
||||||
|
{
|
||||||
|
if (GET_MODE_BITSIZE (mode) == DOUBLE_TYPE_SIZE
|
||||||
|
&& double_mode == VOIDmode)
|
||||||
|
double_mode = mode;
|
||||||
|
}
|
||||||
|
|
||||||
ptr_mode = mode_for_size (POINTER_SIZE, GET_MODE_CLASS (Pmode), 0);
|
ptr_mode = mode_for_size (POINTER_SIZE, GET_MODE_CLASS (Pmode), 0);
|
||||||
|
|
||||||
/* Create the unique rtx's for certain rtx codes and operand values. */
|
/* Create the unique rtx's for certain rtx codes and operand values. */
|
||||||
|
@ -3424,10 +3439,10 @@ init_emit_once (line_numbers)
|
||||||
else
|
else
|
||||||
const_true_rtx = gen_rtx_CONST_INT (VOIDmode, STORE_FLAG_VALUE);
|
const_true_rtx = gen_rtx_CONST_INT (VOIDmode, STORE_FLAG_VALUE);
|
||||||
|
|
||||||
dconst0 = REAL_VALUE_ATOF ("0", DFmode);
|
dconst0 = REAL_VALUE_ATOF ("0", double_mode);
|
||||||
dconst1 = REAL_VALUE_ATOF ("1", DFmode);
|
dconst1 = REAL_VALUE_ATOF ("1", double_mode);
|
||||||
dconst2 = REAL_VALUE_ATOF ("2", DFmode);
|
dconst2 = REAL_VALUE_ATOF ("2", double_mode);
|
||||||
dconstm1 = REAL_VALUE_ATOF ("-1", DFmode);
|
dconstm1 = REAL_VALUE_ATOF ("-1", double_mode);
|
||||||
|
|
||||||
for (i = 0; i <= 2; i++)
|
for (i = 0; i <= 2; i++)
|
||||||
{
|
{
|
||||||
|
|
16
gcc/expmed.c
16
gcc/expmed.c
|
@ -93,9 +93,10 @@ init_expmed ()
|
||||||
/* Since we are on the permanent obstack, we must be sure we save this
|
/* Since we are on the permanent obstack, we must be sure we save this
|
||||||
spot AFTER we call start_sequence, since it will reuse the rtl it
|
spot AFTER we call start_sequence, since it will reuse the rtl it
|
||||||
makes. */
|
makes. */
|
||||||
|
|
||||||
free_point = (char *) oballoc (0);
|
free_point = (char *) oballoc (0);
|
||||||
|
|
||||||
|
reg = gen_rtx (REG, word_mode, 10000);
|
||||||
|
|
||||||
zero_cost = rtx_cost (const0_rtx, 0);
|
zero_cost = rtx_cost (const0_rtx, 0);
|
||||||
add_cost = rtx_cost (gen_rtx_PLUS (word_mode, reg, reg), SET);
|
add_cost = rtx_cost (gen_rtx_PLUS (word_mode, reg, reg), SET);
|
||||||
|
|
||||||
|
@ -2277,7 +2278,8 @@ expand_mult (mode, op0, op1, target, unsignedp)
|
||||||
rtx shift_subtarget = preserve ? 0 : accum;
|
rtx shift_subtarget = preserve ? 0 : accum;
|
||||||
rtx add_target
|
rtx add_target
|
||||||
= (opno == alg.ops - 1 && target != 0 && variant != add_variant
|
= (opno == alg.ops - 1 && target != 0 && variant != add_variant
|
||||||
? target : 0);
|
&& ! preserve)
|
||||||
|
? target : 0;
|
||||||
rtx accum_target = preserve ? 0 : accum;
|
rtx accum_target = preserve ? 0 : accum;
|
||||||
|
|
||||||
switch (alg.op[opno])
|
switch (alg.op[opno])
|
||||||
|
@ -2746,6 +2748,7 @@ expand_divmod (rem_flag, code, mode, op0, op1, target, unsignedp)
|
||||||
optab optab1, optab2;
|
optab optab1, optab2;
|
||||||
int op1_is_constant, op1_is_pow2;
|
int op1_is_constant, op1_is_pow2;
|
||||||
int max_cost, extra_cost;
|
int max_cost, extra_cost;
|
||||||
|
static HOST_WIDE_INT last_div_const = 0;
|
||||||
|
|
||||||
op1_is_constant = GET_CODE (op1) == CONST_INT;
|
op1_is_constant = GET_CODE (op1) == CONST_INT;
|
||||||
op1_is_pow2 = (op1_is_constant
|
op1_is_pow2 = (op1_is_constant
|
||||||
|
@ -2855,8 +2858,15 @@ expand_divmod (rem_flag, code, mode, op0, op1, target, unsignedp)
|
||||||
size = GET_MODE_BITSIZE (mode);
|
size = GET_MODE_BITSIZE (mode);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Only deduct something for a REM if the last divide done was
|
||||||
|
for a different constant. Then set the constant of the last
|
||||||
|
divide. */
|
||||||
max_cost = div_cost[(int) compute_mode]
|
max_cost = div_cost[(int) compute_mode]
|
||||||
- (rem_flag ? mul_cost[(int) compute_mode] + add_cost : 0);
|
- (rem_flag && ! (last_div_const != 0 && op1_is_constant
|
||||||
|
&& INTVAL (op1) == last_div_const)
|
||||||
|
? mul_cost[(int) compute_mode] + add_cost : 0);
|
||||||
|
|
||||||
|
last_div_const = ! rem_flag && op1_is_constant ? INTVAL (op1) : 0;
|
||||||
|
|
||||||
/* Now convert to the best mode to use. */
|
/* Now convert to the best mode to use. */
|
||||||
if (compute_mode != mode)
|
if (compute_mode != mode)
|
||||||
|
|
60
gcc/expr.c
60
gcc/expr.c
|
@ -239,13 +239,22 @@ init_expr_once ()
|
||||||
{
|
{
|
||||||
rtx insn, pat;
|
rtx insn, pat;
|
||||||
enum machine_mode mode;
|
enum machine_mode mode;
|
||||||
|
rtx mem, mem1;
|
||||||
|
char *free_point;
|
||||||
|
|
||||||
|
start_sequence ();
|
||||||
|
|
||||||
|
/* Since we are on the permanent obstack, we must be sure we save this
|
||||||
|
spot AFTER we call start_sequence, since it will reuse the rtl it
|
||||||
|
makes. */
|
||||||
|
free_point = (char *) oballoc (0);
|
||||||
|
|
||||||
/* Try indexing by frame ptr and try by stack ptr.
|
/* Try indexing by frame ptr and try by stack ptr.
|
||||||
It is known that on the Convex the stack ptr isn't a valid index.
|
It is known that on the Convex the stack ptr isn't a valid index.
|
||||||
With luck, one or the other is valid on any machine. */
|
With luck, one or the other is valid on any machine. */
|
||||||
rtx mem = gen_rtx_MEM (VOIDmode, stack_pointer_rtx);
|
mem = gen_rtx_MEM (VOIDmode, stack_pointer_rtx);
|
||||||
rtx mem1 = gen_rtx_MEM (VOIDmode, frame_pointer_rtx);
|
mem1 = gen_rtx_MEM (VOIDmode, frame_pointer_rtx);
|
||||||
|
|
||||||
start_sequence ();
|
|
||||||
insn = emit_insn (gen_rtx_SET (0, NULL_RTX, NULL_RTX));
|
insn = emit_insn (gen_rtx_SET (0, NULL_RTX, NULL_RTX));
|
||||||
pat = PATTERN (insn);
|
pat = PATTERN (insn);
|
||||||
|
|
||||||
|
@ -296,6 +305,7 @@ init_expr_once ()
|
||||||
}
|
}
|
||||||
|
|
||||||
end_sequence ();
|
end_sequence ();
|
||||||
|
obfree (free_point);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is run at the start of compiling a function. */
|
/* This is run at the start of compiling a function. */
|
||||||
|
@ -5715,13 +5725,26 @@ expand_expr (exp, target, tmode, modifier)
|
||||||
temp = gen_rtx_MEM (mode, op0);
|
temp = gen_rtx_MEM (mode, op0);
|
||||||
/* If address was computed by addition,
|
/* If address was computed by addition,
|
||||||
mark this as an element of an aggregate. */
|
mark this as an element of an aggregate. */
|
||||||
if (TREE_CODE (TREE_OPERAND (exp, 0)) == PLUS_EXPR
|
if (TREE_CODE (exp1) == PLUS_EXPR
|
||||||
|| (TREE_CODE (TREE_OPERAND (exp, 0)) == SAVE_EXPR
|
|| (TREE_CODE (exp1) == SAVE_EXPR
|
||||||
&& TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)) == PLUS_EXPR)
|
&& TREE_CODE (TREE_OPERAND (exp1, 0)) == PLUS_EXPR)
|
||||||
|| AGGREGATE_TYPE_P (TREE_TYPE (exp))
|
|| AGGREGATE_TYPE_P (TREE_TYPE (exp))
|
||||||
|
/* If the pointer is actually a REFERENCE_TYPE, this could
|
||||||
|
be pointing into some aggregate too. */
|
||||||
|
|| TREE_CODE (TREE_TYPE (exp1)) == REFERENCE_TYPE
|
||||||
|| (TREE_CODE (exp1) == ADDR_EXPR
|
|| (TREE_CODE (exp1) == ADDR_EXPR
|
||||||
&& (exp2 = TREE_OPERAND (exp1, 0))
|
&& (exp2 = TREE_OPERAND (exp1, 0))
|
||||||
&& AGGREGATE_TYPE_P (TREE_TYPE (exp2))))
|
&& AGGREGATE_TYPE_P (TREE_TYPE (exp2)))
|
||||||
|
/* This may have been an array reference to the first element
|
||||||
|
that was optimized away from being an addition. */
|
||||||
|
|| (TREE_CODE (exp1) == NOP_EXPR
|
||||||
|
&& ((TREE_CODE (TREE_TYPE (TREE_OPERAND (exp1, 0)))
|
||||||
|
== REFERENCE_TYPE)
|
||||||
|
|| ((TREE_CODE (TREE_TYPE (TREE_OPERAND (exp1, 0)))
|
||||||
|
== POINTER_TYPE)
|
||||||
|
&& (AGGREGATE_TYPE_P
|
||||||
|
(TREE_TYPE (TREE_TYPE
|
||||||
|
(TREE_OPERAND (exp1, 0)))))))))
|
||||||
MEM_IN_STRUCT_P (temp) = 1;
|
MEM_IN_STRUCT_P (temp) = 1;
|
||||||
MEM_VOLATILE_P (temp) = TREE_THIS_VOLATILE (exp) | flag_volatile;
|
MEM_VOLATILE_P (temp) = TREE_THIS_VOLATILE (exp) | flag_volatile;
|
||||||
MEM_ALIAS_SET (temp) = get_alias_set (exp);
|
MEM_ALIAS_SET (temp) = get_alias_set (exp);
|
||||||
|
@ -7916,13 +7939,14 @@ expand_builtin_setjmp (buf_addr, target, first_label, next_label)
|
||||||
|
|
||||||
emit_queue ();
|
emit_queue ();
|
||||||
|
|
||||||
|
/* We store the frame pointer and the address of lab1 in the buffer
|
||||||
|
and use the rest of it for the stack save area, which is
|
||||||
|
machine-dependent. */
|
||||||
|
|
||||||
#ifndef BUILTIN_SETJMP_FRAME_VALUE
|
#ifndef BUILTIN_SETJMP_FRAME_VALUE
|
||||||
#define BUILTIN_SETJMP_FRAME_VALUE virtual_stack_vars_rtx
|
#define BUILTIN_SETJMP_FRAME_VALUE virtual_stack_vars_rtx
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* We store the frame pointer and the address of lab1 in the buffer
|
|
||||||
and use the rest of it for the stack save area, which is
|
|
||||||
machine-dependent. */
|
|
||||||
emit_move_insn (gen_rtx_MEM (Pmode, buf_addr),
|
emit_move_insn (gen_rtx_MEM (Pmode, buf_addr),
|
||||||
BUILTIN_SETJMP_FRAME_VALUE);
|
BUILTIN_SETJMP_FRAME_VALUE);
|
||||||
emit_move_insn (validize_mem
|
emit_move_insn (validize_mem
|
||||||
|
@ -10148,9 +10172,7 @@ do_jump (exp, if_false_label, if_true_label)
|
||||||
{
|
{
|
||||||
tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
|
tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
|
||||||
|
|
||||||
if (integer_zerop (TREE_OPERAND (exp, 1)))
|
if (GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_FLOAT
|
||||||
do_jump (TREE_OPERAND (exp, 0), if_true_label, if_false_label);
|
|
||||||
else if (GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_FLOAT
|
|
||||||
|| GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_INT)
|
|| GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_INT)
|
||||||
{
|
{
|
||||||
tree exp0 = save_expr (TREE_OPERAND (exp, 0));
|
tree exp0 = save_expr (TREE_OPERAND (exp, 0));
|
||||||
|
@ -10174,6 +10196,10 @@ do_jump (exp, if_false_label, if_true_label)
|
||||||
exp1)))))),
|
exp1)))))),
|
||||||
if_false_label, if_true_label);
|
if_false_label, if_true_label);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if (integer_zerop (TREE_OPERAND (exp, 1)))
|
||||||
|
do_jump (TREE_OPERAND (exp, 0), if_true_label, if_false_label);
|
||||||
|
|
||||||
else if (GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_INT
|
else if (GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_INT
|
||||||
&& !can_compare_p (TYPE_MODE (inner_type)))
|
&& !can_compare_p (TYPE_MODE (inner_type)))
|
||||||
do_jump_by_parts_equality (exp, if_false_label, if_true_label);
|
do_jump_by_parts_equality (exp, if_false_label, if_true_label);
|
||||||
|
@ -10186,9 +10212,7 @@ do_jump (exp, if_false_label, if_true_label)
|
||||||
{
|
{
|
||||||
tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
|
tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
|
||||||
|
|
||||||
if (integer_zerop (TREE_OPERAND (exp, 1)))
|
if (GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_FLOAT
|
||||||
do_jump (TREE_OPERAND (exp, 0), if_false_label, if_true_label);
|
|
||||||
else if (GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_FLOAT
|
|
||||||
|| GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_INT)
|
|| GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_INT)
|
||||||
{
|
{
|
||||||
tree exp0 = save_expr (TREE_OPERAND (exp, 0));
|
tree exp0 = save_expr (TREE_OPERAND (exp, 0));
|
||||||
|
@ -10212,6 +10236,10 @@ do_jump (exp, if_false_label, if_true_label)
|
||||||
exp1)))))),
|
exp1)))))),
|
||||||
if_false_label, if_true_label);
|
if_false_label, if_true_label);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if (integer_zerop (TREE_OPERAND (exp, 1)))
|
||||||
|
do_jump (TREE_OPERAND (exp, 0), if_false_label, if_true_label);
|
||||||
|
|
||||||
else if (GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_INT
|
else if (GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_INT
|
||||||
&& !can_compare_p (TYPE_MODE (inner_type)))
|
&& !can_compare_p (TYPE_MODE (inner_type)))
|
||||||
do_jump_by_parts_equality (exp, if_true_label, if_false_label);
|
do_jump_by_parts_equality (exp, if_true_label, if_false_label);
|
||||||
|
|
|
@ -76,8 +76,9 @@ Boston, MA 02111-1307, USA. */
|
||||||
#if defined (USG) || !defined (HAVE_STAB_H)
|
#if defined (USG) || !defined (HAVE_STAB_H)
|
||||||
#include "gstab.h" /* If doing DBX on sysV, use our own stab.h. */
|
#include "gstab.h" /* If doing DBX on sysV, use our own stab.h. */
|
||||||
#else
|
#else
|
||||||
#include <stab.h> /* On BSD, use the system's stab.h. */
|
#include <stab.h>
|
||||||
#endif /* not USG */
|
#endif
|
||||||
|
|
||||||
#endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
|
#endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
|
||||||
|
|
||||||
#ifdef XCOFF_DEBUGGING_INFO
|
#ifdef XCOFF_DEBUGGING_INFO
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Compilation switch flag definitions for GNU CC.
|
/* Compilation switch flag definitions for GNU CC.
|
||||||
Copyright (C) 1987, 88, 94-97, 1998 Free Software Foundation, Inc.
|
Copyright (C) 1987, 88, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU CC.
|
This file is part of GNU CC.
|
||||||
|
|
||||||
|
|
|
@ -2381,7 +2381,7 @@ find_auto_inc (needed, x, insn)
|
||||||
{
|
{
|
||||||
/* We have *p followed sometime later by q = p+size.
|
/* We have *p followed sometime later by q = p+size.
|
||||||
Both p and q must be live afterward,
|
Both p and q must be live afterward,
|
||||||
and q is not used between INSN and it's assignment.
|
and q is not used between INSN and its assignment.
|
||||||
Change it to q = p, ...*q..., q = q+size.
|
Change it to q = p, ...*q..., q = q+size.
|
||||||
Then fall into the usual case. */
|
Then fall into the usual case. */
|
||||||
rtx insns, temp;
|
rtx insns, temp;
|
||||||
|
@ -3132,6 +3132,7 @@ print_rtl_with_bb (outf, rtx_first)
|
||||||
FILE *outf;
|
FILE *outf;
|
||||||
rtx rtx_first;
|
rtx rtx_first;
|
||||||
{
|
{
|
||||||
|
extern int flag_dump_unnumbered;
|
||||||
register rtx tmp_rtx;
|
register rtx tmp_rtx;
|
||||||
|
|
||||||
if (rtx_first == 0)
|
if (rtx_first == 0)
|
||||||
|
@ -3196,6 +3197,8 @@ print_rtl_with_bb (outf, rtx_first)
|
||||||
if ((bb = end[INSN_UID (tmp_rtx)]) >= 0)
|
if ((bb = end[INSN_UID (tmp_rtx)]) >= 0)
|
||||||
fprintf (outf, ";; End of basic block %d\n", bb);
|
fprintf (outf, ";; End of basic block %d\n", bb);
|
||||||
|
|
||||||
|
if (! flag_dump_unnumbered
|
||||||
|
|| GET_CODE (tmp_rtx) != NOTE || NOTE_LINE_NUMBER (tmp_rtx) < 0)
|
||||||
putc ('\n', outf);
|
putc ('\n', outf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3293,14 +3293,16 @@ fold_range_test (exp)
|
||||||
&& operand_equal_p (lhs, rhs, 0))
|
&& operand_equal_p (lhs, rhs, 0))
|
||||||
{
|
{
|
||||||
/* If simple enough, just rewrite. Otherwise, make a SAVE_EXPR
|
/* If simple enough, just rewrite. Otherwise, make a SAVE_EXPR
|
||||||
unless we are at top level, in which case we can't do this. */
|
unless we are at top level or LHS contains a PLACEHOLDER_EXPR, in
|
||||||
|
which cases we can't do this. */
|
||||||
if (simple_operand_p (lhs))
|
if (simple_operand_p (lhs))
|
||||||
return build (TREE_CODE (exp) == TRUTH_ANDIF_EXPR
|
return build (TREE_CODE (exp) == TRUTH_ANDIF_EXPR
|
||||||
? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
|
? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
|
||||||
TREE_TYPE (exp), TREE_OPERAND (exp, 0),
|
TREE_TYPE (exp), TREE_OPERAND (exp, 0),
|
||||||
TREE_OPERAND (exp, 1));
|
TREE_OPERAND (exp, 1));
|
||||||
|
|
||||||
else if (current_function_decl != 0)
|
else if (current_function_decl != 0
|
||||||
|
&& ! contains_placeholder_p (lhs))
|
||||||
{
|
{
|
||||||
tree common = save_expr (lhs);
|
tree common = save_expr (lhs);
|
||||||
|
|
||||||
|
@ -3997,7 +3999,9 @@ fold (expr)
|
||||||
else if ((TREE_CODE (arg1) == COND_EXPR
|
else if ((TREE_CODE (arg1) == COND_EXPR
|
||||||
|| (TREE_CODE_CLASS (TREE_CODE (arg1)) == '<'
|
|| (TREE_CODE_CLASS (TREE_CODE (arg1)) == '<'
|
||||||
&& TREE_CODE_CLASS (code) != '<'))
|
&& TREE_CODE_CLASS (code) != '<'))
|
||||||
&& (! TREE_SIDE_EFFECTS (arg0) || current_function_decl != 0))
|
&& (! TREE_SIDE_EFFECTS (arg0)
|
||||||
|
|| (current_function_decl != 0
|
||||||
|
&& ! contains_placeholder_p (arg0))))
|
||||||
{
|
{
|
||||||
tree test, true_value, false_value;
|
tree test, true_value, false_value;
|
||||||
tree lhs = 0, rhs = 0;
|
tree lhs = 0, rhs = 0;
|
||||||
|
@ -4068,7 +4072,9 @@ fold (expr)
|
||||||
else if ((TREE_CODE (arg0) == COND_EXPR
|
else if ((TREE_CODE (arg0) == COND_EXPR
|
||||||
|| (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<'
|
|| (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<'
|
||||||
&& TREE_CODE_CLASS (code) != '<'))
|
&& TREE_CODE_CLASS (code) != '<'))
|
||||||
&& (! TREE_SIDE_EFFECTS (arg1) || current_function_decl != 0))
|
&& (! TREE_SIDE_EFFECTS (arg1)
|
||||||
|
|| (current_function_decl != 0
|
||||||
|
&& ! contains_placeholder_p (arg1))))
|
||||||
{
|
{
|
||||||
tree test, true_value, false_value;
|
tree test, true_value, false_value;
|
||||||
tree lhs = 0, rhs = 0;
|
tree lhs = 0, rhs = 0;
|
||||||
|
@ -4633,7 +4639,8 @@ fold (expr)
|
||||||
if (real_onep (arg1))
|
if (real_onep (arg1))
|
||||||
return non_lvalue (convert (type, arg0));
|
return non_lvalue (convert (type, arg0));
|
||||||
/* x*2 is x+x */
|
/* x*2 is x+x */
|
||||||
if (! wins && real_twop (arg1) && current_function_decl != 0)
|
if (! wins && real_twop (arg1) && current_function_decl != 0
|
||||||
|
&& ! contains_placeholder_p (arg0))
|
||||||
{
|
{
|
||||||
tree arg = save_expr (arg0);
|
tree arg = save_expr (arg0);
|
||||||
return build (PLUS_EXPR, type, arg, arg);
|
return build (PLUS_EXPR, type, arg, arg);
|
||||||
|
@ -5656,14 +5663,16 @@ fold (expr)
|
||||||
return t1 ? t1 : t;
|
return t1 ? t1 : t;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If this is a comparison of complex values and either or both
|
/* If this is a comparison of complex values and either or both sides
|
||||||
sizes are a COMPLEX_EXPR, it is best to split up the comparisons
|
are a COMPLEX_EXPR or COMPLEX_CST, it is best to split up the
|
||||||
and join them with a TRUTH_ANDIF_EXPR or TRUTH_ORIF_EXPR. This
|
comparisons and join them with a TRUTH_ANDIF_EXPR or TRUTH_ORIF_EXPR.
|
||||||
may prevent needless evaluations. */
|
This may prevent needless evaluations. */
|
||||||
if ((code == EQ_EXPR || code == NE_EXPR)
|
if ((code == EQ_EXPR || code == NE_EXPR)
|
||||||
&& TREE_CODE (TREE_TYPE (arg0)) == COMPLEX_TYPE
|
&& TREE_CODE (TREE_TYPE (arg0)) == COMPLEX_TYPE
|
||||||
&& (TREE_CODE (arg0) == COMPLEX_EXPR
|
&& (TREE_CODE (arg0) == COMPLEX_EXPR
|
||||||
|| TREE_CODE (arg1) == COMPLEX_EXPR))
|
|| TREE_CODE (arg1) == COMPLEX_EXPR
|
||||||
|
|| TREE_CODE (arg0) == COMPLEX_CST
|
||||||
|
|| TREE_CODE (arg1) == COMPLEX_CST))
|
||||||
{
|
{
|
||||||
tree subtype = TREE_TYPE (TREE_TYPE (arg0));
|
tree subtype = TREE_TYPE (TREE_TYPE (arg0));
|
||||||
tree real0, imag0, real1, imag1;
|
tree real0, imag0, real1, imag1;
|
||||||
|
|
|
@ -1375,7 +1375,7 @@ put_var_into_stack (decl)
|
||||||
|
|
||||||
context = decl_function_context (decl);
|
context = decl_function_context (decl);
|
||||||
|
|
||||||
/* Get the current rtl used for this object and it's original mode. */
|
/* Get the current rtl used for this object and its original mode. */
|
||||||
reg = TREE_CODE (decl) == SAVE_EXPR ? SAVE_EXPR_RTL (decl) : DECL_RTL (decl);
|
reg = TREE_CODE (decl) == SAVE_EXPR ? SAVE_EXPR_RTL (decl) : DECL_RTL (decl);
|
||||||
|
|
||||||
/* No need to do anything if decl has no rtx yet
|
/* No need to do anything if decl has no rtx yet
|
||||||
|
@ -4835,7 +4835,7 @@ setjmp_protect (block)
|
||||||
|| (GET_CODE (DECL_RTL (decl)) == MEM
|
|| (GET_CODE (DECL_RTL (decl)) == MEM
|
||||||
&& GET_CODE (XEXP (DECL_RTL (decl), 0)) == ADDRESSOF))
|
&& GET_CODE (XEXP (DECL_RTL (decl), 0)) == ADDRESSOF))
|
||||||
/* If this variable came from an inline function, it must be
|
/* If this variable came from an inline function, it must be
|
||||||
that it's life doesn't overlap the setjmp. If there was a
|
that its life doesn't overlap the setjmp. If there was a
|
||||||
setjmp in the function, it would already be in memory. We
|
setjmp in the function, it would already be in memory. We
|
||||||
must exclude such variable because their DECL_RTL might be
|
must exclude such variable because their DECL_RTL might be
|
||||||
set to strange things such as virtual_stack_vars_rtx. */
|
set to strange things such as virtual_stack_vars_rtx. */
|
||||||
|
|
|
@ -3547,7 +3547,7 @@ be compiled with the same
|
||||||
value.
|
value.
|
||||||
.TP
|
.TP
|
||||||
.B \-nocpp
|
.B \-nocpp
|
||||||
Tell the MIPS assembler to not run it's preprocessor over user
|
Tell the MIPS assembler to not run its preprocessor over user
|
||||||
assembler files (with a `\|\c
|
assembler files (with a `\|\c
|
||||||
.B .s\c
|
.B .s\c
|
||||||
\&\|' suffix) when assembling them.
|
\&\|' suffix) when assembling them.
|
||||||
|
|
|
@ -321,7 +321,7 @@ or with constant text in a single argument.
|
||||||
This allows config.h to specify part of the spec for running as.
|
This allows config.h to specify part of the spec for running as.
|
||||||
%A process ASM_FINAL_SPEC as a spec. A capital A is actually
|
%A process ASM_FINAL_SPEC as a spec. A capital A is actually
|
||||||
used here. This can be used to run a post-processor after the
|
used here. This can be used to run a post-processor after the
|
||||||
assembler has done it's job.
|
assembler has done its job.
|
||||||
%D Dump out a -L option for each directory in startfile_prefixes.
|
%D Dump out a -L option for each directory in startfile_prefixes.
|
||||||
If multilib_dir is set, extra entries are generated with it affixed.
|
If multilib_dir is set, extra entries are generated with it affixed.
|
||||||
%l process LINK_SPEC as a spec.
|
%l process LINK_SPEC as a spec.
|
||||||
|
@ -749,6 +749,12 @@ static int n_default_compilers
|
||||||
/* We want %{T*} after %{L*} and %D so that it can be used to specify linker
|
/* We want %{T*} after %{L*} and %D so that it can be used to specify linker
|
||||||
scripts which exist in user specified directories, or in standard
|
scripts which exist in user specified directories, or in standard
|
||||||
directories. */
|
directories. */
|
||||||
|
#ifdef LINK_COMMAND_SPEC
|
||||||
|
/* Provide option to override link_command_spec from machine specific
|
||||||
|
configuration files. */
|
||||||
|
static char *link_command_spec =
|
||||||
|
LINK_COMMAND_SPEC;
|
||||||
|
#else
|
||||||
#ifdef LINK_LIBGCC_SPECIAL
|
#ifdef LINK_LIBGCC_SPECIAL
|
||||||
/* Don't generate -L options. */
|
/* Don't generate -L options. */
|
||||||
static char *link_command_spec = "\
|
static char *link_command_spec = "\
|
||||||
|
@ -774,6 +780,7 @@ static char *link_command_spec = "\
|
||||||
%{T*}\
|
%{T*}\
|
||||||
\n }}}}}}";
|
\n }}}}}}";
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/* A vector of options to give to the linker.
|
/* A vector of options to give to the linker.
|
||||||
These options are accumulated by %x,
|
These options are accumulated by %x,
|
||||||
|
|
|
@ -341,7 +341,9 @@ static char *alternative_name;
|
||||||
|
|
||||||
int reload_completed = 0;
|
int reload_completed = 0;
|
||||||
|
|
||||||
/* Similarly since PRESERVE_DEATH_INFO_REGNO_P might reference "optimize". */
|
/* Some machines test `optimize' in macros called from rtlanal.c, so we need
|
||||||
|
to define it here. */
|
||||||
|
|
||||||
int optimize = 0;
|
int optimize = 0;
|
||||||
|
|
||||||
/* Simplify an expression. Only call the routine if there is something to
|
/* Simplify an expression. Only call the routine if there is something to
|
||||||
|
@ -2125,7 +2127,7 @@ expand_units ()
|
||||||
if (unit->needs_range_function)
|
if (unit->needs_range_function)
|
||||||
{
|
{
|
||||||
/* Compute the blockage range function and make an attribute
|
/* Compute the blockage range function and make an attribute
|
||||||
for writing it's value. */
|
for writing its value. */
|
||||||
newexp = operate_exp (RANGE_OP, min_blockage, max_blockage);
|
newexp = operate_exp (RANGE_OP, min_blockage, max_blockage);
|
||||||
newexp = simplify_knowing (newexp, unit->condexp);
|
newexp = simplify_knowing (newexp, unit->condexp);
|
||||||
|
|
||||||
|
@ -4404,8 +4406,7 @@ gen_unit (def)
|
||||||
unit->condexp = insert_right_side (IOR, unit->condexp, op->condexp, -2, -2);
|
unit->condexp = insert_right_side (IOR, unit->condexp, op->condexp, -2, -2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Given a piece of RTX, print a C expression to test it's truth value.
|
/* Given a piece of RTX, print a C expression to test its truth value.
|
||||||
|
|
||||||
We use AND and IOR both for logical and bit-wise operations, so
|
We use AND and IOR both for logical and bit-wise operations, so
|
||||||
interpret them as logical unless they are inside a comparison expression.
|
interpret them as logical unless they are inside a comparison expression.
|
||||||
The first bit of FLAGS will be non-zero in that case.
|
The first bit of FLAGS will be non-zero in that case.
|
||||||
|
|
|
@ -38,10 +38,12 @@ int main (argc, argv)
|
||||||
char *argv[];
|
char *argv[];
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
switch (argc)
|
switch (argc)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
usage ();
|
usage ();
|
||||||
exit (1);
|
exit (1);
|
||||||
|
|
|
@ -778,6 +778,7 @@ from the machine description file `md'. */\n\n");
|
||||||
printf ("#include \"insn-config.h\"\n\n");
|
printf ("#include \"insn-config.h\"\n\n");
|
||||||
printf ("#include \"insn-flags.h\"\n\n");
|
printf ("#include \"insn-flags.h\"\n\n");
|
||||||
printf ("#include \"insn-codes.h\"\n\n");
|
printf ("#include \"insn-codes.h\"\n\n");
|
||||||
|
printf ("#include \"reload.h\"\n");
|
||||||
printf ("extern char *insn_operand_constraint[][MAX_RECOG_OPERANDS];\n\n");
|
printf ("extern char *insn_operand_constraint[][MAX_RECOG_OPERANDS];\n\n");
|
||||||
printf ("extern rtx recog_operand[];\n");
|
printf ("extern rtx recog_operand[];\n");
|
||||||
printf ("#define operands emit_operand\n\n");
|
printf ("#define operands emit_operand\n\n");
|
||||||
|
|
|
@ -201,15 +201,18 @@ static char *posixly_correct;
|
||||||
# define my_index strchr
|
# define my_index strchr
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
# if HAVE_STRING_H
|
||||||
|
# include <string.h>
|
||||||
|
# else
|
||||||
|
# include <strings.h>
|
||||||
|
# endif
|
||||||
|
|
||||||
/* Avoid depending on library functions or files
|
/* Avoid depending on library functions or files
|
||||||
whose names are inconsistent. */
|
whose names are inconsistent. */
|
||||||
|
|
||||||
#ifndef getenv
|
#ifndef getenv
|
||||||
extern char *getenv ();
|
extern char *getenv ();
|
||||||
#endif
|
#endif
|
||||||
#ifndef strncmp
|
|
||||||
extern int strncmp ();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
my_index (str, chr)
|
my_index (str, chr)
|
||||||
|
|
|
@ -199,6 +199,14 @@ threads implementation available, in which case threads can be enabled
|
||||||
with this option by supplying a suitable @var{type}, probably
|
with this option by supplying a suitable @var{type}, probably
|
||||||
@samp{posix}. The possibilities for @var{type} are @samp{single},
|
@samp{posix}. The possibilities for @var{type} are @samp{single},
|
||||||
@samp{posix}, @samp{win32}, @samp{solaris}, @samp{irix} and @samp{mach}.
|
@samp{posix}, @samp{win32}, @samp{solaris}, @samp{irix} and @samp{mach}.
|
||||||
|
|
||||||
|
@cindex Internal Compiler Checking
|
||||||
|
@item --enable-checking
|
||||||
|
When you specify this option, the compiler is built to perform checking
|
||||||
|
of tree node types when referencing fields of that node. This does not
|
||||||
|
change the generated code, but adds error checking within the compiler.
|
||||||
|
This will slow down the compiler and may only work properly if you
|
||||||
|
are building the compiler with GNU C.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
The @file{configure} script searches subdirectories of the source
|
The @file{configure} script searches subdirectories of the source
|
||||||
|
@ -946,7 +954,9 @@ highly recommend using GAS for all HP-PA configurations.
|
||||||
You should be using GAS-2.6 (or later) along with GDB-4.16 (or later). These
|
You should be using GAS-2.6 (or later) along with GDB-4.16 (or later). These
|
||||||
can be retrieved from all the traditional GNU ftp archive sites.
|
can be retrieved from all the traditional GNU ftp archive sites.
|
||||||
|
|
||||||
GAS will need to be installed into a directory before @code{/bin},
|
On some versions of HP-UX, you will need to install GNU @file{sed}.
|
||||||
|
|
||||||
|
You will need to be install GAS into a directory before @code{/bin},
|
||||||
@code{/usr/bin}, and @code{/usr/ccs/bin} in your search path. You
|
@code{/usr/bin}, and @code{/usr/ccs/bin} in your search path. You
|
||||||
should install GAS before you build GNU CC.
|
should install GAS before you build GNU CC.
|
||||||
|
|
||||||
|
@ -1013,10 +1023,8 @@ GNU binutils version 2.2 or later.
|
||||||
Go to the Berkeley universe before compiling.
|
Go to the Berkeley universe before compiling.
|
||||||
|
|
||||||
@item i386-sequent-ptx1*
|
@item i386-sequent-ptx1*
|
||||||
Sequent DYNIX/ptx 1.x.
|
@itemx i386-sequent-ptx2*
|
||||||
|
You must install GNU @file{sed} before running @file{configure}.
|
||||||
@item i386-sequent-ptx2*
|
|
||||||
Sequent DYNIX/ptx 2.x.
|
|
||||||
|
|
||||||
@item i386-sun-sunos4
|
@item i386-sun-sunos4
|
||||||
You may find that you need another version of GNU CC to begin
|
You may find that you need another version of GNU CC to begin
|
||||||
|
@ -1219,8 +1227,8 @@ PHCO_4484 from HP.
|
||||||
In addition, if you wish to use gas @samp{--with-gnu-as} you must use
|
In addition, if you wish to use gas @samp{--with-gnu-as} you must use
|
||||||
gas version 2.1 or later, and you must use the GNU linker version 2.1 or
|
gas version 2.1 or later, and you must use the GNU linker version 2.1 or
|
||||||
later. Earlier versions of gas relied upon a program which converted the
|
later. Earlier versions of gas relied upon a program which converted the
|
||||||
gas output into the native HP/UX format, but that program has not been
|
gas output into the native HP-UX format, but that program has not been
|
||||||
kept up to date. gdb does not understand that native HP/UX format, so
|
kept up to date. gdb does not understand that native HP-UX format, so
|
||||||
you must use gas if you wish to use gdb.
|
you must use gas if you wish to use gdb.
|
||||||
|
|
||||||
@item m68k-sun
|
@item m68k-sun
|
||||||
|
|
|
@ -145,7 +145,7 @@ in the following sections.
|
||||||
@item Optimization Options
|
@item Optimization Options
|
||||||
@xref{Optimize Options,,Options that Control Optimization}.
|
@xref{Optimize Options,,Options that Control Optimization}.
|
||||||
@smallexample
|
@smallexample
|
||||||
-fbranch-probabilities
|
-fbranch-probabilities -foptimize-register-moves
|
||||||
-fcaller-saves -fcse-follow-jumps -fcse-skip-blocks
|
-fcaller-saves -fcse-follow-jumps -fcse-skip-blocks
|
||||||
-fdelayed-branch -fexpensive-optimizations
|
-fdelayed-branch -fexpensive-optimizations
|
||||||
-ffast-math -ffloat-store -fforce-addr -fforce-mem
|
-ffast-math -ffloat-store -fforce-addr -fforce-mem
|
||||||
|
@ -2312,6 +2312,17 @@ This pass also performs global constant and copy propagation.
|
||||||
@item -fexpensive-optimizations
|
@item -fexpensive-optimizations
|
||||||
Perform a number of minor optimizations that are relatively expensive.
|
Perform a number of minor optimizations that are relatively expensive.
|
||||||
|
|
||||||
|
@item -foptimize-register-moves
|
||||||
|
@item -fregmove
|
||||||
|
Attempt to reassign register numbers in move instructions and as
|
||||||
|
operands of other simple instructions in order to maximize the amount of
|
||||||
|
register tying. This is especially helpfu on machines with two-operand
|
||||||
|
instructions. GNU CC enables this optimization by default with @samp{-O2}
|
||||||
|
or higher.
|
||||||
|
|
||||||
|
Note @code{-fregmove} and @code{-foptimize-register-moves} are the same
|
||||||
|
optimization.
|
||||||
|
|
||||||
@item -fdelayed-branch
|
@item -fdelayed-branch
|
||||||
If supported for the target machine, attempt to reorder instructions
|
If supported for the target machine, attempt to reorder instructions
|
||||||
to exploit instruction slots available after delayed branch
|
to exploit instruction slots available after delayed branch
|
||||||
|
@ -2413,12 +2424,6 @@ branch is mostly to take, the @samp{REG_BR_PROB} values are used to
|
||||||
exactly determine which path is taken more often.
|
exactly determine which path is taken more often.
|
||||||
@end ifset
|
@end ifset
|
||||||
|
|
||||||
@item -fregmove
|
|
||||||
Some machines only support 2 operands per instruction. On such
|
|
||||||
machines, GNU CC might have to do extra copies. The @samp{-fregmove}
|
|
||||||
option overrides the default for the machine to do the copy before
|
|
||||||
register allocation.
|
|
||||||
|
|
||||||
@item -fstrict-aliasing
|
@item -fstrict-aliasing
|
||||||
Allows the compiler to assume the strictest aliasing rules applicable to
|
Allows the compiler to assume the strictest aliasing rules applicable to
|
||||||
the language being compiled. For C (and C++), this activates
|
the language being compiled. For C (and C++), this activates
|
||||||
|
@ -4865,7 +4870,7 @@ All modules should be compiled with the same @samp{-G @var{num}}
|
||||||
value.
|
value.
|
||||||
|
|
||||||
@item -nocpp
|
@item -nocpp
|
||||||
Tell the MIPS assembler to not run it's preprocessor over user
|
Tell the MIPS assembler to not run its preprocessor over user
|
||||||
assembler files (with a @samp{.s} suffix) when assembling them.
|
assembler files (with a @samp{.s} suffix) when assembling them.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
|
|
|
@ -937,7 +937,7 @@ enum alloc_type {
|
||||||
grow linearly, and which are written in the object file as sequential
|
grow linearly, and which are written in the object file as sequential
|
||||||
pages. On systems with a BSD malloc that define USE_MALLOC, the
|
pages. On systems with a BSD malloc that define USE_MALLOC, the
|
||||||
MAX_CLUSTER_PAGES should be 1 less than a power of two, since malloc
|
MAX_CLUSTER_PAGES should be 1 less than a power of two, since malloc
|
||||||
adds it's overhead, and rounds up to the next power of 2. Pages are
|
adds its overhead, and rounds up to the next power of 2. Pages are
|
||||||
linked together via a linked list.
|
linked together via a linked list.
|
||||||
|
|
||||||
If PAGE_SIZE is > 4096, the string length in the shash_t structure
|
If PAGE_SIZE is > 4096, the string length in the shash_t structure
|
||||||
|
@ -5113,7 +5113,7 @@ out_of_bounds (indx, max, str, prog_line)
|
||||||
|
|
||||||
|
|
||||||
/* Allocate a cluster of pages. USE_MALLOC says that malloc does not
|
/* Allocate a cluster of pages. USE_MALLOC says that malloc does not
|
||||||
like sbrk's behind it's back (or sbrk isn't available). If we use
|
like sbrk's behind its back (or sbrk isn't available). If we use
|
||||||
sbrk, we assume it gives us zeroed pages. */
|
sbrk, we assume it gives us zeroed pages. */
|
||||||
|
|
||||||
#ifndef MALLOC_CHECK
|
#ifndef MALLOC_CHECK
|
||||||
|
|
|
@ -301,7 +301,7 @@ struct objc_protocol_list {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** The class number of this class. This must be the same for both the
|
** The class number of this class. This must be the same for both the
|
||||||
** class and it's meta class object
|
** class and its meta class object
|
||||||
*/
|
*/
|
||||||
#define CLS_GETNUMBER(cls) (__CLS_INFO(cls) >> (HOST_BITS_PER_LONG/2))
|
#define CLS_GETNUMBER(cls) (__CLS_INFO(cls) >> (HOST_BITS_PER_LONG/2))
|
||||||
#define CLS_SETNUMBER(cls, num) \
|
#define CLS_SETNUMBER(cls, num) \
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* GNU Objective C Runtime message lookup
|
/* GNU Objective C Runtime message lookup
|
||||||
Copyright (C) 1993, 1995, 1996, 1997 Free Software Foundation, Inc.
|
Copyright (C) 1993, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
Contributed by Kresten Krab Thorup
|
Contributed by Kresten Krab Thorup
|
||||||
|
|
||||||
This file is part of GNU CC.
|
This file is part of GNU CC.
|
||||||
|
@ -343,7 +343,7 @@ __objc_install_dispatch_table_for_class (Class class)
|
||||||
{
|
{
|
||||||
Class super;
|
Class super;
|
||||||
|
|
||||||
/* If the class has not yet had it's class links resolved, we must
|
/* If the class has not yet had its class links resolved, we must
|
||||||
re-compute all class links */
|
re-compute all class links */
|
||||||
if(!CLS_ISRESOLV(class))
|
if(!CLS_ISRESOLV(class))
|
||||||
__objc_resolve_class_links();
|
__objc_resolve_class_links();
|
||||||
|
|
|
@ -53,6 +53,7 @@ static int indent;
|
||||||
|
|
||||||
extern char **insn_name_ptr;
|
extern char **insn_name_ptr;
|
||||||
|
|
||||||
|
int flag_dump_unnumbered = 0;
|
||||||
/* Print IN_RTX onto OUTFILE. This is the recursive part of printing. */
|
/* Print IN_RTX onto OUTFILE. This is the recursive part of printing. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -205,6 +206,9 @@ print_rtx (in_rtx)
|
||||||
fputc (' ', outfile);
|
fputc (' ', outfile);
|
||||||
DEBUG_PRINT_REG (in_rtx, 0, outfile);
|
DEBUG_PRINT_REG (in_rtx, 0, outfile);
|
||||||
}
|
}
|
||||||
|
else if (flag_dump_unnumbered
|
||||||
|
&& (is_insn || GET_CODE (in_rtx) == NOTE))
|
||||||
|
fprintf (outfile, "#");
|
||||||
else
|
else
|
||||||
fprintf (outfile, " %d", value);
|
fprintf (outfile, " %d", value);
|
||||||
}
|
}
|
||||||
|
@ -227,7 +231,12 @@ print_rtx (in_rtx)
|
||||||
|
|
||||||
case 'u':
|
case 'u':
|
||||||
if (XEXP (in_rtx, i) != NULL)
|
if (XEXP (in_rtx, i) != NULL)
|
||||||
|
{
|
||||||
|
if (flag_dump_unnumbered)
|
||||||
|
fprintf (outfile, "#");
|
||||||
|
else
|
||||||
fprintf (outfile, " %d", INSN_UID (XEXP (in_rtx, i)));
|
fprintf (outfile, " %d", INSN_UID (XEXP (in_rtx, i)));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
fprintf (outfile, " 0");
|
fprintf (outfile, " 0");
|
||||||
sawclose = 0;
|
sawclose = 0;
|
||||||
|
@ -380,10 +389,15 @@ print_rtl (outf, rtx_first)
|
||||||
case CODE_LABEL:
|
case CODE_LABEL:
|
||||||
case BARRIER:
|
case BARRIER:
|
||||||
for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
|
for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
|
||||||
|
{
|
||||||
|
if (! flag_dump_unnumbered
|
||||||
|
|| GET_CODE (tmp_rtx) != NOTE
|
||||||
|
|| NOTE_LINE_NUMBER (tmp_rtx) < 0)
|
||||||
{
|
{
|
||||||
print_rtx (tmp_rtx);
|
print_rtx (tmp_rtx);
|
||||||
fprintf (outfile, "\n");
|
fprintf (outfile, "\n");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -400,6 +414,10 @@ print_rtl_single (outf, x)
|
||||||
{
|
{
|
||||||
outfile = outf;
|
outfile = outf;
|
||||||
sawclose = 0;
|
sawclose = 0;
|
||||||
|
if (! flag_dump_unnumbered
|
||||||
|
|| GET_CODE (x) != NOTE || NOTE_LINE_NUMBER (x) < 0)
|
||||||
|
{
|
||||||
print_rtx (x);
|
print_rtx (x);
|
||||||
putc ('\n', outf);
|
putc ('\n', outf);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1917,7 +1917,7 @@ save_def_or_dec (l, is_syscalls)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Handle a special case. If we have a function definition marked as
|
/* Handle a special case. If we have a function definition marked as
|
||||||
being in "old" style, and if it's formal names list is empty, then
|
being in "old" style, and if its formal names list is empty, then
|
||||||
it may actually have the string "void" in its real formals list
|
it may actually have the string "void" in its real formals list
|
||||||
in the original source code. Just to make sure, we will get setup
|
in the original source code. Just to make sure, we will get setup
|
||||||
to convert such things anyway.
|
to convert such things anyway.
|
||||||
|
@ -2767,7 +2767,7 @@ connect_defs_and_decs (hp)
|
||||||
|
|
||||||
Also, for each item which is only a function declaration, but which
|
Also, for each item which is only a function declaration, but which
|
||||||
nonetheless has its own prototype already (obviously supplied by the user)
|
nonetheless has its own prototype already (obviously supplied by the user)
|
||||||
declare the item as it's own definition.
|
declare the item as its own definition.
|
||||||
|
|
||||||
Note that when/if there are multiple user-supplied prototypes already
|
Note that when/if there are multiple user-supplied prototypes already
|
||||||
present for multiple declarations of any given function, these multiple
|
present for multiple declarations of any given function, these multiple
|
||||||
|
|
28
gcc/real.c
28
gcc/real.c
|
@ -51,7 +51,7 @@ XFmode and TFmode transcendental functions, can be obtained by ftp from
|
||||||
netlib.att.com: netlib/cephes. */
|
netlib.att.com: netlib/cephes. */
|
||||||
|
|
||||||
/* Type of computer arithmetic.
|
/* Type of computer arithmetic.
|
||||||
Only one of DEC, IBM, IEEE, or UNK should get defined.
|
Only one of DEC, IBM, IEEE, C4X, or UNK should get defined.
|
||||||
|
|
||||||
`IEEE', when REAL_WORDS_BIG_ENDIAN is non-zero, refers generically
|
`IEEE', when REAL_WORDS_BIG_ENDIAN is non-zero, refers generically
|
||||||
to big-endian IEEE floating-point data structure. This definition
|
to big-endian IEEE floating-point data structure. This definition
|
||||||
|
@ -76,6 +76,11 @@ netlib.att.com: netlib/cephes. */
|
||||||
no type wider than DFmode. The IBM conversions were contributed by
|
no type wider than DFmode. The IBM conversions were contributed by
|
||||||
frank@atom.ansto.gov.au (Frank Crawford).
|
frank@atom.ansto.gov.au (Frank Crawford).
|
||||||
|
|
||||||
|
`C4X' refers specifically to the floating point format used on
|
||||||
|
Texas Instruments TMS320C3x and TMS320C4x digital signal
|
||||||
|
processors. This supports QFmode (32-bit float, double) and HFmode
|
||||||
|
(40-bit long double) where BITS_PER_BYTE is 32.
|
||||||
|
|
||||||
If LONG_DOUBLE_TYPE_SIZE = 64 (the default, unless tm.h defines it)
|
If LONG_DOUBLE_TYPE_SIZE = 64 (the default, unless tm.h defines it)
|
||||||
then `long double' and `double' are both implemented, but they
|
then `long double' and `double' are both implemented, but they
|
||||||
both mean DFmode. In this case, the software floating-point
|
both mean DFmode. In this case, the software floating-point
|
||||||
|
@ -686,7 +691,16 @@ ereal_atof (s, t)
|
||||||
|
|
||||||
switch (t)
|
switch (t)
|
||||||
{
|
{
|
||||||
|
#ifdef C4X
|
||||||
|
case QFmode:
|
||||||
case HFmode:
|
case HFmode:
|
||||||
|
asctoe53 (s, tem);
|
||||||
|
e53toe (tem, e);
|
||||||
|
break;
|
||||||
|
#else
|
||||||
|
case HFmode:
|
||||||
|
#endif
|
||||||
|
|
||||||
case SFmode:
|
case SFmode:
|
||||||
asctoe24 (s, tem);
|
asctoe24 (s, tem);
|
||||||
e24toe (tem, e);
|
e24toe (tem, e);
|
||||||
|
@ -1045,11 +1059,21 @@ real_value_truncate (mode, arg)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SFmode:
|
case SFmode:
|
||||||
|
#ifndef C4X
|
||||||
case HFmode:
|
case HFmode:
|
||||||
|
#endif
|
||||||
etoe24 (e, t);
|
etoe24 (e, t);
|
||||||
e24toe (t, t);
|
e24toe (t, t);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifdef C4X
|
||||||
|
case HFmode:
|
||||||
|
case QFmode:
|
||||||
|
etoe53 (e, t);
|
||||||
|
e53toe (t, t);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
case SImode:
|
case SImode:
|
||||||
r = etrunci (arg);
|
r = etrunci (arg);
|
||||||
return (r);
|
return (r);
|
||||||
|
@ -3714,7 +3738,7 @@ toe53 (x, y)
|
||||||
|
|
||||||
#else /* it's neither DEC nor IBM */
|
#else /* it's neither DEC nor IBM */
|
||||||
#ifdef C4X
|
#ifdef C4X
|
||||||
/* Convert e-type X to C4X-format double E. */
|
/* Convert e-type X to C4X-format long double E. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
etoe53 (x, e)
|
etoe53 (x, e)
|
||||||
|
|
|
@ -439,7 +439,7 @@ init_regs ()
|
||||||
memory_move_secondary_cost. */
|
memory_move_secondary_cost. */
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < MAX_MACHINE_MODE; i++)
|
for (i = 0; i < MAX_MACHINE_MODE; i++)
|
||||||
top_of_stack[i] = gen_rtx (MEM, i, stack_pointer_rtx);
|
top_of_stack[i] = gen_rtx_MEM (i, stack_pointer_rtx);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
29
gcc/reload.c
29
gcc/reload.c
|
@ -2344,6 +2344,9 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
|
||||||
rtx set = single_set (insn);
|
rtx set = single_set (insn);
|
||||||
int goal_earlyclobber, this_earlyclobber;
|
int goal_earlyclobber, this_earlyclobber;
|
||||||
enum machine_mode operand_mode[MAX_RECOG_OPERANDS];
|
enum machine_mode operand_mode[MAX_RECOG_OPERANDS];
|
||||||
|
/* Cache the last regno for the last pseudo we did an output reload
|
||||||
|
for in case the next insn uses it. */
|
||||||
|
static int last_output_reload_regno = -1;
|
||||||
|
|
||||||
this_insn = insn;
|
this_insn = insn;
|
||||||
this_insn_is_asm = 0; /* Tentative. */
|
this_insn_is_asm = 0; /* Tentative. */
|
||||||
|
@ -3219,6 +3222,15 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
|
||||||
&& this_alternative_matches[i] < 0)
|
&& this_alternative_matches[i] < 0)
|
||||||
bad = 1;
|
bad = 1;
|
||||||
|
|
||||||
|
/* If this is a pseudo-register that is set in the previous
|
||||||
|
insns, there's a good chance that it will already be in a
|
||||||
|
spill register and we can use that spill register. So
|
||||||
|
make this case cheaper. */
|
||||||
|
if (GET_CODE (operand) == REG
|
||||||
|
&& REGNO (operand) >= FIRST_PSEUDO_REGISTER
|
||||||
|
&& REGNO (operand) == last_output_reload_regno)
|
||||||
|
reject--;
|
||||||
|
|
||||||
/* If this is a constant that is reloaded into the desired
|
/* If this is a constant that is reloaded into the desired
|
||||||
class by copying it to memory first, count that as another
|
class by copying it to memory first, count that as another
|
||||||
reload. This is consistent with other code and is
|
reload. This is consistent with other code and is
|
||||||
|
@ -3615,6 +3627,7 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
|
||||||
reload_earlyclobbers[n_earlyclobbers++] = recog_operand[i];
|
reload_earlyclobbers[n_earlyclobbers++] = recog_operand[i];
|
||||||
|
|
||||||
/* Now record reloads for all the operands that need them. */
|
/* Now record reloads for all the operands that need them. */
|
||||||
|
last_output_reload_regno = -1;
|
||||||
for (i = 0; i < noperands; i++)
|
for (i = 0; i < noperands; i++)
|
||||||
if (! goal_alternative_win[i])
|
if (! goal_alternative_win[i])
|
||||||
{
|
{
|
||||||
|
@ -3661,12 +3674,15 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (goal_alternative_matched[i] == -1)
|
else if (goal_alternative_matched[i] == -1)
|
||||||
|
{
|
||||||
operand_reloadnum[i]
|
operand_reloadnum[i]
|
||||||
= push_reload (modified[i] != RELOAD_WRITE ? recog_operand[i] : 0,
|
= push_reload ((modified[i] != RELOAD_WRITE
|
||||||
|
? recog_operand[i] : 0),
|
||||||
modified[i] != RELOAD_READ ? recog_operand[i] : 0,
|
modified[i] != RELOAD_READ ? recog_operand[i] : 0,
|
||||||
(modified[i] != RELOAD_WRITE
|
(modified[i] != RELOAD_WRITE
|
||||||
? recog_operand_loc[i] : 0),
|
? recog_operand_loc[i] : 0),
|
||||||
modified[i] != RELOAD_READ ? recog_operand_loc[i] : 0,
|
(modified[i] != RELOAD_READ
|
||||||
|
? recog_operand_loc[i] : 0),
|
||||||
(enum reg_class) goal_alternative[i],
|
(enum reg_class) goal_alternative[i],
|
||||||
(modified[i] == RELOAD_WRITE
|
(modified[i] == RELOAD_WRITE
|
||||||
? VOIDmode : operand_mode[i]),
|
? VOIDmode : operand_mode[i]),
|
||||||
|
@ -3675,6 +3691,10 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
|
||||||
(insn_code_number < 0 ? 0
|
(insn_code_number < 0 ? 0
|
||||||
: insn_operand_strict_low[insn_code_number][i]),
|
: insn_operand_strict_low[insn_code_number][i]),
|
||||||
0, i, operand_type[i]);
|
0, i, operand_type[i]);
|
||||||
|
if (modified[i] != RELOAD_READ
|
||||||
|
&& GET_CODE (recog_operand[i]) == REG)
|
||||||
|
last_output_reload_regno = REGNO (recog_operand[i]);
|
||||||
|
}
|
||||||
/* In a matching pair of operands, one must be input only
|
/* In a matching pair of operands, one must be input only
|
||||||
and the other must be output only.
|
and the other must be output only.
|
||||||
Pass the input operand as IN and the other as OUT. */
|
Pass the input operand as IN and the other as OUT. */
|
||||||
|
@ -3691,6 +3711,9 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
|
||||||
operand_mode[goal_alternative_matched[i]],
|
operand_mode[goal_alternative_matched[i]],
|
||||||
0, 0, i, RELOAD_OTHER);
|
0, 0, i, RELOAD_OTHER);
|
||||||
operand_reloadnum[goal_alternative_matched[i]] = output_reloadnum;
|
operand_reloadnum[goal_alternative_matched[i]] = output_reloadnum;
|
||||||
|
if (GET_CODE (recog_operand[goal_alternative_matched[i]]) == REG)
|
||||||
|
last_output_reload_regno
|
||||||
|
= REGNO (recog_operand[goal_alternative_matched[i]]);
|
||||||
}
|
}
|
||||||
else if (modified[i] == RELOAD_WRITE
|
else if (modified[i] == RELOAD_WRITE
|
||||||
&& modified[goal_alternative_matched[i]] == RELOAD_READ)
|
&& modified[goal_alternative_matched[i]] == RELOAD_READ)
|
||||||
|
@ -3705,6 +3728,8 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
|
||||||
operand_mode[i],
|
operand_mode[i],
|
||||||
0, 0, i, RELOAD_OTHER);
|
0, 0, i, RELOAD_OTHER);
|
||||||
operand_reloadnum[i] = output_reloadnum;
|
operand_reloadnum[i] = output_reloadnum;
|
||||||
|
if (GET_CODE (recog_operand[i]) == REG)
|
||||||
|
last_output_reload_regno = REGNO (recog_operand[i]);
|
||||||
}
|
}
|
||||||
else if (insn_code_number >= 0)
|
else if (insn_code_number >= 0)
|
||||||
abort ();
|
abort ();
|
||||||
|
|
|
@ -2080,13 +2080,20 @@ reload (first, global, dumpfile)
|
||||||
{
|
{
|
||||||
rtx addr = 0;
|
rtx addr = 0;
|
||||||
int in_struct = 0;
|
int in_struct = 0;
|
||||||
if (reg_equiv_mem[i])
|
int is_readonly = 0;
|
||||||
|
|
||||||
|
if (reg_equiv_memory_loc[i])
|
||||||
{
|
{
|
||||||
addr = XEXP (reg_equiv_mem[i], 0);
|
in_struct = MEM_IN_STRUCT_P (reg_equiv_memory_loc[i]);
|
||||||
in_struct = MEM_IN_STRUCT_P (reg_equiv_mem[i]);
|
is_readonly = RTX_UNCHANGING_P (reg_equiv_memory_loc[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (reg_equiv_mem[i])
|
||||||
|
addr = XEXP (reg_equiv_mem[i], 0);
|
||||||
|
|
||||||
if (reg_equiv_address[i])
|
if (reg_equiv_address[i])
|
||||||
addr = reg_equiv_address[i];
|
addr = reg_equiv_address[i];
|
||||||
|
|
||||||
if (addr)
|
if (addr)
|
||||||
{
|
{
|
||||||
if (reg_renumber[i] < 0)
|
if (reg_renumber[i] < 0)
|
||||||
|
@ -2094,6 +2101,7 @@ reload (first, global, dumpfile)
|
||||||
rtx reg = regno_reg_rtx[i];
|
rtx reg = regno_reg_rtx[i];
|
||||||
XEXP (reg, 0) = addr;
|
XEXP (reg, 0) = addr;
|
||||||
REG_USERVAR_P (reg) = 0;
|
REG_USERVAR_P (reg) = 0;
|
||||||
|
RTX_UNCHANGING_P (reg) = is_readonly;
|
||||||
MEM_IN_STRUCT_P (reg) = in_struct;
|
MEM_IN_STRUCT_P (reg) = in_struct;
|
||||||
/* We have no alias information about this newly created
|
/* We have no alias information about this newly created
|
||||||
MEM. */
|
MEM. */
|
||||||
|
@ -2565,6 +2573,13 @@ alter_reg (i, from_reg)
|
||||||
{
|
{
|
||||||
x = gen_rtx_MEM (GET_MODE (regno_reg_rtx[i]),
|
x = gen_rtx_MEM (GET_MODE (regno_reg_rtx[i]),
|
||||||
plus_constant (XEXP (x, 0), adjust));
|
plus_constant (XEXP (x, 0), adjust));
|
||||||
|
|
||||||
|
/* If this was shared among registers, must ensure we never
|
||||||
|
set it readonly since that can cause scheduling
|
||||||
|
problems. Note we would only have in this adjustment
|
||||||
|
case in any event, since the code above doesn't set it. */
|
||||||
|
|
||||||
|
if (from_reg == -1)
|
||||||
RTX_UNCHANGING_P (x) = RTX_UNCHANGING_P (regno_reg_rtx[i]);
|
RTX_UNCHANGING_P (x) = RTX_UNCHANGING_P (regno_reg_rtx[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -579,7 +579,7 @@ mark_set_resources (x, res, in_dest, include_delayed_effects)
|
||||||
SET_HARD_REG_SET (res->regs);
|
SET_HARD_REG_SET (res->regs);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ... and also what it's RTL says it modifies, if anything. */
|
/* ... and also what its RTL says it modifies, if anything. */
|
||||||
|
|
||||||
case JUMP_INSN:
|
case JUMP_INSN:
|
||||||
case INSN:
|
case INSN:
|
||||||
|
@ -983,7 +983,7 @@ add_to_delay_list (insn, delay_list)
|
||||||
rtx delay_list;
|
rtx delay_list;
|
||||||
{
|
{
|
||||||
/* If we have an empty list, just make a new list element. If
|
/* If we have an empty list, just make a new list element. If
|
||||||
INSN has it's block number recorded, clear it since we may
|
INSN has its block number recorded, clear it since we may
|
||||||
be moving the insn to a new block. */
|
be moving the insn to a new block. */
|
||||||
|
|
||||||
if (delay_list == 0)
|
if (delay_list == 0)
|
||||||
|
|
|
@ -955,10 +955,8 @@ extern int side_effects_p PROTO((rtx));
|
||||||
extern int volatile_refs_p PROTO((rtx));
|
extern int volatile_refs_p PROTO((rtx));
|
||||||
extern int volatile_insn_p PROTO((rtx));
|
extern int volatile_insn_p PROTO((rtx));
|
||||||
extern void remove_note PROTO((rtx, rtx));
|
extern void remove_note PROTO((rtx, rtx));
|
||||||
extern void note_stores PROTO((rtx, void (*) (rtx, rtx)));
|
|
||||||
extern int refers_to_regno_p PROTO((int, int, rtx, rtx *));
|
extern int refers_to_regno_p PROTO((int, int, rtx, rtx *));
|
||||||
extern int reg_overlap_mentioned_p PROTO((rtx, rtx));
|
extern int reg_overlap_mentioned_p PROTO((rtx, rtx));
|
||||||
extern rtx find_use_as_address PROTO((rtx, rtx, HOST_WIDE_INT));
|
|
||||||
|
|
||||||
/* Functions in rtlanal.c */
|
/* Functions in rtlanal.c */
|
||||||
|
|
||||||
|
@ -980,6 +978,8 @@ extern rtx single_set PROTO((rtx));
|
||||||
extern rtx find_last_value PROTO((rtx, rtx *, rtx));
|
extern rtx find_last_value PROTO((rtx, rtx *, rtx));
|
||||||
extern int refers_to_regno_p PROTO((int, int, rtx, rtx *));
|
extern int refers_to_regno_p PROTO((int, int, rtx, rtx *));
|
||||||
extern int reg_overlap_mentioned_p PROTO((rtx, rtx));
|
extern int reg_overlap_mentioned_p PROTO((rtx, rtx));
|
||||||
|
extern rtx find_use_as_address PROTO((rtx, rtx, HOST_WIDE_INT));
|
||||||
|
extern void note_stores PROTO((rtx, void (*)()));
|
||||||
extern rtx reg_set_last PROTO((rtx, rtx));
|
extern rtx reg_set_last PROTO((rtx, rtx));
|
||||||
extern int rtx_equal_p PROTO((rtx, rtx));
|
extern int rtx_equal_p PROTO((rtx, rtx));
|
||||||
extern int dead_or_set_p PROTO((rtx, rtx));
|
extern int dead_or_set_p PROTO((rtx, rtx));
|
||||||
|
|
657
gcc/texinfo.tex
657
gcc/texinfo.tex
|
@ -25,21 +25,19 @@
|
||||||
%
|
%
|
||||||
% Please try the latest version of texinfo.tex before submitting bug
|
% Please try the latest version of texinfo.tex before submitting bug
|
||||||
% reports; you can get the latest version from:
|
% reports; you can get the latest version from:
|
||||||
% /home/gd/gnu/doc/texinfo.tex on the GNU machines.
|
|
||||||
% ftp://ftp.gnu.org/pub/gnu/texinfo.tex
|
% ftp://ftp.gnu.org/pub/gnu/texinfo.tex
|
||||||
% (and all GNU mirrors)
|
% /home/gd/gnu/doc/texinfo.tex on the GNU machines.
|
||||||
|
% (and all GNU mirrors, see ftp://ftp.gnu.org/pub/gnu/README.mirrors)
|
||||||
% ftp://tug.org/tex/texinfo.tex
|
% ftp://tug.org/tex/texinfo.tex
|
||||||
% ftp://ctan.org/macros/texinfo/texinfo.tex
|
% ftp://ctan.org/macros/texinfo/texinfo.tex
|
||||||
% (and all CTAN mirrors, finger ctan@tug.org for a list).
|
% (and all CTAN mirrors, finger ctan@tug.org for a list).
|
||||||
|
% The texinfo.tex in the texinfo distribution itself could well be out
|
||||||
|
% of date, so if that's what you're using, please check.
|
||||||
%
|
%
|
||||||
% Send bug reports to bug-texinfo@gnu.org.
|
% Send bug reports to bug-texinfo@gnu.org.
|
||||||
% Please include a precise test case in each bug report,
|
% Please include a precise test case in each bug report,
|
||||||
% including a complete document with which we can reproduce the problem.
|
% including a complete document with which we can reproduce the problem.
|
||||||
%
|
%
|
||||||
% Texinfo macros (with @macro) are *not* supported by texinfo.tex. You
|
|
||||||
% have to run makeinfo -E to expand macros first; the texi2dvi script
|
|
||||||
% does this.
|
|
||||||
%
|
|
||||||
% To process a Texinfo manual with TeX, it's most reliable to use the
|
% To process a Texinfo manual with TeX, it's most reliable to use the
|
||||||
% texi2dvi shell script that comes with the distribution. For simple
|
% texi2dvi shell script that comes with the distribution. For simple
|
||||||
% manuals, you can get away with:
|
% manuals, you can get away with:
|
||||||
|
@ -147,15 +145,10 @@
|
||||||
% Dimensions to add cropmarks at corners.
|
% Dimensions to add cropmarks at corners.
|
||||||
% Added by P. A. MacKay, 12 Nov. 1986
|
% Added by P. A. MacKay, 12 Nov. 1986
|
||||||
%
|
%
|
||||||
\newdimen\cornerlong \newdimen\cornerthick
|
\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
|
||||||
\newdimen\topandbottommargin
|
\newdimen\cornerlong \cornerlong=1pc
|
||||||
\newdimen\outerhsize \newdimen\outervsize
|
\newdimen\cornerthick \cornerthick=.3pt
|
||||||
\cornerlong=1pc\cornerthick=.3pt % These set size of cropmarks
|
\newdimen\topandbottommargin \topandbottommargin=.75in
|
||||||
\outerhsize=7in
|
|
||||||
%\outervsize=9.5in
|
|
||||||
% Alternative @smallbook page size is 9.25in
|
|
||||||
\outervsize=9.25in
|
|
||||||
\topandbottommargin=.75in
|
|
||||||
|
|
||||||
% Main output routine.
|
% Main output routine.
|
||||||
\chardef\PAGE = 255
|
\chardef\PAGE = 255
|
||||||
|
@ -791,13 +784,6 @@ where each line of input produces a line of output.}
|
||||||
\def\menu{\doignore{menu}}
|
\def\menu{\doignore{menu}}
|
||||||
\def\direntry{\doignore{direntry}}
|
\def\direntry{\doignore{direntry}}
|
||||||
|
|
||||||
% Also ignore @macro ... @end macro. The user must run texi2dvi,
|
|
||||||
% which runs makeinfo to do macro expansion. Ignore @unmacro, too.
|
|
||||||
\def\macro{\doignore{macro}}
|
|
||||||
\def\macrocsname{macro}
|
|
||||||
\let\unmacro = \comment
|
|
||||||
|
|
||||||
|
|
||||||
% @dircategory CATEGORY -- specify a category of the dir file
|
% @dircategory CATEGORY -- specify a category of the dir file
|
||||||
% which this file should belong to. Ignore this in TeX.
|
% which this file should belong to. Ignore this in TeX.
|
||||||
\let\dircategory = \comment
|
\let\dircategory = \comment
|
||||||
|
@ -828,13 +814,7 @@ where each line of input produces a line of output.}
|
||||||
% @c @end ifinfo
|
% @c @end ifinfo
|
||||||
% and the @end ifinfo will be properly ignored.
|
% and the @end ifinfo will be properly ignored.
|
||||||
% (We've just changed @ to catcode 12.)
|
% (We've just changed @ to catcode 12.)
|
||||||
%
|
|
||||||
% But we can't do this if #1 is `macro', since that actually contains a c.
|
|
||||||
% Happily, none of the other conditionals have the letter `c' in their names!
|
|
||||||
\def\temp{#1}%
|
|
||||||
\ifx\temp\macrocsname \else
|
|
||||||
\catcode`\c = 14
|
\catcode`\c = 14
|
||||||
\fi
|
|
||||||
%
|
%
|
||||||
% And now expand that command.
|
% And now expand that command.
|
||||||
\doignoretext
|
\doignoretext
|
||||||
|
@ -965,13 +945,24 @@ where each line of input produces a line of output.}
|
||||||
\def\value{\begingroup
|
\def\value{\begingroup
|
||||||
\catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR.
|
\catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR.
|
||||||
\valuexxx}
|
\valuexxx}
|
||||||
\def\valuexxx#1{%
|
\def\valuexxx#1{\expandablevalue{#1}\endgroup}
|
||||||
|
|
||||||
|
% We have this subroutine so that we can handle at least some @value's
|
||||||
|
% properly in indexes (we \let\value to this in \indexdummies). Ones
|
||||||
|
% whose names contain - or _ still won't work, but we can't do anything
|
||||||
|
% about that. The command has to be fully expandable, since the result
|
||||||
|
% winds up in the index file. This means that if the variable's value
|
||||||
|
% contains other Texinfo commands, it's almost certain it will fail
|
||||||
|
% (although perhaps we could fix that with sufficient work to do a
|
||||||
|
% one-level expansion on the result, instead of complete).
|
||||||
|
%
|
||||||
|
\def\expandablevalue#1{%
|
||||||
\expandafter\ifx\csname SET#1\endcsname\relax
|
\expandafter\ifx\csname SET#1\endcsname\relax
|
||||||
{\{No value for ``#1''\}}%
|
{[No value for ``#1'']v}%
|
||||||
\else
|
\else
|
||||||
\csname SET#1\endcsname
|
\csname SET#1\endcsname
|
||||||
\fi
|
\fi
|
||||||
\endgroup}
|
}
|
||||||
|
|
||||||
% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
|
% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
|
||||||
% with @set.
|
% with @set.
|
||||||
|
@ -1079,12 +1070,21 @@ where each line of input produces a line of output.}
|
||||||
% @refill is a no-op.
|
% @refill is a no-op.
|
||||||
\let\refill=\relax
|
\let\refill=\relax
|
||||||
|
|
||||||
|
% If working on a large document in chapters, it is convenient to
|
||||||
|
% be able to disable indexing, cross-referencing, and contents, for test runs.
|
||||||
|
% This is done with @novalidate (before @setfilename).
|
||||||
|
%
|
||||||
|
\newif\iflinks \linkstrue % by default we want the aux files.
|
||||||
|
\let\novalidate = \linksfalse
|
||||||
|
|
||||||
% @setfilename is done at the beginning of every texinfo file.
|
% @setfilename is done at the beginning of every texinfo file.
|
||||||
% So open here the files we need to have open while reading the input.
|
% So open here the files we need to have open while reading the input.
|
||||||
% This makes it possible to make a .fmt file for texinfo.
|
% This makes it possible to make a .fmt file for texinfo.
|
||||||
\def\setfilename{%
|
\def\setfilename{%
|
||||||
|
\iflinks
|
||||||
\readauxfile
|
\readauxfile
|
||||||
\opencontents
|
\opencontents
|
||||||
|
\fi % \openindices needs to do some work in any case.
|
||||||
\openindices
|
\openindices
|
||||||
\fixbackslash % Turn off hack to swallow `\input texinfo'.
|
\fixbackslash % Turn off hack to swallow `\input texinfo'.
|
||||||
\global\let\setfilename=\comment % Ignore extra @setfilename cmds.
|
\global\let\setfilename=\comment % Ignore extra @setfilename cmds.
|
||||||
|
@ -1100,30 +1100,25 @@ where each line of input produces a line of output.}
|
||||||
\comment % Ignore the actual filename.
|
\comment % Ignore the actual filename.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
% Called from \setfilename.
|
||||||
|
%
|
||||||
|
\def\openindices{%
|
||||||
|
\newindex{cp}%
|
||||||
|
\newcodeindex{fn}%
|
||||||
|
\newcodeindex{vr}%
|
||||||
|
\newcodeindex{tp}%
|
||||||
|
\newcodeindex{ky}%
|
||||||
|
\newcodeindex{pg}%
|
||||||
|
}
|
||||||
|
|
||||||
% @bye.
|
% @bye.
|
||||||
\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
|
\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
|
||||||
|
|
||||||
% \def\macro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\macroxxx}
|
|
||||||
% \def\macroxxx#1#2 \end macro{%
|
|
||||||
% \expandafter\gdef\macrotemp#1{#2}%
|
|
||||||
% \endgroup}
|
|
||||||
|
|
||||||
%\def\linemacro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\linemacroxxx}
|
|
||||||
%\def\linemacroxxx#1#2 \end linemacro{%
|
|
||||||
%\let\parsearg=\relax
|
|
||||||
%\edef\macrotempx{\csname M\butfirst\expandafter\string\macrotemp\endcsname}%
|
|
||||||
%\expandafter\xdef\macrotemp{\parsearg\macrotempx}%
|
|
||||||
%\expandafter\gdef\macrotempx#1{#2}%
|
|
||||||
%\endgroup}
|
|
||||||
|
|
||||||
%\def\butfirst#1{}
|
|
||||||
|
|
||||||
|
|
||||||
\message{fonts,}
|
\message{fonts,}
|
||||||
|
|
||||||
% Font-change commands.
|
% Font-change commands.
|
||||||
|
|
||||||
% Texinfo supports the sans serif font style, which plain TeX does not.
|
% Texinfo sort of supports the sans serif font style, which plain TeX does not.
|
||||||
% So we set up a \sf analogous to plain's \rm, etc.
|
% So we set up a \sf analogous to plain's \rm, etc.
|
||||||
\newfam\sffam
|
\newfam\sffam
|
||||||
\def\sf{\fam=\sffam \tensf}
|
\def\sf{\fam=\sffam \tensf}
|
||||||
|
@ -1898,7 +1893,7 @@ July\or August\or September\or October\or November\or December\fi
|
||||||
\def\itemize{\parsearg\itemizezzz}
|
\def\itemize{\parsearg\itemizezzz}
|
||||||
|
|
||||||
\def\itemizezzz #1{%
|
\def\itemizezzz #1{%
|
||||||
\begingroup % ended by the @end itemsize
|
\begingroup % ended by the @end itemize
|
||||||
\itemizey {#1}{\Eitemize}
|
\itemizey {#1}{\Eitemize}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2264,11 +2259,13 @@ width0pt\relax} \fi
|
||||||
% the file that accumulates this index. The file's extension is foo.
|
% the file that accumulates this index. The file's extension is foo.
|
||||||
% The name of an index should be no more than 2 characters long
|
% The name of an index should be no more than 2 characters long
|
||||||
% for the sake of vms.
|
% for the sake of vms.
|
||||||
|
%
|
||||||
\def\newindex #1{
|
\def\newindex#1{%
|
||||||
\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
|
\iflinks
|
||||||
|
\expandafter\newwrite \csname#1indfile\endcsname
|
||||||
\openout \csname#1indfile\endcsname \jobname.#1 % Open the file
|
\openout \csname#1indfile\endcsname \jobname.#1 % Open the file
|
||||||
\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
|
\fi
|
||||||
|
\expandafter\xdef\csname#1index\endcsname{% % Define @#1index
|
||||||
\noexpand\doindex{#1}}
|
\noexpand\doindex{#1}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2278,10 +2275,12 @@ width0pt\relax} \fi
|
||||||
|
|
||||||
% Define @defcodeindex, like @defindex except put all entries in @code.
|
% Define @defcodeindex, like @defindex except put all entries in @code.
|
||||||
|
|
||||||
\def\newcodeindex #1{
|
\def\newcodeindex#1{%
|
||||||
\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
|
\iflinks
|
||||||
\openout \csname#1indfile\endcsname \jobname.#1 % Open the file
|
\expandafter\newwrite \csname#1indfile\endcsname
|
||||||
\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
|
\openout \csname#1indfile\endcsname \jobname.#1
|
||||||
|
\fi
|
||||||
|
\expandafter\xdef\csname#1index\endcsname{%
|
||||||
\noexpand\docodeindex{#1}}
|
\noexpand\docodeindex{#1}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2369,7 +2368,6 @@ width0pt\relax} \fi
|
||||||
\def\gtr{\realbackslash gtr}%
|
\def\gtr{\realbackslash gtr}%
|
||||||
\def\less{\realbackslash less}%
|
\def\less{\realbackslash less}%
|
||||||
\def\hat{\realbackslash hat}%
|
\def\hat{\realbackslash hat}%
|
||||||
%\def\char{\realbackslash char}%
|
|
||||||
\def\TeX{\realbackslash TeX}%
|
\def\TeX{\realbackslash TeX}%
|
||||||
\def\dots{\realbackslash dots }%
|
\def\dots{\realbackslash dots }%
|
||||||
\def\result{\realbackslash result}%
|
\def\result{\realbackslash result}%
|
||||||
|
@ -2396,7 +2394,12 @@ width0pt\relax} \fi
|
||||||
\def\kbd##1{\realbackslash kbd {##1}}%
|
\def\kbd##1{\realbackslash kbd {##1}}%
|
||||||
\def\dfn##1{\realbackslash dfn {##1}}%
|
\def\dfn##1{\realbackslash dfn {##1}}%
|
||||||
\def\emph##1{\realbackslash emph {##1}}%
|
\def\emph##1{\realbackslash emph {##1}}%
|
||||||
\def\value##1{\realbackslash value {##1}}%
|
%
|
||||||
|
% Handle some cases of @value -- where the variable name does not
|
||||||
|
% contain - or _, and the value does not contain any
|
||||||
|
% (non-fully-expandable) commands.
|
||||||
|
\let\value = \expandablevalue
|
||||||
|
%
|
||||||
\unsepspaces
|
\unsepspaces
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2472,11 +2475,21 @@ width0pt\relax} \fi
|
||||||
@gdef@realbackslash{\}}
|
@gdef@realbackslash{\}}
|
||||||
|
|
||||||
\let\indexbackslash=0 %overridden during \printindex.
|
\let\indexbackslash=0 %overridden during \printindex.
|
||||||
|
\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
|
||||||
|
|
||||||
\let\SETmarginindex=\relax %initialize!
|
% For \ifx comparisons.
|
||||||
% workhorse for all \fooindexes
|
\def\emptymacro{\empty}
|
||||||
% #1 is name of index, #2 is stuff to put there
|
|
||||||
\def\doind #1#2{%
|
% Most index entries go through here, but \dosubind is the general case.
|
||||||
|
%
|
||||||
|
\def\doind#1#2{\dosubind{#1}{#2}\empty}
|
||||||
|
|
||||||
|
% Workhorse for all \fooindexes.
|
||||||
|
% #1 is name of index, #2 is stuff to put there, #3 is subentry --
|
||||||
|
% \empty if called from \doind, as we usually are. The main exception
|
||||||
|
% is with defuns, which call us directly.
|
||||||
|
%
|
||||||
|
\def\dosubind#1#2#3{%
|
||||||
% Put the index entry in the margin if desired.
|
% Put the index entry in the margin if desired.
|
||||||
\ifx\SETmarginindex\relax\else
|
\ifx\SETmarginindex\relax\else
|
||||||
\insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
|
\insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
|
||||||
|
@ -2491,9 +2504,18 @@ width0pt\relax} \fi
|
||||||
\def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
|
\def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
|
||||||
% so it will be output as is; and it will print as backslash.
|
% so it will be output as is; and it will print as backslash.
|
||||||
%
|
%
|
||||||
|
\def\thirdarg{#3}%
|
||||||
|
%
|
||||||
|
% If third arg is present, precede it with space in sort key.
|
||||||
|
\ifx\thirdarg\emptymacro
|
||||||
|
\let\subentry = \empty
|
||||||
|
\else
|
||||||
|
\def\subentry{ #3}%
|
||||||
|
\fi
|
||||||
|
%
|
||||||
% First process the index-string with all font commands turned off
|
% First process the index-string with all font commands turned off
|
||||||
% to get the string to sort by.
|
% to get the string to sort by.
|
||||||
{\indexnofonts \xdef\indexsorttmp{#2}}%
|
{\indexnofonts \xdef\indexsorttmp{#2\subentry}}%
|
||||||
%
|
%
|
||||||
% Now produce the complete index entry, with both the sort key and the
|
% Now produce the complete index entry, with both the sort key and the
|
||||||
% original text, including any font commands.
|
% original text, including any font commands.
|
||||||
|
@ -2502,33 +2524,35 @@ width0pt\relax} \fi
|
||||||
\write\csname#1indfile\endcsname{%
|
\write\csname#1indfile\endcsname{%
|
||||||
\realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}%
|
\realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}%
|
||||||
}%
|
}%
|
||||||
|
%
|
||||||
|
% If third (subentry) arg is present, add it to the index string.
|
||||||
|
\ifx\thirdarg\emptymacro \else
|
||||||
|
\toks0 = {#3}%
|
||||||
|
\edef\temp{\temp{\the\toks0}}%
|
||||||
|
\fi
|
||||||
|
%
|
||||||
|
% If a skip is the last thing on the list now, preserve it
|
||||||
|
% by backing up by \lastskip, doing the \write, then inserting
|
||||||
|
% the skip again. Otherwise, the whatsit generated by the
|
||||||
|
% \write will make \lastskip zero. The result is that sequences
|
||||||
|
% like this:
|
||||||
|
% @end defun
|
||||||
|
% @tindex whatever
|
||||||
|
% @defun ...
|
||||||
|
% will have extra space inserted, because the \medbreak in the
|
||||||
|
% start of the @defun won't see the skip inserted by the @end of
|
||||||
|
% the previous defun.
|
||||||
|
\iflinks
|
||||||
|
\skip0 = \lastskip \ifdim\lastskip = 0pt \else \vskip-\lastskip \fi
|
||||||
\temp
|
\temp
|
||||||
|
\ifdim\skip0 = 0pt \else \vskip\skip0 \fi
|
||||||
|
\fi
|
||||||
}%
|
}%
|
||||||
}%
|
}%
|
||||||
\penalty\count255
|
\penalty\count255
|
||||||
}%
|
}%
|
||||||
}
|
}
|
||||||
|
|
||||||
\def\dosubind #1#2#3{%
|
|
||||||
{\count10=\lastpenalty %
|
|
||||||
{\indexdummies % Must do this here, since \bf, etc expand at this stage
|
|
||||||
\escapechar=`\\%
|
|
||||||
{\let\folio=0%
|
|
||||||
\def\rawbackslashxx{\indexbackslash}%
|
|
||||||
%
|
|
||||||
% Now process the index-string once, with all font commands turned off,
|
|
||||||
% to get the string to sort the index by.
|
|
||||||
{\indexnofonts
|
|
||||||
\xdef\temp1{#2 #3}%
|
|
||||||
}%
|
|
||||||
% Now produce the complete index entry. We process the index-string again,
|
|
||||||
% this time with font commands expanded, to get what to print in the index.
|
|
||||||
\edef\temp{%
|
|
||||||
\write \csname#1indfile\endcsname{%
|
|
||||||
\realbackslash entry {\temp1}{\folio}{#2}{#3}}}%
|
|
||||||
\temp }%
|
|
||||||
}\penalty\count10}}
|
|
||||||
|
|
||||||
% The index entry written in the file actually looks like
|
% The index entry written in the file actually looks like
|
||||||
% \entry {sortstring}{page}{topic}
|
% \entry {sortstring}{page}{topic}
|
||||||
% or
|
% or
|
||||||
|
@ -2952,7 +2976,7 @@ width0pt\relax} \fi
|
||||||
\toks0 = {#1}%
|
\toks0 = {#1}%
|
||||||
\edef\temp{{\realbackslash chapentry{\the\toks0}{\the\chapno}{\noexpand\folio}}}%
|
\edef\temp{{\realbackslash chapentry{\the\toks0}{\the\chapno}{\noexpand\folio}}}%
|
||||||
\escapechar=`\\%
|
\escapechar=`\\%
|
||||||
\write \contentsfile \temp %
|
\iflinks \write\contentsfile\temp \fi
|
||||||
\donoderef %
|
\donoderef %
|
||||||
\global\let\section = \numberedsec
|
\global\let\section = \numberedsec
|
||||||
\global\let\subsection = \numberedsubsec
|
\global\let\subsection = \numberedsubsec
|
||||||
|
@ -2973,7 +2997,7 @@ width0pt\relax} \fi
|
||||||
\edef\temp{{\realbackslash chapentry{\the\toks0}%
|
\edef\temp{{\realbackslash chapentry{\the\toks0}%
|
||||||
{\putwordAppendix{} \appendixletter}{\noexpand\folio}}}%
|
{\putwordAppendix{} \appendixletter}{\noexpand\folio}}}%
|
||||||
\escapechar=`\\%
|
\escapechar=`\\%
|
||||||
\write \contentsfile \temp %
|
\iflinks \write\contentsfile\temp \fi
|
||||||
\appendixnoderef %
|
\appendixnoderef %
|
||||||
\global\let\section = \appendixsec
|
\global\let\section = \appendixsec
|
||||||
\global\let\subsection = \appendixsubsec
|
\global\let\subsection = \appendixsubsec
|
||||||
|
@ -3008,7 +3032,7 @@ width0pt\relax} \fi
|
||||||
\toks0 = {#1}%
|
\toks0 = {#1}%
|
||||||
\edef\temp{{\realbackslash unnumbchapentry{\the\toks0}{\noexpand\folio}}}%
|
\edef\temp{{\realbackslash unnumbchapentry{\the\toks0}{\noexpand\folio}}}%
|
||||||
\escapechar=`\\%
|
\escapechar=`\\%
|
||||||
\write \contentsfile \temp %
|
\iflinks \write\contentsfile\temp \fi
|
||||||
\unnumbnoderef %
|
\unnumbnoderef %
|
||||||
\global\let\section = \unnumberedsec
|
\global\let\section = \unnumberedsec
|
||||||
\global\let\subsection = \unnumberedsubsec
|
\global\let\subsection = \unnumberedsubsec
|
||||||
|
@ -3025,7 +3049,7 @@ width0pt\relax} \fi
|
||||||
\edef\temp{{\realbackslash secentry %
|
\edef\temp{{\realbackslash secentry %
|
||||||
{\the\toks0}{\the\chapno}{\the\secno}{\noexpand\folio}}}%
|
{\the\toks0}{\the\chapno}{\the\secno}{\noexpand\folio}}}%
|
||||||
\escapechar=`\\%
|
\escapechar=`\\%
|
||||||
\write \contentsfile \temp %
|
\iflinks \write\contentsfile\temp \fi
|
||||||
\donoderef %
|
\donoderef %
|
||||||
\penalty 10000 %
|
\penalty 10000 %
|
||||||
}}
|
}}
|
||||||
|
@ -3041,7 +3065,7 @@ width0pt\relax} \fi
|
||||||
\edef\temp{{\realbackslash secentry %
|
\edef\temp{{\realbackslash secentry %
|
||||||
{\the\toks0}{\appendixletter}{\the\secno}{\noexpand\folio}}}%
|
{\the\toks0}{\appendixletter}{\the\secno}{\noexpand\folio}}}%
|
||||||
\escapechar=`\\%
|
\escapechar=`\\%
|
||||||
\write \contentsfile \temp %
|
\iflinks \write\contentsfile\temp \fi
|
||||||
\appendixnoderef %
|
\appendixnoderef %
|
||||||
\penalty 10000 %
|
\penalty 10000 %
|
||||||
}}
|
}}
|
||||||
|
@ -3054,7 +3078,7 @@ width0pt\relax} \fi
|
||||||
\toks0 = {#1}%
|
\toks0 = {#1}%
|
||||||
\edef\temp{{\realbackslash unnumbsecentry{\the\toks0}{\noexpand\folio}}}%
|
\edef\temp{{\realbackslash unnumbsecentry{\the\toks0}{\noexpand\folio}}}%
|
||||||
\escapechar=`\\%
|
\escapechar=`\\%
|
||||||
\write \contentsfile \temp %
|
\iflinks \write\contentsfile\temp \fi
|
||||||
\unnumbnoderef %
|
\unnumbnoderef %
|
||||||
\penalty 10000 %
|
\penalty 10000 %
|
||||||
}}
|
}}
|
||||||
|
@ -3069,7 +3093,7 @@ width0pt\relax} \fi
|
||||||
\edef\temp{{\realbackslash subsecentry %
|
\edef\temp{{\realbackslash subsecentry %
|
||||||
{\the\toks0}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
|
{\the\toks0}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
|
||||||
\escapechar=`\\%
|
\escapechar=`\\%
|
||||||
\write \contentsfile \temp %
|
\iflinks \write\contentsfile\temp \fi
|
||||||
\donoderef %
|
\donoderef %
|
||||||
\penalty 10000 %
|
\penalty 10000 %
|
||||||
}}
|
}}
|
||||||
|
@ -3084,7 +3108,7 @@ width0pt\relax} \fi
|
||||||
\edef\temp{{\realbackslash subsecentry %
|
\edef\temp{{\realbackslash subsecentry %
|
||||||
{\the\toks0}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
|
{\the\toks0}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
|
||||||
\escapechar=`\\%
|
\escapechar=`\\%
|
||||||
\write \contentsfile \temp %
|
\iflinks \write\contentsfile\temp \fi
|
||||||
\appendixnoderef %
|
\appendixnoderef %
|
||||||
\penalty 10000 %
|
\penalty 10000 %
|
||||||
}}
|
}}
|
||||||
|
@ -3097,7 +3121,7 @@ width0pt\relax} \fi
|
||||||
\toks0 = {#1}%
|
\toks0 = {#1}%
|
||||||
\edef\temp{{\realbackslash unnumbsubsecentry{\the\toks0}{\noexpand\folio}}}%
|
\edef\temp{{\realbackslash unnumbsubsecentry{\the\toks0}{\noexpand\folio}}}%
|
||||||
\escapechar=`\\%
|
\escapechar=`\\%
|
||||||
\write \contentsfile \temp %
|
\iflinks \write\contentsfile\temp \fi
|
||||||
\unnumbnoderef %
|
\unnumbnoderef %
|
||||||
\penalty 10000 %
|
\penalty 10000 %
|
||||||
}}
|
}}
|
||||||
|
@ -3114,7 +3138,7 @@ width0pt\relax} \fi
|
||||||
{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}
|
{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}
|
||||||
{\noexpand\folio}}}%
|
{\noexpand\folio}}}%
|
||||||
\escapechar=`\\%
|
\escapechar=`\\%
|
||||||
\write \contentsfile \temp %
|
\iflinks \write\contentsfile\temp \fi
|
||||||
\donoderef %
|
\donoderef %
|
||||||
\penalty 10000 %
|
\penalty 10000 %
|
||||||
}}
|
}}
|
||||||
|
@ -3131,7 +3155,7 @@ width0pt\relax} \fi
|
||||||
{\appendixletter}
|
{\appendixletter}
|
||||||
{\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}%
|
{\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}%
|
||||||
\escapechar=`\\%
|
\escapechar=`\\%
|
||||||
\write \contentsfile \temp %
|
\iflinks \write\contentsfile\temp \fi
|
||||||
\appendixnoderef %
|
\appendixnoderef %
|
||||||
\penalty 10000 %
|
\penalty 10000 %
|
||||||
}}
|
}}
|
||||||
|
@ -3144,7 +3168,7 @@ width0pt\relax} \fi
|
||||||
\toks0 = {#1}%
|
\toks0 = {#1}%
|
||||||
\edef\temp{{\realbackslash unnumbsubsubsecentry{\the\toks0}{\noexpand\folio}}}%
|
\edef\temp{{\realbackslash unnumbsubsubsecentry{\the\toks0}{\noexpand\folio}}}%
|
||||||
\escapechar=`\\%
|
\escapechar=`\\%
|
||||||
\write \contentsfile \temp %
|
\iflinks \write\contentsfile\temp \fi
|
||||||
\unnumbnoderef %
|
\unnumbnoderef %
|
||||||
\penalty 10000 %
|
\penalty 10000 %
|
||||||
}}
|
}}
|
||||||
|
@ -3944,13 +3968,18 @@ width0pt\relax} \fi
|
||||||
\begingroup\obeylines\activeparens\spacesplit{#3{#4}}}
|
\begingroup\obeylines\activeparens\spacesplit{#3{#4}}}
|
||||||
|
|
||||||
% @deftypemethod has an extra argument that nothing else does. Sigh.
|
% @deftypemethod has an extra argument that nothing else does. Sigh.
|
||||||
|
% #1 is the \E... control sequence to end the definition (which we define).
|
||||||
|
% #2 is the \...x control sequence for consecutive fns (which we define).
|
||||||
|
% #3 is the control sequence to call to resume processing.
|
||||||
|
% #4, delimited by the space, is the class name.
|
||||||
|
% #5 is the method's return type.
|
||||||
%
|
%
|
||||||
\def\deftypemethparsebody#1#2#3#4 #5 {\begingroup\inENV %
|
\def\deftypemethparsebody#1#2#3#4 #5 {\begingroup\inENV %
|
||||||
\medbreak %
|
\medbreak %
|
||||||
% Define the end token that this defining construct specifies
|
% Define the end token that this defining construct specifies
|
||||||
% so that it will exit this group.
|
% so that it will exit this group.
|
||||||
\def#1{\endgraf\endgroup\medbreak}%
|
\def#1{\endgraf\endgroup\medbreak}%
|
||||||
\def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}%
|
\def#2##1 ##2 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}{##2}}}%
|
||||||
\parindent=0in
|
\parindent=0in
|
||||||
\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
|
\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
|
||||||
\exdentamount=\defbodyindent
|
\exdentamount=\defbodyindent
|
||||||
|
@ -4173,7 +4202,7 @@ width0pt\relax} \fi
|
||||||
\def\defspecx #1 {\errmessage{@defspecx in invalid context}}
|
\def\defspecx #1 {\errmessage{@defspecx in invalid context}}
|
||||||
\def\deftypefnx #1 {\errmessage{@deftypefnx in invalid context}}
|
\def\deftypefnx #1 {\errmessage{@deftypefnx in invalid context}}
|
||||||
\def\deftypemethodx #1 {\errmessage{@deftypemethodx in invalid context}}
|
\def\deftypemethodx #1 {\errmessage{@deftypemethodx in invalid context}}
|
||||||
\def\deftypeunx #1 {\errmessage{@deftypeunx in invalid context}}
|
\def\deftypefunx #1 {\errmessage{@deftypeunx in invalid context}}
|
||||||
|
|
||||||
% @defmethod, and so on
|
% @defmethod, and so on
|
||||||
|
|
||||||
|
@ -4329,7 +4358,220 @@ width0pt\relax} \fi
|
||||||
\def\deftpx #1 {\errmessage{@deftpx in invalid context}}
|
\def\deftpx #1 {\errmessage{@deftpx in invalid context}}
|
||||||
|
|
||||||
|
|
||||||
\message{cross reference,}
|
\message{macros,}
|
||||||
|
% @macro.
|
||||||
|
|
||||||
|
% To do this right we need a feature of e-TeX, \scantokens,
|
||||||
|
% which we arrange to emulate with a temporary file in ordinary TeX.
|
||||||
|
\ifx\eTeXversion\undefined
|
||||||
|
\newwrite\macscribble
|
||||||
|
\def\scantokens#1{%
|
||||||
|
% \toks0={#1}%
|
||||||
|
\immediate\openout\macscribble=\jobname.tmp
|
||||||
|
\immediate\write\macscribble{#1}%\the\toks0}%
|
||||||
|
\immediate\closeout\macscribble
|
||||||
|
\input \jobname.tmp
|
||||||
|
}
|
||||||
|
\fi
|
||||||
|
|
||||||
|
\newcount\paramno % Count of parameters
|
||||||
|
\newtoks\macname % Macro name
|
||||||
|
\newif\ifrecursive % Is it recursive?
|
||||||
|
|
||||||
|
% Utility: does \let #1 = #2, except with \csnames.
|
||||||
|
\def\cslet#1#2{%
|
||||||
|
\expandafter\expandafter
|
||||||
|
\expandafter\let
|
||||||
|
\expandafter\expandafter
|
||||||
|
\csname#1\endcsname
|
||||||
|
\csname#2\endcsname}
|
||||||
|
|
||||||
|
% Macro bodies are absorbed as an argument in a context where
|
||||||
|
% all characters are catcode 10, 11 or 12, except \ which is active
|
||||||
|
% (as in normal texinfo). It is necessary to change the definition of \.
|
||||||
|
|
||||||
|
\def\macrobodyctxt{%
|
||||||
|
\catcode`\~=12
|
||||||
|
\catcode`\^=12
|
||||||
|
\catcode`\_=12
|
||||||
|
\catcode`\|=12
|
||||||
|
\catcode`\<=12
|
||||||
|
\catcode`\>=12
|
||||||
|
\catcode`\+=12
|
||||||
|
\catcode`\{=12
|
||||||
|
\catcode`\}=12
|
||||||
|
\catcode`\@=12
|
||||||
|
\catcode`\^^M=10
|
||||||
|
\usembodybackslash}
|
||||||
|
|
||||||
|
% \mbodybackslash is the definition of \ in @macro bodies.
|
||||||
|
% It maps \foo\ => \csname macarg.foo\endcsname => #N
|
||||||
|
% where N is the macro parameter number.
|
||||||
|
% We define \csname macarg.\endcsname to be \realbackslash, so
|
||||||
|
% \\ in macro replacement text gets you a backslash.
|
||||||
|
|
||||||
|
{\catcode`@=0 \catcode`\\=\active
|
||||||
|
@gdef@usembodybackslash{@let\=@mbodybackslash}
|
||||||
|
@gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
|
||||||
|
}
|
||||||
|
\expandafter\def\csname macarg.\endcsname{\realbackslash}
|
||||||
|
|
||||||
|
% The catcode games are necessary because @macro may or may not
|
||||||
|
% have a brace-surrounded list of arguments, and we need to do
|
||||||
|
% different stuff in each case. Making {, } \other is the only
|
||||||
|
% way to prevent their being deleted by the tokenizer.
|
||||||
|
\def\macro{\recursivefalse
|
||||||
|
\bgroup\catcode`\{=\other\catcode`\}=\other\parsearg\macroxxx}
|
||||||
|
\def\rmacro{\recursivetrue
|
||||||
|
\bgroup\catcode`\{=\other\catcode`\}=\other\parsearg\macroxxx}
|
||||||
|
|
||||||
|
\def\macroxxx#1{\egroup % started in \macro
|
||||||
|
\getargs{#1}% now \macname is the macname and \toks0 the arglist
|
||||||
|
\edef\temp{\the\toks0}%
|
||||||
|
\ifx\temp\empty % no arguments
|
||||||
|
\paramno=0%
|
||||||
|
\else
|
||||||
|
\expandafter\parsemargdef \the\toks0;%
|
||||||
|
\fi
|
||||||
|
\expandafter\ifx \csname macsave.\the\macname\endcsname \relax
|
||||||
|
\cslet{macsave.\the\macname}{\the\macname}%
|
||||||
|
\else
|
||||||
|
\message{Warning: redefining \the\macname}%
|
||||||
|
\fi
|
||||||
|
\begingroup \macrobodyctxt
|
||||||
|
\ifrecursive \expandafter\parsermacbody
|
||||||
|
\else \expandafter\parsemacbody
|
||||||
|
\fi}
|
||||||
|
|
||||||
|
\def\unmacro{\parsearg\unmacroxxx}
|
||||||
|
\def\unmacroxxx#1{
|
||||||
|
\expandafter\ifx \csname macsave.\the\macname\endcsname \relax
|
||||||
|
\errmessage{Macro \the\macname\ not defined.}%
|
||||||
|
\else
|
||||||
|
\cslet{#1}{macsave.#1}%
|
||||||
|
\expandafter\let \csname macsave.\the\macname\endcsname \undefined
|
||||||
|
\fi
|
||||||
|
}
|
||||||
|
|
||||||
|
% Parse the optional {params} list. Set up \paramno and \paramlist
|
||||||
|
% so \defmacro knows what to do. Define \macarg.blah for each blah
|
||||||
|
% in the params list, to be ##N where N is the position in that list.
|
||||||
|
% That gets used by \mbodybackslash (above).
|
||||||
|
|
||||||
|
% This code has to take great care with `macro parameter char #'. The
|
||||||
|
% eight hashes in a row on the macarg.#1 line collapse to four in the
|
||||||
|
% definition of \macarg.blah, to two when \parsemacbody expands the
|
||||||
|
% macro replacement text, and to one when \defmacro writes the macro
|
||||||
|
% definiton. The games with \twohash are to postpone expansion till
|
||||||
|
% the very end, when \parsemargdefyyy crunches \paramlist into
|
||||||
|
% something that can be splatted into a \expandafter\def\blah line (in
|
||||||
|
% \defmacro).
|
||||||
|
\def\parsemargdef#1;{\paramno=0\def\paramlist{}\parsemargdefxxx#1,;,}
|
||||||
|
\def\parsemargdefxxx#1,{%
|
||||||
|
\let\twohash\relax
|
||||||
|
\if#1;\let\next=\parsemargdefyyy
|
||||||
|
\else \let\next=\parsemargdefxxx
|
||||||
|
\advance\paramno by 1%
|
||||||
|
\expandafter\edef\csname macarg.#1\endcsname{########\the\paramno}%
|
||||||
|
\edef\paramlist{\paramlist\twohash\twohash\the\paramno,}%
|
||||||
|
\fi\next}
|
||||||
|
\def\parsemargdefyyy{\let\twohash##\relax \edef\paramlist{\paramlist}}
|
||||||
|
|
||||||
|
% These two commands read recursive and nonrecursive macro bodies.
|
||||||
|
% (They're different since rec and nonrec macros end differently.)
|
||||||
|
|
||||||
|
\long\def\parsemacbody#1@end macro%
|
||||||
|
{\xdef\temp{#1} \endgroup\defmacro}%
|
||||||
|
\long\def\parsermacbody#1@end macro%
|
||||||
|
{\xdef\temp{#1} \endgroup\defmacro}%
|
||||||
|
|
||||||
|
|
||||||
|
% This defines the macro itself. There are six cases: recursive and
|
||||||
|
% nonrecursive macros of zero, one, and many arguments.
|
||||||
|
% Much magic with \expandafter here.
|
||||||
|
\def\defmacro{%
|
||||||
|
\ifrecursive
|
||||||
|
\ifcase\paramno
|
||||||
|
% 0
|
||||||
|
\expandafter\edef\csname\the\macname\endcsname{%
|
||||||
|
\noexpand\scantokens{\temp}}%
|
||||||
|
\or % 1
|
||||||
|
\expandafter\edef\csname\the\macname\endcsname{%
|
||||||
|
\noexpand\braceorline\csname\the\macname xxx\endcsname}%
|
||||||
|
\expandafter\edef\csname\the\macname xxx\endcsname##1{%
|
||||||
|
\noexpand\scantokens{\temp}}%
|
||||||
|
\else % many
|
||||||
|
\expandafter\edef\csname\the\macname\endcsname##1{%
|
||||||
|
\csname\the\macname xxx\endcsname ##1,}%
|
||||||
|
\expandafter\expandafter
|
||||||
|
\expandafter\edef
|
||||||
|
\expandafter\expandafter
|
||||||
|
\csname\the\macname xxx\endcsname
|
||||||
|
\paramlist{\noexpand\scantokens{\temp}}%
|
||||||
|
\fi
|
||||||
|
\else
|
||||||
|
\ifcase\paramno
|
||||||
|
% 0
|
||||||
|
\expandafter\edef\csname\the\macname\endcsname{%
|
||||||
|
\noexpand\norecurse{\the\macname}%
|
||||||
|
\noexpand\scantokens{\temp}\egroup}%
|
||||||
|
\or % 1
|
||||||
|
\expandafter\edef\csname\the\macname\endcsname{%
|
||||||
|
\noexpand\braceorline\csname\the\macname xxx\endcsname}%
|
||||||
|
\expandafter\edef\csname\the\macname xxx\endcsname##1{%
|
||||||
|
\noexpand\norecurse{\the\macname}
|
||||||
|
\noexpand\scantokens{\temp}\egroup}%
|
||||||
|
\else % many
|
||||||
|
\expandafter\edef\csname\the\macname\endcsname##1{%
|
||||||
|
\csname\the\macname xxx\endcsname ##1,}%
|
||||||
|
\expandafter\expandafter
|
||||||
|
\expandafter\edef
|
||||||
|
\expandafter\expandafter
|
||||||
|
\csname\the\macname xxx\endcsname
|
||||||
|
\paramlist{%
|
||||||
|
\noexpand\norecurse{\the\macname}
|
||||||
|
\noexpand\scantokens{\temp}\egroup}%
|
||||||
|
\fi
|
||||||
|
\fi}
|
||||||
|
|
||||||
|
\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
|
||||||
|
|
||||||
|
% \braceorline decides whether the next nonwhitespace character is a
|
||||||
|
% {. If so it reads up to the closing }, if not, it reads the whole
|
||||||
|
% line. Whatever was read is then fed to the next control sequence
|
||||||
|
% as an argument (by \parsebrace or \parsearg)
|
||||||
|
\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
|
||||||
|
\def\braceorlinexxx{%
|
||||||
|
\ifx\nchar\bgroup\else
|
||||||
|
\expandafter\parsearg
|
||||||
|
\fi \next}
|
||||||
|
|
||||||
|
% We need {} to be \other inside these commands. [] are temporary
|
||||||
|
% grouping symbols.
|
||||||
|
\begingroup
|
||||||
|
\catcode`\{=\other \catcode`\}=\other
|
||||||
|
\catcode`\[=1 \catcode`\]=2
|
||||||
|
|
||||||
|
% @macro can be called with or without a brace-surrounded macro
|
||||||
|
% argument list. These three sequences extract the macro name and arg
|
||||||
|
% list in hopefully all cases. Note that anything on the line after the
|
||||||
|
% first pair of braces will be thrown out (Makeinfo puts it into the
|
||||||
|
% macro body).
|
||||||
|
\gdef\getargs#1[\getargsxxx|#1 {}|]
|
||||||
|
\gdef\getargsxxx|#1 {#2}#3|[%
|
||||||
|
\toks0=[#2]%
|
||||||
|
\edef\tmp[\the\toks0]%
|
||||||
|
\ifx\tmp\empty
|
||||||
|
\getargsnospaces|#1{}|%
|
||||||
|
\else
|
||||||
|
\macname=[#1]%
|
||||||
|
\fi]
|
||||||
|
\gdef\getargsnospaces|#1{#2}#3|[\macname=[#1]\toks0=[#2]]
|
||||||
|
|
||||||
|
\endgroup
|
||||||
|
|
||||||
|
|
||||||
|
\message{cross references,}
|
||||||
\newwrite\auxfile
|
\newwrite\auxfile
|
||||||
|
|
||||||
\newif\ifhavexrefs % True if xref values are known.
|
\newif\ifhavexrefs % True if xref values are known.
|
||||||
|
@ -4422,7 +4664,9 @@ width0pt\relax} \fi
|
||||||
{\let\folio=0
|
{\let\folio=0
|
||||||
\normalturnoffactive
|
\normalturnoffactive
|
||||||
\edef\next{\write\auxfile{\internalsetq{#1}{#2}}}%
|
\edef\next{\write\auxfile{\internalsetq{#1}{#2}}}%
|
||||||
|
\iflinks
|
||||||
\next
|
\next
|
||||||
|
\fi
|
||||||
}%
|
}%
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4476,6 +4720,7 @@ width0pt\relax} \fi
|
||||||
\expandafter\ifx\csname X#1\endcsname\relax
|
\expandafter\ifx\csname X#1\endcsname\relax
|
||||||
% If not defined, say something at least.
|
% If not defined, say something at least.
|
||||||
\angleleft un\-de\-fined\angleright
|
\angleleft un\-de\-fined\angleright
|
||||||
|
\iflinks
|
||||||
\ifhavexrefs
|
\ifhavexrefs
|
||||||
\message{\linenumber Undefined cross reference `#1'.}%
|
\message{\linenumber Undefined cross reference `#1'.}%
|
||||||
\else
|
\else
|
||||||
|
@ -4484,6 +4729,7 @@ width0pt\relax} \fi
|
||||||
\message{Cross reference values unknown; you must run TeX again.}%
|
\message{Cross reference values unknown; you must run TeX again.}%
|
||||||
\fi
|
\fi
|
||||||
\fi
|
\fi
|
||||||
|
\fi
|
||||||
\else
|
\else
|
||||||
% It's defined, so just use it.
|
% It's defined, so just use it.
|
||||||
\csname X#1\endcsname
|
\csname X#1\endcsname
|
||||||
|
@ -4724,7 +4970,9 @@ width0pt\relax} \fi
|
||||||
\openin 1 = epsf.tex
|
\openin 1 = epsf.tex
|
||||||
\ifeof 1 \else
|
\ifeof 1 \else
|
||||||
\closein 1
|
\closein 1
|
||||||
\def\epsfannounce{\toks0 = }% do not bother showing banner
|
% Do not bother showing banner with post-v2.7 epsf.tex (available in
|
||||||
|
% doc/epsf.tex until it shows up on ctan).
|
||||||
|
\def\epsfannounce{\toks0 = }%
|
||||||
\input epsf.tex
|
\input epsf.tex
|
||||||
\fi
|
\fi
|
||||||
%
|
%
|
||||||
|
@ -4754,32 +5002,19 @@ width0pt\relax} \fi
|
||||||
% \epsfbox itself resets \epsf?size at each figure.
|
% \epsfbox itself resets \epsf?size at each figure.
|
||||||
\setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
|
\setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
|
||||||
\setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
|
\setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
|
||||||
|
% If the image is by itself, center it.
|
||||||
|
\ifvmode
|
||||||
|
\centerline{\epsfbox{#1.eps}}%
|
||||||
|
\else
|
||||||
\epsfbox{#1.eps}%
|
\epsfbox{#1.eps}%
|
||||||
|
\fi
|
||||||
}
|
}
|
||||||
|
|
||||||
% End of control word definitions.
|
|
||||||
|
|
||||||
|
\message{paper sizes,}
|
||||||
|
% And other related parameters.
|
||||||
|
|
||||||
\message{and turning on texinfo input format.}
|
|
||||||
|
|
||||||
\def\openindices{%
|
|
||||||
\newindex{cp}%
|
|
||||||
\newcodeindex{fn}%
|
|
||||||
\newcodeindex{vr}%
|
|
||||||
\newcodeindex{tp}%
|
|
||||||
\newcodeindex{ky}%
|
|
||||||
\newcodeindex{pg}%
|
|
||||||
}
|
|
||||||
|
|
||||||
% Set some numeric style parameters, for 8.5 x 11 format.
|
|
||||||
|
|
||||||
\hsize = 6in
|
|
||||||
\hoffset = .25in
|
|
||||||
\newdimen\defaultparindent \defaultparindent = 15pt
|
\newdimen\defaultparindent \defaultparindent = 15pt
|
||||||
\parindent = \defaultparindent
|
|
||||||
\parskip 3pt plus 2pt minus 1pt
|
|
||||||
\setleading{13.2pt}
|
|
||||||
\advance\topskip by 1.2cm
|
|
||||||
|
|
||||||
\chapheadingskip = 15pt plus 4pt minus 2pt
|
\chapheadingskip = 15pt plus 4pt minus 2pt
|
||||||
\secheadingskip = 12pt plus 3pt minus 2pt
|
\secheadingskip = 12pt plus 3pt minus 2pt
|
||||||
|
@ -4795,8 +5030,10 @@ width0pt\relax} \fi
|
||||||
% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
|
% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
|
||||||
% using an old version of TeX, don't do anything. We want the amount of
|
% using an old version of TeX, don't do anything. We want the amount of
|
||||||
% stretch added to depend on the line length, hence the dependence on
|
% stretch added to depend on the line length, hence the dependence on
|
||||||
% \hsize. This makes it come to about 9pt for the 8.5x11 format.
|
% \hsize. This makes it come to about 9pt for the 8.5x11 format. We
|
||||||
|
% call this whenever the paper size is set.
|
||||||
%
|
%
|
||||||
|
\def\setemergencystretch{%
|
||||||
\ifx\emergencystretch\thisisundefined
|
\ifx\emergencystretch\thisisundefined
|
||||||
% Allow us to assign to \emergencystretch anyway.
|
% Allow us to assign to \emergencystretch anyway.
|
||||||
\def\emergencystretch{\dimen0}%
|
\def\emergencystretch{\dimen0}%
|
||||||
|
@ -4804,92 +5041,114 @@ width0pt\relax} \fi
|
||||||
\emergencystretch = \hsize
|
\emergencystretch = \hsize
|
||||||
\divide\emergencystretch by 45
|
\divide\emergencystretch by 45
|
||||||
\fi
|
\fi
|
||||||
|
|
||||||
% Use @smallbook to reset parameters for 7x9.5 format (or else 7x9.25)
|
|
||||||
\def\smallbook{
|
|
||||||
\global\chapheadingskip = 15pt plus 4pt minus 2pt
|
|
||||||
\global\secheadingskip = 12pt plus 3pt minus 2pt
|
|
||||||
\global\subsecheadingskip = 9pt plus 2pt minus 2pt
|
|
||||||
%
|
|
||||||
\global\lispnarrowing = 0.3in
|
|
||||||
\setleading{12pt}
|
|
||||||
\advance\topskip by -1cm
|
|
||||||
\global\parskip 2pt plus 1pt
|
|
||||||
\global\hsize = 5in
|
|
||||||
\global\vsize=7.5in
|
|
||||||
\global\tolerance=700
|
|
||||||
\global\hfuzz=1pt
|
|
||||||
\global\contentsrightmargin=0pt
|
|
||||||
\global\deftypemargin=0pt
|
|
||||||
\global\defbodyindent=.5cm
|
|
||||||
%
|
|
||||||
\global\pagewidth=\hsize
|
|
||||||
\global\pageheight=\vsize
|
|
||||||
%
|
|
||||||
\global\let\smalllisp=\smalllispx
|
|
||||||
\global\let\smallexample=\smalllispx
|
|
||||||
\global\def\Esmallexample{\Esmalllisp}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
% Parameters in order: 1) textheight; 2) textwidth; 3) voffset;
|
||||||
|
% 4) hoffset; 5) binding offset; 6) topskip. Then whoever calls us can
|
||||||
|
% set \parskip and call \setleading for \baselineskip.
|
||||||
|
%
|
||||||
|
\def\internalpagesizes#1#2#3#4#5#6{%
|
||||||
|
\voffset = #3\relax
|
||||||
|
\topskip = #6\relax
|
||||||
|
\splittopskip = \topskip
|
||||||
|
%
|
||||||
|
\vsize = #1\relax
|
||||||
|
\advance\vsize by \topskip
|
||||||
|
\outervsize = \vsize
|
||||||
|
\advance\outervsize by 0.6in
|
||||||
|
\pageheight = \vsize
|
||||||
|
%
|
||||||
|
\hsize = #2\relax
|
||||||
|
\outerhsize = \hsize
|
||||||
|
\advance\outerhsize by 0.5in
|
||||||
|
\pagewidth = \hsize
|
||||||
|
%
|
||||||
|
\normaloffset = #4\relax
|
||||||
|
\bindingoffset = #5\relax
|
||||||
|
%
|
||||||
|
\parindent = \defaultparindent
|
||||||
|
\setemergencystretch
|
||||||
|
}
|
||||||
|
|
||||||
|
% @letterpaper (the default).
|
||||||
|
\def\letterpaper{{\globaldefs = 1
|
||||||
|
\parskip = 3pt plus 2pt minus 1pt
|
||||||
|
\setleading{13.2pt}%
|
||||||
|
%
|
||||||
|
% If page is nothing but text, make it come out even.
|
||||||
|
\internalpagesizes{46\baselineskip}{6in}{\voffset}{.25in}{\bindingoffset}{36pt}%
|
||||||
|
}}
|
||||||
|
|
||||||
|
% Use @smallbook to reset parameters for 7x9.5 (or so) format.
|
||||||
|
\def\smallbook{{\globaldefs = 1
|
||||||
|
\parskip = 2pt plus 1pt
|
||||||
|
\setleading{12pt}%
|
||||||
|
%
|
||||||
|
\internalpagesizes{7.5in}{5.in}{\voffset}{.25in}{\bindingoffset}{16pt}%
|
||||||
|
%
|
||||||
|
\lispnarrowing = 0.3in
|
||||||
|
\tolerance = 700
|
||||||
|
\hfuzz = 1pt
|
||||||
|
\contentsrightmargin = 0pt
|
||||||
|
\deftypemargin = 0pt
|
||||||
|
\defbodyindent = .5cm
|
||||||
|
%
|
||||||
|
\let\smalllisp = \smalllispx
|
||||||
|
\let\smallexample = \smalllispx
|
||||||
|
\def\Esmallexample{\Esmalllisp}%
|
||||||
|
}}
|
||||||
|
|
||||||
% Use @afourpaper to print on European A4 paper.
|
% Use @afourpaper to print on European A4 paper.
|
||||||
\def\afourpaper{
|
\def\afourpaper{{\globaldefs = 1
|
||||||
\global\tolerance=700
|
\setleading{12pt}%
|
||||||
\global\hfuzz=1pt
|
\parskip = 3pt plus 2pt minus 1pt
|
||||||
\setleading{12pt}
|
%
|
||||||
\global\parskip 15pt plus 1pt
|
\internalpagesizes{53\baselineskip}{6.5in}{\voffset}{.25in}{\bindingoffset}{44pt}%
|
||||||
|
%
|
||||||
\global\vsize= 53\baselineskip
|
\tolerance = 700
|
||||||
\advance\vsize by \topskip
|
\hfuzz = 1pt
|
||||||
%\global\hsize= 5.85in % A4 wide 10pt
|
}}
|
||||||
\global\hsize= 6.5in
|
|
||||||
\global\outerhsize=\hsize
|
|
||||||
\global\advance\outerhsize by 0.5in
|
|
||||||
\global\outervsize=\vsize
|
|
||||||
\global\advance\outervsize by 0.6in
|
|
||||||
|
|
||||||
\global\pagewidth=\hsize
|
|
||||||
\global\pageheight=\vsize
|
|
||||||
}
|
|
||||||
|
|
||||||
\bindingoffset=0pt
|
|
||||||
\normaloffset=\hoffset
|
|
||||||
\pagewidth=\hsize
|
|
||||||
\pageheight=\vsize
|
|
||||||
|
|
||||||
% Allow control of the text dimensions. Parameters in order: textheight;
|
|
||||||
% textwidth; voffset; hoffset; binding offset; topskip.
|
|
||||||
% All require a dimension;
|
|
||||||
% header is additional; added length extends the bottom of the page.
|
|
||||||
|
|
||||||
\def\changepagesizes#1#2#3#4#5#6{
|
|
||||||
\global\vsize= #1
|
|
||||||
\global\topskip= #6
|
|
||||||
\advance\vsize by \topskip
|
|
||||||
\global\voffset= #3
|
|
||||||
\global\hsize= #2
|
|
||||||
\global\outerhsize=\hsize
|
|
||||||
\global\advance\outerhsize by 0.5in
|
|
||||||
\global\outervsize=\vsize
|
|
||||||
\global\advance\outervsize by 0.6in
|
|
||||||
\global\pagewidth=\hsize
|
|
||||||
\global\pageheight=\vsize
|
|
||||||
\global\normaloffset= #4
|
|
||||||
\global\bindingoffset= #5}
|
|
||||||
|
|
||||||
% A specific text layout, 24x15cm overall, intended for A4 paper. Top margin
|
% A specific text layout, 24x15cm overall, intended for A4 paper. Top margin
|
||||||
% 29mm, hence bottom margin 28mm, nominal side margin 3cm.
|
% 29mm, hence bottom margin 28mm, nominal side margin 3cm.
|
||||||
\def\afourlatex
|
\def\afourlatex{{\globaldefs = 1
|
||||||
{\global\tolerance=700
|
\setleading{13.6pt}%
|
||||||
\global\hfuzz=1pt
|
%
|
||||||
\setleading{12pt}
|
\afourpaper
|
||||||
\global\parskip 15pt plus 1pt
|
\internalpagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm}%
|
||||||
\advance\baselineskip by 1.6pt
|
%
|
||||||
\changepagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm}
|
\globaldefs = 0
|
||||||
}
|
}}
|
||||||
|
|
||||||
% Use @afourwide to print on European A4 paper in wide format.
|
% Use @afourwide to print on European A4 paper in wide format.
|
||||||
\def\afourwide{\afourpaper
|
\def\afourwide{%
|
||||||
\changepagesizes{9.5in}{6.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}}
|
\afourpaper
|
||||||
|
\internalpagesizes{9.5in}{6.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}%
|
||||||
|
%
|
||||||
|
\globaldefs = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
|
||||||
|
% Perhaps we should allow setting the margins, \topskip, \parskip,
|
||||||
|
% and/or leading, also. Or perhaps we should compute them somehow.
|
||||||
|
%
|
||||||
|
\def\pagesizes{\parsearg\pagesizesxxx}
|
||||||
|
\def\pagesizesxxx#1{\pagesizesyyy #1,,\finish}
|
||||||
|
\def\pagesizesyyy#1,#2,#3\finish{{%
|
||||||
|
\setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
|
||||||
|
\globaldefs = 1
|
||||||
|
%
|
||||||
|
\parskip = 3pt plus 2pt minus 1pt
|
||||||
|
\setleading{13.2pt}%
|
||||||
|
%
|
||||||
|
\internalpagesizes{#1}{\hsize}{\voffset}{\normaloffset}{\bindingoffset}{44pt}%
|
||||||
|
}}
|
||||||
|
|
||||||
|
% Set default to letter.
|
||||||
|
%
|
||||||
|
\letterpaper
|
||||||
|
|
||||||
|
\message{and turning on texinfo input format.}
|
||||||
|
|
||||||
% Define macros to output various characters with catcode for normal text.
|
% Define macros to output various characters with catcode for normal text.
|
||||||
\catcode`\"=\other
|
\catcode`\"=\other
|
||||||
|
|
21
gcc/tm.texi
21
gcc/tm.texi
|
@ -283,6 +283,15 @@ the argument @samp{-lgcc} to tell the linker to do the search.
|
||||||
This macro is similar to @code{LINK_LIBGCC_SPECIAL}, except that it does
|
This macro is similar to @code{LINK_LIBGCC_SPECIAL}, except that it does
|
||||||
not affect @samp{-L} options.
|
not affect @samp{-L} options.
|
||||||
|
|
||||||
|
@findex LINK_COMMAND_SPEC
|
||||||
|
@item LINK_COMMAND_SPEC
|
||||||
|
A C string constant giving the complete command line need to execute the
|
||||||
|
linker. When you do this, you will need to update your port each time a
|
||||||
|
change is made to the link command line within @file{gcc.c}. Therefore,
|
||||||
|
define this macro only if you need to completely redefine the command
|
||||||
|
line for invoking the linker and there is no other way to accomplish
|
||||||
|
the effect you need.
|
||||||
|
|
||||||
@findex MULTILIB_DEFAULTS
|
@findex MULTILIB_DEFAULTS
|
||||||
@item MULTILIB_DEFAULTS
|
@item MULTILIB_DEFAULTS
|
||||||
Define this macro as a C expression for the initializer of an array of
|
Define this macro as a C expression for the initializer of an array of
|
||||||
|
@ -6723,6 +6732,13 @@ define @code{INCOMING_RETURN_ADDR_RTX} and either set
|
||||||
prologue, or call @code{dwarf2out_def_cfa} and @code{dwarf2out_reg_save}
|
prologue, or call @code{dwarf2out_def_cfa} and @code{dwarf2out_reg_save}
|
||||||
as appropriate from @code{FUNCTION_PROLOGUE} if you don't.
|
as appropriate from @code{FUNCTION_PROLOGUE} if you don't.
|
||||||
|
|
||||||
|
@findex DWARF2_FRAME_INFO
|
||||||
|
@item DWARF2_FRAME_INFO
|
||||||
|
Define this macro to a nonzero value if GNU CC should always output
|
||||||
|
Dwarf 2 frame information. If @code{DWARF2_UNWIND_INFO}
|
||||||
|
(@pxref{Exception Region Output} is nonzero, GNU CC will output this
|
||||||
|
information not matter how you define @code{DWARF2_FRAME_INFO}.
|
||||||
|
|
||||||
@findex LINKER_DOES_NOT_WORK_WITH_DWARF2
|
@findex LINKER_DOES_NOT_WORK_WITH_DWARF2
|
||||||
@item LINKER_DOES_NOT_WORK_WITH_DWARF2
|
@item LINKER_DOES_NOT_WORK_WITH_DWARF2
|
||||||
Define this macro if the linker does not work with Dwarf version 2.
|
Define this macro if the linker does not work with Dwarf version 2.
|
||||||
|
@ -7316,6 +7332,11 @@ of @var{olddecl}. Examples of when this is needed are when one attribute
|
||||||
overrides another, or when an attribute is nullified by a subsequent
|
overrides another, or when an attribute is nullified by a subsequent
|
||||||
definition.
|
definition.
|
||||||
|
|
||||||
|
@findex SET_DEFAULT_DECL_ATTRIBUTES
|
||||||
|
@item SET_DEFAULT_DECL_ATTRIBUTES (@var{decl}, @var{attributes})
|
||||||
|
If defined, a C statement that assigns default attributes to
|
||||||
|
newly defined @var{decl}.
|
||||||
|
|
||||||
@findex DOLLARS_IN_IDENTIFIERS
|
@findex DOLLARS_IN_IDENTIFIERS
|
||||||
@item DOLLARS_IN_IDENTIFIERS
|
@item DOLLARS_IN_IDENTIFIERS
|
||||||
Define this macro to control use of the character @samp{$} in identifier
|
Define this macro to control use of the character @samp{$} in identifier
|
||||||
|
|
23
gcc/toplev.c
23
gcc/toplev.c
|
@ -495,6 +495,11 @@ int flag_move_all_movables = 0;
|
||||||
|
|
||||||
int flag_reduce_all_givs = 0;
|
int flag_reduce_all_givs = 0;
|
||||||
|
|
||||||
|
/* Nonzero to perform full register move optimization passes. This is the
|
||||||
|
default for -O2. */
|
||||||
|
|
||||||
|
int flag_regmove = 0;
|
||||||
|
|
||||||
/* Nonzero for -fwritable-strings:
|
/* Nonzero for -fwritable-strings:
|
||||||
store string constants in data segment and don't uniquize them. */
|
store string constants in data segment and don't uniquize them. */
|
||||||
|
|
||||||
|
@ -701,8 +706,6 @@ int flag_check_memory_usage = 0;
|
||||||
-fcheck-memory-usage. */
|
-fcheck-memory-usage. */
|
||||||
int flag_prefix_function_name = 0;
|
int flag_prefix_function_name = 0;
|
||||||
|
|
||||||
int flag_regmove = 0;
|
|
||||||
|
|
||||||
/* 0 if pointer arguments may alias each other. True in C.
|
/* 0 if pointer arguments may alias each other. True in C.
|
||||||
1 if pointer arguments may not alias each other but may alias
|
1 if pointer arguments may not alias each other but may alias
|
||||||
global variables.
|
global variables.
|
||||||
|
@ -717,6 +720,8 @@ int flag_argument_noalias = 0;
|
||||||
if alias analysis (in general) is enabled. */
|
if alias analysis (in general) is enabled. */
|
||||||
int flag_strict_aliasing = 0;
|
int flag_strict_aliasing = 0;
|
||||||
|
|
||||||
|
extern int flag_dump_unnumbered;
|
||||||
|
|
||||||
/* Table of language-independent -f options.
|
/* Table of language-independent -f options.
|
||||||
STRING is the option name. VARIABLE is the address of the variable.
|
STRING is the option name. VARIABLE is the address of the variable.
|
||||||
ON_VALUE is the value to store in VARIABLE
|
ON_VALUE is the value to store in VARIABLE
|
||||||
|
@ -783,6 +788,7 @@ struct { char *string; int *variable; int on_value;} f_options[] =
|
||||||
{"verbose-asm", &flag_verbose_asm, 1},
|
{"verbose-asm", &flag_verbose_asm, 1},
|
||||||
{"gnu-linker", &flag_gnu_linker, 1},
|
{"gnu-linker", &flag_gnu_linker, 1},
|
||||||
{"regmove", &flag_regmove, 1},
|
{"regmove", &flag_regmove, 1},
|
||||||
|
{"optimize-register-move", &flag_regmove, 1},
|
||||||
{"pack-struct", &flag_pack_struct, 1},
|
{"pack-struct", &flag_pack_struct, 1},
|
||||||
{"stack-check", &flag_stack_check, 1},
|
{"stack-check", &flag_stack_check, 1},
|
||||||
{"argument-alias", &flag_argument_noalias, 0},
|
{"argument-alias", &flag_argument_noalias, 0},
|
||||||
|
@ -790,7 +796,8 @@ struct { char *string; int *variable; int on_value;} f_options[] =
|
||||||
{"argument-noalias-global", &flag_argument_noalias, 2},
|
{"argument-noalias-global", &flag_argument_noalias, 2},
|
||||||
{"strict-aliasing", &flag_strict_aliasing, 1},
|
{"strict-aliasing", &flag_strict_aliasing, 1},
|
||||||
{"check-memory-usage", &flag_check_memory_usage, 1},
|
{"check-memory-usage", &flag_check_memory_usage, 1},
|
||||||
{"prefix-function-name", &flag_prefix_function_name, 1}
|
{"prefix-function-name", &flag_prefix_function_name, 1},
|
||||||
|
{"dump-unnumbered", &flag_dump_unnumbered, 1}
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Table of language-specific options. */
|
/* Table of language-specific options. */
|
||||||
|
@ -3517,11 +3524,6 @@ rest_of_compilation (decl)
|
||||||
failure = reload (insns, 0, rtl_dump_file);
|
failure = reload (insns, 0, rtl_dump_file);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (global_reg_dump)
|
|
||||||
{
|
|
||||||
TIMEVAR (dump_time, dump_global_regs (rtl_dump_file));
|
|
||||||
close_dump_file (print_rtl_with_bb, insns);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (failure)
|
if (failure)
|
||||||
goto exit_rest_of_compilation;
|
goto exit_rest_of_compilation;
|
||||||
|
@ -3539,6 +3541,11 @@ rest_of_compilation (decl)
|
||||||
|
|
||||||
thread_prologue_and_epilogue_insns (insns);
|
thread_prologue_and_epilogue_insns (insns);
|
||||||
|
|
||||||
|
if (global_reg_dump)
|
||||||
|
{
|
||||||
|
TIMEVAR (dump_time, dump_global_regs (rtl_dump_file));
|
||||||
|
close_dump_file (print_rtl_with_bb, insns);
|
||||||
|
}
|
||||||
if (optimize > 0 && flag_schedule_insns_after_reload)
|
if (optimize > 0 && flag_schedule_insns_after_reload)
|
||||||
{
|
{
|
||||||
if (sched2_dump)
|
if (sched2_dump)
|
||||||
|
|
32
gcc/tree.c
32
gcc/tree.c
|
@ -4950,9 +4950,15 @@ get_set_constructor_bytes (init, buffer, wd_size)
|
||||||
}
|
}
|
||||||
return non_const_bits;
|
return non_const_bits;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_CHECKING
|
#ifdef ENABLE_CHECKING
|
||||||
/* Complain if the tree code does not match the expected one. */
|
|
||||||
|
/* Complain if the tree code does not match the expected one.
|
||||||
|
NODE is the tree node in question, CODE is the expected tree code,
|
||||||
|
and FILE and LINE are the filename and line number, respectively,
|
||||||
|
of the line on which the check was done. If NONFATAL is nonzero,
|
||||||
|
don't abort if the reference is invalid; instead, return 0.
|
||||||
|
If the reference is valid, return NODE. */
|
||||||
|
|
||||||
tree
|
tree
|
||||||
tree_check (node, code, file, line, nofatal)
|
tree_check (node, code, file, line, nofatal)
|
||||||
|
@ -4962,19 +4968,17 @@ tree_check (node, code, file, line, nofatal)
|
||||||
int line;
|
int line;
|
||||||
int nofatal;
|
int nofatal;
|
||||||
{
|
{
|
||||||
if (TREE_CODE (node) != code)
|
if (TREE_CODE (node) == code)
|
||||||
{
|
return node;
|
||||||
if (nofatal)
|
else if (nofatal)
|
||||||
return 0;
|
return 0;
|
||||||
else
|
else
|
||||||
fatal ("%s:%d: Expect %s, have %s\n", file, line,
|
fatal ("%s:%d: Expect %s, have %s\n", file, line,
|
||||||
tree_code_name[code], tree_code_name[TREE_CODE (node)]);
|
tree_code_name[code], tree_code_name[TREE_CODE (node)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return node;
|
/* Similar to above, except that we check for a class of tree
|
||||||
}
|
code, given in CL. */
|
||||||
|
|
||||||
/* Complain if the class of the tree node does not match. */
|
|
||||||
|
|
||||||
tree
|
tree
|
||||||
tree_class_check (node, cl, file, line, nofatal)
|
tree_class_check (node, cl, file, line, nofatal)
|
||||||
|
@ -4984,18 +4988,16 @@ tree_class_check (node, cl, file, line, nofatal)
|
||||||
int line;
|
int line;
|
||||||
int nofatal;
|
int nofatal;
|
||||||
{
|
{
|
||||||
if (TREE_CODE_CLASS (TREE_CODE (node)) != cl)
|
if (TREE_CODE_CLASS (TREE_CODE (node)) == cl)
|
||||||
{
|
return node;
|
||||||
if (nofatal)
|
else if (nofatal)
|
||||||
return 0;
|
return 0;
|
||||||
else
|
else
|
||||||
fatal ("%s:%d: Expect '%c', have '%s'\n", file, line,
|
fatal ("%s:%d: Expect '%c', have '%s'\n", file, line,
|
||||||
cl, tree_code_name[TREE_CODE (node)]);
|
cl, tree_code_name[TREE_CODE (node)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return node;
|
/* Likewise, but complain if the tree node is not an expression. */
|
||||||
}
|
|
||||||
/* Complain if the node is not an expression. */
|
|
||||||
|
|
||||||
tree
|
tree
|
||||||
expr_check (node, ignored, file, line, nofatal)
|
expr_check (node, ignored, file, line, nofatal)
|
||||||
|
|
|
@ -1610,7 +1610,7 @@ extern tree save_expr PROTO((tree));
|
||||||
extern int first_rtl_op PROTO((enum tree_code));
|
extern int first_rtl_op PROTO((enum tree_code));
|
||||||
|
|
||||||
/* unsave_expr (EXP) returns an expression equivalent to EXP but it
|
/* unsave_expr (EXP) returns an expression equivalent to EXP but it
|
||||||
can be used multiple times and will evaluate EXP, in it's entirety
|
can be used multiple times and will evaluate EXP, in its entirety
|
||||||
each time. */
|
each time. */
|
||||||
|
|
||||||
extern tree unsave_expr PROTO((tree));
|
extern tree unsave_expr PROTO((tree));
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
char *version_string = "egcs-2.91.43 19980629 (gcc2 ss-980502 experimental)";
|
char *version_string = "egcs-2.91.45 19980628 (gcc2 ss-980609 experimental)";
|
||||||
|
|
Loading…
Reference in New Issue