Changeset 6c4ff37 for src/CodeGen


Ignore:
Timestamp:
Jun 2, 2015, 11:51:22 AM (9 years ago)
Author:
Rob Schluntz <rschlunt@…>
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:
2b6c1e0
Parents:
6db50d5
Message:

rename CodeGenerator2 -> CodeGenerator?, CodeGenerator? refactoring and output reformatting, fix bug where while loop body label does not print

Location:
src/CodeGen
Files:
3 edited
2 moved

Legend:

Unmodified
Added
Removed
  • src/CodeGen/CodeGenerator.cc

    r6db50d5 r6c4ff37  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // CodeGenerator2.cc --
     7// CodeGenerator.cc --
    88//
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun May 24 20:43:16 2015
    13 // Update Count     : 11
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Tue Jun 02 11:45:06 2015
     13// Update Count     : 65
    1414//
    1515
     
    2828#include "UnimplementedError.h"
    2929
    30 #include "CodeGenerator2.h"
     30#include "CodeGenerator.h"
    3131#include "OperatorTable.h"
    3232#include "GenType.h"
     
    3535
    3636namespace CodeGen {
    37         int CodeGenerator2::tabsize = 4;
    38 
    39         CodeGenerator2::CodeGenerator2( std::ostream &os ) : cur_indent( 0 ), insideFunction( false ), before( os ), after() { }
    40 
    41         CodeGenerator2::CodeGenerator2( std::ostream &os, std::string init, int indent, bool infunp )
    42                         : cur_indent( indent ), insideFunction( infunp ), before( os ) {
    43                 //before << std::string( init );
    44         }
    45 
    46         CodeGenerator2::CodeGenerator2( std::ostream &os, char *init, int indent, bool infunp )
    47                         : cur_indent( indent ), insideFunction( infunp ), before( os ) {
    48                 //before << std::string( init );
     37        int CodeGenerator::tabsize = 4;
     38
     39        CodeGenerator::CodeGenerator( std::ostream &os ) : cur_indent( 0 ), insideFunction( false ), output( os ) { }
     40
     41        CodeGenerator::CodeGenerator( std::ostream &os, std::string init, int indent, bool infunp )
     42                        : cur_indent( indent ), insideFunction( infunp ), output( os ) {
     43                //output << std::string( init );
     44        }
     45
     46        CodeGenerator::CodeGenerator( std::ostream &os, char *init, int indent, bool infunp )
     47                        : cur_indent( indent ), insideFunction( infunp ), output( os ) {
     48                //output << std::string( init );
    4949        }
    5050
     
    5858 
    5959        //*** Declarations
    60         void CodeGenerator2::visit( FunctionDecl *functionDecl ) {
     60        void CodeGenerator::visit( FunctionDecl *functionDecl ) {
    6161                handleStorageClass( functionDecl );
    6262                if ( functionDecl->get_isInline() ) {
    63                         before << "inline ";
    64                 } // if
    65                 before << genType( functionDecl->get_functionType(), mangleName( functionDecl ) );
     63                        output << "inline ";
     64                } // if
     65                output << genType( functionDecl->get_functionType(), mangleName( functionDecl ) );
    6666
    6767                // how to get this to the Functype?
    6868                std::list< Declaration * > olds = functionDecl->get_oldDecls();
    6969                if ( ! olds.empty() ) {
    70                         before << " /* function has old declaration */";
     70                        output << " /* function has old declaration */";
    7171                } // if
    7272
     
    7777        }
    7878
    79         void CodeGenerator2::visit( ObjectDecl *objectDecl ) {
     79        void CodeGenerator::visit( ObjectDecl *objectDecl ) {
    8080                handleStorageClass( objectDecl );
    81                 before << genType( objectDecl->get_type(), mangleName( objectDecl ) );
     81                output << genType( objectDecl->get_type(), mangleName( objectDecl ) );
    8282       
    8383                if ( objectDecl->get_init() ) {
    84                         before << " = ";
     84                        output << " = ";
    8585                        objectDecl->get_init()->accept( *this );
    8686                } // if
    8787                if ( objectDecl->get_bitfieldWidth() ) {
    88                         before << ":";
     88                        output << ":";
    8989                        objectDecl->get_bitfieldWidth()->accept( *this );
    9090                } // if
    9191        }
    9292
    93         void CodeGenerator2::handleAggregate( AggregateDecl *aggDecl ) {
     93        void CodeGenerator::handleAggregate( AggregateDecl *aggDecl ) {
    9494                if ( aggDecl->get_name() != "" )
    95                         before << aggDecl->get_name();
     95                        output << aggDecl->get_name();
    9696       
    9797                std::list< Declaration * > &memb = aggDecl->get_members();
    9898
    9999                if ( ! memb.empty() ) {
    100                         before << endl << string( cur_indent, ' ' ) << "{" << endl;
    101 
    102                         cur_indent += CodeGenerator2::tabsize;
     100                        output << endl << string( cur_indent, ' ' ) << "{" << endl;
     101
     102                        cur_indent += CodeGenerator::tabsize;
    103103                        for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end();  i++) {
    104                                 before << string( cur_indent, ' ' );
     104                                output << string( cur_indent, ' ' );
    105105                                (*i)->accept(*this );
    106                                 before << ";" << endl;
     106                                output << ";" << endl;
    107107                        }
    108108
    109                         cur_indent -= CodeGenerator2::tabsize;
    110 
    111                         before << string( cur_indent, ' ' ) << "}";
    112                 } // if
    113         }
    114 
    115         void CodeGenerator2::visit( StructDecl *structDecl ) {
    116                 before << "struct ";
     109                        cur_indent -= CodeGenerator::tabsize;
     110
     111                        output << string( cur_indent, ' ' ) << "}";
     112                } // if
     113        }
     114
     115        void CodeGenerator::visit( StructDecl *structDecl ) {
     116                output << "struct ";
    117117                handleAggregate( structDecl );
    118118        }
    119119
    120         void CodeGenerator2::visit( UnionDecl *aggregateDecl ) {
    121                 before << "union ";
     120        void CodeGenerator::visit( UnionDecl *aggregateDecl ) {
     121                output << "union ";
    122122                handleAggregate( aggregateDecl );
    123123        }
    124124 
    125         void CodeGenerator2::visit( EnumDecl *aggDecl ) {
    126                 before << "enum ";
     125        void CodeGenerator::visit( EnumDecl *aggDecl ) {
     126                output << "enum ";
    127127
    128128                if ( aggDecl->get_name() != "" )
    129                         before << aggDecl->get_name();
     129                        output << aggDecl->get_name();
    130130       
    131131                std::list< Declaration* > &memb = aggDecl->get_members();
    132132
    133133                if ( ! memb.empty() ) {
    134                         before << endl << "{" << endl;
    135 
    136                         cur_indent += CodeGenerator2::tabsize;
     134                        output << endl << "{" << endl;
     135
     136                        cur_indent += CodeGenerator::tabsize;
    137137                        for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end();  i++) {
    138138                                ObjectDecl *obj = dynamic_cast< ObjectDecl* >( *i );
    139139                                assert( obj );
    140                                 before << string( cur_indent, ' ' ) << mangleName( obj );
     140                                output << string( cur_indent, ' ' ) << mangleName( obj );
    141141                                if ( obj->get_init() ) {
    142                                         before << " = ";
     142                                        output << " = ";
    143143                                        obj->get_init()->accept(*this );
    144144                                } // if
    145                                 before << "," << endl;
     145                                output << "," << endl;
    146146                        } // for
    147147
    148                         cur_indent -= CodeGenerator2::tabsize;
    149 
    150                         before << "}" << endl;
    151                 } // if
    152         }
    153  
    154         void CodeGenerator2::visit( ContextDecl *aggregateDecl ) {}
    155  
    156         void CodeGenerator2::visit( TypedefDecl *typeDecl ) {
    157                 before << "typedef ";
    158                 before << genType( typeDecl->get_base(), typeDecl->get_name() );
    159         }
    160  
    161         void CodeGenerator2::visit( TypeDecl *typeDecl ) {
     148                        cur_indent -= CodeGenerator::tabsize;
     149
     150                        output << "}" << endl;
     151                } // if
     152        }
     153 
     154        void CodeGenerator::visit( ContextDecl *aggregateDecl ) {}
     155 
     156        void CodeGenerator::visit( TypedefDecl *typeDecl ) {
     157                output << "typedef ";
     158                output << genType( typeDecl->get_base(), typeDecl->get_name() );
     159        }
     160 
     161        void CodeGenerator::visit( TypeDecl *typeDecl ) {
    162162                // really, we should mutate this into something that isn't a TypeDecl but that requires large-scale changes,
    163163                // still to be done
    164                 before << "extern unsigned long " << typeDecl->get_name();
     164                output << "extern unsigned long " << typeDecl->get_name();
    165165                if ( typeDecl->get_base() ) {
    166                         before << " = sizeof( " << genType( typeDecl->get_base(), "" ) << " )";
    167                 } // if
    168         }
    169 
    170         void CodeGenerator2::visit( SingleInit *init ) {
     166                        output << " = sizeof( " << genType( typeDecl->get_base(), "" ) << " )";
     167                } // if
     168        }
     169
     170        void CodeGenerator::visit( SingleInit *init ) {
    171171                init->get_value()->accept( *this );
    172172        }
    173173
    174         void CodeGenerator2::visit( ListInit *init ) {
    175                 before << "{ ";
     174        void CodeGenerator::visit( ListInit *init ) {
     175                output << "{ ";
    176176                genCommaList( init->begin_initializers(), init->end_initializers() );
    177                 before << " }";
    178         }
    179 
    180         void CodeGenerator2::visit( Constant *constant ) {
    181                 before << constant->get_value() ;
     177                output << " }";
     178        }
     179
     180        void CodeGenerator::visit( Constant *constant ) {
     181                output << constant->get_value() ;
    182182        }
    183183
    184184        //*** Expressions
    185         void CodeGenerator2::visit( ApplicationExpr *applicationExpr ) {
     185        void CodeGenerator::visit( ApplicationExpr *applicationExpr ) {
    186186                if ( VariableExpr *varExpr = dynamic_cast< VariableExpr* >( applicationExpr->get_function() ) ) {
    187187                        OperatorInfo opInfo;
     
    214214                                        assert( applicationExpr->get_args().size() == 2 );
    215215                                        (*arg++)->accept( *this );
    216                                         before << "[";
    217                                         (*arg)->accept( *this );
    218                                         before << "]";
     216                                        output << "[";
     217                                        (*arg)->accept( *this );
     218                                        output << "]";
    219219                                        break;
    220220             
     
    227227                                  case OT_PREFIXASSIGN:
    228228                                        assert( applicationExpr->get_args().size() == 1 );
    229                                         before << "(";
    230                                         before << opInfo.symbol;
    231                                         (*arg)->accept( *this );
    232                                         before << ")";
     229                                        output << "(";
     230                                        output << opInfo.symbol;
     231                                        (*arg)->accept( *this );
     232                                        output << ")";
    233233                                        break;
    234234             
     
    237237                                        assert( applicationExpr->get_args().size() == 1 );
    238238                                        (*arg)->accept( *this );
    239                                         before << opInfo.symbol;
     239                                        output << opInfo.symbol;
    240240                                        break;
    241241
     
    243243                                  case OT_INFIXASSIGN:
    244244                                        assert( applicationExpr->get_args().size() == 2 );
    245                                         before << "(";
     245                                        output << "(";
    246246                                        (*arg++)->accept( *this );
    247                                         before << opInfo.symbol;
    248                                         (*arg)->accept( *this );
    249                                         before << ")";
     247                                        output << opInfo.symbol;
     248                                        (*arg)->accept( *this );
     249                                        output << ")";
    250250                                        break;
    251251             
     
    256256                        } else {
    257257                                varExpr->accept( *this );
    258                                 before << "(";
     258                                output << "(";
    259259                                genCommaList( applicationExpr->get_args().begin(), applicationExpr->get_args().end() );
    260                                 before << ")";
     260                                output << ")";
    261261                        } // if
    262262                } else {
    263263                        applicationExpr->get_function()->accept( *this );
    264                         before << "(";
     264                        output << "(";
    265265                        genCommaList( applicationExpr->get_args().begin(), applicationExpr->get_args().end() );
    266                         before << ")";
    267                 } // if
    268         }
    269  
    270         void CodeGenerator2::visit( UntypedExpr *untypedExpr ) {
     266                        output << ")";
     267                } // if
     268        }
     269 
     270        void CodeGenerator::visit( UntypedExpr *untypedExpr ) {
    271271                if ( NameExpr *nameExpr = dynamic_cast< NameExpr* >( untypedExpr->get_function() ) ) {
    272272                        OperatorInfo opInfo;
     
    277277                                        assert( untypedExpr->get_args().size() == 2 );
    278278                                        (*arg++)->accept( *this );
    279                                         before << "[";
    280                                         (*arg)->accept( *this );
    281                                         before << "]";
     279                                        output << "[";
     280                                        (*arg)->accept( *this );
     281                                        output << "]";
    282282                                        break;
    283283             
     
    289289                                  case OT_PREFIXASSIGN:
    290290                                        assert( untypedExpr->get_args().size() == 1 );
    291                                         before << "(";
    292                                         before << opInfo.symbol;
    293                                         (*arg)->accept( *this );
    294                                         before << ")";
     291                                        output << "(";
     292                                        output << opInfo.symbol;
     293                                        (*arg)->accept( *this );
     294                                        output << ")";
    295295                                        break;
    296296             
     
    299299                                        assert( untypedExpr->get_args().size() == 1 );
    300300                                        (*arg)->accept( *this );
    301                                         before << opInfo.symbol;
     301                                        output << opInfo.symbol;
    302302                                        break;
    303303 
     
    305305                                  case OT_INFIXASSIGN:
    306306                                        assert( untypedExpr->get_args().size() == 2 );
    307                                         before << "(";
     307                                        output << "(";
    308308                                        (*arg++)->accept( *this );
    309                                         before << opInfo.symbol;
    310                                         (*arg)->accept( *this );
    311                                         before << ")";
     309                                        output << opInfo.symbol;
     310                                        (*arg)->accept( *this );
     311                                        output << ")";
    312312                                        break;
    313313             
     
    318318                        } else {
    319319                                nameExpr->accept( *this );
    320                                 before << "(";
     320                                output << "(";
    321321                                genCommaList( untypedExpr->get_args().begin(), untypedExpr->get_args().end() );
    322                                 before << ")";
     322                                output << ")";
    323323                        } // if
    324324                } else {
    325325                        untypedExpr->get_function()->accept( *this );
    326                         before << "(";
     326                        output << "(";
    327327                        genCommaList( untypedExpr->get_args().begin(), untypedExpr->get_args().end() );
    328                         before << ")";
    329                 } // if
    330         }
    331  
    332         void CodeGenerator2::visit( NameExpr *nameExpr ) {
     328                        output << ")";
     329                } // if
     330        }
     331 
     332        void CodeGenerator::visit( NameExpr *nameExpr ) {
    333333                OperatorInfo opInfo;
    334334                if ( operatorLookup( nameExpr->get_name(), opInfo ) ) {
    335335                        assert( opInfo.type == OT_CONSTANT );
    336                         before << opInfo.symbol;
    337                 } else {
    338                         before << nameExpr->get_name();
    339                 } // if
    340         }
    341  
    342         void CodeGenerator2::visit( AddressExpr *addressExpr ) {
    343                 before << "(&";
     336                        output << opInfo.symbol;
     337                } else {
     338                        output << nameExpr->get_name();
     339                } // if
     340        }
     341 
     342        void CodeGenerator::visit( AddressExpr *addressExpr ) {
     343                output << "(&";
    344344                // this hack makes sure that we don't convert "constant_zero" to "0" if we're taking its address
    345345                if ( VariableExpr *variableExpr = dynamic_cast< VariableExpr* >( addressExpr->get_arg() ) ) {
    346                         before << mangleName( variableExpr->get_var() );
     346                        output << mangleName( variableExpr->get_var() );
    347347                } else {
    348348                        addressExpr->get_arg()->accept( *this );
    349349                } // if
    350                 before << ")";
    351         }
    352 
    353         void CodeGenerator2::visit( CastExpr *castExpr ) {
    354                 before << "((";
     350                output << ")";
     351        }
     352
     353        void CodeGenerator::visit( CastExpr *castExpr ) {
     354                output << "((";
    355355                if ( castExpr->get_results().empty() ) {
    356                         before << "void" ;
    357                 } else {
    358                         before << genType( castExpr->get_results().front(), "" );
    359                 } // if
    360                 before << ")";
     356                        output << "void" ;
     357                } else {
     358                        output << genType( castExpr->get_results().front(), "" );
     359                } // if
     360                output << ")";
    361361                castExpr->get_arg()->accept( *this );
    362                 before << ")";
    363         }
    364  
    365         void CodeGenerator2::visit( UntypedMemberExpr *memberExpr ) {
     362                output << ")";
     363        }
     364 
     365        void CodeGenerator::visit( UntypedMemberExpr *memberExpr ) {
    366366                assert( false );
    367367        }
    368368 
    369         void CodeGenerator2::visit( MemberExpr *memberExpr ) {
     369        void CodeGenerator::visit( MemberExpr *memberExpr ) {
    370370                memberExpr->get_aggregate()->accept( *this );
    371                 before << "." << mangleName( memberExpr->get_member() );
    372         }
    373  
    374         void CodeGenerator2::visit( VariableExpr *variableExpr ) {
     371                output << "." << mangleName( memberExpr->get_member() );
     372        }
     373 
     374        void CodeGenerator::visit( VariableExpr *variableExpr ) {
    375375                OperatorInfo opInfo;
    376376                if ( variableExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic && operatorLookup( variableExpr->get_var()->get_name(), opInfo ) && opInfo.type == OT_CONSTANT ) {
    377                         before << opInfo.symbol;
    378                 } else {
    379                         before << mangleName( variableExpr->get_var() );
    380                 } // if
    381         }
    382  
    383         void CodeGenerator2::visit( ConstantExpr *constantExpr ) {
     377                        output << opInfo.symbol;
     378                } else {
     379                        output << mangleName( variableExpr->get_var() );
     380                } // if
     381        }
     382 
     383        void CodeGenerator::visit( ConstantExpr *constantExpr ) {
    384384                assert( constantExpr->get_constant() );
    385385                constantExpr->get_constant()->accept( *this );
    386386        }
    387387 
    388         void CodeGenerator2::visit( SizeofExpr *sizeofExpr ) {
    389                 before << "sizeof(";
     388        void CodeGenerator::visit( SizeofExpr *sizeofExpr ) {
     389                output << "sizeof(";
    390390                if ( sizeofExpr->get_isType() ) {
    391                         before << genType( sizeofExpr->get_type(), "" );
     391                        output << genType( sizeofExpr->get_type(), "" );
    392392                } else {
    393393                        sizeofExpr->get_expr()->accept( *this );
    394394                } // if
    395                 before << ")";
    396         }
    397  
    398         void CodeGenerator2::visit( LogicalExpr *logicalExpr ) {
    399                 before << "(";
     395                output << ")";
     396        }
     397 
     398        void CodeGenerator::visit( LogicalExpr *logicalExpr ) {
     399                output << "(";
    400400                logicalExpr->get_arg1()->accept( *this );
    401401                if ( logicalExpr->get_isAnd() ) {
    402                         before << " && ";
    403                 } else {
    404                         before << " || ";
     402                        output << " && ";
     403                } else {
     404                        output << " || ";
    405405                } // if
    406406                logicalExpr->get_arg2()->accept( *this );
    407                 before << ")";
    408         }
    409  
    410         void CodeGenerator2::visit( ConditionalExpr *conditionalExpr ) {
    411                 before << "(";
     407                output << ")";
     408        }
     409 
     410        void CodeGenerator::visit( ConditionalExpr *conditionalExpr ) {
     411                output << "(";
    412412                conditionalExpr->get_arg1()->accept( *this );
    413                 before << " ? ";
     413                output << " ? ";
    414414                conditionalExpr->get_arg2()->accept( *this );
    415                 before << " : ";
     415                output << " : ";
    416416                conditionalExpr->get_arg3()->accept( *this );
    417                 before << ")";
    418         }
    419  
    420         void CodeGenerator2::visit( CommaExpr *commaExpr ) {
    421                 before << "(";
     417                output << ")";
     418        }
     419 
     420        void CodeGenerator::visit( CommaExpr *commaExpr ) {
     421                output << "(";
    422422                commaExpr->get_arg1()->accept( *this );
    423                 before << " , ";
     423                output << " , ";
    424424                commaExpr->get_arg2()->accept( *this );
    425                 before << ")";
    426         }
    427  
    428         void CodeGenerator2::visit( TupleExpr *tupleExpr ) {}
    429  
    430         void CodeGenerator2::visit( TypeExpr *typeExpr ) {}
     425                output << ")";
     426        }
     427 
     428        void CodeGenerator::visit( TupleExpr *tupleExpr ) {}
     429 
     430        void CodeGenerator::visit( TypeExpr *typeExpr ) {}
    431431 
    432432 
    433433        //*** Statements
    434         void CodeGenerator2::visit( CompoundStmt *compoundStmt ) {
     434        void CodeGenerator::visit( CompoundStmt *compoundStmt ) {
    435435                std::list<Statement*> ks = compoundStmt->get_kids();
    436436
    437                 before << endl << string( cur_indent, ' ' ) << "{" << endl;
    438 
    439                 cur_indent += CodeGenerator2::tabsize;
     437                output << endl << string( cur_indent, ' ' ) << "{" << endl;
     438
     439                cur_indent += CodeGenerator::tabsize;
    440440
    441441                for ( std::list<Statement *>::iterator i = ks.begin(); i != ks.end();  i++) {
    442                         before << string( cur_indent, ' ' ) << printLabels( (*i)->get_labels() )  ;
     442                        output << string( cur_indent, ' ' ) << printLabels( (*i)->get_labels() )  ;
    443443                        (*i)->accept(*this );
    444                         shift_left();
    445                         before << endl;
     444                        output << endl;
    446445                }
    447                 cur_indent -= CodeGenerator2::tabsize;
    448 
    449                 before << string( cur_indent, ' ' ) << "}" << endl;
    450         }
    451 
    452         void CodeGenerator2::visit( ExprStmt *exprStmt ) {
    453                 if ( exprStmt != 0 ) {
    454                         exprStmt->get_expr()->accept( *this );
    455                         shift_left();
    456                         before << ";" ;
    457                 } // if
    458         }
    459 
    460         void CodeGenerator2::visit( IfStmt *ifStmt ) {
    461                 before << "if (";
     446                cur_indent -= CodeGenerator::tabsize;
     447
     448                output << string( cur_indent, ' ' ) << "}" << endl;
     449        }
     450
     451        void CodeGenerator::visit( ExprStmt *exprStmt ) {
     452                // I don't see why this check is necessary.
     453                // If this starts to cause problems then put it back in,
     454                // with an explanation
     455                assert( exprStmt );
     456
     457                // if ( exprStmt != 0 ) {
     458                exprStmt->get_expr()->accept( *this );
     459                output << ";" ;
     460                // } // if
     461        }
     462
     463        void CodeGenerator::visit( IfStmt *ifStmt ) {
     464                output << "if (";
    462465                ifStmt->get_condition()->accept(*this );
    463                 after += ")\n";
    464                 shift_left();
    465 
    466                 cur_indent += CodeGenerator2::tabsize;
    467                 before << string( cur_indent, ' ' );
     466                output << ")\n";
     467
     468                cur_indent += CodeGenerator::tabsize;
     469                output << string( cur_indent, ' ' );
    468470                ifStmt->get_thenPart()->accept(*this );
    469                 cur_indent -= CodeGenerator2::tabsize;
    470                 shift_left(); before << endl;
     471                cur_indent -= CodeGenerator::tabsize;
     472                output << endl;
    471473
    472474                if ( ifStmt->get_elsePart() != 0) {
    473                         before << string( cur_indent, ' ' ) << " else " << endl ;
    474 
    475                         cur_indent += CodeGenerator2::tabsize;
     475                        output << string( cur_indent, ' ' ) << " else " << endl ;
     476
     477                        cur_indent += CodeGenerator::tabsize;
    476478                        ifStmt->get_elsePart()->accept(*this );
    477                         cur_indent -= CodeGenerator2::tabsize;
    478                 } // if
    479         }
    480 
    481         void CodeGenerator2::visit( SwitchStmt *switchStmt ) {
    482                 //before << /* "\r" << */ string( cur_indent, ' ' ) << CodeGenerator2::printLabels( switchStmt->get_labels() )
    483                 before << "switch (" ;
     479                        cur_indent -= CodeGenerator::tabsize;
     480                } // if
     481        }
     482
     483        void CodeGenerator::visit( SwitchStmt *switchStmt ) {
     484                //output << /* "\r" << */ string( cur_indent, ' ' ) << CodeGenerator::printLabels( switchStmt->get_labels() )
     485                output << "switch (" ;
    484486                switchStmt->get_condition()->accept(*this );
    485                 after += ")\n";
    486                 shift_left();
    487 
    488                 before << string( cur_indent, ' ' ) << "{" << std::endl;
    489                 cur_indent += CodeGenerator2::tabsize;
    490 
    491                 std::list< Statement * > stmts = switchStmt->get_branches();
    492                 bool lastBreak = false;
    493 
    494                 // horrible, horrible hack
    495                 if ( dynamic_cast<BranchStmt *>( stmts.back() ) != 0 ) {
    496                         lastBreak = true;
    497                         stmts.pop_back();
    498                 } // if
    499                 acceptAll( stmts, *this );
    500                 if ( lastBreak ) {
    501                         Statement *st = switchStmt->get_branches().back();
    502                         before << CodeGenerator2::printLabels( st->get_labels());
    503                         st->accept( *this );
    504                 } // if
    505          
    506                 cur_indent -= CodeGenerator2::tabsize;
    507 
    508                 before << /* "\r" << */ string( cur_indent, ' ' ) << "}" << endl ;
    509         }
    510 
    511         void CodeGenerator2::visit( CaseStmt *caseStmt ) {
    512                 before << string( cur_indent, ' ' );
     487                output << ")\n";
     488               
     489                output << string( cur_indent, ' ' ) << "{" << std::endl;
     490                cur_indent += CodeGenerator::tabsize;
     491
     492                acceptAll( switchStmt->get_branches(), *this );
     493
     494                cur_indent -= CodeGenerator::tabsize;
     495
     496                output << /* "\r" << */ string( cur_indent, ' ' ) << "}" << endl;
     497        }
     498
     499        void CodeGenerator::visit( CaseStmt *caseStmt ) {
     500                output << string( cur_indent, ' ' );
    513501                if ( caseStmt->isDefault())
    514                         before << "default "  ;
     502                        output << "default"  ;
    515503                else {
    516                         before << "case "  ;
     504                        output << "case "  ;
    517505                        caseStmt->get_condition()->accept(*this );
    518506                } // if
    519                 after += ":\n";
    520                 shift_left();
    521 
     507                output << ":\n";
     508               
    522509                std::list<Statement *> sts = caseStmt->get_statements();
    523510
    524                 cur_indent += CodeGenerator2::tabsize;
     511                cur_indent += CodeGenerator::tabsize;
    525512                for ( std::list<Statement *>::iterator i = sts.begin(); i != sts.end();  i++) {
    526                         before << /* "\r" << */ string( cur_indent, ' ' ) << printLabels( (*i)->get_labels() )  ;
     513                        output << /* "\r" << */ string( cur_indent, ' ' ) << printLabels( (*i)->get_labels() )  ;
    527514                        (*i)->accept(*this );
    528                         shift_left();
    529                         before << ";" << endl;
     515                        output << endl;
    530516                }
    531                 cur_indent -= CodeGenerator2::tabsize;
    532         }
    533 
    534         void CodeGenerator2::visit( BranchStmt *branchStmt ) {
     517                cur_indent -= CodeGenerator::tabsize;
     518        }
     519
     520        void CodeGenerator::visit( BranchStmt *branchStmt ) {
     521                output << "\r" << string( cur_indent, ' ' );
     522                output << CodeGenerator::printLabels( branchStmt->get_labels());
     523
    535524                switch ( branchStmt->get_type()) {
    536525                  case BranchStmt::Goto:
    537526                        if ( ! branchStmt->get_target().empty() )
    538                                 before << "goto " << branchStmt->get_target();
     527                                output << "goto " << branchStmt->get_target();
    539528                        else {
    540529                                if ( branchStmt->get_computedTarget() != 0 ) {
    541                                         before << "goto *";
     530                                        output << "goto *";
    542531                                        branchStmt->get_computedTarget()->accept( *this );
    543532                                } // if
     
    545534                        break;
    546535                  case BranchStmt::Break:
    547                         before << "break";
     536                        output << "break";
    548537                        break;
    549538                  case BranchStmt::Continue:
    550                         before << "continue";
     539                        output << "continue";
    551540                        break;
    552541                }
    553                 before << ";";
    554         }
    555 
    556 
    557         void CodeGenerator2::visit( ReturnStmt *returnStmt ) {
    558                 before << "return ";
     542                output << ";" << endl;
     543        }
     544
     545
     546        void CodeGenerator::visit( ReturnStmt *returnStmt ) {
     547                output << "return ";
    559548
    560549                // xxx -- check for null expression;
     
    562551                        returnStmt->get_expr()->accept( *this );
    563552                } // if
    564                 after += ";";
    565         }
    566 
    567         void CodeGenerator2::visit( WhileStmt *whileStmt ) {
     553                output << ";";
     554        }
     555
     556        void CodeGenerator::visit( WhileStmt *whileStmt ) {
    568557                if ( whileStmt->get_isDoWhile() )
    569                         before << "do" ;
     558                        output << "do" ;
    570559                else {
    571                         before << "while (" ;
     560                        output << "while (" ;
    572561                        whileStmt->get_condition()->accept(*this );
    573                         after += ")";
    574                 } // if
    575                 after += "{\n";
    576                 shift_left();
    577 
     562                        output << ")";
     563                } // if
     564                output << "\n";
     565
     566                output << string( cur_indent, ' ' ) << CodeGenerator::printLabels( whileStmt->get_body()->get_labels() );
    578567                whileStmt->get_body()->accept( *this );
    579568
    580                 before << /* "\r" << */ string( cur_indent, ' ' ) << "}" ;
     569                output << /* "\r" << */ string( cur_indent, ' ' );
    581570
    582571                if ( whileStmt->get_isDoWhile() ) {
    583                         before << " while (" ;
     572                        output << " while (" ;
    584573                        whileStmt->get_condition()->accept(*this );
    585                         after += ");";
    586                 } // if
    587 
    588                 after += "\n";
    589         }
    590 
    591         void CodeGenerator2::visit( ForStmt *forStmt ) {
    592                 before << "for (";
     574                        output << ");";
     575                } // if
     576
     577                output << "\n";
     578        }
     579
     580        void CodeGenerator::visit( ForStmt *forStmt ) {
     581                output << "for (";
    593582
    594583                if ( forStmt->get_initialization() != 0 )
    595584                        forStmt->get_initialization()->accept( *this );
    596585                else
    597                         before << ";";
    598                 shift_left();
    599 
     586                        output << ";";
     587               
    600588                if ( forStmt->get_condition() != 0 )
    601589                        forStmt->get_condition()->accept( *this );
    602                 shift_left(); before << ";";
     590                output << ";";
    603591
    604592                if ( forStmt->get_increment() != 0 )
    605593                        forStmt->get_increment()->accept( *this );
    606                 shift_left(); before << ")" << endl;
     594                output << ")" << endl;
    607595
    608596                if ( forStmt->get_body() != 0 ) {
    609                         cur_indent += CodeGenerator2::tabsize;
    610                         before << string( cur_indent, ' ' ) << CodeGenerator2::printLabels( forStmt->get_body()->get_labels() );
     597                        output << string( cur_indent, ' ' ) << CodeGenerator::printLabels( forStmt->get_body()->get_labels() );
    611598                        forStmt->get_body()->accept( *this );
    612                         cur_indent -= CodeGenerator2::tabsize;
    613                 } // if
    614         }
    615 
    616         void CodeGenerator2::visit( NullStmt *nullStmt ) {
    617                 //before << /* "\r" << */ string( cur_indent, ' ' ) << CodeGenerator2::printLabels( nullStmt->get_labels() );
    618                 before << "/* null statement */ ;";
    619         }
    620 
    621         void CodeGenerator2::visit( DeclStmt *declStmt ) {
     599                } // if
     600        }
     601
     602        void CodeGenerator::visit( NullStmt *nullStmt ) {
     603                //output << /* "\r" << */ string( cur_indent, ' ' ) << CodeGenerator::printLabels( nullStmt->get_labels() );
     604                output << "/* null statement */ ;";
     605        }
     606
     607        void CodeGenerator::visit( DeclStmt *declStmt ) {
    622608                declStmt->get_decl()->accept( *this );
    623609       
    624610                if ( doSemicolon( declStmt->get_decl() ) ) {
    625                         after += ";";
    626                 } // if
    627                 shift_left();
    628         }
    629 
    630         std::string CodeGenerator2::printLabels( std::list< Label > &l ) {
     611                        output << ";";
     612                } // if
     613        }
     614
     615        std::string CodeGenerator::printLabels( std::list< Label > &l ) {
    631616                std::string str( "" );
    632                 l.unique();
     617                l.unique(); // assumes a sorted list. Why not use set?
    633618
    634619                for ( std::list< Label >::iterator i = l.begin(); i != l.end(); i++ )
     
    638623        }
    639624
    640         void CodeGenerator2::shift_left() {
    641                 before << after;
    642                 after = "";
    643         }
    644 
    645         void CodeGenerator2::handleStorageClass( Declaration *decl ) {
     625        void CodeGenerator::handleStorageClass( Declaration *decl ) {
    646626                switch ( decl->get_storageClass() ) {
    647627                  case Declaration::NoStorageClass:
    648628                        break;
    649629                  case Declaration::Extern:
    650                         before << "extern ";
     630                        output << "extern ";
    651631                        break;
    652632                  case Declaration::Static:
    653                         before << "static ";
     633                        output << "static ";
    654634                        break;
    655635                  case Declaration::Auto:
     
    657637                        break;
    658638                  case Declaration::Register:
    659                         before << "register ";
     639                        output << "register ";
    660640                        break;
    661641                  case Declaration::Inline:
  • src/CodeGen/CodeGenerator.h

    r6db50d5 r6c4ff37  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // CodeGenerator2.h --
     7// CodeGenerator.h --
    88//
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon May 18 23:35:37 2015
    13 // Update Count     : 2
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Tue Jun 02 11:45:20 2015
     13// Update Count     : 9
    1414//
    1515
     
    2525
    2626namespace CodeGen {
    27         class CodeGenerator2 : public Visitor {
     27        class CodeGenerator : public Visitor {
    2828          public:
    2929                static int tabsize;
    3030
    31                 CodeGenerator2( std::ostream &os );
    32                 CodeGenerator2( std::ostream &os, std::string, int indent = 0, bool infun = false );
    33                 CodeGenerator2( std::ostream &os, char *, int indent = 0, bool infun = false );
     31                CodeGenerator( std::ostream &os );
     32                CodeGenerator( std::ostream &os, std::string, int indent = 0, bool infun = false );
     33                CodeGenerator( std::ostream &os, char *, int indent = 0, bool infun = false );
    3434
    35                 CodeGenerator2( CodeGenerator2 & );
     35                CodeGenerator( CodeGenerator & );
    3636
    3737                //*** Declaration
     
    8282                virtual void visit( DeclStmt * );
    8383
    84                 std::string get_string( void );
    85                 void add_string_left( std::string s ) { before << s; }
    86                 void shift_left();
    8784                template< class Iterator > void genCommaList( Iterator begin, Iterator end );
    8885          private:
    8986                int cur_indent;
    9087                bool insideFunction;
    91                 std::ostream &before;
    92                 std::string after;
     88                std::ostream &output;
    9389
    9490                static std::string printLabels ( std::list < Label > & );
     
    10096       
    10197        template< class Iterator >
    102         void CodeGenerator2::genCommaList( Iterator begin, Iterator end ) {
     98        void CodeGenerator::genCommaList( Iterator begin, Iterator end ) {
    10399                if ( begin == end ) return;
    104100
     
    106102                        (*begin++)->accept( *this );
    107103                        if ( begin == end ) return;
    108                         before << ", ";
     104                        output << ", ";
    109105                } // for
    110106        }
  • src/CodeGen/GenType.cc

    r6db50d5 r6c4ff37  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon May 18 23:38:22 2015
    13 // Update Count     : 2
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Tue Jun 02 11:07:25 2015
     13// Update Count     : 3
    1414//
    1515
     
    1818
    1919#include "GenType.h"
    20 #include "CodeGenerator2.h"
     20#include "CodeGenerator.h"
    2121#include "SynTree/Visitor.h"
    2222#include "SynTree/Type.h"
     
    9797                } // if
    9898                if ( dimension != 0 ) {
    99                         CodeGenerator2 cg( os );
     99                        CodeGenerator cg( os );
    100100                        dimension->accept( cg );
    101101                } // if
     
    148148                        } // if
    149149                } else {
    150                         CodeGenerator2 cg( os );
     150                        CodeGenerator cg( os );
    151151                        os << "(" ;
    152152
  • src/CodeGen/Generate.cc

    r6db50d5 r6c4ff37  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon May 18 23:39:24 2015
    13 // Update Count     : 1
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Tue Jun 02 11:08:44 2015
     13// Update Count     : 4
    1414//
    1515
     
    2222#include "SynTree/Declaration.h"
    2323
    24 #include "CodeGenerator2.h"
     24#include "CodeGenerator.h"
    2525
    2626using namespace std;
     
    2828namespace CodeGen {
    2929        void generate( std::list< Declaration* > translationUnit, std::ostream &os, bool doIntrinsics ) {
    30                 CodeGen::CodeGenerator2 cgv( os );
     30                CodeGen::CodeGenerator cgv( os );
    3131
    3232                for ( std::list<Declaration *>::iterator i = translationUnit.begin(); i != translationUnit.end();  i++ ) {
    3333                        if ( LinkageSpec::isGeneratable( (*i)->get_linkage() ) && (doIntrinsics || ! LinkageSpec::isBuiltin( (*i)->get_linkage() ) ) ) {
    3434                                (*i)->accept(cgv);
    35                                 cgv.shift_left();
    3635                                if ( doSemicolon( *i ) ) {
    3736                                        os << ";";
  • src/CodeGen/module.mk

    r6db50d5 r6c4ff37  
    11SRC +=  CodeGen/Generate.cc \
    2         CodeGen/CodeGenerator2.cc \
     2        CodeGen/CodeGenerator.cc \
    33        CodeGen/GenType.cc \
    44        CodeGen/FixNames.cc \
Note: See TracChangeset for help on using the changeset viewer.