1 /* Copyright (C) 2021 Free Software Foundation, Inc.
4 This file is part of GNU Binutils.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
24 #include <sys/types.h>
28 * This file describes format for the compiler-commentary
29 * section to be added to .o's and propagated to the a.out. It reflects
30 * information the compiler can expose to the user about his or her
31 * program. The section should be generated for all compiles where
32 * the user has specified -g on the compile line.
34 * In the analyzer, display of the messages will be governed by a user UI
35 * that sets a vis_bits bitmap, and matches it against a show_bits
36 * bitmap table, which is maintained separately from the producer
37 * code. For any message, if (vis_bits&show_bits) is non-zero, the
38 * message is shown. If zero, the message is not shown. A similar
39 * mechanism would be used for a stand-alone source or disassembly browser.
42 * The .compcom Section
43 * --------------------
44 * The section will be named ".compcom"; it is generated for each
45 * .o, and aggregated into a single section in the a.out. In that
46 * section, each .o's data is separate, and the tools will loop
47 * over the data for each .o in order to find the subsection for
48 * the particular .o being annotated.
51 * Since the header is fixed-length, and the total size of the section
52 * can be easily determined as:
54 * sizeof(stuct compcomhdr)
55 * + msgcount * sizeof(struct compmsg)
56 * + paramcount * sizeof(int32_t)
59 * there is no need to have the size in the header.
63 { /* Header describing the section */
64 int32_t srcname
; /* index into strings of source file path */
65 int32_t version
; /* a version number for the .compcom format */
66 int32_t msgcount
; /* count of messages in the section */
67 int32_t paramcount
; /* count of parameters in the section */
68 int32_t stringcount
; /* count of strings in the section */
69 int32_t stringlen
; /* count of total bytes in strings */
73 * The data for the .o after the header as:
75 * compmsg msgs[msgcount]; the array of messages
76 * int32_t param[paramcount]; the parameters used in the messages
77 * parameters are either integers or
79 * char msgstrings[stringlen]; the strings used in the messages
83 * Message Classes and Visualization Bits
84 * --------------------------------------
85 * Each of the messages above may belong to zero or more visualization
86 * classes, governed by a table using zero or more of the following symbolic
87 * names for the classes:
90 CCMV_WANT
= 0x000, /* High-priority RFE -- used only for human */
91 /* reading of message list */
92 CCMV_UNIMPL
= 0x000, /* Unimplemented -- used only for human */
93 /* reading of message list */
94 CCMV_OBS
= 0x000, /* Obsolete -- to be replaced by a different */
95 /* message with different parameters -- */
96 /* used only for human reading of message */
98 CCMV_VER
= 0x001, /* Versioning messages */
99 CCMV_WARN
= 0x002, /* Warning messages */
100 CCMV_PAR
= 0x004, /* Parallelization messages */
101 CCMV_QUERY
= 0x008, /* Compiler queries */
102 CCMV_LOOP
= 0x010, /* Loop detail messages */
103 CCMV_PIPE
= 0x020, /* Pipelining messages */
104 CCMV_INLINE
= 0x040, /* Inlining information */
105 CCMV_MEMOPS
= 0x080, /* Messages concerning memory operations */
106 CCMV_FE
= 0x100, /* Front-end messages (all compilers) */
107 CCMV_CG
= 0x200, /* Code-generator messages (all compilers) */
108 CCMV_BASIC
= 0x400, /* for default messages */
109 CCMV_ALL
= 0x7FFFFFFF /* for all messages */
112 typedef enum ccm_msgid
114 /* Group: Versioning Messages */
115 /* All of these are global to the .o, and will */
116 /* have lineno = pcoffset = 0 */
118 CCM_MODDATE
=0x00100, /* Source file <s1>, last modified on date <s2> */
119 CCM_COMPVER
, /* Component <s1>, version <s2> */
120 /* [Emitted for each component of the compiler.] */
121 CCM_COMPDATE
, /* Compilation date <s1> */
122 /* [<s1> is an I18n string with the date and time] */
123 CCM_COMPOPT
, /* Compilation options <s1> */
124 /* [As specified by the user] */
125 CCM_ACOMPOPT
, /* Actual Compilation options <s1> */
126 /* [As expanded by the driver] */
128 /* Group: Warning Messages */
129 CCM_VAR_ALIAS
=0x00200, /* Variable <v1> aliased to <v2> */
130 CCM_FBIRDIFF
, /* Profile feedback data inconsistent with */
131 /* intermediate representation file; check compiler */
132 /* version, flags and source file */
133 CCM_OPTRED_SWAP
, /* Optimization level for <p1> reduced from <i2> to */
134 /* <i3> due to insufficient swap space */
135 CCM_OPTRED_CPLX
, /* Optimization level for <p1> reduced from <i2> to */
136 /* <i3> due to program complexity */
137 CCM_UNKNOWN
, /* Unexpected compiler comment <i1> */
139 /* Group: Parallelization Messages */
140 CCM_UNPAR_CALL
=0x00400, /* Loop below not parallelized because it contains a */
143 /* CCMV_WANT: Don't generate CCM_PAR_SER; always use CCM_PAR_SER_VER */
144 CCM_PAR_SER
, /* Both serial and parallel versions generated for */
146 CCM_PAR_SER_VER
, /* Both serial and parallel versions generated for */
147 /* loop below; with parallel version used if <s1>, */
148 /* serial otherwise */
149 CCM_PAR_DRECTV
, /* Loop below parallelized by explicit user */
151 CCM_APAR
, /* Loop below autoparallelized */
152 CCM_AUTOPAR
, /* Loop below autoparallelized; equivalent */
153 /* explict directive is <s1> */
154 CCM_UNPAR_DD
, /* Loop below could not be parallelized because of a */
155 /* data dependency on <v1>, <v2>, ... */
156 /* [The number of parameters will determine how many */
157 /* names appear, and the formatter will get the */
159 CCM_UNPAR_DDA
, /* Loop below could not be parallelized because of a */
160 /* data dependency or aliasing of <v1>, <v2>, ... */
161 CCM_UNPAR_ANONDD
, /* Loop below could not be parallelized because of */
162 /* an anonymous data dependency */
163 CCM_UNPAR_ANONDDA
, /* Loop below could not be parallelized because of */
164 /* an anonymous data dependency or aliasing */
165 CCM_PAR_WORK
, /* Loop below parallelized, but might not contain */
166 /* enough work to be efficiently run in parallel */
167 CCM_UNPAR_EXIT
, /* Loop below not parallelized because it contains */
168 /* multiple exit points */
169 CCM_UNPAR_STRNG
, /* Loop below not parallelized because it contains a */
170 /* strange flow of control */
171 CCM_UNPAR_IO
, /* Loop below not parallelized because it contains */
172 /* I/O or other MT-unsafe calls */
173 CCM_PAR_BODY_NAME
, /* Parallel loop-body code is in function <p1> */
174 CCM_UNPAR_NLOOPIDX
, /* Loop below not parallelized because loop index */
176 CCM_UNPAR_DRECTV
, /* Loop below not parallelized because of explicit */
178 CCM_UNPAR_NOTPROFIT
, /* Loop below not parallelized because it was not */
179 /* profitable to do so */
180 CCM_UNPAR_NEST
, /* Loop below not parallelized because it was */
181 /* nested in a parallel loop */
182 CCM_UNPAR
, /* Loop below not parallelized */
183 CCM_UNPAR_NOAUTO
, /* Loop below not parallelized because */
184 /* autoparallelization is not enabled */
185 CCM_PR_L_VAR
, /* Private variables in loop below: */
186 /* <v1>, <v2>, ... */
187 /* [The number of parameters will determine how many */
188 /* names appear, and the formatter will get the */
190 CCM_SH_L_VAR
, /* Shared variables in loop below: */
191 /* <v1>, <v2>, ... */
192 CCM_TP_L_VAR
, /* Threadprivate variables in loop below: */
193 /* <v1>, <v2>, ... */
194 CCM_RV_L_VAR
, /* Reduction variables in loop below: */
195 /* <v1>, <v2>, ... */
196 CCM_IM_L_VAR
, /* Implicit variables in loop below: */
197 /* <v1>, <v2>, ... */
198 CCM_PR_O_VAR
, /* Private variables in OpenMP construct below: */
199 /* <v1>, <v2>, ... */
200 CCM_SH_O_VAR
, /* Shared variables in OpenMP construct below: */
201 /* <v1>, <v2>, ... */
202 CCM_TP_O_VAR
, /* Threadprivate variables in OpenMP construct */
203 /* below: <v1>, <v2>, ... */
204 CCM_RV_O_VAR
, /* Reduction variables in OpenMP construct below: */
205 /* <v1>, <v2>, ... */
206 CCM_IM_O_VAR
, /* Implicit variables in OpenMP construct below: */
207 /* <v1>, <v2>, ... */
208 CCM_UNPAR_IN_OMP
, /* Loop below not parallelized because it is inside */
209 /* an OpenMP region */
210 CCM_FP_O_VAR
, /* Firstprivate variables in OpenMP construct below: */
211 /* <v1>, <v2>, ... */
212 CCM_LP_O_VAR
, /* Lastprivate variables in OpenMP construct below: */
213 /* <v1>, <v2>, ... */
214 CCM_CP_O_VAR
, /* Copyprivate variables in OpenMP construct below: */
215 /* <v1>, <v2>, ... */
216 CCM_PR_OAS_VAR
, /* Variables autoscoped as PRIVATE in OpenMP */
217 /* construct below: <v1>, <v2>, ... */
218 CCM_SH_OAS_VAR
, /* Variables autoscoped as SHARED in OpenMP */
219 /* construct below: <v1>, <v2>, ... */
220 CCM_FP_OAS_VAR
, /* Variables autoscoped as FIRSTPRIVATE in OpenMP */
221 /* construct below: <v1>, <v2>, ... */
222 CCM_LP_OAS_VAR
, /* Variables autoscoped as LASTPRIVATE in OpenMP */
223 /* construct below: <v1>, <v2>, ... */
224 CCM_RV_OAS_VAR
, /* Variables autoscoped as REDUCTION in OpenMP */
225 /* construct below: <v1>, <v2>, ... */
226 CCM_FAIL_OAS_VAR
, /* Variables cannot be autoscoped in OpenMP */
227 /* construct below: <v1>, <v2>, ... */
228 CCM_SERIALIZE_OAS
, /* OpenMP parallel region below is serialized */
229 /* because autoscoping has failed */
230 CCM_UNPAR_CALL_2
, /* <l1> not parallelized because it contains calls */
231 /* to: <p2>, <p3>, ... */
232 CCM_PAR_DRECTV_2
, /* <l1> parallelized by explicit user directive */
233 CCM_APAR_2
, /* <l1> autoparallelized */
234 CCM_AUTOPAR_2
, /* <l1> autoparallelized; equivalent */
235 /* explict directive is <s2> */
236 CCM_UNPAR_DD_2
, /* <l1> could not be parallelized because of */
237 /* data dependences on: <v2>, <v3>, ... */
238 /* [The number of parameters will determine how many */
239 /* names appear, and the formatter will get the */
241 CCM_UNPAR_DDA_2
, /* <l1> could not be parallelized because of a */
242 /* data dependence or aliasing of: <v2>, <v3>, ... */
243 CCM_UNPAR_ANONDD_2
, /* <l1> could not be parallelized because of an */
244 /* anonymous data dependence */
245 CCM_UNPAR_ANONDDA_2
, /* <l1> could not be parallelized because of an */
246 /* anonymous data dependence or aliasing */
247 CCM_PAR_WORK_2
, /* <l1> parallelized, but might not contain */
248 /* enough work to run efficiently in parallel */
249 CCM_UNPAR_EXIT_2
, /* <l1> not parallelized because it contains */
250 /* multiple exit points */
251 CCM_UNPAR_STRANGE_2
, /* <l1> not parallelized because it contains a */
252 /* strange flow of control */
253 CCM_UNPAR_IO_2
, /* <l1> not parallelized because it contains */
254 /* I/O or other MT-unsafe calls */
255 CCM_PAR_BODY_NAME_2
, /* <l1> parallel loop-body code placed in */
256 /* function <p2> along with <i3> inner loops */
257 CCM_UNPAR_NLOOPIDX_2
, /* <l1> not parallelized because loop index not */
259 CCM_UNPAR_DRECTV_2
, /* <l1> not parallelized because of explicit */
261 CCM_UNPAR_NOTPROFIT_2
, /* <l1> not parallelized because it was not */
262 /* profitable to do so */
263 CCM_UNPAR_NEST_2
, /* <l1> not parallelized because it was */
264 /* nested within a parallel loop */
265 CCM_UNPAR_2
, /* <l1> not parallelized */
266 CCM_UNPAR_NOAUTO_2
, /* <l1> not parallelized because */
267 /* autoparallelization is not enabled */
268 CCM_PR_L_VAR_2
, /* Private variables in <l1>: */
269 /* <v2>, <v3>, ... */
270 /* [The number of parameters will determine how many */
271 /* names appear, and the formatter will get the */
273 CCM_SH_L_VAR_2
, /* Shared variables in <l1>: */
274 /* <v2>, <v3>, ... */
275 CCM_TP_L_VAR_2
, /* Threadprivate variables in <l1>: */
276 /* <v2>, <v3>, ... */
277 CCM_RV_L_VAR_2
, /* Reduction variables of operator <s1> in <l2>: */
278 /* <v3>, <v4>, ... */
279 CCM_IM_L_VAR_2
, /* Implicit variables in <l1>: */
280 /* <v2>, <v3>, ... */
281 CCM_PR_O_VAR_2
, /* Private variables in <r1>: */
282 /* <v2>, <v3>, ... */
283 CCM_SH_O_VAR_2
, /* Shared variables in <r1>: */
284 /* <v2>, <v3>, ... */
285 CCM_TP_O_VAR_2
, /* Threadprivate variables in <r1>: */
286 /* <v2>, <v3>, ... */
287 CCM_RV_O_VAR_2
, /* Reduction variables of operator <s1> in <r2>: */
288 /* <v3>, <v4>, ... */
289 CCM_IM_O_VAR_2
, /* Implicit variables in <r1>: */
290 /* <v2>, <v3>, ... */
291 CCM_UNPAR_IN_OMP_2
, /* <l1> not parallelized because it is inside */
292 /* OpenMP region <r2> */
293 CCM_FP_O_VAR_2
, /* Firstprivate variables in <r1>: */
294 /* <v2>, <v3>, ... */
295 CCM_LP_O_VAR_2
, /* Lastprivate variables in <r1>: */
296 /* <v2>, <v3>, ... */
297 CCM_CP_O_VAR_2
, /* Copyprivate variables in <r1>: */
298 /* <v2>, <v3>, ... */
299 CCM_PR_OAS_VAR_2
, /* Variables autoscoped as PRIVATE in <r1>: */
300 /* <v2>, <v3>, ... */
301 CCM_SH_OAS_VAR_2
, /* Variables autoscoped as SHARED in <r1>: */
302 /* <v2>, <v3>, ... */
303 CCM_FP_OAS_VAR_2
, /* Variables autoscoped as FIRSTPRIVATE in <r1>: */
304 /* <v2>, <v3>, ... */
305 CCM_LP_OAS_VAR_2
, /* Variables autoscoped as LASTPRIVATE in <r1>: */
306 /* <v2>, <v3>, ... */
307 CCM_RV_OAS_VAR_2
, /* Variables autoscoped as REDUCTION of operator */
308 /* <s1> in <r2>: <v3>, <v4>, ... */
309 CCM_FAIL_OAS_VAR_2
, /* Variables treated as shared because they cannot */
310 /* be autoscoped in <r1>: <v2>, <v3>, ... */
311 CCM_SERIALIZE_OAS_2
, /* <r1> will be executed by a single thread because */
312 /* autoscoping for some variables was not successful */
314 /* Group: Parallelization Questions asked of the user */
315 /* How will the user answer these questions? */
316 CCM_QPERMVEC
=0x00800, /* Is <v1> a permutation vector during execution of */
318 CCM_QEXPR
, /* Is expression <s1> true for <l2>? */
319 CCM_QSAFECALL
, /* Is subroutine <p1> MP-safe as used in <l2>? */
321 /* Group: Loop Optimization Messages */
322 CCM_LCOST
=0x01000, /* Loop below estimated to cost <i1> cycles per */
324 CCM_UNROLL
, /* Loop below unrolled <i1> times */
325 /* CCMV_WANT: the next one should be replaced by CCM_IMIX2 */
326 CCM_IMIX
, /* Loop below has <i1> loads, <i2> stores, */
327 /* <i3> prefetches, <i4> FPadds, <i5> FPmuls, and */
328 /* <i6> FPdivs per iteration */
329 CCM_SPILLS
, /* Loop below required <i1> integer register spills, */
330 /* <i2> FP register spills, and used */
331 /* <i3> integer registers and <i4> FP registers */
332 CCM_LFISSION
, /* Loop below fissioned into <i1> loops */
333 CCM_LPEEL
, /* Loop below had iterations peeled off for better */
334 /* unrolling and/or parallelization */
335 CCM_LBLOCKED
, /* Loop below blocked by <i1> for improved cache */
337 CCM_LTILED
, /* Loop below tiled for better performance */
338 CCM_LUNRJAM
, /* Loop below unrolled and jammed */
339 CCM_LWHILE2DO
, /* Bounds test for loop below moved to top of loop */
340 CCM_L2CALL
, /* Loop below replaced by a call to <p1> */
341 CCM_LDEAD
, /* Loop below deleted as dead code */
342 CCM_LINTRCHNG
, /* Loop below interchanged with loop on line <i1> */
343 CCM_FUSEDTO
, /* Loop below fused with loop on line <i1> */
344 CCM_FUSEDFROM
, /* Loop from line <i1> fused with loop below */
345 CCM_VECINTRNSC
, /* Loop below transformed to use calls to vector */
346 /* intrinsic <p1>, <p2>, ... */
347 /* [The number of parameters will determine how many */
348 /* names appear, and the formatter will get the */
350 CCM_LSTRIPMINE
, /* Loop below strip-mined */
351 CCM_LNEST2LOOPS
, /* Loop below collapsed with loop on line <i1> */
352 CCM_LREVERSE
, /* Loop below has had its iteration direction */
354 CCM_IMIX2
, /* Loop below has <i1> loads, <i2> stores, */
355 /* <i3> prefetches, <i4> FPadds, <i5> FPmuls, */
356 /* <i6> FPdivs, <i7> FPsubs, and <i8> FPsqrts per */
358 CCM_LUNRFULL
, /* Loop below fully unrolled */
359 CCM_ELIM_NOAMORTINST
, /* Loop below was eliminated as it contains no */
360 /* non-amortizable instructions */
361 CCM_COMP_DALIGN
, /* Performance of loop below could be improved */
362 /* by compiling with -dalign */
363 CCM_INTIMIX
, /* Loop below has <i1> int-loads, <i2> int-stores, */
364 /* <i3> alu-ops, <i4> muls, <i5> int-divs and */
365 /* <i6> shifts per iteration */
366 CCM_LMULTI_VERSION
, /* <l1> multi-versioned. Specialized version */
368 CCM_LCOST_2
, /* <l1> estimated to cost <i2> cycles per iteration */
369 CCM_UNROLL_2
, /* <l1> unrolled <i2> times */
371 /* CCMV_WANT: the next one should be replaced by CCM_IMIX2_B or CCM_IMIX3_B */
372 CCM_IMIX_B
, /* <l1> has <i2> loads, <i3> stores, */
373 /* <i4> prefetches, <i5> FPadds, <i6> FPmuls, and */
374 /* <i7> FPdivs per iteration */
375 CCM_SPILLS_2
, /* <l1> required <i2> integer register spills, */
376 /* <i3> FP register spills, and used */
377 /* <i4> integer registers and <i5> FP registers */
378 CCM_LFISSION_2
, /* <l1> fissioned into <i2> loops, generating: */
379 /* <l3>, <l4>, ... */
380 /* [The number of parameters will determine how many */
381 /* names appear, and the formatter will get the */
383 CCM_LFISSION_FRAG
, /* <l1> contains code from lines: <i2>, <i3>, ... */
384 CCM_LPEEL_2
, /* <l1> had iterations peeled off for better */
385 /* unrolling and/or parallelization */
386 CCM_LBLOCKED_2
, /* <l1> blocked by <i2> for improved memory */
387 /* hierarchy performance, new inner loop <l3> */
388 CCM_LOUTER_UNROLL
, /* <l1> is outer-unrolled <i2> times as part */
389 /* of unroll and jam */
390 CCM_LJAMMED
, /* All <i1> copies of <l2> are fused together */
391 /* as part of unroll and jam */
392 CCM_LWHILE2DO_2
, /* Bounds test for <l1> moved to top of loop */
393 CCM_L2CALL_2
, /* <l1> replaced by a call to <p2> */
394 CCM_LDEAD_2
, /* <l1> deleted as dead code */
395 CCM_LINTRCHNG_2
, /* <l1> interchanged with <l2> */
396 CCM_LINTRCHNG_ORDER
, /* For loop nest below, the final order of loops */
397 /* after interchanging and subsequent */
398 /* transformations is: <l1>, <l2>, ... */
399 /* [The number of parameters will determine how many */
400 /* names appear, and the formatter will get the */
402 CCM_FUSED_2
, /* <l1> fused with <l2>, new loop <l3> */
403 CCM_VECINTRNSC_2
, /* <l1> transformed to use calls to vector */
404 /* intrinsics: <p2>, <p3>, ... */
405 CCM_LSTRIPMINE_2
, /* <l1> strip-mined by <i2>, new inner loop <l3> */
406 CCM_LNEST2LOOPS_2
, /* <l1> collapsed with <l2>, new loop <l3> */
407 CCM_LREVERSE_2
, /* <l1> has had its iteration direction reversed */
408 CCM_IMIX2_B
, /* <l1> has <i2> loads, <i3> stores, */
409 /* <i4> prefetches, <i5> FPadds, <i6> FPmuls, */
410 /* <i7> FPdivs, <i8> FPsubs, and <i9> FPsqrts per */
412 CCM_LUNRFULL_2
, /* <l1> fully unrolled */
413 CCM_ELIM_NOAMORTINST_2
, /* <l1> was eliminated as it contains no */
414 /* non-amortizable instructions */
415 CCM_COMP_DALIGN_2
, /* Performance of <l1> could be improved by */
416 /* compiling with -dalign */
417 CCM_INTIMIX_2
, /* <l1> has <i2> int-loads, <i3> int-stores, */
418 /* <i4> alu-ops, <i5> muls, <i6> int-divs and */
419 /* <i7> shifts per iteration */
420 CCM_OMP_REGION
, /* Source OpenMP region below has tag <r1> */
421 CCM_LMICROVECTORIZE
, /* <l1> is micro-vectorized */
422 CCM_LMULTI_VERSION_2
, /* <l1> multi-versioned for <s2>. */
423 /* Specialized version is <l3> */
424 CCM_LCLONED
, /* <l1> cloned for <s2>. Clone is <l3> */
425 CCM_LUNSWITCHED
, /* <l1> is unswitched. New loops */
426 /* are <l2> and <l3> */
427 CCM_LRESWITCHED
, /* Loops <l1> and <l2> and their surrounding */
428 /* conditional code have been merged to */
430 CCM_LSKEWBLOCKED
, /* <l1> skew-blocked by <i2> with slope */
431 /* <i3> for improved memory hierarchy */
432 /* performance, new inner loop <l4> */
433 CCM_IVSUB
, /* Induction variable substitution performed on <l1> */
434 CCM_ONEITER_REPLACED
, /* <l1> determined to have a trip count of 1; */
435 /* converted to straight-line code */
436 CCM_IMIX3_B
, /* <l1> has <i2> loads, <i3> stores, */
437 /* <i4> prefetches, <i5> FPadds, <i6> FPmuls, */
438 /* <i7> FPmuladds, <i8> FPdivs, and <i9> FPsqrts per */
441 /* Group: Pipelining Messages */
442 CCM_PIPELINE
=0x02000, /* Loop below pipelined */
443 CCM_PIPESTATS
, /* Loop below scheduled with steady-state cycle */
445 CCM_NOPIPE_CALL
, /* Loop could not be pipelined because it contains */
447 CCM_NOPIPE_INTCC
, /* Loop could not be pipelined because it sets */
448 /* multiple integer condition codes. */
449 CCM_NOPIPE_MBAR
, /* Loop could not be pipelined because it contains a */
450 /* memory barrier instruction */
451 CCM_NOPIPE_MNMX
, /* Loop could not be pipelined because it contains */
452 /* a minimum or a maximum operation */
453 CCM_NOPIPE_U2FLT
, /* Loop could not be pipelined because it contains */
454 /* an unsigned to float conversion */
455 CCM_NOPIPE_GOT
, /* Loop could not be pipelined because it sets the */
456 /* Global Offset Table pointer */
457 CCM_NOPIPE_IDIV
, /* Loop could not be pipelined because it contains */
458 /* an integer divide */
459 CCM_NOPIPE_PRFTCH
, /* Loop could not be pipelined because it contains */
460 /* a prefetch operation */
461 CCM_NOPIPE_EXIT
, /* Loop could not be pipelined because it contains */
462 /* an exit operation */
463 CCM_NOPIPE_REG
, /* Loop could not be pipelined because it contains */
464 /* instructions that set the %gsr or %fsr register */
465 CCM_NOPIPE_UNS
, /* Loop could not be pipelined because it has an */
466 /* unsigned loop counter */
467 CCM_NOPIPE_UNSUIT
, /* Loop was unsuitable for pipelining */
468 CCM_NOPIPE_INTRINSIC
, /* Loop could not be pipelined because it has an */
469 /* intrinsic call to <p1> */
470 CCM_NOPIPE_BIG
, /* Loop could not be pipelined as it is too big */
471 CCM_NOPIPE_INVINTPR
, /* Loop could not be pipelined as it contains too */
472 /* many loop invariant integers = <i1> */
473 CCM_NOPIPE_INVFLTPR
, /* Loop could not be pipelined as it contains too */
474 /* many loop invariant floats = <i1> */
475 CCM_NOPIPE_INVDBLPR
, /* Loop could not be pipelined as it contains too */
476 /* many loop invariant doubles = <i1> */
477 CCM_PIPE_SCHEDAFIPR
, /* Loop below was adversely affected by high */
478 /* integer register pressure = <i1> */
479 CCM_PIPE_SCHEDAFDPR
, /* Loop below was adversely affected by high */
480 /* double register pressure = <i1> */
481 CCM_PIPE_SCHEDAFFPR
, /* Loop below was adversely affected by high */
482 /* float register pressure = <i1> */
483 CCM_NOPIPE_INTPR
, /* Loop could not be pipelined due to high */
484 /* integer register pressure = <i1> */
485 CCM_NOPIPE_DBLPR
, /* Loop could not be pipelined due to high */
486 /* double register pressure = <i1> */
487 CCM_NOPIPE_FLTPR
, /* Loop could not be pipelined due to high */
488 /* float register pressure = <i1> */
489 CCM_PIPELINE_2
, /* <l1> pipelined */
490 CCM_PIPESTATS_2
, /* <l1> scheduled with steady-state cycle */
492 CCM_NOPIPE_CALL_2
, /* <l1> could not be pipelined because it contains */
494 CCM_NOPIPE_INTCC_2
, /* <l1> could not be pipelined because it sets */
495 /* multiple integer condition codes. */
496 CCM_NOPIPE_MBAR_2
, /* <l1> could not be pipelined because it contains */
497 /* a memory barrier instruction */
498 CCM_NOPIPE_MNMX_2
, /* <l1> could not be pipelined because it contains */
499 /* a minimum or a maximum operation */
500 CCM_NOPIPE_U2FLT_2
, /* <l1> could not be pipelined because it contains */
501 /* an unsigned to float conversion */
502 CCM_NOPIPE_GOT_2
, /* <l1> could not be pipelined because it sets the */
503 /* Global Offset Table pointer */
504 CCM_NOPIPE_IDIV_2
, /* <l1> could not be pipelined because it contains */
505 /* an integer divide */
506 CCM_NOPIPE_PRFTCH_2
, /* <l1> could not be pipelined because it contains */
507 /* a prefetch operation */
508 CCM_NOPIPE_EXIT_2
, /* <l1> could not be pipelined because it contains */
509 /* an exit operation */
510 CCM_NOPIPE_REG_2
, /* <l1> could not be pipelined because it contains */
511 /* instructions that set the %gsr or %fsr register */
512 CCM_NOPIPE_UNS_2
, /* <l1> could not be pipelined because it has an */
513 /* unsigned loop counter */
514 CCM_NOPIPE_UNSUIT_2
, /* <l1> is unsuitable for pipelining */
515 CCM_NOPIPE_INTRINSIC_2
, /* <l1> could not be pipelined because it contains */
516 /* a call to intrinsic <p2> */
517 CCM_NOPIPE_BIG_2
, /* <l1> could not be pipelined as it is too big */
518 CCM_NOPIPE_INVINTPR_2
, /* <l1> could not be pipelined as it contains too */
519 /* many loop invariant integers = <i2> */
520 CCM_NOPIPE_INVFLTPR_2
, /* <l1> could not be pipelined as it contains too */
521 /* many loop invariant floats = <i2> */
522 CCM_NOPIPE_INVDBLPR_2
, /* <l1> could not be pipelined as it contains too */
523 /* many loop invariant doubles = <i2> */
524 CCM_PIPE_SCHEDAFIPR_2
, /* <l1> was adversely affected by high */
525 /* integer register pressure = <i2> */
526 CCM_PIPE_SCHEDAFDPR_2
, /* <l1> was adversely affected by high */
527 /* double register pressure = <i2> */
528 CCM_PIPE_SCHEDAFFPR_2
, /* <l1> was adversely affected by high */
529 /* float register pressure = <i2> */
530 CCM_NOPIPE_INTPR_2
, /* <l1> could not be pipelined due to high */
531 /* integer register pressure = <i2> */
532 CCM_NOPIPE_DBLPR_2
, /* <l1> could not be pipelined due to high */
533 /* double register pressure = <i2> */
534 CCM_NOPIPE_FLTPR_2
, /* <l1> could not be pipelined due to high */
535 /* float register pressure = <i2> */
537 /* Group: Inlining Messages */
538 CCM_INLINE
=0x04000, /* Function <p1> inlined from source file <s2> into */
539 /* the code for the following line */
540 CCM_INLINE2
, /* Function <p1> inlined from source file <s2> into */
541 /* inline copy of function <p3> */
542 CCM_INLINE_TMPLT
, /* Function <p1> inlined from template file <s2> */
543 /* into the code for the following line */
544 CCM_INLINE_TMPLT2
, /* Function <p1> inlined from template file <s2> */
545 /* into inline copy of function <p3> */
546 CCM_INLINE_OUT_COPY
, /* Out-of-line copy of inlined function <p1> from */
547 /* source file <s2> generated */
548 CCM_NINLINE_REC
, /* Recursive function <p1> inlined only up to */
550 CCM_NINLINE_NEST
, /* Function <p1> not inlined because inlining is */
551 /* already nested too deeply */
552 CCM_NINLINE_CMPLX
, /* Function <p1> not inlined because it contains */
553 /* too many operations */
554 CCM_NINLINE_FB
, /* Function <p1> not inlined because the */
555 /* profile-feedback execution count is too low */
556 CCM_NINLINE_PAR
, /* Function <p1> not inlined because it contains */
557 /* explicit parallel pragmas */
558 CCM_NINLINE_OPT
, /* Function <p1> not inlined because it is */
559 /* compiled with optimization level <= 2 */
560 CCM_NINLINE_USR
, /* Function <p1> not inlined because either command */
561 /* line option or source code pragma prohibited it, */
562 /* or it's not safe to inline it */
563 CCM_NINLINE_AUTO
, /* Function <p1> not inlined because doing so */
564 /* would make automatic storage for <p2> too large */
565 CCM_NINLINE_CALLS
, /* Function <p1> not inlined because it contains */
567 CCM_NINLINE_ACTUAL
, /* Function <p1> not inlined because it has more */
568 /* actual parameters than formal parameters */
569 CCM_NINLINE_FORMAL
, /* Function <p1> not inlined because it has more */
570 /* formal parameters than actual parameters */
571 CCM_NINLINE_TYPE
, /* Function <p1> not inlined because formal */
572 /* argument type does not match actual type */
573 CCM_NINLINE_ATYPE
, /* Function <p1> not inlined because array formal */
574 /* argument does not match reshaped array actual */
576 CCM_NINLINE_RETTYPE
, /* Function <p1> not inlined because return type */
578 CCM_NINLINE_EXCPT
, /* Function <p1> not inlined because it */
579 /* guarded by an exception handler */
580 CCM_NINLINE_UNSAFE
, /* Function <p1> not inlined because it might be */
581 /* unsafe (call alloca(), etc) */
582 CCM_NINLINE_ALIAS
, /* Function <p1> not inlined because inlining it */
583 /* will make the alias analysis in the calling */
584 /* function more conservative */
585 CCM_NINLINE_FEMARK
, /* Function <p1> not inlined because it contains */
586 /* setjmp/longjmp, or indirect goto, etc */
587 CCM_NINLINE_RAREX
, /* Function <p1> not inlined because it is known */
588 /* to be rarely executed */
589 CCM_CLONING
, /* Function <p1> from source file <s2> cloned, */
590 /* creating cloned function <p3>; constant */
591 /* parameters propagated to clone */
592 CCM_INLINE_B
, /* Function <p1> inlined from source file <s2> into */
593 /* the code for the following line. <i3> loops */
595 CCM_INLINE2_B
, /* Function <p1> inlined from source file <s2> into */
596 /* inline copy of function <p3>. <i4> loops inlined */
597 CCM_INLINE_LOOP
, /* Loop in function <p1>, line <i2> has */
599 CCM_NINLINE_MULTIENTRY
, /* Function <p1> not inlined because it */
600 /* contains an ENTRY statement */
601 CCM_NINLINE_VARARGS
, /* Function <p1> not inlined because variable */
602 /* argument routines cannot be inlined */
603 CCM_NINLINE_UNSEEN_BODY
, /* Function <p1> not inlined because the compiler */
604 /* has not seen the body of the function. Use */
605 /* -xcrossfile or -xipo in order to inline it */
606 CCM_NINLINE_UPLEVEL
, /* Function <p1> not inlined because it is a */
607 /* nested routine containing references to */
608 /* variables defined in an outer function */
609 CCM_NINLINE_CMDLINE
, /* Function <p1> not inlined because either */
610 /* -xinline or source code pragma prohibited it */
611 CCM_NINLINE_CALL_CMPLX
, /* Call to <p1> not inlined because of the */
612 /* complexity of the calling routine */
613 CCM_NINLINE_LANG_MISMATCH
, /* Call to <p1> not inlined because it is in */
614 /* a different language */
615 CCM_NINLINE_RTN_WEAK
, /* Function <p1> not inlined because it */
617 CCM_NINLINE_CALL_WEAKFILE
, /* Call to <p1> not inlined because it is */
618 /* in a different file and it contains a */
619 /* call to a weak routine */
620 CCM_NINLINE_CALL_TRYCATCH
, /* Call to <p1> not inlined because it is */
621 /* in a different file and contains an */
622 /* explicit try/catch */
623 CCM_NINLINE_CALL_REGP
, /* Call to <p1> not inlined because it would */
624 /* cause excessive register pressure */
625 CCM_NINLINE_RTN_REGP
, /* Function <p1> not inlined because it would */
626 /* cause excessive register pressure */
627 CCM_NINLINE_CALL_XPENSV
, /* Call to <p1> not inlined because analysis */
628 /* exceeds the compilation time limit */
629 CCM_NINLINE_READONLYIR
, /* Function <p1> not inlined because it is in a file */
630 /* specified as read-only by -xipo_archive=readonly */
631 /* and it contains calls to static functions */
632 CCM_NINLINE_CALL_THUNK
, /* Call to <p1> not inlined because it is in a */
633 /* compiler-generated function that does not */
634 /* permit inlining */
635 CCM_NINLINE_CALL_XTARGETS
, /* Indirect callsite has too many targets; */
636 /* callsite marked do not inline */
637 CCM_NINLINE_SELFTAIL_RECURSIVE
, /* Function <p1> not inlined because */
638 /* of a recursive tail-call to itself */
639 CCM_NINLINE_PRAGMA
, /* Function <p1> not inlined because it contains */
640 /* explicit parallel or alias pragmas */
641 CCM_NINLINE_CMPLX2
, /* Function <p1> not inlined because it contains too */
642 /* many operations. Increase max_inst_hard in order */
643 /* to inline it: -xinline_param=max_inst_hard:n */
644 CCM_NINLINE_RARE
, /* Function <p1> not inlined because the call */
645 /* is rarely executed */
646 CCM_NINLINE_PAR2
, /* Function <p1> not inlined because it is called */
647 /* within a region guarded by an explicit */
648 /* parallel pragmas */
649 CCM_NINLINE_G_LIMIT
, /* Function <p1> not inlined because it would exceed */
650 /* the permitted global code size growth limit. Try */
651 /* to increase max_growth in order to inline it: */
652 /* -xinline_param=max_growth:n */
653 CCM_NINLINE_L_LIMIT
, /* Function <p1> not inlined because it would exceed */
654 /* the maximum function size growth limit. Increase */
655 /* max_function_inst in order to inline it: */
656 /* -xinline_param=max_function_inst:n */
657 CCM_NINLINE_REC2
, /* Recursive function <p1> is inlined only up to */
658 /* <i2> levels and up to <i3> size. Increase */
659 /* max_recursive_deptha or max_recursive_inst in */
660 /* order to inline it: */
661 /* -xinline_param=max_recursive_depth:n, */
662 /* -xinline_param=max_recursive_inst:n */
663 CCM_NINLINE_FB2
, /* Function <p1> not inlined because the */
664 /* profile-feedback execution count is too */
665 /* low. Decrease min_counter in order to inline it: */
666 /* -xinline_param:min_counter:n */
667 CCM_NINLINE_CS_CMPLX
, /* Function <p1> not inlined because called */
668 /* function's size is too big. Increase */
669 /* max_inst_soft in order to inline it: */
670 /* -xinline_param=max_inst_soft:n */
671 CCM_NINLINE_R_EXCPT
, /* Function <p1> not inlined because it contains */
672 /* an exception handler */
673 CCM_NINLINE_ASM
, /* Function <p1> not inlined because */
674 /* it contains asm statements */
675 CCM_NINLINE_R_READONLYIR
, /* Function <p1> not inlined because it is in a file */
676 /* specified as read-only by -xipo_archive=readonly */
677 /* and it is a static function */
678 CCM_NINLINE_C_READONLYIR
, /* Call to <p1> not inlined because the calling */
679 /* function is in a file specified as read-only */
680 /* by -xipo_archive=readonly */
681 CCM_NINLINE_NEVERRETURN
, /* Function <p1> not inlined because it */
684 /* Group: Messages Concerning Memory Operations */
686 /* a. In all of these, <s1> is a string that is something like */
687 /* "A(i+5*k)" or "structure.field", giving the high-level */
688 /* construct that is being loaded or stored. */
690 /* b. In all of these, <x2> refers to an instruction offset, */
691 /* expressed as a 32-bit signed integer. It is assumed */
692 /* that any prefetches will be within this range of the */
693 /* load/store they are prefetching for. */
694 CCM_MPREFETCH
=0x08000, /* Prefetch of <s1> inserted */
695 /* [This message has a lineno for the source, */
696 /* but no instaddr for the disassembly.] */
697 CCM_MPREFETCH_LD
, /* Prefetch of <s1> inserted for load at <x2> */
698 /* [This message has lineno = -1, */
699 /* and is for disassembly only] */
700 CCM_MPREFETCH_ST
, /* Prefetch of <s1> inserted for store at <x2> */
701 /* [This message has lineno = -1, */
702 /* and is for disassembly only] */
703 CCM_MPREFETCH_FB
, /* Prefetch of <s1> inserted based on feedback data */
704 /* [This message has a lineno for the source, */
705 /* but no instaddr for the disassembly.] */
706 CCM_MPREFETCH_FB_LD
, /* Prefetch of <s1> inserted for load at <x2> based */
707 /* on feedback data */
708 /* [This message has lineno = -1, */
709 /* and is for disassembly only] */
710 CCM_MPREFETCH_FB_ST
, /* Prefetch of <s1> inserted for store at <x2> based */
711 /* on feedback data */
712 /* [This message has lineno = -1, */
713 /* and is for disassembly only] */
714 CCM_MLOAD
, /* Load below refers to <s1> */
715 /* [This message has lineno = -1, */
716 /* and is for disassembly only] */
717 CCM_MSTORE
, /* Store below refers to <s1> */
718 /* [This message has lineno = -1, */
719 /* and is for disassembly only] */
720 CCM_MLOAD_P
, /* Load below refers to <s1>, and was prefetched */
722 /* [This message has lineno = -1, */
723 /* and is for disassembly only] */
724 CCM_MSTORE_P
, /* Store below refers to <s1>, and was prefetched */
726 /* [This message has lineno = -1, */
727 /* and is for disassembly only] */
729 /* Group: Front-end messages [all compilers] */
730 /* Group: F95 Front-end Messages */
731 CCM_COPYIN
=0x10000, /* Parameter <i1> caused a copyin in the following */
733 CCM_COPYOUT
, /* Parameter <i1> caused a copyout in the following */
735 CCM_COPYINOUT
, /* Parameter <i1> caused both a copyin and copyout */
736 /* in the following call */
737 CCM_PADDING
, /* Padding of <i1> bytes inserted before */
739 CCM_PADCOMMON
, /* Padding of <i1> bytes inserted before */
740 /* array <v2> in common block <v3> */
741 CCM_ALIGN_EQ
, /* Variable/array <v1> can not be double-aligned, */
742 /* because it is equivalenced */
743 CCM_ALIGN_PERF
, /* Alignment of variables in common block may cause */
744 /* performance degradation */
745 CCM_ALIGN_STRUCT
, /* Alignment of component <s1> in numeric sequence */
746 /* structure <s2> may cause performance degradation */
747 CCM_TMP_COPY
, /* Argument <v1> copied to a temporary */
748 CCM_TMP_COPYM
, /* Argument <v1> might be copied to a temporary; */
749 /* runtime decision made */
750 CCM_PROC_MISMATCH
, /* Argument <i1> to subprogram <p2> differs from */
751 /* reference on line <i3> */
752 CCM_PROC_MISMATCH2
, /* Scalar argument <i1> to subprogram <p2> is */
753 /* referred to as an array on line <i3> */
754 CCM_PROC_MISMATCH3
, /* Return type/rank from subprogram <p1> differs */
755 /* from return on line <i2> */
756 CCM_DO_EXPR
, /* DO statement bounds lead to no executions of the */
758 CCM_AUTO_BND
, /* The bounds for automatic variable <v1> are not */
759 /* available at all entry points; zero-length */
760 /* variable might be allocated */
761 CCM_LIT_PAD
, /* The character string literal <s1> padded */
762 /* to the length specified for the dummy argument */
763 CCM_ARRAY_LOOP
, /* Array statement below generated a loop */
764 CCM_ARRAY_LOOPNEST
, /* Array statement below generated <i1> nested loops */
765 CCM_ALIGN_PERF2
, /* Alignment of variable <v1> in common block <v2> */
766 /* may cause a performance degradation */
767 CCM_ALIGN_PERF3
, /* Alignment of variable <v1> in blank common may */
768 /* cause a performance degradation */
769 CCM_IO_LOOP_ARRAY
, /* I/O implied do item below generated an array */
772 /* Group: C++ Front-end Messages */
773 CCM_TMPCONST
, /* Implicit invocation of class <s1> constructor for */
775 CCM_TMPDEST
, /* Implicit invocation of class <s1> destructor for */
777 CCM_DBL_CONST
, /* Double constant <s1> used in float expression */
778 CCM_MINLINE
, /* Function <p1> inlined from source file <s2> by */
780 /* [This refers to front-end inlining, */
781 /* not the backend inlining above.] */
782 CCM_MINLINE2
, /* Function <p1> from source file <s2> inlined into */
783 /* inline copy of method <p3> by front-end */
784 /* [This refers to front-end inlining, */
785 /* not the backend inlining above.] */
786 CCM_MINLINE3
, /* Function <p1> not inlined because it uses keyword */
788 CCM_MINLINE4
, /* Function <p1> not inlined because it is too */
790 CCM_TMP_COPYOUT
, /* Argument <v1> copied from a temporary */
791 CCM_TMP_COPYOUTM
, /* Argument <v1> might be copied from a temporary; */
792 /* runtime decision made */
793 CCM_TMP_COPYINOUT
, /* Argument <v1> copied in and out of a temporary */
794 CCM_TMP_COPYINOUTM
, /* Argument <v1> might be copied in and out of */
795 /* a temporary; runtime decision made */
797 /* Group: C Front-end Messages */
798 /* Group: NJC Front-end Messages */
799 /* Group: Updated F95 Front-end Messages */
800 CCM_ARRAY_LOOP_2
, /* Array statement below generated loop <l1> */
801 CCM_ARRAY_LOOPNEST_2
, /* Array statement below generated <i1> nested */
802 /* loops: <l2>, <l3>, ... */
803 /* [The number of parameters will determine how many */
804 /* names appear, and the formatter will get the */
806 CCM_IO_LOOP_ARRAY_2
, /* I/O implied do item below generated an array */
808 CCM_USER_LOOP
, /* Source loop below has tag <l1> */
809 CCM_FOUND_LOOP
, /* Discovered loop below has tag <l1> */
810 CCM_MFUNCTION_LOOP
, /* Copy in M-function of loop below has tag <l1> */
812 /* Group: Code-generator Messages */
813 CCM_FSIMPLE
=0x20000, /* Transformations for fsimple=<i1> applied */
814 CCM_STACK
, /* Function <p1> requires <i2> Mbytes of stack */
816 CCM_TAILRECUR
, /* Recursive tail call in <p1> optimized to jump to */
818 CCM_TAILCALL
, /* Call to function <p1> was tail-call optimized */
819 CCM_NI_EXIT_OR_PSEUDO
, /* Template could not be early inlined because it */
820 /* contains the pseudo instruction <s1> */
821 CCM_NI_BAD_UNARY_OPC
, /* Template could not be early inlined because it */
822 /* contains the instruction opcode <s1> */
823 CCM_NI_INT_LDD_ON_V9
, /* Template could not be early inlined because it */
824 /* contains integer ldd instructions, which are */
825 /* deprecated in the v9 architecture */
826 CCM_NI_LATE_INL_OPC
, /* Template could not be early inlined because it */
827 /* contains the instruction opcode <s1> */
828 CCM_NI_BAD_IMM_OP
, /* Template could not be early inlined because the */
829 /* relocation or immediate operand <s1> is not well */
830 /* understood by the optimizer */
831 CCM_NI_BAD_STATELEAF
, /* Template could not be early inlined because it */
832 /* references the state register <s1> */
833 CCM_NI_BAD_ASR_19
, /* Template could not be early inlined because */
834 /* %asr19 is not supported in pre v8plus code */
835 CCM_NI_BAD_FSR_USE
, /* Template could not be early inlined because */
836 /* references to %fsr can only be optimized when the */
837 /* -iaopts flag is used */
838 CCM_NI_BAD_REGISTER
, /* Template could not be early inlined because it */
839 /* references the register <s1> */
840 CCM_NI_NO_RET_VAL
, /* Template could not be early inlined because it */
841 /* does not return the value declared */
842 CCM_NI_DELAY
, /* Template could not be early inlined because it */
843 /* contains a non nop delay slot */
844 CCM_NI_SCALL
, /* Template could not be early inlined because it */
845 /* calls a function which returns a structure */
846 CCM_CASE_POSITION
, /* Case block below was placed at position <i1> */
847 /* based on execution frequency */
848 CCM_CALL_WITH_CODE
, /* Call to <p1> replaced with inline code. <i2> */
849 /* loops created: <l3>, <l4>, ... */
850 CCM_NI_BAD_SP_ADDR
, /* Template could not be early inlined because it */
851 /* contains a %sp+reg address */
852 CCM_NI_BAD_SP_USAGE
, /* Template could not be early inlined because it */
853 /* uses/defines the stack pointer in a non-load/store instruction */
854 CCM_NI_MIXED_REG_TYPES
, /* Template could not be early inlined because it */
855 /* contains register <s1> used as both x-register and register pair */
859 * The Message Structure
860 * Each message is a fixed-length structure as follows:
864 int64_t instaddr
; /* the PC offset, relative to the .o .text section */
865 int32_t lineno
; /* the source line to which it refers */
866 COMPMSG_ID msg_type
; /* the specific message index */
867 int32_t nparam
; /* number of parameters to this message */
868 int32_t param_index
; /* the index of the first parameter */
871 #if defined(__cplusplus)
876 * Initializes the data structures, converts the source name to a string,
877 * and fills in srcname and version in the header
879 void compcom_p_open (char *srcname
, int32_t version
);
882 * Finds or enters the string s into the string table, and returns the index
885 int32_t compcom_p_string (char *s
);
888 * Enter the single message. Any string parameters should have been converted
889 * to int32's by calling compcom_p_string()
891 void compcom_p_putmsg (int32_t show_bits
, int64_t pcoffset
, int32_t lineno
,
892 COMPMSG_ID m
, int32_t nparams
);
895 * Whatever is needed to close the section and write it out to the .o
897 void compcom_p_finalize ();
899 #if defined(__cplusplus)
903 #endif /* _COMP_COM_H */