OSDN Git Service

* jcf-dump.c (main): Updated call to find_class.
[pf3gnuchains/gcc-fork.git] / gcc / java / jcf.h
1 /* Utility macros to read Java(TM) .class files and byte codes.
2    Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
3    2006, 2007 Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA.  
21
22 Java and all Java-based marks are trademarks or registered trademarks
23 of Sun Microsystems, Inc. in the United States and other countries.
24 The Free Software Foundation is independent of Sun Microsystems, Inc.  */
25
26 /* Written by Per Bothner <bothner@cygnus.com>, February 1996. */
27
28 #ifndef GCC_JCF_H
29 #define GCC_JCF_H
30 #include "javaop.h"
31
32 #ifndef JCF_u4
33 #define JCF_u4 unsigned long
34 #endif
35 #ifndef JCF_u2
36 #define JCF_u2 unsigned short
37 #endif
38
39 #define ALLOC xmalloc
40 #define REALLOC xrealloc
41 #ifndef FREE
42 #define FREE(PTR) free(PTR)
43 #endif
44
45 #ifdef JCF_word
46 #define JCF_word JCF_u4
47 #endif
48
49 /* If we have both "scandir" and "alphasort", we can cache directory
50    listings to reduce the time taken to search the classpath.  */
51 #if defined(HAVE_SCANDIR) && defined(HAVE_ALPHASORT)
52 #define JCF_USE_SCANDIR 1
53 #else
54 #define JCF_USE_SCANDIR 0
55 #endif 
56
57 /* On case-insensitive file systems, we need to ensure that a request
58    to open a .java or .class file is honored only if the file to be
59    opened is of the exact case we are asking for. In other words, we
60    want to override the inherent case insensitivity of the underlying
61    file system. On other platforms, this macro becomes the vanilla
62    open() call.
63
64    If you want to add another host, add your define to the list below
65    (i.e. defined(WIN32) || defined(YOUR_HOST)) and add a host-specific
66    .c file to Make-lang.in similar to win32-host.c.  */
67 #if defined(WIN32)
68 extern int
69 jcf_open_exact_case (const char* filename, int oflag);
70 #define JCF_OPEN_EXACT_CASE(X, Y) jcf_open_exact_case (X, Y)
71 #else
72 #define JCF_OPEN_EXACT_CASE open
73 #endif /* WIN32 */
74
75 struct JCF;
76 typedef int (*jcf_filbuf_t) (struct JCF*, int needed);
77
78 union cpool_entry GTY(()) {
79   jword GTY ((tag ("0"))) w;
80   tree GTY ((tag ("1"))) t;
81 };
82
83 #define cpool_entry_is_tree(tag) \
84   (tag & CONSTANT_ResolvedFlag) || tag == CONSTANT_Utf8
85
86 typedef struct CPool GTY(()) {
87   /* Available number of elements in the constants array, before it
88      must be re-allocated. */
89   int capacity;
90
91   /* The constant_pool_count. */
92   int           count;
93
94   uint8* GTY((length ("%h.count")))     tags;
95
96   union cpool_entry * GTY((length ("%h.count"),
97                            desc ("cpool_entry_is_tree (%1.tags%a)")))   data;
98 } CPool;
99
100 struct ZipDirectory;
101
102 /* JCF encapsulates the state of reading a Java Class File. */
103
104 typedef struct JCF GTY(()) {
105   unsigned char * GTY ((skip)) buffer;
106   unsigned char * GTY ((skip)) buffer_end;
107   unsigned char * GTY ((skip)) read_ptr;
108   unsigned char * GTY ((skip)) read_end;
109   unsigned int right_zip : 1;
110   unsigned int finished : 1;
111   jcf_filbuf_t filbuf;
112   PTR GTY ((skip)) read_state;
113   const char *filename;
114   const char *classname;
115   /* Directory entry where it was found.  */
116   struct ZipDirectory * GTY ((skip)) zipd;
117   JCF_u2 access_flags;
118   JCF_u2 this_class;
119   JCF_u2 super_class;
120   CPool cpool;
121 } JCF;
122 /*typedef JCF*  JCF_FILE;*/
123
124 #define JCF_SEEN_IN_ZIP(JCF) ((JCF)->zipd != NULL)
125
126 /* The CPOOL macros take a (pointer to a) CPool.
127    The JPOOL macros take a (pointer to a) JCF.
128    Some of the latter should perhaps be deprecated or removed. */
129
130 #define CPOOL_COUNT(CPOOL) ((CPOOL)->count)
131 #define JPOOL_SIZE(JCF) CPOOL_COUNT(&(JCF)->cpool)
132 #define JPOOL_TAG(JCF, INDEX) ((JCF)->cpool.tags[INDEX])
133 /* The INDEX'th constant pool entry as a JCF_u4. */
134 #define CPOOL_UINT(CPOOL, INDEX) ((CPOOL)->data[INDEX].w)
135 #define JPOOL_UINT(JCF, INDEX) CPOOL_UINT(&(JCF)->cpool, INDEX) /*deprecated*/
136 /* The first uint16 of the INDEX'th constant pool entry. */
137 #define CPOOL_USHORT1(CPOOL, INDEX) ((CPOOL)->data[INDEX].w & 0xFFFF)
138 #define JPOOL_USHORT1(JCF, INDEX) CPOOL_USHORT1(&(JCF)->cpool, INDEX)
139 /* The second uint16 of the INDEX'th constant pool entry. */
140 #define CPOOL_USHORT2(CPOOL, INDEX) ((CPOOL)->data[INDEX].w >> 16)
141 #define JPOOL_USHORT2(JCF, INDEX) CPOOL_USHORT2(&(JCF)->cpool, INDEX)
142 #define JPOOL_LONG(JCF, INDEX) \
143   WORDS_TO_LONG (JPOOL_UINT(JCF, INDEX), JPOOL_UINT(JCF, (INDEX)+1))
144 #define JPOOL_DOUBLE(JCF, INDEX) \
145   WORDS_TO_DOUBLE  (JPOOL_UINT(JCF, INDEX), JPOOL_UINT(JCF, (INDEX)+1))
146 #ifndef JPOOL_UTF_LENGTH
147 #define JPOOL_UTF_LENGTH(JCF, INDEX) \
148   GET_u2 ((JCF)->buffer+JPOOL_UINT(JCF, INDEX))
149 #endif
150 #ifndef JPOOL_UTF_DATA
151 #define JPOOL_UTF_DATA(JCF, INDEX) \
152   ((JCF)->buffer+JPOOL_UINT(JCF, INDEX)+2)
153 #endif
154 #define JPOOL_INT(JCF, INDEX) (WORD_TO_INT(JPOOL_UINT (JCF, INDEX)))
155 #define JPOOL_FLOAT(JCF, INDEX) WORD_TO_FLOAT (JPOOL_UINT (JCF, INDEX))
156
157 #define CPOOL_INDEX_IN_RANGE(CPOOL, INDEX) \
158  ((INDEX) > 0 && (INDEX) < CPOOL_COUNT(CPOOL))
159
160 #define CPOOL_FINISH(CPOOL) {                   \
161     (CPOOL)->tags = 0;                          \
162     (CPOOL)->data = 0;                          \
163   }
164
165 #define JCF_FINISH(JCF) { \
166   CPOOL_FINISH(&(JCF)->cpool); \
167   if ((JCF)->buffer) free ((JCF)->buffer); \
168   if ((JCF)->filename) free ((char *) (JCF)->filename); \
169   if ((JCF)->classname) free ((char *) (JCF)->classname); \
170   (JCF)->finished = 1; }
171   
172 #define CPOOL_INIT(CPOOL) \
173   ((CPOOL)->capacity = 0, (CPOOL)->count = 0, (CPOOL)->tags = 0, (CPOOL)->data = 0)
174
175 #define CPOOL_REINIT(CPOOL) ((CPOOL)->count = 0)
176
177 #define JCF_ZERO(JCF)  \
178   ((JCF)->buffer = (JCF)->buffer_end = (JCF)->read_ptr = (JCF)->read_end = 0,\
179    (JCF)->read_state = 0, (JCF)->filename = (JCF)->classname = 0, \
180    CPOOL_INIT(&(JCF)->cpool), (JCF)->zipd = 0, \
181    (JCF)->finished = 0)
182
183 /* Given that PTR points to a 2-byte unsigned integer in network
184    (big-endian) byte-order, return that integer. */
185 #define GET_u2(PTR) (((PTR)[0] << 8) | ((PTR)[1]))
186 /* Like GET_u2, but for little-endian format. */
187 #define GET_u2_le(PTR) (((PTR)[1] << 8) | ((PTR)[0]))
188
189 /* Given that PTR points to a 4-byte unsigned integer in network
190    (big-endian) byte-order, return that integer. */
191 #define GET_u4(PTR) (((JCF_u4)(PTR)[0] << 24) | ((JCF_u4)(PTR)[1] << 16) \
192   | ((JCF_u4)(PTR)[2] << 8) | ((JCF_u4)(PTR)[3]))
193 /* Like GET_u4, but for little-endian order. */
194 #define GET_u4_le(PTR) (((JCF_u4)(PTR)[3] << 24) | ((JCF_u4)(PTR)[2] << 16) \
195   | ((JCF_u4)(PTR)[1] << 8) | ((JCF_u4)(PTR)[0]))
196
197 /* Make sure there are COUNT bytes readable. */
198 #define JCF_FILL(JCF, COUNT) \
199   ((JCF)->read_end-(JCF)->read_ptr >= (COUNT) ? 0 : (*(JCF)->filbuf)(JCF, COUNT))
200 #define JCF_GETC(JCF) (JCF_FILL(JCF, 1) ? -1 : *(JCF)->read_ptr++)
201 #define JCF_READ(JCF, BUFFER, N) \
202     (memcpy (BUFFER, (JCF)->read_ptr, N), (JCF)->read_ptr += (N))
203 #define JCF_SKIP(JCF,N) ((JCF)->read_ptr += (N))
204 #define JCF_readu(JCF) (*(JCF)->read_ptr++)
205
206 /* Reads an unsigned 2-byte integer in network (big-endian) byte-order
207    from JCF.  Returns that integer.
208    Does not check for EOF (make sure to call JCF_FILL before-hand). */
209 #define JCF_readu2(JCF) ((JCF)->read_ptr += 2, GET_u2 ((JCF)->read_ptr-2))
210 #define JCF_readu2_le(JCF) ((JCF)->read_ptr += 2, GET_u2_le((JCF)->read_ptr-2))
211
212 /* Like JCF_readu2, but read a 4-byte unsigned integer. */
213 #define JCF_readu4(JCF) ((JCF)->read_ptr += 4, GET_u4 ((JCF)->read_ptr-4))
214 #define JCF_readu4_le(JCF) ((JCF)->read_ptr += 4, GET_u4_le((JCF)->read_ptr-4))
215
216 #define JCF_TELL(JCF) ((JCF)->read_ptr - (JCF)->buffer)
217 #define JCF_SEEK(JCF, POS) ((JCF)->read_ptr = (JCF)->buffer + (POS))
218
219 #define ACC_PUBLIC 0x0001
220 #define ACC_PRIVATE 0x0002
221 #define ACC_PROTECTED 0x0004
222 #define ACC_STATIC 0x0008
223 #define ACC_FINAL 0x0010
224 #define ACC_SYNCHRONIZED 0x0020
225 #define ACC_SUPER 0x0020
226 #define ACC_BRIDGE 0x0040
227 #define ACC_VOLATILE 0x0040
228 #define ACC_TRANSIENT 0x0080
229 #define ACC_VARARGS 0x0080
230 #define ACC_NATIVE 0x0100
231 #define ACC_INTERFACE 0x0200
232 #define ACC_ABSTRACT 0x0400
233 #define ACC_STRICT 0x0800
234 #define ACC_SYNTHETIC 0x01000
235 #define ACC_ANNOTATION 0x02000
236 #define ACC_ENUM 0x04000
237 /* "Invisible" refers to Miranda methods inserted into an abstract
238    class.  It is also used in the runtime.  */
239 #define ACC_INVISIBLE 0x8000
240
241 #define ACC_VISIBILITY (ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED)
242
243 enum cpool_tag
244 {
245   CONSTANT_Class = 7,
246   CONSTANT_Fieldref = 9,
247   CONSTANT_Methodref = 10,
248   CONSTANT_InterfaceMethodref = 11,
249   CONSTANT_String = 8,
250   CONSTANT_Integer = 3,
251   CONSTANT_Float = 4,
252   CONSTANT_Long = 5,
253   CONSTANT_Double = 6,
254   CONSTANT_NameAndType = 12,
255   CONSTANT_Utf8 = 1,
256   CONSTANT_Unicode = 2,
257   CONSTANT_None = 0
258 };
259
260 #define DEFAULT_CLASS_PATH "."
261
262 extern const char *find_class (const char *, int, JCF *);
263 extern const char *find_classfile (char *, JCF*, const char *);
264 extern int jcf_filbuf_from_stdio (JCF *jcf, int count);
265 extern int jcf_unexpected_eof (JCF*, int) ATTRIBUTE_NORETURN;
266
267 /* Extract a character from a Java-style Utf8 string.
268  * PTR points to the current character.
269  * LIMIT points to the end of the Utf8 string.
270  * PTR is incremented to point after the character that gets returned.
271  * On an error, -1 is returned. */
272 #define UTF8_GET(PTR, LIMIT) \
273   ((PTR) >= (LIMIT) ? -1 \
274    : *(PTR) < 128 ? *(PTR)++ \
275    : (*(PTR)&0xE0) == 0xC0 && ((PTR)+=2)<=(LIMIT) && ((PTR)[-1]&0xC0) == 0x80 \
276    ? (((PTR)[-2] & 0x1F) << 6) + ((PTR)[-1] & 0x3F) \
277    : (*(PTR) & 0xF0) == 0xE0 && ((PTR) += 3) <= (LIMIT) \
278    && ((PTR)[-2] & 0xC0) == 0x80 && ((PTR)[-1] & 0xC0) == 0x80 \
279    ? (((PTR)[-3]&0x0F) << 12) + (((PTR)[-2]&0x3F) << 6) + ((PTR)[-1]&0x3F) \
280    : ((PTR)++, -1))
281
282 extern const char *jcf_write_base_directory;
283
284 /* Debug macros, for the front end */
285
286 extern int quiet_flag;
287 #ifdef VERBOSE_SKELETON
288 #undef SOURCE_FRONTEND_DEBUG
289 #define SOURCE_FRONTEND_DEBUG(X)                                \
290   {if (!quiet_flag) {printf ("* "); printf X; putchar ('\n');} }
291 #else
292 #define SOURCE_FRONTEND_DEBUG(X)
293 #endif
294
295 /* Declarations for dependency code.  */
296 extern void jcf_dependency_reset (void);
297 extern void jcf_dependency_set_target (const char *);
298 extern void jcf_dependency_add_target (const char *);
299 extern void jcf_dependency_set_dep_file (const char *);
300 extern void jcf_dependency_add_file (const char *, int);
301 extern void jcf_dependency_write (void);
302 extern void jcf_dependency_init (int);
303 extern void jcf_dependency_print_dummies (void);
304
305 /* Declarations for path handling code.  */
306 extern void jcf_path_init (void);
307 extern void jcf_path_classpath_arg (const char *);
308 extern void jcf_path_bootclasspath_arg (const char *);
309 extern void jcf_path_extdirs_arg (const char *);
310 extern void jcf_path_include_arg (const char *);
311 extern void jcf_path_seal (int);
312 extern void *jcf_path_start (void);
313 extern void *jcf_path_next (void *);
314 extern char *jcf_path_name (void *);
315 extern char *jcf_path_compute (const char *);
316 extern int jcf_path_is_zipfile (void *);
317 extern int jcf_path_is_system (void *);
318 extern int jcf_path_max_len (void);
319
320 #endif /* ! GCC_JCF_H */