Changeset 6eb8948
- Timestamp:
- Sep 12, 2016, 6:32:46 PM (7 years ago)
- Branches:
- aaron-thesis, arm-eh, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- f006f01
- Parents:
- 8f7cea1
- git-author:
- Rob Schluntz <rschlunt@…> (09/12/16 18:24:34)
- git-committer:
- Rob Schluntz <rschlunt@…> (09/12/16 18:32:46)
- Location:
- src
- Files:
-
- 1 added
- 20 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
r8f7cea1 r6eb8948 656 656 } 657 657 658 void CodeGenerator::visit( StmtExpr * stmtExpr ) { 659 output << "("; 660 stmtExpr->get_statements()->accept( *this ); 661 output << ")"; 662 } 663 658 664 //*** Statements 659 665 void CodeGenerator::visit( CompoundStmt * compoundStmt ) { -
src/CodeGen/CodeGenerator.h
r8f7cea1 r6eb8948 73 73 virtual void visit( TypeExpr *typeExpr ); 74 74 virtual void visit( AsmExpr * ); 75 virtual void visit( StmtExpr * ); 75 76 76 77 //*** Statements -
src/InitTweak/InitTweak.cc
r8f7cea1 r6eb8948 449 449 // virtual void visit( LogicalExpr *logicalExpr ); 450 450 // virtual void visit( ConditionalExpr *conditionalExpr ); 451 virtual void visit( TupleExpr *tupleExpr ) { isConstExpr = false; }452 virtual void visit( SolvedTupleExpr *tupleExpr ) { isConstExpr = false; }453 451 virtual void visit( TypeExpr *typeExpr ) { isConstExpr = false; } 454 452 virtual void visit( AsmExpr *asmExpr ) { isConstExpr = false; } 455 453 virtual void visit( UntypedValofExpr *valofExpr ) { isConstExpr = false; } 456 454 virtual void visit( CompoundLiteralExpr *compLitExpr ) { isConstExpr = false; } 455 virtual void visit( TupleExpr *tupleExpr ) { isConstExpr = false; } 456 virtual void visit( TupleAssignExpr *tupleExpr ) { isConstExpr = false; } 457 457 458 458 bool isConstExpr; -
src/Makefile.in
r8f7cea1 r6eb8948 188 188 SynTree/driver_cfa_cpp-TypeSubstitution.$(OBJEXT) \ 189 189 SynTree/driver_cfa_cpp-Attribute.$(OBJEXT) \ 190 Tuples/driver_cfa_cpp-TupleAssignment.$(OBJEXT) 190 Tuples/driver_cfa_cpp-TupleAssignment.$(OBJEXT) \ 191 Tuples/driver_cfa_cpp-TupleExpansion.$(OBJEXT) 191 192 am_driver_cfa_cpp_OBJECTS = $(am__objects_1) 192 193 driver_cfa_cpp_OBJECTS = $(am_driver_cfa_cpp_OBJECTS) … … 400 401 SynTree/Initializer.cc SynTree/Visitor.cc SynTree/Mutator.cc \ 401 402 SynTree/AddStmtVisitor.cc SynTree/TypeSubstitution.cc \ 402 SynTree/Attribute.cc Tuples/TupleAssignment.cc 403 SynTree/Attribute.cc Tuples/TupleAssignment.cc \ 404 Tuples/TupleExpansion.cc 403 405 MAINTAINERCLEANFILES = Parser/parser.output ${libdir}/${notdir \ 404 406 ${cfa_cpplib_PROGRAMS}} … … 767 769 Tuples/driver_cfa_cpp-TupleAssignment.$(OBJEXT): \ 768 770 Tuples/$(am__dirstamp) Tuples/$(DEPDIR)/$(am__dirstamp) 771 Tuples/driver_cfa_cpp-TupleExpansion.$(OBJEXT): \ 772 Tuples/$(am__dirstamp) Tuples/$(DEPDIR)/$(am__dirstamp) 769 773 driver/$(am__dirstamp): 770 774 @$(MKDIR_P) driver … … 874 878 -rm -f SynTree/driver_cfa_cpp-VoidType.$(OBJEXT) 875 879 -rm -f Tuples/driver_cfa_cpp-TupleAssignment.$(OBJEXT) 880 -rm -f Tuples/driver_cfa_cpp-TupleExpansion.$(OBJEXT) 876 881 877 882 distclean-compile: … … 978 983 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-VoidType.Po@am__quote@ 979 984 @AMDEP_TRUE@@am__include@ @am__quote@Tuples/$(DEPDIR)/driver_cfa_cpp-TupleAssignment.Po@am__quote@ 985 @AMDEP_TRUE@@am__include@ @am__quote@Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Po@am__quote@ 980 986 981 987 .cc.o: … … 2394 2400 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 2395 2401 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Tuples/driver_cfa_cpp-TupleAssignment.obj `if test -f 'Tuples/TupleAssignment.cc'; then $(CYGPATH_W) 'Tuples/TupleAssignment.cc'; else $(CYGPATH_W) '$(srcdir)/Tuples/TupleAssignment.cc'; fi` 2402 2403 Tuples/driver_cfa_cpp-TupleExpansion.o: Tuples/TupleExpansion.cc 2404 @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Tuples/driver_cfa_cpp-TupleExpansion.o -MD -MP -MF Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Tpo -c -o Tuples/driver_cfa_cpp-TupleExpansion.o `test -f 'Tuples/TupleExpansion.cc' || echo '$(srcdir)/'`Tuples/TupleExpansion.cc 2405 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Tpo Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Po 2406 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Tuples/TupleExpansion.cc' object='Tuples/driver_cfa_cpp-TupleExpansion.o' libtool=no @AMDEPBACKSLASH@ 2407 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 2408 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Tuples/driver_cfa_cpp-TupleExpansion.o `test -f 'Tuples/TupleExpansion.cc' || echo '$(srcdir)/'`Tuples/TupleExpansion.cc 2409 2410 Tuples/driver_cfa_cpp-TupleExpansion.obj: Tuples/TupleExpansion.cc 2411 @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Tuples/driver_cfa_cpp-TupleExpansion.obj -MD -MP -MF Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Tpo -c -o Tuples/driver_cfa_cpp-TupleExpansion.obj `if test -f 'Tuples/TupleExpansion.cc'; then $(CYGPATH_W) 'Tuples/TupleExpansion.cc'; else $(CYGPATH_W) '$(srcdir)/Tuples/TupleExpansion.cc'; fi` 2412 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Tpo Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Po 2413 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Tuples/TupleExpansion.cc' object='Tuples/driver_cfa_cpp-TupleExpansion.obj' libtool=no @AMDEPBACKSLASH@ 2414 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 2415 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Tuples/driver_cfa_cpp-TupleExpansion.obj `if test -f 'Tuples/TupleExpansion.cc'; then $(CYGPATH_W) 'Tuples/TupleExpansion.cc'; else $(CYGPATH_W) '$(srcdir)/Tuples/TupleExpansion.cc'; fi` 2396 2416 2397 2417 .ll.cc: -
src/ResolvExpr/AlternativeFinder.cc
r8f7cea1 r6eb8948 38 38 #include "SynTree/TypeSubstitution.h" 39 39 #include "SymTab/Validate.h" 40 #include "Tuples/Tuple Assignment.h"40 #include "Tuples/Tuples.h" 41 41 #include "Common/utility.h" 42 42 #include "InitTweak/InitTweak.h" -
src/SymTab/Indexer.cc
r8f7cea1 r6eb8948 452 452 } 453 453 454 void Indexer::visit( SolvedTupleExpr *tupleExpr ) {454 void Indexer::visit( TupleAssignExpr *tupleExpr ) { 455 455 acceptAllNewScope( tupleExpr->get_results(), *this ); 456 acceptAll( tupleExpr->get_exprs(), *this ); 456 enterScope(); 457 acceptAll( tupleExpr->get_tempDecls(), *this ); 458 acceptAll( tupleExpr->get_assigns(), *this ); 459 leaveScope(); 457 460 } 458 461 -
src/SymTab/Indexer.h
r8f7cea1 r6eb8948 64 64 virtual void visit( ConditionalExpr *conditionalExpr ); 65 65 virtual void visit( CommaExpr *commaExpr ); 66 virtual void visit( TupleExpr *tupleExpr );67 virtual void visit( SolvedTupleExpr *tupleExpr );68 66 virtual void visit( TypeExpr *typeExpr ); 69 67 virtual void visit( AsmExpr *asmExpr ); 70 68 virtual void visit( UntypedValofExpr *valofExpr ); 69 virtual void visit( TupleExpr *tupleExpr ); 70 virtual void visit( TupleAssignExpr *tupleExpr ); 71 71 72 72 virtual void visit( TraitInstType *contextInst ); -
src/SynTree/Expression.cc
r8f7cea1 r6eb8948 375 375 } 376 376 377 378 UntypedExpr::UntypedExpr( Expression *_function, Expression *_aname ) : Expression( _aname ), function( _function) {}377 UntypedExpr::UntypedExpr( Expression *_function, const std::list<Expression *> &_args, Expression *_aname ) : 378 Expression( _aname ), function(_function), args(_args) {} 379 379 380 380 UntypedExpr::UntypedExpr( const UntypedExpr &other ) : … … 382 382 cloneAll( other.args, args ); 383 383 } 384 385 UntypedExpr::UntypedExpr( Expression *_function, std::list<Expression *> &_args, Expression *_aname ) :386 Expression( _aname ), function(_function), args(_args) {}387 384 388 385 UntypedExpr::~UntypedExpr() { … … 568 565 } 569 566 567 StmtExpr::StmtExpr( CompoundStmt *statements ) : statements( statements ) { 568 assert( statements ); 569 std::list< Statement * > & body = statements->get_kids(); 570 if ( ! body.empty() ) { 571 if ( ExprStmt * exprStmt = dynamic_cast< ExprStmt * >( body.back() ) ) { 572 cloneAll( exprStmt->get_expr()->get_results(), get_results() ); 573 } 574 } 575 } 576 StmtExpr::StmtExpr( const StmtExpr &other ) : statements( other.statements->clone() ) {} 577 StmtExpr::~StmtExpr() { 578 delete statements; 579 } 580 void StmtExpr::print( std::ostream &os, int indent ) const { 581 os << std::string( indent, ' ' ) << "Statement Expression: " << std::endl; 582 statements->print( os, indent+2 ); 583 } 584 570 585 std::ostream & operator<<( std::ostream & out, const Expression * expr ) { 571 586 expr->print( out ); -
src/SynTree/Expression.h
r8f7cea1 r6eb8948 98 98 class UntypedExpr : public Expression { 99 99 public: 100 UntypedExpr( Expression *function, Expression *_aname = nullptr );100 UntypedExpr( Expression *function, const std::list<Expression *> &args = std::list< Expression * >(), Expression *_aname = nullptr ); 101 101 UntypedExpr( const UntypedExpr &other ); 102 UntypedExpr( Expression *function, std::list<Expression *> &args, Expression *_aname = nullptr );103 102 virtual ~UntypedExpr(); 104 103 … … 483 482 }; 484 483 485 /// TupleExpr represents a tuple expression ( [a, b, c] )486 class TupleExpr : public Expression {487 public:488 TupleExpr( Expression *_aname = nullptr );489 TupleExpr( const TupleExpr &other );490 virtual ~TupleExpr();491 492 void set_exprs( std::list<Expression*> newValue ) { exprs = newValue; }493 std::list<Expression*>& get_exprs() { return exprs; }494 495 virtual TupleExpr *clone() const { return new TupleExpr( *this ); }496 virtual void accept( Visitor &v ) { v.visit( this ); }497 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }498 virtual void print( std::ostream &os, int indent = 0 ) const;499 private:500 std::list<Expression*> exprs;501 };502 503 /// SolvedTupleExpr represents a TupleExpr whose components have been type-resolved. It is effectively a shell for the code generator to work on504 class SolvedTupleExpr : public Expression {505 public:506 SolvedTupleExpr( Expression *_aname = nullptr ) : Expression( _aname ) {}507 SolvedTupleExpr( std::list<Expression *> &, Expression *_aname = nullptr );508 SolvedTupleExpr( const SolvedTupleExpr &other );509 virtual ~SolvedTupleExpr() {}510 511 std::list<Expression*> &get_exprs() { return exprs; }512 513 virtual SolvedTupleExpr *clone() const { return new SolvedTupleExpr( *this ); }514 virtual void accept( Visitor &v ) { v.visit( this ); }515 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }516 virtual void print( std::ostream &os, int indent = 0 ) const;517 private:518 std::list<Expression*> exprs;519 };520 521 484 /// TypeExpr represents a type used in an expression (e.g. as a type generator parameter) 522 485 class TypeExpr : public Expression { … … 672 635 }; 673 636 637 /// TupleExpr represents a tuple expression ( [a, b, c] ) 638 class TupleExpr : public Expression { 639 public: 640 TupleExpr( Expression *_aname = nullptr ); 641 TupleExpr( const TupleExpr &other ); 642 virtual ~TupleExpr(); 643 644 void set_exprs( std::list<Expression*> newValue ) { exprs = newValue; } 645 std::list<Expression*>& get_exprs() { return exprs; } 646 647 virtual TupleExpr *clone() const { return new TupleExpr( *this ); } 648 virtual void accept( Visitor &v ) { v.visit( this ); } 649 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); } 650 virtual void print( std::ostream &os, int indent = 0 ) const; 651 private: 652 std::list<Expression*> exprs; 653 }; 654 674 655 /// TupleIndexExpr represents an element selection operation on a tuple value, e.g. t.3 after processing by the expression analyzer 675 656 class TupleIndexExpr : public Expression { … … 714 695 }; 715 696 716 /// MultipleAssignExpr represents a multiple assignment operation, where both sides of the assignment have tuple type, e.g. [a, b, c] = [d, e, f]; 717 class MultipleAssignExpr : public Expression { 718 public: 719 MultipleAssignExpr( Expression * lhs, Expression * rhs ); 720 MultipleAssignExpr( const MultipleAssignExpr &other ); 721 virtual ~MultipleAssignExpr(); 722 723 Expression * get_lhs() const { return lhs; } 724 Expression * get_rhs() const { return rhs; } 725 MultipleAssignExpr * set_lhs( Expression *newValue ) { lhs = newValue; return this; } 726 MultipleAssignExpr * set_rhs( Expression *newValue ) { rhs = newValue; return this; } 727 728 virtual MultipleAssignExpr *clone() const { return new MultipleAssignExpr( *this ); } 729 virtual void accept( Visitor &v ) { v.visit( this ); } 730 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); } 731 virtual void print( std::ostream &os, int indent = 0 ) const; 732 private: 733 Expression * lhs; 734 Expression * rhs; 735 }; 736 737 /// MassAssignExpr represents a mass assignment operations, where the left hand side has tuple type and the right hand side does not, e.g. [a, b, c] = 5.0; 738 class MassAssignExpr : public Expression { 739 public: 740 MassAssignExpr( Expression * tuple, int field ); 741 MassAssignExpr( const MassAssignExpr &other ); 742 virtual ~MassAssignExpr(); 743 744 Expression * get_lhs() const { return lhs; } 745 Expression * get_rhs() const { return rhs; } 746 MassAssignExpr * set_lhs( Expression *newValue ) { lhs = newValue; return this; } 747 MassAssignExpr * set_rhs( Expression *newValue ) { rhs = newValue; return this; } 748 749 virtual MassAssignExpr *clone() const { return new MassAssignExpr( *this ); } 750 virtual void accept( Visitor &v ) { v.visit( this ); } 751 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); } 752 virtual void print( std::ostream &os, int indent = 0 ) const; 753 private: 754 Expression * lhs; // multiple exprs 755 Expression * rhs; // single expr 697 /// TupleAssignExpr represents a multiple assignment operation, where both sides of the assignment have tuple type, e.g. [a, b, c] = [d, e, f];, or a mass assignment operation, where the left hand side has tuple type and the right hand side does not, e.g. [a, b, c] = 5.0; 698 class TupleAssignExpr : public Expression { 699 public: 700 TupleAssignExpr( const std::list< Expression * > & assigns, const std::list< ObjectDecl * > & tempDecls, Expression * _aname = nullptr ); 701 TupleAssignExpr( const TupleAssignExpr &other ); 702 virtual ~TupleAssignExpr(); 703 704 std::list< Expression * > & get_assigns() { return assigns; } 705 std::list< ObjectDecl * > & get_tempDecls() { return tempDecls; } 706 707 virtual TupleAssignExpr *clone() const { return new TupleAssignExpr( *this ); } 708 virtual void accept( Visitor &v ) { v.visit( this ); } 709 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); } 710 virtual void print( std::ostream &os, int indent = 0 ) const; 711 private: 712 std::list< Expression * > assigns; // assignment expressions that use tempDecls 713 std::list< ObjectDecl * > tempDecls; // temporaries for address of lhs exprs 714 }; 715 716 /// StmtExpr represents a GCC 'statement expression', e.g. ({ int x = 5; x; }) 717 class StmtExpr : public Expression { 718 public: 719 StmtExpr( CompoundStmt *statements ); 720 StmtExpr( const StmtExpr & other ); 721 virtual ~StmtExpr(); 722 723 CompoundStmt * get_statements() const { return statements; } 724 StmtExpr * set_statements( CompoundStmt * newValue ) { statements = newValue; return this; } 725 726 virtual StmtExpr *clone() const { return new StmtExpr( *this ); } 727 virtual void accept( Visitor &v ) { v.visit( this ); } 728 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); } 729 virtual void print( std::ostream &os, int indent = 0 ) const; 730 private: 731 CompoundStmt * statements; 756 732 }; 757 733 -
src/SynTree/Mutator.cc
r8f7cea1 r6eb8948 308 308 } 309 309 310 Expression *Mutator::mutate( TupleExpr *tupleExpr ) {311 mutateAll( tupleExpr->get_results(), *this );312 mutateAll( tupleExpr->get_exprs(), *this );313 return tupleExpr;314 }315 316 Expression *Mutator::mutate( SolvedTupleExpr *tupleExpr ) {317 mutateAll( tupleExpr->get_results(), *this );318 mutateAll( tupleExpr->get_exprs(), *this );319 return tupleExpr;320 }321 322 310 Expression *Mutator::mutate( TypeExpr *typeExpr ) { 323 311 mutateAll( typeExpr->get_results(), *this ); … … 364 352 } 365 353 354 Expression *Mutator::mutate( TupleExpr *tupleExpr ) { 355 mutateAll( tupleExpr->get_results(), *this ); 356 mutateAll( tupleExpr->get_exprs(), *this ); 357 return tupleExpr; 358 } 359 366 360 Expression *Mutator::mutate( TupleIndexExpr *tupleExpr ) { 367 361 mutateAll( tupleExpr->get_results(), *this ); … … 377 371 } 378 372 379 Expression *Mutator::mutate( MultipleAssignExpr *assignExpr ) {373 Expression *Mutator::mutate( TupleAssignExpr *assignExpr ) { 380 374 mutateAll( assignExpr->get_results(), *this ); 381 assignExpr->set_lhs( maybeMutate( assignExpr->get_lhs(), *this ));382 assignExpr->set_rhs( maybeMutate( assignExpr->get_rhs(), *this ));375 mutateAll( assignExpr->get_tempDecls(), *this ); 376 mutateAll( assignExpr->get_assigns(), *this ); 383 377 return assignExpr; 384 378 } 385 379 386 Expression *Mutator::mutate( MassAssignExpr *assignExpr ) { 387 mutateAll( assignExpr->get_results(), *this ); 388 assignExpr->set_lhs( maybeMutate( assignExpr->get_lhs(), *this ) ); 389 assignExpr->set_rhs( maybeMutate( assignExpr->get_rhs(), *this ) ); 390 return assignExpr; 380 Expression *Mutator::mutate( StmtExpr *stmtExpr ) { 381 mutateAll( stmtExpr->get_results(), *this ); 382 stmtExpr->set_statements( maybeMutate( stmtExpr->get_statements(), *this ) ); 383 return stmtExpr; 391 384 } 392 385 -
src/SynTree/Mutator.h
r8f7cea1 r6eb8948 71 71 virtual Expression* mutate( ConditionalExpr *conditionalExpr ); 72 72 virtual Expression* mutate( CommaExpr *commaExpr ); 73 virtual Expression* mutate( TupleExpr *tupleExpr );74 virtual Expression* mutate( SolvedTupleExpr *tupleExpr );75 73 virtual Expression* mutate( TypeExpr *typeExpr ); 76 74 virtual Expression* mutate( AsmExpr *asmExpr ); … … 80 78 virtual Expression* mutate( UntypedValofExpr *valofExpr ); 81 79 virtual Expression* mutate( RangeExpr *rangeExpr ); 80 virtual Expression* mutate( TupleExpr *tupleExpr ); 82 81 virtual Expression* mutate( TupleIndexExpr *tupleExpr ); 83 82 virtual Expression* mutate( MemberTupleExpr *tupleExpr ); 84 virtual Expression* mutate( MultipleAssignExpr *assignExpr );85 virtual Expression* mutate( MassAssignExpr *assignExpr );83 virtual Expression* mutate( TupleAssignExpr *assignExpr ); 84 virtual Expression* mutate( StmtExpr * stmtExpr ); 86 85 87 86 virtual Type* mutate( VoidType *basicType ); -
src/SynTree/SynTree.h
r8f7cea1 r6eb8948 76 76 class ConditionalExpr; 77 77 class CommaExpr; 78 class TupleExpr;79 class SolvedTupleExpr;80 78 class TypeExpr; 81 79 class AsmExpr; … … 85 83 class UntypedValofExpr; 86 84 class RangeExpr; 85 class TupleExpr; 87 86 class TupleIndexExpr; 88 87 class MemberTupleExpr; 89 class MultipleAssignExpr;90 class MassAssignExpr;88 class TupleAssignExpr; 89 class StmtExpr; 91 90 92 91 class Type; -
src/SynTree/TupleExpr.cc
r8f7cea1 r6eb8948 17 17 #include "Common/utility.h" 18 18 #include "Type.h" 19 #include "Declaration.h" 19 20 20 21 TupleExpr::TupleExpr( Expression *_aname ) : Expression( _aname ) { … … 31 32 void TupleExpr::print( std::ostream &os, int indent ) const { 32 33 os << std::string( indent, ' ' ) << "Tuple:" << std::endl; 33 printAll( exprs, os, indent+2 );34 Expression::print( os, indent );35 }36 37 SolvedTupleExpr::SolvedTupleExpr( std::list<Expression *> &_exprs, Expression *_aname ) : Expression( _aname ) {38 std::copy(_exprs.begin(), _exprs.end(), back_inserter(exprs));39 }40 41 SolvedTupleExpr::SolvedTupleExpr( const SolvedTupleExpr &other ) : Expression( other ) {42 cloneAll( other.exprs, exprs );43 }44 45 void SolvedTupleExpr::print( std::ostream &os, int indent ) const {46 os << std::string( indent, ' ' ) << "Solved Tuple:" << std::endl;47 34 printAll( exprs, os, indent+2 ); 48 35 Expression::print( os, indent ); … … 90 77 91 78 79 TupleAssignExpr::TupleAssignExpr( const std::list< Expression * > & assigns, const std::list< ObjectDecl * > & tempDecls, Expression * _aname ) : Expression( _aname ), assigns( assigns ), tempDecls( tempDecls ) { 80 for ( Expression * expr : assigns ) { 81 cloneAll( expr->get_results(), get_results() ); 82 } 83 } 84 85 TupleAssignExpr::TupleAssignExpr( const TupleAssignExpr &other ) : Expression( other ), tempDecls( other.tempDecls ) /* temporary */ { 86 cloneAll( other.assigns, assigns ); 87 // xxx - clone needs to go into assigns and replace tempDecls 88 } 89 90 TupleAssignExpr::~TupleAssignExpr() { 91 deleteAll( assigns ); 92 // deleteAll( tempDecls ); 93 } 94 95 void TupleAssignExpr::print( std::ostream &os, int indent ) const { 96 os << std::string( indent, ' ' ) << "Tuple Assignment Expression, with temporaries:" << std::endl; 97 printAll( tempDecls, os, indent+4 ); 98 os << std::string( indent+2, ' ' ) << "with assignments: " << std::endl; 99 printAll( assigns, os, indent+4 ); 100 Expression::print( os, indent ); 101 } 102 103 104 92 105 // Local Variables: // 93 106 // tab-width: 4 // -
src/SynTree/TupleType.cc
r8f7cea1 r6eb8948 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // TupleType.cc -- 7 // TupleType.cc -- 8 8 // 9 9 // Author : Richard C. Bilson … … 17 17 #include "Common/utility.h" 18 18 19 TupleType::TupleType( const Type::Qualifiers &tq ) : Type( tq) {19 TupleType::TupleType( const Type::Qualifiers &tq, const std::list< Type * > & types ) : Type( tq ), types( types ) { 20 20 } 21 21 -
src/SynTree/Type.h
r8f7cea1 r6eb8948 348 348 class TupleType : public Type { 349 349 public: 350 TupleType( const Type::Qualifiers &tq );350 TupleType( const Type::Qualifiers &tq, const std::list< Type * > & types = std::list< Type * >() ); 351 351 TupleType( const TupleType& ); 352 352 virtual ~TupleType(); -
src/SynTree/Visitor.cc
r8f7cea1 r6eb8948 261 261 } 262 262 263 void Visitor::visit( TupleExpr *tupleExpr ) {264 acceptAll( tupleExpr->get_results(), *this );265 acceptAll( tupleExpr->get_exprs(), *this );266 }267 268 void Visitor::visit( SolvedTupleExpr *tupleExpr ) {269 acceptAll( tupleExpr->get_results(), *this );270 acceptAll( tupleExpr->get_exprs(), *this );271 }272 273 263 void Visitor::visit( TypeExpr *typeExpr ) { 274 264 acceptAll( typeExpr->get_results(), *this ); … … 309 299 } 310 300 301 void Visitor::visit( TupleExpr *tupleExpr ) { 302 acceptAll( tupleExpr->get_results(), *this ); 303 acceptAll( tupleExpr->get_exprs(), *this ); 304 } 305 311 306 void Visitor::visit( TupleIndexExpr *tupleExpr ) { 312 307 acceptAll( tupleExpr->get_results(), *this ); … … 320 315 } 321 316 322 void Visitor::visit( MultipleAssignExpr *assignExpr ) {317 void Visitor::visit( TupleAssignExpr *assignExpr ) { 323 318 acceptAll( assignExpr->get_results(), *this ); 324 maybeAccept( assignExpr->get_lhs(), *this ); 325 maybeAccept( assignExpr->get_rhs(), *this ); 326 } 327 328 void Visitor::visit( MassAssignExpr *assignExpr ) { 329 acceptAll( assignExpr->get_results(), *this ); 330 maybeAccept( assignExpr->get_lhs(), *this ); 331 maybeAccept( assignExpr->get_rhs(), *this ); 319 acceptAll( assignExpr->get_tempDecls(), *this ); 320 acceptAll( assignExpr->get_assigns(), *this ); 321 } 322 323 void Visitor::visit( StmtExpr *stmtExpr ) { 324 acceptAll( stmtExpr->get_results(), *this ); 325 maybeAccept( stmtExpr->get_statements(), *this ); 332 326 } 333 327 -
src/SynTree/Visitor.h
r8f7cea1 r6eb8948 71 71 virtual void visit( ConditionalExpr *conditionalExpr ); 72 72 virtual void visit( CommaExpr *commaExpr ); 73 virtual void visit( TupleExpr *tupleExpr );74 virtual void visit( SolvedTupleExpr *tupleExpr );75 73 virtual void visit( TypeExpr *typeExpr ); 76 74 virtual void visit( AsmExpr *asmExpr ); … … 80 78 virtual void visit( UntypedValofExpr *valofExpr ); 81 79 virtual void visit( RangeExpr *rangeExpr ); 80 virtual void visit( TupleExpr *tupleExpr ); 82 81 virtual void visit( TupleIndexExpr *tupleExpr ); 83 82 virtual void visit( MemberTupleExpr *tupleExpr ); 84 virtual void visit( MultipleAssignExpr *assignExpr );85 virtual void visit( MassAssignExpr *assignExpr );83 virtual void visit( TupleAssignExpr *assignExpr ); 84 virtual void visit( StmtExpr * stmtExpr ); 86 85 87 86 virtual void visit( VoidType *basicType ); -
src/Tuples/TupleAssignment.cc
r8f7cea1 r6eb8948 18 18 #include "ResolvExpr/typeops.h" 19 19 #include "SynTree/Expression.h" 20 #include "TupleAssignment.h" 20 #include "SynTree/Initializer.h" 21 #include "Tuples.h" 21 22 #include "Common/SemanticError.h" 22 23 … … 40 41 // records for assignment generation 41 42 struct Options { 42 std::list< ResolvExpr::AltList > get_best();43 43 void print( std::ostream & ); 44 44 int size() const { return options.size(); } … … 51 51 }; 52 52 53 classMatcher {53 struct Matcher { 54 54 public: 55 55 Matcher( TupleAssignSpotter &spotter, Expression *_lhs, Expression *_rhs ); 56 56 virtual ~Matcher() {} 57 57 virtual void match( std::list< Expression * > &out ) = 0; 58 virtual void solve() = 0;59 static UntypedExpr *createAssgn( Expression *left, Expression *right );60 protected:61 58 std::list< Expression * > lhs, rhs; 62 59 TupleAssignSpotter &spotter; 63 }; 64 65 class MassAssignMatcher : public Matcher { 60 std::list< ObjectDecl * > tmpDecls; 61 }; 62 63 struct MassAssignMatcher : public Matcher { 66 64 public: 67 65 MassAssignMatcher( TupleAssignSpotter &spotter, Expression *lhs, Expression *rhs ) : Matcher( spotter, lhs, rhs ) { … … 69 67 } 70 68 virtual void match( std::list< Expression * > &out ); 71 virtual void solve(); 72 }; 73 74 class MultipleAssignMatcher : public Matcher { 69 }; 70 71 struct MultipleAssignMatcher : public Matcher { 75 72 public: 76 73 MultipleAssignMatcher( TupleAssignSpotter &spot, Expression *lhs, Expression *rhs ); 77 74 virtual void match( std::list< Expression * > &out ); 78 virtual void solve();79 75 }; 80 76 81 77 ResolvExpr::AlternativeFinder ¤tFinder; 82 Expression *rhs, *lhs;78 // Expression *rhs, *lhs; 83 79 Matcher *matcher = nullptr; 84 80 Options options; … … 149 145 150 146 if ( new_assigns.empty() ) return; 151 std::list< Expression * > solved_assigns;152 147 ResolvExpr::AltList current; 153 148 // now resolve new assignments … … 161 156 current.push_back( alts.front() ); 162 157 } 163 options.options.push_back( current ); 164 165 matcher->solve(); 158 159 // extract expressions from the assignment alternatives to produce a list of assignments that 160 // together form a single alternative 161 std::list< Expression *> solved_assigns; 162 for ( ResolvExpr::Alternative & alt : current ) { 163 solved_assigns.push_back( alt.expr->clone() ); 164 } 165 // xxx - need to do this?? 166 // TypeEnvironment compositeEnv; 167 // simpleCombineEnvironments( i->begin(), i->end(), compositeEnv ); 168 currentFinder.get_alternatives().push_front( ResolvExpr::Alternative(new TupleAssignExpr(solved_assigns, matcher->tmpDecls), currentFinder.get_environ(), ResolvExpr::sumCost( current ) ) ); 166 169 } 167 170 … … 179 182 } 180 183 181 UntypedExpr * TupleAssignSpotter::Matcher::createAssgn( Expression *left, Expression*right ) {184 UntypedExpr * createAssgn( ObjectDecl *left, ObjectDecl *right ) { 182 185 assert( left && right ); 183 186 std::list< Expression * > args; 184 args.push_back( new AddressExpr( left->clone() ) );185 args.push_back( right->clone() );187 args.push_back( new AddressExpr( new UntypedExpr( new NameExpr("*?"), std::list< Expression * >{ new VariableExpr( left ) } ) ) ); 188 args.push_back( new VariableExpr( right ) ); 186 189 return new UntypedExpr( new NameExpr( "?=?" ), args ); 187 190 } 188 191 192 ObjectDecl * newObject( UniqueName & namer, Expression * expr ) { 193 Type * type; 194 assert( expr->get_results().size() >= 1 ); 195 if ( expr->get_results().size() > 1 ) { 196 TupleType * tt = new TupleType( Type::Qualifiers() ); 197 cloneAll( expr->get_results(), tt->get_types() ); 198 type = tt; 199 } else { 200 type = expr->get_results().front()->clone(); 201 } 202 return new ObjectDecl( namer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, nullptr, type, new SingleInit( expr->clone() ) ); 203 } 204 189 205 void TupleAssignSpotter::MassAssignMatcher::match( std::list< Expression * > &out ) { 206 static UniqueName lhsNamer( "__massassign_L" ); 207 static UniqueName rhsNamer( "__massassign_R" ); 190 208 assert ( ! lhs.empty() && rhs.size() == 1); 191 209 210 ObjectDecl * rtmp = newObject( rhsNamer, rhs.front() ); 192 211 for ( Expression * l : lhs ) { 193 out.push_back( createAssgn( l, rhs.front() ) ); 194 } 195 } 196 197 void TupleAssignSpotter::MassAssignMatcher::solve() { 198 assert( ! spotter.options.empty() ); 199 for ( std::list< ResolvExpr::AltList >::iterator i = spotter.options.begin(); i != spotter.options.end(); ++i ) { 200 // extract expressions from the alternatives to produce a list of assignments that 201 // together form a single alternative 202 std::list< Expression *> solved_assigns; 203 for ( ResolvExpr::Alternative & alt : *i ) { 204 solved_assigns.push_back( alt.expr ); 205 } 206 spotter.currentFinder.get_alternatives().push_front( ResolvExpr::Alternative(new SolvedTupleExpr(solved_assigns), spotter.currentFinder.get_environ(), ResolvExpr::sumCost( *i ) ) ); 207 } 212 ObjectDecl * ltmp = newObject( lhsNamer, new AddressExpr( l ) ); 213 out.push_back( createAssgn( ltmp, rtmp ) ); 214 tmpDecls.push_back( ltmp ); 215 } 216 tmpDecls.push_back( rtmp ); 208 217 } 209 218 210 219 void TupleAssignSpotter::MultipleAssignMatcher::match( std::list< Expression * > &out ) { 220 static UniqueName lhsNamer( "__multassign_L" ); 221 static UniqueName rhsNamer( "__multassign_R" ); 211 222 // xxx - need more complicated matching? 212 223 if ( lhs.size() == rhs.size() ) { 213 zipWith( lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), back_inserter(out), TupleAssignSpotter::Matcher::createAssgn ); 214 } 215 } 216 217 void TupleAssignSpotter::MultipleAssignMatcher::solve() { 218 // options.print( std::cerr ); 219 std::list< ResolvExpr::AltList > best = spotter.options.get_best(); 220 if ( best.size() == 1 ) { 221 std::list<Expression *> solved_assigns; 222 for ( ResolvExpr::AltList::iterator i = best.front().begin(); i != best.front().end(); ++i ) { 223 solved_assigns.push_back( i->expr ); 224 } 225 /* assigning cost zero? */ 226 spotter.currentFinder.get_alternatives().push_front( ResolvExpr::Alternative(new SolvedTupleExpr(solved_assigns), spotter.currentFinder.get_environ(), ResolvExpr::Cost() ) ); 227 } 228 } 229 230 std::list< ResolvExpr::AltList > TupleAssignSpotter::Options::get_best() { 231 std::list< ResolvExpr::AltList > ret; 232 std::list< ResolvExpr::AltList > solns; 233 for ( ResolvExpr::AltList & i : options ) { 234 ResolvExpr::AltList current; 235 findMinCost( i.begin(), i.end(), back_inserter(current) ); 236 solns.push_back( ResolvExpr::AltList(current.begin(), current.end()) ); 237 } 238 // need to combine -- previously "lift_intersection", which 239 // did some madness involving, effectively, the intersection of 240 // a bunch of AltLists 241 std::list<ResolvExpr::AltList> result = solns; 242 if ( result.size() != 1 ) { 243 throw SemanticError("Ambiguous tuple expression"); 244 } 245 ret.push_back( *result.begin() ); 246 return ret; 224 std::list< ObjectDecl * > ltmp; 225 std::list< ObjectDecl * > rtmp; 226 std::transform( lhs.begin(), lhs.end(), back_inserter( ltmp ), []( Expression * expr ){ 227 return newObject( lhsNamer, new AddressExpr( expr ) ); 228 }); 229 std::transform( rhs.begin(), rhs.end(), back_inserter( rtmp ), []( Expression * expr ){ 230 return newObject( rhsNamer, expr ); 231 }); 232 zipWith( ltmp.begin(), ltmp.end(), rtmp.begin(), rtmp.end(), back_inserter(out), createAssgn ); 233 tmpDecls.splice( tmpDecls.end(), ltmp ); 234 tmpDecls.splice( tmpDecls.end(), rtmp ); 235 } 247 236 } 248 237 -
src/Tuples/Tuples.h
r8f7cea1 r6eb8948 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Tuple Assignment.h --7 // Tuples.h -- 8 8 // 9 9 // Author : Rodolfo G. Esteves … … 14 14 // 15 15 16 #ifndef _TUPLE _ASSIGNMENT_H_17 #define _TUPLE_ ASSIGNMENT_H_16 #ifndef _TUPLES_H_ 17 #define _TUPLE_H_ 18 18 19 19 #include <string> … … 26 26 27 27 namespace Tuples { 28 // TupleAssignment.cc 28 29 void handleTupleAssignment( ResolvExpr::AlternativeFinder & currentFinder, UntypedExpr * assign, std::list<ResolvExpr::AltList> & possibilities ); 30 31 // TupleExpansion.cc 32 void expandTuples( std::list< Declaration * > & translationUnit ); 29 33 } // namespace Tuples 30 34 -
src/Tuples/module.mk
r8f7cea1 r6eb8948 15 15 ############################################################################### 16 16 17 SRC += Tuples/TupleAssignment.cc 17 SRC += Tuples/TupleAssignment.cc \ 18 Tuples/TupleExpansion.cc -
src/main.cc
r8f7cea1 r6eb8948 42 42 #include "Common/UnimplementedError.h" 43 43 #include "../config.h" 44 #include "Tuples/Tuples.h" 44 45 45 46 using namespace std; … … 265 266 OPTPRINT( "convertLvalue" ) 266 267 GenPoly::convertLvalue( translationUnit ); 268 OPTPRINT( "expandTuples" ); // xxx - is this the right place for this? 269 Tuples::expandTuples( translationUnit ); 267 270 268 271 if ( bboxp ) {
Note: See TracChangeset
for help on using the changeset viewer.