1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
|
.\" Automatically generated by Pod::Man 4.09 (Pod::Simple 3.35)
.\"
.\" Standard preamble:
.\" ========================================================================
.de Sp \" Vertical space (when we can't use .PP)
.if t .sp .5v
.if n .sp
..
.de Vb \" Begin verbatim text
.ft CW
.nf
.ne \\$1
..
.de Ve \" End verbatim text
.ft R
.fi
..
.\" Set up some character translations and predefined strings. \*(-- will
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
.\" double quote, and \*(R" will give a right double quote. \*(C+ will
.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
.\" nothing in troff, for use with C<>.
.tr \(*W-
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
.ie n \{\
. ds -- \(*W-
. ds PI pi
. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
. ds L" ""
. ds R" ""
. ds C` ""
. ds C' ""
'br\}
.el\{\
. ds -- \|\(em\|
. ds PI \(*p
. ds L" ``
. ds R" ''
. ds C`
. ds C'
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.\"
.\" If the F register is >0, we'll generate index entries on stderr for
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
.\" entries marked with X<> in POD. Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
.\"
.\" Avoid warning from groff about undefined register 'F'.
.de IX
..
.if !\nF .nr F 0
.if \nF>0 \{\
. de IX
. tm Index:\\$1\t\\n%\t"\\$2"
..
. if !\nF==2 \{\
. nr % 0
. nr F 2
. \}
.\}
.\"
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
.\" Fear. Run. Save yourself. No user-serviceable parts.
. \" fudge factors for nroff and troff
.if n \{\
. ds #H 0
. ds #V .8m
. ds #F .3m
. ds #[ \f1
. ds #] \fP
.\}
.if t \{\
. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
. ds #V .6m
. ds #F 0
. ds #[ \&
. ds #] \&
.\}
. \" simple accents for nroff and troff
.if n \{\
. ds ' \&
. ds ` \&
. ds ^ \&
. ds , \&
. ds ~ ~
. ds /
.\}
.if t \{\
. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
.\}
. \" troff and (daisy-wheel) nroff accents
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
.ds ae a\h'-(\w'a'u*4/10)'e
.ds Ae A\h'-(\w'A'u*4/10)'E
. \" corrections for vroff
.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
. \" for low resolution devices (crt and lpr)
.if \n(.H>23 .if \n(.V>19 \
\{\
. ds : e
. ds 8 ss
. ds o a
. ds d- d\h'-1'\(ga
. ds D- D\h'-1'\(hy
. ds th \o'bp'
. ds Th \o'LP'
. ds ae ae
. ds Ae AE
.\}
.rm #[ #] #H #V #F C
.\" ========================================================================
.\"
.IX Title "GCCGO 1"
.TH GCCGO 1 "2025-07-11" "gcc-12.5.0" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.nh
.SH "NAME"
gccgo \- A GCC\-based compiler for the Go language
.SH "SYNOPSIS"
.IX Header "SYNOPSIS"
gccgo [\fB\-c\fR|\fB\-S\fR]
[\fB\-g\fR] [\fB\-pg\fR] [\fB\-O\fR\fIlevel\fR]
[\fB\-I\fR\fIdir\fR...] [\fB\-L\fR\fIdir\fR...]
[\fB\-o\fR \fIoutfile\fR] \fIinfile\fR...
.PP
Only the most useful options are listed here; see below for the
remainder.
.SH "DESCRIPTION"
.IX Header "DESCRIPTION"
The \fBgccgo\fR command is a frontend to \fBgcc\fR and
supports many of the same options. This manual
only documents the options specific to \fBgccgo\fR.
.PP
The \fBgccgo\fR command may be used to compile Go source code into
an object file, link a collection of object files together, or do both
in sequence.
.PP
Go source code is compiled as packages. A package consists of one or
more Go source files. All the files in a single package must be
compiled together, by passing all the files as arguments to
\&\fBgccgo\fR. A single invocation of \fBgccgo\fR may only
compile a single package.
.PP
One Go package may \f(CW\*(C`import\*(C'\fR a different Go package. The imported
package must have already been compiled; \fBgccgo\fR will read
the import data directly from the compiled package. When this package
is later linked, the compiled form of the package must be included in
the link command.
.PP
Go programs must generally be compiled with debugging information, and
\&\fB\-g1\fR is the default as described below. Stripping a Go
program will generally cause it to misbehave or fail.
.SH "OPTIONS"
.IX Header "OPTIONS"
.IP "\fB\-I\fR\fIdir\fR" 4
.IX Item "-Idir"
Specify a directory to use when searching for an import package at
compile time.
.IP "\fB\-L\fR\fIdir\fR" 4
.IX Item "-Ldir"
When linking, specify a library search directory, as with
\&\fBgcc\fR.
.IP "\fB\-fgo\-pkgpath=\fR\fIstring\fR" 4
.IX Item "-fgo-pkgpath=string"
Set the package path to use. This sets the value returned by the
PkgPath method of reflect.Type objects. It is also used for the names
of globally visible symbols. The argument to this option should
normally be the string that will be used to import this package after
it has been installed; in other words, a pathname within the
directories specified by the \fB\-I\fR option.
.IP "\fB\-fgo\-prefix=\fR\fIstring\fR" 4
.IX Item "-fgo-prefix=string"
An alternative to \fB\-fgo\-pkgpath\fR. The argument will be
combined with the package name from the source file to produce the
package path. If \fB\-fgo\-pkgpath\fR is used, \fB\-fgo\-prefix\fR
will be ignored.
.Sp
Go permits a single program to include more than one package with the
same name in the \f(CW\*(C`package\*(C'\fR clause in the source file, though
obviously the two packages must be imported using different pathnames.
In order for this to work with \fBgccgo\fR, either
\&\fB\-fgo\-pkgpath\fR or \fB\-fgo\-prefix\fR must be specified when
compiling a package.
.Sp
Using either \fB\-fgo\-pkgpath\fR or \fB\-fgo\-prefix\fR disables
the special treatment of the \f(CW\*(C`main\*(C'\fR package and permits that
package to be imported like any other.
.IP "\fB\-fgo\-relative\-import\-path=\fR\fIdir\fR" 4
.IX Item "-fgo-relative-import-path=dir"
A relative import is an import that starts with \fI./\fR or
\&\fI../\fR. If this option is used, \fBgccgo\fR will use
\&\fIdir\fR as a prefix for the relative import when searching for it.
.IP "\fB\-frequire\-return\-statement\fR" 4
.IX Item "-frequire-return-statement"
.PD 0
.IP "\fB\-fno\-require\-return\-statement\fR" 4
.IX Item "-fno-require-return-statement"
.PD
By default \fBgccgo\fR will warn about functions which have one or
more return parameters but lack an explicit \f(CW\*(C`return\*(C'\fR statement.
This warning may be disabled using
\&\fB\-fno\-require\-return\-statement\fR.
.IP "\fB\-fgo\-check\-divide\-zero\fR" 4
.IX Item "-fgo-check-divide-zero"
Add explicit checks for division by zero. In Go a division (or
modulos) by zero causes a panic. On Unix systems this is detected in
the runtime by catching the \f(CW\*(C`SIGFPE\*(C'\fR signal. Some processors,
such as PowerPC, do not generate a \s-1SIGFPE\s0 on division by zero. Some
runtimes do not generate a signal that can be caught. On those
systems, this option may be used. Or the checks may be removed via
\&\fB\-fno\-go\-check\-divide\-zero\fR. This option is currently on by
default, but in the future may be off by default on systems that do
not require it.
.IP "\fB\-fgo\-check\-divide\-overflow\fR" 4
.IX Item "-fgo-check-divide-overflow"
Add explicit checks for division overflow. For example, division
overflow occurs when computing \f(CW\*(C`INT_MIN / \-1\*(C'\fR. In Go this should
be wrapped, to produce \f(CW\*(C`INT_MIN\*(C'\fR. Some processors, such as x86,
generate a trap on division overflow. On those systems, this option
may be used. Or the checks may be removed via
\&\fB\-fno\-go\-check\-divide\-overflow\fR. This option is currently on
by default, but in the future may be off by default on systems that do
not require it.
.IP "\fB\-fno\-go\-optimize\-allocs\fR" 4
.IX Item "-fno-go-optimize-allocs"
Disable escape analysis, which tries to allocate objects on the stack
rather than the heap.
.IP "\fB\-fgo\-debug\-escape\fR\fIn\fR" 4
.IX Item "-fgo-debug-escapen"
Output escape analysis debugging information. Larger values of
\&\fIn\fR generate more information.
.IP "\fB\-fgo\-debug\-escape\-hash=\fR\fIn\fR" 4
.IX Item "-fgo-debug-escape-hash=n"
A hash value to debug escape analysis. \fIn\fR is a binary string.
This runs escape analysis only on functions whose names hash to values
that match the given suffix \fIn\fR. This can be used to binary
search across functions to uncover escape analysis bugs.
.IP "\fB\-fgo\-debug\-optimization\fR" 4
.IX Item "-fgo-debug-optimization"
Output optimization diagnostics.
.IP "\fB\-fgo\-c\-header=\fR\fIfile\fR" 4
.IX Item "-fgo-c-header=file"
Write top-level named Go struct definitions to \fIfile\fR as C code.
This is used when compiling the runtime package.
.IP "\fB\-fgo\-compiling\-runtime\fR" 4
.IX Item "-fgo-compiling-runtime"
Apply special rules for compiling the runtime package. Implicit
memory allocation is forbidden. Some additional compiler directives
are supported.
.IP "\fB\-fgo\-embedcfg=\fR\fIfile\fR" 4
.IX Item "-fgo-embedcfg=file"
Identify a \s-1JSON\s0 file used to map patterns used with special
\&\f(CW\*(C`//go:embed\*(C'\fR comments to the files named by the patterns. The
\&\s-1JSON\s0 file should have two components: \f(CW\*(C`Patterns\*(C'\fR maps each
pattern to a list of file names, and \f(CW\*(C`Files\*(C'\fR maps each file name
to a full path to the file. This option is intended for use by the
\&\fBgo\fR command to implement \f(CW\*(C`//go:embed\*(C'\fR.
.IP "\fB\-g\fR" 4
.IX Item "-g"
This is the standard \fBgcc\fR option. It
is mentioned here because by default \fBgccgo\fR turns on
debugging information generation with the equivalent of the standard
option \fB\-g1\fR. This is because Go programs require debugging
information to be available in order to get backtrace information. An
explicit \fB\-g0\fR may be used to disable the generation of
debugging information, in which case certain standard library
functions, such as \f(CW\*(C`runtime.Callers\*(C'\fR, will not operate correctly.
.SH "SEE ALSO"
.IX Header "SEE ALSO"
\&\fIgpl\fR\|(7), \fIgfdl\fR\|(7), \fIfsf\-funding\fR\|(7), \fIgcc\fR\|(1)
and the Info entries for \fIgccgo\fR and \fIgcc\fR.
.SH "COPYRIGHT"
.IX Header "COPYRIGHT"
Copyright (c) 2010\-2022 Free Software Foundation, Inc.
.PP
Permission is granted to copy, distribute and/or modify this document
under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no
Invariant Sections, the Front-Cover Texts being (a) (see below), and
with the Back-Cover Texts being (b) (see below).
A copy of the license is included in the
man page \fIgfdl\fR\|(7).
.PP
(a) The \s-1FSF\s0's Front-Cover Text is:
.PP
.Vb 1
\& A GNU Manual
.Ve
.PP
(b) The \s-1FSF\s0's Back-Cover Text is:
.PP
.Vb 3
\& You have freedom to copy and modify this GNU Manual, like GNU
\& software. Copies published by the Free Software Foundation raise
\& funds for GNU development.
.Ve
|