123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498 |
- .TH 8C 1
- .SH NAME
- 0c, 5c, 6c, 8c, 9c, ic, jc, kc, qc, vc \- C compilers
- .SH SYNOPSIS
- .B 8c
- [
- .I option ...
- ]
- [
- .I file ...
- ]
- .br
- etc.
- .SH DESCRIPTION
- These commands compile the named C
- .I files
- into object files for the corresponding architecture.
- If there are multiple C
- .IR files ,
- the compilers will attempt to keep
- .B $NPROC
- compilations running concurrently.
- Associated with each compiler is a string
- .IR objtype ,
- for example
- .TF "6c amd64 "
- .PD
- .TP
- .B "0c spim
- little-endian MIPS 3000 family
- .TP
- .B "5c arm
- little-endian ARM
- .TP
- .B "6c amd64
- AMD64 and compatibles (e.g., Intel64)
- .TP
- .B "8c 386
- Intel i386, i486, Pentium, etc.
- .TP
- .B "9c power64
- 64-bit PowerPC
- .TP
- .B "ic riscv
- 32-bit RISC-V
- .TP
- .B "jc riscv64
- 64-bit RISC-V
- .TP
- .B "kc sparc
- Sun (now Oracle) SPARC
- .TP
- .B "qc power
- PowerPC
- .TP
- .B "vc mips
- big-endian MIPS 3000 family
- .PP
- The compilers handle most preprocessing directives themselves; a complete
- preprocessor is available in
- .IR cpp (1),
- which must be run separately.
- .PP
- Let the first letter of the compiler name be
- .IR O =
- .BR 0 ,
- .BR 5 ,
- .BR 6 ,
- .BR 8 ,
- .BR 9 ,
- .BR i ,
- .BR j ,
- .BR k ,
- .BR q ,
- or
- .BR v .
- The output object files end in
- .RI . O .
- The letter is also the prefix of related programs:
- .IB O a
- is the assembler,
- .IB O l
- is the loader.
- Plan 9 conventionally sets the
- .B $objtype
- environment variable to the
- .I objtype
- string appropriate to the current machine's type.
- Plan 9 also conventionally has
- .RI / objtype
- directories, which contain among other things:
- .BR include ,
- for machine-dependent include files;
- .BR lib ,
- for public object code libraries;
- .BR bin ,
- for public programs;
- and
- .BR mkfile ,
- for preconditioning
- .IR mk (1).
- .PP
- The compiler options are:
- .TF Dname
- .PD
- .TP
- .BI -o " obj"
- Place output in file
- .I obj
- (allowed only if there is just one input file).
- Default is to take the last element of the input file name,
- strip any trailing
- .BR .c ,
- and append
- .RI . O .
- .TP
- .B -w
- Print warning messages about unused variables, etc.
- .TP
- .B -W
- Print all the messages that
- .B -w
- would print as warnings, but make them errors.
- .TP
- .B -B
- Accept functions without a new-style
- ANSI C function prototype.
- By default, the compilers reject functions
- used without a defined prototype,
- although ANSI C permits them.
- .TP
- .BI -D\*S name=def
- .br
- .ns
- .TP
- .BI -D \*Sname
- Define the
- .I name
- to the preprocessor,
- as if by
- .LR #define .
- If no definition is given, the name is defined as
- .LR 1 .
- .TP
- .BI -F
- Enable type-checking of calls to
- .IR print (2)
- and other formatted print routines. See the discussion
- of extensions, below.
- .TP
- .BI -I \*Sdir
- An
- .L #include
- file whose name does not begin with
- slash
- or is enclosed in double quotes
- is always
- sought first in the directory
- of the
- .I file
- argument. If this fails,
- the
- .I -.
- flag is given or the name is enclosed in
- .BR <> ,
- it is then sought
- in directories named in
- .B -I
- options,
- then in
- .BR /sys/include ,
- and finally in
- .BR /$objtype/include .
- .TP
- .B -.
- Suppress the automatic searching for include files in
- the directory of the file argument.
- .TP
- .B -N
- Suppress automatic registerization and optimization.
- .TP
- .B -S
- Print an assembly language version of the object code
- on standard output as well as generating the
- .RI . O
- file.
- .TP
- .B -T
- Pass type signatures on all external and global entities.
- The signature is based on the C
- .B signof
- operator.
- See
- .IR dynld (2).
- .TP
- .B -V
- By default, the compilers are non-standardly lax about type equality between
- .B void*
- values and other pointers; this flag requires ANSI C conformance.
- .TP
- .B -p
- Invoke a standard ANSI C preprocessor before compiling.
- .TP
- .B -a
- Instead of compiling, print on standard output acid functions (see
- .IR acid (1))
- for examining structures declared in the source files.
- .TP
- .B -aa
- Like
- .B -a
- except suppress information about structures
- declared in included header files.
- .TP
- .B -n
- When used with
- .B -a
- or
- .BR -aa ,
- places acid functions in
- .IB file .acid
- for input
- .IB file .c ,
- and not on standard output.
- .PP
- The compilers support several extensions to 1989 ANSI C,
- some of which were adopted in later ANSI C standards:
- .TF \|
- .PD
- .TP
- \-
- A structure or union may contain unnamed substructures and subunions.
- 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
- .B typedef
- statement,
- the unnamed structure or union can be explicitly referenced
- by <struct variable>.<tagname>.
- .TP
- \-
- A structure value can be formed with an expression such as
- .EX
- (struct S){v1, v2, v3}
- .EE
- where the list elements are values for the fields of struct
- .BR S .
- .TP
- \-
- Array initializers can specify the indices of the array in square
- brackets, as
- .EX
- int a[] = { [3] 1, [10] 5 };
- .EE
- which initializes the third and tenth elements of the eleven-element array
- .BR a .
- .TP
- \-
- Structure initializers can specify the structure element by using the name
- following a period, as
- .EX
- struct { int x; int y; } s = { .y 1, .x 5 };
- .EE
- which initializes elements
- .B y
- and then
- .B x
- of the structure
- .BR s .
- These forms also accept the new ANSI C notation, which includes an equal sign:
- .EX
- int a[] = { [3] = 1, [10] = 5 };
- struct { int x; int y; } s = { .y = 1, .x = 5 };
- .EE
- .TP
- \-
- A global variable can be dedicated to a register
- by declaring it
- .B "extern register"
- in
- .I all
- modules and libraries.
- .TP
- \-
- A
- .B #pragma
- of the form
- .EX
- #pragma lib "libbio.a"
- .EE
- records that the program needs to be loaded with file
- .BR /$objtype/lib/libbio.a ;
- such lines, typically placed in library header files, obviate the
- .B -l
- option of the loaders. To help identify files in non-standard directories,
- within the file names in the
- .B #pragmas
- the string
- .B $M
- represents the name of the architecture
- (e.g.,
- .BR mips )
- and
- .B $O
- represents its identifying character
- (e.g.,
- .BR v ).
- .TP
- \-
- A
- .B #pragma
- of the form
- .EX
- #pragma varargck argpos error 2
- .EE
- tells the compiler that the second argument to
- .B error
- is a
- .BR print -like
- format string (see
- .IR print (2))
- that identifies the handling of subsequent arguments.
- The
- .B #pragma
- .EX
- #pragma varargck type "s" char*
- .EE
- says that the format verb
- .B s
- processes an argument of type
- .BR char *.
- The
- .B #pragma
- .EX
- #pragma varargck flag 'c'
- .EE
- says that
- .B c
- is a flag character.
- These
- .B #pragmas
- are used, if the
- .B -F
- option is enabled, to type-check calls to
- .B print
- and other such routines.
- .TP
- \-
- A
- .B #pragma
- with any of the following forms:
- .EX
- #pragma incomplete \fItype\fP
- #pragma incomplete struct \fItag\fP
- #pragma incomplete union \fItag\fP
- .EE
- where
- .I type
- is a
- .BR typedef 'd
- name for a structure or union type, and
- .I 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 definitions
- 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 (typically
- at the start and end of a particular include file).
- If
- .I type
- is the word
- .BR _off_ ,
- signature generation is turned off; if
- .I type
- is the word
- .BR _on_ ,
- the compiler will generate signatures.
- .TP
- \-
- The C++ comment
- .RB ( //
- to end of line)
- is accepted as well as the normal
- convention of
- .B /*
- .BR */ .
- .TP
- \-
- The compilers accept
- .B long
- .B long
- variables as a 64-bit type.
- The standard header typedefs this to
- .BR vlong .
- Arithmetic on
- .B vlong
- values is usually emulated by a run-time library,
- though in at least
- .IR 8c ,
- only division and modulus use the run-time library
- and the other operators generate in-line code
- (and
- .I uvlong-expression
- .I divison-or-modulus
- .BI "(1<<" constant )
- will turn into in-line bit operations,
- as is done for shorter
- .I unsigned
- expressions).
- .SH EXAMPLE
- For the 386, produce a program
- .B prog
- from C files
- .BR main.c
- and
- .BR sub.c :
- .IP
- .EX
- 8c -FVw main.c sub.c
- 8l -o prog main.8 sub.8
- .EE
- .SH FILES
- .TF /$objtype/include
- .TP
- .B /sys/include
- system area for machine-independent
- .B #include
- directives.
- .TP
- .B /$objtype/include
- system area for machine-dependent
- .B #include
- directives.
- .SH SOURCE
- .TF /sys/src/cmd/8c,\ etc.
- .TP
- .B /sys/src/cmd/cc
- machine-independent part
- .TP
- .BR /sys/src/cmd/8c ,\ etc.
- machine-dependent part
- .SH "SEE ALSO"
- .IR 8a (1),
- .IR 8l (1),
- .IR cpp (1),
- .IR mk (1),
- .IR nm (1),
- .IR pcc (1),
- .IR db (1),
- .IR acid (1)
- .\" .IR ansitize (1)
- .PP
- Rob Pike,
- ``How to Use the Plan 9 C Compiler''
- .SH BUGS
- 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.
- .PP
- The default preprocessor only handles
- .LR #define ,
- .LR #include ,
- .LR #undef ,
- .LR #ifdef ,
- .LR #line ,
- and
- .LR #ifndef .
- For a full ANSI preprocessor, use
- the
- .B p
- option.
- .PP
- The default search order for include files
- differs to that of
- .IR cpp (1).
- .PP
- Some new features of C99, the 1999 ANSI C standard,
- are implemented.
- No new features of C11, the 2011 ANSI C standard,
- are implemented.
- .PP
- The implementation of
- .B vlong
- assignment can use a static location
- and this can be disturbed by interrupts
- (e.g., notes)
- .RI ( 8c
- at least).
|