process.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 1,633 行 · 第 1/4 页

C
1,633
字号
    case LOC_MS_LINK_OFFSET:    Output( "  LROFFSET   " );   break;
    case LOC_BASE_OFFSET_32:    /* fall through */
    case LOC_MS_BASE_OFFSET_32: Output( "  POINTER386 " );   break;
    case LOC_MS_OFFSET_32:      Output( "  OFFSET386  " );   break;
    case LOC_MS_LINK_OFFSET_32: Output( "  LROFFSET386" );   break;
    default:
        Output( BAILOUT "Unknown loc, type = %b" CRLF, typ );
        longjmp( BailOutJmp, 1 );
    }
    typ = GetByte();
    if( TranslateIndex ) {
        RecPtrsave = RecPtr;
    }
    frame = ( typ >> 4 ) & 0x07;
    Output( "  Frame: " );
    if( typ & FIXDAT_FTHREAD ) {
        Output( "THREAD %u", frame );
    } else {
        doFrame( frame );
    }
    loc = typ & 0x03;
    Output( "  Target: " );
    if( typ & FIXDAT_TTHREAD ) {
        Output( "THREAD %u", loc );
    } else {
        doTarget( loc );
    }
    if( typ & 0x04 ) {
        Output( CRLF );
    } else {
        Output( ",%X" CRLF, GetEither() );
    }
    if( TranslateIndex ) {
        RecPtrsave1 = RecPtr;
        RecPtr = RecPtrsave;
        printpos = 0;
        if( ! (typ & FIXDAT_FTHREAD) ) {
            needcrlf |= doFrameTranslateIndex( frame, &printpos );
        }
        if( ! (typ & FIXDAT_TTHREAD) ) {
            needcrlf |= doTargetTranslateIndex( loc, &printpos );
        }
        if( needcrlf ) {
            Output( CRLF );
        }
        RecPtr = RecPtrsave1;
    }
}

void ProcFixup( void )
/********************/
{
    byte    typ;

    if( Descriptions ) {
        Output( INDENT "Locat Mode    Method     "
            "  Fixup Frame    Fixup Target(,displacement)" CRLF );
        Output( INDENT "----- ----  -----------  "
            "---------------  ---------------------------" CRLF );
    }
    while( ! EndRec() ) {
        typ = GetByte();
        if( typ & FIXUPP_FIXUP ) {
            explicitFixup( typ );
        } else {
            threadFixup( typ );
        }
    }
}

void ProcModEnd( void )
/*********************/
{
    byte        mod_type;
    byte        typ;
    byte        frame;
    byte        loc;

    mod_type = GetByte();
    Output( INDENT "mod type:%smain module %s" CRLF,
        ( mod_type & 0x80 ) ? "":"non-",
        ( mod_type & 0x40 ) ? "with start address" : ""
    );
    if( mod_type & 0x1 && !EndRec() ) {
        typ = GetByte();
        frame = ( typ >> 4 ) & 0x07;
        Output( INDENT "Frame: " );
        if( typ & FIXDAT_FTHREAD ) {
            Output( "THREAD %u", frame );
        } else {
            doFrame( frame );
        }
        loc = typ & 0x03;
        Output( "  Target: " );
        if( typ & FIXDAT_TTHREAD ) {
            Output( "THREAD %u", loc & 0x03 );
        } else {
            doTarget( loc );
        }
        if( typ & 0x04 ) {
            Output( CRLF );
        } else {
            Output( ",%X" CRLF, GetEither() );
        }
    }
}

static void dmpBytes( int num )
{
    while( num-- > 0 ) {
        Output( " %b", GetByte() );
    }
}

void ProcGrpDef( void )
/*********************/
{
    byte        grptype;
    char        *grpname;
    char        *segname;
    char        *classname;
    unsigned_16 grpidx;
    unsigned_16 idx;
    unsigned_16 idxidx;

    grpidx = GetIndex();
    if( TranslateIndex ) {
        grpname = GetLname( grpidx );
        AddGrpdef( grpidx, 0 ); /* start new grpdef */
        Output( INDENT "name: %u - '%s'" CRLF, grpidx, grpname );
    } else {
        Output( INDENT "name: %u" CRLF, grpidx );
    }
    while( !EndRec() ) {
        grptype = GetByte();
        Output( INDENT "member: " );
        switch( grptype ) {
            case GRP_SEGIDX:
                idx = GetIndex();
                if( TranslateIndex ) {
                    AddGrpdef( grpidx, idx );
                    idxidx = GetGrpseg( idx );
                    segname = GetLname( idxidx );
                    Output( "seg %u - %u - '%s'", idx, idxidx, segname );
                } else {
                    Output( "seg %u", idx );
                }
                break;
            case GRP_EXTIDX:
                idx = GetIndex();
                if( TranslateIndex ) {
                    AddGrpdef( grpidx, idx );
                    segname = GetXname( idx );
                    Output( "ext %u - '%s'", idx, segname );
                } else {
                    Output( "ext %u", idx );
                }
                break;
            case GRP_FULLNAME:
                {
                    unsigned_16 seg;
                    unsigned_16 class;
                    unsigned_16 ovl;

                    seg = GetIndex();
                    class = GetIndex();
                    ovl = GetIndex();
                    if( TranslateIndex ) {
                        AddGrpdef( grpidx, idx );
                        idxidx = GetGrpseg( seg );
                        segname = GetLname( idxidx );
                        classname = GetLname( class );
                        Output( "seg %u - %u - '%s', class %u - '%s', ovl %u",
                            seg, idxidx, segname, class, classname, ovl );
                    } else {
                        Output( "seg %u, class %u, ovl %u", seg, class, ovl );
                    }
                }
                break;
            case GRP_LTLDATA:
                Output( "%b", grptype );
                dmpBytes( 6 );
                break;
            case GRP_ADDR:
                Output( "%b", grptype );
                dmpBytes( 4 );
                break;
            default:
                Output( BAILOUT "Unknown group type(%b)" CRLF, grptype );
                longjmp( BailOutJmp, 1 );
                break;
        }
        Output( CRLF );
    }
}

static unsigned_32 libDictOffs;
static unsigned_16 libDictSize;

void ProcLibHeader( void )
{
    byte                flags;

    Output( INDENT "Page size        : %u" CRLF, RecLen + 4 );
    libDictOffs = GetLInt();
    libDictSize = GetUInt();
    flags = GetByte();
    Output( INDENT "Dictionary Offset: %X" CRLF, libDictOffs );
    Output( INDENT "Dictionary Size  : %x" CRLF, libDictSize );
    Output( INDENT "Case-Sensitive   : %s" CRLF,
        ( flags & 1 ) ? "Yes" : "No" );
    OutputData( 0, 0 );
}

static void doBucket( int bucket )
{
    byte                bucket_value;

    bucket_value = GetByte();
    if( bucket_value == 0 ) {
        Output( "%b:     ", bucket );
    } else {
        Output( "%b:%x", bucket, 2*bucket_value );
    }
}

void ProcLibTrailer( FILE *fp )
{
    unsigned_16         dict_block;
    int                 i;
    int                 free;

    if( fseek( fp, libDictOffs, SEEK_SET ) != 0 ) {
        return;
    }
    ResizeBuff( 512 );
    for( dict_block = 0; dict_block < libDictSize; ++dict_block ) {
        if( fread( RecBuff, 512, 1, fp ) == 0 ) {
             break;
        }
        RecPtr = RecBuff;
        RecLen = 512;
        Output( CRLF "Dictionary Block %x:" CRLF
            INDENT "Buckets:" CRLF INDENT, dict_block );
        for( i = 0; i < 36; i += 6 ) {
            doBucket( i ); Output( "  " );
            doBucket( i + 1 ); Output( "  " );
            doBucket( i + 2 ); Output( "  " );
            doBucket( i + 3 ); Output( "  " );
            doBucket( i + 4 ); Output( "  " );
            doBucket( i + 5 ); Output( CRLF INDENT );
        }
        doBucket( 36 );
        free = GetByte() * 2;
        Output( CRLF INDENT "Free Byte: %x" CRLF INDENT "Entries:" CRLF,
            free );
        while( RecOffset() < free ) {
            i = RecOffset();
            GetName();
            Output( INDENT "%x: %N Page %x" CRLF, i, GetUInt() );
            if( RecOffset() & 1 ) {
                GetByte();
            }
        }
    }
}


static char *PatchType( void )
/****************************/
{
    char                *fix;

    switch( GetByte() ) {
    case 0: fix = "8-bit lobyte";       break;
    case 1: fix = "16-bit offset";      break;
    case 2: fix = "32-bit offset";      break;
    default: fix = "*** ill fix type ***"; break;
    }
    return( fix );
}


static void DoBackPat( void )
/***************************/
{
    unsigned_32         off;
    unsigned_32         val;

    while( !EndRec() ) {
        off = GetEither();
        val = GetEither();
        Output( INDENT "    offset:%X - value:%X" CRLF, off, val );
    }
}


void ProcBackPat( void )
/**********************/
{
    unsigned            seg;
    char                *fix;

    seg = GetIndex();
    fix = PatchType();
    Output( INDENT "Segment:%u - %s" CRLF, seg, fix );
    DoBackPat();
}


void ProcNameBackPat( void )
/**************************/
{
    unsigned            sym;
    char                *fix;

    fix = PatchType();
    sym = GetIndex();
    Output( INDENT "Symbol:%u - %s" CRLF, sym, fix );
    DoBackPat();
}


void ProcComDat( void )
/*********************/
{
    unsigned    flag;
    unsigned    attr;
    unsigned    sel;
    unsigned    alloc;
    unsigned    align;
    unsigned_32 offset;
    unsigned    typ;
    unsigned    sym;
    static char *ComAlign[] = {
        "SEGDEF", "BYTE", "WORD", "PARA", "4K", "DWORD"
    };
    static char *ComSel[] = {
        "NO MATCH", "ANY", "SAME SIZE", "EXACT MATCH"
    };
    static char *ComAlloc[] = {
        "EXPLICIT", "FAR CODE", "FAR DATA", "CODE32", "DATA32"
    };

    flag = GetByte();
    attr = GetByte();
    sel = (attr >> 4) & 0xf;
    alloc = attr & 0xf;
    if( sel > 3 || alloc > 4 ) {
        Output( BAILOUT "Unknown attr => %b" CRLF, attr );
        longjmp( BailOutJmp, 1 );
    }
    align = GetByte();
    if( align > 5 ) {
        Output( BAILOUT "Unknown align => %b" CRLF, align );
        longjmp( BailOutJmp, 1 );
    }
    offset = GetEither();
    typ = GetIndex();
    Output( INDENT "align:%s, select:%s, alloc:%s",
            ComAlign[align], ComSel[sel], ComAlloc[alloc] );
    if( alloc == 0 ) { /* explict allocation */
        Output( " ==> " );
        getBase( FALSE );
    }
    Output( CRLF );
    sym = GetIndex();
    Output( INDENT "sym:%u, typ:%u, offset:%X", sym, typ, offset );
    if( flag & 0x1 ) Output( " continued" );
    if( flag & 0x4 ) Output( " local" );
    if( flag & 0x2 ) Output( " iterated" );
    else             Output( " enumerated" );
    Output( CRLF );
    if( flag & 0x2 ) {
        DoLidata();
    } else {
        OutputData( offset, 0L );
    }
}


void ProcAlias( void )
/********************/
{
    GetName();
    Output( INDENT "alias = <%N> "  );
    GetName();
    Output( "substitue = <%N>" CRLF );
}


void ProcVerNum( void )
/*********************/
{
    GetName();
    Output( INDENT "***** TIS compliant OMF *****" CRLF );
    Output( INDENT INDENT "Version <%N>" CRLF );
}


void ProcVendExt( void )
/**********************/
{
    OutputData( 0L, 0L );
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?