/*
 * Copyright (C) 2003-2010, Parrot Foundation.
 */

#ifndef PARROT_IMCC_UNIT_H_GUARD
#define PARROT_IMCC_UNIT_H_GUARD

/* A IMC compilation unit or atomic metadata item.
 * The unit holds the instruction list as well as
 * all of the compiler state info, (reg allocator, cfg, etc.)
 * for the unit of instructions.
 */

typedef enum {
    IMC_PASM        = 0x01,
    IMC_PCCSUB      = 0x02,
    IMC_HAS_SELF    = 0x10
} IMC_Unit_Type;

/*
 * Optimization statistics -- we track the number of times each of these
 * optimizations is performed.
 */
struct imcc_ostat {
    int deleted_labels;
    int if_branch;
    int branch_branch;
    int branch_cond_loop;
    int invariants_moved;
    int deleted_ins;
    int used_once;
} ;

struct IMC_Unit {
    INTVAL            type;
    Instruction      *instructions;
    Instruction      *last_ins;
    SymHash           hash;
    int               bb_list_size;
    unsigned int      n_basic_blocks;
    Basic_block     **bb_list;
    Set             **dominators;
    int              *idoms;
    Set             **dominance_frontiers;
    int               n_loops;
    Loop_info       **loop_info;
    Edge             *edge_list;

    /* register allocation */
    SymReg          **reglist;
    unsigned int      n_symbols;
    int               max_color;
    IMC_Unit         *prev;
    IMC_Unit         *next;

    SymReg           *_namespace;
    int               owns_namespace;   /* should this unit free *_namespace */
    int               pasm_file;
    STRING           *file;
    int               n_vars_used[4];   /* INSP in PIR */
    int               n_regs_used[4];   /* INSP in PBC */
    int               first_avail[4];   /* INSP */
    SymReg           *outer;
    PMC              *sub_pmc;          /* this sub */
    int               is_vtable_method; /* 1 if a vtable */
    int               is_method;        /* 1 if a method */
    int               has_ns_entry_name;/* 1 if in ns */
    char             *vtable_name;      /* vtable name, if any */
    char             *method_name;      /* method name, if any */
    char             *ns_entry_name;    /* ns entry name, if any */
    char             *instance_of;      /* PMC or class this is an instance of if any */
    INTVAL            hll_id;           /* HLL ID for this sub */
    SymReg           *subid;            /* Unique subroutine id */

    struct            imcc_ostat ostat;
};


/* HEADERIZER BEGIN: compilers/imcc/unit.c */
/* HEADERIZER END: compilers/imcc/unit.c */

#endif /* PARROT_IMCC_UNIT_H_GUARD */


/*
 * Local variables:
 *   c-file-style: "parrot"
 * End:
 * vim: expandtab shiftwidth=4 cinoptions='\:2=2' :
 */
