* 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)
|
||||
|
||||
* Merge from gcc2 June 9, 1998 snapshot. See ChangeLog.13 for
|
||||
details.
|
||||
|
||||
* 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>
|
||||
|
1503
gcc/ChangeLog.13
Normal file
1503
gcc/ChangeLog.13
Normal file
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.
|
||||
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-attr.h insn-attrtab.c insn-opinit.c genrtl.c genrtl.h tree-check.h \
|
||||
s-flags s-config s-codes s-mlib \
|
||||
s-output s-recog s-emit s-extract s-peep \
|
||||
s-flags s-config s-codes s-mlib s-under\
|
||||
s-output s-recog s-emit s-extract s-peep s-check \
|
||||
s-attr s-attrtab s-opinit s-crt s-crtS s-crt0 \
|
||||
genemit$(build_exeext) genoutput$(build_exeext) genrecog$(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
|
||||
|
||||
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
|
||||
|
||||
insn-emit.c: s-emit ; @true
|
||||
@ -2500,11 +2499,13 @@ uninstall: lang.uninstall
|
||||
-rm -rf $(bindir)/$(GCC_CROSS_NAME)$(exeext)
|
||||
-rm -rf $(bindir)/protoize$(exeext)
|
||||
-rm -rf $(bindir)/unprotoize$(exeext)
|
||||
-rm -rf $(bindir)/gcov$(exeext)
|
||||
-rm -rf $(mandir)/$(GCC_INSTALL_NAME)$(manext)
|
||||
-rm -rf $(mandir)/$(GCC_CROSS_NAME)$(manext)
|
||||
-rm -rf $(mandir)/cccp$(manext)
|
||||
-rm -rf $(mandir)/protoize$(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
|
||||
# contains global variables that all the testsuites will use.
|
||||
|
@ -64,4 +64,7 @@
|
||||
|
||||
/* Whether getwd must be declared even if <unistd.h> is included. */
|
||||
#undef NEED_DECLARATION_GETWD
|
||||
|
||||
/* Define if you want expensive run-time checks. */
|
||||
#undef ENABLE_CHECKING
|
||||
@TOP@
|
||||
|
@ -3798,6 +3798,10 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes)
|
||||
if (! flag_no_common || ! TREE_PUBLIC (decl))
|
||||
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. */
|
||||
decl_attributes (decl, attributes, prefix_attributes);
|
||||
|
||||
|
@ -544,6 +544,11 @@ check_newline ()
|
||||
token = yylex ();
|
||||
if (token != IDENTIFIER)
|
||||
goto skipline;
|
||||
if (nextchar >= 0)
|
||||
c = nextchar, nextchar = -1;
|
||||
else
|
||||
c = GETC ();
|
||||
ungetc (c, finput);
|
||||
if (HANDLE_PRAGMA (finput, yylval.ttype))
|
||||
{
|
||||
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
|
||||
replace the TRUNCATE with a SUBREG. */
|
||||
if (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) <= HOST_BITS_PER_WIDE_INT
|
||||
&& (nonzero_bits (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
|
||||
&~ GET_MODE_MASK (mode)) == 0)
|
||||
if (num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
|
||||
>= GET_MODE_BITSIZE (mode) + 1)
|
||||
return gen_lowpart_for_combine (mode, XEXP (x, 0));
|
||||
|
||||
/* 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.
|
||||
|
||||
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
|
||||
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 y;
|
||||
{
|
||||
rtx last_x, last_y;
|
||||
|
||||
if (x == y || rtx_equal_p (x, y))
|
||||
return 1;
|
||||
|
||||
@ -6976,19 +6973,12 @@ rtx_equal_for_field_assignment_p (x, y)
|
||||
gen_lowpart_for_combine (GET_MODE (SUBREG_REG (x)), y)))
|
||||
return 1;
|
||||
|
||||
last_x = get_last_value (x);
|
||||
last_y = get_last_value (y);
|
||||
|
||||
return ((last_x != 0
|
||||
&& GET_CODE (last_x) != CLOBBER
|
||||
&& rtx_equal_for_field_assignment_p (last_x, y))
|
||||
|| (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)));
|
||||
/* We used to see if get_last_value of X and Y were the same but that's
|
||||
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
|
||||
insn that might have already have been dead. So fail if none of the
|
||||
above cases are true. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* 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
|
||||
&& ((mode_width
|
||||
>= 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
|
||||
&& mode_width <= HOST_BITS_PER_WIDE_INT
|
||||
&& (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (XEXP (op0, 0))))
|
||||
<= HOST_BITS_PER_WIDE_INT)
|
||||
&& (INTVAL (XEXP (op0, 1)) & ~ mask) == 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
|
||||
|
@ -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;
|
||||
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
|
||||
|
@ -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
|
||||
reference to an unaligned location.
|
||||
|
||||
`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) \
|
||||
((C) == 'Q' ? GET_CODE (OP) == MEM && GET_CODE (XEXP (OP, 0)) != AND \
|
||||
: (C) == 'R' ? current_file_function_operand (OP, Pmode) \
|
||||
((C) == 'Q' ? GET_CODE (OP) == MEM && GET_CODE (XEXP (OP, 0)) != AND \
|
||||
: (C) == 'R' ? current_file_function_operand (OP, Pmode) \
|
||||
: (C) == 'S' ? (GET_CODE (OP) == CONST_INT \
|
||||
&& (unsigned HOST_WIDE_INT) INTVAL (OP) < 64) \
|
||||
: 0)
|
||||
|
||||
/* Given an rtx X being reloaded into a reg required to be
|
||||
@ -1202,38 +1207,8 @@ extern void output_end_prologue ();
|
||||
to initialize the "hint" field in the JMP insn. Note that the hint
|
||||
field is PC (new) + 4 * bits 13:0. */
|
||||
|
||||
#define 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)); \
|
||||
}
|
||||
#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
|
||||
alpha_initialize_trampoline (TRAMP, FNADDR, CXT)
|
||||
|
||||
/* Attempt to turn on access permissions for the stack. */
|
||||
|
||||
@ -2127,6 +2102,7 @@ do { \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
|
||||
/* Define results of standard character escape sequences. */
|
||||
#define TARGET_BELL 007
|
||||
#define TARGET_BS 010
|
||||
|
@ -1177,7 +1177,7 @@
|
||||
(define_insn "ashldi3"
|
||||
[(set (match_operand:DI 0 "register_operand" "=r,r")
|
||||
(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"
|
||||
[(set (match_operand:DI 0 "register_operand" "=r")
|
||||
(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"
|
||||
[(set_attr "type" "shift")])
|
||||
@ -1226,7 +1226,7 @@
|
||||
(define_insn "ashrdi3"
|
||||
[(set (match_operand:DI 0 "register_operand" "=r")
|
||||
(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"
|
||||
[(set_attr "type" "shift")])
|
||||
|
@ -1,7 +1,7 @@
|
||||
/* Definitions of target machine for GNU compiler,
|
||||
for Alpha Linux-based GNU systems.
|
||||
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
|
||||
Contributed by Richard Henderson.
|
||||
/* Definitions of target machine for GNU compiler, for Alpha Linux-based GNU
|
||||
systems using ECOFF.
|
||||
Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||
Contributed by Bob Manson.
|
||||
|
||||
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
|
||||
#define TARGET_CAN_FAULT_IN_PROLOGUE 1
|
||||
|
||||
/* Emit RTL insns to initialize the variable parts of a trampoline.
|
||||
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)); \
|
||||
}
|
||||
#undef ASM_FINAL_SPEC
|
||||
|
@ -1910,7 +1910,7 @@ arc_final_prescan_insn (insn, opvec, noperands)
|
||||
record_cc_ref (insn);
|
||||
|
||||
/* 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. */
|
||||
if (optimize < 2 || TARGET_NO_COND_EXEC)
|
||||
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
|
||||
between pointers and any other objects of this machine mode. */
|
||||
/* ??? 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. */
|
||||
#define Pmode SImode
|
||||
|
||||
|
@ -138,7 +138,7 @@ extern char *output_block_move();
|
||||
/* Tell gcc where to look for the startfile */
|
||||
#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"
|
||||
|
||||
/* Command line options to the AT&T assembler */
|
||||
|
@ -3037,7 +3037,7 @@ output_simode_bld (bild, log2, operands)
|
||||
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.
|
||||
|
||||
We use this to get the lengths of various memory references correct. */
|
||||
|
@ -439,8 +439,8 @@
|
||||
[(set (cc0)
|
||||
(match_operator 2 "VOIDmode_compare_op"
|
||||
[(float_extend:XF
|
||||
(match_operand:DF 1 "nonimmediate_operand" "fm"))
|
||||
(match_operand:XF 0 "register_operand" "f")]))
|
||||
(match_operand:DF 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);")
|
||||
@ -455,6 +455,16 @@
|
||||
"TARGET_80387"
|
||||
"* 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 ""
|
||||
[(set (cc0)
|
||||
(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.
|
||||
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)
|
||||
|
||||
This file is part of GNU CC.
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* Definitions for Intel 386 running Linux-based GNU systems with pre-BFD
|
||||
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)
|
||||
|
||||
This file is part of GNU CC.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Definitions for Intel 386 running Linux with ELF format
|
||||
Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||
/* Definitions for Intel 386 running Linux-based GNU systems with ELF format.
|
||||
Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||
Contributed by Eric Youngdale.
|
||||
Modified for stabs-in-ELF by H.J. Lu.
|
||||
|
||||
|
@ -1910,7 +1910,7 @@ do { \
|
||||
After generation of rtl, the compiler makes no further distinction
|
||||
between pointers and any other objects of this machine mode. */
|
||||
/* ??? 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. */
|
||||
#define Pmode SImode
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
|
||||
|
@ -2079,7 +2079,7 @@ do { \
|
||||
sprintf (LABEL, TARGET_SVR4 ? "*.%s%d" : "*@%s%d", PREFIX, NUM)
|
||||
|
||||
/* 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 ) \
|
||||
{ union { \
|
||||
REAL_VALUE_TYPE d; \
|
||||
|
@ -1125,7 +1125,7 @@
|
||||
;; The comparison operations store the comparison into a register and
|
||||
;; record that register. The following Bxx or Sxx insn uses that
|
||||
;; 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
|
||||
;; 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
|
||||
;; strength reduction is used. It is actually created when the instruction
|
||||
;; 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
|
||||
;; 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
|
||||
#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
|
||||
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. */
|
||||
|
@ -3992,7 +3992,7 @@ while (0)
|
||||
#define ASM_OUTPUT_SOURCE_LINE(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
|
||||
pattern $L[a-z].*. The machine independent portion of GCC creates
|
||||
labels matching: $L[A-Z][0-9]+ and $L[0-9]+.
|
||||
|
@ -4626,7 +4626,7 @@ move\\t%0,%z4\\n\\
|
||||
|
||||
(define_expand "reload_indi"
|
||||
[(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"))]
|
||||
"TARGET_64BIT"
|
||||
"
|
||||
@ -4641,10 +4641,12 @@ move\\t%0,%z4\\n\\
|
||||
if (GET_CODE (operands[1]) == MEM)
|
||||
{
|
||||
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));
|
||||
memword = change_address (operands[1], SImode, NULL_RTX);
|
||||
offword = change_address (adj_offsettable_operand (operands[1], 4),
|
||||
memword = change_address (op1, SImode, NULL_RTX);
|
||||
offword = change_address (adj_offsettable_operand (op1, 4),
|
||||
SImode, NULL_RTX);
|
||||
if (BYTES_BIG_ENDIAN)
|
||||
{
|
||||
@ -4693,7 +4695,7 @@ move\\t%0,%z4\\n\\
|
||||
;; use a TImode scratch reg.
|
||||
|
||||
(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"))
|
||||
(clobber (match_operand:TI 2 "register_operand" "=&d"))]
|
||||
"TARGET_64BIT"
|
||||
@ -4715,10 +4717,12 @@ move\\t%0,%z4\\n\\
|
||||
if (GET_CODE (operands[0]) == MEM)
|
||||
{
|
||||
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]));
|
||||
memword = change_address (operands[0], SImode, NULL_RTX);
|
||||
offword = change_address (adj_offsettable_operand (operands[0], 4),
|
||||
memword = change_address (op0, SImode, NULL_RTX);
|
||||
offword = change_address (adj_offsettable_operand (op0, 4),
|
||||
SImode, NULL_RTX);
|
||||
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);
|
||||
PUT_IMMEDIATE_PREFIX(file);
|
||||
#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]);
|
||||
#else
|
||||
#ifdef ENCORE_ASM
|
||||
|
@ -1390,7 +1390,7 @@ extern char leaf_reg_remap[];
|
||||
: gen_rtx_MEM (MODE, gen_rtx_PLUS (Pmode, frame_pointer_rtx, \
|
||||
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.
|
||||
For v8 we copy the default definition. */
|
||||
#define SECONDARY_MEMORY_NEEDED_MODE(MODE) \
|
||||
|
@ -5614,7 +5614,7 @@ if (! TARGET_ARCH64)
|
||||
if (GET_CODE (XEXP (operands[0], 0)) == LABEL_REF)
|
||||
{
|
||||
/* 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
|
||||
call-clobbered registers? We lose this if it is a JUMP_INSN.
|
||||
|
10
gcc/configure
vendored
10
gcc/configure
vendored
@ -2261,6 +2261,14 @@ for machine in $build $host $target; do
|
||||
;;
|
||||
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*)
|
||||
tm_file="${tm_file} alpha/win-nt.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.
|
||||
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_alignment_features=
|
||||
if [ -x as$host_exeext ]; then
|
||||
|
@ -417,6 +417,14 @@ for machine in $build $host $target; do
|
||||
;;
|
||||
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*)
|
||||
tm_file="${tm_file} alpha/win-nt.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
|
||||
# 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.
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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)
|
||||
Rewritten by Fred Fish (fnf@cygnus.com) for ARM and Lucid demangling
|
||||
|
||||
@ -3128,8 +3128,8 @@ forget_types (work)
|
||||
foo__FiR3fooT1T2T1T2
|
||||
__ct__3fooFiR3fooT1T2T1T2
|
||||
|
||||
Note that g++ bases it's type numbers starting at zero and counts all
|
||||
previously seen types, while lucid/ARM bases it's type numbers starting
|
||||
Note that g++ bases its type numbers starting at zero and counts all
|
||||
previously seen types, while lucid/ARM bases its type numbers starting
|
||||
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
|
||||
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));
|
||||
|
||||
/* 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.
|
||||
|
||||
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
|
||||
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
|
||||
particular compilation. */
|
||||
if (GET_CODE (home) == REG)
|
||||
|
@ -59,6 +59,9 @@ int
|
||||
dwarf2out_do_frame ()
|
||||
{
|
||||
return (write_symbols == DWARF2_DEBUG
|
||||
#ifdef DWARF2_FRAME_INFO
|
||||
|| DWARF2_FRAME_INFO
|
||||
#endif
|
||||
#ifdef DWARF2_UNWIND_INFO
|
||||
|| (flag_exceptions && ! exceptions_via_longjmp)
|
||||
#endif
|
||||
@ -9188,7 +9191,7 @@ gen_block_die (stmt, context_die, depth)
|
||||
}
|
||||
|
||||
/* 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
|
||||
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 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. */
|
||||
|
||||
/* 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;
|
||||
enum machine_mode mode;
|
||||
enum machine_mode double_mode;
|
||||
|
||||
no_line_numbers = ! line_numbers;
|
||||
|
||||
@ -3394,6 +3396,7 @@ init_emit_once (line_numbers)
|
||||
|
||||
byte_mode = VOIDmode;
|
||||
word_mode = VOIDmode;
|
||||
double_mode = VOIDmode;
|
||||
|
||||
for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
|
||||
mode = GET_MODE_WIDER_MODE (mode))
|
||||
@ -3407,6 +3410,18 @@ init_emit_once (line_numbers)
|
||||
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);
|
||||
|
||||
/* Create the unique rtx's for certain rtx codes and operand values. */
|
||||
@ -3424,10 +3439,10 @@ init_emit_once (line_numbers)
|
||||
else
|
||||
const_true_rtx = gen_rtx_CONST_INT (VOIDmode, STORE_FLAG_VALUE);
|
||||
|
||||
dconst0 = REAL_VALUE_ATOF ("0", DFmode);
|
||||
dconst1 = REAL_VALUE_ATOF ("1", DFmode);
|
||||
dconst2 = REAL_VALUE_ATOF ("2", DFmode);
|
||||
dconstm1 = REAL_VALUE_ATOF ("-1", DFmode);
|
||||
dconst0 = REAL_VALUE_ATOF ("0", double_mode);
|
||||
dconst1 = REAL_VALUE_ATOF ("1", double_mode);
|
||||
dconst2 = REAL_VALUE_ATOF ("2", double_mode);
|
||||
dconstm1 = REAL_VALUE_ATOF ("-1", double_mode);
|
||||
|
||||
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
|
||||
spot AFTER we call start_sequence, since it will reuse the rtl it
|
||||
makes. */
|
||||
|
||||
free_point = (char *) oballoc (0);
|
||||
|
||||
reg = gen_rtx (REG, word_mode, 10000);
|
||||
|
||||
zero_cost = rtx_cost (const0_rtx, 0);
|
||||
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 add_target
|
||||
= (opno == alg.ops - 1 && target != 0 && variant != add_variant
|
||||
? target : 0);
|
||||
&& ! preserve)
|
||||
? target : 0;
|
||||
rtx accum_target = preserve ? 0 : accum;
|
||||
|
||||
switch (alg.op[opno])
|
||||
@ -2746,6 +2748,7 @@ expand_divmod (rem_flag, code, mode, op0, op1, target, unsignedp)
|
||||
optab optab1, optab2;
|
||||
int op1_is_constant, op1_is_pow2;
|
||||
int max_cost, extra_cost;
|
||||
static HOST_WIDE_INT last_div_const = 0;
|
||||
|
||||
op1_is_constant = GET_CODE (op1) == CONST_INT;
|
||||
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);
|
||||
#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]
|
||||
- (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. */
|
||||
if (compute_mode != mode)
|
||||
|
64
gcc/expr.c
64
gcc/expr.c
@ -239,13 +239,22 @@ init_expr_once ()
|
||||
{
|
||||
rtx insn, pat;
|
||||
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.
|
||||
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. */
|
||||
rtx mem = gen_rtx_MEM (VOIDmode, stack_pointer_rtx);
|
||||
rtx mem1 = gen_rtx_MEM (VOIDmode, frame_pointer_rtx);
|
||||
mem = gen_rtx_MEM (VOIDmode, stack_pointer_rtx);
|
||||
mem1 = gen_rtx_MEM (VOIDmode, frame_pointer_rtx);
|
||||
|
||||
start_sequence ();
|
||||
insn = emit_insn (gen_rtx_SET (0, NULL_RTX, NULL_RTX));
|
||||
pat = PATTERN (insn);
|
||||
|
||||
@ -296,6 +305,7 @@ init_expr_once ()
|
||||
}
|
||||
|
||||
end_sequence ();
|
||||
obfree (free_point);
|
||||
}
|
||||
|
||||
/* 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);
|
||||
/* If address was computed by addition,
|
||||
mark this as an element of an aggregate. */
|
||||
if (TREE_CODE (TREE_OPERAND (exp, 0)) == PLUS_EXPR
|
||||
|| (TREE_CODE (TREE_OPERAND (exp, 0)) == SAVE_EXPR
|
||||
&& TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)) == PLUS_EXPR)
|
||||
if (TREE_CODE (exp1) == PLUS_EXPR
|
||||
|| (TREE_CODE (exp1) == SAVE_EXPR
|
||||
&& TREE_CODE (TREE_OPERAND (exp1, 0)) == PLUS_EXPR)
|
||||
|| 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
|
||||
&& (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_VOLATILE_P (temp) = TREE_THIS_VOLATILE (exp) | flag_volatile;
|
||||
MEM_ALIAS_SET (temp) = get_alias_set (exp);
|
||||
@ -7916,13 +7939,14 @@ expand_builtin_setjmp (buf_addr, target, first_label, next_label)
|
||||
|
||||
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
|
||||
#define BUILTIN_SETJMP_FRAME_VALUE virtual_stack_vars_rtx
|
||||
#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),
|
||||
BUILTIN_SETJMP_FRAME_VALUE);
|
||||
emit_move_insn (validize_mem
|
||||
@ -10148,10 +10172,8 @@ do_jump (exp, if_false_label, if_true_label)
|
||||
{
|
||||
tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
|
||||
|
||||
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_COMPLEX_FLOAT
|
||||
|| GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_INT)
|
||||
if (GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_FLOAT
|
||||
|| GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_INT)
|
||||
{
|
||||
tree exp0 = save_expr (TREE_OPERAND (exp, 0));
|
||||
tree exp1 = save_expr (TREE_OPERAND (exp, 1));
|
||||
@ -10174,6 +10196,10 @@ do_jump (exp, if_false_label, if_true_label)
|
||||
exp1)))))),
|
||||
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
|
||||
&& !can_compare_p (TYPE_MODE (inner_type)))
|
||||
do_jump_by_parts_equality (exp, if_false_label, if_true_label);
|
||||
@ -10186,10 +10212,8 @@ do_jump (exp, if_false_label, if_true_label)
|
||||
{
|
||||
tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
|
||||
|
||||
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_COMPLEX_FLOAT
|
||||
|| GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_INT)
|
||||
if (GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_FLOAT
|
||||
|| GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_INT)
|
||||
{
|
||||
tree exp0 = save_expr (TREE_OPERAND (exp, 0));
|
||||
tree exp1 = save_expr (TREE_OPERAND (exp, 1));
|
||||
@ -10212,6 +10236,10 @@ do_jump (exp, if_false_label, if_true_label)
|
||||
exp1)))))),
|
||||
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
|
||||
&& !can_compare_p (TYPE_MODE (inner_type)))
|
||||
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)
|
||||
#include "gstab.h" /* If doing DBX on sysV, use our own stab.h. */
|
||||
#else
|
||||
#include <stab.h> /* On BSD, use the system's stab.h. */
|
||||
#endif /* not USG */
|
||||
#include <stab.h>
|
||||
#endif
|
||||
|
||||
#endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
|
||||
|
||||
#ifdef XCOFF_DEBUGGING_INFO
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
|
||||
|
@ -2381,7 +2381,7 @@ find_auto_inc (needed, x, insn)
|
||||
{
|
||||
/* We have *p followed sometime later by q = p+size.
|
||||
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.
|
||||
Then fall into the usual case. */
|
||||
rtx insns, temp;
|
||||
@ -3132,6 +3132,7 @@ print_rtl_with_bb (outf, rtx_first)
|
||||
FILE *outf;
|
||||
rtx rtx_first;
|
||||
{
|
||||
extern int flag_dump_unnumbered;
|
||||
register rtx tmp_rtx;
|
||||
|
||||
if (rtx_first == 0)
|
||||
@ -3196,7 +3197,9 @@ print_rtl_with_bb (outf, rtx_first)
|
||||
if ((bb = end[INSN_UID (tmp_rtx)]) >= 0)
|
||||
fprintf (outf, ";; End of basic block %d\n", bb);
|
||||
|
||||
putc ('\n', outf);
|
||||
if (! flag_dump_unnumbered
|
||||
|| GET_CODE (tmp_rtx) != NOTE || NOTE_LINE_NUMBER (tmp_rtx) < 0)
|
||||
putc ('\n', outf);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3293,14 +3293,16 @@ fold_range_test (exp)
|
||||
&& operand_equal_p (lhs, rhs, 0))
|
||||
{
|
||||
/* 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))
|
||||
return build (TREE_CODE (exp) == TRUTH_ANDIF_EXPR
|
||||
? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
|
||||
TREE_TYPE (exp), TREE_OPERAND (exp, 0),
|
||||
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);
|
||||
|
||||
@ -3997,7 +3999,9 @@ fold (expr)
|
||||
else if ((TREE_CODE (arg1) == COND_EXPR
|
||||
|| (TREE_CODE_CLASS (TREE_CODE (arg1)) == '<'
|
||||
&& 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 lhs = 0, rhs = 0;
|
||||
@ -4068,7 +4072,9 @@ fold (expr)
|
||||
else if ((TREE_CODE (arg0) == COND_EXPR
|
||||
|| (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<'
|
||||
&& 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 lhs = 0, rhs = 0;
|
||||
@ -4633,7 +4639,8 @@ fold (expr)
|
||||
if (real_onep (arg1))
|
||||
return non_lvalue (convert (type, arg0));
|
||||
/* 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);
|
||||
return build (PLUS_EXPR, type, arg, arg);
|
||||
@ -5656,14 +5663,16 @@ fold (expr)
|
||||
return t1 ? t1 : t;
|
||||
}
|
||||
|
||||
/* If this is a comparison of complex values and either or both
|
||||
sizes are a COMPLEX_EXPR, it is best to split up the comparisons
|
||||
and join them with a TRUTH_ANDIF_EXPR or TRUTH_ORIF_EXPR. This
|
||||
may prevent needless evaluations. */
|
||||
/* If this is a comparison of complex values and either or both sides
|
||||
are a COMPLEX_EXPR or COMPLEX_CST, it is best to split up the
|
||||
comparisons and join them with a TRUTH_ANDIF_EXPR or TRUTH_ORIF_EXPR.
|
||||
This may prevent needless evaluations. */
|
||||
if ((code == EQ_EXPR || code == NE_EXPR)
|
||||
&& TREE_CODE (TREE_TYPE (arg0)) == COMPLEX_TYPE
|
||||
&& (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 real0, imag0, real1, imag1;
|
||||
|
@ -1375,7 +1375,7 @@ put_var_into_stack (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);
|
||||
|
||||
/* 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 (XEXP (DECL_RTL (decl), 0)) == ADDRESSOF))
|
||||
/* 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
|
||||
must exclude such variable because their DECL_RTL might be
|
||||
set to strange things such as virtual_stack_vars_rtx. */
|
||||
|
@ -3547,7 +3547,7 @@ be compiled with the same
|
||||
value.
|
||||
.TP
|
||||
.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
|
||||
.B .s\c
|
||||
\&\|' 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.
|
||||
%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
|
||||
assembler has done it's job.
|
||||
assembler has done its job.
|
||||
%D Dump out a -L option for each directory in startfile_prefixes.
|
||||
If multilib_dir is set, extra entries are generated with it affixed.
|
||||
%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
|
||||
scripts which exist in user specified directories, or in standard
|
||||
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
|
||||
/* Don't generate -L options. */
|
||||
static char *link_command_spec = "\
|
||||
@ -774,6 +780,7 @@ static char *link_command_spec = "\
|
||||
%{T*}\
|
||||
\n }}}}}}";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* A vector of options to give to the linker.
|
||||
These options are accumulated by %x,
|
||||
|
@ -341,7 +341,9 @@ static char *alternative_name;
|
||||
|
||||
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;
|
||||
|
||||
/* Simplify an expression. Only call the routine if there is something to
|
||||
@ -2125,7 +2127,7 @@ expand_units ()
|
||||
if (unit->needs_range_function)
|
||||
{
|
||||
/* 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 = simplify_knowing (newexp, unit->condexp);
|
||||
|
||||
@ -4404,8 +4406,7 @@ gen_unit (def)
|
||||
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
|
||||
interpret them as logical unless they are inside a comparison expression.
|
||||
The first bit of FLAGS will be non-zero in that case.
|
||||
|
@ -38,10 +38,12 @@ int main (argc, argv)
|
||||
char *argv[];
|
||||
{
|
||||
int i;
|
||||
|
||||
switch (argc)
|
||||
{
|
||||
case 1:
|
||||
break;
|
||||
|
||||
default:
|
||||
usage ();
|
||||
exit (1);
|
||||
|
@ -778,6 +778,7 @@ from the machine description file `md'. */\n\n");
|
||||
printf ("#include \"insn-config.h\"\n\n");
|
||||
printf ("#include \"insn-flags.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 rtx recog_operand[];\n");
|
||||
printf ("#define operands emit_operand\n\n");
|
||||
|
@ -201,15 +201,18 @@ static char *posixly_correct;
|
||||
# define my_index strchr
|
||||
#else
|
||||
|
||||
# if HAVE_STRING_H
|
||||
# include <string.h>
|
||||
# else
|
||||
# include <strings.h>
|
||||
# endif
|
||||
|
||||
/* Avoid depending on library functions or files
|
||||
whose names are inconsistent. */
|
||||
|
||||
#ifndef getenv
|
||||
extern char *getenv ();
|
||||
#endif
|
||||
#ifndef strncmp
|
||||
extern int strncmp ();
|
||||
#endif
|
||||
|
||||
static char *
|
||||
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
|
||||
@samp{posix}. The possibilities for @var{type} are @samp{single},
|
||||
@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
|
||||
|
||||
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
|
||||
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
|
||||
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.
|
||||
|
||||
@item i386-sequent-ptx1*
|
||||
Sequent DYNIX/ptx 1.x.
|
||||
|
||||
@item i386-sequent-ptx2*
|
||||
Sequent DYNIX/ptx 2.x.
|
||||
@itemx i386-sequent-ptx2*
|
||||
You must install GNU @file{sed} before running @file{configure}.
|
||||
|
||||
@item i386-sun-sunos4
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
you must use gas if you wish to use gdb.
|
||||
|
||||
@item m68k-sun
|
||||
|
@ -145,7 +145,7 @@ in the following sections.
|
||||
@item Optimization Options
|
||||
@xref{Optimize Options,,Options that Control Optimization}.
|
||||
@smallexample
|
||||
-fbranch-probabilities
|
||||
-fbranch-probabilities -foptimize-register-moves
|
||||
-fcaller-saves -fcse-follow-jumps -fcse-skip-blocks
|
||||
-fdelayed-branch -fexpensive-optimizations
|
||||
-ffast-math -ffloat-store -fforce-addr -fforce-mem
|
||||
@ -2312,6 +2312,17 @@ This pass also performs global constant and copy propagation.
|
||||
@item -fexpensive-optimizations
|
||||
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
|
||||
If supported for the target machine, attempt to reorder instructions
|
||||
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.
|
||||
@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
|
||||
Allows the compiler to assume the strictest aliasing rules applicable to
|
||||
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.
|
||||
|
||||
@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.
|
||||
@end table
|
||||
|
||||
|
@ -937,7 +937,7 @@ enum alloc_type {
|
||||
grow linearly, and which are written in the object file as sequential
|
||||
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
|
||||
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.
|
||||
|
||||
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
|
||||
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. */
|
||||
|
||||
#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
|
||||
** 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_SETNUMBER(cls, num) \
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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
|
||||
|
||||
This file is part of GNU CC.
|
||||
@ -343,7 +343,7 @@ __objc_install_dispatch_table_for_class (Class class)
|
||||
{
|
||||
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 */
|
||||
if(!CLS_ISRESOLV(class))
|
||||
__objc_resolve_class_links();
|
||||
|
@ -53,6 +53,7 @@ static int indent;
|
||||
|
||||
extern char **insn_name_ptr;
|
||||
|
||||
int flag_dump_unnumbered = 0;
|
||||
/* Print IN_RTX onto OUTFILE. This is the recursive part of printing. */
|
||||
|
||||
static void
|
||||
@ -205,6 +206,9 @@ print_rtx (in_rtx)
|
||||
fputc (' ', outfile);
|
||||
DEBUG_PRINT_REG (in_rtx, 0, outfile);
|
||||
}
|
||||
else if (flag_dump_unnumbered
|
||||
&& (is_insn || GET_CODE (in_rtx) == NOTE))
|
||||
fprintf (outfile, "#");
|
||||
else
|
||||
fprintf (outfile, " %d", value);
|
||||
}
|
||||
@ -227,7 +231,12 @@ print_rtx (in_rtx)
|
||||
|
||||
case 'u':
|
||||
if (XEXP (in_rtx, i) != NULL)
|
||||
fprintf (outfile, " %d", INSN_UID (XEXP (in_rtx, i)));
|
||||
{
|
||||
if (flag_dump_unnumbered)
|
||||
fprintf (outfile, "#");
|
||||
else
|
||||
fprintf (outfile, " %d", INSN_UID (XEXP (in_rtx, i)));
|
||||
}
|
||||
else
|
||||
fprintf (outfile, " 0");
|
||||
sawclose = 0;
|
||||
@ -381,8 +390,13 @@ print_rtl (outf, rtx_first)
|
||||
case BARRIER:
|
||||
for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
|
||||
{
|
||||
print_rtx (tmp_rtx);
|
||||
fprintf (outfile, "\n");
|
||||
if (! flag_dump_unnumbered
|
||||
|| GET_CODE (tmp_rtx) != NOTE
|
||||
|| NOTE_LINE_NUMBER (tmp_rtx) < 0)
|
||||
{
|
||||
print_rtx (tmp_rtx);
|
||||
fprintf (outfile, "\n");
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@ -400,6 +414,10 @@ print_rtl_single (outf, x)
|
||||
{
|
||||
outfile = outf;
|
||||
sawclose = 0;
|
||||
print_rtx (x);
|
||||
putc ('\n', outf);
|
||||
if (! flag_dump_unnumbered
|
||||
|| GET_CODE (x) != NOTE || NOTE_LINE_NUMBER (x) < 0)
|
||||
{
|
||||
print_rtx (x);
|
||||
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
|
||||
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
|
||||
in the original source code. Just to make sure, we will get setup
|
||||
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
|
||||
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
|
||||
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. */
|
||||
|
||||
/* 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
|
||||
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
|
||||
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)
|
||||
then `long double' and `double' are both implemented, but they
|
||||
both mean DFmode. In this case, the software floating-point
|
||||
@ -686,7 +691,16 @@ ereal_atof (s, t)
|
||||
|
||||
switch (t)
|
||||
{
|
||||
#ifdef C4X
|
||||
case QFmode:
|
||||
case HFmode:
|
||||
asctoe53 (s, tem);
|
||||
e53toe (tem, e);
|
||||
break;
|
||||
#else
|
||||
case HFmode:
|
||||
#endif
|
||||
|
||||
case SFmode:
|
||||
asctoe24 (s, tem);
|
||||
e24toe (tem, e);
|
||||
@ -1045,11 +1059,21 @@ real_value_truncate (mode, arg)
|
||||
break;
|
||||
|
||||
case SFmode:
|
||||
#ifndef C4X
|
||||
case HFmode:
|
||||
#endif
|
||||
etoe24 (e, t);
|
||||
e24toe (t, t);
|
||||
break;
|
||||
|
||||
#ifdef C4X
|
||||
case HFmode:
|
||||
case QFmode:
|
||||
etoe53 (e, t);
|
||||
e53toe (t, t);
|
||||
break;
|
||||
#endif
|
||||
|
||||
case SImode:
|
||||
r = etrunci (arg);
|
||||
return (r);
|
||||
@ -3714,7 +3738,7 @@ toe53 (x, y)
|
||||
|
||||
#else /* it's neither DEC nor IBM */
|
||||
#ifdef C4X
|
||||
/* Convert e-type X to C4X-format double E. */
|
||||
/* Convert e-type X to C4X-format long double E. */
|
||||
|
||||
static void
|
||||
etoe53 (x, e)
|
||||
|
@ -439,7 +439,7 @@ init_regs ()
|
||||
memory_move_secondary_cost. */
|
||||
int 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
|
||||
}
|
||||
|
53
gcc/reload.c
53
gcc/reload.c
@ -2344,6 +2344,9 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
|
||||
rtx set = single_set (insn);
|
||||
int goal_earlyclobber, this_earlyclobber;
|
||||
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_is_asm = 0; /* Tentative. */
|
||||
@ -3219,6 +3222,15 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
|
||||
&& this_alternative_matches[i] < 0)
|
||||
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
|
||||
class by copying it to memory first, count that as another
|
||||
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];
|
||||
|
||||
/* Now record reloads for all the operands that need them. */
|
||||
last_output_reload_regno = -1;
|
||||
for (i = 0; i < noperands; i++)
|
||||
if (! goal_alternative_win[i])
|
||||
{
|
||||
@ -3661,20 +3674,27 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
|
||||
}
|
||||
}
|
||||
else if (goal_alternative_matched[i] == -1)
|
||||
operand_reloadnum[i]
|
||||
= push_reload (modified[i] != RELOAD_WRITE ? recog_operand[i] : 0,
|
||||
modified[i] != RELOAD_READ ? recog_operand[i] : 0,
|
||||
(modified[i] != RELOAD_WRITE
|
||||
? recog_operand_loc[i] : 0),
|
||||
modified[i] != RELOAD_READ ? recog_operand_loc[i] : 0,
|
||||
(enum reg_class) goal_alternative[i],
|
||||
(modified[i] == RELOAD_WRITE
|
||||
? VOIDmode : operand_mode[i]),
|
||||
(modified[i] == RELOAD_READ
|
||||
? VOIDmode : operand_mode[i]),
|
||||
(insn_code_number < 0 ? 0
|
||||
: insn_operand_strict_low[insn_code_number][i]),
|
||||
0, i, operand_type[i]);
|
||||
{
|
||||
operand_reloadnum[i]
|
||||
= push_reload ((modified[i] != RELOAD_WRITE
|
||||
? recog_operand[i] : 0),
|
||||
modified[i] != RELOAD_READ ? recog_operand[i] : 0,
|
||||
(modified[i] != RELOAD_WRITE
|
||||
? recog_operand_loc[i] : 0),
|
||||
(modified[i] != RELOAD_READ
|
||||
? recog_operand_loc[i] : 0),
|
||||
(enum reg_class) goal_alternative[i],
|
||||
(modified[i] == RELOAD_WRITE
|
||||
? VOIDmode : operand_mode[i]),
|
||||
(modified[i] == RELOAD_READ
|
||||
? VOIDmode : operand_mode[i]),
|
||||
(insn_code_number < 0 ? 0
|
||||
: insn_operand_strict_low[insn_code_number][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
|
||||
and the other must be output only.
|
||||
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]],
|
||||
0, 0, i, RELOAD_OTHER);
|
||||
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
|
||||
&& 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],
|
||||
0, 0, i, RELOAD_OTHER);
|
||||
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)
|
||||
abort ();
|
||||
|
@ -2080,13 +2080,20 @@ reload (first, global, dumpfile)
|
||||
{
|
||||
rtx addr = 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_mem[i]);
|
||||
in_struct = MEM_IN_STRUCT_P (reg_equiv_memory_loc[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])
|
||||
addr = reg_equiv_address[i];
|
||||
|
||||
if (addr)
|
||||
{
|
||||
if (reg_renumber[i] < 0)
|
||||
@ -2094,6 +2101,7 @@ reload (first, global, dumpfile)
|
||||
rtx reg = regno_reg_rtx[i];
|
||||
XEXP (reg, 0) = addr;
|
||||
REG_USERVAR_P (reg) = 0;
|
||||
RTX_UNCHANGING_P (reg) = is_readonly;
|
||||
MEM_IN_STRUCT_P (reg) = in_struct;
|
||||
/* We have no alias information about this newly created
|
||||
MEM. */
|
||||
@ -2565,7 +2573,14 @@ alter_reg (i, from_reg)
|
||||
{
|
||||
x = gen_rtx_MEM (GET_MODE (regno_reg_rtx[i]),
|
||||
plus_constant (XEXP (x, 0), adjust));
|
||||
RTX_UNCHANGING_P (x) = RTX_UNCHANGING_P (regno_reg_rtx[i]);
|
||||
|
||||
/* 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]);
|
||||
}
|
||||
|
||||
/* Save the stack slot for later. */
|
||||
|
@ -579,7 +579,7 @@ mark_set_resources (x, res, in_dest, include_delayed_effects)
|
||||
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 INSN:
|
||||
@ -983,7 +983,7 @@ add_to_delay_list (insn, delay_list)
|
||||
rtx delay_list;
|
||||
{
|
||||
/* 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. */
|
||||
|
||||
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_insn_p PROTO((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 reg_overlap_mentioned_p PROTO((rtx, rtx));
|
||||
extern rtx find_use_as_address PROTO((rtx, rtx, HOST_WIDE_INT));
|
||||
|
||||
/* Functions in rtlanal.c */
|
||||
|
||||
@ -980,6 +978,8 @@ extern rtx single_set PROTO((rtx));
|
||||
extern rtx find_last_value PROTO((rtx, rtx *, rtx));
|
||||
extern int refers_to_regno_p PROTO((int, int, 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 int rtx_equal_p PROTO((rtx, rtx));
|
||||
extern int dead_or_set_p PROTO((rtx, rtx));
|
||||
|
715
gcc/texinfo.tex
715
gcc/texinfo.tex
@ -25,21 +25,19 @@
|
||||
%
|
||||
% Please try the latest version of texinfo.tex before submitting bug
|
||||
% 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
|
||||
% (and all GNU mirrors)
|
||||
% ftp://tug.org/tex/texinfo.tex
|
||||
% ftp://ctan.org/macros/texinfo/texinfo.tex
|
||||
% (and all CTAN mirrors, finger ctan@tug.org for a list).
|
||||
% ftp://ftp.gnu.org/pub/gnu/texinfo.tex
|
||||
% /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://ctan.org/macros/texinfo/texinfo.tex
|
||||
% (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.
|
||||
% Please include a precise test case in each bug report,
|
||||
% 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
|
||||
% texi2dvi shell script that comes with the distribution. For simple
|
||||
% manuals, you can get away with:
|
||||
@ -147,15 +145,10 @@
|
||||
% Dimensions to add cropmarks at corners.
|
||||
% Added by P. A. MacKay, 12 Nov. 1986
|
||||
%
|
||||
\newdimen\cornerlong \newdimen\cornerthick
|
||||
\newdimen\topandbottommargin
|
||||
\newdimen\outerhsize \newdimen\outervsize
|
||||
\cornerlong=1pc\cornerthick=.3pt % These set size of cropmarks
|
||||
\outerhsize=7in
|
||||
%\outervsize=9.5in
|
||||
% Alternative @smallbook page size is 9.25in
|
||||
\outervsize=9.25in
|
||||
\topandbottommargin=.75in
|
||||
\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
|
||||
\newdimen\cornerlong \cornerlong=1pc
|
||||
\newdimen\cornerthick \cornerthick=.3pt
|
||||
\newdimen\topandbottommargin \topandbottommargin=.75in
|
||||
|
||||
% Main output routine.
|
||||
\chardef\PAGE = 255
|
||||
@ -791,13 +784,6 @@ where each line of input produces a line of output.}
|
||||
\def\menu{\doignore{menu}}
|
||||
\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
|
||||
% which this file should belong to. Ignore this in TeX.
|
||||
\let\dircategory = \comment
|
||||
@ -828,13 +814,7 @@ where each line of input produces a line of output.}
|
||||
% @c @end ifinfo
|
||||
% and the @end ifinfo will be properly ignored.
|
||||
% (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
|
||||
\fi
|
||||
\catcode`\c = 14
|
||||
%
|
||||
% And now expand that command.
|
||||
\doignoretext
|
||||
@ -965,13 +945,24 @@ where each line of input produces a line of output.}
|
||||
\def\value{\begingroup
|
||||
\catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR.
|
||||
\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
|
||||
{\{No value for ``#1''\}}%
|
||||
{[No value for ``#1'']v}%
|
||||
\else
|
||||
\csname SET#1\endcsname
|
||||
\fi
|
||||
\endgroup}
|
||||
}
|
||||
|
||||
% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
|
||||
% with @set.
|
||||
@ -1079,12 +1070,21 @@ where each line of input produces a line of output.}
|
||||
% @refill is a no-op.
|
||||
\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.
|
||||
% 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.
|
||||
\def\setfilename{%
|
||||
\readauxfile
|
||||
\opencontents
|
||||
\iflinks
|
||||
\readauxfile
|
||||
\opencontents
|
||||
\fi % \openindices needs to do some work in any case.
|
||||
\openindices
|
||||
\fixbackslash % Turn off hack to swallow `\input texinfo'.
|
||||
\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.
|
||||
}
|
||||
|
||||
% Called from \setfilename.
|
||||
%
|
||||
\def\openindices{%
|
||||
\newindex{cp}%
|
||||
\newcodeindex{fn}%
|
||||
\newcodeindex{vr}%
|
||||
\newcodeindex{tp}%
|
||||
\newcodeindex{ky}%
|
||||
\newcodeindex{pg}%
|
||||
}
|
||||
|
||||
% @bye.
|
||||
\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,}
|
||||
|
||||
% 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.
|
||||
\newfam\sffam
|
||||
\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\itemizezzz #1{%
|
||||
\begingroup % ended by the @end itemsize
|
||||
\begingroup % ended by the @end itemize
|
||||
\itemizey {#1}{\Eitemize}
|
||||
}
|
||||
|
||||
@ -2264,12 +2259,14 @@ width0pt\relax} \fi
|
||||
% 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
|
||||
% for the sake of vms.
|
||||
|
||||
\def\newindex #1{
|
||||
\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
|
||||
\openout \csname#1indfile\endcsname \jobname.#1 % Open the file
|
||||
\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
|
||||
\noexpand\doindex {#1}}
|
||||
%
|
||||
\def\newindex#1{%
|
||||
\iflinks
|
||||
\expandafter\newwrite \csname#1indfile\endcsname
|
||||
\openout \csname#1indfile\endcsname \jobname.#1 % Open the file
|
||||
\fi
|
||||
\expandafter\xdef\csname#1index\endcsname{% % Define @#1index
|
||||
\noexpand\doindex{#1}}
|
||||
}
|
||||
|
||||
% @defindex foo == \newindex{foo}
|
||||
@ -2278,11 +2275,13 @@ width0pt\relax} \fi
|
||||
|
||||
% Define @defcodeindex, like @defindex except put all entries in @code.
|
||||
|
||||
\def\newcodeindex #1{
|
||||
\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
|
||||
\openout \csname#1indfile\endcsname \jobname.#1 % Open the file
|
||||
\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
|
||||
\noexpand\docodeindex {#1}}
|
||||
\def\newcodeindex#1{%
|
||||
\iflinks
|
||||
\expandafter\newwrite \csname#1indfile\endcsname
|
||||
\openout \csname#1indfile\endcsname \jobname.#1
|
||||
\fi
|
||||
\expandafter\xdef\csname#1index\endcsname{%
|
||||
\noexpand\docodeindex{#1}}
|
||||
}
|
||||
|
||||
\def\defcodeindex{\parsearg\newcodeindex}
|
||||
@ -2369,7 +2368,6 @@ width0pt\relax} \fi
|
||||
\def\gtr{\realbackslash gtr}%
|
||||
\def\less{\realbackslash less}%
|
||||
\def\hat{\realbackslash hat}%
|
||||
%\def\char{\realbackslash char}%
|
||||
\def\TeX{\realbackslash TeX}%
|
||||
\def\dots{\realbackslash dots }%
|
||||
\def\result{\realbackslash result}%
|
||||
@ -2396,7 +2394,12 @@ width0pt\relax} \fi
|
||||
\def\kbd##1{\realbackslash kbd {##1}}%
|
||||
\def\dfn##1{\realbackslash dfn {##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
|
||||
}
|
||||
|
||||
@ -2469,14 +2472,24 @@ width0pt\relax} \fi
|
||||
% so we do not become unable to do a definition.
|
||||
|
||||
{\catcode`\@=0 \catcode`\\=\other
|
||||
@gdef@realbackslash{\}}
|
||||
@gdef@realbackslash{\}}
|
||||
|
||||
\let\indexbackslash=0 %overridden during \printindex.
|
||||
\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
|
||||
|
||||
\let\SETmarginindex=\relax %initialize!
|
||||
% workhorse for all \fooindexes
|
||||
% #1 is name of index, #2 is stuff to put there
|
||||
\def\doind #1#2{%
|
||||
% For \ifx comparisons.
|
||||
\def\emptymacro{\empty}
|
||||
|
||||
% 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.
|
||||
\ifx\SETmarginindex\relax\else
|
||||
\insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
|
||||
@ -2487,13 +2500,22 @@ width0pt\relax} \fi
|
||||
\indexdummies % Must do this here, since \bf, etc expand at this stage
|
||||
\escapechar=`\\
|
||||
{%
|
||||
\let\folio=0% We will expand all macros now EXCEPT \folio.
|
||||
\let\folio = 0% We will expand all macros now EXCEPT \folio.
|
||||
\def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
|
||||
% 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
|
||||
% 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
|
||||
% original text, including any font commands.
|
||||
@ -2502,33 +2524,35 @@ width0pt\relax} \fi
|
||||
\write\csname#1indfile\endcsname{%
|
||||
\realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}%
|
||||
}%
|
||||
\temp
|
||||
%
|
||||
% 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
|
||||
\ifdim\skip0 = 0pt \else \vskip\skip0 \fi
|
||||
\fi
|
||||
}%
|
||||
}%
|
||||
\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
|
||||
% \entry {sortstring}{page}{topic}
|
||||
% or
|
||||
@ -2952,7 +2976,7 @@ width0pt\relax} \fi
|
||||
\toks0 = {#1}%
|
||||
\edef\temp{{\realbackslash chapentry{\the\toks0}{\the\chapno}{\noexpand\folio}}}%
|
||||
\escapechar=`\\%
|
||||
\write \contentsfile \temp %
|
||||
\iflinks \write\contentsfile\temp \fi
|
||||
\donoderef %
|
||||
\global\let\section = \numberedsec
|
||||
\global\let\subsection = \numberedsubsec
|
||||
@ -2973,7 +2997,7 @@ width0pt\relax} \fi
|
||||
\edef\temp{{\realbackslash chapentry{\the\toks0}%
|
||||
{\putwordAppendix{} \appendixletter}{\noexpand\folio}}}%
|
||||
\escapechar=`\\%
|
||||
\write \contentsfile \temp %
|
||||
\iflinks \write\contentsfile\temp \fi
|
||||
\appendixnoderef %
|
||||
\global\let\section = \appendixsec
|
||||
\global\let\subsection = \appendixsubsec
|
||||
@ -3008,7 +3032,7 @@ width0pt\relax} \fi
|
||||
\toks0 = {#1}%
|
||||
\edef\temp{{\realbackslash unnumbchapentry{\the\toks0}{\noexpand\folio}}}%
|
||||
\escapechar=`\\%
|
||||
\write \contentsfile \temp %
|
||||
\iflinks \write\contentsfile\temp \fi
|
||||
\unnumbnoderef %
|
||||
\global\let\section = \unnumberedsec
|
||||
\global\let\subsection = \unnumberedsubsec
|
||||
@ -3025,7 +3049,7 @@ width0pt\relax} \fi
|
||||
\edef\temp{{\realbackslash secentry %
|
||||
{\the\toks0}{\the\chapno}{\the\secno}{\noexpand\folio}}}%
|
||||
\escapechar=`\\%
|
||||
\write \contentsfile \temp %
|
||||
\iflinks \write\contentsfile\temp \fi
|
||||
\donoderef %
|
||||
\penalty 10000 %
|
||||
}}
|
||||
@ -3041,7 +3065,7 @@ width0pt\relax} \fi
|
||||
\edef\temp{{\realbackslash secentry %
|
||||
{\the\toks0}{\appendixletter}{\the\secno}{\noexpand\folio}}}%
|
||||
\escapechar=`\\%
|
||||
\write \contentsfile \temp %
|
||||
\iflinks \write\contentsfile\temp \fi
|
||||
\appendixnoderef %
|
||||
\penalty 10000 %
|
||||
}}
|
||||
@ -3054,7 +3078,7 @@ width0pt\relax} \fi
|
||||
\toks0 = {#1}%
|
||||
\edef\temp{{\realbackslash unnumbsecentry{\the\toks0}{\noexpand\folio}}}%
|
||||
\escapechar=`\\%
|
||||
\write \contentsfile \temp %
|
||||
\iflinks \write\contentsfile\temp \fi
|
||||
\unnumbnoderef %
|
||||
\penalty 10000 %
|
||||
}}
|
||||
@ -3069,7 +3093,7 @@ width0pt\relax} \fi
|
||||
\edef\temp{{\realbackslash subsecentry %
|
||||
{\the\toks0}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
|
||||
\escapechar=`\\%
|
||||
\write \contentsfile \temp %
|
||||
\iflinks \write\contentsfile\temp \fi
|
||||
\donoderef %
|
||||
\penalty 10000 %
|
||||
}}
|
||||
@ -3084,7 +3108,7 @@ width0pt\relax} \fi
|
||||
\edef\temp{{\realbackslash subsecentry %
|
||||
{\the\toks0}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
|
||||
\escapechar=`\\%
|
||||
\write \contentsfile \temp %
|
||||
\iflinks \write\contentsfile\temp \fi
|
||||
\appendixnoderef %
|
||||
\penalty 10000 %
|
||||
}}
|
||||
@ -3097,7 +3121,7 @@ width0pt\relax} \fi
|
||||
\toks0 = {#1}%
|
||||
\edef\temp{{\realbackslash unnumbsubsecentry{\the\toks0}{\noexpand\folio}}}%
|
||||
\escapechar=`\\%
|
||||
\write \contentsfile \temp %
|
||||
\iflinks \write\contentsfile\temp \fi
|
||||
\unnumbnoderef %
|
||||
\penalty 10000 %
|
||||
}}
|
||||
@ -3114,7 +3138,7 @@ width0pt\relax} \fi
|
||||
{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}
|
||||
{\noexpand\folio}}}%
|
||||
\escapechar=`\\%
|
||||
\write \contentsfile \temp %
|
||||
\iflinks \write\contentsfile\temp \fi
|
||||
\donoderef %
|
||||
\penalty 10000 %
|
||||
}}
|
||||
@ -3131,7 +3155,7 @@ width0pt\relax} \fi
|
||||
{\appendixletter}
|
||||
{\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}%
|
||||
\escapechar=`\\%
|
||||
\write \contentsfile \temp %
|
||||
\iflinks \write\contentsfile\temp \fi
|
||||
\appendixnoderef %
|
||||
\penalty 10000 %
|
||||
}}
|
||||
@ -3144,7 +3168,7 @@ width0pt\relax} \fi
|
||||
\toks0 = {#1}%
|
||||
\edef\temp{{\realbackslash unnumbsubsubsecentry{\the\toks0}{\noexpand\folio}}}%
|
||||
\escapechar=`\\%
|
||||
\write \contentsfile \temp %
|
||||
\iflinks \write\contentsfile\temp \fi
|
||||
\unnumbnoderef %
|
||||
\penalty 10000 %
|
||||
}}
|
||||
@ -3944,13 +3968,18 @@ width0pt\relax} \fi
|
||||
\begingroup\obeylines\activeparens\spacesplit{#3{#4}}}
|
||||
|
||||
% @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 %
|
||||
\medbreak %
|
||||
% Define the end token that this defining construct specifies
|
||||
% so that it will exit this group.
|
||||
\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
|
||||
\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
|
||||
\exdentamount=\defbodyindent
|
||||
@ -4173,7 +4202,7 @@ width0pt\relax} \fi
|
||||
\def\defspecx #1 {\errmessage{@defspecx in invalid context}}
|
||||
\def\deftypefnx #1 {\errmessage{@deftypefnx 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
|
||||
|
||||
@ -4329,7 +4358,220 @@ width0pt\relax} \fi
|
||||
\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
|
||||
|
||||
\newif\ifhavexrefs % True if xref values are known.
|
||||
@ -4422,7 +4664,9 @@ width0pt\relax} \fi
|
||||
{\let\folio=0
|
||||
\normalturnoffactive
|
||||
\edef\next{\write\auxfile{\internalsetq{#1}{#2}}}%
|
||||
\next
|
||||
\iflinks
|
||||
\next
|
||||
\fi
|
||||
}%
|
||||
}
|
||||
|
||||
@ -4476,12 +4720,14 @@ width0pt\relax} \fi
|
||||
\expandafter\ifx\csname X#1\endcsname\relax
|
||||
% If not defined, say something at least.
|
||||
\angleleft un\-de\-fined\angleright
|
||||
\ifhavexrefs
|
||||
\message{\linenumber Undefined cross reference `#1'.}%
|
||||
\else
|
||||
\ifwarnedxrefs\else
|
||||
\global\warnedxrefstrue
|
||||
\message{Cross reference values unknown; you must run TeX again.}%
|
||||
\iflinks
|
||||
\ifhavexrefs
|
||||
\message{\linenumber Undefined cross reference `#1'.}%
|
||||
\else
|
||||
\ifwarnedxrefs\else
|
||||
\global\warnedxrefstrue
|
||||
\message{Cross reference values unknown; you must run TeX again.}%
|
||||
\fi
|
||||
\fi
|
||||
\fi
|
||||
\else
|
||||
@ -4724,7 +4970,9 @@ width0pt\relax} \fi
|
||||
\openin 1 = epsf.tex
|
||||
\ifeof 1 \else
|
||||
\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
|
||||
\fi
|
||||
%
|
||||
@ -4754,39 +5002,26 @@ width0pt\relax} \fi
|
||||
% \epsfbox itself resets \epsf?size at each figure.
|
||||
\setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
|
||||
\setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
|
||||
\epsfbox{#1.eps}%
|
||||
% If the image is by itself, center it.
|
||||
\ifvmode
|
||||
\centerline{\epsfbox{#1.eps}}%
|
||||
\else
|
||||
\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
|
||||
\parindent = \defaultparindent
|
||||
\parskip 3pt plus 2pt minus 1pt
|
||||
\setleading{13.2pt}
|
||||
\advance\topskip by 1.2cm
|
||||
|
||||
\chapheadingskip = 15pt plus 4pt minus 2pt
|
||||
\secheadingskip = 12pt plus 3pt minus 2pt
|
||||
\subsecheadingskip = 9pt plus 2pt minus 2pt
|
||||
|
||||
% Prevent underfull vbox error messages.
|
||||
\vbadness=10000
|
||||
\vbadness = 10000
|
||||
|
||||
% Following George Bush, just get rid of widows and orphans.
|
||||
\widowpenalty=10000
|
||||
@ -4795,101 +5030,125 @@ width0pt\relax} \fi
|
||||
% 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
|
||||
% 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.
|
||||
%
|
||||
\ifx\emergencystretch\thisisundefined
|
||||
% Allow us to assign to \emergencystretch anyway.
|
||||
\def\emergencystretch{\dimen0}%
|
||||
\else
|
||||
\emergencystretch = \hsize
|
||||
\divide\emergencystretch by 45
|
||||
\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}
|
||||
\def\setemergencystretch{%
|
||||
\ifx\emergencystretch\thisisundefined
|
||||
% Allow us to assign to \emergencystretch anyway.
|
||||
\def\emergencystretch{\dimen0}%
|
||||
\else
|
||||
\emergencystretch = \hsize
|
||||
\divide\emergencystretch by 45
|
||||
\fi
|
||||
}
|
||||
|
||||
% 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.
|
||||
\def\afourpaper{
|
||||
\global\tolerance=700
|
||||
\global\hfuzz=1pt
|
||||
\setleading{12pt}
|
||||
\global\parskip 15pt plus 1pt
|
||||
|
||||
\global\vsize= 53\baselineskip
|
||||
\advance\vsize by \topskip
|
||||
%\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}
|
||||
\def\afourpaper{{\globaldefs = 1
|
||||
\setleading{12pt}%
|
||||
\parskip = 3pt plus 2pt minus 1pt
|
||||
%
|
||||
\internalpagesizes{53\baselineskip}{6.5in}{\voffset}{.25in}{\bindingoffset}{44pt}%
|
||||
%
|
||||
\tolerance = 700
|
||||
\hfuzz = 1pt
|
||||
}}
|
||||
|
||||
% A specific text layout, 24x15cm overall, intended for A4 paper. Top margin
|
||||
% 29mm, hence bottom margin 28mm, nominal side margin 3cm.
|
||||
\def\afourlatex
|
||||
{\global\tolerance=700
|
||||
\global\hfuzz=1pt
|
||||
\setleading{12pt}
|
||||
\global\parskip 15pt plus 1pt
|
||||
\advance\baselineskip by 1.6pt
|
||||
\changepagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm}
|
||||
}
|
||||
\def\afourlatex{{\globaldefs = 1
|
||||
\setleading{13.6pt}%
|
||||
%
|
||||
\afourpaper
|
||||
\internalpagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm}%
|
||||
%
|
||||
\globaldefs = 0
|
||||
}}
|
||||
|
||||
% Use @afourwide to print on European A4 paper in wide format.
|
||||
\def\afourwide{\afourpaper
|
||||
\changepagesizes{9.5in}{6.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}}
|
||||
\def\afourwide{%
|
||||
\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.
|
||||
\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
|
||||
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
|
||||
@item MULTILIB_DEFAULTS
|
||||
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}
|
||||
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
|
||||
@item LINKER_DOES_NOT_WORK_WITH_DWARF2
|
||||
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
|
||||
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
|
||||
@item DOLLARS_IN_IDENTIFIERS
|
||||
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;
|
||||
|
||||
/* Nonzero to perform full register move optimization passes. This is the
|
||||
default for -O2. */
|
||||
|
||||
int flag_regmove = 0;
|
||||
|
||||
/* Nonzero for -fwritable-strings:
|
||||
store string constants in data segment and don't uniquize them. */
|
||||
|
||||
@ -701,8 +706,6 @@ int flag_check_memory_usage = 0;
|
||||
-fcheck-memory-usage. */
|
||||
int flag_prefix_function_name = 0;
|
||||
|
||||
int flag_regmove = 0;
|
||||
|
||||
/* 0 if pointer arguments may alias each other. True in C.
|
||||
1 if pointer arguments may not alias each other but may alias
|
||||
global variables.
|
||||
@ -717,6 +720,8 @@ int flag_argument_noalias = 0;
|
||||
if alias analysis (in general) is enabled. */
|
||||
int flag_strict_aliasing = 0;
|
||||
|
||||
extern int flag_dump_unnumbered;
|
||||
|
||||
/* Table of language-independent -f options.
|
||||
STRING is the option name. VARIABLE is the address of the 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},
|
||||
{"gnu-linker", &flag_gnu_linker, 1},
|
||||
{"regmove", &flag_regmove, 1},
|
||||
{"optimize-register-move", &flag_regmove, 1},
|
||||
{"pack-struct", &flag_pack_struct, 1},
|
||||
{"stack-check", &flag_stack_check, 1},
|
||||
{"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},
|
||||
{"strict-aliasing", &flag_strict_aliasing, 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. */
|
||||
@ -3517,11 +3524,6 @@ rest_of_compilation (decl)
|
||||
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)
|
||||
goto exit_rest_of_compilation;
|
||||
@ -3539,6 +3541,11 @@ rest_of_compilation (decl)
|
||||
|
||||
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 (sched2_dump)
|
||||
|
50
gcc/tree.c
50
gcc/tree.c
@ -4950,9 +4950,15 @@ get_set_constructor_bytes (init, buffer, wd_size)
|
||||
}
|
||||
return non_const_bits;
|
||||
}
|
||||
|
||||
|
||||
#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_check (node, code, file, line, nofatal)
|
||||
@ -4962,19 +4968,17 @@ tree_check (node, code, file, line, nofatal)
|
||||
int line;
|
||||
int nofatal;
|
||||
{
|
||||
if (TREE_CODE (node) != code)
|
||||
{
|
||||
if (nofatal)
|
||||
return 0;
|
||||
else
|
||||
fatal ("%s:%d: Expect %s, have %s\n", file, line,
|
||||
tree_code_name[code], tree_code_name[TREE_CODE (node)]);
|
||||
}
|
||||
|
||||
return node;
|
||||
if (TREE_CODE (node) == code)
|
||||
return node;
|
||||
else if (nofatal)
|
||||
return 0;
|
||||
else
|
||||
fatal ("%s:%d: Expect %s, have %s\n", file, line,
|
||||
tree_code_name[code], tree_code_name[TREE_CODE (node)]);
|
||||
}
|
||||
|
||||
/* Complain if the class of the tree node does not match. */
|
||||
/* Similar to above, except that we check for a class of tree
|
||||
code, given in CL. */
|
||||
|
||||
tree
|
||||
tree_class_check (node, cl, file, line, nofatal)
|
||||
@ -4984,18 +4988,16 @@ tree_class_check (node, cl, file, line, nofatal)
|
||||
int line;
|
||||
int nofatal;
|
||||
{
|
||||
if (TREE_CODE_CLASS (TREE_CODE (node)) != cl)
|
||||
{
|
||||
if (nofatal)
|
||||
return 0;
|
||||
else
|
||||
fatal ("%s:%d: Expect '%c', have '%s'\n", file, line,
|
||||
cl, tree_code_name[TREE_CODE (node)]);
|
||||
}
|
||||
|
||||
return node;
|
||||
if (TREE_CODE_CLASS (TREE_CODE (node)) == cl)
|
||||
return node;
|
||||
else if (nofatal)
|
||||
return 0;
|
||||
else
|
||||
fatal ("%s:%d: Expect '%c', have '%s'\n", file, line,
|
||||
cl, tree_code_name[TREE_CODE (node)]);
|
||||
}
|
||||
/* Complain if the node is not an expression. */
|
||||
|
||||
/* Likewise, but complain if the tree node is not an expression. */
|
||||
|
||||
tree
|
||||
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));
|
||||
|
||||
/* 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. */
|
||||
|
||||
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
Block a user