xref: /titanic_52/usr/src/cmd/geniconvtbl/assemble.c (revision 7c478bd95313f5f23a4c958a745db2134aa03244)
1*7c478bd9Sstevel@tonic-gate /*
2*7c478bd9Sstevel@tonic-gate  * CDDL HEADER START
3*7c478bd9Sstevel@tonic-gate  *
4*7c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*7c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
6*7c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
7*7c478bd9Sstevel@tonic-gate  * with the License.
8*7c478bd9Sstevel@tonic-gate  *
9*7c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*7c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
11*7c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
12*7c478bd9Sstevel@tonic-gate  * and limitations under the License.
13*7c478bd9Sstevel@tonic-gate  *
14*7c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
15*7c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*7c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
17*7c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
18*7c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
19*7c478bd9Sstevel@tonic-gate  *
20*7c478bd9Sstevel@tonic-gate  * CDDL HEADER END
21*7c478bd9Sstevel@tonic-gate  */
22*7c478bd9Sstevel@tonic-gate /*
23*7c478bd9Sstevel@tonic-gate  * Copyright (c) 1999 by Sun Microsystems, Inc.
24*7c478bd9Sstevel@tonic-gate  * All rights reserved.
25*7c478bd9Sstevel@tonic-gate  */
26*7c478bd9Sstevel@tonic-gate 
27*7c478bd9Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
28*7c478bd9Sstevel@tonic-gate 
29*7c478bd9Sstevel@tonic-gate #include <assert.h>
30*7c478bd9Sstevel@tonic-gate #include <stdio.h>
31*7c478bd9Sstevel@tonic-gate #include <stdlib.h>
32*7c478bd9Sstevel@tonic-gate #include <strings.h>
33*7c478bd9Sstevel@tonic-gate #include <unistd.h>
34*7c478bd9Sstevel@tonic-gate #include <fcntl.h>
35*7c478bd9Sstevel@tonic-gate #include <errno.h>
36*7c478bd9Sstevel@tonic-gate #include <inttypes.h>
37*7c478bd9Sstevel@tonic-gate #include <sys/types.h>
38*7c478bd9Sstevel@tonic-gate #include <sys/stat.h>
39*7c478bd9Sstevel@tonic-gate #include <libintl.h>
40*7c478bd9Sstevel@tonic-gate 
41*7c478bd9Sstevel@tonic-gate #include "itmcomp.h"
42*7c478bd9Sstevel@tonic-gate 
43*7c478bd9Sstevel@tonic-gate struct itm_opt_outer *itm_op_outer = NULL;
44*7c478bd9Sstevel@tonic-gate 
45*7c478bd9Sstevel@tonic-gate #if defined(ENABLE_TRACE)
46*7c478bd9Sstevel@tonic-gate static char	*itmc_obj_names[] = {
47*7c478bd9Sstevel@tonic-gate 	"ITMC_OBJ_NONE(0)",
48*7c478bd9Sstevel@tonic-gate 	"ITMC_OBJ_ITM(1)",
49*7c478bd9Sstevel@tonic-gate 	"ITMC_OBJ_STRING(2)",
50*7c478bd9Sstevel@tonic-gate 	"ITMC_OBJ_DIREC(3)",
51*7c478bd9Sstevel@tonic-gate 	"ITMC_OBJ_COND(4)",
52*7c478bd9Sstevel@tonic-gate 	"ITMC_OBJ_MAP(5)",
53*7c478bd9Sstevel@tonic-gate 	"ITMC_OBJ_OP(6)",
54*7c478bd9Sstevel@tonic-gate 	"ITMC_OBJ_EXPR(7)",
55*7c478bd9Sstevel@tonic-gate 	"ITMC_OBJ_DATA(8)",
56*7c478bd9Sstevel@tonic-gate 	"ITMC_OBJ_ACTION(9)",
57*7c478bd9Sstevel@tonic-gate 	"ITMC_OBJ_RANGE(10)",
58*7c478bd9Sstevel@tonic-gate 	"ITMC_OBJ_RAGISTER(11)",
59*7c478bd9Sstevel@tonic-gate 	"ITMC_OBJ_ESCAPESEQ(12)"
60*7c478bd9Sstevel@tonic-gate };
61*7c478bd9Sstevel@tonic-gate #endif
62*7c478bd9Sstevel@tonic-gate 
63*7c478bd9Sstevel@tonic-gate #define	TRACE_FMT(comment) \
64*7c478bd9Sstevel@tonic-gate comment ## " size=%4ld(0x%4lx); 64d=0x%16" PRIx64 "; ptr=%4p(%c...)\n"
65*7c478bd9Sstevel@tonic-gate #define	TRACE_DT(data, refer) \
66*7c478bd9Sstevel@tonic-gate 	data.size, data.size, data.place.itm_64d, \
67*7c478bd9Sstevel@tonic-gate 	data.place.itm_ptr,\
68*7c478bd9Sstevel@tonic-gate 	(((refer) == 0) ? (not_refer): \
69*7c478bd9Sstevel@tonic-gate 	(((sizeof (itm_place_t) < data.size))? \
70*7c478bd9Sstevel@tonic-gate 	 *((char *)(((char *)itm_header) + data.place.itm_ptr)): \
71*7c478bd9Sstevel@tonic-gate 	(not_refer)))
72*7c478bd9Sstevel@tonic-gate enum {
73*7c478bd9Sstevel@tonic-gate 	NOREFER = 0,
74*7c478bd9Sstevel@tonic-gate 	REFER  = 1
75*7c478bd9Sstevel@tonic-gate };
76*7c478bd9Sstevel@tonic-gate #define	NAMETRACE(comment) \
77*7c478bd9Sstevel@tonic-gate 	{	itmc_name_t	*name;\
78*7c478bd9Sstevel@tonic-gate 		TRACE_MESSAGE('p', (#comment "\n")); \
79*7c478bd9Sstevel@tonic-gate 		for (name = name_first; name; name = name->next) {\
80*7c478bd9Sstevel@tonic-gate 			TRACE_MESSAGE('p', \
81*7c478bd9Sstevel@tonic-gate 				(TRACE_FMT(" "),\
82*7c478bd9Sstevel@tonic-gate 				TRACE_DT(name->name, NOREFER)));\
83*7c478bd9Sstevel@tonic-gate 		}\
84*7c478bd9Sstevel@tonic-gate 	}
85*7c478bd9Sstevel@tonic-gate 
86*7c478bd9Sstevel@tonic-gate /* static int not_refer = (~0); */
87*7c478bd9Sstevel@tonic-gate 
88*7c478bd9Sstevel@tonic-gate 
89*7c478bd9Sstevel@tonic-gate 
90*7c478bd9Sstevel@tonic-gate static void	relocation_I(itm_hdr_t *, itm_info_hdr_t *);
91*7c478bd9Sstevel@tonic-gate static void	relocation_II(itm_hdr_t *, itm_info_hdr_t *);
92*7c478bd9Sstevel@tonic-gate 
93*7c478bd9Sstevel@tonic-gate static void	fix_itmc_ref_reloc(itmc_ref_t *, itm_place2_t);
94*7c478bd9Sstevel@tonic-gate static void	analysis(itm_info_hdr_t	*);
95*7c478bd9Sstevel@tonic-gate static void	analysis2(void);
96*7c478bd9Sstevel@tonic-gate static void	output(itm_hdr_t *, itm_info_hdr_t *);
97*7c478bd9Sstevel@tonic-gate 
98*7c478bd9Sstevel@tonic-gate 
99*7c478bd9Sstevel@tonic-gate 
100*7c478bd9Sstevel@tonic-gate 
101*7c478bd9Sstevel@tonic-gate /*
102*7c478bd9Sstevel@tonic-gate  * Assemble main function
103*7c478bd9Sstevel@tonic-gate  */
104*7c478bd9Sstevel@tonic-gate 
105*7c478bd9Sstevel@tonic-gate int
106*7c478bd9Sstevel@tonic-gate assemble(itm_hdr_t	*itm_header)
107*7c478bd9Sstevel@tonic-gate {
108*7c478bd9Sstevel@tonic-gate 	int		i;
109*7c478bd9Sstevel@tonic-gate 	int		j;
110*7c478bd9Sstevel@tonic-gate 	itmc_ref_t	*ref;
111*7c478bd9Sstevel@tonic-gate 	itm_info_hdr_t	*info_header;
112*7c478bd9Sstevel@tonic-gate 	union {
113*7c478bd9Sstevel@tonic-gate 		long	longval;
114*7c478bd9Sstevel@tonic-gate 		char	charval[8];
115*7c478bd9Sstevel@tonic-gate 	}		mach_spec;
116*7c478bd9Sstevel@tonic-gate 
117*7c478bd9Sstevel@tonic-gate 	if (0 < error_deferred) {
118*7c478bd9Sstevel@tonic-gate 		itm_error(gettext("number of deferred error: %d\n"),
119*7c478bd9Sstevel@tonic-gate 			error_deferred);
120*7c478bd9Sstevel@tonic-gate 		exit(ITMC_STATUS_BT);
121*7c478bd9Sstevel@tonic-gate 	}
122*7c478bd9Sstevel@tonic-gate 
123*7c478bd9Sstevel@tonic-gate 	itm_header->ident[0] = ITM_IDENT_0;
124*7c478bd9Sstevel@tonic-gate 	itm_header->ident[1] = ITM_IDENT_1;
125*7c478bd9Sstevel@tonic-gate 	itm_header->ident[2] = ITM_IDENT_2;
126*7c478bd9Sstevel@tonic-gate 	itm_header->ident[3] = ITM_IDENT_3;
127*7c478bd9Sstevel@tonic-gate 
128*7c478bd9Sstevel@tonic-gate 	itm_header->spec[0] = ITM_SPEC_0;
129*7c478bd9Sstevel@tonic-gate 	itm_header->spec[1] = ITM_SPEC_1;
130*7c478bd9Sstevel@tonic-gate 	itm_header->spec[2] = ITM_SPEC_2;
131*7c478bd9Sstevel@tonic-gate 	mach_spec.longval = 1;
132*7c478bd9Sstevel@tonic-gate 	switch (sizeof (long)) {
133*7c478bd9Sstevel@tonic-gate 	case 4:
134*7c478bd9Sstevel@tonic-gate 		if (0 == mach_spec.charval[0]) {
135*7c478bd9Sstevel@tonic-gate 			itm_header->spec[3] = ITM_SPEC_3_32_BIG_ENDIAN;
136*7c478bd9Sstevel@tonic-gate 		} else {
137*7c478bd9Sstevel@tonic-gate 			itm_header->spec[3] = ITM_SPEC_3_32_LITTLE_ENDIAN;
138*7c478bd9Sstevel@tonic-gate 		}
139*7c478bd9Sstevel@tonic-gate 		break;
140*7c478bd9Sstevel@tonic-gate 	case 8:
141*7c478bd9Sstevel@tonic-gate 		if (0 == mach_spec.charval[0]) {
142*7c478bd9Sstevel@tonic-gate 			itm_header->spec[3] = ITM_SPEC_3_64_BIG_ENDIAN;
143*7c478bd9Sstevel@tonic-gate 		} else {
144*7c478bd9Sstevel@tonic-gate 			itm_header->spec[3] = ITM_SPEC_3_64_LITTLE_ENDIAN;
145*7c478bd9Sstevel@tonic-gate 		}
146*7c478bd9Sstevel@tonic-gate 		break;
147*7c478bd9Sstevel@tonic-gate 	}
148*7c478bd9Sstevel@tonic-gate 
149*7c478bd9Sstevel@tonic-gate 	itm_header->version[0] = ITM_VER_0;
150*7c478bd9Sstevel@tonic-gate 	itm_header->version[1] = ITM_VER_1;
151*7c478bd9Sstevel@tonic-gate 	itm_header->version[2] = ITM_VER_2;
152*7c478bd9Sstevel@tonic-gate 	itm_header->version[3] = ITM_VER_3;
153*7c478bd9Sstevel@tonic-gate 
154*7c478bd9Sstevel@tonic-gate 	itm_header->itm_size.itm_ptr = 0;
155*7c478bd9Sstevel@tonic-gate 
156*7c478bd9Sstevel@tonic-gate 	itm_header->reg_num = reg_id;
157*7c478bd9Sstevel@tonic-gate 
158*7c478bd9Sstevel@tonic-gate 	itm_header->itm_hdr_size = (sizeof (itm_hdr_t));
159*7c478bd9Sstevel@tonic-gate 
160*7c478bd9Sstevel@tonic-gate 	info_header = malloc_vital(sizeof (itm_info_hdr_t));
161*7c478bd9Sstevel@tonic-gate 	(void) memset(info_header, 0, sizeof (itm_info_hdr_t));
162*7c478bd9Sstevel@tonic-gate 
163*7c478bd9Sstevel@tonic-gate 	relocation_I(itm_header, info_header);
164*7c478bd9Sstevel@tonic-gate 	relocation_II(itm_header, info_header);
165*7c478bd9Sstevel@tonic-gate 
166*7c478bd9Sstevel@tonic-gate 	TRACE_MESSAGE('r',
167*7c478bd9Sstevel@tonic-gate 			("	  ref	 name	 referencee reloc(10)"
168*7c478bd9Sstevel@tonic-gate 			"size(10) referencer next\n"));
169*7c478bd9Sstevel@tonic-gate 	for (i = ITMC_OBJ_FIRST; i <= ITMC_OBJ_LAST; i++) {
170*7c478bd9Sstevel@tonic-gate 		TRACE_MESSAGE('r', ("%s\n", itmc_obj_names[i]));
171*7c478bd9Sstevel@tonic-gate 		for (ref = ref_first[i], j = 0; ref; ref = ref->next, j++) {
172*7c478bd9Sstevel@tonic-gate 			TRACE_MESSAGE('r',
173*7c478bd9Sstevel@tonic-gate 			("	 %2d:%08p:%08p:%08p:%8p:%8ld:%08p:%08p\n",
174*7c478bd9Sstevel@tonic-gate 			j, ref,
175*7c478bd9Sstevel@tonic-gate 			ref->name, ref->referencee,
176*7c478bd9Sstevel@tonic-gate 			ref->reloc.itm_ptr, ref->size,
177*7c478bd9Sstevel@tonic-gate 			ref->referencer, ref->next));
178*7c478bd9Sstevel@tonic-gate 		}
179*7c478bd9Sstevel@tonic-gate 	}
180*7c478bd9Sstevel@tonic-gate 
181*7c478bd9Sstevel@tonic-gate 	analysis(info_header);
182*7c478bd9Sstevel@tonic-gate 	analysis2();
183*7c478bd9Sstevel@tonic-gate 	if (0 < error_deferred) {
184*7c478bd9Sstevel@tonic-gate 		itm_error(gettext("number of deferred error: %d\n"),
185*7c478bd9Sstevel@tonic-gate 			error_deferred);
186*7c478bd9Sstevel@tonic-gate 		exit(ITMC_STATUS_BT);
187*7c478bd9Sstevel@tonic-gate 	}
188*7c478bd9Sstevel@tonic-gate 
189*7c478bd9Sstevel@tonic-gate 	output(itm_header, info_header);
190*7c478bd9Sstevel@tonic-gate 	return (0);
191*7c478bd9Sstevel@tonic-gate }
192*7c478bd9Sstevel@tonic-gate 
193*7c478bd9Sstevel@tonic-gate 
194*7c478bd9Sstevel@tonic-gate /*
195*7c478bd9Sstevel@tonic-gate  * Fix reloc of itmc_ref_t, and fix reloc of itmc_name_t
196*7c478bd9Sstevel@tonic-gate  */
197*7c478bd9Sstevel@tonic-gate 
198*7c478bd9Sstevel@tonic-gate static void
199*7c478bd9Sstevel@tonic-gate relocation_I(itm_hdr_t		*itm_header, itm_info_hdr_t	*info_header)
200*7c478bd9Sstevel@tonic-gate {
201*7c478bd9Sstevel@tonic-gate 	itmc_ref_t	*ref;
202*7c478bd9Sstevel@tonic-gate 	itmc_name_t	*name;
203*7c478bd9Sstevel@tonic-gate 	itm_num_t	sec_num;
204*7c478bd9Sstevel@tonic-gate 	itm_num_t	sec_num2;
205*7c478bd9Sstevel@tonic-gate 	itm_size_t	sec_size;
206*7c478bd9Sstevel@tonic-gate 
207*7c478bd9Sstevel@tonic-gate 	/*
208*7c478bd9Sstevel@tonic-gate 	 * determin section size
209*7c478bd9Sstevel@tonic-gate 	 */
210*7c478bd9Sstevel@tonic-gate 
211*7c478bd9Sstevel@tonic-gate 	/* string section */
212*7c478bd9Sstevel@tonic-gate 	for (sec_num = 0, sec_size = 0, ref = ref_first[ITMC_OBJ_STRING];
213*7c478bd9Sstevel@tonic-gate 	    ref; sec_num += 1, sec_size += ref->size, ref = ref->next) {}
214*7c478bd9Sstevel@tonic-gate 	sec_size = ITMROUNDUP(sec_size);
215*7c478bd9Sstevel@tonic-gate 	info_header->str_plc_tbl.size = ((sizeof (itm_data_t)) * sec_num);
216*7c478bd9Sstevel@tonic-gate 	info_header->str_plc_tbl.number = sec_num;
217*7c478bd9Sstevel@tonic-gate 	info_header->str_sec.size = sec_size;
218*7c478bd9Sstevel@tonic-gate 	info_header->str_sec.number = sec_num;
219*7c478bd9Sstevel@tonic-gate 
220*7c478bd9Sstevel@tonic-gate 	/* direction */
221*7c478bd9Sstevel@tonic-gate 	for (sec_num = 0, sec_size = 0, ref = ref_first[ITMC_OBJ_DIREC];
222*7c478bd9Sstevel@tonic-gate 	    ref; sec_num += 1, sec_size += ref->size, ref = ref->next) {}
223*7c478bd9Sstevel@tonic-gate 	sec_size = ITMROUNDUP(sec_size);
224*7c478bd9Sstevel@tonic-gate 	info_header->direc_plc_tbl.size = sec_num * (sizeof (itm_place_t));
225*7c478bd9Sstevel@tonic-gate 	info_header->direc_plc_tbl.number = sec_num;
226*7c478bd9Sstevel@tonic-gate 	info_header->direc_tbl_sec.size = sec_size;
227*7c478bd9Sstevel@tonic-gate 	info_header->direc_tbl_sec.number = sec_num;
228*7c478bd9Sstevel@tonic-gate 
229*7c478bd9Sstevel@tonic-gate 	/* condition */
230*7c478bd9Sstevel@tonic-gate 	for (sec_num = 0, sec_size = 0, ref = ref_first[ITMC_OBJ_COND];
231*7c478bd9Sstevel@tonic-gate 	    ref; sec_num += 1, sec_size += ref->size, ref = ref->next) {}
232*7c478bd9Sstevel@tonic-gate 	sec_size = ITMROUNDUP(sec_size);
233*7c478bd9Sstevel@tonic-gate 	info_header->cond_plc_tbl.size = sec_num * (sizeof (itm_place_t));
234*7c478bd9Sstevel@tonic-gate 	info_header->cond_plc_tbl.number = sec_num;
235*7c478bd9Sstevel@tonic-gate 	info_header->cond_tbl_sec.size = sec_size;
236*7c478bd9Sstevel@tonic-gate 	info_header->cond_tbl_sec.number = sec_num;
237*7c478bd9Sstevel@tonic-gate 
238*7c478bd9Sstevel@tonic-gate 	/* map */
239*7c478bd9Sstevel@tonic-gate 	for (sec_num = 0, sec_size = 0, ref = ref_first[ITMC_OBJ_MAP];
240*7c478bd9Sstevel@tonic-gate 	    ref; sec_num += 1, sec_size += ref->size, ref = ref->next) {
241*7c478bd9Sstevel@tonic-gate 	}
242*7c478bd9Sstevel@tonic-gate 	sec_size = ITMROUNDUP(sec_size);
243*7c478bd9Sstevel@tonic-gate 	info_header->map_plc_tbl.size = sec_num * (sizeof (itm_place_t));
244*7c478bd9Sstevel@tonic-gate 	info_header->map_plc_tbl.number = sec_num;
245*7c478bd9Sstevel@tonic-gate 	info_header->map_tbl_sec.size = sec_size;
246*7c478bd9Sstevel@tonic-gate 	info_header->map_tbl_sec.number = sec_num;
247*7c478bd9Sstevel@tonic-gate 
248*7c478bd9Sstevel@tonic-gate 	/* operation */
249*7c478bd9Sstevel@tonic-gate 	for (sec_num = 0, sec_size = 0, ref = ref_first[ITMC_OBJ_OP];
250*7c478bd9Sstevel@tonic-gate 	    ref; sec_num += 1, sec_size += ref->size, ref = ref->next) {
251*7c478bd9Sstevel@tonic-gate 	}
252*7c478bd9Sstevel@tonic-gate 	sec_size = ITMROUNDUP(sec_size);
253*7c478bd9Sstevel@tonic-gate 	info_header->op_plc_tbl.size = sec_num * (sizeof (itm_place_t));
254*7c478bd9Sstevel@tonic-gate 	info_header->op_plc_tbl.number = sec_num;
255*7c478bd9Sstevel@tonic-gate 	info_header->op_tbl_sec.size = sec_size;
256*7c478bd9Sstevel@tonic-gate 	info_header->op_tbl_sec.number = sec_num;
257*7c478bd9Sstevel@tonic-gate 
258*7c478bd9Sstevel@tonic-gate 	/* range section */
259*7c478bd9Sstevel@tonic-gate 	for (sec_num = 0, sec_size = 0, ref = ref_first[ITMC_OBJ_RANGE];
260*7c478bd9Sstevel@tonic-gate 	    ref; sec_num += 1, sec_size += ref->size, ref = ref->next) {}
261*7c478bd9Sstevel@tonic-gate 	sec_size = ITMROUNDUP(sec_size);
262*7c478bd9Sstevel@tonic-gate 	info_header->range_plc_tbl.size = sec_num * (sizeof (itm_place_t));
263*7c478bd9Sstevel@tonic-gate 	info_header->range_plc_tbl.number = sec_num;
264*7c478bd9Sstevel@tonic-gate 	info_header->range_tbl_sec.size = sec_size;
265*7c478bd9Sstevel@tonic-gate 	info_header->range_tbl_sec.number = sec_num;
266*7c478bd9Sstevel@tonic-gate 
267*7c478bd9Sstevel@tonic-gate 	/* escapeseq section */
268*7c478bd9Sstevel@tonic-gate 	for (sec_num = 0, sec_size = 0, ref = ref_first[ITMC_OBJ_ESCAPESEQ];
269*7c478bd9Sstevel@tonic-gate 	    ref; sec_num += 1, sec_size += ref->size, ref = ref->next) {}
270*7c478bd9Sstevel@tonic-gate 	sec_size = ITMROUNDUP(sec_size);
271*7c478bd9Sstevel@tonic-gate 	info_header->escapeseq_plc_tbl.size = sec_num * (sizeof (itm_place_t));
272*7c478bd9Sstevel@tonic-gate 	info_header->escapeseq_plc_tbl.number = sec_num;
273*7c478bd9Sstevel@tonic-gate 	info_header->escapeseq_tbl_sec.size = sec_size;
274*7c478bd9Sstevel@tonic-gate 	info_header->escapeseq_tbl_sec.number = sec_num;
275*7c478bd9Sstevel@tonic-gate 
276*7c478bd9Sstevel@tonic-gate 	/* data section */
277*7c478bd9Sstevel@tonic-gate 	for (sec_num = 0, sec_size = 0, ref = ref_first[ITMC_OBJ_DATA];
278*7c478bd9Sstevel@tonic-gate 	    ref; sec_num += 1, sec_size += ref->size, ref = ref->next) {}
279*7c478bd9Sstevel@tonic-gate 	for (ref = ref_first[ITMC_OBJ_EXPR];
280*7c478bd9Sstevel@tonic-gate 	    ref; sec_num += 1, sec_size += ref->size, ref = ref->next) {}
281*7c478bd9Sstevel@tonic-gate 	sec_size = ITMROUNDUP(sec_size);
282*7c478bd9Sstevel@tonic-gate 	info_header->data_plc_tbl.size = ((sizeof (itm_place_t)) * sec_num);
283*7c478bd9Sstevel@tonic-gate 	info_header->data_plc_tbl.number = sec_num;
284*7c478bd9Sstevel@tonic-gate 	info_header->data_sec.size = sec_size;
285*7c478bd9Sstevel@tonic-gate 	info_header->data_sec.number = sec_num;
286*7c478bd9Sstevel@tonic-gate 
287*7c478bd9Sstevel@tonic-gate 
288*7c478bd9Sstevel@tonic-gate 	/* name section */
289*7c478bd9Sstevel@tonic-gate 	sec_num2 = 0;
290*7c478bd9Sstevel@tonic-gate 	for (sec_num = 0, sec_size = 0, name = name_first;
291*7c478bd9Sstevel@tonic-gate 	    name; name = name->next) {
292*7c478bd9Sstevel@tonic-gate 		if ((ITMC_OBJ_REGISTER != name->type) &&
293*7c478bd9Sstevel@tonic-gate 		    (0 != name->name.size)) {
294*7c478bd9Sstevel@tonic-gate 			if ((sizeof (itm_place_t)) < name->name.size) {
295*7c478bd9Sstevel@tonic-gate 				sec_size += name->name.size;
296*7c478bd9Sstevel@tonic-gate 				sec_num2 += 1;
297*7c478bd9Sstevel@tonic-gate 			}
298*7c478bd9Sstevel@tonic-gate 			sec_num += 1;
299*7c478bd9Sstevel@tonic-gate 		}
300*7c478bd9Sstevel@tonic-gate 	}
301*7c478bd9Sstevel@tonic-gate 	info_header->name_plc_tbl.size = ((sizeof (itm_data_t))	* sec_num);
302*7c478bd9Sstevel@tonic-gate 	info_header->name_plc_tbl.number = sec_num;
303*7c478bd9Sstevel@tonic-gate 
304*7c478bd9Sstevel@tonic-gate 	for (sec_num = 0, name = name_first; name; name = name->next) {
305*7c478bd9Sstevel@tonic-gate 		if ((ITMC_OBJ_REGISTER == name->type) &&
306*7c478bd9Sstevel@tonic-gate 		    (0 != name->name.size)) {
307*7c478bd9Sstevel@tonic-gate 			if ((sizeof (itm_place_t)) < name->name.size) {
308*7c478bd9Sstevel@tonic-gate 				sec_size += name->name.size;
309*7c478bd9Sstevel@tonic-gate 				sec_num2 += 1;
310*7c478bd9Sstevel@tonic-gate 			}
311*7c478bd9Sstevel@tonic-gate 			sec_num += 1;
312*7c478bd9Sstevel@tonic-gate 		}
313*7c478bd9Sstevel@tonic-gate 	}
314*7c478bd9Sstevel@tonic-gate 	sec_size = ITMROUNDUP(sec_size);
315*7c478bd9Sstevel@tonic-gate 	info_header->reg_plc_tbl.size =
316*7c478bd9Sstevel@tonic-gate 		((sizeof (itm_data_t)) * (itm_header->reg_num));
317*7c478bd9Sstevel@tonic-gate 	info_header->reg_plc_tbl.number = itm_header->reg_num;
318*7c478bd9Sstevel@tonic-gate 
319*7c478bd9Sstevel@tonic-gate 	info_header->name_sec.size = sec_size;
320*7c478bd9Sstevel@tonic-gate 	info_header->name_sec.number = sec_num2;
321*7c478bd9Sstevel@tonic-gate 
322*7c478bd9Sstevel@tonic-gate 	/*
323*7c478bd9Sstevel@tonic-gate 	 * adjust place
324*7c478bd9Sstevel@tonic-gate 	 */
325*7c478bd9Sstevel@tonic-gate 	info_header->str_sec.place.itm_ptr =
326*7c478bd9Sstevel@tonic-gate 		0 +
327*7c478bd9Sstevel@tonic-gate 		(sizeof (itm_hdr_t));
328*7c478bd9Sstevel@tonic-gate 	info_header->direc_tbl_sec.place.itm_ptr =
329*7c478bd9Sstevel@tonic-gate 		info_header->str_sec.place.itm_ptr +
330*7c478bd9Sstevel@tonic-gate 		info_header->str_sec.size;
331*7c478bd9Sstevel@tonic-gate 	info_header->cond_tbl_sec.place.itm_ptr =
332*7c478bd9Sstevel@tonic-gate 		info_header->direc_tbl_sec.place.itm_ptr +
333*7c478bd9Sstevel@tonic-gate 		info_header->direc_tbl_sec.size;
334*7c478bd9Sstevel@tonic-gate 	info_header->map_tbl_sec.place.itm_ptr =
335*7c478bd9Sstevel@tonic-gate 		info_header->cond_tbl_sec.place.itm_ptr +
336*7c478bd9Sstevel@tonic-gate 		info_header->cond_tbl_sec.size;
337*7c478bd9Sstevel@tonic-gate 	info_header->op_tbl_sec.place.itm_ptr =
338*7c478bd9Sstevel@tonic-gate 		info_header->map_tbl_sec.place.itm_ptr +
339*7c478bd9Sstevel@tonic-gate 		info_header->map_tbl_sec.size;
340*7c478bd9Sstevel@tonic-gate 
341*7c478bd9Sstevel@tonic-gate 	info_header->range_tbl_sec.place.itm_ptr =
342*7c478bd9Sstevel@tonic-gate 		info_header->op_tbl_sec.place.itm_ptr +
343*7c478bd9Sstevel@tonic-gate 		info_header->op_tbl_sec.size;
344*7c478bd9Sstevel@tonic-gate 
345*7c478bd9Sstevel@tonic-gate 	info_header->escapeseq_tbl_sec.place.itm_ptr =
346*7c478bd9Sstevel@tonic-gate 		info_header->range_tbl_sec.place.itm_ptr +
347*7c478bd9Sstevel@tonic-gate 		info_header->range_tbl_sec.size;
348*7c478bd9Sstevel@tonic-gate 
349*7c478bd9Sstevel@tonic-gate 	info_header->data_sec.place.itm_ptr =
350*7c478bd9Sstevel@tonic-gate 		info_header->escapeseq_tbl_sec.place.itm_ptr +
351*7c478bd9Sstevel@tonic-gate 		info_header->escapeseq_tbl_sec.size;
352*7c478bd9Sstevel@tonic-gate 
353*7c478bd9Sstevel@tonic-gate 	/*
354*7c478bd9Sstevel@tonic-gate 	 * adjust place: optional
355*7c478bd9Sstevel@tonic-gate 	 */
356*7c478bd9Sstevel@tonic-gate 
357*7c478bd9Sstevel@tonic-gate 	if (0 == cmd_opt.strip) {
358*7c478bd9Sstevel@tonic-gate 		itm_header->info_hdr.itm_ptr =
359*7c478bd9Sstevel@tonic-gate 			info_header->data_sec.place.itm_ptr +
360*7c478bd9Sstevel@tonic-gate 			info_header->data_sec.size;
361*7c478bd9Sstevel@tonic-gate 
362*7c478bd9Sstevel@tonic-gate 		info_header->direc_plc_tbl.place.itm_ptr =
363*7c478bd9Sstevel@tonic-gate 			itm_header->info_hdr.itm_ptr +
364*7c478bd9Sstevel@tonic-gate 			(sizeof (itm_info_hdr_t));
365*7c478bd9Sstevel@tonic-gate 		info_header->cond_plc_tbl.place.itm_ptr =
366*7c478bd9Sstevel@tonic-gate 			info_header->direc_plc_tbl.place.itm_ptr +
367*7c478bd9Sstevel@tonic-gate 			info_header->direc_plc_tbl.size;
368*7c478bd9Sstevel@tonic-gate 		info_header->map_plc_tbl.place.itm_ptr =
369*7c478bd9Sstevel@tonic-gate 			info_header->cond_plc_tbl.place.itm_ptr +
370*7c478bd9Sstevel@tonic-gate 			info_header->cond_plc_tbl.size;
371*7c478bd9Sstevel@tonic-gate 		info_header->op_plc_tbl.place.itm_ptr =
372*7c478bd9Sstevel@tonic-gate 			info_header->map_plc_tbl.place.itm_ptr +
373*7c478bd9Sstevel@tonic-gate 			info_header->map_plc_tbl.size;
374*7c478bd9Sstevel@tonic-gate 
375*7c478bd9Sstevel@tonic-gate 		info_header->str_plc_tbl.place.itm_ptr =
376*7c478bd9Sstevel@tonic-gate 			info_header->op_plc_tbl.place.itm_ptr +
377*7c478bd9Sstevel@tonic-gate 			info_header->op_plc_tbl.size;
378*7c478bd9Sstevel@tonic-gate 		info_header->range_plc_tbl.place.itm_ptr =
379*7c478bd9Sstevel@tonic-gate 			info_header->str_plc_tbl.place.itm_ptr +
380*7c478bd9Sstevel@tonic-gate 			info_header->str_plc_tbl.size;
381*7c478bd9Sstevel@tonic-gate 		info_header->escapeseq_plc_tbl.place.itm_ptr =
382*7c478bd9Sstevel@tonic-gate 			info_header->range_plc_tbl.place.itm_ptr +
383*7c478bd9Sstevel@tonic-gate 			info_header->range_plc_tbl.size;
384*7c478bd9Sstevel@tonic-gate 		info_header->data_plc_tbl.place.itm_ptr =
385*7c478bd9Sstevel@tonic-gate 			info_header->escapeseq_plc_tbl.place.itm_ptr +
386*7c478bd9Sstevel@tonic-gate 			info_header->escapeseq_plc_tbl.size;
387*7c478bd9Sstevel@tonic-gate 		info_header->name_plc_tbl.place.itm_ptr =
388*7c478bd9Sstevel@tonic-gate 			info_header->data_plc_tbl.place.itm_ptr +
389*7c478bd9Sstevel@tonic-gate 			info_header->data_plc_tbl.size;
390*7c478bd9Sstevel@tonic-gate 		info_header->reg_plc_tbl.place.itm_ptr =
391*7c478bd9Sstevel@tonic-gate 			info_header->name_plc_tbl.place.itm_ptr +
392*7c478bd9Sstevel@tonic-gate 			info_header->name_plc_tbl.size;
393*7c478bd9Sstevel@tonic-gate 
394*7c478bd9Sstevel@tonic-gate 		/* name SECTION */
395*7c478bd9Sstevel@tonic-gate 		info_header->name_sec.place.itm_ptr =
396*7c478bd9Sstevel@tonic-gate 			info_header->reg_plc_tbl.place.itm_ptr +
397*7c478bd9Sstevel@tonic-gate 			info_header->reg_plc_tbl.size;
398*7c478bd9Sstevel@tonic-gate 	}
399*7c478bd9Sstevel@tonic-gate 
400*7c478bd9Sstevel@tonic-gate 	/*
401*7c478bd9Sstevel@tonic-gate 	 * size of ITM
402*7c478bd9Sstevel@tonic-gate 	 */
403*7c478bd9Sstevel@tonic-gate 
404*7c478bd9Sstevel@tonic-gate 	if (0 == cmd_opt.strip) {
405*7c478bd9Sstevel@tonic-gate 		itm_header->itm_size.itm_ptr =
406*7c478bd9Sstevel@tonic-gate 			info_header->name_sec.place.itm_ptr +
407*7c478bd9Sstevel@tonic-gate 			info_header->name_sec.size;
408*7c478bd9Sstevel@tonic-gate 	} else {
409*7c478bd9Sstevel@tonic-gate 		itm_header->itm_size.itm_ptr =
410*7c478bd9Sstevel@tonic-gate 			info_header->data_sec.place.itm_ptr +
411*7c478bd9Sstevel@tonic-gate 			info_header->data_sec.size;
412*7c478bd9Sstevel@tonic-gate 	}
413*7c478bd9Sstevel@tonic-gate 
414*7c478bd9Sstevel@tonic-gate 
415*7c478bd9Sstevel@tonic-gate 	/*
416*7c478bd9Sstevel@tonic-gate 	 * trace
417*7c478bd9Sstevel@tonic-gate 	 */
418*7c478bd9Sstevel@tonic-gate 
419*7c478bd9Sstevel@tonic-gate #if defined(ENABLE_TRACE)
420*7c478bd9Sstevel@tonic-gate 	dump_itm_header(itm_header, info_header);
421*7c478bd9Sstevel@tonic-gate #endif
422*7c478bd9Sstevel@tonic-gate }
423*7c478bd9Sstevel@tonic-gate 
424*7c478bd9Sstevel@tonic-gate 
425*7c478bd9Sstevel@tonic-gate /*
426*7c478bd9Sstevel@tonic-gate  * Fix referencer of itmc_ref_t
427*7c478bd9Sstevel@tonic-gate  */
428*7c478bd9Sstevel@tonic-gate 
429*7c478bd9Sstevel@tonic-gate static void
430*7c478bd9Sstevel@tonic-gate relocation_II(itm_hdr_t	*itm_header, itm_info_hdr_t	*info_header)
431*7c478bd9Sstevel@tonic-gate {
432*7c478bd9Sstevel@tonic-gate 	itmc_ref_t	*ref;
433*7c478bd9Sstevel@tonic-gate 	itmc_name_t	*name;
434*7c478bd9Sstevel@tonic-gate 	itmc_ref_link_t	*rl;
435*7c478bd9Sstevel@tonic-gate 	itm_place2_t	place;
436*7c478bd9Sstevel@tonic-gate 	itm_place2_t	n_plc;
437*7c478bd9Sstevel@tonic-gate 
438*7c478bd9Sstevel@tonic-gate 	/*
439*7c478bd9Sstevel@tonic-gate 	 * reloc
440*7c478bd9Sstevel@tonic-gate 	 */
441*7c478bd9Sstevel@tonic-gate 
442*7c478bd9Sstevel@tonic-gate 	/* string section */
443*7c478bd9Sstevel@tonic-gate 	TRACE_MESSAGE('3', ("string section\n"));
444*7c478bd9Sstevel@tonic-gate 	place = info_header->str_sec.place.itm_ptr;
445*7c478bd9Sstevel@tonic-gate 	for (ref = ref_first[ITMC_OBJ_STRING];
446*7c478bd9Sstevel@tonic-gate 	    ref; place += ref->size, ref = ref->next) {
447*7c478bd9Sstevel@tonic-gate 		fix_itmc_ref_reloc(ref, place);
448*7c478bd9Sstevel@tonic-gate 	}
449*7c478bd9Sstevel@tonic-gate 
450*7c478bd9Sstevel@tonic-gate 	/* direction */
451*7c478bd9Sstevel@tonic-gate 	TRACE_MESSAGE('3', ("direction\n"));
452*7c478bd9Sstevel@tonic-gate 	place = info_header->direc_tbl_sec.place.itm_ptr;
453*7c478bd9Sstevel@tonic-gate 	for (ref = ref_first[ITMC_OBJ_DIREC];
454*7c478bd9Sstevel@tonic-gate 	    ref; place += ref->size, ref = ref->next) {
455*7c478bd9Sstevel@tonic-gate 		fix_itmc_ref_reloc(ref, place);
456*7c478bd9Sstevel@tonic-gate 	}
457*7c478bd9Sstevel@tonic-gate 
458*7c478bd9Sstevel@tonic-gate 	/* condition */
459*7c478bd9Sstevel@tonic-gate 	TRACE_MESSAGE('3', ("condition\n"));
460*7c478bd9Sstevel@tonic-gate 	place = info_header->cond_tbl_sec.place.itm_ptr;
461*7c478bd9Sstevel@tonic-gate 	for (ref = ref_first[ITMC_OBJ_COND];
462*7c478bd9Sstevel@tonic-gate 	    ref; place += ref->size, ref = ref->next) {
463*7c478bd9Sstevel@tonic-gate 		fix_itmc_ref_reloc(ref, place);
464*7c478bd9Sstevel@tonic-gate 	}
465*7c478bd9Sstevel@tonic-gate 
466*7c478bd9Sstevel@tonic-gate 	/* map */
467*7c478bd9Sstevel@tonic-gate 	TRACE_MESSAGE('3', ("map\n"));
468*7c478bd9Sstevel@tonic-gate 	place = info_header->map_tbl_sec.place.itm_ptr;
469*7c478bd9Sstevel@tonic-gate 	for (ref = ref_first[ITMC_OBJ_MAP];
470*7c478bd9Sstevel@tonic-gate 	    ref; place += ref->size, ref = ref->next) {
471*7c478bd9Sstevel@tonic-gate 		fix_itmc_ref_reloc(ref, place);
472*7c478bd9Sstevel@tonic-gate 	}
473*7c478bd9Sstevel@tonic-gate 
474*7c478bd9Sstevel@tonic-gate 	/* operation */
475*7c478bd9Sstevel@tonic-gate 	TRACE_MESSAGE('3', ("operation\n"));
476*7c478bd9Sstevel@tonic-gate 	place = info_header->op_tbl_sec.place.itm_ptr;
477*7c478bd9Sstevel@tonic-gate 	for (ref = ref_first[ITMC_OBJ_OP];
478*7c478bd9Sstevel@tonic-gate 	    ref; place += ref->size, ref = ref->next) {
479*7c478bd9Sstevel@tonic-gate 		fix_itmc_ref_reloc(ref, place);
480*7c478bd9Sstevel@tonic-gate 	}
481*7c478bd9Sstevel@tonic-gate 
482*7c478bd9Sstevel@tonic-gate 	/* range */
483*7c478bd9Sstevel@tonic-gate 	place = info_header->range_tbl_sec.place.itm_ptr;
484*7c478bd9Sstevel@tonic-gate 	for (ref = ref_first[ITMC_OBJ_RANGE];
485*7c478bd9Sstevel@tonic-gate 	    ref; place += ref->size, ref = ref->next) {
486*7c478bd9Sstevel@tonic-gate 		fix_itmc_ref_reloc(ref, place);
487*7c478bd9Sstevel@tonic-gate 	}
488*7c478bd9Sstevel@tonic-gate 
489*7c478bd9Sstevel@tonic-gate 	/* escape sequence */
490*7c478bd9Sstevel@tonic-gate 	place = info_header->escapeseq_tbl_sec.place.itm_ptr;
491*7c478bd9Sstevel@tonic-gate 	for (ref = ref_first[ITMC_OBJ_ESCAPESEQ];
492*7c478bd9Sstevel@tonic-gate 	    ref; place += ref->size, ref = ref->next) {
493*7c478bd9Sstevel@tonic-gate 		fix_itmc_ref_reloc(ref, place);
494*7c478bd9Sstevel@tonic-gate 	}
495*7c478bd9Sstevel@tonic-gate 	/* data section */
496*7c478bd9Sstevel@tonic-gate 	TRACE_MESSAGE('3', ("data section\n"));
497*7c478bd9Sstevel@tonic-gate 	place = info_header->data_sec.place.itm_ptr;
498*7c478bd9Sstevel@tonic-gate 	for (ref = ref_first[ITMC_OBJ_DATA];
499*7c478bd9Sstevel@tonic-gate 	    ref; place += ref->size, ref = ref->next) {
500*7c478bd9Sstevel@tonic-gate 		fix_itmc_ref_reloc(ref, place);
501*7c478bd9Sstevel@tonic-gate 	}
502*7c478bd9Sstevel@tonic-gate 	for (ref = ref_first[ITMC_OBJ_EXPR];
503*7c478bd9Sstevel@tonic-gate 	    ref; place += ref->size, ref = ref->next) {
504*7c478bd9Sstevel@tonic-gate 		fix_itmc_ref_reloc(ref, place);
505*7c478bd9Sstevel@tonic-gate 	}
506*7c478bd9Sstevel@tonic-gate 
507*7c478bd9Sstevel@tonic-gate 	/* name section */
508*7c478bd9Sstevel@tonic-gate 	TRACE_MESSAGE('3', ("name section\n"));
509*7c478bd9Sstevel@tonic-gate 	place = info_header->name_plc_tbl.place.itm_ptr;
510*7c478bd9Sstevel@tonic-gate 	n_plc = info_header->name_sec.place.itm_ptr;
511*7c478bd9Sstevel@tonic-gate 	for (name = name_first; name; name = name->next) {
512*7c478bd9Sstevel@tonic-gate 		if ((NULL == name->object) ||
513*7c478bd9Sstevel@tonic-gate 		    (ITMC_OBJ_REGISTER == name->type) ||
514*7c478bd9Sstevel@tonic-gate 		    (0 == name->name.size)) {
515*7c478bd9Sstevel@tonic-gate 			continue;
516*7c478bd9Sstevel@tonic-gate 		}
517*7c478bd9Sstevel@tonic-gate 		if ((sizeof (itm_place_t)) < name->name.size) {
518*7c478bd9Sstevel@tonic-gate 			name->reloc.itm_ptr = n_plc;
519*7c478bd9Sstevel@tonic-gate 			n_plc += name->name.size;
520*7c478bd9Sstevel@tonic-gate 		}
521*7c478bd9Sstevel@tonic-gate 		if (name->object->referencee) {
522*7c478bd9Sstevel@tonic-gate 			((itm_tbl_hdr_t *)(name->object->referencee))->
523*7c478bd9Sstevel@tonic-gate 			name.itm_ptr = place;
524*7c478bd9Sstevel@tonic-gate 		}
525*7c478bd9Sstevel@tonic-gate 		place += (intptr_t)(sizeof (itm_data_t));
526*7c478bd9Sstevel@tonic-gate 	}
527*7c478bd9Sstevel@tonic-gate 	place = info_header->reg_plc_tbl.place.itm_ptr;
528*7c478bd9Sstevel@tonic-gate 	for (name = name_first; name; name = name->next) {
529*7c478bd9Sstevel@tonic-gate 		if ((ITMC_OBJ_REGISTER != name->type) ||
530*7c478bd9Sstevel@tonic-gate 		    (0 == name->name.size)) {
531*7c478bd9Sstevel@tonic-gate 			continue;
532*7c478bd9Sstevel@tonic-gate 		}
533*7c478bd9Sstevel@tonic-gate 		if ((sizeof (itm_place_t)) < name->name.size) {
534*7c478bd9Sstevel@tonic-gate #if !defined(_LP64)
535*7c478bd9Sstevel@tonic-gate 			name->reloc.itm_pad = 0;
536*7c478bd9Sstevel@tonic-gate #endif
537*7c478bd9Sstevel@tonic-gate 			name->reloc.itm_ptr = n_plc;
538*7c478bd9Sstevel@tonic-gate 			n_plc += name->name.size;
539*7c478bd9Sstevel@tonic-gate 		}
540*7c478bd9Sstevel@tonic-gate 		place += (sizeof (itm_data_t));
541*7c478bd9Sstevel@tonic-gate 	}
542*7c478bd9Sstevel@tonic-gate 	for (name = name_first; name; name = name->next) {
543*7c478bd9Sstevel@tonic-gate 		if (ITMC_OBJ_REGISTER == name->type) {
544*7c478bd9Sstevel@tonic-gate 			assert(NULL == name->object);
545*7c478bd9Sstevel@tonic-gate 			continue;
546*7c478bd9Sstevel@tonic-gate 		}
547*7c478bd9Sstevel@tonic-gate 		if (NULL == name->object) {
548*7c478bd9Sstevel@tonic-gate 			itm_error(
549*7c478bd9Sstevel@tonic-gate 			gettext(
550*7c478bd9Sstevel@tonic-gate 			"reference to %1$s \"%2$s\" is not resolved\n"),
551*7c478bd9Sstevel@tonic-gate 			itm_name_type_name[name->type],
552*7c478bd9Sstevel@tonic-gate 			name_to_str(&(name->name)));
553*7c478bd9Sstevel@tonic-gate 			error_deferred += 1;
554*7c478bd9Sstevel@tonic-gate 			continue;
555*7c478bd9Sstevel@tonic-gate 		} /* else */
556*7c478bd9Sstevel@tonic-gate 		assert(0 != name->name.size);
557*7c478bd9Sstevel@tonic-gate 		for (rl = name->ref_first; rl; rl = rl->next) {
558*7c478bd9Sstevel@tonic-gate 			fix_itmc_ref_reloc(rl->ref,
559*7c478bd9Sstevel@tonic-gate 					name->object->reloc.itm_ptr);
560*7c478bd9Sstevel@tonic-gate 		}
561*7c478bd9Sstevel@tonic-gate 		if (NULL == name->object->referencee) {
562*7c478bd9Sstevel@tonic-gate 			itm_error(
563*7c478bd9Sstevel@tonic-gate 				gettext(
564*7c478bd9Sstevel@tonic-gate 				"reference to %1$s \"%2$s\" is not resolved\n"),
565*7c478bd9Sstevel@tonic-gate 				itm_name_type_name[name->type],
566*7c478bd9Sstevel@tonic-gate 				name_to_str(&(name->name)));
567*7c478bd9Sstevel@tonic-gate 			error_deferred += 1;
568*7c478bd9Sstevel@tonic-gate 		}
569*7c478bd9Sstevel@tonic-gate 		if (((ITMC_OBJ_REGISTER != name->type) &&
570*7c478bd9Sstevel@tonic-gate 		    (ITMC_OBJ_DIREC != name->type) &&
571*7c478bd9Sstevel@tonic-gate 		    ((ITMC_OBJ_MAP != name->type) ||
572*7c478bd9Sstevel@tonic-gate 		    (NULL != ref_first[ITMC_OBJ_DIREC]))) &&
573*7c478bd9Sstevel@tonic-gate 		    (NULL == name->ref_first)) {
574*7c478bd9Sstevel@tonic-gate 			itm_error(
575*7c478bd9Sstevel@tonic-gate 				gettext(
576*7c478bd9Sstevel@tonic-gate 				"%1$s \"%2$s\" is defined, but not referred\n"),
577*7c478bd9Sstevel@tonic-gate 					itm_name_type_name[name->type],
578*7c478bd9Sstevel@tonic-gate 					name_to_str(&(name->name)));
579*7c478bd9Sstevel@tonic-gate 				error_deferred += 1;
580*7c478bd9Sstevel@tonic-gate 		}
581*7c478bd9Sstevel@tonic-gate 	}
582*7c478bd9Sstevel@tonic-gate 
583*7c478bd9Sstevel@tonic-gate 
584*7c478bd9Sstevel@tonic-gate 	/*
585*7c478bd9Sstevel@tonic-gate 	 * initial direction table
586*7c478bd9Sstevel@tonic-gate 	 */
587*7c478bd9Sstevel@tonic-gate 	TRACE_MESSAGE('3', ("initial direction table\n"));
588*7c478bd9Sstevel@tonic-gate 	if (NULL != ref_first[ITMC_OBJ_DIREC]) {
589*7c478bd9Sstevel@tonic-gate 		itm_header->direc_init_tbl = ref_first[ITMC_OBJ_DIREC]->reloc;
590*7c478bd9Sstevel@tonic-gate 	} else if (NULL != ref_first[ITMC_OBJ_MAP]) {
591*7c478bd9Sstevel@tonic-gate 		itm_header->direc_init_tbl = ref_first[ITMC_OBJ_MAP]->reloc;
592*7c478bd9Sstevel@tonic-gate 	} else {
593*7c478bd9Sstevel@tonic-gate 		itm_error(gettext("No direction nor map\n"));
594*7c478bd9Sstevel@tonic-gate 		exit(ITMC_STATUS_BT);
595*7c478bd9Sstevel@tonic-gate 	}
596*7c478bd9Sstevel@tonic-gate 
597*7c478bd9Sstevel@tonic-gate 	/*
598*7c478bd9Sstevel@tonic-gate 	 * init operation and reset operation
599*7c478bd9Sstevel@tonic-gate 	 */
600*7c478bd9Sstevel@tonic-gate 	for (ref = ref_first[ITMC_OBJ_OP];
601*7c478bd9Sstevel@tonic-gate 	    ref; place += ref->size, ref = ref->next) {
602*7c478bd9Sstevel@tonic-gate 		switch (((itm_tbl_hdr_t *)(ref->referencee))->type) {
603*7c478bd9Sstevel@tonic-gate 		case ITM_TBL_OP_INIT:
604*7c478bd9Sstevel@tonic-gate 			itm_header->op_init_tbl = ref->reloc;
605*7c478bd9Sstevel@tonic-gate 			break;
606*7c478bd9Sstevel@tonic-gate 		case ITM_TBL_OP_RESET:
607*7c478bd9Sstevel@tonic-gate 			itm_header->op_reset_tbl = ref->reloc;
608*7c478bd9Sstevel@tonic-gate 			break;
609*7c478bd9Sstevel@tonic-gate 		default:
610*7c478bd9Sstevel@tonic-gate 			break;
611*7c478bd9Sstevel@tonic-gate 		}
612*7c478bd9Sstevel@tonic-gate 	}
613*7c478bd9Sstevel@tonic-gate }
614*7c478bd9Sstevel@tonic-gate 
615*7c478bd9Sstevel@tonic-gate 
616*7c478bd9Sstevel@tonic-gate /*
617*7c478bd9Sstevel@tonic-gate  * Fix reloc and referencer
618*7c478bd9Sstevel@tonic-gate  */
619*7c478bd9Sstevel@tonic-gate static void
620*7c478bd9Sstevel@tonic-gate fix_itmc_ref_reloc(itmc_ref_t	*ref, itm_place2_t place)
621*7c478bd9Sstevel@tonic-gate {
622*7c478bd9Sstevel@tonic-gate 	itmc_ref_link_t		*rl;
623*7c478bd9Sstevel@tonic-gate 
624*7c478bd9Sstevel@tonic-gate 	ref->reloc.itm_ptr = place;
625*7c478bd9Sstevel@tonic-gate #if !defined(_LP64)
626*7c478bd9Sstevel@tonic-gate 	ref->reloc.itm_pad = 0;
627*7c478bd9Sstevel@tonic-gate #endif
628*7c478bd9Sstevel@tonic-gate 
629*7c478bd9Sstevel@tonic-gate 	if (NULL != ref->referencer) {
630*7c478bd9Sstevel@tonic-gate 		ref->referencer->itm_ptr = place;
631*7c478bd9Sstevel@tonic-gate 	}
632*7c478bd9Sstevel@tonic-gate 
633*7c478bd9Sstevel@tonic-gate 	TRACE_MESSAGE('f', ("fix_itmc_ref_reloc: 0x%08p 0x%08p %p\n",
634*7c478bd9Sstevel@tonic-gate 			ref, ref->referencer, place));
635*7c478bd9Sstevel@tonic-gate 	TRACE_MESSAGE('F', ("fix_itmc_ref_reloc: \"%s\"\n",
636*7c478bd9Sstevel@tonic-gate 			name_to_str(ref->name ? &(ref->name->name) : NULL)));
637*7c478bd9Sstevel@tonic-gate 
638*7c478bd9Sstevel@tonic-gate 	if (NULL != ref->name) {
639*7c478bd9Sstevel@tonic-gate 		for (rl = ref->name->ref_first; rl; rl = rl->next) {
640*7c478bd9Sstevel@tonic-gate 			if ((NULL != rl->ref) &&
641*7c478bd9Sstevel@tonic-gate 			    (NULL != rl->ref->referencer)) {
642*7c478bd9Sstevel@tonic-gate 				rl->ref->referencer->itm_ptr = place;
643*7c478bd9Sstevel@tonic-gate 				TRACE_MESSAGE('f',
644*7c478bd9Sstevel@tonic-gate 						("fix_itmc_ref_reloc: "
645*7c478bd9Sstevel@tonic-gate 						"0x%08p 0x%08p\n",
646*7c478bd9Sstevel@tonic-gate 						rl->ref, rl->ref->referencer));
647*7c478bd9Sstevel@tonic-gate 				TRACE_MESSAGE('F',
648*7c478bd9Sstevel@tonic-gate 						("fix_itmc_ref_reloc: \"%s\"\n",
649*7c478bd9Sstevel@tonic-gate 						name_to_str(ref->name ?
650*7c478bd9Sstevel@tonic-gate 							&(ref->name->name) :
651*7c478bd9Sstevel@tonic-gate 							NULL)));
652*7c478bd9Sstevel@tonic-gate 			}
653*7c478bd9Sstevel@tonic-gate 		}
654*7c478bd9Sstevel@tonic-gate 	}
655*7c478bd9Sstevel@tonic-gate }
656*7c478bd9Sstevel@tonic-gate 
657*7c478bd9Sstevel@tonic-gate /*
658*7c478bd9Sstevel@tonic-gate  * Analysis
659*7c478bd9Sstevel@tonic-gate  */
660*7c478bd9Sstevel@tonic-gate static void
661*7c478bd9Sstevel@tonic-gate analysis(itm_info_hdr_t	*info_header)
662*7c478bd9Sstevel@tonic-gate {
663*7c478bd9Sstevel@tonic-gate 	itmc_ref_t	*ref;
664*7c478bd9Sstevel@tonic-gate 	itm_place2_t	place;
665*7c478bd9Sstevel@tonic-gate 	itm_type_t	obj_type;
666*7c478bd9Sstevel@tonic-gate 	enum { ONEMAP, ZEROMAP}	onemap = ZEROMAP;
667*7c478bd9Sstevel@tonic-gate 
668*7c478bd9Sstevel@tonic-gate 	TRACE_MESSAGE('4', ("Analysis\n"));
669*7c478bd9Sstevel@tonic-gate 
670*7c478bd9Sstevel@tonic-gate 	place = info_header->str_sec.place.itm_ptr;
671*7c478bd9Sstevel@tonic-gate 	for (obj_type = ITMC_OBJ_FIRST; obj_type <= ITMC_OBJ_LAST; obj_type++) {
672*7c478bd9Sstevel@tonic-gate 		if (ITMC_OBJ_DIREC == obj_type) {
673*7c478bd9Sstevel@tonic-gate 			continue;
674*7c478bd9Sstevel@tonic-gate 		}
675*7c478bd9Sstevel@tonic-gate 
676*7c478bd9Sstevel@tonic-gate 		for (ref = ref_first[obj_type];
677*7c478bd9Sstevel@tonic-gate 		    ref; place += ref->size, ref = ref->next) {
678*7c478bd9Sstevel@tonic-gate 			if ((NULL == ref->name) &&
679*7c478bd9Sstevel@tonic-gate 			    (NULL == ref->referencer)) {
680*7c478bd9Sstevel@tonic-gate 				itm_tbl_hdr_t	*tbl_hdr;
681*7c478bd9Sstevel@tonic-gate 				char		*tbl_type;
682*7c478bd9Sstevel@tonic-gate 				tbl_hdr = (itm_tbl_hdr_t *)(ref->referencee);
683*7c478bd9Sstevel@tonic-gate 				if ((ITM_TBL_OP_RESET == tbl_hdr->type) ||
684*7c478bd9Sstevel@tonic-gate 				    (ITM_TBL_OP_INIT == tbl_hdr->type)) {
685*7c478bd9Sstevel@tonic-gate 					continue;
686*7c478bd9Sstevel@tonic-gate 				} else if ((ITM_TBL_MAP ==
687*7c478bd9Sstevel@tonic-gate 					(ITM_TBL_MASK & tbl_hdr->type)) &&
688*7c478bd9Sstevel@tonic-gate 					(NULL == ref_first[ITMC_OBJ_DIREC])) {
689*7c478bd9Sstevel@tonic-gate 					if (ZEROMAP == onemap) {
690*7c478bd9Sstevel@tonic-gate 						onemap = ONEMAP;
691*7c478bd9Sstevel@tonic-gate 						continue;
692*7c478bd9Sstevel@tonic-gate 					} else {
693*7c478bd9Sstevel@tonic-gate 						itm_error(
694*7c478bd9Sstevel@tonic-gate 						gettext("multiple unamed map's "
695*7c478bd9Sstevel@tonic-gate 							"defined\n"));
696*7c478bd9Sstevel@tonic-gate 						error_deferred += 1;
697*7c478bd9Sstevel@tonic-gate 						continue;
698*7c478bd9Sstevel@tonic-gate 					}
699*7c478bd9Sstevel@tonic-gate 				}
700*7c478bd9Sstevel@tonic-gate 				switch (ITM_TBL_MASK & tbl_hdr->type) {
701*7c478bd9Sstevel@tonic-gate 				case ITM_TBL_ITM:
702*7c478bd9Sstevel@tonic-gate 					tbl_type =
703*7c478bd9Sstevel@tonic-gate 					itm_name_type_name[ITMC_OBJ_ITM];
704*7c478bd9Sstevel@tonic-gate 					break;
705*7c478bd9Sstevel@tonic-gate 				case ITM_TBL_DIREC:
706*7c478bd9Sstevel@tonic-gate 					tbl_type =
707*7c478bd9Sstevel@tonic-gate 					itm_name_type_name[ITMC_OBJ_DIREC];
708*7c478bd9Sstevel@tonic-gate 					break;
709*7c478bd9Sstevel@tonic-gate 				case ITM_TBL_COND:
710*7c478bd9Sstevel@tonic-gate 					tbl_type =
711*7c478bd9Sstevel@tonic-gate 					itm_name_type_name[ITMC_OBJ_COND];
712*7c478bd9Sstevel@tonic-gate 					break;
713*7c478bd9Sstevel@tonic-gate 				case ITM_TBL_OP:
714*7c478bd9Sstevel@tonic-gate 					tbl_type =
715*7c478bd9Sstevel@tonic-gate 					itm_name_type_name[ITMC_OBJ_OP];
716*7c478bd9Sstevel@tonic-gate 					break;
717*7c478bd9Sstevel@tonic-gate 				case ITM_TBL_MAP:
718*7c478bd9Sstevel@tonic-gate 					tbl_type =
719*7c478bd9Sstevel@tonic-gate 					itm_name_type_name[ITMC_OBJ_MAP];
720*7c478bd9Sstevel@tonic-gate 					break;
721*7c478bd9Sstevel@tonic-gate 				case ITM_TBL_RANGE:
722*7c478bd9Sstevel@tonic-gate 					tbl_type =
723*7c478bd9Sstevel@tonic-gate 					itm_name_type_name[ITMC_OBJ_RANGE];
724*7c478bd9Sstevel@tonic-gate 					break;
725*7c478bd9Sstevel@tonic-gate 				case ITM_TBL_ESCAPESEQ:
726*7c478bd9Sstevel@tonic-gate 					tbl_type =
727*7c478bd9Sstevel@tonic-gate 					itm_name_type_name[ITMC_OBJ_ESCAPESEQ];
728*7c478bd9Sstevel@tonic-gate 					break;
729*7c478bd9Sstevel@tonic-gate 				default:
730*7c478bd9Sstevel@tonic-gate 					tbl_type =
731*7c478bd9Sstevel@tonic-gate 					itm_name_type_name[ITMC_OBJ_NONE];
732*7c478bd9Sstevel@tonic-gate 					break;
733*7c478bd9Sstevel@tonic-gate 				}
734*7c478bd9Sstevel@tonic-gate 				itm_error(
735*7c478bd9Sstevel@tonic-gate 					gettext("unnamed %1$s-type object is "
736*7c478bd9Sstevel@tonic-gate 					"defined, but not referenced\n"),
737*7c478bd9Sstevel@tonic-gate 					tbl_type);
738*7c478bd9Sstevel@tonic-gate 				error_deferred += 1;
739*7c478bd9Sstevel@tonic-gate 			}
740*7c478bd9Sstevel@tonic-gate 		}
741*7c478bd9Sstevel@tonic-gate 	}
742*7c478bd9Sstevel@tonic-gate }
743*7c478bd9Sstevel@tonic-gate 
744*7c478bd9Sstevel@tonic-gate /*
745*7c478bd9Sstevel@tonic-gate  * Analysis2 (check #nest of operation)
746*7c478bd9Sstevel@tonic-gate  */
747*7c478bd9Sstevel@tonic-gate #define	NIL -1
748*7c478bd9Sstevel@tonic-gate static void
749*7c478bd9Sstevel@tonic-gate analysis2(void)
750*7c478bd9Sstevel@tonic-gate {
751*7c478bd9Sstevel@tonic-gate 	int			i, j, k, n_op;
752*7c478bd9Sstevel@tonic-gate 	itmc_ref_t		*ref;
753*7c478bd9Sstevel@tonic-gate 	itm_op_outer_t		*o, *o_prev;
754*7c478bd9Sstevel@tonic-gate 	itm_op_inner_t		*in, *in_prev;
755*7c478bd9Sstevel@tonic-gate 	int			indegree_zero;
756*7c478bd9Sstevel@tonic-gate 	struct op_nest_vertex {
757*7c478bd9Sstevel@tonic-gate 		itmc_ref_t	*ref; /* corresponding object's ref */
758*7c478bd9Sstevel@tonic-gate 		int		indegree; /* indegree */
759*7c478bd9Sstevel@tonic-gate 		struct op_nest_edge *e; /* link of edge list */
760*7c478bd9Sstevel@tonic-gate 		int		z_link; /* index of indegree zero */
761*7c478bd9Sstevel@tonic-gate 		int		n_nest;
762*7c478bd9Sstevel@tonic-gate 	};
763*7c478bd9Sstevel@tonic-gate 	struct op_nest_edge {
764*7c478bd9Sstevel@tonic-gate 		struct op_nest_edge *e; /* link of edge list */
765*7c478bd9Sstevel@tonic-gate 		int		index;	/* index of edge */
766*7c478bd9Sstevel@tonic-gate 	};
767*7c478bd9Sstevel@tonic-gate 	struct op_nest_vertex	*vertexes;
768*7c478bd9Sstevel@tonic-gate 	struct op_nest_edge	*e, *e_prev;
769*7c478bd9Sstevel@tonic-gate 
770*7c478bd9Sstevel@tonic-gate 	TRACE_MESSAGE('5', ("Analysis2\n"));
771*7c478bd9Sstevel@tonic-gate 
772*7c478bd9Sstevel@tonic-gate #ifdef ENABLE_TRACE
773*7c478bd9Sstevel@tonic-gate 	for (o = itm_op_outer; o != NULL; o = o->link) {
774*7c478bd9Sstevel@tonic-gate 		TRACE_MESSAGE('L', ("op(table)%x\n", o->optbl));
775*7c478bd9Sstevel@tonic-gate 	}
776*7c478bd9Sstevel@tonic-gate #endif
777*7c478bd9Sstevel@tonic-gate 	i = 0;
778*7c478bd9Sstevel@tonic-gate 	for (o = itm_op_outer; o != NULL; o = o->link) {
779*7c478bd9Sstevel@tonic-gate 		for (ref = ref_first[ITMC_OBJ_OP]; ref != NULL;
780*7c478bd9Sstevel@tonic-gate 			ref = ref->next) {
781*7c478bd9Sstevel@tonic-gate 			if (o->optbl == ref->referencee) {
782*7c478bd9Sstevel@tonic-gate 				if (ref->name != NULL) {
783*7c478bd9Sstevel@tonic-gate 					o->ref = ref->name->object;
784*7c478bd9Sstevel@tonic-gate 				} else {
785*7c478bd9Sstevel@tonic-gate 					o->ref = ref;
786*7c478bd9Sstevel@tonic-gate 				}
787*7c478bd9Sstevel@tonic-gate 				TRACE_MESSAGE('l', ("op(table)%x<-ref(%x)\n",
788*7c478bd9Sstevel@tonic-gate 					o->optbl, o->ref));
789*7c478bd9Sstevel@tonic-gate 				o->ref->vertex_index = i;
790*7c478bd9Sstevel@tonic-gate 				i++;
791*7c478bd9Sstevel@tonic-gate 				break;
792*7c478bd9Sstevel@tonic-gate 			}
793*7c478bd9Sstevel@tonic-gate 		}
794*7c478bd9Sstevel@tonic-gate 	}
795*7c478bd9Sstevel@tonic-gate 
796*7c478bd9Sstevel@tonic-gate 	n_op = i;
797*7c478bd9Sstevel@tonic-gate 	if (n_op == 0)
798*7c478bd9Sstevel@tonic-gate 		return;
799*7c478bd9Sstevel@tonic-gate 	vertexes = (struct op_nest_vertex *)(malloc_vital(
800*7c478bd9Sstevel@tonic-gate 		sizeof (struct op_nest_vertex) * n_op));
801*7c478bd9Sstevel@tonic-gate 
802*7c478bd9Sstevel@tonic-gate 	for (o = itm_op_outer; o != NULL; o = o->link) {
803*7c478bd9Sstevel@tonic-gate 		if (o->ref == NULL) {
804*7c478bd9Sstevel@tonic-gate 			continue;
805*7c478bd9Sstevel@tonic-gate 		}
806*7c478bd9Sstevel@tonic-gate 		vertexes[o->ref->vertex_index].ref = o->ref;
807*7c478bd9Sstevel@tonic-gate 		vertexes[o->ref->vertex_index].e = NULL;
808*7c478bd9Sstevel@tonic-gate 	}
809*7c478bd9Sstevel@tonic-gate 
810*7c478bd9Sstevel@tonic-gate 	for (o = itm_op_outer; o != NULL; o_prev = o,
811*7c478bd9Sstevel@tonic-gate 		o = o->link, free(o_prev)) {
812*7c478bd9Sstevel@tonic-gate 		if (o->ref == NULL) {
813*7c478bd9Sstevel@tonic-gate 			continue;
814*7c478bd9Sstevel@tonic-gate 		}
815*7c478bd9Sstevel@tonic-gate 		TRACE_MESSAGE('l', ("vertexes[%d].ref=%x (optbl=%x(%s))\n",
816*7c478bd9Sstevel@tonic-gate 			o->ref->vertex_index, o->ref, o->ref->referencee,
817*7c478bd9Sstevel@tonic-gate 			name_to_str(o->ref->name == NULL ? NULL :
818*7c478bd9Sstevel@tonic-gate 			&(o->ref->name->name))));
819*7c478bd9Sstevel@tonic-gate 		for (in = o->in; in != NULL;
820*7c478bd9Sstevel@tonic-gate 			in_prev = in, in = in->in, free(in_prev)) {
821*7c478bd9Sstevel@tonic-gate 			/* make edge */
822*7c478bd9Sstevel@tonic-gate 			i = o->ref->vertex_index;
823*7c478bd9Sstevel@tonic-gate 			j = in->ref->name->object->vertex_index;
824*7c478bd9Sstevel@tonic-gate 			e = malloc_vital(sizeof (struct op_nest_edge));
825*7c478bd9Sstevel@tonic-gate 			e->index = j;
826*7c478bd9Sstevel@tonic-gate 			e->e = vertexes[i].e;
827*7c478bd9Sstevel@tonic-gate 			vertexes[i].e = e;
828*7c478bd9Sstevel@tonic-gate 			vertexes[j].indegree++;
829*7c478bd9Sstevel@tonic-gate 			TRACE_MESSAGE('l',
830*7c478bd9Sstevel@tonic-gate 				(" edge: vertexes[%d]:(%s) ->vertex[%d]:(%s)\n",
831*7c478bd9Sstevel@tonic-gate 				i,
832*7c478bd9Sstevel@tonic-gate 				name_to_str(
833*7c478bd9Sstevel@tonic-gate 				(vertexes[i].ref->name == NULL) ? NULL :
834*7c478bd9Sstevel@tonic-gate 				&(vertexes[i].ref->name->name)),
835*7c478bd9Sstevel@tonic-gate 				j,
836*7c478bd9Sstevel@tonic-gate 				name_to_str(
837*7c478bd9Sstevel@tonic-gate 				(vertexes[j].ref->name == NULL) ? NULL :
838*7c478bd9Sstevel@tonic-gate 				&(vertexes[j].ref->name->name))));
839*7c478bd9Sstevel@tonic-gate 		}
840*7c478bd9Sstevel@tonic-gate 	}
841*7c478bd9Sstevel@tonic-gate 
842*7c478bd9Sstevel@tonic-gate 	indegree_zero = NIL;
843*7c478bd9Sstevel@tonic-gate 	for (i = 0; i < n_op; i++) {
844*7c478bd9Sstevel@tonic-gate 		if (vertexes[i].indegree == 0) {
845*7c478bd9Sstevel@tonic-gate 			vertexes[i].z_link = indegree_zero;
846*7c478bd9Sstevel@tonic-gate 			indegree_zero = i;
847*7c478bd9Sstevel@tonic-gate 		}
848*7c478bd9Sstevel@tonic-gate 	}
849*7c478bd9Sstevel@tonic-gate 
850*7c478bd9Sstevel@tonic-gate 	for (i = 0; i < n_op; i++) {
851*7c478bd9Sstevel@tonic-gate 		if (indegree_zero == NIL) {
852*7c478bd9Sstevel@tonic-gate 			itm_error(
853*7c478bd9Sstevel@tonic-gate 				gettext("operation loop detected\n"));
854*7c478bd9Sstevel@tonic-gate 			exit(ITMC_STATUS_BT2);
855*7c478bd9Sstevel@tonic-gate 		}
856*7c478bd9Sstevel@tonic-gate 		k = indegree_zero;
857*7c478bd9Sstevel@tonic-gate 		indegree_zero = vertexes[indegree_zero].z_link;
858*7c478bd9Sstevel@tonic-gate 
859*7c478bd9Sstevel@tonic-gate 		if (vertexes[k].n_nest > MAXOPNEST) {
860*7c478bd9Sstevel@tonic-gate 			itm_error(
861*7c478bd9Sstevel@tonic-gate 				gettext("operation nested more than %d\n"),
862*7c478bd9Sstevel@tonic-gate 				MAXOPNEST);
863*7c478bd9Sstevel@tonic-gate 			exit(ITMC_STATUS_BT2);
864*7c478bd9Sstevel@tonic-gate 		}
865*7c478bd9Sstevel@tonic-gate 		TRACE_MESSAGE('l',
866*7c478bd9Sstevel@tonic-gate 			("take out first vertex: vertexes[%d] (i.e.%s) "
867*7c478bd9Sstevel@tonic-gate 			"#depth=%d\n", k, name_to_str(
868*7c478bd9Sstevel@tonic-gate 			(vertexes[k].ref->name == NULL) ? NULL :
869*7c478bd9Sstevel@tonic-gate 			&(vertexes[k].ref->name->name)),
870*7c478bd9Sstevel@tonic-gate 			vertexes[k].n_nest));
871*7c478bd9Sstevel@tonic-gate 
872*7c478bd9Sstevel@tonic-gate 		for (e = vertexes[k].e; e != NULL;
873*7c478bd9Sstevel@tonic-gate 			e_prev = e, e = e->e, free(e_prev)) {
874*7c478bd9Sstevel@tonic-gate 			j = e->index;
875*7c478bd9Sstevel@tonic-gate 			if (vertexes[j].n_nest < vertexes[k].n_nest + 1) {
876*7c478bd9Sstevel@tonic-gate 				vertexes[j].n_nest =
877*7c478bd9Sstevel@tonic-gate 					vertexes[k].n_nest + 1;
878*7c478bd9Sstevel@tonic-gate 			}
879*7c478bd9Sstevel@tonic-gate 			TRACE_MESSAGE('l', ("	+->vertexes[%d]:(%s) "
880*7c478bd9Sstevel@tonic-gate 				"(#indegree=%d,#depth = %d)\n",
881*7c478bd9Sstevel@tonic-gate 				j, name_to_str(&(vertexes[j].ref->name->name)),
882*7c478bd9Sstevel@tonic-gate 				vertexes[j].indegree, vertexes[j].n_nest));
883*7c478bd9Sstevel@tonic-gate 			vertexes[j].indegree--;
884*7c478bd9Sstevel@tonic-gate 			if (vertexes[j].indegree == 0) {
885*7c478bd9Sstevel@tonic-gate 				vertexes[j].z_link = indegree_zero;
886*7c478bd9Sstevel@tonic-gate 				indegree_zero = j;
887*7c478bd9Sstevel@tonic-gate 			}
888*7c478bd9Sstevel@tonic-gate 		}
889*7c478bd9Sstevel@tonic-gate 	}
890*7c478bd9Sstevel@tonic-gate 	free(vertexes);
891*7c478bd9Sstevel@tonic-gate }
892*7c478bd9Sstevel@tonic-gate #undef NIL
893*7c478bd9Sstevel@tonic-gate 
894*7c478bd9Sstevel@tonic-gate /*
895*7c478bd9Sstevel@tonic-gate  * Output ITM compiled data
896*7c478bd9Sstevel@tonic-gate  */
897*7c478bd9Sstevel@tonic-gate void
898*7c478bd9Sstevel@tonic-gate output(itm_hdr_t	*itm_header, itm_info_hdr_t	*info_header)
899*7c478bd9Sstevel@tonic-gate {
900*7c478bd9Sstevel@tonic-gate 	itmc_ref_t	*ref;
901*7c478bd9Sstevel@tonic-gate 	itmc_name_t	*name;
902*7c478bd9Sstevel@tonic-gate 	itm_size_t	sec_size;
903*7c478bd9Sstevel@tonic-gate 	struct stat	st_buf;
904*7c478bd9Sstevel@tonic-gate 	int		fd;
905*7c478bd9Sstevel@tonic-gate 	FILE		*fp;
906*7c478bd9Sstevel@tonic-gate 
907*7c478bd9Sstevel@tonic-gate 	if (cmd_opt.no_output) {
908*7c478bd9Sstevel@tonic-gate 		return;
909*7c478bd9Sstevel@tonic-gate 	} else if (NULL == itm_output_file) {
910*7c478bd9Sstevel@tonic-gate 		fd = 1;
911*7c478bd9Sstevel@tonic-gate 		TRACE_MESSAGE('o', ("file=(stdout)\n"));
912*7c478bd9Sstevel@tonic-gate 	} else {
913*7c478bd9Sstevel@tonic-gate 		TRACE_MESSAGE('o', ("file=%s\n", itm_output_file));
914*7c478bd9Sstevel@tonic-gate 		switch (stat(itm_output_file, &st_buf)) {
915*7c478bd9Sstevel@tonic-gate 		case 0:
916*7c478bd9Sstevel@tonic-gate 			if (0 == cmd_opt.force_overwrite) {
917*7c478bd9Sstevel@tonic-gate 				itm_error(
918*7c478bd9Sstevel@tonic-gate 					gettext("target file exists\n"));
919*7c478bd9Sstevel@tonic-gate 				exit(ITMC_STATUS_CMD2);
920*7c478bd9Sstevel@tonic-gate 			}
921*7c478bd9Sstevel@tonic-gate 			break;
922*7c478bd9Sstevel@tonic-gate 		case -1:
923*7c478bd9Sstevel@tonic-gate 			if (ENOENT != errno) {
924*7c478bd9Sstevel@tonic-gate 				PERROR(gettext("stat"));
925*7c478bd9Sstevel@tonic-gate 				exit(ITMC_STATUS_CMD2);
926*7c478bd9Sstevel@tonic-gate 			}
927*7c478bd9Sstevel@tonic-gate 			break;
928*7c478bd9Sstevel@tonic-gate 		default:
929*7c478bd9Sstevel@tonic-gate 			PERROR(gettext("stat"));
930*7c478bd9Sstevel@tonic-gate 			exit(ITMC_STATUS_SYS);
931*7c478bd9Sstevel@tonic-gate 			break;
932*7c478bd9Sstevel@tonic-gate 		}
933*7c478bd9Sstevel@tonic-gate 
934*7c478bd9Sstevel@tonic-gate 		fd = open(itm_output_file, O_CREAT|O_WRONLY|O_TRUNC, 0666);
935*7c478bd9Sstevel@tonic-gate 		if (fd == -1) {
936*7c478bd9Sstevel@tonic-gate 			PERROR(gettext("open"));
937*7c478bd9Sstevel@tonic-gate 			exit(ITMC_STATUS_SYS);
938*7c478bd9Sstevel@tonic-gate 		}
939*7c478bd9Sstevel@tonic-gate 	}
940*7c478bd9Sstevel@tonic-gate 	fp = fdopen(fd, "w");
941*7c478bd9Sstevel@tonic-gate 	if (NULL == fp) {
942*7c478bd9Sstevel@tonic-gate 		PERROR(gettext("fdopen"));
943*7c478bd9Sstevel@tonic-gate 		exit(ITMC_STATUS_SYS);
944*7c478bd9Sstevel@tonic-gate 	}
945*7c478bd9Sstevel@tonic-gate 
946*7c478bd9Sstevel@tonic-gate 	if (1 == cmd_opt.strip) {
947*7c478bd9Sstevel@tonic-gate 		itm_header->info_hdr.itm_ptr = 0;
948*7c478bd9Sstevel@tonic-gate 	}
949*7c478bd9Sstevel@tonic-gate 
950*7c478bd9Sstevel@tonic-gate 	/* ITM header */
951*7c478bd9Sstevel@tonic-gate 	(void) fseek(fp, 0, SEEK_SET);
952*7c478bd9Sstevel@tonic-gate 	(void) fwrite(itm_header, sizeof (itm_hdr_t), 1, fp);
953*7c478bd9Sstevel@tonic-gate 
954*7c478bd9Sstevel@tonic-gate 	/* string section */
955*7c478bd9Sstevel@tonic-gate 	(void) fseek(fp, info_header->str_sec.place.itm_ptr, SEEK_SET);
956*7c478bd9Sstevel@tonic-gate 	TRACE_MESSAGE('P', ("str_sec.place.place=%p:\n",
957*7c478bd9Sstevel@tonic-gate 		info_header->str_sec.place.itm_ptr));
958*7c478bd9Sstevel@tonic-gate 	for (ref = ref_first[ITMC_OBJ_STRING]; ref; ref = ref->next) {
959*7c478bd9Sstevel@tonic-gate 		(void) fwrite((void *)(ref->referencee), 1, ref->size, fp);
960*7c478bd9Sstevel@tonic-gate 	}
961*7c478bd9Sstevel@tonic-gate 
962*7c478bd9Sstevel@tonic-gate 	/* direction */
963*7c478bd9Sstevel@tonic-gate 	(void) fseek(fp, info_header->direc_tbl_sec.place.itm_ptr, SEEK_SET);
964*7c478bd9Sstevel@tonic-gate 	TRACE_MESSAGE('P', ("direc_tbl_sec.place=%p:\n",
965*7c478bd9Sstevel@tonic-gate 		info_header->direc_tbl_sec.place.itm_ptr));
966*7c478bd9Sstevel@tonic-gate 	for (ref = ref_first[ITMC_OBJ_DIREC]; ref; ref = ref->next) {
967*7c478bd9Sstevel@tonic-gate 		(void) fwrite((void *)(ref->referencee), ref->size, 1, fp);
968*7c478bd9Sstevel@tonic-gate 	}
969*7c478bd9Sstevel@tonic-gate 
970*7c478bd9Sstevel@tonic-gate 	/* condition */
971*7c478bd9Sstevel@tonic-gate 	(void) fseek(fp, info_header->cond_tbl_sec.place.itm_ptr, SEEK_SET);
972*7c478bd9Sstevel@tonic-gate 	TRACE_MESSAGE('P', ("cond_tbl_sec.place=%p:\n",
973*7c478bd9Sstevel@tonic-gate 		info_header->cond_tbl_sec.place.itm_ptr));
974*7c478bd9Sstevel@tonic-gate 	for (ref = ref_first[ITMC_OBJ_COND]; ref; ref = ref->next) {
975*7c478bd9Sstevel@tonic-gate 		(void) fwrite((void *)(ref->referencee), ref->size, 1, fp);
976*7c478bd9Sstevel@tonic-gate 	}
977*7c478bd9Sstevel@tonic-gate 
978*7c478bd9Sstevel@tonic-gate 	/* map */
979*7c478bd9Sstevel@tonic-gate 	(void) fseek(fp, info_header->map_tbl_sec.place.itm_ptr, SEEK_SET);
980*7c478bd9Sstevel@tonic-gate 	TRACE_MESSAGE('P', ("map_tbl_sec.place=%p:\n",
981*7c478bd9Sstevel@tonic-gate 		info_header->map_tbl_sec.place.itm_ptr));
982*7c478bd9Sstevel@tonic-gate 	for (ref = ref_first[ITMC_OBJ_MAP]; ref; ref = ref->next) {
983*7c478bd9Sstevel@tonic-gate 		(void) fwrite((void *)(ref->referencee), ref->size, 1, fp);
984*7c478bd9Sstevel@tonic-gate 	}
985*7c478bd9Sstevel@tonic-gate 
986*7c478bd9Sstevel@tonic-gate 	/* operation */
987*7c478bd9Sstevel@tonic-gate 	(void) fseek(fp, info_header->op_tbl_sec.place.itm_ptr, SEEK_SET);
988*7c478bd9Sstevel@tonic-gate 	TRACE_MESSAGE('P', ("op_tbl_sec.place=%p:\n",
989*7c478bd9Sstevel@tonic-gate 		info_header->op_tbl_sec.place.itm_ptr));
990*7c478bd9Sstevel@tonic-gate 	for (ref = ref_first[ITMC_OBJ_OP]; ref; ref = ref->next) {
991*7c478bd9Sstevel@tonic-gate 		(void) fwrite((void *)(ref->referencee), ref->size, 1, fp);
992*7c478bd9Sstevel@tonic-gate 	}
993*7c478bd9Sstevel@tonic-gate 
994*7c478bd9Sstevel@tonic-gate 	/* range */
995*7c478bd9Sstevel@tonic-gate 	(void) fseek(fp, info_header->range_tbl_sec.place.itm_ptr, SEEK_SET);
996*7c478bd9Sstevel@tonic-gate 	TRACE_MESSAGE('P', ("range_tbl_sec.place=%p:\n",
997*7c478bd9Sstevel@tonic-gate 		info_header->range_tbl_sec.place.itm_ptr));
998*7c478bd9Sstevel@tonic-gate 	for (ref = ref_first[ITMC_OBJ_RANGE]; ref; ref = ref->next) {
999*7c478bd9Sstevel@tonic-gate 		(void) fwrite((void *)(ref->referencee), ref->size, 1, fp);
1000*7c478bd9Sstevel@tonic-gate 	}
1001*7c478bd9Sstevel@tonic-gate 
1002*7c478bd9Sstevel@tonic-gate 	/* escape sequence */
1003*7c478bd9Sstevel@tonic-gate 	(void) fseek(fp, info_header->escapeseq_tbl_sec.place.itm_ptr,
1004*7c478bd9Sstevel@tonic-gate 		SEEK_SET);
1005*7c478bd9Sstevel@tonic-gate 	TRACE_MESSAGE('P', ("escapeseq_tbl_sec.place=%p:\n",
1006*7c478bd9Sstevel@tonic-gate 		info_header->escapeseq_tbl_sec.place.itm_ptr));
1007*7c478bd9Sstevel@tonic-gate 	for (ref = ref_first[ITMC_OBJ_ESCAPESEQ]; ref; ref = ref->next) {
1008*7c478bd9Sstevel@tonic-gate 		(void) fwrite((void *)(ref->referencee), ref->size, 1, fp);
1009*7c478bd9Sstevel@tonic-gate 	}
1010*7c478bd9Sstevel@tonic-gate 
1011*7c478bd9Sstevel@tonic-gate 	/* data section */
1012*7c478bd9Sstevel@tonic-gate 	sec_size = 0;
1013*7c478bd9Sstevel@tonic-gate 	(void) fseek(fp, info_header->data_sec.place.itm_ptr, SEEK_SET);
1014*7c478bd9Sstevel@tonic-gate 	TRACE_MESSAGE('P', ("data_sec.place=%p:\n",
1015*7c478bd9Sstevel@tonic-gate 		info_header->data_sec.place.itm_ptr));
1016*7c478bd9Sstevel@tonic-gate 	for (ref = ref_first[ITMC_OBJ_DATA]; ref; ref = ref->next) {
1017*7c478bd9Sstevel@tonic-gate 		(void) fwrite((void *)(ref->referencee), ref->size, 1, fp);
1018*7c478bd9Sstevel@tonic-gate 		sec_size += ref->size;
1019*7c478bd9Sstevel@tonic-gate 	}
1020*7c478bd9Sstevel@tonic-gate 	for (ref = ref_first[ITMC_OBJ_EXPR]; ref; ref = ref->next) {
1021*7c478bd9Sstevel@tonic-gate 		(void) fwrite((void *)(ref->referencee), ref->size, 1, fp);
1022*7c478bd9Sstevel@tonic-gate 		sec_size += ref->size;
1023*7c478bd9Sstevel@tonic-gate 	}
1024*7c478bd9Sstevel@tonic-gate 	if (0 != cmd_opt.strip) {
1025*7c478bd9Sstevel@tonic-gate 		if (sec_size < info_header->data_sec.size) {
1026*7c478bd9Sstevel@tonic-gate 			(void) fwrite("\0\0\0\0", 1,
1027*7c478bd9Sstevel@tonic-gate 				info_header->data_sec.size - sec_size, fp);
1028*7c478bd9Sstevel@tonic-gate 		}
1029*7c478bd9Sstevel@tonic-gate 	} else {
1030*7c478bd9Sstevel@tonic-gate 
1031*7c478bd9Sstevel@tonic-gate 		/* ITM Info header */
1032*7c478bd9Sstevel@tonic-gate 		(void) fseek(fp, itm_header->info_hdr.itm_ptr, SEEK_SET);
1033*7c478bd9Sstevel@tonic-gate 		TRACE_MESSAGE('P', ("info_hdr=%p:\n",
1034*7c478bd9Sstevel@tonic-gate 			itm_header->info_hdr.itm_ptr));
1035*7c478bd9Sstevel@tonic-gate 		(void) fwrite(info_header, sizeof (itm_info_hdr_t), 1, fp);
1036*7c478bd9Sstevel@tonic-gate 
1037*7c478bd9Sstevel@tonic-gate 		(void) fseek(fp, info_header->direc_plc_tbl.place.itm_ptr,
1038*7c478bd9Sstevel@tonic-gate 			SEEK_SET);
1039*7c478bd9Sstevel@tonic-gate 		TRACE_MESSAGE('P', ("direc_plc_tbl.place=%p:\n",
1040*7c478bd9Sstevel@tonic-gate 			info_header->direc_plc_tbl.place.itm_ptr));
1041*7c478bd9Sstevel@tonic-gate 		for (ref = ref_first[ITMC_OBJ_DIREC]; ref; ref = ref->next) {
1042*7c478bd9Sstevel@tonic-gate 			(void) fwrite(&(ref->reloc),
1043*7c478bd9Sstevel@tonic-gate 				sizeof (itm_place_t), 1, fp);
1044*7c478bd9Sstevel@tonic-gate 		}
1045*7c478bd9Sstevel@tonic-gate 
1046*7c478bd9Sstevel@tonic-gate 		(void) fseek(fp, info_header->cond_plc_tbl.place.itm_ptr,
1047*7c478bd9Sstevel@tonic-gate 			SEEK_SET);
1048*7c478bd9Sstevel@tonic-gate 		TRACE_MESSAGE('P', ("cond_plc_tbl.place=%p:\n",
1049*7c478bd9Sstevel@tonic-gate 			info_header->cond_plc_tbl.place.itm_ptr));
1050*7c478bd9Sstevel@tonic-gate 
1051*7c478bd9Sstevel@tonic-gate 		for (ref = ref_first[ITMC_OBJ_COND]; ref; ref = ref->next) {
1052*7c478bd9Sstevel@tonic-gate 			(void) fwrite(&(ref->reloc),
1053*7c478bd9Sstevel@tonic-gate 				sizeof (itm_place_t), 1, fp);
1054*7c478bd9Sstevel@tonic-gate 		}
1055*7c478bd9Sstevel@tonic-gate 
1056*7c478bd9Sstevel@tonic-gate 		(void) fseek(fp, info_header->map_plc_tbl.place.itm_ptr,
1057*7c478bd9Sstevel@tonic-gate 			SEEK_SET);
1058*7c478bd9Sstevel@tonic-gate 		TRACE_MESSAGE('P', ("map_plc_tbl.place=%p:\n",
1059*7c478bd9Sstevel@tonic-gate 			info_header->map_plc_tbl.place.itm_ptr));
1060*7c478bd9Sstevel@tonic-gate 
1061*7c478bd9Sstevel@tonic-gate 		for (ref = ref_first[ITMC_OBJ_MAP]; ref; ref = ref->next) {
1062*7c478bd9Sstevel@tonic-gate 			(void) fwrite(&(ref->reloc),
1063*7c478bd9Sstevel@tonic-gate 				sizeof (itm_place_t), 1, fp);
1064*7c478bd9Sstevel@tonic-gate 		}
1065*7c478bd9Sstevel@tonic-gate 
1066*7c478bd9Sstevel@tonic-gate 		(void) fseek(fp, info_header->op_plc_tbl.place.itm_ptr,
1067*7c478bd9Sstevel@tonic-gate 			SEEK_SET);
1068*7c478bd9Sstevel@tonic-gate 		TRACE_MESSAGE('P', ("op_plc_tbl.place=%p:\n",
1069*7c478bd9Sstevel@tonic-gate 			info_header->op_plc_tbl.place.itm_ptr));
1070*7c478bd9Sstevel@tonic-gate 		for (ref = ref_first[ITMC_OBJ_OP]; ref; ref = ref->next) {
1071*7c478bd9Sstevel@tonic-gate 			(void) fwrite(&(ref->reloc),
1072*7c478bd9Sstevel@tonic-gate 				sizeof (itm_place_t), 1, fp);
1073*7c478bd9Sstevel@tonic-gate 		}
1074*7c478bd9Sstevel@tonic-gate 
1075*7c478bd9Sstevel@tonic-gate 		(void) fseek(fp, info_header->str_plc_tbl.place.itm_ptr,
1076*7c478bd9Sstevel@tonic-gate 			SEEK_SET);
1077*7c478bd9Sstevel@tonic-gate 		TRACE_MESSAGE('P', ("str_plc_tbl.place=%p:\n",
1078*7c478bd9Sstevel@tonic-gate 			info_header->str_plc_tbl.place.itm_ptr));
1079*7c478bd9Sstevel@tonic-gate 
1080*7c478bd9Sstevel@tonic-gate 		for (ref = ref_first[ITMC_OBJ_STRING]; ref; ref = ref->next) {
1081*7c478bd9Sstevel@tonic-gate 			itm_data_t	data;
1082*7c478bd9Sstevel@tonic-gate #if !defined(_LP64)
1083*7c478bd9Sstevel@tonic-gate 			data.place.itm_pad = 0;
1084*7c478bd9Sstevel@tonic-gate 			data.pad = 0;
1085*7c478bd9Sstevel@tonic-gate #endif
1086*7c478bd9Sstevel@tonic-gate 			data.place = ref->reloc;
1087*7c478bd9Sstevel@tonic-gate 			data.size = ref->size;
1088*7c478bd9Sstevel@tonic-gate 			(void) fwrite(&data, sizeof (itm_data_t), 1, fp);
1089*7c478bd9Sstevel@tonic-gate 		}
1090*7c478bd9Sstevel@tonic-gate 
1091*7c478bd9Sstevel@tonic-gate 		(void) fseek(fp, info_header->range_plc_tbl.place.itm_ptr,
1092*7c478bd9Sstevel@tonic-gate 			SEEK_SET);
1093*7c478bd9Sstevel@tonic-gate 		TRACE_MESSAGE('P', ("range_plc_tbl.place=%p:\n",
1094*7c478bd9Sstevel@tonic-gate 			info_header->range_plc_tbl.place.itm_ptr));
1095*7c478bd9Sstevel@tonic-gate 		for (ref = ref_first[ITMC_OBJ_RANGE]; ref; ref = ref->next) {
1096*7c478bd9Sstevel@tonic-gate 			(void) fwrite(&(ref->reloc),
1097*7c478bd9Sstevel@tonic-gate 				sizeof (itm_place_t), 1, fp);
1098*7c478bd9Sstevel@tonic-gate 		}
1099*7c478bd9Sstevel@tonic-gate 		(void) fseek(fp, info_header->escapeseq_plc_tbl.place.itm_ptr,
1100*7c478bd9Sstevel@tonic-gate 			SEEK_SET);
1101*7c478bd9Sstevel@tonic-gate 		TRACE_MESSAGE('P', ("escapeseq_plc_tbl.place=%p:\n",
1102*7c478bd9Sstevel@tonic-gate 			info_header->escapeseq_plc_tbl.place.itm_ptr));
1103*7c478bd9Sstevel@tonic-gate 		for (ref = ref_first[ITMC_OBJ_ESCAPESEQ];
1104*7c478bd9Sstevel@tonic-gate 		    ref; ref = ref->next) {
1105*7c478bd9Sstevel@tonic-gate 			(void) fwrite(&(ref->reloc),
1106*7c478bd9Sstevel@tonic-gate 				sizeof (itm_place_t), 1, fp);
1107*7c478bd9Sstevel@tonic-gate 		}
1108*7c478bd9Sstevel@tonic-gate 
1109*7c478bd9Sstevel@tonic-gate 		(void) fseek(fp, info_header->data_plc_tbl.place.itm_ptr,
1110*7c478bd9Sstevel@tonic-gate 			SEEK_SET);
1111*7c478bd9Sstevel@tonic-gate 		TRACE_MESSAGE('P', ("data_plc_tbl.place=%p:\n",
1112*7c478bd9Sstevel@tonic-gate 			info_header->data_plc_tbl.place.itm_ptr));
1113*7c478bd9Sstevel@tonic-gate 		for (ref = ref_first[ITMC_OBJ_DATA]; ref; ref = ref->next) {
1114*7c478bd9Sstevel@tonic-gate 			(void) fwrite(&(ref->reloc),
1115*7c478bd9Sstevel@tonic-gate 				sizeof (itm_place_t), 1, fp);
1116*7c478bd9Sstevel@tonic-gate 		}
1117*7c478bd9Sstevel@tonic-gate 		for (ref = ref_first[ITMC_OBJ_EXPR]; ref; ref = ref->next) {
1118*7c478bd9Sstevel@tonic-gate 			(void) fwrite(&(ref->reloc),
1119*7c478bd9Sstevel@tonic-gate 				sizeof (itm_place_t), 1, fp);
1120*7c478bd9Sstevel@tonic-gate 		}
1121*7c478bd9Sstevel@tonic-gate 
1122*7c478bd9Sstevel@tonic-gate 		(void) fseek(fp, info_header->name_plc_tbl.place.itm_ptr,
1123*7c478bd9Sstevel@tonic-gate 			SEEK_SET);
1124*7c478bd9Sstevel@tonic-gate 		TRACE_MESSAGE('P', ("name_plc_tbl.place=%p:\n",
1125*7c478bd9Sstevel@tonic-gate 			info_header->name_plc_tbl.place.itm_ptr));
1126*7c478bd9Sstevel@tonic-gate 		for (name = name_first, sec_size = 0;
1127*7c478bd9Sstevel@tonic-gate 		    name; name = name->next) {
1128*7c478bd9Sstevel@tonic-gate 			itm_data_t	data;
1129*7c478bd9Sstevel@tonic-gate 			if ((ITMC_OBJ_REGISTER == name->type) ||
1130*7c478bd9Sstevel@tonic-gate 			    (0 == name->name.size)) {
1131*7c478bd9Sstevel@tonic-gate 				continue;
1132*7c478bd9Sstevel@tonic-gate 			}
1133*7c478bd9Sstevel@tonic-gate 			data.size = name->name.size;
1134*7c478bd9Sstevel@tonic-gate #if !defined(_LP64)
1135*7c478bd9Sstevel@tonic-gate 			data.pad = 0;
1136*7c478bd9Sstevel@tonic-gate #endif
1137*7c478bd9Sstevel@tonic-gate 			if ((sizeof (itm_place_t)) < data.size) {
1138*7c478bd9Sstevel@tonic-gate #if !defined(_LP64)
1139*7c478bd9Sstevel@tonic-gate 				data.place.itm_pad = 0;
1140*7c478bd9Sstevel@tonic-gate #endif
1141*7c478bd9Sstevel@tonic-gate 				data.place.itm_ptr = name->reloc.itm_ptr;
1142*7c478bd9Sstevel@tonic-gate 			} else {
1143*7c478bd9Sstevel@tonic-gate 				data.place = name->name.place;
1144*7c478bd9Sstevel@tonic-gate 			}
1145*7c478bd9Sstevel@tonic-gate 			(void) fwrite(&data, sizeof (itm_data_t), 1, fp);
1146*7c478bd9Sstevel@tonic-gate 		}
1147*7c478bd9Sstevel@tonic-gate 
1148*7c478bd9Sstevel@tonic-gate 		(void) fseek(fp, info_header->reg_plc_tbl.place.itm_ptr,
1149*7c478bd9Sstevel@tonic-gate 			SEEK_SET);
1150*7c478bd9Sstevel@tonic-gate 		TRACE_MESSAGE('P', ("reg_plc_tbl.place=%p:\n",
1151*7c478bd9Sstevel@tonic-gate 			info_header->reg_plc_tbl.place.itm_ptr));
1152*7c478bd9Sstevel@tonic-gate 
1153*7c478bd9Sstevel@tonic-gate 		for (name = name_first;
1154*7c478bd9Sstevel@tonic-gate 		    name; name = name->next) {
1155*7c478bd9Sstevel@tonic-gate 			itm_data_t	data;
1156*7c478bd9Sstevel@tonic-gate 			if ((ITMC_OBJ_REGISTER != name->type) ||
1157*7c478bd9Sstevel@tonic-gate 			    (0 == name->name.size)) {
1158*7c478bd9Sstevel@tonic-gate 				continue;
1159*7c478bd9Sstevel@tonic-gate 			}
1160*7c478bd9Sstevel@tonic-gate #if !defined(_LP64)
1161*7c478bd9Sstevel@tonic-gate 			data.pad = 0;
1162*7c478bd9Sstevel@tonic-gate #endif
1163*7c478bd9Sstevel@tonic-gate 			data.size = name->name.size;
1164*7c478bd9Sstevel@tonic-gate 			if ((sizeof (itm_place_t)) < data.size) {
1165*7c478bd9Sstevel@tonic-gate #if !defined(_LP64)
1166*7c478bd9Sstevel@tonic-gate 				data.place.itm_pad = 0;
1167*7c478bd9Sstevel@tonic-gate #endif
1168*7c478bd9Sstevel@tonic-gate 				data.place.itm_ptr = name->reloc.itm_ptr;
1169*7c478bd9Sstevel@tonic-gate 			} else {
1170*7c478bd9Sstevel@tonic-gate 				data.place = name->name.place;
1171*7c478bd9Sstevel@tonic-gate 			}
1172*7c478bd9Sstevel@tonic-gate 			(void) fwrite(&data, sizeof (itm_data_t), 1, fp);
1173*7c478bd9Sstevel@tonic-gate 		}
1174*7c478bd9Sstevel@tonic-gate 
1175*7c478bd9Sstevel@tonic-gate 		/* Name section */
1176*7c478bd9Sstevel@tonic-gate 		(void) fseek(fp, info_header->name_sec.place.itm_ptr, SEEK_SET);
1177*7c478bd9Sstevel@tonic-gate 		TRACE_MESSAGE('P', ("name_sec.place=%p:\n",
1178*7c478bd9Sstevel@tonic-gate 			info_header->name_sec.place.itm_ptr));
1179*7c478bd9Sstevel@tonic-gate 		for (name = name_first, sec_size = 0;
1180*7c478bd9Sstevel@tonic-gate 		    name; name = name->next) {
1181*7c478bd9Sstevel@tonic-gate 			if ((ITMC_OBJ_REGISTER == name->type) ||
1182*7c478bd9Sstevel@tonic-gate 			    (name->name.size <= (sizeof (itm_place_t)))) {
1183*7c478bd9Sstevel@tonic-gate 				continue;
1184*7c478bd9Sstevel@tonic-gate 			}
1185*7c478bd9Sstevel@tonic-gate 			(void) fwrite(NSPTR(&(name->name)), 1,
1186*7c478bd9Sstevel@tonic-gate 				name->name.size, fp);
1187*7c478bd9Sstevel@tonic-gate 			sec_size += name->name.size;
1188*7c478bd9Sstevel@tonic-gate 		}
1189*7c478bd9Sstevel@tonic-gate 		for (name = name_first; name; name = name->next) {
1190*7c478bd9Sstevel@tonic-gate 			if ((ITMC_OBJ_REGISTER != name->type) ||
1191*7c478bd9Sstevel@tonic-gate 			    (name->name.size <= (sizeof (itm_place_t)))) {
1192*7c478bd9Sstevel@tonic-gate 				continue;
1193*7c478bd9Sstevel@tonic-gate 			}
1194*7c478bd9Sstevel@tonic-gate 			(void) fwrite(NSPTR(&(name->name)), 1,
1195*7c478bd9Sstevel@tonic-gate 				name->name.size, fp);
1196*7c478bd9Sstevel@tonic-gate 			sec_size += name->name.size;
1197*7c478bd9Sstevel@tonic-gate 		}
1198*7c478bd9Sstevel@tonic-gate 		if (sec_size < info_header->name_sec.size) {
1199*7c478bd9Sstevel@tonic-gate 			(void) fwrite("\0\0\0\0", 1,
1200*7c478bd9Sstevel@tonic-gate 				info_header->name_sec.size - sec_size, fp);
1201*7c478bd9Sstevel@tonic-gate 		}
1202*7c478bd9Sstevel@tonic-gate 	}
1203*7c478bd9Sstevel@tonic-gate 	(void) fclose(fp);
1204*7c478bd9Sstevel@tonic-gate }
1205