objc-freeze-thaw.c [plain text]
#ifdef PFE
#include "config.h"
#include "system.h"
#include "pfe.h"
#include "pfe-header.h"
#ifdef OBJCPLUS
#define C_OR_CXX_(func) CONCAT2 (cxx_, func)
#else
#define C_OR_CXX_(func) CONCAT2 (c_, func)
#endif
#include "objc-freeze-thaw.h"
#ifdef ENABLE_DMP_TREE
#include "dmp-tree.h"
extern int C_OR_CXX_(dump_tree_p) PARAMS ((FILE *, const char *, tree, int));
extern int objc_dump_tree_p PARAMS ((FILE *, const char *, tree, int));
extern lang_dump_tree_p_t C_OR_CXX_(prev_lang_dump_tree_p);
extern lang_dump_tree_p_t objc_prev_lang_dump_tree_p;
#endif
static void freeze_thaw_hash_entry PARAMS ((hash **));
static void freeze_thaw_hash_attribute PARAMS ((attr *));
void
objc_freeze_thaw_compiler_state (pp)
struct pfe_lang_compiler_state **pp;
{
struct pfe_lang_compiler_state *hdr;
int i;
hdr = (struct pfe_lang_compiler_state *)pfe_freeze_thaw_ptr_fp (pp);
C_OR_CXX_(freeze_thaw_compiler_state) (&hdr->base_lang);
PFE_FREEZE_THAW_GLOBAL_TREE_ARRAY (objc_global_trees, OCTI_MAX);
PFE_FREEZE_THAW_GLOBAL_HASH_ENTRY (nst_method_hash_list);
PFE_FREEZE_THAW_GLOBAL_HASH_ENTRY (cls_method_hash_list);
}
void
objc_pfe_lang_init ()
{
C_OR_CXX_(pfe_lang_init) ();
if (pfe_compiler_state_ptr)
{
struct pfe_base_lang_compiler_state *base_lang
= (struct pfe_base_lang_compiler_state *)pfe_compiler_state_ptr->lang_specific;
pfe_compiler_state_ptr->lang_specific = (struct pfe_lang_compiler_state *)
pfe_calloc (1, sizeof (struct pfe_lang_compiler_state));
((struct pfe_lang_compiler_state *)pfe_compiler_state_ptr->lang_specific)->base_lang = base_lang;
}
#if 0
#ifdef ENABLE_DMP_TREE
if (!objc_prev_lang_dump_tree_p)
{
C_OR_CXX_(prev_lang_dump_tree_p) = set_dump_tree_p (C_OR_CXX_(dump_tree_p));
objc_prev_lang_dump_tree_p = set_dump_tree_p (objc_dump_tree_p);
}
SET_MAX_DMP_TREE_CODE (LAST_OBJC_TREE_CODE);
#endif
if (pfe_operation == PFE_LOAD)
{
add_c_tree_codes ();
add_objc_tree_codes ();
}
#endif
}
int
objc_pfe_freeze_thaw_decl (node)
tree node;
{
switch (TREE_CODE (node))
{
case CLASS_METHOD_DECL:
case INSTANCE_METHOD_DECL:
PFE_FREEZE_THAW_WALK (METHOD_ADD_ARGS (node));
return 1;
case KEYWORD_DECL:
return 1;
default:
return C_OR_CXX_(pfe_freeze_thaw_decl) (node);
}
}
int
objc_pfe_freeze_thaw_type (node)
tree node;
{
switch (TREE_CODE (node))
{
case CLASS_INTERFACE_TYPE:
case CLASS_IMPLEMENTATION_TYPE:
case CATEGORY_INTERFACE_TYPE:
case CATEGORY_IMPLEMENTATION_TYPE:
PFE_FREEZE_THAW_WALK (CLASS_NST_METHODS (node));
PFE_FREEZE_THAW_WALK (CLASS_CLS_METHODS (node));
PFE_FREEZE_THAW_WALK (TYPE_BINFO (node));
return 1;
case PROTOCOL_INTERFACE_TYPE:
PFE_FREEZE_THAW_WALK (PROTOCOL_NST_METHODS (node));
PFE_FREEZE_THAW_WALK (PROTOCOL_CLS_METHODS (node));
PFE_FREEZE_THAW_WALK (TYPE_PROTOCOL_LIST (node));
PFE_FREEZE_THAW_WALK (TYPE_BINFO (node));
return 1;
default:
return C_OR_CXX_(pfe_freeze_thaw_type) (node);
}
}
int
objc_pfe_freeze_thaw_special (node)
tree node;
{
switch (TREE_CODE (node))
{
default:
return C_OR_CXX_(pfe_freeze_thaw_special) (node);
}
}
static void
freeze_thaw_hash_entry (pp)
hash **pp;
{
hash *p = (hash *)PFE_FREEZE_THAW_PTR (pp);
int pi;
if (!p)
return;
for (pi = 0; pi < SIZEHASHTABLE; pi++)
{
hash e = (hash)PFE_FREEZE_THAW_PTR (&p[pi]);
while (e)
{
PFE_FREEZE_THAW_WALK (e->key);
freeze_thaw_hash_attribute (&e->list);
e = (hash)PFE_FREEZE_THAW_PTR (&e->next);
}
}
}
static void
freeze_thaw_hash_attribute (pp)
attr *pp;
{
attr p = (attr)PFE_FREEZE_THAW_PTR (pp);
while (p)
{
PFE_FREEZE_THAW_WALK (p->value);
p = (attr)PFE_FREEZE_THAW_PTR (&p->next);
}
}
#define GCC_OBJC_STRUCTS
#define DEFCHECKSTRUCT(name, assumed_size) \
extern void CONCAT2(check_struct_, name) PARAMS ((int));
#include "structs-to-check.def"
#undef DEFCHECKSTRUCT
#define DEFCHECKSTRUCT(name, assumed_size) CONCAT2(check_struct_, name),
static pfe_check_struct_t objc_struct_check_functions[] =
{
#include "structs-to-check.def"
NULL
};
#undef DEFCHECKSTRUCT
#define DEFCHECKSTRUCT(name, assumed_size) assumed_size,
static int objc_assumed_struct_size[] =
{
#include "structs-to-check.def"
0
};
#undef DEFCHECKSTRUCT
#undef GCC_OBJC_STRUCTS
void
objc_pfe_check_all_struct_sizes ()
{
int i;
C_OR_CXX_(pfe_check_all_struct_sizes) ();
for (i = 0; i < (int)ARRAY_SIZE (objc_struct_check_functions) - 1; ++i)
(*objc_struct_check_functions[i]) (objc_assumed_struct_size[i]);
}
DEFINE_CHECK_STRUCT_FUNCTION (hashed_attribute)
DEFINE_CHECK_STRUCT_FUNCTION (hashed_entry)
#endif