resource.c 4.51 KB
Newer Older
1
/* Functions related to building resource files.
2
   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3
   2007, 2008 Free Software Foundation, Inc.
4 5 6 7 8

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
9
the Free Software Foundation; either version 3, or (at your option)
10 11 12 13 14 15 16 17
any later version.

GCC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
18 19
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

Java and all Java-based marks are trademarks or registered trademarks
of Sun Microsystems, Inc. in the United States and other countries.
The Free Software Foundation is independent of Sun Microsystems, Inc.  */

#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "tm.h"
#include "tree.h"
#include "rtl.h"
#include "flags.h"
#include "java-tree.h"
#include "jcf.h"
#include "obstack.h"
#include "toplev.h"
#include "output.h"
#include "parse.h"
#include "function.h"
#include "ggc.h"
#include "stdio.h"
#include "target.h"
42
#include "expr.h"
43
#include "tree-iterator.h"
Jan Hubicka committed
44
#include "cgraph.h"
45 46 47 48 49 50 51 52 53 54

/* DOS brain-damage */
#ifndef O_BINARY
#define O_BINARY 0 /* MS-DOS brain-damage */
#endif

/* A list of all the resources files.  */
static GTY(()) tree resources = NULL;

void
55
compile_resource_data (const char *name, const char *buffer, int length)
56 57 58 59 60 61
{
  tree rtype, field = NULL_TREE, data_type, rinit, data, decl;

  data_type = build_prim_array_type (unsigned_byte_type_node,
				     strlen (name) + length);
  rtype = make_node (RECORD_TYPE);
62 63 64 65 66
  PUSH_FIELD (input_location,
	      rtype, field, "name_length", unsigned_int_type_node);
  PUSH_FIELD (input_location,
	      rtype, field, "resource_length", unsigned_int_type_node);
  PUSH_FIELD (input_location, rtype, field, "data", data_type);
67 68 69
  FINISH_RECORD (rtype);
  START_RECORD_CONSTRUCTOR (rinit, rtype);
  PUSH_FIELD_VALUE (rinit, "name_length", 
70
		    build_int_cst (NULL_TREE, strlen (name)));
71
  PUSH_FIELD_VALUE (rinit, "resource_length", 
72
		    build_int_cst (NULL_TREE, length));
73 74 75 76 77 78
  data = build_string (strlen(name) + length, buffer);
  TREE_TYPE (data) = data_type;
  PUSH_FIELD_VALUE (rinit, "data", data);
  FINISH_RECORD_CONSTRUCTOR (rinit);
  TREE_CONSTANT (rinit) = 1;

79 80
  decl = build_decl (input_location,
		     VAR_DECL, java_mangle_resource_name (name), rtype);
81
  TREE_STATIC (decl) = 1;
82 83
  TREE_PUBLIC (decl) = 1;
  java_hide_decl (decl);
84 85 86 87 88 89 90
  DECL_ARTIFICIAL (decl) = 1;
  DECL_IGNORED_P (decl) = 1;
  TREE_READONLY (decl) = 1;
  TREE_THIS_VOLATILE (decl) = 0;
  DECL_INITIAL (decl) = rinit;
  layout_decl (decl, 0);
  pushdecl (decl);
91
  rest_of_decl_compilation (decl, global_bindings_p (), 0);
92
  varpool_finalize_decl (decl);
93 94 95 96 97

  resources = tree_cons (NULL_TREE, decl, resources);
}

void
98
write_resource_constructor (tree *list_p)
99
{
100
  tree iter, t, register_resource_fn;
101

102
  if (resources == NULL)
103 104
    return;

105
  t = build_function_type_list (void_type_node, ptr_type_node, NULL);
106 107
  t = build_decl (input_location,
		  FUNCTION_DECL, get_identifier ("_Jv_RegisterResource"), t);
108 109 110
  TREE_PUBLIC (t) = 1;
  DECL_EXTERNAL (t) = 1;
  register_resource_fn = t;
111 112

  /* Write out entries in the same order in which they were defined.  */
113
  for (iter = nreverse (resources); iter ; iter = TREE_CHAIN (iter))
114
    {
115
      t = build_fold_addr_expr (TREE_VALUE (iter));
116
      t = build_call_expr (register_resource_fn, 1, t);
117
      append_to_statement_list (t, list_p);
118 119 120 121 122 123 124 125
    }
}

/* Generate a byte array representing the contents of FILENAME.  The
   array is assigned a unique local symbol.  The array represents a
   compiled Java resource, which is accessed by the runtime using
   NAME.  */
void
126
compile_resource_file (const char *name, const char *filename)
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
{
  struct stat stat_buf;
  int fd;
  char *buffer;

  fd = open (filename, O_RDONLY | O_BINARY);
  if (fd < 0)
    {
      perror ("Failed to read resource file");
      return;
    }
  if (fstat (fd, &stat_buf) != 0
      || ! S_ISREG (stat_buf.st_mode))
    {
      perror ("Could not figure length of resource file");
      return;
    }
144
  buffer = XNEWVEC (char, strlen (name) + stat_buf.st_size);
145 146 147 148 149 150 151 152
  strcpy (buffer, name);
  read (fd, buffer + strlen (name), stat_buf.st_size);
  close (fd);

  compile_resource_data (name, buffer, stat_buf.st_size);
}

#include "gt-java-resource.h"