2005-10-02 Paul Eggert <eggert@cs.ucla.edu>
+ Use unlocked I/O for a minor performance improvement on hosts like
+ GNU/Linux and Solaris that support unlocked I/O. The basic idea
+ is to use the gnlib unlocked-io module, and to prefer putc and
+ puts to printf when either will work (since the latter doesn't
+ come in an unlocked flavor).
+ * bootstrap (gnulib_modules): Add unlocked-io.
+ * data/c.m4 (yysymprint): Prefer puts and putc to printf.
+ * data/glr.c (YYFPUTC, YYFPUTS, YYDPUTS): New macros.
+ Prefer them to YYFPRINTF and YYDPRINTF if either will do,
+ and similarly for puts and putc and printf.
+ * data/yacc.c: Likewise.
+ * lib/bitset.c (bitset_print): Likewise.
+ * lib/bitset.h [USE_UNLOCKED_IO]: Include unlocked-io.h.
+ * lib/bitsetv.c (bitsetv_dump, debug-bitsetv): Prefer putc and puts
+ to printf.
+ * lib/lbitset.c (debug_lbitset): Likewise.
+ * src/closure.c (print_firsts, print_fderives): Likewise.
+ * src/gram.c (grammar_dump): Likewise.
+ * src/lalr.c (look_ahead_tokens_print): Likewise.
+ * src/output.c (escaped_output): Likewise.
+ (user_actions_output): Coalesce two printfs.
+ * src/parse-gram.h (%printer): Prefer putc and puts to printf.
+ * src/reduce.c (reduce_print): Likewise.
+ * src/state.c (state_rule_look_ahead_tokens_print): Likewise.
+ * src/system.h: Include unlocked-io.h rathe than stdio.h.
+
* data/lalr1.cc: Don't put an unmatched ' in a dnl comment, as
this confuses xgettext.
strtoul
strverscmp
unistd-safer
+unlocked-io
verify
xalloc
xalloc-die
YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
]b4_location_if([ YY_LOCATION_PRINT (yyoutput, *yylocationp);
- YYFPRINTF (yyoutput, ": ");
+ YYFPUTS (": ", yyoutput);
])dnl
[
# ifdef YYPRINT
[ default:
break;
}
- YYFPRINTF (yyoutput, ")");
+ YYFPUTC (')', yyoutput);
}
]])
#if YYDEBUG
-#if ! defined (YYFPRINTF)
+# ifdef YYFPRINTF
+# define YYFPUTC(Char, Stream) YYFPRINTF (Stream, "%c", Char)
+# define YYFPUTS(Char, Stream) YYFPRINTF (Stream, "%s", String)
+# else
# define YYFPRINTF fprintf
-#endif
+# define YYFPUTC fputc
+# define YYFPUTS fputs
+# endif
# define YYDPRINTF(Args) \
do { \
YYFPRINTF Args; \
} while (0)
+# define YYDPUTS(String, Stream) \
+do { \
+ if (yydebug) \
+ YYFPUTS (String, Stream); \
+} while (0)
+
]b4_yysymprint_generate([b4_c_ansi_function_def])[
# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
YYFPRINTF (stderr, "%s ", Title); \
yysymprint (stderr, \
Type, Value]b4_location_if([, Location])[); \
- YYFPRINTF (stderr, "\n"); \
+ YYFPUTC ('\n', stderr); \
} \
} while (0)
#else /* !YYDEBUG */
+# define YYDPUTS(String, File)
# define YYDPRINTF(Args)
# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
YYFPRINTF (stderr, "%s unresolved ", yymsg);
yysymprint (stderr, yystos[yys->yylrState],
&yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[);
- YYFPRINTF (stderr, "\n");
+ YYFPUTC ('\n', stderr);
}
#endif
return;
yystack->yytops.yystates[0] = yystack->yylastDeleted;
yystack->yytops.yysize = 1;
- YYDPRINTF ((stderr, "Restoring last deleted stack as stack #0.\n"));
+ YYDPUTS ("Restoring last deleted stack as stack #0.\n", stderr);
yystack->yylastDeleted = NULL;
}
{
if (yyi == yyj)
{
- YYDPRINTF ((stderr, "Removing dead stacks.\n"));
+ YYDPUTS ("Removing dead stacks.\n", stderr);
}
yystack->yytops.yysize -= 1;
}
(void) yyx1;
#if YYDEBUG
- YYFPRINTF (stderr, "Ambiguity detected.\n");
- YYFPRINTF (stderr, "Option 1,\n");
+ YYFPUTS ("Ambiguity detected.\nOption 1,\n", stderr);
yyreportTree (yyx0, 2);
- YYFPRINTF (stderr, "\nOption 2,\n");
+ YYFPUTS ("\nOption 2,\n", stderr);
yyreportTree (yyx1, 2);
- YYFPRINTF (stderr, "\n");
+ YYFPUTC ('\n', stderr);
#endif
yyFail (yystack][]b4_pure_args[, YY_("syntax is ambiguous"));
}
{
if (*yytokenp == YYEMPTY)
{
- YYDPRINTF ((stderr, "Reading a token: "));
+ YYDPUTS ("Reading a token: ", stderr);
yychar = YYLEX;
*yytokenp = YYTRANSLATE (yychar);
YY_SYMBOL_PRINT ("Next token is", *yytokenp, yylvalp, yyllocp);
yydestruct ("Error: discarding",
*yytokenp, yylvalp]b4_location_if([, yyllocp])[);
}
- YYDPRINTF ((stderr, "Reading a token: "));
+ YYDPUTS ("Reading a token: ", stderr);
yychar = YYLEX;
*yytokenp = YYTRANSLATE (yychar);
YY_SYMBOL_PRINT ("Next token is", *yytokenp, yylvalp, yyllocp);
YYSTYPE* const yylvalp = &yylval;
YYLTYPE* const yyllocp = &yylloc;
- YYDPRINTF ((stderr, "Starting parse\n"));
+ YYDPUTS ("Starting parse\n", stderr);
yytoken = YYEMPTY;
yylval = yyval_default;
{
if (yytoken == YYEMPTY)
{
- YYDPRINTF ((stderr, "Reading a token: "));
+ YYDPUTS ("Reading a token: ", stderr);
yychar = YYLEX;
yytoken = YYTRANSLATE (yychar);
YY_SYMBOL_PRINT ("Next token is", yytoken, yylvalp, yyllocp);
if (yystack.yytops.yysize == 0)
yyFail (&yystack][]b4_lpure_args[, YY_("syntax error"));
YYCHK1 (yyresolveStack (&yystack]b4_user_args[));
- YYDPRINTF ((stderr, "Returning to deterministic operation.\n"));
+ YYDPUTS ("Returning to deterministic operation.\n", stderr);
]b4_location_if([[ yystack.yyerror_range[1].yystate.yyloc = *yyllocp;]])[
yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[);
goto yyuser_error;
else if (yystack.yytops.yysize == 1)
{
YYCHK1 (yyresolveStack (&yystack]b4_user_args[));
- YYDPRINTF ((stderr, "Returning to deterministic operation.\n"));
+ YYDPUTS ("Returning to deterministic operation.\n", stderr);
yycompressStack (&yystack);
break;
}
if (yys->yypred)
{
yy_yypstack (yys->yypred);
- fprintf (stderr, " -> ");
+ fputs (" -> ", stderr);
}
fprintf (stderr, "%d@@%lu", yys->yylrState, (unsigned long int) yys->yyposn);
}
yypstates (yyGLRState* yyst)
{
if (yyst == NULL)
- fprintf (stderr, "<null>");
+ fputs ("<null>", stderr);
else
yy_yypstack (yyst);
- fprintf (stderr, "\n");
+ fputc ('\n', stderr);
}
static void
(long int) YYINDEX (yyp->yyoption.yystate),
(long int) YYINDEX (yyp->yyoption.yynext));
}
- fprintf (stderr, "\n");
+ fputc ('\n', stderr);
}
- fprintf (stderr, "Tops:");
+ fputs ("Tops:", stderr);
for (yyi = 0; yyi < yystack->yytops.yysize; yyi += 1)
fprintf (stderr, "%lu: %ld; ", (unsigned long int) yyi,
(long int) YYINDEX (yystack->yytops.yystates[yyi]));
- fprintf (stderr, "\n");
+ fputc ('\n', stderr);
}
#endif
]
/* Enable debugging if requested. */
#if YYDEBUG
-# ifndef YYFPRINTF
+# ifdef YYFPRINTF
+# define YYFPUTC(Char, Stream) YYFPRINTF (Stream, "%c", Char)
+# define YYFPUTS(Char, Stream) YYFPRINTF (Stream, "%s", String)
+# else
# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
# define YYFPRINTF fprintf
+# define YYFPUTC fputc
+# define YYFPUTS fputs
# endif
# define YYDPRINTF(Args) \
YYFPRINTF Args; \
} while (0)
+# define YYDPUTS(String, Stream) \
+do { \
+ if (yydebug) \
+ YYFPUTS (String, Stream); \
+} while (0)
+
# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
do { \
if (yydebug) \
YYFPRINTF (stderr, "%s ", Title); \
yysymprint (stderr, \
Type, Value]b4_location_if([, Location])[); \
- YYFPRINTF (stderr, "\n"); \
+ YYFPUTC ('\n', stderr); \
} \
} while (0)
[[short int *bottom], [bottom]],
[[short int *top], [top]])[
{
- YYFPRINTF (stderr, "Stack now");
+ YYFPUTS ("Stack now", stderr);
for (/* Nothing. */; bottom <= top; ++bottom)
YYFPRINTF (stderr, " %d", *bottom);
- YYFPRINTF (stderr, "\n");
+ YYFPUTC ('\n', stderr);
}
# define YY_STACK_PRINT(Bottom, Top) \
/* Nonzero means print parse trace. It is left uninitialized so that
multiple parsers can coexist. */
int yydebug;
+
#else /* !YYDEBUG */
+
+# define YYDPUTS(String, File)
# define YYDPRINTF(Args)
# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
# define YY_STACK_PRINT(Bottom, Top)
# define YY_REDUCE_PRINT(Rule)
+
#endif /* !YYDEBUG */
rule. */
int yylen;
- YYDPRINTF ((stderr, "Starting parse\n"));
+ YYDPUTS ("Starting parse\n", stderr);
yystate = 0;
yyerrstatus = 0;
/* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */
if (yychar == YYEMPTY)
{
- YYDPRINTF ((stderr, "Reading a token: "));
+ YYDPUTS ("Reading a token: ", stderr);
yychar = YYLEX;
}
if (yychar <= YYEOF)
{
yychar = yytoken = YYEOF;
- YYDPRINTF ((stderr, "Now at end of input.\n"));
+ YYDPUTS ("Now at end of input.\n", stderr);
}
else
{
{
if (pos > 70)
{
- fprintf (file, "\n");
+ fputc ('\n', file);
pos = 0;
}
};
if (verbose)
- fprintf (file, "}\n");
+ fputs ("}\n", file);
}
#include "obstack.h"
#include <stdio.h>
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
/* Attributes used to select a bitset implementation. */
enum bitset_attr {BITSET_FIXED = 1, /* Bitset size fixed. */
BITSET_VARIABLE = 2, /* Bitset size variable. */
bitset_dump (file, bsetv[i]);
}
- fprintf (file, "\n");
+ fputc ('\n', file);
}
debug_bitset (bsetv[i]);
}
- fprintf (stderr, "\n");
+ fputc ('\n', stderr);
}
for (j = 0; j < LBITSET_WORD_BITS; j++)
if ((word & ((bitset_word) 1 << j)))
fprintf (stderr, " %u", j);
- fprintf (stderr, "\n");
+ fputc ('\n', stderr);
}
}
}
{
symbol_number i, j;
- fprintf (stderr, "FIRSTS\n");
+ fputs ("FIRSTS\n", stderr);
for (i = ntokens; i < nsyms; i++)
{
bitset_iterator iter;
symbols[j + ntokens]->tag);
}
}
- fprintf (stderr, "\n\n");
+ fputs ("\n\n", stderr);
}
int i;
rule_number r;
- fprintf (stderr, "FDERIVES\n");
+ fputs ("FDERIVES\n", stderr);
for (i = ntokens; i < nsyms; i++)
{
bitset_iterator iter;
rule_rhs_print (&rules[r], stderr);
}
}
- fprintf (stderr, "\n\n");
+ fputs ("\n\n", stderr);
}
\f
/*------------------------------------------------------------------.
ntokens, nvars, nsyms, nrules, nritems);
- fprintf (out, "Variables\n---------\n\n");
+ fputs (("Variables\n---------\n\n"
+ "Value Sprec Sassoc Tag\n"),
+ out);
{
symbol_number i;
- fprintf (out, "Value Sprec Sassoc Tag\n");
-
for (i = ntokens; i < nsyms; i++)
fprintf (out, "%5d %5d %5d %s\n",
i,
symbols[i]->prec, symbols[i]->assoc,
symbols[i]->tag);
- fprintf (out, "\n\n");
}
+ fputs ("\n\n", out);
- fprintf (out, "Rules\n-----\n\n");
+ fputs (("Rules\n-----\n\n"
+ "Num (Prec, Assoc, Useful, Ritem Range) Lhs -> Rhs (Ritem range) [Num]\n"),
+ out);
{
rule_number i;
- fprintf (out, "Num (Prec, Assoc, Useful, Ritem Range) Lhs -> Rhs (Ritem range) [Num]\n");
for (i = 0; i < nrules + nuseless_productions; i++)
{
rule *rule_i = &rules[i];
fprintf (out, " [%d]\n", item_number_as_rule_number (*rp));
}
}
- fprintf (out, "\n\n");
+ fputs ("\n\n", out);
- fprintf (out, "Rules interpreted\n-----------------\n\n");
+ fputs ("Rules interpreted\n-----------------\n\n", out);
{
rule_number r;
for (r = 0; r < nrules + nuseless_productions; r++)
rule_print (&rules[r], out);
}
}
- fprintf (out, "\n\n");
+ fputs ("\n\n", out);
}
{
state_number i;
int j, k;
- fprintf (out, "Look-ahead tokens: BEGIN\n");
+ fputs ("Look-ahead tokens: BEGIN\n", out);
for (i = 0; i < nstates; ++i)
{
reductions *reds = states[i]->reductions;
reds->rules[j]->number);
};
}
- fprintf (out, "Look-ahead tokens: END\n");
+ fputs ("Look-ahead tokens: END\n", out);
}
void
escaped_output (FILE *out, char const *string)
{
char const *p;
- fprintf (out, "[[");
+ fputs ("[[", out);
for (p = quotearg_style (c_quoting_style, string); *p; p++)
switch (*p)
default: fputc (*p, out); break;
}
- fprintf (out, "]]");
+ fputs ("]]", out);
}
fprintf (out, "]b4_syncline(%d, ",
rules[r].action_location.start.line);
escaped_output (out, rules[r].action_location.start.file);
- fprintf (out, ")[\n");
- fprintf (out, " %s\n break;\n\n",
+ fprintf (out, ")[\n %s\n break;\n\n",
rules[r].action);
}
fputs ("]])\n\n", out);
%type <integer> INT
%printer { fprintf (stderr, "%d", $$); } INT
%type <symbol> ID symbol string_as_id
-%printer { fprintf (stderr, "%s", $$->tag); } ID symbol string_as_id
+%printer { fputs ($$->tag, stderr); } ID symbol string_as_id
%type <symbol> ID_COLON
%printer { fprintf (stderr, "%s:", $$->tag); } ID_COLON
%type <assoc> precedence_declarator
"%d useless rules",
nuseless_productions),
nuseless_productions);
- fprintf (stderr, "\n");
+ fputc ('\n', stderr);
}
\f
void
bitset_iterator biter;
int k;
char const *sep = "";
- fprintf (out, " [");
+ fputs (" [", out);
BITSET_FOR_EACH (biter, reds->look_ahead_tokens[red], k, 0)
{
fprintf (out, "%s%s", sep, symbols[k]->tag);
sep = ", ";
}
- fprintf (out, "]");
+ fputc (']', out);
}
}
#include <limits.h>
#include <stddef.h>
-#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include "unlocked-io.h"
+
#if HAVE_SYS_TYPES_H
# include <sys/types.h>
#endif