mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
Change-Id: I0407950bfc84082683012944b2051e46dc682ba0 Reviewed-on: https://go-review.googlesource.com/c/go/+/463136 Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: Alan Donovan <adonovan@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Cherry Mui <cherryyz@google.com>
299 lines
11 KiB
Go
299 lines
11 KiB
Go
// Copyright 2009 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
/*
|
|
Compile, typically invoked as ``go tool compile,'' compiles a single Go package
|
|
comprising the files named on the command line. It then writes a single
|
|
object file named for the basename of the first source file with a .o suffix.
|
|
The object file can then be combined with other objects into a package archive
|
|
or passed directly to the linker (``go tool link''). If invoked with -pack, the compiler
|
|
writes an archive directly, bypassing the intermediate object file.
|
|
|
|
The generated files contain type information about the symbols exported by
|
|
the package and about types used by symbols imported by the package from
|
|
other packages. It is therefore not necessary when compiling client C of
|
|
package P to read the files of P's dependencies, only the compiled output of P.
|
|
|
|
Command Line
|
|
|
|
Usage:
|
|
|
|
go tool compile [flags] file...
|
|
|
|
The specified files must be Go source files and all part of the same package.
|
|
The same compiler is used for all target operating systems and architectures.
|
|
The GOOS and GOARCH environment variables set the desired target.
|
|
|
|
Flags:
|
|
|
|
-D path
|
|
Set relative path for local imports.
|
|
-I dir1 -I dir2
|
|
Search for imported packages in dir1, dir2, etc,
|
|
after consulting $GOROOT/pkg/$GOOS_$GOARCH.
|
|
-L
|
|
Show complete file path in error messages.
|
|
-N
|
|
Disable optimizations.
|
|
-S
|
|
Print assembly listing to standard output (code only).
|
|
-S -S
|
|
Print assembly listing to standard output (code and data).
|
|
-V
|
|
Print compiler version and exit.
|
|
-asmhdr file
|
|
Write assembly header to file.
|
|
-asan
|
|
Insert calls to C/C++ address sanitizer.
|
|
-buildid id
|
|
Record id as the build id in the export metadata.
|
|
-blockprofile file
|
|
Write block profile for the compilation to file.
|
|
-c int
|
|
Concurrency during compilation. Set 1 for no concurrency (default is 1).
|
|
-complete
|
|
Assume package has no non-Go components.
|
|
-cpuprofile file
|
|
Write a CPU profile for the compilation to file.
|
|
-dynlink
|
|
Allow references to Go symbols in shared libraries (experimental).
|
|
-e
|
|
Remove the limit on the number of errors reported (default limit is 10).
|
|
-goversion string
|
|
Specify required go tool version of the runtime.
|
|
Exits when the runtime go version does not match goversion.
|
|
-h
|
|
Halt with a stack trace at the first error detected.
|
|
-importcfg file
|
|
Read import configuration from file.
|
|
In the file, set importmap, packagefile to specify import resolution.
|
|
-installsuffix suffix
|
|
Look for packages in $GOROOT/pkg/$GOOS_$GOARCH_suffix
|
|
instead of $GOROOT/pkg/$GOOS_$GOARCH.
|
|
-l
|
|
Disable inlining.
|
|
-lang version
|
|
Set language version to compile, as in -lang=go1.12.
|
|
Default is current version.
|
|
-linkobj file
|
|
Write linker-specific object to file and compiler-specific
|
|
object to usual output file (as specified by -o).
|
|
Without this flag, the -o output is a combination of both
|
|
linker and compiler input.
|
|
-m
|
|
Print optimization decisions. Higher values or repetition
|
|
produce more detail.
|
|
-memprofile file
|
|
Write memory profile for the compilation to file.
|
|
-memprofilerate rate
|
|
Set runtime.MemProfileRate for the compilation to rate.
|
|
-msan
|
|
Insert calls to C/C++ memory sanitizer.
|
|
-mutexprofile file
|
|
Write mutex profile for the compilation to file.
|
|
-nolocalimports
|
|
Disallow local (relative) imports.
|
|
-o file
|
|
Write object to file (default file.o or, with -pack, file.a).
|
|
-p path
|
|
Set expected package import path for the code being compiled,
|
|
and diagnose imports that would cause a circular dependency.
|
|
-pack
|
|
Write a package (archive) file rather than an object file
|
|
-race
|
|
Compile with race detector enabled.
|
|
-s
|
|
Warn about composite literals that can be simplified.
|
|
-shared
|
|
Generate code that can be linked into a shared library.
|
|
-spectre list
|
|
Enable spectre mitigations in list (all, index, ret).
|
|
-traceprofile file
|
|
Write an execution trace to file.
|
|
-trimpath prefix
|
|
Remove prefix from recorded source file paths.
|
|
|
|
Flags related to debugging information:
|
|
|
|
-dwarf
|
|
Generate DWARF symbols.
|
|
-dwarflocationlists
|
|
Add location lists to DWARF in optimized mode.
|
|
-gendwarfinl int
|
|
Generate DWARF inline info records (default 2).
|
|
|
|
Flags to debug the compiler itself:
|
|
|
|
-E
|
|
Debug symbol export.
|
|
-K
|
|
Debug missing line numbers.
|
|
-d list
|
|
Print debug information about items in list. Try -d help for further information.
|
|
-live
|
|
Debug liveness analysis.
|
|
-v
|
|
Increase debug verbosity.
|
|
-%
|
|
Debug non-static initializers.
|
|
-W
|
|
Debug parse tree after type checking.
|
|
-f
|
|
Debug stack frames.
|
|
-i
|
|
Debug line number stack.
|
|
-j
|
|
Debug runtime-initialized variables.
|
|
-r
|
|
Debug generated wrappers.
|
|
-w
|
|
Debug type checking.
|
|
|
|
Compiler Directives
|
|
|
|
The compiler accepts directives in the form of comments.
|
|
To distinguish them from non-directive comments, directives
|
|
require no space between the comment opening and the name of the directive. However, since
|
|
they are comments, tools unaware of the directive convention or of a particular
|
|
directive can skip over a directive like any other comment.
|
|
*/
|
|
// Line directives come in several forms:
|
|
//
|
|
// //line :line
|
|
// //line :line:col
|
|
// //line filename:line
|
|
// //line filename:line:col
|
|
// /*line :line*/
|
|
// /*line :line:col*/
|
|
// /*line filename:line*/
|
|
// /*line filename:line:col*/
|
|
//
|
|
// In order to be recognized as a line directive, the comment must start with
|
|
// //line or /*line followed by a space, and must contain at least one colon.
|
|
// The //line form must start at the beginning of a line.
|
|
// A line directive specifies the source position for the character immediately following
|
|
// the comment as having come from the specified file, line and column:
|
|
// For a //line comment, this is the first character of the next line, and
|
|
// for a /*line comment this is the character position immediately following the closing */.
|
|
// If no filename is given, the recorded filename is empty if there is also no column number;
|
|
// otherwise it is the most recently recorded filename (actual filename or filename specified
|
|
// by previous line directive).
|
|
// If a line directive doesn't specify a column number, the column is "unknown" until
|
|
// the next directive and the compiler does not report column numbers for that range.
|
|
// The line directive text is interpreted from the back: First the trailing :ddd is peeled
|
|
// off from the directive text if ddd is a valid number > 0. Then the second :ddd
|
|
// is peeled off the same way if it is valid. Anything before that is considered the filename
|
|
// (possibly including blanks and colons). Invalid line or column values are reported as errors.
|
|
//
|
|
// Examples:
|
|
//
|
|
// //line foo.go:10 the filename is foo.go, and the line number is 10 for the next line
|
|
// //line C:foo.go:10 colons are permitted in filenames, here the filename is C:foo.go, and the line is 10
|
|
// //line a:100 :10 blanks are permitted in filenames, here the filename is " a:100 " (excluding quotes)
|
|
// /*line :10:20*/x the position of x is in the current file with line number 10 and column number 20
|
|
// /*line foo: 10 */ this comment is recognized as invalid line directive (extra blanks around line number)
|
|
//
|
|
// Line directives typically appear in machine-generated code, so that compilers and debuggers
|
|
// will report positions in the original input to the generator.
|
|
/*
|
|
The line directive is a historical special case; all other directives are of the form
|
|
//go:name, indicating that they are defined by the Go toolchain.
|
|
Each directive must be placed its own line, with only leading spaces and tabs
|
|
allowed before the comment.
|
|
Each directive applies to the Go code that immediately follows it,
|
|
which typically must be a declaration.
|
|
|
|
//go:noescape
|
|
|
|
The //go:noescape directive must be followed by a function declaration without
|
|
a body (meaning that the function has an implementation not written in Go).
|
|
It specifies that the function does not allow any of the pointers passed as
|
|
arguments to escape into the heap or into the values returned from the function.
|
|
This information can be used during the compiler's escape analysis of Go code
|
|
calling the function.
|
|
|
|
//go:uintptrescapes
|
|
|
|
The //go:uintptrescapes directive must be followed by a function declaration.
|
|
It specifies that the function's uintptr arguments may be pointer values that
|
|
have been converted to uintptr and must be on the heap and kept alive for the
|
|
duration of the call, even though from the types alone it would appear that the
|
|
object is no longer needed during the call. The conversion from pointer to
|
|
uintptr must appear in the argument list of any call to this function. This
|
|
directive is necessary for some low-level system call implementations and
|
|
should be avoided otherwise.
|
|
|
|
//go:noinline
|
|
|
|
The //go:noinline directive must be followed by a function declaration.
|
|
It specifies that calls to the function should not be inlined, overriding
|
|
the compiler's usual optimization rules. This is typically only needed
|
|
for special runtime functions or when debugging the compiler.
|
|
|
|
//go:norace
|
|
|
|
The //go:norace directive must be followed by a function declaration.
|
|
It specifies that the function's memory accesses must be ignored by the
|
|
race detector. This is most commonly used in low-level code invoked
|
|
at times when it is unsafe to call into the race detector runtime.
|
|
|
|
//go:nosplit
|
|
|
|
The //go:nosplit directive must be followed by a function declaration.
|
|
It specifies that the function must omit its usual stack overflow check.
|
|
This is most commonly used by low-level runtime code invoked
|
|
at times when it is unsafe for the calling goroutine to be preempted.
|
|
|
|
//go:linkname localname [importpath.name]
|
|
|
|
The //go:linkname directive conventionally precedes the var or func
|
|
declaration named by ``localname``, though its position does not
|
|
change its effect.
|
|
This directive determines the object-file symbol used for a Go var or
|
|
func declaration, allowing two Go symbols to alias the same
|
|
object-file symbol, thereby enabling one package to access a symbol in
|
|
another package even when this would violate the usual encapsulation
|
|
of unexported declarations, or even type safety.
|
|
For that reason, it is only enabled in files that have imported "unsafe".
|
|
|
|
It may be used in two scenarios. Let's assume that package upper
|
|
imports package lower, perhaps indirectly. In the first scenario,
|
|
package lower defines a symbol whose object file name belongs to
|
|
package upper. Both packages contain a linkname directive: package
|
|
lower uses the two-argument form and package upper uses the
|
|
one-argument form. In the example below, lower.f is an alias for the
|
|
function upper.g:
|
|
|
|
package upper
|
|
import _ "unsafe"
|
|
//go:linkname g
|
|
func g()
|
|
|
|
package lower
|
|
import _ "unsafe"
|
|
//go:linkname f upper.g
|
|
func f() { ... }
|
|
|
|
The linkname directive in package upper suppresses the usual error for
|
|
a function that lacks a body. (That check may alternatively be
|
|
suppressed by including a .s file, even an empty one, in the package.)
|
|
|
|
In the second scenario, package upper unilaterally creates an alias
|
|
for a symbol in package lower. In the example below, upper.g is an alias
|
|
for the function lower.f.
|
|
|
|
package upper
|
|
import _ "unsafe"
|
|
//go:linkname g lower.f
|
|
func g()
|
|
|
|
package lower
|
|
func f() { ... }
|
|
|
|
The declaration of lower.f may also have a linkname directive with a
|
|
single argument, f. This is optional, but helps alert the reader that
|
|
the function is accessed from outside the package.
|
|
|
|
*/
|
|
package main
|