]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - cddl/contrib/opensolaris/cmd/sgs/include/sgs.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / cddl / contrib / opensolaris / cmd / sgs / include / sgs.h
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21
22 /*
23  *      Copyright (c) 1988 AT&T
24  *        All Rights Reserved
25  *
26  *
27  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
28  * Use is subject to license terms.
29  *
30  * Global include file for all sgs.
31  */
32
33 #ifndef _SGS_H
34 #define _SGS_H
35
36 #pragma ident   "%Z%%M% %I%     %E% SMI"
37
38 #ifdef  __cplusplus
39 extern "C" {
40 #endif
41
42 /* <assert.h> keys off of NDEBUG */
43 #ifdef  DEBUG
44 #undef  NDEBUG
45 #else
46 #define NDEBUG
47 #endif
48
49 #ifndef _ASM
50 #include <sys/types.h>
51 #if defined(sun)
52 #include <sys/machelf.h>
53 #else
54 #include <elf.h>
55 #endif
56 #include <stdlib.h>
57 #include <libelf.h>
58 #include <assert.h>
59 #include <alist.h>
60 #endif  /* _ASM */
61
62 /*
63  * Software identification.
64  */
65 #define SGS             ""
66 #define SGU_PKG         "Software Generation Utilities"
67 #define SGU_REL         "(SGU) Solaris-ELF (4.0)"
68
69
70 #ifndef _ASM
71
72 /*
73  * link_ver_string[] contains a version string for use by the link-editor
74  * and all other linker components. It is found in libconv, and is
75  * generated by sgs/libconv/common/bld_vernote.ksh. That script produces
76  * libconv/{plat}/vernote.s, which is in turn assembled/linked into
77  * libconv.
78  */
79 extern const char link_ver_string[];
80 /*
81  * Macro to round to next double word boundary.
82  */
83 #define S_DROUND(x)     (((x) + sizeof (double) - 1) & ~(sizeof (double) - 1))
84
85 /*
86  * General align and round macros.
87  */
88 #define S_ALIGN(x, a)   ((x) & ~(((a) ? (a) : 1) - 1))
89 #define S_ROUND(x, a)   ((x) + (((a) ? (a) : 1) - 1) & ~(((a) ? (a) : 1) - 1))
90
91 /*
92  * Bit manipulation macros; generic bit mask and is `v' in the range
93  * supportable in `n' bits?
94  */
95 #define S_MASK(n)       ((1 << (n)) -1)
96 #define S_INRANGE(v, n) (((-(1 << (n)) - 1) < (v)) && ((v) < (1 << (n))))
97
98
99 /*
100  * Yet another definition of the OFFSETOF macro, used with the AVL routines.
101  */
102 #define SGSOFFSETOF(s, m)       ((size_t)(&(((s *)0)->m)))
103
104 /*
105  * When casting between integer and pointer types, gcc will complain
106  * if the integer type used is not large enough to hold the pointer
107  * value without loss. Although a dubious practice in general, this
108  * is sometimes done by design. In those cases, the general solution
109  * is to introduce an intermediate cast to widen the integer value. The
110  * CAST_PTRINT macro does this, and its use documents the fact that
111  * the programmer is doing that sort of cast.
112  */
113 #ifdef __GNUC__
114 #define CAST_PTRINT(cast, value) ((cast)(uintptr_t)value)
115 #else
116 #define CAST_PTRINT(cast, value) ((cast)value)
117 #endif
118
119 /*
120  * General typedefs.
121  */
122 typedef enum {
123         FALSE = 0,
124         TRUE = 1
125 } Boolean;
126
127 /*
128  * Types of errors (used by eprintf()), together with a generic error return
129  * value.
130  */
131 typedef enum {
132         ERR_NONE,
133         ERR_WARNING,
134         ERR_FATAL,
135         ERR_ELF,
136         ERR_NUM                         /* Must be last */
137 } Error;
138
139 #if defined(_LP64) && !defined(_ELF64)
140 #define S_ERROR         (~(uint_t)0)
141 #else
142 #define S_ERROR         (~(uintptr_t)0)
143 #endif
144
145 /*
146  * LIST_TRAVERSE() is used as the only "argument" of a "for" loop to
147  * traverse a linked list. The node pointer `node' is set to each node in
148  * turn and the corresponding data pointer is copied to `data'.  The macro
149  * is used as in
150  *      for (LIST_TRAVERSE(List *list, Listnode *node, void *data)) {
151  *              process(data);
152  *      }
153  */
154 #define LIST_TRAVERSE(L, N, D) \
155         (void) (((N) = (L)->head) != NULL && ((D) = (N)->data) != NULL); \
156         (N) != NULL; \
157         (void) (((N) = (N)->next) != NULL && ((D) = (N)->data) != NULL)
158
159 typedef struct listnode Listnode;
160 typedef struct list     List;
161
162 struct  listnode {                      /* a node on a linked list */
163         void            *data;          /* the data item */
164         Listnode        *next;          /* the next element */
165 };
166
167 struct  list {                          /* a linked list */
168         Listnode        *head;          /* the first element */
169         Listnode        *tail;          /* the last element */
170 };
171
172
173 #ifdef _SYSCALL32
174 typedef struct listnode32       Listnode32;
175 typedef struct list32           List32;
176
177 struct  listnode32 {                    /* a node on a linked list */
178         Elf32_Addr      data;           /* the data item */
179         Elf32_Addr      next;           /* the next element */
180 };
181
182 struct  list32 {                        /* a linked list */
183         Elf32_Addr      head;           /* the first element */
184         Elf32_Addr      tail;           /* the last element */
185 };
186 #endif  /* _SYSCALL32 */
187
188
189 /*
190  * Structure to maintain rejected files elf information.  Files that are not
191  * applicable to the present link-edit are rejected and a search for an
192  * appropriate file may be resumed.  The first rejected files information is
193  * retained so that a better error diagnostic can be given should an appropriate
194  * file not be located.
195  */
196 typedef struct {
197         ushort_t        rej_type;       /* SGS_REJ_ value */
198         ushort_t        rej_flag;       /* additional information */
199         uint_t          rej_info;       /* numeric and string information */
200         const char      *rej_str;       /*      associated with error */
201         const char      *rej_name;      /* object name - expanded library */
202                                         /*      name and archive members */
203 } Rej_desc;
204
205 #define SGS_REJ_NONE            0
206 #define SGS_REJ_MACH            1       /* wrong ELF machine type */
207 #define SGS_REJ_CLASS           2       /* wrong ELF class (32-bit/64-bit) */
208 #define SGS_REJ_DATA            3       /* wrong ELF data format (MSG/LSB) */
209 #define SGS_REJ_TYPE            4       /* bad ELF type */
210 #define SGS_REJ_BADFLAG         5       /* bad ELF flags value */
211 #define SGS_REJ_MISFLAG         6       /* mismatched ELF flags value */
212 #define SGS_REJ_VERSION         7       /* mismatched ELF/lib version */
213 #define SGS_REJ_HAL             8       /* HAL R1 extensions required */
214 #define SGS_REJ_US3             9       /* Sun UltraSPARC III extensions */
215                                         /*      required */
216 #define SGS_REJ_STR             10      /* generic error - info is a string */
217 #define SGS_REJ_UNKFILE         11      /* unknown file type */
218 #define SGS_REJ_HWCAP_1         12      /* hardware capabilities mismatch */
219
220 /*
221  * For those source files used both inside and outside of the
222  * libld source base (tools/common/string_table.c) we can
223  * automatically switch between the allocation models
224  * based off of the 'cc -DUSE_LIBLD_MALLOC' flag.
225  */
226 #ifdef  USE_LIBLD_MALLOC
227 #define calloc(x, a)            libld_malloc(((size_t)x) * ((size_t)a))
228 #define free                    libld_free
229 #define malloc                  libld_malloc
230 #define realloc                 libld_realloc
231
232 #define libld_calloc(x, a)      libld_malloc(((size_t)x) * ((size_t)a))
233 extern void             libld_free(void *);
234 extern void             *libld_malloc(size_t);
235 extern void             *libld_realloc(void *, size_t);
236 #endif
237
238
239 /*
240  * Data structures (defined in libld.h).
241  */
242 typedef struct ent_desc         Ent_desc;
243 typedef struct group_desc       Group_desc;
244 typedef struct ifl_desc         Ifl_desc;
245 typedef struct is_desc          Is_desc;
246 typedef struct isa_desc         Isa_desc;
247 typedef struct isa_opt          Isa_opt;
248 typedef struct mv_desc          Mv_desc;
249 typedef struct ofl_desc         Ofl_desc;
250 typedef struct os_desc          Os_desc;
251 typedef struct rel_cache        Rel_cache;
252 typedef struct sdf_desc         Sdf_desc;
253 typedef struct sdv_desc         Sdv_desc;
254 typedef struct sg_desc          Sg_desc;
255 typedef struct sort_desc        Sort_desc;
256 typedef struct sec_order        Sec_order;
257 typedef struct sym_desc         Sym_desc;
258 typedef struct sym_aux          Sym_aux;
259 typedef struct sym_avlnode      Sym_avlnode;
260 typedef struct uts_desc         Uts_desc;
261 typedef struct ver_desc         Ver_desc;
262 typedef struct ver_index        Ver_index;
263 typedef struct audit_desc       Audit_desc;
264 typedef struct audit_info       Audit_info;
265 typedef struct audit_list       Audit_list;
266
267 /*
268  * Data structures defined in machrel.h.
269  */
270 typedef struct rel_desc         Rel_desc;
271
272 /*
273  * Data structures defined in rtld.h.
274  */
275 typedef struct lm_list          Lm_list;
276 #ifdef _SYSCALL32
277 typedef struct lm_list32        Lm_list32;
278 #endif  /* _SYSCALL32 */
279
280 /*
281  * For the various utilities that include sgs.h
282  */
283 extern int      assfail(const char *, const char *, int);
284 extern void     eprintf(Lm_list *, Error, const char *, ...);
285 extern char     *sgs_demangle(char *);
286 extern uint_t   sgs_str_hash(const char *);
287 extern uint_t   findprime(uint_t);
288
289 #endif /* _ASM */
290
291 #ifdef  __cplusplus
292 }
293 #endif
294
295
296 #endif /* _SGS_H */