glenda.party
term% ls -F
term% pwd
$home/manuals/plan9_4th/1/8c
term% cat index.txt
8C(1)                       General Commands Manual                      8C(1)

NAME
       0c, 5c, 6c, 8c, 9c, kc, qc, vc - C compilers

SYNOPSIS
       8c [ option ...  ] [ file ...  ]
       etc.

DESCRIPTION
       These commands compile the named C files into object files for the cor‐
       responding  architecture.  If there are multiple C files, the compilers
       will attempt to keep $NPROC compilations running concurrently.  Associ‐
       ated with each compiler is a string objtype, for example

       0c spim
              little-endian MIPS 3000 family

       5c arm little-endian ARM

       6c amd64
              AMD64 and compatibles (e.g., Intel64)

       8c 386 Intel i386, i486, Pentium, etc.

       9c power64
              64-bit PowerPC

       kc sparc
              Sun (now Oracle) SPARC

       qc power
              PowerPC

       vc mips
              big-endian MIPS 3000 family

       The compilers handle most preprocessing directives themselves;  a  com‐
       plete  preprocessor  is  available  in  cpp(1), which must be run sepa‐
       rately.

       Let the first letter of the compiler name be O= 0, 5, 6, 8, 9, k, 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 conven‐
       tionally 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 precondition‐
       ing mk(1).

       The compiler options are:

       -o obj Place output in file obj (allowed only if there is just one  in‐
              put  file).   Default  is  to take the last element of the input
              file name, strip any trailing .c, and append .O.

       -w     Print warning messages about unused variables, etc.

       -W     Print all the messages that -w would print as warnings, but make
              them errors.

       -B     Accept functions without a new-style ANSI C function  prototype.
              By  default,  the  compilers reject functions used without a de‐
              fined prototype, although ANSI C permits them.

       -Dname=def
       -Dname Define the name to the preprocessor, as if by If  no  definition
              is given, the name is defined as

       -F     Enable  type-checking  of  calls to print(2) and other formatted
              print routines.  See the discussion of extensions, below.

       -Idir  An file whose name does not begin with slash or is  enclosed  in
              double  quotes  is  always  sought first in the directory of the
              file argument.  If this fails, the -.  flag is given or the name
              is enclosed in <>, it is then sought in directories named in  -I
              options, then in /sys/include, and finally in /$objtype/include.

       -.     Suppress the automatic searching for include files in the direc‐
              tory of the file argument.

       -N     Suppress automatic registerization and optimization.

       -S     Print  an  assembly language version of the object code on stan‐
              dard 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  re‐
              quires 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 structure or union may contain unnamed substructures and  sub‐
              unions.   The  fields of the substructures or subunions can then
              be used as if they were members of the parent structure or union
              (the resolution of a name  conflict  is  unspecified).   When  a
              pointer  to  the  outer  structure or union is used in a context
              that is only legal for the unnamed  substructure,  the  compiler
              promotes  the type and adjusts the pointer value to point at the
              substructure.  If the unnamed structure or union is  of  a  type
              with  a  tag  name specified by a typedef statement, the unnamed
              structure or union can be explicitly referenced by <struct vari‐
              able>.<tagname>.

       -      A structure value can be formed with an expression such as
                  (struct S){v1, v2, v3}
              where the list elements are values for the fields of struct S.

       -      Array initializers can specify  the  indices  of  the  array  in
              square brackets, as
                  int a[] = { [3] 1, [10] 5 };
              which initializes the third and tenth elements of the eleven-el‐
              ement array a.

       -      Structure  initializers can specify the structure element by us‐
              ing the name following a period, as
                  struct { int x; int y; } s = { .y 1, .x 5 };
              which initializes elements y and then  x  of  the  structure  s.
              These  forms also accept the new ANSI C notation, which includes
              an equal sign:
                  int a[] = { [3] = 1, [10] = 5 };
                  struct { int x; int y; } s = { .y = 1, .x = 5 };

       -      A global variable can be dedicated to a register by declaring it
              extern register in all modules and libraries.

       -      A #pragma of the form
                  #pragma lib "libbio.a"
              records that the program needs to be  loaded  with  file  /$obj‐
              type/lib/libbio.a;  such  lines,  typically  placed  in  library
              header files, obviate the -l option of  the  loaders.   To  help
              identify  files  in  non-standard  directories,  within the file
              names in the #pragmas the string $M represents the name  of  the
              architecture  (e.g.,  mips)  and  $O  represents its identifying
              character (e.g., v).

       -      A #pragma of the form
                  #pragma varargck argpos error 2
              tells the compiler that the second argument to error is a print-
              like format string (see print(2)) that identifies  the  handling
              of subsequent arguments.  The #pragma
                  #pragma varargck type "s" char*
              says that the format verb s processes an argument of type char*.
              The #pragma
                  #pragma varargck flag 'c'
              says  that  c  is a flag character.  These #pragmas are used, if
              the -F option is enabled, to type-check calls to print and other
              such routines.

       -      A #pragma with any of the following forms:
                  #pragma incomplete type
                  #pragma incomplete struct tag
                  #pragma incomplete union tag
              where type is a typedef'd name for a structure  or  union  type,
              and tag is a structure or union tag, tells the compiler that the
              corresponding  type  should  have its signature calculated as an
              incomplete type even if it is subsequently fully defined.   This
              allows  the  type signature mechanism to work in the presence of
              opaque types declared in header files, with their  full  defini‐
              tions  visible  only  to  the code which manipulates them.  With
              some imported software it might be necessary  to  turn  off  the
              signature  generation completely for a large body of code (typi‐
              cally at the start and end of a particular  include  file).   If
              type  is  the word _off_, signature generation is turned off; if
              type is the word _on_, the compiler will generate signatures.

       -      The C++ comment (// to end of line) is accepted as well  as  the
              normal convention of /* */.

       -      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-expression
              divison-or-modulus (1<<constant) will turn into in-line bit  op‐
              erations, as is done for shorter unsigned expressions).

EXAMPLE
       For the 386, produce a program prog from C files main.c and sub.c:

              8c -FVw main.c sub.c
              8l -o prog main.8 sub.8

FILES
       /sys/include
              system area for machine-independent #include directives.

       /$objtype/include
              system area for machine-dependent #include directives.

SOURCE
       /sys/src/cmd/cc
              machine-independent part

       /sys/src/cmd/8c, etc.
              machine-dependent part

SEE ALSO
       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''

BUGS
       The  list  of  compilers given above is only partial, not all architec‐
       tures are supported on all systems, some have been retired and some are
       provided by third parties.

       The default preprocessor only handles and 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).

                                                                         8C(1)