* Merge from gcc2 June 9, 1998 snapshot. See ChangeLog.13 for

details.

From-SVN: r20808
This commit is contained in:
Jeff Law 1998-06-29 15:40:49 -06:00
parent ad2c71b764
commit 9ec36da574
69 changed files with 2502 additions and 490 deletions

View File

@ -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

File diff suppressed because it is too large Load Diff

View File

@ -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.

View File

@ -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@

View File

@ -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);

View File

@ -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 ();

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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")])

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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 */

View File

@ -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. */

View File

@ -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")

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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

View File

@ -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.

View File

@ -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; \

View File

@ -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.

View File

@ -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. */

View File

@ -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]+.

View File

@ -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)
{

View File

@ -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

View File

@ -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) \

View File

@ -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
View File

@ -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

View File

@ -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"

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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++)
{

View File

@ -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)

View File

@ -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);

View File

@ -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

View File

@ -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.

View File

@ -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);
}
}
}

View File

@ -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;

View File

@ -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. */

View File

@ -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.

View File

@ -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,

View File

@ -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.

View File

@ -38,10 +38,12 @@ int main (argc, argv)
char *argv[];
{
int i;
switch (argc)
{
case 1:
break;
default:
usage ();
exit (1);

View File

@ -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");

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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) \

View File

@ -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();

View File

@ -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);
}
}

View File

@ -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

View File

@ -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)

View File

@ -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
}

View File

@ -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 ();

View File

@ -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. */

View File

@ -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)

View File

@ -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));

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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));

View File

@ -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)";