0c, 5c, 6c, 7c, 8c, 9c, qc, vc – C compilers|
8c [ option ... ] [ file ... ]|
These commands compile the named C files into object files for
the corresponding architecture. If there are multiple C files,
the compilers will attempt to keep $NPROC compilations running
concurrently. Associated with each compiler is a string objtype,
0c spim little–endian MIPS 3000 family
5c arm little–endian ARM
6c amd64 AMD64 and compatibles (e.g., Intel64)
7c arm64 little–endian 64–bit ARM
8c 386 Intel i386, i486, Pentium, etc.
9c power6464–bit PowerPC
qc power PowerPC
vc mips big–endian MIPS 3000 family
The compilers handle most preprocessing directives themselves; a complete preprocessor is available in cpp(1), which must be run separately.
Let the first letter of the compiler name be O= 0, 5, 6, 7, 8, 9, q, or v. The output object files end in .O. The letter is also the prefix of related programs: Oa is the assembler, Ol is the loader. Plan 9 conventionally sets the $objtype environment variable to the objtype string appropriate to the current machine's type. Plan 9 also conventionally has /objtype directories, which contain among other things: include, for machine–dependent include files; lib, for public object code libraries; bin, for public programs; and mkfile, for preconditioning mk(1).
The compiler options are:
–N Suppress automatic registerization and optimization.
–S Print an assembly language version of the object code on standard output as well as generating the .O file.
–T Pass type signatures on all external and global entities. The signature is based on the C signof operator. See dynld(2).
–V By default, the compilers are non–standardly lax about type equality between void* values and other pointers; this flag requires ANSI C conformance.
–p Invoke a standard ANSI C preprocessor before compiling.
–a Instead of compiling, print on standard output acid functions (see acid(1)) for examining structures declared in the source files.
–aa Like –a except suppress information about structures declared in included header files.
–n When used with –a or –aa, places acid functions in file.acid for input file.c, and not on standard output.
The compilers support several extensions to 1989 ANSI C, some
of which were adopted in later ANSI C standards:
– A #pragma of the form
– The compilers accept long long variables as a 64–bit type. The standard header typedefs this to vlong. Arithmetic on vlong values is usually emulated by a run–time library, though in at least 8c, only division and modulus use the run–time library and the other operators generate in–line code (and uvlong–
For the 386, produce a program prog from C files main.c and sub.c:|
/sys/include system area for machine–independent #include directives.|
/$objtype/include system area for machine–dependent #include directives.
/sys/src/cmd/cc machine–independent part|
/sys/src/cmd/8c, etc. machine–dependent part
8a(1), 8l(1), cpp(1), mk(1), nm(1), pcc(1), db(1), acid(1) |
Rob Pike, ``How to Use the Plan 9 C Compiler''
The list of compilers given above is only partial, not all architectures
are supported on all systems, some have been retired and some
are provided by third parties. |
The default preprocessor only handles #define, #include, #undef, #ifdef, #line, and #ifndef. For a full ANSI preprocessor, use the p option.
The default search order for include files differs to that of cpp(1).
Some new features of C99, the 1999 ANSI C standard, are implemented. No new features of C11, the 2011 ANSI C standard, are implemented.
The implementation of vlong assignment can use a static location
and this can be disturbed by interrupts (e.g., notes) (8c at least).