Ignore:
Timestamp:
Jan 7, 2015, 6:04:42 PM (10 years ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, string, with_gc
Children:
0b8cd722
Parents:
d9a0e76
Message:

fixed restrict, fixed parameter copy, introduced name table for types, changed variable after to string

File:
1 edited

Legend:

Unmodified
Added
Removed
  • translator/GenPoly/CopyParams.cc

    rd9a0e76 r17cd4eb  
    1 /*
    2  * This file is part of the Cforall project
    3  *
    4  * $Id: CopyParams.cc,v 1.3 2005/08/29 20:14:13 rcbilson Exp $
    5  *
    6  */
    7 
    81#include <set>
    92#include <map>
     
    1912
    2013namespace GenPoly {
     14    class CopyParams : public Visitor {
     15      public:
     16        CopyParams();
     17 
     18        virtual void visit( FunctionDecl *funcDecl );
     19        virtual void visit( AddressExpr *addrExpr );
    2120
    22 class CopyParams : public Visitor
    23 {
    24 public:
    25   CopyParams();
    26  
    27   virtual void visit( FunctionDecl *funcDecl );
    28   virtual void visit( AddressExpr *addrExpr );
     21      private:
     22        std::set< UniqueId > modVars;
     23        UniqueName namer;
     24    };
    2925
    30 private:
    31   std::set< UniqueId > modVars;
    32   UniqueName namer;
    33 };
     26    void copyParams( std::list< Declaration* > &translationUnit ) {
     27        CopyParams copier;
     28        acceptAll( translationUnit, copier );
     29    }
    3430
    35 void
    36 copyParams( std::list< Declaration* > &translationUnit )
    37 {
    38   CopyParams copier;
    39   acceptAll( translationUnit, copier );
    40 }
     31    CopyParams::CopyParams() : namer( "_cp" ) {}
    4132
    42 CopyParams::CopyParams()
    43   : namer( "_cp" )
    44 {
    45 }
     33    static const std::list< Label > noLabels;
    4634
    47 static const std::list< Label > noLabels;
     35    void CopyParams::visit( FunctionDecl *funcDecl ) {
     36        if ( funcDecl->get_statements() ) {
     37            funcDecl->get_statements()->accept( *this );
     38   
     39            if ( ! modVars.empty() ) {
     40                std::map< std::string, DeclarationWithType* > assignOps;
     41                // assume the assignment operator is the first assert param after any "type" parameter
     42                for ( std::list< TypeDecl* >::const_iterator tyVar = funcDecl->get_functionType()->get_forall().begin(); tyVar != funcDecl->get_functionType()->get_forall().end(); ++tyVar ) {
     43                    if ( (*tyVar)->get_kind() == TypeDecl::Any ) {
     44                        assert( !(*tyVar)->get_assertions().empty() );
     45                        assignOps[ (*tyVar)->get_name() ] = (*tyVar)->get_assertions().front();
     46                    } // if
     47                } // for
     48                for( std::list< DeclarationWithType* >::iterator param = funcDecl->get_functionType()->get_parameters().begin(); param != funcDecl->get_functionType()->get_parameters().end(); ++param ) {
     49                    std::set< UniqueId >::const_iterator var = modVars.find( (*param)->get_uniqueId() );
     50                    if ( var != modVars.end() ) {
     51                        TypeInstType *typeInst = dynamic_cast< TypeInstType* >( (*param)->get_type() );
     52                        assert( typeInst );
     53                        std::map< std::string, DeclarationWithType* >::const_iterator assignOp = assignOps.find( typeInst->get_name() );
     54                        if ( assignOp != assignOps.end() ) {
     55                            DeclarationWithType *oldParam = *param;
     56                            *param = (*param)->clone();
     57                            (*param)->set_mangleName( namer.newName( (*param)->get_mangleName() ) );
     58                            ApplicationExpr *assign = new ApplicationExpr( new VariableExpr( assignOp->second ) );
     59                            assign->get_args().push_back( new VariableExpr( oldParam ) );
     60                            assign->get_args().push_back( new VariableExpr( *param ) );
     61                            funcDecl->get_statements()->get_kids().push_front( new ExprStmt( noLabels, assign ) );
     62                            funcDecl->get_statements()->get_kids().push_front( new DeclStmt( noLabels, oldParam ) );
     63                        } // if
     64                        modVars.erase( var );
     65                    } // if
     66                } // for
     67            } // if
     68        } // if
     69    }
    4870
    49 void
    50 CopyParams::visit( FunctionDecl *funcDecl )
    51 {
    52   if( funcDecl->get_statements() ) {
    53     funcDecl->get_statements()->accept( *this );
    54    
    55     if( !modVars.empty() ) {
    56       std::map< std::string, DeclarationWithType* > assignOps;
    57       // assume that the assignment operator is the first assert param after any "type" parameter
    58       for( std::list< TypeDecl* >::const_iterator tyVar = funcDecl->get_functionType()->get_forall().begin(); tyVar != funcDecl->get_functionType()->get_forall().end(); ++tyVar ) {
    59         if( (*tyVar)->get_kind() == TypeDecl::Any ) {
    60           assert( !(*tyVar)->get_assertions().empty() );
    61           assignOps[ (*tyVar)->get_name() ] = (*tyVar)->get_assertions().front();
    62         }
    63       }
    64       for( std::list< DeclarationWithType* >::iterator param = funcDecl->get_functionType()->get_parameters().begin(); param != funcDecl->get_functionType()->get_parameters().end(); ++param ) {
    65         std::set< UniqueId >::const_iterator var = modVars.find( (*param)->get_uniqueId() );
    66         if( var != modVars.end() ) {
    67           TypeInstType *typeInst = dynamic_cast< TypeInstType* >( (*param)->get_type() );
    68           assert( typeInst );
    69           std::map< std::string, DeclarationWithType* >::const_iterator assignOp = assignOps.find( typeInst->get_name() );
    70           if( assignOp != assignOps.end() ) {
    71             DeclarationWithType *oldParam = *param;
    72             *param = (*param)->clone();
    73             (*param)->set_name( namer.newName() );
    74             ApplicationExpr *assign = new ApplicationExpr( new VariableExpr( assignOp->second ) );
    75             assign->get_args().push_back( new VariableExpr( oldParam ) );
    76             assign->get_args().push_back( new VariableExpr( *param ) );
    77             funcDecl->get_statements()->get_kids().push_front( new ExprStmt( noLabels, assign ) );
    78             funcDecl->get_statements()->get_kids().push_front( new DeclStmt( noLabels, oldParam ) );
    79           }
    80           modVars.erase( var );
    81         }
    82       }
     71    // this test is insufficient because it is possible for values to be modified by being passed to other polymorphic
     72    // routines (e.g., assignment operators) without having their addresses explicitly taken. Some thought is needed to
     73    // make sure that all of the correct cases are identified where copies are necessary.
     74    //
     75    // As a temporary measure, for correctness at the expense of performance, ignore the modVars list entirely and copy
     76    // every parameter of TypeInstType* when visiting the FunctionDecl.
     77    void CopyParams::visit( AddressExpr *addrExpr ) {
     78        if ( VariableExpr *varExpr = dynamic_cast< VariableExpr* >( addrExpr->get_arg() ) ) {
     79            if ( dynamic_cast< TypeInstType* >( varExpr->get_var()->get_type() ) ) {
     80                modVars.insert( varExpr->get_var()->get_uniqueId() );
     81            } // if
     82        } // if
    8383    }
    84   }
    85 }
    86 
    87 void
    88 CopyParams::visit( AddressExpr *addrExpr )
    89 {
    90   if( VariableExpr *varExpr = dynamic_cast< VariableExpr* >( addrExpr->get_arg() ) ) {
    91     if( dynamic_cast< TypeInstType* >( varExpr->get_var()->get_type() ) ) {
    92       modVars.insert( varExpr->get_var()->get_uniqueId() );
    93     }
    94   }
    95 }
    96 
    9784} // namespace GenPoly
Note: See TracChangeset for help on using the changeset viewer.