public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* Re: egcs-980315, gen*.c system.h and fatal() using stdarg/varargs
@ 1998-03-30 16:18 Kaveh R. Ghazi
  0 siblings, 0 replies; 20+ messages in thread
From: Kaveh R. Ghazi @ 1998-03-30 16:18 UTC (permalink / raw)
  To: jfc; +Cc: egcs, ghazi

 > From: John Carr <jfc@mit.edu>
 > 
 > > 	All of these individual hacks play tricks with type mismatches
 > > on arguments passed to fprintf.  None of them accounts for the actual
 > > size of the argument passed.  Yet somehow we haven't had a bug report
 > > against this.
 > 
 > I sent a bug report about the C++ error handler a couple months ago.
 > Compile C++ with HOST_WIDE_INT = long long.  It will crash as soon as
 > it prints a message because it assumes that HOST_WIDE_INT, int, long,
 > and pointer are all the same size and passed the same way to functions.

	Okay I'm convinced.  I did some work on a vfprintf.c module. 
I'll post it shortly for review, however I'd prefer not to tackle
libiberty.  Either someone else should handle that, or I can add code to
link in just gcc/vfprintf.c if autoconf determines vfprintf() is
missing.  (Eg, using AC_REPLACE_FUNCS.)

		--Kaveh
--
Kaveh R. Ghazi			Project Manager / Custom Development
ghazi@caip.rutgers.edu		Icon CMT Corp.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: egcs-980315, gen*.c system.h and fatal() using stdarg/varargs
  1998-03-26 21:54 Kaveh R. Ghazi
@ 1998-03-29  5:14 ` John Carr
  0 siblings, 0 replies; 20+ messages in thread
From: John Carr @ 1998-03-29  5:14 UTC (permalink / raw)
  To: Kaveh R. Ghazi; +Cc: egcs

> 	All of these individual hacks play tricks with type mismatches
> on arguments passed to fprintf.  None of them accounts for the actual
> size of the argument passed.  Yet somehow we haven't had a bug report
> against this.

I sent a bug report about the C++ error handler a couple months ago.
Compile C++ with HOST_WIDE_INT = long long.  It will crash as soon as
it prints a message because it assumes that HOST_WIDE_INT, int, long,
and pointer are all the same size and passed the same way to functions.


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: egcs-980315, gen*.c system.h and fatal() using stdarg/varargs
  1998-03-27  4:21 ` Jeffrey A Law
@ 1998-03-28 19:24   ` H.J. Lu
  0 siblings, 0 replies; 20+ messages in thread
From: H.J. Lu @ 1998-03-28 19:24 UTC (permalink / raw)
  To: law; +Cc: ghazi, egcs, robertl

> 
> Basically we'd want to do something like
> 
> STDLIBS = ../libiberty/libiberty.a
> 

If you do, please make sure it works with cross-compile and canadian
cross-compile.

-- 
H.J. Lu (hjl@gnu.org)

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: egcs-980315, gen*.c system.h and fatal() using stdarg/varargs
@ 1998-03-27 15:18 Kaveh R. Ghazi
  1998-03-27  4:21 ` Richard Henderson
  0 siblings, 1 reply; 20+ messages in thread
From: Kaveh R. Ghazi @ 1998-03-27 15:18 UTC (permalink / raw)
  To: rth; +Cc: egcs, law

 > From: Richard Henderson <rth@dot.cygnus.com>
 > 
 > On Tue, Mar 24, 1998 at 12:50:32PM -0500, Kaveh R. Ghazi wrote:
 > > #if !defined(HAVE_VPRINTF) && !defined(vfprintf)
 > > # ifdef HAVE_DOPRNT
 > > #  define vfprintf(stream, format, args) _doprnt(format, args, stream)
 > > # else
 > > #  define vfprintf(stream, format, args) \
 > >      do { \
 > >        HOST_WIDE_INT a0 = va_arg(args, HOST_WIDE_INT); \
 > >        HOST_WIDE_INT a1 = va_arg(args, HOST_WIDE_INT); \
 > 
 > Ug.  I would much prefer to define a proper vfprintf function than
 > to much with this kind of nonsense.  If this is done by just doing 
 > the argument parsing bits of vfprintf and fobing the actual formatting
 > off to fprintf, this should not be that large or complicated.
 > r~

	I've come up with a workable approach/framework, why do you
feel it is nonsense?  Please explain your technical objections.

		--Kaveh
--
Kaveh R. Ghazi			Project Manager / Custom Development
ghazi@caip.rutgers.edu		Icon CMT Corp.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: egcs-980315, gen*.c system.h and fatal() using stdarg/varargs
  1998-03-25 17:05 Kaveh R. Ghazi
@ 1998-03-27 15:18 ` Jeffrey A Law
  1998-03-27 15:18 ` H.J. Lu
  1 sibling, 0 replies; 20+ messages in thread
From: Jeffrey A Law @ 1998-03-27 15:18 UTC (permalink / raw)
  To: Kaveh R. Ghazi; +Cc: robertl, egcs

  In message < 199803251901.OAA02514@caip.rutgers.edu >you write:
  > 	Getting gcc to cleanly link with libiberty and ironing out all
  > the related issues is IMHO a non-trivial task.  It would require someone
  > taking ownership to see it through.  When this last came up, I don't
  > think there were any takers.  I could be mis-remembering the
  > conversation though...  Best check the archive. 
I doubt it would be as bad as you think.  Most other tools already
link in libiberty -- gcc is the exception, not the rule.

I think we tabled it until we were further along with some of the
warnings/system.h stuff.  Now may be the time to deal with it.

jeff

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: egcs-980315, gen*.c system.h and fatal() using stdarg/varargs
  1998-03-24 11:16 Kaveh R. Ghazi
  1998-03-24 11:16 ` Jeffrey A Law
  1998-03-25  7:49 ` Robert Lipe
@ 1998-03-27 15:18 ` Richard Henderson
  2 siblings, 0 replies; 20+ messages in thread
From: Richard Henderson @ 1998-03-27 15:18 UTC (permalink / raw)
  To: Kaveh R. Ghazi; +Cc: law, egcs

On Tue, Mar 24, 1998 at 12:50:32PM -0500, Kaveh R. Ghazi wrote:
> #if !defined(HAVE_VPRINTF) && !defined(vfprintf)
> # ifdef HAVE_DOPRNT
> #  define vfprintf(stream, format, args) _doprnt(format, args, stream)
> # else
> #  define vfprintf(stream, format, args) \
>      do { \
>        HOST_WIDE_INT a0 = va_arg(args, HOST_WIDE_INT); \
>        HOST_WIDE_INT a1 = va_arg(args, HOST_WIDE_INT); \

Ug.  I would much prefer to define a proper vfprintf function than
to much with this kind of nonsense.  If this is done by just doing 
the argument parsing bits of vfprintf and fobing the actual formatting
off to fprintf, this should not be that large or complicated.


r~

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: egcs-980315, gen*.c system.h and fatal() using stdarg/varargs
  1998-03-25 17:05 Kaveh R. Ghazi
  1998-03-27 15:18 ` Jeffrey A Law
@ 1998-03-27 15:18 ` H.J. Lu
  1 sibling, 0 replies; 20+ messages in thread
From: H.J. Lu @ 1998-03-27 15:18 UTC (permalink / raw)
  To: Kaveh R. Ghazi; +Cc: law, robertl, egcs

> 
> 	Getting gcc to cleanly link with libiberty and ironing out all
> the related issues is IMHO a non-trivial task.  It would require someone
> taking ownership to see it through.  When this last came up, I don't
> think there were any takers.  I could be mis-remembering the
> conversation though...  Best check the archive. 
> 

Don't do it unless you can support cross-compile and candian
cross-compile.

-- 
H.J. Lu (hjl@gnu.org)

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: egcs-980315, gen*.c system.h and fatal() using stdarg/varargs
  1998-03-27 15:18 Kaveh R. Ghazi
@ 1998-03-27  4:21 ` Richard Henderson
  0 siblings, 0 replies; 20+ messages in thread
From: Richard Henderson @ 1998-03-27  4:21 UTC (permalink / raw)
  To: Kaveh R. Ghazi; +Cc: rth, egcs, law

On Thu, Mar 26, 1998 at 01:59:03PM -0500, Kaveh R. Ghazi wrote:
> 	I've come up with a workable approach/framework, why do you
> feel it is nonsense?  Please explain your technical objections.

	HOST_WIDE_INT a0 = va_arg(args, HOST_WIDE_INT); \
	HOST_WIDE_INT a1 = va_arg(args, HOST_WIDE_INT); \

sizeof(HOST_WIDE_INT) is not necessarily equal to sizeof(int)
or sizeof(char *) or ...  Thus the 

	fprintf(file, format, a0, a1, a2, ...)

may not necessarily get the arguments in the right place for
any given format string.  The only way to do it portably is to
parse the format string and pick the arguments off by type.

True, these days probably most of the hosts that such size 
mismatches matter for have ANSI/ISO compliant libraries and
headers, but it doesn't make your solution any more Correct.


r~

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: egcs-980315, gen*.c system.h and fatal() using stdarg/varargs
  1998-03-26 21:54 Kaveh R. Ghazi
@ 1998-03-27  4:21 ` Jeffrey A Law
  1998-03-28 19:24   ` H.J. Lu
  0 siblings, 1 reply; 20+ messages in thread
From: Jeffrey A Law @ 1998-03-27  4:21 UTC (permalink / raw)
  To: Kaveh R. Ghazi; +Cc: egcs, robertl

  In message < 199803262023.PAA14464@caip.rutgers.edu >you write:
  >  > From: Jeffrey A Law <law@cygnus.com>
  >  > 
  >  >   In message < 199803251901.OAA02514@caip.rutgers.edu >you write:
  >  >   > 	Getting gcc to cleanly link with libiberty and ironing out all
  >  >   > the related issues is IMHO a non-trivial task.  It would require som
  > eone
  >  >   > taking ownership to see it through.  When this last came up, I don't
  >  >   > think there were any takers.  I could be mis-remembering the
  >  >   > conversation though...  Best check the archive. 
  >  > 
  >  > I doubt it would be as bad as you think.  Most other tools already
  >  > link in libiberty -- gcc is the exception, not the rule.
  >  > 
  >  > I think we tabled it until we were further along with some of the
  >  > warnings/system.h stuff.  Now may be the time to deal with it.
  >  > jeff
  > 
  > 	Well, linking with libiberty would provide the following
  > module to replace vfprintf():
We can always flesh out vfprintf to handle more cases.  That alone
shouldn't be a reason not to use libiberty.

Linking in libiberty to gcc means we can get rid of all the local
copies of xmalloc & friends, vfprintf, alloca, choose-temp, cplus-dem,
getopt, getpwd, pexecute and obstack (and maybe others I can't
remember)

Thus we avoid maintaining multiple versions of all that code.  A
good thing IMHO.

Basically we'd want to do something like

STDLIBS = ../libiberty/libiberty.a

Then add $(STDLIBS) to the link line for cc1*, gen*, gcc, cpp, and
a few other things.

This also takes a step towards being able to link in other library
code that we might need in the future (gettext?)

jeff

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: egcs-980315, gen*.c system.h and fatal() using stdarg/varargs
@ 1998-03-26 21:54 Kaveh R. Ghazi
  1998-03-27  4:21 ` Jeffrey A Law
  0 siblings, 1 reply; 20+ messages in thread
From: Kaveh R. Ghazi @ 1998-03-26 21:54 UTC (permalink / raw)
  To: law; +Cc: egcs, robertl

 > From: Jeffrey A Law <law@cygnus.com>
 > 
 >   In message < 199803251901.OAA02514@caip.rutgers.edu >you write:
 >   > 	Getting gcc to cleanly link with libiberty and ironing out all
 >   > the related issues is IMHO a non-trivial task.  It would require someone
 >   > taking ownership to see it through.  When this last came up, I don't
 >   > think there were any takers.  I could be mis-remembering the
 >   > conversation though...  Best check the archive. 
 > 
 > I doubt it would be as bad as you think.  Most other tools already
 > link in libiberty -- gcc is the exception, not the rule.
 > 
 > I think we tabled it until we were further along with some of the
 > warnings/system.h stuff.  Now may be the time to deal with it.
 > jeff

	Well, linking with libiberty would provide the following
module to replace vfprintf():

 > #include <stdio.h>
 > #include <varargs.h>
 > #include <ansidecl.h>
 > #undef vfprintf
 >  
 > int
 > vfprintf (file, format, ap)
 >      FILE *file;
 >      const char *format;
 >      va_list ap;
 > {
 >    return _doprnt (format, ap, file);
 > }


	Note, this is less functional than what I propose since my
solution also accounts for _doprnt not being present.  I still think
the patch I posted is the best alternative, especially since the
current gcc source uses many variants of what I consolidated into one
file.

	If Robert wants to champion libiberty, I support that as an
eventual goal.  However I can't imagine it being as easy as adding a 15
line macro to system.h.  Therefore it should be a considered seperate
issue tangential to the problem I am trying to solve. 

		--Kaveh
--
Kaveh R. Ghazi			Project Manager / Custom Development
ghazi@caip.rutgers.edu		Icon CMT Corp.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: egcs-980315, gen*.c system.h and fatal() using stdarg/varargs
@ 1998-03-26 21:54 Kaveh R. Ghazi
  1998-03-29  5:14 ` John Carr
  0 siblings, 1 reply; 20+ messages in thread
From: Kaveh R. Ghazi @ 1998-03-26 21:54 UTC (permalink / raw)
  To: rth; +Cc: egcs, law

 > From: Richard Henderson <rth@dot.cygnus.com>
 > 
 > On Thu, Mar 26, 1998 at 01:59:03PM -0500, Kaveh R. Ghazi wrote:
 > > 	I've come up with a workable approach/framework, why do you
 > > feel it is nonsense?  Please explain your technical objections.
 > 
 > 	HOST_WIDE_INT a0 = va_arg(args, HOST_WIDE_INT); \
 > 	HOST_WIDE_INT a1 = va_arg(args, HOST_WIDE_INT); \
 > 
 > sizeof(HOST_WIDE_INT) is not necessarily equal to sizeof(int)
 > or sizeof(char *) or ...  Thus the 
 > 
 > 	fprintf(file, format, a0, a1, a2, ...)
 > 
 > may not necessarily get the arguments in the right place for
 > any given format string.  The only way to do it portably is to
 > parse the format string and pick the arguments off by type.
 > 
 > True, these days probably most of the hosts that such size 
 > mismatches matter for have ANSI/ISO compliant libraries and
 > headers, but it doesn't make your solution any more Correct.
 > r~

	I know its not an argument for strict correctness, however the
solution I propose is already in use in gcc.  I'm just trying to
gather them all together and do it in a consistent manner.  Eg, the
following appears in cccp.c/cexp.c when vfprintf is not available:

 > # define vfprintf(file, msg, args) \
 >     { \
 >       char *a0 = va_arg(args, char *); \
 >       char *a1 = va_arg(args, char *); \
 >       char *a2 = va_arg(args, char *); \
 >       char *a3 = va_arg(args, char *); \
 >       fprintf (file, msg, a0, a1, a2, a3); \
 >     }

	The following is cut from toplev.c:

 > #ifdef HAVE_VPRINTF
 >   vfprintf (stderr, s, ap);
 > #else
 >   {
 >     HOST_WIDE_INT v1 = va_arg(ap, HOST_WIDE_INT);
 >     HOST_WIDE_INT v2 = va_arg(ap, HOST_WIDE_INT);
 >     HOST_WIDE_INT v3 = va_arg(ap, HOST_WIDE_INT);
 >     HOST_WIDE_INT v4 = va_arg(ap, HOST_WIDE_INT);
 >     fprintf (stderr, s, v1, v2, v3, v4);
 >   }
 > #endif

	I found this in gcc.c/mips-tfile.c:

 > static void
 > error (msg, arg1, arg2)
 >      char *msg, *arg1, *arg2;
 > {
 >   fprintf (stderr, "%s: ", programname);
 >   fprintf (stderr, msg, arg1, arg2);
 >   fprintf (stderr, "\n");
 > }
 > #endif /* not HAVE_VPRINTF */

And the gen*.c files use the unnamed integer arguments instead of char*
like the above. 

	All of these individual hacks play tricks with type mismatches
on arguments passed to fprintf.  None of them accounts for the actual
size of the argument passed.  Yet somehow we haven't had a bug report
against this.  Is it possible that no one is running platforms without
vfprintf?  Or maybe this hack happens to work on all these systems. 

	This might not prove anything, but I ran some tests on solaris2,
faking the fact that vfprintf and _doprnt were absent and it still
worked.  So I have to ask whether your objection is perhaps only
theoretical?

	My understanding of va_arg(va_list, type) is that it simply
copies sizeof(type) bytes out of `va_list' and increments `va_list' by
that many bytes.  If true, my implementation of the VFPRINTF() macro
simply copies 10*sizeof(HOST_WIDE_INT) bytes out of `va_list' and
passes them to fprintf after the format string.  The fact that the
bytes were copied sizeof(HOST_WIDE_INT) at a time doesn't matter if
all that happens is that they are concatenated together and passed to
another function.  Then fprintf pulls them off the va_list in the
right type size amounts.

	The only cases I can see where my hack fails is if there are
more parameters than I account for.  But given that the _existing_
hacks only account for 3 or 4 args, the fact that I listed 10 should
be enough.

		--Kaveh
--
Kaveh R. Ghazi			Project Manager / Custom Development
ghazi@caip.rutgers.edu		Icon CMT Corp.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: egcs-980315, gen*.c system.h and fatal() using stdarg/varargs
@ 1998-03-25 17:05 Kaveh R. Ghazi
  1998-03-27 15:18 ` Jeffrey A Law
  1998-03-27 15:18 ` H.J. Lu
  0 siblings, 2 replies; 20+ messages in thread
From: Kaveh R. Ghazi @ 1998-03-25 17:05 UTC (permalink / raw)
  To: law, robertl; +Cc: egcs

 > From: Jeffrey A Law <law@hurl.cygnus.com>
 > 
 >   In message < 19980325094859.20595@dgii.com >you write:
 >   > Kaveh R. Ghazi wrote:
 >   > 
 >   > > 	This should allow us to use vfprintf with impunity, iff we
 >   > > assume we can always fall back on varargs.h/va_arg().
 >   > 
 >   > Isn't this the very sort of problem that libiberty was invented to solve?
 >   > 
 >   > The program uses robust, standards-conforumant function and if the host
 >   > system doesn't have them, libiberty gives them to you?
 >   > 
 >   > I don't know if libiberty actually has the functionality needed here,
 >   > but it seems like a good place to start looking.
 > Or maybe now is the time to enhance libiberty if it's missing
 > something.
 > 
 > My only real concern about linking in libiberty to gcc is that
 > libiberty isn't autoconf'd.
 > jeff

	Getting gcc to cleanly link with libiberty and ironing out all
the related issues is IMHO a non-trivial task.  It would require someone
taking ownership to see it through.  When this last came up, I don't
think there were any takers.  I could be mis-remembering the
conversation though...  Best check the archive. 

		--Kaveh
--
Kaveh R. Ghazi			Project Manager / Custom Development
ghazi@caip.rutgers.edu		Icon CMT Corp.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: egcs-980315, gen*.c system.h and fatal() using stdarg/varargs
  1998-03-25  7:49 ` Robert Lipe
@ 1998-03-25 16:30   ` Jeffrey A Law
  0 siblings, 0 replies; 20+ messages in thread
From: Jeffrey A Law @ 1998-03-25 16:30 UTC (permalink / raw)
  To: Robert Lipe; +Cc: Kaveh R. Ghazi, egcs

  In message < 19980325094859.20595@dgii.com >you write:
  > Kaveh R. Ghazi wrote:
  > 
  > > 	This should allow us to use vfprintf with impunity, iff we
  > > assume we can always fall back on varargs.h/va_arg().
  > 
  > Isn't this the very sort of problem that libiberty was invented to solve?
  > 
  > The program uses robust, standards-conforumant function and if the host
  > system doesn't have them, libiberty gives them to you?
  > 
  > I don't know if libiberty actually has the functionality needed here,
  > but it seems like a good place to start looking.
Or maybe now is the time to enhance libiberty if it's missing
something.

My only real concern about linking in libiberty to gcc is that
libiberty isn't autoconf'd.

jeff

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: egcs-980315, gen*.c system.h and fatal() using stdarg/varargs
  1998-03-24 11:16 Kaveh R. Ghazi
  1998-03-24 11:16 ` Jeffrey A Law
@ 1998-03-25  7:49 ` Robert Lipe
  1998-03-25 16:30   ` Jeffrey A Law
  1998-03-27 15:18 ` Richard Henderson
  2 siblings, 1 reply; 20+ messages in thread
From: Robert Lipe @ 1998-03-25  7:49 UTC (permalink / raw)
  To: Kaveh R. Ghazi, law; +Cc: egcs

Kaveh R. Ghazi wrote:

> 	This should allow us to use vfprintf with impunity, iff we
> assume we can always fall back on varargs.h/va_arg().

Isn't this the very sort of problem that libiberty was invented to solve?

The program uses robust, standards-conforumant function and if the host
system doesn't have them, libiberty gives them to you?

I don't know if libiberty actually has the functionality needed here,
but it seems like a good place to start looking.

-- 
Robert Lipe       http://www.dgii.com/people/robertl       robertl@dgii.com

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: egcs-980315, gen*.c system.h and fatal() using stdarg/varargs
@ 1998-03-24 14:49 Kaveh R. Ghazi
  0 siblings, 0 replies; 20+ messages in thread
From: Kaveh R. Ghazi @ 1998-03-24 14:49 UTC (permalink / raw)
  To: law; +Cc: egcs, ghazi

 > From: Jeffrey A Law <law@hurl.cygnus.com>
 > 
 >   > To me it seems that if vfprintf is
 >   > missing, it is a dubious proposition to assume varargs.h/va_arg() are
 >   > present.
 > No.  There was a time when this was common.  As systems have moved to
 > ANSI/POSIX compliance this is less of an issue, but we need to handle
 > it.
 > 
 >   > there any known platforms which fit this description, missing vfprintf
 >   > but have varargs.h/va_arg()?)
 > I believe so, it was certainly the case in the past.
 > 
 >   > http://www.cygnus.com/ml/egcs/1998-Feb/1155.html , then this issue goes
 >   > away except where we have to pass a function pointer (which does come
 >   > up in the gcc source, but not in gen*.c.)  Just a thought.
 >   > 
 >   > 	Another thing we can do is put the following in system.h:
 > Either would probably be reasonable.  I'd probably lean towards
 > defining some crude vfprintf in system.h for systems without vfprintf
 > support so that we don't have to go change all the sources.
 > 
 > Another thought would be to link with libiberty since it has some
 > vfprintf (though I suspect it just calls doprnt).
 > 
 > jeff


	Yes I looked at egcs/libiberty/vfprintf.c and you're right, it
just calls _doprnt.

	I guess I agree with you that defining vfprintf to something is
better than mucking with the source code a lot.  Though one problem
might be on hosts where stage1 cc does macro replacement inside strings. 
The string of chars "vfprintf" appears in fix-header.c and c-common.c. 
I don't know if this is serious, but they would get replaced with
whatever we define vfprintf to.  Probably with negative results.  :-)

	One solution is to instead define VFPRINTF() but then we'd
have to muck with the source (though less so than if we replaced
fatal() with FATAL() ...)  I checked and vfprintf function calls
appear in cccp.c, cexp.c, gcc.c, mips-tfile.c and toplev.c.  Not too
bad.

	So here is the latest proposal, stick the following in system.h:

#ifdef HAVE_VPRINTF
# define VFPRINTF(stream, format, args) vfprintf(stream, format, args)
#else /* ! HAVE_VPRINTF */
# ifdef HAVE_DOPRNT
#  define VFPRINTF(stream, format, args) _doprnt(format, args, stream)
# else /* ! HAVE_DOPRNT */
#  define VFPRINTF(stream, format, args) \
     do { \
       HOST_WIDE_INT a0 = va_arg(args, HOST_WIDE_INT); \
       HOST_WIDE_INT a1 = va_arg(args, HOST_WIDE_INT); \
       HOST_WIDE_INT a2 = va_arg(args, HOST_WIDE_INT); \
       HOST_WIDE_INT a3 = va_arg(args, HOST_WIDE_INT); \
       HOST_WIDE_INT a4 = va_arg(args, HOST_WIDE_INT); \
       HOST_WIDE_INT a5 = va_arg(args, HOST_WIDE_INT); \
       HOST_WIDE_INT a6 = va_arg(args, HOST_WIDE_INT); \
       HOST_WIDE_INT a7 = va_arg(args, HOST_WIDE_INT); \
       HOST_WIDE_INT a7 = va_arg(args, HOST_WIDE_INT); \
       HOST_WIDE_INT a9 = va_arg(args, HOST_WIDE_INT); \
       fprintf (stream, format, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); \
     } while (0)
# endif /* HAVE_DOPRNT */
#endif /* HAVE_VPRINTF */

and change the function `fatal' in gen*.c as per my original patch
except that instead of calling vfprintf, they call VFPRINTF.

	Shall I implement this?

		--Kaveh

PS: Is there any way to turn off __attribute__ printf for just one call
to fprintf? The call to fprintf in the VFPRINTF macro above will always
get a bunch of warnings (unless `format' has 10 HOST_WIDE_INTs in it)
but we know this is okay to ignore.  Can they be silenced for just that
invocation? If not, its not a big deal since it will only happen to
hosts which have neither vfprintf nor _doprnt.
--
Kaveh R. Ghazi			Project Manager / Custom Development
ghazi@caip.rutgers.edu		Icon CMT Corp.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: egcs-980315, gen*.c system.h and fatal() using stdarg/varargs
@ 1998-03-24 11:16 Kaveh R. Ghazi
  1998-03-24 11:16 ` Jeffrey A Law
                   ` (2 more replies)
  0 siblings, 3 replies; 20+ messages in thread
From: Kaveh R. Ghazi @ 1998-03-24 11:16 UTC (permalink / raw)
  To: law; +Cc: egcs, ghazi

 > From: Jeffrey A Law <law@hurl.cygnus.com>
 > 
 >   In message < 199803200208.VAA11947@caip.rutgers.edu >you write:
 >   > 	Here is my patch to add system.h to gen*.c.  It also fixes the
 >   > static function `fatal' to use real variable argument parameter lists.
 >   > 
 >   > 	Is so doing, I uncovered some format specifier problems in
 >   > genattrtab.c:
 >   > 
 >   >  > ./genattrtab.c:979: warning: char format, rtx_def arg (arg 2)
 >   >  > ./genattrtab.c:984: warning: char format, rtx_def arg (arg 2)
 >   >  > ./genattrtab.c:1001: warning: char format, rtx_def arg (arg 2)
 >   >  > ./genattrtab.c:1012: warning: char format, rtx_def arg (arg 2)
 >   >  > ./genattrtab.c:1012: warning: char format, rtx_def arg (arg 3)
 >   > 
 >   > 	All of these cases appear to be using a %s to print a XEXP(rtx,N).
 >   > Should these instead be changed to %s and XSTR(rtx,N) ?
 > Hard to be sure since the line #s do not match what's currently in
 > the sources.
 > 
 > I see 5 cases in "check_attr_test" which appear to fit the description
 > you've given.  Those should be using XSTR, not XINT as you suspected.


	Yes, the ones in check_attr_test are them.  I should have
specified the function name.  Thanks.




 > For the "fatal" problem -- I don't think you can rely on having
 > vfprintf.  You have to check for it.  If you don't have it, you'll
 > probably have to punt back to extracting the args as ints and
 > passing them to fprintf.
 > 


	Well, that gets kind of gross.  You then have four cases which
you have to intricately ifdef you way around inside the function.  Ie,
the cross product of __STDC__ (yes/no) and HAVE_VPRINTF (yes/no).  If
we go this route, I'd like to come of with a generalized workable
solution we can use across the board.  (See below.)

	The gcc source is inconsistent in this regard.  Eg, files like
cccp.c/cexp.c handle missing vfprintf by sucking arguments out using
va_arg() and then calling fprintf.  To me it seems that if vfprintf is
missing, it is a dubious proposition to assume varargs.h/va_arg() are
present.  Though gcc does exactly that and it seems to work.  (Are
there any known platforms which fit this description, missing vfprintf
but have varargs.h/va_arg()?)  The file toplev.c does something
similar.  But gcc.c is different, it uses vfprintf, but falls back on
using ints if vfprintf is not available.  And as we know, the gen*.c
files hardwire always using integers.

	Note that if we implement the macro idea I proposed in
http://www.cygnus.com/ml/egcs/1998-Feb/1155.html , then this issue goes
away except where we have to pass a function pointer (which does come
up in the gcc source, but not in gen*.c.)  Just a thought.

	Another thing we can do is put the following in system.h:

#if !defined(HAVE_VPRINTF) && !defined(vfprintf)
# ifdef HAVE_DOPRNT
#  define vfprintf(stream, format, args) _doprnt(format, args, stream)
# else
#  define vfprintf(stream, format, args) \
     do { \
       HOST_WIDE_INT a0 = va_arg(args, HOST_WIDE_INT); \
       HOST_WIDE_INT a1 = va_arg(args, HOST_WIDE_INT); \
       HOST_WIDE_INT a2 = va_arg(args, HOST_WIDE_INT); \
       HOST_WIDE_INT a3 = va_arg(args, HOST_WIDE_INT); \
       HOST_WIDE_INT a4 = va_arg(args, HOST_WIDE_INT); \
       HOST_WIDE_INT a5 = va_arg(args, HOST_WIDE_INT); \
       HOST_WIDE_INT a6 = va_arg(args, HOST_WIDE_INT); \
       HOST_WIDE_INT a7 = va_arg(args, HOST_WIDE_INT); \
       HOST_WIDE_INT a7 = va_arg(args, HOST_WIDE_INT); \
       HOST_WIDE_INT a9 = va_arg(args, HOST_WIDE_INT); \
       fprintf (stream, format, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); \
     } while (0)
# endif /* HAVE_DOPRNT */
#endif /* ! defined(HAVE_VPRINTF) && ! defined(vfprintf) */

	This should allow us to use vfprintf with impunity, iff we
assume we can always fall back on varargs.h/va_arg().

	The third thing we can do is when neither stdarg.h or varargs.h are
available, then we do:

# define va_alist format, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9
# define va_dcl char *format, *a0, *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8, *a9;

and then the following works:

fatal(va_alist)
  va_dcl
{
  blah; ...
  fprintf(stderr, va_alist);
  blah; ...
}

	Its actually more complicated than this, but you get the idea.
Anyway, let's please arrive at a consensus so I can implement something
which you'll approve for installation.

1.  Use macros for function fatal which call fprintf.  (See
http://www.cygnus.com/ml/egcs/1998-Feb/1155.html )

2.  Use stdarg/varargs in function fatal which always call vfprintf
and define vfprintf to something if its not available.

3.  Add a fall back case which defines va_alist/va_dcl and calls
fprintf when stdarg/varargs and vfprintf are not available.

4.  Some combination of the above.

5.  Some yet to be mentioned option.

		Thanks,
		--Kaveh
--
Kaveh R. Ghazi			Project Manager / Custom Development
ghazi@caip.rutgers.edu		Icon CMT Corp.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: egcs-980315, gen*.c system.h and fatal() using stdarg/varargs
  1998-03-24 11:16 Kaveh R. Ghazi
@ 1998-03-24 11:16 ` Jeffrey A Law
  1998-03-25  7:49 ` Robert Lipe
  1998-03-27 15:18 ` Richard Henderson
  2 siblings, 0 replies; 20+ messages in thread
From: Jeffrey A Law @ 1998-03-24 11:16 UTC (permalink / raw)
  To: Kaveh R. Ghazi; +Cc: egcs

  In message < 199803241750.MAA00882@caip.rutgers.edu >you write:
  > 	Well, that gets kind of gross.  You then have four cases which
  > you have to intricately ifdef you way around inside the function.  Ie,
  > the cross product of __STDC__ (yes/no) and HAVE_VPRINTF (yes/no).  If
  > we go this route, I'd like to come of with a generalized workable
  > solution we can use across the board.  (See below.)
Yup.  it's a pain.

  > 	The gcc source is inconsistent in this regard.  Eg, files like
  > cccp.c/cexp.c handle missing vfprintf by sucking arguments out using
  > va_arg() and then calling fprintf.
That would be a fine solution too.  In fact it's better than pretending 
everything is an int like we do now.

  > To me it seems that if vfprintf is
  > missing, it is a dubious proposition to assume varargs.h/va_arg() are
  > present.
No.  There was a time when this was common.  As systems have moved to
ANSI/POSIX compliance this is less of an issue, but we need to handle
it.

  > there any known platforms which fit this description, missing vfprintf
  > but have varargs.h/va_arg()?)
I believe so, it was certainly the case in the past.


  > http://www.cygnus.com/ml/egcs/1998-Feb/1155.html , then this issue goes
  > away except where we have to pass a function pointer (which does come
  > up in the gcc source, but not in gen*.c.)  Just a thought.
  > 
  > 	Another thing we can do is put the following in system.h:
Either would probably be reasonable.  I'd probably lean towards
defining some crude vfprintf in system.h for systems without vfprintf
support so that we don't have to go change all the sources.

Another thought would be to link with libiberty since it has some
vfprintf (though I suspect it just calls doprnt).

jeff

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: egcs-980315, gen*.c system.h and fatal() using stdarg/varargs
@ 1998-03-24 10:24 Kaveh R. Ghazi
  0 siblings, 0 replies; 20+ messages in thread
From: Kaveh R. Ghazi @ 1998-03-24 10:24 UTC (permalink / raw)
  To: law; +Cc: egcs

 > From: Jeffrey A Law <law@hurl.cygnus.com>
 > 
 > I would recommend checking in the changes *without* the fatal change;
 > then re-submit the changes for just fatal as a separate patch.
 > 
 > jeff

	Okay, I've installed the gen*.c system.h cutover without the
`fatal' stuff.  I'll do a patch for the `fatal' functions after you
respond to my previous email outlining several approaches to handling
this and we agree on how to proceed. 

		--Kaveh
--
Kaveh R. Ghazi			Project Manager / Custom Development
ghazi@caip.rutgers.edu		Icon CMT Corp.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* egcs-980315, gen*.c system.h and fatal() using stdarg/varargs
@ 1998-03-20  8:45 Kaveh R. Ghazi
  1998-03-20  8:45 ` Jeffrey A Law
  0 siblings, 1 reply; 20+ messages in thread
From: Kaveh R. Ghazi @ 1998-03-20  8:45 UTC (permalink / raw)
  To: egcs; +Cc: ghazi, law, wilson

	Here is my patch to add system.h to gen*.c.  It also fixes the
static function `fatal' to use real variable argument parameter lists.

	Is so doing, I uncovered some format specifier problems in
genattrtab.c:

 > ./genattrtab.c:979: warning: char format, rtx_def arg (arg 2)
 > ./genattrtab.c:984: warning: char format, rtx_def arg (arg 2)
 > ./genattrtab.c:1001: warning: char format, rtx_def arg (arg 2)
 > ./genattrtab.c:1012: warning: char format, rtx_def arg (arg 2)
 > ./genattrtab.c:1012: warning: char format, rtx_def arg (arg 3)

	All of these cases appear to be using a %s to print a XEXP(rtx,N).
Should these instead be changed to %s and XSTR(rtx,N) ?

	One other thing, I defined a PRINTF_ATTRIBUTE macro in
system.h along the lines of a similar trick in cccp.c.  However I'm
not sure that system.h is the right place for this.

	I envision system.h as handling system header files, functions,
macros and related issues.  It seems like __attribute__, being a
compiler characteristic, is something for which gansidecl.h is to be
used for.  (Also along these lines, the bcopy/index stuff should be
removed from gansidecl.h now that system.h handles that.  But that's for
another day.)

	Anyway, which header file should define PRINTF_ATTRIBUTE,
system.h or gansidecl.h?

		--Kaveh


Thu Mar 19 20:31:59 1998  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>

        * Makefile.in (genconfig.o, genflags.o, gencodes.o, genemit.o,
        genopinit.o, genrecog.o, genextract.o, genpeep.o, genattr.o,
        genattrtab.o, genoutput.o): Depend on system.h.

        * system.h: Define macro PRINTF_ATTRIBUTE to use __attribute__
        format __printf__ when using gcc >= v2.7, otherwise define it
	to nothing.  Define PRINTF_ATTRIBUTE_1, PRINTF_ATTRIBUTE_2 and
	PRINTF_ATTRIBUTE_3 in terms of PRINTF_ATTRIBUTE.

        * genattr.c: Include stdarg.h/varargs.h and system.h.  Change
        function `fatal' to use variable arguments instead of faking it
        with unnamed integer parameters.  Provide a prototype which also
        checks the format specifiers using PRINTF_ATTRIBUTE_1.
        * genattrtab.c: Likewise.
        * gencodes.c: Likewise.
        * genconfig.c: Likewise.
        * genemit.c: Likewise.
        * genextract.c: Likewise.
        * genflags.c: Likewise.
        * genopinit.c: Likewise.
        * genpeep.c: Likewise.
        * genrecog.c: Likewise.
        * genoutput.c: Likewise.  Similarly for function `error'.


diff -rup orig/egcs-980315/gcc/Makefile.in egcs-980315/gcc/Makefile.in
--- orig/egcs-980315/gcc/Makefile.in	Thu Feb 19 14:12:33 1998
+++ egcs-980315/gcc/Makefile.in	Thu Mar 19 11:54:47 1998
@@ -1611,77 +1611,77 @@ genconfig : genconfig.o $(HOST_RTL) $(HO
 	$(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
 	  genconfig.o $(HOST_RTL) $(HOST_LIBS)
 
-genconfig.o : genconfig.c $(RTL_H) $(build_xm_file)
+genconfig.o : genconfig.c $(RTL_H) $(build_xm_file) system.h
 	$(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genconfig.c
 
 genflags : genflags.o $(HOST_RTL) $(HOST_LIBDEPS)
 	$(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
 	 genflags.o $(HOST_RTL) $(HOST_LIBS)
 
-genflags.o : genflags.c $(RTL_H) $(build_xm_file)
+genflags.o : genflags.c $(RTL_H) $(build_xm_file) system.h
 	$(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genflags.c
 
 gencodes : gencodes.o $(HOST_RTL) $(HOST_LIBDEPS)
 	$(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
 	 gencodes.o $(HOST_RTL) $(HOST_LIBS)
 
-gencodes.o : gencodes.c $(RTL_H) $(build_xm_file)
+gencodes.o : gencodes.c $(RTL_H) $(build_xm_file) system.h
 	$(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/gencodes.c
 
 genemit : genemit.o $(HOST_RTL) $(HOST_LIBDEPS)
 	$(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
 	 genemit.o $(HOST_RTL) $(HOST_LIBS)
 
-genemit.o : genemit.c $(RTL_H) $(build_xm_file)
+genemit.o : genemit.c $(RTL_H) $(build_xm_file) system.h
 	$(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genemit.c
 
 genopinit : genopinit.o $(HOST_RTL) $(HOST_LIBDEPS)
 	$(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
 	 genopinit.o $(HOST_RTL) $(HOST_LIBS)
 
-genopinit.o : genopinit.c $(RTL_H) $(build_xm_file)
+genopinit.o : genopinit.c $(RTL_H) $(build_xm_file) system.h
 	$(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genopinit.c
 
 genrecog : genrecog.o $(HOST_RTL) $(HOST_LIBDEPS)
 	$(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
 	 genrecog.o $(HOST_RTL) $(HOST_LIBS)
 
-genrecog.o : genrecog.c $(RTL_H) $(build_xm_file)
+genrecog.o : genrecog.c $(RTL_H) $(build_xm_file) system.h
 	$(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genrecog.c
 
 genextract : genextract.o $(HOST_RTL) $(HOST_LIBDEPS)
 	$(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
 	 genextract.o $(HOST_RTL) $(HOST_LIBS)
 
-genextract.o : genextract.c $(RTL_H) $(build_xm_file) insn-config.h
+genextract.o : genextract.c $(RTL_H) $(build_xm_file) system.h insn-config.h
 	$(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genextract.c
 
 genpeep : genpeep.o $(HOST_RTL) $(HOST_LIBDEPS)
 	$(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
 	 genpeep.o $(HOST_RTL) $(HOST_LIBS)
 
-genpeep.o : genpeep.c $(RTL_H) $(build_xm_file)
+genpeep.o : genpeep.c $(RTL_H) $(build_xm_file) system.h
 	$(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genpeep.c
 
 genattr : genattr.o $(HOST_RTL) $(HOST_LIBDEPS)
 	$(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
 	 genattr.o $(HOST_RTL) $(HOST_LIBS)
 
-genattr.o : genattr.c $(RTL_H) $(build_xm_file)
+genattr.o : genattr.c $(RTL_H) $(build_xm_file) system.h
 	$(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genattr.c
 
 genattrtab : genattrtab.o $(HOST_RTL) $(HOST_PRINT) $(HOST_RTLANAL) $(HOST_LIBDEPS)
 	$(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
 	 genattrtab.o $(HOST_RTL) $(HOST_PRINT) $(HOST_RTLANAL) $(HOST_LIBS)
 
-genattrtab.o : genattrtab.c $(RTL_H)  $(build_xm_file) insn-config.h
+genattrtab.o : genattrtab.c $(RTL_H)  $(build_xm_file) system.h insn-config.h
 	$(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genattrtab.c
 
 genoutput : genoutput.o $(HOST_RTL) $(HOST_LIBDEPS)
 	$(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ \
 	 genoutput.o $(HOST_RTL) $(HOST_LIBS)
 
-genoutput.o : genoutput.c $(RTL_H) $(build_xm_file)
+genoutput.o : genoutput.c $(RTL_H) $(build_xm_file) system.h
 	$(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genoutput.c
 
 gengenrtl : gengenrtl.o $(HOST_LIBDEPS)
diff -rup orig/egcs-980315/gcc/genattr.c egcs-980315/gcc/genattr.c
--- orig/egcs-980315/gcc/genattr.c	Fri Feb 27 03:23:36 1998
+++ egcs-980315/gcc/genattr.c	Thu Mar 19 11:22:32 1998
@@ -20,28 +20,27 @@ the Free Software Foundation, 59 Temple 
 Boston, MA 02111-1307, USA.  */
 
 
-#include <stdio.h>
 #include "hconfig.h"
+#ifdef __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+#include "system.h"
+
 #include "rtl.h"
 #include "obstack.h"
 
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-
 static struct obstack obstack;
 struct obstack *rtl_obstack = &obstack;
 
 #define obstack_chunk_alloc xmalloc
 #define obstack_chunk_free free
 
-#ifdef NEED_DECLARATION_FREE
-extern void free PROTO((void *));
-#endif
 extern rtx read_rtx PROTO((FILE *));
 
 char *xmalloc PROTO((unsigned));
-static void fatal ();
+static void fatal PVPROTO ((char *, ...)) PRINTF_ATTRIBUTE_1;
 void fancy_abort PROTO((void));
 
 /* A range of values.  */
@@ -220,11 +219,22 @@ xrealloc (ptr, size)
 }
 
 static void
-fatal (s, a1, a2)
-     char *s;
+fatal VPROTO ((char *format, ...))
 {
+#ifndef __STDC__
+  char *format;
+#endif
+  va_list ap;
+
+  VA_START (ap, format);
+
+#ifndef __STDC__
+  format = va_arg (ap, char *);
+#endif
+
   fprintf (stderr, "genattr: ");
-  fprintf (stderr, s, a1, a2);
+  vfprintf (stderr, format, ap);
+  va_end (ap);
   fprintf (stderr, "\n");
   exit (FATAL_EXIT_CODE);
 }
diff -rup orig/egcs-980315/gcc/genattrtab.c egcs-980315/gcc/genattrtab.c
--- orig/egcs-980315/gcc/genattrtab.c	Mon Mar  2 06:54:13 1998
+++ egcs-980315/gcc/genattrtab.c	Thu Mar 19 11:54:40 1998
@@ -96,35 +96,21 @@ Boston, MA 02111-1307, USA.  */
 
 
 #include "hconfig.h"
-/* varargs must always be included after *config.h.  */
+/* varargs must always be included after *config.h, but before stdio.h.  */
 #ifdef __STDC__
 #include <stdarg.h>
 #else
 #include <varargs.h>
 #endif
-#include <stdio.h>
+#include "system.h"
+
 #include "rtl.h"
 #include "insn-config.h"	/* For REGISTER_CONSTRAINTS */
 
-#ifdef TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-# include <sys/time.h>
-# else
-#  include <time.h>
-#endif
-#endif
-
 #ifdef HAVE_SYS_RESOURCE_H
 # include <sys/resource.h>
 #endif
 
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-
 /* We must include obstack.h after <sys/time.h>, to avoid lossage with
    /usr/include/sys/stdtypes.h on Sun OS 4.x.  */
 #include "obstack.h"
@@ -140,13 +126,10 @@ struct obstack *temp_obstack = &obstack2
 /* Define this so we can link with print-rtl.o to get debug_rtx function.  */
 char **insn_name_ptr = 0;
 
-#ifdef NEED_DECLARATION_FREE
-extern void free ();
-#endif
 extern rtx read_rtx ();
 
-static void fatal ();
-void fancy_abort ();
+static void fatal PVPROTO ((char *, ...)) PRINTF_ATTRIBUTE_1;
+void fancy_abort PROTO((void));
 
 /* enough space to reserve for printing out ints */
 #define MAX_DIGITS (HOST_BITS_PER_INT * 3 / 10 + 3)
@@ -5801,12 +5784,22 @@ copy_rtx_unchanging (orig)
 }
 
 static void
-fatal (s, a1, a2)
-     char *s;
-     char *a1, *a2;
+fatal VPROTO ((char *format, ...))
 {
+#ifndef __STDC__
+  char *format;
+#endif
+  va_list ap;
+
+  VA_START (ap, format);
+
+#ifndef __STDC__
+  format = va_arg (ap, char *);
+#endif
+
   fprintf (stderr, "genattrtab: ");
-  fprintf (stderr, s, a1, a2);
+  vfprintf (stderr, format, ap);
+  va_end (ap);
   fprintf (stderr, "\n");
   exit (FATAL_EXIT_CODE);
 }
diff -rup orig/egcs-980315/gcc/gencodes.c egcs-980315/gcc/gencodes.c
--- orig/egcs-980315/gcc/gencodes.c	Mon Aug 11 11:57:09 1997
+++ egcs-980315/gcc/gencodes.c	Thu Mar 19 11:26:26 1998
@@ -22,8 +22,14 @@ the Free Software Foundation, 59 Temple 
 Boston, MA 02111-1307, USA.  */
 
 
-#include <stdio.h>
 #include "hconfig.h"
+#ifdef __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+#include "system.h"
+
 #include "rtl.h"
 #include "obstack.h"
 
@@ -33,12 +39,11 @@ struct obstack *rtl_obstack = &obstack;
 #define obstack_chunk_alloc xmalloc
 #define obstack_chunk_free free
 
-extern void free ();
 extern rtx read_rtx ();
 
-char *xmalloc ();
-static void fatal ();
-void fancy_abort ();
+char *xmalloc PROTO((unsigned));
+static void fatal PVPROTO ((char *, ...)) PRINTF_ATTRIBUTE_1;
+void fancy_abort PROTO((void));
 
 static int insn_code_number;
 
@@ -77,11 +82,22 @@ xrealloc (ptr, size)
 }
 
 static void
-fatal (s, a1, a2)
-     char *s;
+fatal VPROTO ((char *format, ...))
 {
+#ifndef __STDC__
+  char *format;
+#endif
+  va_list ap;
+
+  VA_START (ap, format);
+
+#ifndef __STDC__
+  format = va_arg (ap, char *);
+#endif
+
   fprintf (stderr, "gencodes: ");
-  fprintf (stderr, s, a1, a2);
+  vfprintf (stderr, format, ap);
+  va_end (ap);
   fprintf (stderr, "\n");
   exit (FATAL_EXIT_CODE);
 }
diff -rup orig/egcs-980315/gcc/genconfig.c egcs-980315/gcc/genconfig.c
--- orig/egcs-980315/gcc/genconfig.c	Fri Feb 27 03:23:39 1998
+++ egcs-980315/gcc/genconfig.c	Thu Mar 19 11:29:33 1998
@@ -20,24 +20,23 @@ the Free Software Foundation, 59 Temple 
 Boston, MA 02111-1307, USA.  */
 
 
-#include <stdio.h>
 #include "hconfig.h"
+#ifdef __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+#include "system.h"
+
 #include "rtl.h"
 #include "obstack.h"
 
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-
 static struct obstack obstack;
 struct obstack *rtl_obstack = &obstack;
 
 #define obstack_chunk_alloc xmalloc
 #define obstack_chunk_free free
 
-#ifdef NEED_DECLARATION_FREE
-extern void free ();
-#endif
 extern rtx read_rtx ();
 
 /* flags to determine output of machine description dependent #define's.  */
@@ -55,9 +54,9 @@ static int max_insns_per_split = 1;
 static int clobbers_seen_this_insn;
 static int dup_operands_seen_this_insn;
 
-char *xmalloc ();
-static void fatal ();
-void fancy_abort ();
+char *xmalloc PROTO((unsigned));
+static void fatal PVPROTO ((char *, ...)) PRINTF_ATTRIBUTE_1;
+void fancy_abort PROTO((void));
 
 /* RECOG_P will be non-zero if this pattern was seen in a context where it will
    be used to recognize, rather than just generate an insn. 
@@ -268,11 +267,22 @@ xrealloc (ptr, size)
 }
 
 static void
-fatal (s, a1, a2)
-     char *s;
+fatal VPROTO ((char *format, ...))
 {
+#ifndef __STDC__
+  char *format;
+#endif
+  va_list ap;
+
+  VA_START (ap, format);
+
+#ifndef __STDC__
+  format = va_arg (ap, char *);
+#endif
+
   fprintf (stderr, "genconfig: ");
-  fprintf (stderr, s, a1, a2);
+  vfprintf (stderr, format, ap);
+  va_end (ap);
   fprintf (stderr, "\n");
   exit (FATAL_EXIT_CODE);
 }
diff -rup orig/egcs-980315/gcc/genemit.c egcs-980315/gcc/genemit.c
--- orig/egcs-980315/gcc/genemit.c	Wed Mar 11 19:02:44 1998
+++ egcs-980315/gcc/genemit.c	Thu Mar 19 11:42:59 1998
@@ -19,29 +19,28 @@ the Free Software Foundation, 59 Temple 
 Boston, MA 02111-1307, USA.  */
 
 
-#include <stdio.h>
 #include "hconfig.h"
+#ifdef __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+#include "system.h"
+
 #include "rtl.h"
 #include "obstack.h"
 
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-
 static struct obstack obstack;
 struct obstack *rtl_obstack = &obstack;
 
 #define obstack_chunk_alloc xmalloc
 #define obstack_chunk_free free
 
-#ifdef NEED_DECLARATION_FREE
-extern void free ();
-#endif
 extern rtx read_rtx ();
 
-char *xmalloc ();
-static void fatal ();
-void fancy_abort ();
+char *xmalloc PROTO((unsigned));
+static void fatal PVPROTO ((char *, ...)) PRINTF_ATTRIBUTE_1;
+void fancy_abort PROTO((void));
 
 static int max_opno;
 static int max_dup_opno;
@@ -699,11 +698,22 @@ xrealloc (ptr, size)
 }
 
 static void
-fatal (s, a1, a2)
-     char *s;
+fatal VPROTO ((char *format, ...))
 {
+#ifndef __STDC__
+  char *format;
+#endif
+  va_list ap;
+
+  VA_START (ap, format);
+
+#ifndef __STDC__
+  format = va_arg (ap, char *);
+#endif
+
   fprintf (stderr, "genemit: ");
-  fprintf (stderr, s, a1, a2);
+  vfprintf (stderr, format, ap);
+  va_end (ap);
   fprintf (stderr, "\n");
   exit (FATAL_EXIT_CODE);
 }
diff -rup orig/egcs-980315/gcc/genextract.c egcs-980315/gcc/genextract.c
--- orig/egcs-980315/gcc/genextract.c	Fri Feb 27 03:23:41 1998
+++ egcs-980315/gcc/genextract.c	Thu Mar 19 11:37:27 1998
@@ -19,25 +19,24 @@ the Free Software Foundation, 59 Temple 
 Boston, MA 02111-1307, USA.  */
 
 
-#include <stdio.h>
 #include "hconfig.h"
+#ifdef __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+#include "system.h"
+
 #include "rtl.h"
 #include "obstack.h"
 #include "insn-config.h"
 
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-
 static struct obstack obstack;
 struct obstack *rtl_obstack = &obstack;
 
 #define obstack_chunk_alloc xmalloc
 #define obstack_chunk_free free
 
-#ifdef NEED_DECLARATION_FREE
-extern void free ();
-#endif
 extern rtx read_rtx ();
 
 /* Names for patterns.  Need to allow linking with print-rtl.  */
@@ -106,12 +105,12 @@ static struct code_ptr *peepholes;
 
 static void walk_rtx ();
 static void print_path ();
-char *xmalloc ();
+char *xmalloc PROTO((unsigned));
+static void fatal PVPROTO ((char *, ...)) PRINTF_ATTRIBUTE_1;
+void fancy_abort PROTO((void));
 char *xrealloc ();
-static void fatal ();
 static char *copystr ();
 static void mybzero ();
-void fancy_abort ();
 \f
 static void
 gen_insn (insn)
@@ -370,11 +369,22 @@ xrealloc (ptr, size)
 }
 
 static void
-fatal (s, a1, a2)
-     char *s;
+fatal VPROTO ((char *format, ...))
 {
+#ifndef __STDC__
+  char *format;
+#endif
+  va_list ap;
+
+  VA_START (ap, format);
+
+#ifndef __STDC__
+  format = va_arg (ap, char *);
+#endif
+
   fprintf (stderr, "genextract: ");
-  fprintf (stderr, s, a1, a2);
+  vfprintf (stderr, format, ap);
+  va_end (ap);
   fprintf (stderr, "\n");
   exit (FATAL_EXIT_CODE);
 }
diff -rup orig/egcs-980315/gcc/genflags.c egcs-980315/gcc/genflags.c
--- orig/egcs-980315/gcc/genflags.c	Fri Feb 27 03:23:42 1998
+++ egcs-980315/gcc/genflags.c	Thu Mar 19 11:24:29 1998
@@ -22,29 +22,28 @@ the Free Software Foundation, 59 Temple 
 Boston, MA 02111-1307, USA.  */
 
 
-#include <stdio.h>
 #include "hconfig.h"
+#ifdef __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+#include "system.h"
+
 #include "rtl.h"
 #include "obstack.h"
 
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-
 static struct obstack obstack;
 struct obstack *rtl_obstack = &obstack;
 
 #define obstack_chunk_alloc xmalloc
 #define obstack_chunk_free free
 
-#ifdef NEED_DECLARATION_FREE
-extern void free ();
-#endif
 extern rtx read_rtx ();
 
-char *xmalloc ();
-static void fatal ();
-void fancy_abort ();
+char *xmalloc PROTO((unsigned));
+static void fatal PVPROTO ((char *, ...)) PRINTF_ATTRIBUTE_1;
+void fancy_abort PROTO((void));
 
 /* Names for patterns.  Need to allow linking with print-rtl.  */
 char **insn_name_ptr;
@@ -202,11 +201,22 @@ xrealloc (ptr, size)
 }
 
 static void
-fatal (s, a1, a2)
-     char *s;
+fatal VPROTO ((char *format, ...))
 {
+#ifndef __STDC__
+  char *format;
+#endif
+  va_list ap;
+
+  VA_START (ap, format);
+
+#ifndef __STDC__
+  format = va_arg (ap, char *);
+#endif
+
   fprintf (stderr, "genflags: ");
-  fprintf (stderr, s, a1, a2);
+  vfprintf (stderr, format, ap);
+  va_end (ap);
   fprintf (stderr, "\n");
   exit (FATAL_EXIT_CODE);
 }
diff -rup orig/egcs-980315/gcc/genopinit.c egcs-980315/gcc/genopinit.c
--- orig/egcs-980315/gcc/genopinit.c	Wed Mar 11 19:02:45 1998
+++ egcs-980315/gcc/genopinit.c	Thu Mar 19 11:33:48 1998
@@ -19,16 +19,16 @@ the Free Software Foundation, 59 Temple 
 Boston, MA 02111-1307, USA.  */
 
 
-#include <stdio.h>
 #include "hconfig.h"
-#include "rtl.h"
-#include "obstack.h"
-#include <ctype.h>
-
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
+#ifdef __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
 #endif
+#include "system.h"
 
+#include "rtl.h"
+#include "obstack.h"
 
 static struct obstack obstack;
 struct obstack *rtl_obstack = &obstack;
@@ -36,14 +36,11 @@ struct obstack *rtl_obstack = &obstack;
 #define obstack_chunk_alloc xmalloc
 #define obstack_chunk_free free
 
-#ifdef NEED_DECLARATION_FREE
-extern void free ();
-#endif
 extern rtx read_rtx ();
 
-char *xmalloc ();
-static void fatal ();
-void fancy_abort ();
+char *xmalloc PROTO((unsigned));
+static void fatal PVPROTO ((char *, ...)) PRINTF_ATTRIBUTE_1;
+void fancy_abort PROTO((void));
 
 /* Many parts of GCC use arrays that are indexed by machine mode and
    contain the insn codes for pattern in the MD file that perform a given
@@ -313,11 +310,22 @@ xrealloc (ptr, size)
 }
 
 static void
-fatal (s, a1, a2)
-     char *s;
+fatal VPROTO ((char *format, ...))
 {
+#ifndef __STDC__
+  char *format;
+#endif
+  va_list ap;
+
+  VA_START (ap, format);
+
+#ifndef __STDC__
+  format = va_arg (ap, char *);
+#endif
+
   fprintf (stderr, "genopinit: ");
-  fprintf (stderr, s, a1, a2);
+  vfprintf (stderr, format, ap);
+  va_end (ap);
   fprintf (stderr, "\n");
   exit (FATAL_EXIT_CODE);
 }
diff -rup orig/egcs-980315/gcc/genoutput.c egcs-980315/gcc/genoutput.c
--- orig/egcs-980315/gcc/genoutput.c	Wed Mar 11 19:29:01 1998
+++ egcs-980315/gcc/genoutput.c	Thu Mar 19 11:41:15 1998
@@ -90,15 +90,17 @@ insn_template[24] to be "clrd %0", and i
 It would not make an case in output_insn_hairy because the template
 given in the entry is a constant (it does not start with `*').  */
 \f
-#include <stdio.h>
 #include "hconfig.h"
+#ifdef __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+#include "system.h"
+
 #include "rtl.h"
 #include "obstack.h"
 
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-
 /* No instruction can have more operands than this.
    Sorry for this arbitrary limit, but what machine will
    have an instruction with this many operands?  */
@@ -111,15 +113,12 @@ struct obstack *rtl_obstack = &obstack;
 #define obstack_chunk_alloc xmalloc
 #define obstack_chunk_free free
 
-#ifdef NEED_DECLARATION_FREE
-extern void free ();
-#endif
 extern rtx read_rtx ();
 
-char *xmalloc ();
-static void fatal ();
-void fancy_abort ();
-static void error ();
+char *xmalloc PROTO((unsigned));
+static void fatal PVPROTO ((char *, ...)) PRINTF_ATTRIBUTE_1;
+void fancy_abort PROTO((void));
+static void error PVPROTO ((char *, ...)) PRINTF_ATTRIBUTE_1;
 static void mybcopy ();
 static void mybzero ();
 static int n_occurrences ();
@@ -918,11 +917,22 @@ mybcopy (b1, b2, length)
 }
 
 static void
-fatal (s, a1, a2, a3, a4)
-     char *s;
+fatal VPROTO ((char *format, ...))
 {
+#ifndef __STDC__
+  char *format;
+#endif
+  va_list ap;
+
+  VA_START (ap, format);
+
+#ifndef __STDC__
+  format = va_arg (ap, char *);
+#endif
+
   fprintf (stderr, "genoutput: ");
-  fprintf (stderr, s, a1, a2, a3, a4);
+  vfprintf (stderr, format, ap);
+  va_end (ap);
   fprintf (stderr, "\n");
   exit (FATAL_EXIT_CODE);
 }
@@ -937,11 +947,22 @@ fancy_abort ()
 }
 
 static void
-error (s, a1, a2)
-     char *s;
+error VPROTO ((char *format, ...))
 {
+#ifndef __STDC__
+  char *format;
+#endif
+  va_list ap;
+
+  VA_START (ap, format);
+
+#ifndef __STDC__
+  format = va_arg (ap, char *);
+#endif
+
   fprintf (stderr, "genoutput: ");
-  fprintf (stderr, s, a1, a2);
+  vfprintf (stderr, format, ap);
+  va_end (ap);
   fprintf (stderr, "\n");
 
   have_error = 1;
diff -rup orig/egcs-980315/gcc/genpeep.c egcs-980315/gcc/genpeep.c
--- orig/egcs-980315/gcc/genpeep.c	Fri Feb 27 03:23:45 1998
+++ egcs-980315/gcc/genpeep.c	Thu Mar 19 11:31:51 1998
@@ -19,24 +19,23 @@ the Free Software Foundation, 59 Temple 
 Boston, MA 02111-1307, USA.  */
 
 
-#include <stdio.h>
 #include "hconfig.h"
+#ifdef __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+#include "system.h"
+
 #include "rtl.h"
 #include "obstack.h"
 
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-
 static struct obstack obstack;
 struct obstack *rtl_obstack = &obstack;
 
 #define obstack_chunk_alloc xmalloc
 #define obstack_chunk_free free
 
-#ifdef NEED_DECLARATION_FREE
-extern void free ();
-#endif
 extern rtx read_rtx ();
 
 /* While tree-walking an instruction pattern, we keep a chain
@@ -52,10 +51,10 @@ struct link
   int vecelt;
 };
 
-char *xmalloc ();
 static void match_rtx ();
-static void fatal ();
-void fancy_abort ();
+char *xmalloc PROTO((unsigned));
+static void fatal PVPROTO ((char *, ...)) PRINTF_ATTRIBUTE_1;
+void fancy_abort PROTO((void));
 
 static int max_opno;
 
@@ -412,11 +411,22 @@ xrealloc (ptr, size)
 }
 
 static void
-fatal (s, a1, a2)
-     char *s;
+fatal VPROTO ((char *format, ...))
 {
+#ifndef __STDC__
+  char *format;
+#endif
+  va_list ap;
+
+  VA_START (ap, format);
+
+#ifndef __STDC__
+  format = va_arg (ap, char *);
+#endif
+
   fprintf (stderr, "genpeep: ");
-  fprintf (stderr, s, a1, a2);
+  vfprintf (stderr, format, ap);
+  va_end (ap);
   fprintf (stderr, "\n");
   exit (FATAL_EXIT_CODE);
 }
diff -rup orig/egcs-980315/gcc/genrecog.c egcs-980315/gcc/genrecog.c
--- orig/egcs-980315/gcc/genrecog.c	Wed Mar 11 19:02:46 1998
+++ egcs-980315/gcc/genrecog.c	Thu Mar 19 11:51:12 1998
@@ -46,24 +46,18 @@ Boston, MA 02111-1307, USA.  */
    which returns 0 if the rtl could not be split, or
    it returns the split rtl in a SEQUENCE.  */
 
-#include <stdio.h>
 #include "hconfig.h"
+#include "system.h"
+
 #include "rtl.h"
 #include "obstack.h"
 
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-
 static struct obstack obstack;
 struct obstack *rtl_obstack = &obstack;
 
 #define obstack_chunk_alloc xmalloc
 #define obstack_chunk_free free
 
-#ifdef NEED_DECLARATION_FREE
-extern void free ();
-#endif
 extern rtx read_rtx ();
 
 /* Data structure for a listhead of decision trees.  The alternatives
diff -rup orig/egcs-980315/gcc/system.h egcs-980315/gcc/system.h
--- orig/egcs-980315/gcc/system.h	Sat Feb 28 01:11:52 1998
+++ egcs-980315/gcc/system.h	Thu Mar 19 11:11:52 1998
@@ -188,4 +188,14 @@ extern void free ();
 extern char *getenv ();
 #endif
 
+#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
+# define PRINTF_ATTRIBUTE(m, n)
+#else
+# define PRINTF_ATTRIBUTE(m, n) __attribute__ ((format (__printf__, m, n)))
+#endif
+
+#define PRINTF_ATTRIBUTE_1 PRINTF_ATTRIBUTE(1, 2)
+#define PRINTF_ATTRIBUTE_2 PRINTF_ATTRIBUTE(2, 3)
+#define PRINTF_ATTRIBUTE_3 PRINTF_ATTRIBUTE(3, 4)
+
 #endif /* __GCC_SYSTEM_H__ */

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: egcs-980315, gen*.c system.h and fatal() using stdarg/varargs
  1998-03-20  8:45 Kaveh R. Ghazi
@ 1998-03-20  8:45 ` Jeffrey A Law
  0 siblings, 0 replies; 20+ messages in thread
From: Jeffrey A Law @ 1998-03-20  8:45 UTC (permalink / raw)
  To: Kaveh R. Ghazi; +Cc: egcs, wilson

  In message < 199803200208.VAA11947@caip.rutgers.edu >you write:
  > 	Here is my patch to add system.h to gen*.c.  It also fixes the
  > static function `fatal' to use real variable argument parameter lists.
  > 
  > 	Is so doing, I uncovered some format specifier problems in
  > genattrtab.c:
  > 
  >  > ./genattrtab.c:979: warning: char format, rtx_def arg (arg 2)
  >  > ./genattrtab.c:984: warning: char format, rtx_def arg (arg 2)
  >  > ./genattrtab.c:1001: warning: char format, rtx_def arg (arg 2)
  >  > ./genattrtab.c:1012: warning: char format, rtx_def arg (arg 2)
  >  > ./genattrtab.c:1012: warning: char format, rtx_def arg (arg 3)
  > 
  > 	All of these cases appear to be using a %s to print a XEXP(rtx,N).
  > Should these instead be changed to %s and XSTR(rtx,N) ?
Hard to be sure since the line #s do not match what's currently in
the sources.

I see 5 cases in "check_attr_test" which appear to fit the description
you've given.  Those should be using XSTR, not XINT as you suspected.

  > 	One other thing, I defined a PRINTF_ATTRIBUTE macro in
  > system.h along the lines of a similar trick in cccp.c.  However I'm
  > not sure that system.h is the right place for this.
It's as good a place as any.

  > 	I envision system.h as handling system header files, functions,
  > macros and related issues.  It seems like __attribute__, being a
  > compiler characteristic, is something for which gansidecl.h is to be
  > used for.  (Also along these lines, the bcopy/index stuff should be
  > removed from gansidecl.h now that system.h handles that.  But that's for
  > another day.)
That would be fine too.

I don't have a particular preference for where this would belong.

For the "fatal" problem -- I don't think you can rely on having
vfprintf.  You have to check for it.  If you don't have it, you'll
probably have to punt back to extracting the args as ints and
passing them to fprintf.


I would recommend checking in the changes *without* the fatal change;
then re-submit the changes for just fatal as a separate patch.

jeff

^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~1998-03-30 16:18 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1998-03-30 16:18 egcs-980315, gen*.c system.h and fatal() using stdarg/varargs Kaveh R. Ghazi
  -- strict thread matches above, loose matches on Subject: below --
1998-03-27 15:18 Kaveh R. Ghazi
1998-03-27  4:21 ` Richard Henderson
1998-03-26 21:54 Kaveh R. Ghazi
1998-03-27  4:21 ` Jeffrey A Law
1998-03-28 19:24   ` H.J. Lu
1998-03-26 21:54 Kaveh R. Ghazi
1998-03-29  5:14 ` John Carr
1998-03-25 17:05 Kaveh R. Ghazi
1998-03-27 15:18 ` Jeffrey A Law
1998-03-27 15:18 ` H.J. Lu
1998-03-24 14:49 Kaveh R. Ghazi
1998-03-24 11:16 Kaveh R. Ghazi
1998-03-24 11:16 ` Jeffrey A Law
1998-03-25  7:49 ` Robert Lipe
1998-03-25 16:30   ` Jeffrey A Law
1998-03-27 15:18 ` Richard Henderson
1998-03-24 10:24 Kaveh R. Ghazi
1998-03-20  8:45 Kaveh R. Ghazi
1998-03-20  8:45 ` Jeffrey A Law

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).