Even though rcs and sccs were in every Unix distro and some other competitors existed their use was not common back then.
Rich Pixley deserves all the credit for getting gnu sources into source control, specifically CVS which at the time was the latest hotness (it was not yet client server; that was added later by IIRC Ian Taylor after some unfortunate incidents).
John and I placed some absurd hoops that needed to be jumped through in order for source control to be adopted, all of which Rich wisely just ignored.
> Alternatively I can directly ask some of the early GCC contributors. Unfortunately I’m not sure whether their emails are still reachable or even worse, whether they are still with us.
Last I checked, rms himself is still alive and answering emails. He might be a good place to start.
It's not one I agree or disagree with but it looks perfectly reasonable. My suspicion is you didn't read any of it and just spouted off on first impressions.
I'd be a lot happier if opinionated HN commenters would be a little slower about getting offended on other people's behalf.
As someone growing up writing assembler on the M68k-based Amiga, reading about the rtd instruction was mildly shocking. Learning it was 68010 and later calmed me down, phew.
The reason why it was generally not used in C was probably that in pre-ANSI C, prototypes were optional, calling conventions were enforced loosely, and even in functions that were not officially variadic, sometimes trailing arguments were omitted deliberately or accidentally.
Prototypes did not exist in original K&R. Even function declarations (without prototypes/parameter lists) were still optional in C89 (“ANSI C”), only C99 disallowed calling undeclared functions. To this day, GCC accepts call to undeclared functions by default. Generally, the ABIs GCC supports are carefully constructed to support such usage in many historically important cases (such as calling functions declared in <unistd.h>, many of which use the default int return type, too).
The K&R legacy is likely the reason for the caller-pops-arguments convention, but there was also a time where it was deemed more efficient because you could combine multiple stack adjustments.
There's also a neat trick I learned from LuaJIT: if you store the stack pointer in a callee-saved register before the call and restore it afterwards, it works with both conventions.
Ah yes you're right. I had forgotten just how primitive declarations in K&R C were; I thought parameter names were allowed.
In addition to caller-pops-arguments, I also remember that arguments used to be pushed on the stack in right to left order, so the callee had a fixed offset to the first argument, no matter how many arguments were provided.
https://gcc.gnu.org/pub/gcc/old-releases/gcc-1/gcc-1.21.tar....