1/* Functions related to building resource files.
2   Copyright (C) 1996-2015 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 3, or (at your option)
9any later version.
10
11GCC is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GCC; see the file COPYING3.  If not see
18<http://www.gnu.org/licenses/>.
19
20Java and all Java-based marks are trademarks or registered trademarks
21of Sun Microsystems, Inc. in the United States and other countries.
22The Free Software Foundation is independent of Sun Microsystems, Inc.  */
23
24#include "config.h"
25#include "system.h"
26#include "coretypes.h"
27#include "hash-set.h"
28#include "machmode.h"
29#include "vec.h"
30#include "double-int.h"
31#include "input.h"
32#include "alias.h"
33#include "symtab.h"
34#include "options.h"
35#include "wide-int.h"
36#include "inchash.h"
37#include "tree.h"
38#include "fold-const.h"
39#include "stringpool.h"
40#include "stor-layout.h"
41#include "java-tree.h"
42#include "jcf.h"
43#include "diagnostic-core.h"
44#include "toplev.h"
45#include "parse.h"
46#include "tm.h"
47#include "hard-reg-set.h"
48#include "input.h"
49#include "function.h"
50#include "ggc.h"
51#include "tree-iterator.h"
52#include "hash-map.h"
53#include "is-a.h"
54#include "plugin-api.h"
55#include "ipa-ref.h"
56#include "cgraph.h"
57
58/* A list of all the resources files.  */
59static GTY(()) vec<tree, va_gc> *resources;
60
61void
62compile_resource_data (const char *name, const char *buffer, int length)
63{
64  tree rtype, field = NULL_TREE, data_type, rinit, data, decl;
65  vec<constructor_elt, va_gc> *v = NULL;
66
67  data_type = build_prim_array_type (unsigned_byte_type_node,
68				     strlen (name) + length);
69  rtype = make_node (RECORD_TYPE);
70  PUSH_FIELD (input_location,
71	      rtype, field, "name_length", unsigned_int_type_node);
72  PUSH_FIELD (input_location,
73	      rtype, field, "resource_length", unsigned_int_type_node);
74  PUSH_FIELD (input_location, rtype, field, "data", data_type);
75  FINISH_RECORD (rtype);
76  START_RECORD_CONSTRUCTOR (v, rtype);
77  PUSH_FIELD_VALUE (v, "name_length",
78		    build_int_cst (NULL_TREE, strlen (name)));
79  PUSH_FIELD_VALUE (v, "resource_length",
80		    build_int_cst (NULL_TREE, length));
81  data = build_string (strlen(name) + length, buffer);
82  TREE_TYPE (data) = data_type;
83  PUSH_FIELD_VALUE (v, "data", data);
84  FINISH_RECORD_CONSTRUCTOR (rinit, v, rtype);
85  TREE_CONSTANT (rinit) = 1;
86
87  decl = build_decl (input_location,
88		     VAR_DECL, java_mangle_resource_name (name), rtype);
89  TREE_STATIC (decl) = 1;
90  TREE_PUBLIC (decl) = 1;
91  java_hide_decl (decl);
92  DECL_ARTIFICIAL (decl) = 1;
93  DECL_IGNORED_P (decl) = 1;
94  TREE_READONLY (decl) = 1;
95  TREE_THIS_VOLATILE (decl) = 0;
96  DECL_INITIAL (decl) = rinit;
97  layout_decl (decl, 0);
98  pushdecl (decl);
99  rest_of_decl_compilation (decl, global_bindings_p (), 0);
100  varpool_node::finalize_decl (decl);
101
102  vec_safe_push (resources, decl);
103}
104
105void
106write_resource_constructor (tree *list_p)
107{
108  tree decl, t, register_resource_fn;
109  unsigned ix;
110
111  if (resources == NULL)
112    return;
113
114  t = build_function_type_list (void_type_node, ptr_type_node, NULL);
115  t = build_decl (input_location,
116		  FUNCTION_DECL, get_identifier ("_Jv_RegisterResource"), t);
117  TREE_PUBLIC (t) = 1;
118  DECL_EXTERNAL (t) = 1;
119  register_resource_fn = t;
120
121  /* Write out entries in the same order in which they were defined.  */
122  FOR_EACH_VEC_ELT (*resources, ix, decl)
123    {
124      t = build_fold_addr_expr (decl);
125      t = build_call_expr (register_resource_fn, 1, t);
126      append_to_statement_list (t, list_p);
127    }
128}
129
130/* Generate a byte array representing the contents of FILENAME.  The
131   array is assigned a unique local symbol.  The array represents a
132   compiled Java resource, which is accessed by the runtime using
133   NAME.  */
134void
135compile_resource_file (const char *name, const char *filename)
136{
137  struct stat stat_buf;
138  int fd;
139  char *buffer;
140
141  fd = open (filename, O_RDONLY | O_BINARY);
142  if (fd < 0)
143    {
144      perror ("Failed to read resource file");
145      return;
146    }
147  if (fstat (fd, &stat_buf) != 0
148      || ! S_ISREG (stat_buf.st_mode))
149    {
150      perror ("Could not figure length of resource file");
151      return;
152    }
153  buffer = XNEWVEC (char, strlen (name) + stat_buf.st_size);
154  strcpy (buffer, name);
155  read (fd, buffer + strlen (name), stat_buf.st_size);
156  close (fd);
157
158  compile_resource_data (name, buffer, stat_buf.st_size);
159}
160
161#include "gt-java-resource.h"
162