cgbkstrn.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 174 行

C
174
字号
/****************************************************************************
*
*                            Open Watcom Project
*
*    Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
*  ========================================================================
*
*    This file contains Original Code and/or Modifications of Original
*    Code as defined in and that are subject to the Sybase Open Watcom
*    Public License version 1.0 (the 'License'). You may not use this file
*    except in compliance with the License. BY USING THIS FILE YOU AGREE TO
*    ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
*    provided with the Original Code and Modifications, and is also
*    available at www.sybase.com/developer/opensource.
*
*    The Original Code and all software distributed under the License are
*    distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
*    EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
*    ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
*    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
*    NON-INFRINGEMENT. Please see the License for the specific language
*    governing rights and limitations under the License.
*
*  ========================================================================
*
* Description:  WHEN YOU FIGURE OUT WHAT THIS FILE DOES, PLEASE
*               DESCRIBE IT HERE!
*
****************************************************************************/


#include "plusplus.h"

#include <float.h>

#include "cgfront.h"
#include "cgback.h"
#include "codegen.h"
#include "cgbackut.h"
#include "ring.h"
#include "vstk.h"
#include "initdefs.h"

typedef struct                  // SYM_TRANS -- symbol translation
{   SYMBOL src;                 // - source SYMBOL
    SYMBOL tgt;                 // - target SYMBOL
    unsigned id;                // - id for translation block
} SYM_TRANS;

#ifndef NDEBUG

    #include "toggle.h"
    #include "errdefns.h"
    #include <stdio.h>
    #include "pragdefn.h"

    void dump( const char* msg, SYM_TRANS* tr )
    {
        if( PragDbgToggle.dump_exec_ic ) {
            printf( "SYM_TRANS( %s ) src(%x) tgt(%x) id(%x)\n"
                  , msg
                  , tr->src
                  , tr->tgt
                  , tr->id );
        }
    }

#else

    #define dump( a, b )

#endif



static VSTK_CTL stack_sym_trans;    // stack: symbol translation
static unsigned sym_trans_id;       // identifies sym. translation block


void* SymTrans(                 // TRANSLATE SYMBOL/SCOPE
    void *src )                 // - source value
{
    SYM_TRANS *tr;              // - translation element (current)
    unsigned bound;             // - bounding id

    bound = FnCtlTop()->sym_trans_id;
    for( tr = VstkTop( &stack_sym_trans )
       ; tr != NULL && bound <= tr->id
       ; tr = VstkNext( &stack_sym_trans, tr ) ) {
        if( src == tr->src ) {
            src = tr->tgt;
            dump( "used", tr );
            break;
        }
    }
    return( src );
}


void SymTransPush(              // ADD A SYMBOL TO BE TRANSLATED
    SYMBOL src,                 // - source SYMBOL
    SYMBOL tgt )                // - target SYMBOL
{
    SYM_TRANS *tr;              // - translation element

    tr = VstkPush( &stack_sym_trans );
    tr->src = src;
    tr->tgt = tgt;
    tr->id  = sym_trans_id;
    dump( "defined", tr );
}


#ifndef NDEBUG
void SymTransEmpty(             // DEBUG: VERIFY SYMBOL TRANSLATIONS OVER
    void )
{
    DbgVerify( NULL == VstkTop( &stack_sym_trans )
             , "SymTransEmpty -- stack not empty" );
    DbgVerify( 0 == sym_trans_id
             , "SymTransEmpty -- id != 0" );
}
#endif


void SymTransNewBlock(          // START NEW BLOCK OF TRANSLATIONS
    void )
{
    ++ sym_trans_id;
}


void SymTransFuncBeg(           // START NEW FUNCTION TRANSLATION
    FN_CTL* fctl )              // - function control
{
    fctl->sym_trans_id = sym_trans_id;
}


void SymTransFuncEnd(           // COMPLETE FUNCTION TRANSLATION
    FN_CTL* fctl )              // - function control
{
    SYM_TRANS* top;             // - top translation

    sym_trans_id = fctl->sym_trans_id;
    for( ; ; VstkPop( &stack_sym_trans ) ) {
        top = VstkTop( &stack_sym_trans );
        if( top == NULL ) break;
        if( top->id < sym_trans_id ) break;
        dump( "freed", top );
    }
}


static void symTransInit(       // INITIALIZE CGBKSTRN
    INITFINI* defn )            // - definition
{
    defn = defn;
    sym_trans_id = 0;
    VstkOpen( &stack_sym_trans, sizeof( SYM_TRANS ), 16 );
}


static void symTransFini(       // COMPLETE CGBKSTRN
    INITFINI* defn )            // - definition
{
    defn = defn;
    VstkClose( &stack_sym_trans );
}


INITDEFN( sym_trans, symTransInit, symTransFini )

⌨️ 快捷键说明

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