Changeset c8c03683 for src/CodeGen


Ignore:
Timestamp:
Jun 14, 2016, 12:53:26 PM (9 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, with_gc
Children:
7ff30d07
Parents:
e04ef3a (diff), d14d96a (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' of plg2:software/cfa/cfa-cc

Location:
src/CodeGen
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/CodeGen/CodeGenerator.cc

    re04ef3a rc8c03683  
    2626#include "SynTree/Statement.h"
    2727#include "SynTree/Type.h"
     28#include "SynTree/Attribute.h"
    2829
    2930#include "Common/utility.h"
     
    3334#include "OperatorTable.h"
    3435#include "GenType.h"
     36
     37#include "InitTweak/InitTweak.h"
    3538
    3639using namespace std;
     
    7477        }
    7578
     79        void CodeGenerator::genAttributes( std::list< Attribute * > & attributes ) {
     80                if ( ! attributes.empty() ) {
     81                        output << "__attribute__ ((";
     82                        for ( Attribute *& attr : attributes ) {
     83                                if ( ! attr->empty() ) {
     84                                        output << attr->get_name() << "(";
     85                                        genCommaList( attr->get_parameters().begin(), attr->get_parameters().end() );
     86                                        output << ")";
     87                                }
     88                                output << ",";
     89                        }
     90                        output << ")) ";
     91                }
     92        }
     93
     94
    7695        //*** Declarations
    7796        void CodeGenerator::visit( FunctionDecl *functionDecl ) {
    78                 // generalize this
    79                 FunctionDecl::Attribute attr = functionDecl->get_attribute();
    80                 switch ( attr.type ) {
    81                         case FunctionDecl::Attribute::Constructor:
    82                                 output << "__attribute__ ((constructor";
    83                                 if ( attr.priority != FunctionDecl::Attribute::Default ) {
    84                                         output << "(" << attr.priority << ")";
    85                                 }
    86                                 output << ")) ";
    87                                 break;
    88                         case FunctionDecl::Attribute::Destructor:
    89                                 output << "__attribute__ ((destructor";
    90                                 if ( attr.priority != FunctionDecl::Attribute::Default ) {
    91                                         output << "(" << attr.priority << ")";
    92                                 }
    93                                 output << ")) ";
    94                                 break;
    95                         default:
    96                                 break;
    97                 }
     97                genAttributes( functionDecl->get_attributes() );
     98
    9899                handleStorageClass( functionDecl );
    99100                if ( functionDecl->get_isInline() ) {
     
    270271                                                        UntypedExpr *newExpr = new UntypedExpr( new NameExpr( "*?" ) );
    271272                                                        newExpr->get_args().push_back( *arg );
     273                                                        assert( (*arg)->get_results().size() == 1 );
     274                                                        Type * type = InitTweak::getPointerBase( (*arg)->get_results().front() );
     275                                                        assert( type );
     276                                                        newExpr->get_results().push_back( type );
    272277                                                        *arg = newExpr;
    273278                                                } // if
     
    298303                                        if ( applicationExpr->get_args().size() == 1 ) {
    299304                                                // the expression fed into a single parameter constructor or destructor
    300                                                 // may contain side effects - output as a void expression
    301                                                 output << "((void)(";
     305                                                // may contain side effects, so must still output this expression
     306                                                output << "(";
    302307                                                (*arg++)->accept( *this );
    303                                                 output << ")) /* " << opInfo.inputName << " */";
     308                                                output << ") /* " << opInfo.inputName << " */";
    304309                                        } else if ( applicationExpr->get_args().size() == 2 ) {
    305310                                                // intrinsic two parameter constructors are essentially bitwise assignment
     
    384389                                        if ( untypedExpr->get_args().size() == 1 ) {
    385390                                                // the expression fed into a single parameter constructor or destructor
    386                                                 // may contain side effects - output as a void expression
    387                                                 output << "((void)(";
     391                                                // may contain side effects, so must still output this expression
     392                                                output << "(";
    388393                                                (*arg++)->accept( *this );
    389                                                 output << ")) /* " << opInfo.inputName << " */";
     394                                                output << ") /* " << opInfo.inputName << " */";
    390395                                        } else if ( untypedExpr->get_args().size() == 2 ) {
    391396                                                // intrinsic two parameter constructors are essentially bitwise assignment
     
    626631
    627632        void CodeGenerator::visit( ExprStmt *exprStmt ) {
    628                 // I don't see why this check is necessary.
    629                 // If this starts to cause problems then put it back in,
    630                 // with an explanation
    631633                assert( exprStmt );
    632 
    633                 // if ( exprStmt != 0 ) {
    634                 exprStmt->get_expr()->accept( *this );
    635                 output << ";" ;
    636                 // } // if
     634                // cast the top-level expression to void to reduce gcc warnings.
     635                Expression * expr = new CastExpr( exprStmt->get_expr() );
     636                expr->accept( *this );
     637                output << ";";
    637638        }
    638639
     
    743744
    744745        void CodeGenerator::visit( WhileStmt *whileStmt ) {
    745                 if ( whileStmt->get_isDoWhile() )
     746                if ( whileStmt->get_isDoWhile() ) {
    746747                        output << "do" ;
    747                 else {
     748                } else {
    748749                        output << "while (" ;
    749750                        whileStmt->get_condition()->accept( *this );
     
    769770                output << "for (;";
    770771
    771                 if ( forStmt->get_condition() != 0 )
     772                if ( forStmt->get_condition() != 0 ) {
    772773                        forStmt->get_condition()->accept( *this );
     774                }
    773775                output << ";";
    774776
    775                 if ( forStmt->get_increment() != 0 )
    776                         forStmt->get_increment()->accept( *this );
     777                if ( forStmt->get_increment() != 0 ) {
     778                        // cast the top-level expression to void to reduce gcc warnings.
     779                        Expression * expr = new CastExpr( forStmt->get_increment() );
     780                        expr->accept( *this );
     781                }
    777782                output << ") ";
    778783
  • src/CodeGen/CodeGenerator.h

    re04ef3a rc8c03683  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // CodeGenerator.h -- 
     7// CodeGenerator.h --
    88//
    99// Author           : Richard C. Bilson
     
    6060                virtual void visit( MemberExpr *memberExpr );
    6161                virtual void visit( VariableExpr *variableExpr );
    62                 virtual void visit( ConstantExpr *constantExpr ); 
     62                virtual void visit( ConstantExpr *constantExpr );
    6363                virtual void visit( SizeofExpr *sizeofExpr );
    6464                virtual void visit( AlignofExpr *alignofExpr );
     
    8585                virtual void visit( ForStmt * );
    8686                virtual void visit( NullStmt * );
    87                 virtual void visit( DeclStmt * );
     87                virtual void visit( DeclStmt * );
     88
     89                void genAttributes( std::list< Attribute * > & attributes );
    8890
    8991                template< class Iterator > void genCommaList( Iterator begin, Iterator end );
     
    114116
    115117        };
    116        
     118
    117119        template< class Iterator >
    118120        void CodeGenerator::genCommaList( Iterator begin, Iterator end ) {
     
    125127                } // for
    126128        }
    127  
     129
    128130        inline bool doSemicolon( Declaration* decl ) {
    129131                if ( FunctionDecl* func = dynamic_cast< FunctionDecl* >( decl ) ) {
Note: See TracChangeset for help on using the changeset viewer.