]>
Commit | Line | Data |
---|---|---|
3e895978 TT |
1 | /* Functions related to building resource files. |
2 | Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 | |
3 | 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, 59 Temple Place - Suite 330, | |
20 | Boston, MA 02111-1307, 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 | #include "config.h" | |
27 | #include "system.h" | |
28 | #include "coretypes.h" | |
29 | #include "tm.h" | |
30 | #include "tree.h" | |
31 | #include "rtl.h" | |
32 | #include "flags.h" | |
33 | #include "java-tree.h" | |
34 | #include "jcf.h" | |
35 | #include "obstack.h" | |
36 | #include "toplev.h" | |
37 | #include "output.h" | |
38 | #include "parse.h" | |
39 | #include "function.h" | |
40 | #include "ggc.h" | |
41 | #include "stdio.h" | |
42 | #include "target.h" | |
43 | ||
44 | /* DOS brain-damage */ | |
45 | #ifndef O_BINARY | |
46 | #define O_BINARY 0 /* MS-DOS brain-damage */ | |
47 | #endif | |
48 | ||
49 | /* A list of all the resources files. */ | |
50 | static GTY(()) tree resources = NULL; | |
51 | ||
52 | /* Function used to register resources. */ | |
53 | static GTY(()) rtx registerResource_libfunc; | |
54 | ||
55 | /* Count of all the resources compiled in this invocation. */ | |
56 | static int Jr_count = 0; | |
57 | ||
58 | void | |
95ca6d8b | 59 | compile_resource_data (const char *name, const char *buffer, int length) |
3e895978 TT |
60 | { |
61 | tree rtype, field = NULL_TREE, data_type, rinit, data, decl; | |
62 | char buf[60]; | |
63 | ||
64 | data_type = build_prim_array_type (unsigned_byte_type_node, | |
65 | strlen (name) + length); | |
66 | rtype = make_node (RECORD_TYPE); | |
67 | PUSH_FIELD (rtype, field, "name_length", unsigned_int_type_node); | |
68 | PUSH_FIELD (rtype, field, "resource_length", unsigned_int_type_node); | |
69 | PUSH_FIELD (rtype, field, "data", data_type); | |
70 | FINISH_RECORD (rtype); | |
71 | START_RECORD_CONSTRUCTOR (rinit, rtype); | |
72 | PUSH_FIELD_VALUE (rinit, "name_length", | |
73 | build_int_2 (strlen (name), 0)); | |
74 | PUSH_FIELD_VALUE (rinit, "resource_length", | |
75 | build_int_2 (length, 0)); | |
76 | data = build_string (strlen(name) + length, buffer); | |
77 | TREE_TYPE (data) = data_type; | |
78 | PUSH_FIELD_VALUE (rinit, "data", data); | |
79 | FINISH_RECORD_CONSTRUCTOR (rinit); | |
80 | TREE_CONSTANT (rinit) = 1; | |
81 | ||
82 | /* Generate a unique-enough identifier. */ | |
83 | sprintf (buf, "_Jr%d", ++Jr_count); | |
84 | ||
85 | decl = build_decl (VAR_DECL, get_identifier (buf), rtype); | |
86 | TREE_STATIC (decl) = 1; | |
87 | DECL_ARTIFICIAL (decl) = 1; | |
88 | DECL_IGNORED_P (decl) = 1; | |
89 | TREE_READONLY (decl) = 1; | |
90 | TREE_THIS_VOLATILE (decl) = 0; | |
91 | DECL_INITIAL (decl) = rinit; | |
92 | layout_decl (decl, 0); | |
93 | pushdecl (decl); | |
94 | rest_of_decl_compilation (decl, (char*) 0, global_bindings_p (), 0); | |
95 | make_decl_rtl (decl, (char*) 0); | |
96 | assemble_variable (decl, 1, 0, 0); | |
97 | ||
98 | resources = tree_cons (NULL_TREE, decl, resources); | |
99 | } | |
100 | ||
101 | void | |
850ccfae | 102 | write_resource_constructor (void) |
3e895978 TT |
103 | { |
104 | tree init_name, init_type, init_decl; | |
105 | tree iter; | |
106 | ||
107 | /* Only do work if required. */ | |
108 | if (resources == NULL_TREE) | |
109 | return; | |
110 | ||
111 | init_name = get_file_function_name ('I'); | |
112 | init_type = build_function_type (void_type_node, end_params_node); | |
113 | ||
114 | init_decl = build_decl (FUNCTION_DECL, init_name, init_type); | |
115 | SET_DECL_ASSEMBLER_NAME (init_decl, init_name); | |
116 | TREE_STATIC (init_decl) = 1; | |
117 | current_function_decl = init_decl; | |
118 | DECL_RESULT (init_decl) = build_decl (RESULT_DECL, | |
119 | NULL_TREE, void_type_node); | |
120 | ||
121 | /* It can be a static function as long as collect2 does not have | |
122 | to scan the object file to find its ctor/dtor routine. */ | |
123 | TREE_PUBLIC (init_decl) = ! targetm.have_ctors_dtors; | |
124 | ||
125 | pushlevel (0); | |
126 | make_decl_rtl (init_decl, NULL); | |
127 | init_function_start (init_decl, input_filename, 0); | |
128 | expand_function_start (init_decl, 0); | |
129 | ||
130 | /* Write out entries in the same order in which they were defined. */ | |
131 | for (iter = nreverse (resources); iter != NULL_TREE; | |
132 | iter = TREE_CHAIN (iter)) | |
133 | { | |
850ccfae | 134 | const char *name = IDENTIFIER_POINTER (DECL_NAME (TREE_VALUE (iter))); |
3e895978 TT |
135 | emit_library_call (registerResource_libfunc, 0, VOIDmode, 1, |
136 | gen_rtx (SYMBOL_REF, Pmode, name), | |
137 | Pmode); | |
138 | } | |
139 | ||
140 | expand_function_end (input_filename, 0, 0); | |
141 | poplevel (1, 0, 1); | |
142 | { | |
143 | /* Force generation, even with -O3 or deeper. Gross hack. | |
144 | FIXME. */ | |
145 | int saved_flag = flag_inline_functions; | |
146 | flag_inline_functions = 0; | |
147 | rest_of_compilation (init_decl); | |
148 | flag_inline_functions = saved_flag; | |
149 | } | |
150 | current_function_decl = NULL_TREE; | |
151 | (* targetm.asm_out.constructor) (XEXP (DECL_RTL (init_decl), 0), | |
152 | DEFAULT_INIT_PRIORITY); | |
153 | } | |
154 | ||
155 | /* Generate a byte array representing the contents of FILENAME. The | |
156 | array is assigned a unique local symbol. The array represents a | |
157 | compiled Java resource, which is accessed by the runtime using | |
158 | NAME. */ | |
159 | void | |
95ca6d8b | 160 | compile_resource_file (const char *name, const char *filename) |
3e895978 TT |
161 | { |
162 | struct stat stat_buf; | |
163 | int fd; | |
164 | char *buffer; | |
165 | ||
166 | fd = open (filename, O_RDONLY | O_BINARY); | |
167 | if (fd < 0) | |
168 | { | |
169 | perror ("Failed to read resource file"); | |
170 | return; | |
171 | } | |
172 | if (fstat (fd, &stat_buf) != 0 | |
173 | || ! S_ISREG (stat_buf.st_mode)) | |
174 | { | |
175 | perror ("Could not figure length of resource file"); | |
176 | return; | |
177 | } | |
178 | buffer = xmalloc (strlen (name) + stat_buf.st_size); | |
179 | strcpy (buffer, name); | |
180 | read (fd, buffer + strlen (name), stat_buf.st_size); | |
181 | close (fd); | |
182 | ||
183 | compile_resource_data (name, buffer, stat_buf.st_size); | |
184 | write_resource_constructor (); | |
185 | } | |
186 | ||
187 | void | |
850ccfae | 188 | init_resource_processing (void) |
3e895978 TT |
189 | { |
190 | registerResource_libfunc = | |
191 | gen_rtx_SYMBOL_REF (Pmode, "_Jv_RegisterResource"); | |
192 | } | |
193 | ||
194 | #include "gt-java-resource.h" |