Changeset d60ccbf for src/CodeGen


Ignore:
Timestamp:
Aug 12, 2015, 2:27:31 PM (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:
f32c7f4
Parents:
e45215c (diff), e869d663 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' into designate

Conflicts:

src/CodeGen/CodeGenerator.h

Location:
src/CodeGen
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • src/CodeGen/CodeGenerator.cc

    re45215c rd60ccbf  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Wed Jul 15 14:47:42 2015
    13 // Update Count     : 177
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Mon Jul 27 14:40:06 2015
     13// Update Count     : 218
    1414//
    1515
     
    5252        }
    5353
    54         CodeGenerator::CodeGenerator( std::ostream &os ) : indent(*this), cur_indent( 0 ), insideFunction( false ), output( os ) { }
     54        CodeGenerator::CodeGenerator( std::ostream &os ) : indent( *this), cur_indent( 0 ), insideFunction( false ), output( os ) { }
    5555
    5656        CodeGenerator::CodeGenerator( std::ostream &os, std::string init, int indentation, bool infunp )
    57                         : indent(*this), cur_indent( indentation ), insideFunction( infunp ), output( os ) {
     57                        : indent( *this), cur_indent( indentation ), insideFunction( infunp ), output( os ) {
    5858                //output << std::string( init );
    5959        }
    6060
    6161        CodeGenerator::CodeGenerator( std::ostream &os, char *init, int indentation, bool infunp )
    62                         : indent(*this), cur_indent( indentation ), insideFunction( infunp ), output( os ) {
     62                        : indent( *this ), cur_indent( indentation ), insideFunction( infunp ), output( os ) {
    6363                //output << std::string( init );
    6464        }
     
    9191                // acceptAll( functionDecl->get_oldDecls(), *this );
    9292                if ( functionDecl->get_statements() ) {
    93                         functionDecl->get_statements()->accept(*this );
     93                        functionDecl->get_statements()->accept( *this );
    9494                } // if
    9595        }
     
    121121                        for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end();  i++) {
    122122                                output << indent;
    123                                 (*i)->accept(*this );
     123                                (*i)->accept( *this );
    124124                                output << ";" << endl;
    125125                        }
     
    159159                                if ( obj->get_init() ) {
    160160                                        output << " = ";
    161                                         obj->get_init()->accept(*this );
     161                                        obj->get_init()->accept( *this );
    162162                                } // if
    163163                                output << "," << endl;
     
    478478        void CodeGenerator::visit( TypeExpr *typeExpr ) {}
    479479
     480        void CodeGenerator::visit( AsmExpr *asmExpr ) {
     481                if ( asmExpr->get_inout() ) {
     482                        output << "[ ";
     483                        asmExpr->get_inout()->accept( *this );
     484                        output << " ] ";
     485                } // if
     486                asmExpr->get_constraint()->accept( *this );
     487                output << " ( ";
     488                asmExpr->get_operand()->accept( *this );
     489                output << " )";
     490        }
     491
    480492        //*** Statements
    481493        void CodeGenerator::visit( CompoundStmt *compoundStmt ) {
     
    485497                cur_indent += CodeGenerator::tabsize;
    486498
    487                 for ( std::list<Statement *>::iterator i = ks.begin(); i != ks.end();  i++) {
     499                for ( std::list<Statement *>::iterator i = ks.begin(); i != ks.end();  i++ ) {
    488500                        output << indent << printLabels( (*i)->get_labels() );
    489                         (*i)->accept(*this );
     501                        (*i)->accept( *this );
    490502
    491503                        output << endl;
     
    511523        }
    512524
     525        void CodeGenerator::visit( AsmStmt *asmStmt ) {
     526                output << "asm ";
     527                if ( asmStmt->get_voltile() ) output << "volatile ";
     528                if ( ! asmStmt->get_gotolabels().empty()  ) output << "goto ";
     529                output << "( ";
     530                if ( asmStmt->get_instruction() ) asmStmt->get_instruction()->accept( *this );
     531                output << " : ";
     532                genCommaList( asmStmt->get_output().begin(), asmStmt->get_output().end() );
     533                output << " : ";
     534                genCommaList( asmStmt->get_input().begin(), asmStmt->get_input().end() );
     535                output << " : ";
     536                genCommaList( asmStmt->get_clobber().begin(), asmStmt->get_clobber().end() );
     537                if ( ! asmStmt->get_gotolabels().empty() ) {
     538                        output << " : ";
     539                        for ( std::list<Label>::iterator begin = asmStmt->get_gotolabels().begin();; ) {
     540                                output << *begin++;
     541                                if ( begin == asmStmt->get_gotolabels().end() ) break;
     542                                output << ", ";
     543                        } // for
     544                } // if
     545                output << " );" ;
     546        }
     547
    513548        void CodeGenerator::visit( IfStmt *ifStmt ) {
    514                 output << "if (";
    515                 ifStmt->get_condition()->accept(*this );
    516                 output << ") ";
    517 
    518                 ifStmt->get_thenPart()->accept(*this );
     549                output << "if ( ";
     550                ifStmt->get_condition()->accept( *this );
     551                output << " ) ";
     552
     553                ifStmt->get_thenPart()->accept( *this );
    519554
    520555                if ( ifStmt->get_elsePart() != 0) {
    521556                        output << " else ";
    522                         ifStmt->get_elsePart()->accept(*this );
     557                        ifStmt->get_elsePart()->accept( *this );
    523558                } // if
    524559        }
    525560
    526561        void CodeGenerator::visit( SwitchStmt *switchStmt ) {
    527                 output << "switch (" ;
    528                 switchStmt->get_condition()->accept(*this );
    529                 output << ") ";
     562                output << "switch ( " ;
     563                switchStmt->get_condition()->accept( *this );
     564                output << " ) ";
    530565               
    531566                output << "{" << std::endl;
     
    545580                } else {
    546581                        output << "case ";
    547                         caseStmt->get_condition()->accept(*this );
     582                        caseStmt->get_condition()->accept( *this );
    548583                } // if
    549584                output << ":\n";
     
    554589                for ( std::list<Statement *>::iterator i = sts.begin(); i != sts.end();  i++) {
    555590                        output << indent << printLabels( (*i)->get_labels() )  ;
    556                         (*i)->accept(*this );
     591                        (*i)->accept( *this );
    557592                        output << endl;
    558593                }
     
    598633                else {
    599634                        output << "while (" ;
    600                         whileStmt->get_condition()->accept(*this );
     635                        whileStmt->get_condition()->accept( *this );
    601636                        output << ")";
    602637                } // if
     
    610645                if ( whileStmt->get_isDoWhile() ) {
    611646                        output << " while (" ;
    612                         whileStmt->get_condition()->accept(*this );
     647                        whileStmt->get_condition()->accept( *this );
    613648                        output << ");";
    614649                } // if
  • src/CodeGen/CodeGenerator.h

    re45215c rd60ccbf  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Wed Jun 17 11:10:58 2015
    13 // Update Count     : 25
     12// Last Modified On : Wed Aug 12 14:27:14 2015
     13// Update Count     : 27
    1414//
    1515
     
    6565                virtual void visit( TupleExpr *tupleExpr );
    6666                virtual void visit( TypeExpr *typeExpr );
     67                virtual void visit( AsmExpr * );
    6768
    6869                //*** Statements
    6970                virtual void visit( CompoundStmt * );
    7071                virtual void visit( ExprStmt * );
     72                virtual void visit( AsmStmt * );
    7173                virtual void visit( IfStmt * );
    7274                virtual void visit( SwitchStmt * );
  • src/CodeGen/FixNames.h

    re45215c rd60ccbf  
    2020
    2121namespace CodeGen {
     22        /// mangles object and function names
    2223        void fixNames( std::list< Declaration* > translationUnit );
    2324} // namespace CodeGen
  • src/CodeGen/GenType.cc

    re45215c rd60ccbf  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Wed Jul 08 16:08:24 2015
    13 // Update Count     : 10
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Thu Jul  9 16:43:52 2015
     13// Update Count     : 13
    1414//
    1515
     
    9393                        os << "_Atomic ";
    9494                } // if
     95                if ( qualifiers.isAttribute ) {
     96                        os << "__attribute(( )) ";
     97                } // if
    9598                if ( dimension != 0 ) {
    9699                        CodeGenerator cg( os );
    97100                        dimension->accept( cg );
    98101                } else if ( isVarLen ) {
    99                         // no dimension expression on a VLA
    100                         // means it came in with the * token
     102                        // no dimension expression on a VLA means it came in with the * token
    101103                        os << "*";
    102104                } // if
     
    202204                        typeString = "_Atomic " + typeString;
    203205                } // if
     206                if ( type->get_isAttribute() ) {
     207                        typeString = "__attribute(( )) " + typeString;
     208                } // if
    204209        }
    205210} // namespace CodeGen
  • src/CodeGen/Generate.h

    re45215c rd60ccbf  
    2323
    2424namespace CodeGen {
     25        /// Generates code
    2526        void generate( std::list< Declaration* > translationUnit, std::ostream &os, bool doIntrinsics );
    2627} // namespace CodeGen
Note: See TracChangeset for help on using the changeset viewer.