Пример #1
0
static Val   repair_word   (
    //       ===========
    //
    Val                w,
    Sibid*          oldBOOK2SIBID,
    //
    Punt  addrOffset  [ MAX_AGEGROUPS ][ MAX_PLAIN_SIBS ],
    //
    Addresstable*      hugechunk_region_table,
    Val*               externs
) {
    //
    if (IS_POINTER(w)) {
	//
	Punt	chunk = HEAP_POINTER_AS_UNT(w);
	Sibid	aid = SIBID_FOR_POINTER(oldBOOK2SIBID, chunk);

	if (SIBID_KIND_IS_CODE(aid)) {

	    Hugechunk_Relocation_Info* dp = address_to_relocation_info (oldBOOK2SIBID, hugechunk_region_table, aid, chunk);

	    return PTR_CAST( Val, (chunk - dp->old_address) + dp->new_chunk->chunk);

	} else {

	    int	g = GET_AGE_FROM_SIBID(aid)-1;
	    int	chunkc = GET_KIND_FROM_SIBID(aid)-1;
	    return PTR_CAST( Val,  PTR_CAST(char*, w) + addrOffset[g][chunkc]);
	}

    } else if (IS_EXTERNAL_TAG(w)) {
Пример #2
0
static lib7_val_t   repair_word   (   lib7_val_t   w,
				       aid_t*        oldBIBOP,
				       Addr_t        addrOffset  [ MAX_NUM_GENS ][ NUM_ARENAS ],
				       addr_table_t* boRegionTable,
				       lib7_val_t*  externs
) {
    if (isBOXED(w)) {
	Addr_t	chunk = PTR_LIB7toADDR(w);
	aid_t	aid = ADDR_TO_PAGEID(oldBIBOP, chunk);

	if (IS_BIGCHUNK_AID(aid)) {

	    bo_reloc_t* dp = address_to_relocation_info (oldBIBOP, boRegionTable, aid, chunk);

	    return PTR_CtoLib7((chunk - dp->oldAddr) + dp->newChunk->chunk);

	} else {

	    int	g = EXTRACT_GEN(aid)-1;
	    int	chunkc = EXTRACT_CHUNKC(aid)-1;
	    return PTR_CtoLib7(PTR_LIB7toC(char, w) + addrOffset[g][chunkc]);
	}

    } else if (isEXTERNTAG(w)) {