RS6000 questions/comments

Sean Eric Fagan sef at kithrup.COM
Fri Jun 28 08:12:08 AEST 1991


In article <141 at ssi.UUCP> cjr at ssi.UUCP (Cris J. Rhea) writes:
> * Make on the rs6k has no TARGET_ARCH or HOST_ARCH. The rs6k has no arch
>	command that I can find.

Most machines don't.  It's very simple to write an arch command, though, and
I've had to install one on lots of machines.  Remember, folks, all the
world's not a Sun.

> * Make on the rs6k doesn't seem to automatically sccs out files it can't 
>	find, so you may need to sccs get SCCS.

Are you using SysV sccs convention (s.<filename>) or BSD (SCCS/...)?  If
you're not using the one that the builtin rule expects, I'm not terribly
surprised it doesn't do what you want, and you shouldn't be, either.

> * The make on rs6k also doesn't automatically issue the .INIT rule.

What is this '.INIT' rule?  I've never heard of it, and I've been using
makefiles for half a decade now.

> * Makefiles with blank lines that have tabs in them are treated as syntax
>	errors by the rs6k make utility.

Blank lines with tabs tend to cause problems with make, and always have.

> * There is no /usr/lib/debug/malloc.o. Or at least I can't find it.

Not on my machine, either.  There are several debug mallocs out there; the
advantage being I can get source code if I want it, and, if it doesn't
provide the amount of debugging I want, I can change it.

> * On the rs6k cc does not define __STDC__ by default (unless you want
>	strict ANSI I guess) but the #include's and cc in general appears
>	to be an ANSI implementation. For example, it has stdlib.h, it wants 
>	sprintf() to be declared as "int sprintf();" or not at all, and
>	it allows prototypes all the time.
>	The SVR4 cc has the attitude that strict ANSI mode defines
>	__STDC__ as 1 otherwise it defines it as 0, in either case it is
>	defined. Very inconsistent and annoying.
>	Similar problems were found with the mem*() functions and the
>	malloc()/free()/realloc()/calloc() functions, don't declare
>	them just use <stdlib.h> and <string.h>.
>	I almost tried a -D__STDC__=0 on the compile line, but chickened
>	out, maybe I'll try that some other time.

Good for them!  Doug Gwyn (among others) has a *lot* of objections to
defining __STDC__ when you aren't compliant.  I, personally, could argue
both ways about it, and have done so before.  But there is nothing wrong
with what IBM did in that respect.

> * Expect many warning messages about enum's, especially if used as bit 
>	field types.  This is stupid, if you can't use an enum as
>	a bit field that makes them even more worthless.

I wish I had a copy of the ANSI C Standard handy; I think there might be
good reason they did that.  But I can't remember what ANSI said about
bitfields.  Ah, here it is (just found a copy):  "a bit-field shall have a
type that is a qualified or unqualified verson of one of int, unsigned int,
or signed int."  An enum type can *fit* into an int, but it is not
necessarily an int.  At least, that is likely IBM's reasoning.  I will not
say whether it is good or bad.

> * The rs6k compiler objected to:
>		#define blah(a,,b) a+b
>	The sun doesn't seem to care.

The sun compiler is broken.

> * The rs6k compiler will demote formal parameters to the type they
>	are specified with, the sun does not, e.g.
>		a(f) float f; { }
>	inside a() the f parameter (even though it is passed the entire double)
>	will be truncated to a float before it is used. The sun cc
>	recognizes formal parameters with type float as being more
>	like doubles.

The sun compiler is broken.  You said it was a float, why are you surprised
to find that it is?

> * Don't even attempt to declare any system calls if you include any
>	sys/*.h #include files. The chances of matching the declaration
>	in the #include is impossible and any include of any sys/*.h
>	#include file seems to bring in a whole nest of others, especially
>	unistd.h. 

Any declarations in header files for any standard functions (i.e., those
defined by ANSI and/or POSIX) must match the definition the standard says.
Guess what:  most of those don't necessarily match traditional declarations.
For example, consider:

	extern int lstat();	/* pre-POSIX */
	extern int lstat(const char *, struct stat *);	/* POSIX */

If the latter is in a header file, but you use the former, that is an error.

>* The rs6k C compiler gives a warning error on every use of #ident. 
>	Another warning message to ignore.

As it should.  What is this "#ident"?  Neither ANSI nor POSIX say anything
about it.  It would also, I suspect, complain about "#machine" or whatever
the abortion SysVr4 uses is.

>* The rs6k compiler complains about any macro that has been defined on
>	the compile line and also defined in the source, even if the
>	definitions are exactly the same. Yet another warning message to
>	ignore.

This is legitimate, although it would be nice if it did check to see if they
were the same.

>* The rs6k has defined NULL to be ((void*)0) instead of 0. This has
>	caused numerous fatal errors in some of the SVR4 sources.
>	Places where an unsigned or an ELF64_Addr (an unsigned) is
>	assigned NULL. I resorted to adding a -DNULL=0 to the compile
>	line to get around this.

Both definitions are correct.  See ANSI.

>* The rs6k like the u370 (that's the 3090) has no vfork().

vfork() is a hack, although, I will admit, it does have its uses.  The only
legitimate use of vfork() is that the child will execute before the parent.
However, POSIX does not (yet?) have a vfork() like function; IBM may be
waiting for POSIX to decide what to do before they add one.  (POSIX did
have, last time I checked a draft, a proposal for a 'qfork()' which was
almost-but-not-quite vfork().  So be it.)

>* Somewhere in the include of sys/types.h I think, there are #define's of
>	the very popular names TRUE and FALSE. This cause problems in
>	SVR4 ld1 e.g. it has enum{TRUE=1,FALSE=0}Boolean; in it.

Neither should be there in ANSI or POSIX conformance mode (assuming the
compiler has such a thing).  However, I will say that I believe the SysVr4
one to be *wrong* in that respect, because what if someone else wants to
define a boolean type?

>* The include of unistd.h includes just about everything, you may want to
>	avoid this file unless you really need it.

Again, there are limits on what <unistd.h> can include in POSIX conformance
mode.

>* The yacc source generated on the sun's will not compile on the rs6k,
>	you will need to re-run yacc on the rs6k to get rs6k acceptable
>	source. The sun yacc source declares things like malloc() wrong.

Not a problem, really.  I don't believe that yacc output is guaranteed to be
portable.  You should see if you can fix the yacc template, though.

-- 
Sean Eric Fagan  | "What *does* that 33 do?  I have no idea."
sef at kithrup.COM  |           -- Chris Torek
-----------------+              (torek at ee.lbl.gov)
Any opinions expressed are my own, and generally unpopular with others.



More information about the Comp.unix.aix mailing list