/* create memp */ F_RET memp_create ( Memp *pps_memp, T_UINT32 ul_init_size, T_UINT32 ul_grow_size ) { Memp_p *ps_mempp = T_NULL; Mem_hdr *ps_hdr = T_NULL; PN_RET(pps_memp, MEMP_NULL_PTR); ps_mempp = (Memp_p*)malloc(sizeof(*ps_mempp)); PN_RET(ps_mempp, MEMP_NULL_PTR); F_ZERO(ps_mempp, sizeof(*ps_mempp)); ps_mempp->ul_grow_size = ul_grow_size; ps_mempp->ul_size = 0; ps_mempp->ul_magic = MEMP_MAGIC; ps_mempp->pc_mem_addr = (Mem_hdr*)malloc(sizeof(Mem_hdr) + ul_init_size); PN_RET(ps_mempp->pc_mem_addr, MEMP_NULL_PTR); F_ZERO(ps_mempp->pc_mem_addr, sizeof(Mem_hdr)); ps_hdr = (Mem_hdr*)(ps_mempp->pc_mem_addr); ps_hdr->pc_next_hdr = T_NULL; /* have no next mem_hdr */ ps_hdr->ul_size = ul_init_size; ps_hdr->ul_left = ul_init_size; ps_hdr->pc_curr = (T_CHAR*)ps_hdr + sizeof(Mem_hdr); *pps_memp = (Memp)ps_mempp; return F_SUCCESS; }
Temp_map F_TempMap() { static Temp_map m = NULL; if (!m) { m = Temp_empty(); Temp_enter(m, F_FP(), "fp"); Temp_enter(m, F_SP(), "sp"); Temp_enter(m, F_RV(), "rv"); Temp_enter(m, F_ZERO(), "zf"); Temp_tempList args = F_ARGS(); Temp_tempList callee = F_CALLEE(); Temp_tempList caller = F_CALLER(); string buf[10]; for (int i=0; args; args = args->tail, i++) { sprintf(buf, "args%d", i); Temp_enter(m, args, ""); } for (int i=0; callee; callee = callee->tail, i++) { sprintf(buf, "callee%d", i); Temp_enter(m, args, ""); } for (int i=0; caller; caller = caller->tail, i++) { sprintf(buf, "caller%d", i); Temp_enter(m, args, ""); } } return Temp_layerMap(m, Temp_name()); }
/* alloc another mem_hdr to alloc memory */ F_RET memp_alloc_another ( Memp ps_memp_in ) { Memp_p *ps_memp = T_NULL; Mem_hdr *ps_hdr = T_NULL; T_UINT32 ul_grow_size = 0; PN_RET(ps_memp_in, MEMP_NULL_PTR); ps_memp = (Memp_p*)ps_memp_in; ul_grow_size = ps_memp->ul_grow_size; ps_hdr = (Mem_hdr*)malloc(ul_grow_size); PN_RET(ps_hdr, MEMP_NULL_PTR); F_ZERO(ps_hdr, sizeof(Mem_hdr)); ps_hdr->pc_next_hdr = ps_memp->pc_mem_addr; /* change to original mem_hdr */ ps_hdr->ul_size = ul_grow_size; ps_hdr->ul_left = ul_grow_size; ps_hdr->pc_curr = (T_CHAR*)ps_hdr + sizeof(Mem_hdr); ps_memp->pc_mem_addr = ps_hdr; /* refresh memp pointer */ return F_SUCCESS; }
AS_instrList F_procEntryExit2(AS_instrList body) { static Temp_tempList returnSink = NULL; if (returnSink) returnSink = Temp_TempList( F_ZERO(), Temp_TempList( F_RA(), Temp_TempList( F_SP(), F_CALLEE()))); return AS_splice(body, AS_IOnstrList( AS_Oper("", NULL, returnSink, NULL), NULL)); }