tree ctype, field, str_type, cinit, string;
tree ctype, field = NULL_TREE, str_type, cinit, string;
build_utf8_ref (name)     tree name;{  char* name_ptr = IDENTIFIER_POINTER(name);  int name_len = IDENTIFIER_LENGTH(name);  char buf[60];  char *buf_ptr;  tree ctype, field, str_type, cinit, string;  static int utf8_count = 0;  int name_hash;  tree ref = IDENTIFIER_UTF8_REF (name);  tree decl;  if (ref != NULL_TREE)    return ref;  push_obstacks (&permanent_obstack, &permanent_obstack);  ctype = make_node (RECORD_TYPE);  str_type = build_prim_array_type (unsigned_byte_type_node,				    name_len + 1); /* Allow for final '\0'. */  PUSH_FIELD (ctype, field, "hash", unsigned_short_type_node);  PUSH_FIELD (ctype, field, "length", unsigned_short_type_node);  PUSH_FIELD (ctype, field, "data", str_type);  FINISH_RECORD (ctype);  START_RECORD_CONSTRUCTOR (cinit, ctype);  name_hash = hashUtf8String (name_ptr, name_len) & 0xFFFF;  PUSH_FIELD_VALUE (cinit, "hash", build_int_2 (name_hash, 0));  PUSH_FIELD_VALUE (cinit, "length", build_int_2 (name_len, 0));  string = build_string (name_len, name_ptr);  TREE_TYPE (string) = str_type;  PUSH_FIELD_VALUE (cinit, "data", string);  FINISH_RECORD_CONSTRUCTOR (cinit);  /* Build a unique identifier based on buf. */  sprintf(buf, "_Utf%d", ++utf8_count);  buf_ptr = &buf[strlen (buf)];  if (name_len > 0 && name_ptr[0] >= '0' && name_ptr[0] <= '9')    *buf_ptr++ = '_';  while (--name_len >= 0)    {      unsigned char c = *name_ptr++;      if (c & 0x80)	continue;      if (!ISALPHA(c) && !ISDIGIT(c))	c = '_';      *buf_ptr++ = c;      if (buf_ptr >= buf + 50)	break;    }  *buf_ptr = '\0';  decl = build_decl (VAR_DECL, get_identifier (buf), utf8const_type);  /* FIXME get some way to force this into .text, not .data. */  TREE_STATIC (decl) = 1;  DECL_ARTIFICIAL (decl) = 1;  DECL_IGNORED_P (decl) = 1;  TREE_READONLY (decl) = 1;  DECL_INITIAL (decl) = cinit;  TREE_CHAIN (decl) = utf8_decl_list;  layout_decl (decl, 0);  pushdecl (decl);  rest_of_decl_compilation (decl, (char*) 0, global_bindings_p (), 0);  utf8_decl_list = decl;  make_decl_rtl (decl, (char*) 0, 1);  ref = build1 (ADDR_EXPR, utf8const_ptr_type, decl);  IDENTIFIER_UTF8_REF (name) = ref;  pop_obstacks ();  return ref;}