- Timestamp:
- Jul 25, 2022, 3:17:25 PM (3 years ago)
- Branches:
- ADT, ast-experimental, master, pthread-emulation, qualifiedEnum
- Children:
- b0d9ff7
- Parents:
- 4e2befe3 (diff), ffec1bf (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. - Location:
- src
- Files:
-
- 2 added
- 47 edited
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Expr.cpp
r4e2befe3 rdef751f 272 272 // Adjust the length of the string for the terminator. 273 273 const Expr * strSize = from_ulong( loc, str.size() + 1 ); 274 const Type * strType = new ArrayType( charType, strSize, FixedLen, StaticDim );274 const Type * strType = new ArrayType( charType, strSize, FixedLen, DynamicDim ); 275 275 const std::string strValue = "\"" + str + "\""; 276 276 return new ConstantExpr( loc, strType, strValue, std::nullopt ); -
src/AST/Pass.hpp
r4e2befe3 rdef751f 264 264 __pass::result1<ast::Stmt> call_accept_as_compound(const ast::Stmt *); 265 265 266 // requests type environment to be updated (why is it implemented like this?) 267 __pass::result1<ast::Expr> call_accept_top(const ast::Expr *); 268 266 269 template< template <class...> class container_t > 267 270 __pass::resultNstmt<container_t> call_accept( const container_t< ptr<Stmt> > & ); … … 277 280 template<typename node_t, typename parent_t, typename field_t> 278 281 void maybe_accept_as_compound(const node_t * &, field_t parent_t::* field); 282 283 template<typename node_t, typename parent_t, typename field_t> 284 void maybe_accept_top(const node_t * &, field_t parent_t::* field); 279 285 280 286 private: -
src/AST/Pass.impl.hpp
r4e2befe3 rdef751f 155 155 __pedantic_pass_assert( expr ); 156 156 157 const ast::TypeSubstitution ** typeSubs_ptr = __pass::typeSubs( core, 0 );158 if ( typeSubs_ptr && expr->env ) {159 *typeSubs_ptr = expr->env;160 }161 162 157 auto nval = expr->accept( *this ); 163 158 return { nval != expr, nval }; … … 171 166 const ast::Stmt * nval = stmt->accept( *this ); 172 167 return { nval != stmt, nval }; 168 } 169 170 template< typename core_t > 171 __pass::template result1<ast::Expr> ast::Pass< core_t >::call_accept_top( const ast::Expr * expr ) { 172 __pedantic_pass_assert( __visit_children() ); 173 __pedantic_pass_assert( expr ); 174 175 const ast::TypeSubstitution ** typeSubs_ptr = __pass::typeSubs( core, 0 ); 176 if ( typeSubs_ptr && expr->env ) { 177 *typeSubs_ptr = expr->env; 178 } 179 180 auto nval = expr->accept( *this ); 181 return { nval != expr, nval }; 173 182 } 174 183 … … 410 419 411 420 auto new_val = call_accept( old_val ); 421 422 static_assert( !std::is_same<const ast::Node *, decltype(new_val)>::value /* || std::is_same<int, decltype(old_val)>::value */, "ERROR"); 423 424 if( new_val.differs ) { 425 auto new_parent = __pass::mutate<core_t>(parent); 426 new_val.apply(new_parent, field); 427 parent = new_parent; 428 } 429 } 430 431 template< typename core_t > 432 template<typename node_t, typename super_t, typename field_t> 433 void ast::Pass< core_t >::maybe_accept_top( 434 const node_t * & parent, 435 field_t super_t::*field 436 ) { 437 static_assert( std::is_base_of<super_t, node_t>::value, "Error deducing member object" ); 438 439 if(__pass::skip(parent->*field)) return; 440 const auto & old_val = __pass::get(parent->*field, 0); 441 442 static_assert( !std::is_same<const ast::Node * &, decltype(old_val)>::value, "ERROR"); 443 444 auto new_val = call_accept_top( old_val ); 412 445 413 446 static_assert( !std::is_same<const ast::Node *, decltype(new_val)>::value /* || std::is_same<int, decltype(old_val)>::value */, "ERROR"); … … 756 789 757 790 if ( __visit_children() ) { 758 maybe_accept ( node, &StaticAssertDecl::cond );791 maybe_accept_top( node, &StaticAssertDecl::cond ); 759 792 maybe_accept( node, &StaticAssertDecl::msg ); 760 793 } … … 798 831 799 832 if ( __visit_children() ) { 800 maybe_accept ( node, &ExprStmt::expr );833 maybe_accept_top( node, &ExprStmt::expr ); 801 834 } 802 835 … … 839 872 guard_symtab guard { *this }; 840 873 maybe_accept( node, &IfStmt::inits ); 841 maybe_accept ( node, &IfStmt::cond );874 maybe_accept_top( node, &IfStmt::cond ); 842 875 maybe_accept_as_compound( node, &IfStmt::then ); 843 876 maybe_accept_as_compound( node, &IfStmt::else_ ); … … 857 890 guard_symtab guard { *this }; 858 891 maybe_accept( node, &WhileDoStmt::inits ); 859 maybe_accept ( node, &WhileDoStmt::cond );892 maybe_accept_top( node, &WhileDoStmt::cond ); 860 893 maybe_accept_as_compound( node, &WhileDoStmt::body ); 861 894 } … … 875 908 // xxx - old ast does not create WithStmtsToAdd scope for loop inits. should revisit this later. 876 909 maybe_accept( node, &ForStmt::inits ); 877 maybe_accept ( node, &ForStmt::cond );878 maybe_accept ( node, &ForStmt::inc );910 maybe_accept_top( node, &ForStmt::cond ); 911 maybe_accept_top( node, &ForStmt::inc ); 879 912 maybe_accept_as_compound( node, &ForStmt::body ); 880 913 } … … 890 923 891 924 if ( __visit_children() ) { 892 maybe_accept ( node, &SwitchStmt::cond );925 maybe_accept_top( node, &SwitchStmt::cond ); 893 926 maybe_accept( node, &SwitchStmt::cases ); 894 927 } … … 904 937 905 938 if ( __visit_children() ) { 906 maybe_accept ( node, &CaseClause::cond );939 maybe_accept_top( node, &CaseClause::cond ); 907 940 maybe_accept( node, &CaseClause::stmts ); 908 941 } … … 926 959 927 960 if ( __visit_children() ) { 928 maybe_accept ( node, &ReturnStmt::expr );961 maybe_accept_top( node, &ReturnStmt::expr ); 929 962 } 930 963 … … 971 1004 guard_symtab guard { *this }; 972 1005 maybe_accept( node, &CatchClause::decl ); 973 maybe_accept ( node, &CatchClause::cond );1006 maybe_accept_top( node, &CatchClause::cond ); 974 1007 maybe_accept_as_compound( node, &CatchClause::body ); 975 1008 } … … 2058 2091 2059 2092 if ( __visit_children() ) { 2060 maybe_accept ( node, &SingleInit::value );2093 maybe_accept_top( node, &SingleInit::value ); 2061 2094 } 2062 2095 -
src/AST/SymbolTable.cpp
r4e2befe3 rdef751f 65 65 66 66 Expr * SymbolTable::IdData::combine( const CodeLocation & loc, ResolvExpr::Cost & cost ) const { 67 Expr * ret = ( baseExpr ) ? 68 (Expr *)new MemberExpr{ loc, id, referenceToRvalueConversion( baseExpr, cost ) } : 69 (Expr *)new VariableExpr{ loc, id }; 67 Expr * ret; 68 if ( baseExpr ) { 69 if (baseExpr->env) { 70 Expr * base = shallowCopy(baseExpr); 71 const TypeSubstitution * subs = baseExpr->env; 72 base->env = nullptr; 73 ret = new MemberExpr{loc, id, referenceToRvalueConversion( base, cost )}; 74 ret->env = subs; 75 } 76 else { 77 ret = new MemberExpr{ loc, id, referenceToRvalueConversion( baseExpr, cost ) }; 78 } 79 } 80 else { 81 ret = new VariableExpr{ loc, id }; 82 } 70 83 if ( deleter ) { ret = new DeletedExpr{ loc, ret, deleter }; } 71 84 return ret; … … 772 785 && ! dynamic_cast<const UnionInstType *>(rty) ) continue; 773 786 ResolvExpr::Cost cost = ResolvExpr::Cost::zero; 787 ast::ptr<ast::TypeSubstitution> tmp = expr->env; 788 expr = mutate_field(expr, &Expr::env, nullptr); 774 789 const Expr * base = ResolvExpr::referenceToRvalueConversion( expr, cost ); 790 base = mutate_field(base, &Expr::env, tmp); 791 775 792 addMembers( 776 793 rty->aggr(), new MemberExpr{ base->location, dwt, base }, handleConflicts ); -
src/AST/TypeSubstitution.cpp
r4e2befe3 rdef751f 97 97 TypeSubstitution * newEnv; 98 98 EnvTrimmer( const TypeSubstitution * env, TypeSubstitution * newEnv ) : env( env ), newEnv( newEnv ){} 99 void previsit( FunctionType * ftype ) {99 void previsit( const FunctionType * ftype ) { 100 100 // transfer known bindings for seen type variables 101 101 for (auto & formal : ftype->forall) { -
src/CodeGen/FixNames.cc
r4e2befe3 rdef751f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // FixNames.cc -- 7 // FixNames.cc -- Adjustments to typed declarations. 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Fri Oct 29 15:49:00 202113 // Update Count : 2 312 // Last Modified On : Wed Jul 20 11:49:00 2022 13 // Update Count : 24 14 14 // 15 15 … … 87 87 88 88 /// Does work with the main function and scopeLevels. 89 class FixNames_new : public ast::WithGuards{89 class FixNames_new final { 90 90 int scopeLevel = 1; 91 91 … … 103 103 104 104 const ast::FunctionDecl *postvisit( const ast::FunctionDecl *functionDecl ) { 105 // This store is used to ensure a maximum of one call to mutate.106 ast::FunctionDecl * mutDecl = nullptr;105 if ( FixMain::isMain( functionDecl ) ) { 106 auto mutDecl = ast::mutate( functionDecl ); 107 107 108 if ( shouldSetScopeLevel( functionDecl ) ) { 109 mutDecl = ast::mutate( functionDecl ); 110 mutDecl->scopeLevel = scopeLevel; 111 } 112 113 if ( FixMain::isMain( functionDecl ) ) { 114 if ( !mutDecl ) { mutDecl = ast::mutate( functionDecl ); } 108 if ( shouldSetScopeLevel( mutDecl ) ) { 109 mutDecl->scopeLevel = scopeLevel; 110 } 115 111 116 112 int nargs = mutDecl->params.size(); … … 124 120 ) 125 121 ); 122 123 return mutDecl; 124 } else if ( shouldSetScopeLevel( functionDecl ) ) { 125 return ast::mutate_field( functionDecl, &ast::FunctionDecl::scopeLevel, scopeLevel ); 126 } else { 127 return functionDecl; 126 128 } 127 return mutDecl ? mutDecl : functionDecl;128 129 } 129 130 130 131 void previsit( const ast::CompoundStmt * ) { 131 GuardValue( scopeLevel ) += 1; 132 scopeLevel += 1; 133 } 134 135 void postvisit( const ast::CompoundStmt * ) { 136 scopeLevel -= 1; 132 137 } 133 138 }; -
src/CodeGen/FixNames.h
r4e2befe3 rdef751f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // FixNames.h -- 7 // FixNames.h -- Adjustments to typed declarations. 8 8 // 9 9 // Author : Richard C. Bilson … … 26 26 /// mangles object and function names 27 27 void fixNames( std::list< Declaration* > & translationUnit ); 28 void fixNames( ast::TranslationUnit & translationUnit ); 28 /// Sets scope levels and fills in main's default return. 29 void fixNames( ast::TranslationUnit & translationUnit ); 29 30 } // namespace CodeGen 30 31 -
src/Concurrency/Keywords.h
r4e2befe3 rdef751f 28 28 void implementThreadStarter( std::list< Declaration * > & translationUnit ); 29 29 30 /// Implement the sue-like keywords and the suspend keyword. 30 /// Implement the sue-like keywords and the suspend keyword. Pre-Autogen 31 31 void implementKeywords( ast::TranslationUnit & translationUnit ); 32 /// Implement the mutex parameters and mutex statement. 32 /// Implement the mutex parameters and mutex statement. Post-Autogen 33 33 void implementMutex( ast::TranslationUnit & translationUnit ); 34 /// Add the thread starter code to constructors. 34 /// Add the thread starter code to constructors. Post-Autogen 35 35 void implementThreadStarter( ast::TranslationUnit & translationUnit ); 36 36 }; -
src/ControlStruct/ExceptDecl.cc
r4e2befe3 rdef751f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // ExceptDecl.cc -- 7 // ExceptDecl.cc -- Handles declarations of exception types. 8 8 // 9 9 // Author : Henry Xue -
src/ControlStruct/ExceptDecl.h
r4e2befe3 rdef751f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // ExceptDecl.h -- 7 // ExceptDecl.h -- Handles declarations of exception types. 8 8 // 9 9 // Author : Henry Xue 10 10 // Created On : Tue Jul 20 04:10:50 2021 11 // Last Modified By : Henry Xue12 // Last Modified On : Tue Jul 20 04:10:50 202113 // Update Count : 111 // Last Modified By : Andrew Beach 12 // Last Modified On : Tue Jul 12 15:49:00 2022 13 // Update Count : 2 14 14 // 15 15 … … 20 20 class Declaration; 21 21 22 namespace ast { 23 class TranslationUnit; 24 } 25 22 26 namespace ControlStruct { 23 void translateExcept( std::list< Declaration *> & translationUnit ); 27 /// Unfold exception declarations into raw structure declarations. 28 /// Also builds vtable declarations and converts vtable types. 29 void translateExcept( std::list< Declaration *> & translationUnit ); 30 void translateExcept( ast::TranslationUnit & translationUnit ); 24 31 } -
src/ControlStruct/HoistControlDecls.hpp
r4e2befe3 rdef751f 21 21 22 22 namespace ControlStruct { 23 // Hoist declarations out of control flow statements into compound statement. 23 /// Hoist declarations out of control flow statements into compound statement. 24 /// Must happen before auto-gen routines are added. 24 25 void hoistControlDecls( ast::TranslationUnit & translationUnit ); 25 26 } // namespace ControlStruct -
src/ControlStruct/MultiLevelExit.cpp
r4e2befe3 rdef751f 149 149 }; 150 150 151 NullStmt * labelledNullStmt( 152 const CodeLocation & cl, const Label & label ) { 151 NullStmt * labelledNullStmt( const CodeLocation & cl, const Label & label ) { 153 152 return new NullStmt( cl, vector<Label>{ label } ); 154 153 } … … 164 163 165 164 const CompoundStmt * MultiLevelExitCore::previsit( 166 const CompoundStmt * stmt ) {165 const CompoundStmt * stmt ) { 167 166 visit_children = false; 168 167 … … 189 188 } 190 189 191 size_t getUnusedIndex( 192 const Stmt * stmt, const Label & originalTarget ) { 190 size_t getUnusedIndex( const Stmt * stmt, const Label & originalTarget ) { 193 191 const size_t size = stmt->labels.size(); 194 192 … … 210 208 } 211 209 212 const Stmt * addUnused( 213 const Stmt * stmt, const Label & originalTarget ) { 210 const Stmt * addUnused( const Stmt * stmt, const Label & originalTarget ) { 214 211 size_t i = getUnusedIndex( stmt, originalTarget ); 215 212 if ( i == stmt->labels.size() ) { … … 356 353 357 354 // Mimic what the built-in push_front would do anyways. It is O(n). 358 void push_front( 359 vector<ptr<Stmt>> & vec, const Stmt * element ) { 355 void push_front( vector<ptr<Stmt>> & vec, const Stmt * element ) { 360 356 vec.emplace_back( nullptr ); 361 357 for ( size_t i = vec.size() - 1 ; 0 < i ; --i ) { … … 590 586 591 587 ptr<Stmt> else_stmt = nullptr; 592 Stmt * loop_kid = nullptr;588 const Stmt * loop_kid = nullptr; 593 589 // check if loop node and if so add else clause if it exists 594 const WhileDoStmt * whilePtr = dynamic_cast<const WhileDoStmt *>(kid.get());595 if ( whilePtr && whilePtr->else_ ) {590 const WhileDoStmt * whilePtr = kid.as<WhileDoStmt>(); 591 if ( whilePtr && whilePtr->else_ ) { 596 592 else_stmt = whilePtr->else_; 597 WhileDoStmt * mutate_ptr = mutate(whilePtr); 598 mutate_ptr->else_ = nullptr; 599 loop_kid = mutate_ptr; 600 } 601 const ForStmt * forPtr = dynamic_cast<const ForStmt *>(kid.get()); 602 if ( forPtr && forPtr->else_) { 593 loop_kid = mutate_field( whilePtr, &WhileDoStmt::else_, nullptr ); 594 } 595 const ForStmt * forPtr = kid.as<ForStmt>(); 596 if ( forPtr && forPtr->else_ ) { 603 597 else_stmt = forPtr->else_; 604 ForStmt * mutate_ptr = mutate(forPtr); 605 mutate_ptr->else_ = nullptr; 606 loop_kid = mutate_ptr; 598 loop_kid = mutate_field( forPtr, &ForStmt::else_, nullptr ); 607 599 } 608 600 -
src/ControlStruct/module.mk
r4e2befe3 rdef751f 17 17 SRC += \ 18 18 ControlStruct/ExceptDecl.cc \ 19 ControlStruct/ExceptDeclNew.cpp \ 19 20 ControlStruct/ExceptDecl.h \ 20 21 ControlStruct/ExceptTranslateNew.cpp \ -
src/GenPoly/Box.cc
r4e2befe3 rdef751f 189 189 /// Enters a new scope for type-variables, adding the type variables from ty 190 190 void beginTypeScope( Type *ty ); 191 /// Exits the type-variable scope192 void endTypeScope();193 191 /// Enters a new scope for knowLayouts and knownOffsets and queues exit calls 194 192 void beginGenericScope(); … … 198 196 UniqueName bufNamer; ///< Namer for VLA buffers 199 197 Expression * addrMember = nullptr; ///< AddressExpr argument is MemberExpr? 198 bool expect_func_type = false; ///< used to avoid recursing too deep in type decls 200 199 }; 201 200 … … 1419 1418 void PolyGenericCalculator::beginGenericScope() { 1420 1419 GuardScope( *this ); 1420 // We expect the first function type see to be the type relating to this scope 1421 // but any further type is probably some unrelated function pointer 1422 // keep track of which is the first 1423 GuardValue( expect_func_type ); 1424 expect_func_type = true; 1421 1425 } 1422 1426 … … 1468 1472 void PolyGenericCalculator::premutate( FunctionType *funcType ) { 1469 1473 beginTypeScope( funcType ); 1474 1475 GuardValue( expect_func_type ); 1476 1477 if(!expect_func_type) { 1478 GuardAction( [this]() { 1479 knownLayouts.endScope(); 1480 knownOffsets.endScope(); 1481 }); 1482 // If this is the first function type we see 1483 // Then it's the type of the declaration and we care about it 1484 knownLayouts.beginScope(); 1485 knownOffsets.beginScope(); 1486 } 1487 1488 // The other functions type we will see in this scope are probably functions parameters 1489 // they don't help us with the layout and offsets so don't mark them as known in this scope 1490 expect_func_type = false; 1470 1491 1471 1492 // make sure that any type information passed into the function is accounted for … … 1746 1767 } 1747 1768 1769 // std::cout << "TRUE 2" << std::endl; 1770 1748 1771 return true; 1749 1772 } else if ( UnionInstType *unionTy = dynamic_cast< UnionInstType* >( ty ) ) { -
src/GenPoly/Specialize.h
r4e2befe3 rdef751f 17 17 18 18 #include <list> // for list 19 #include "AST/TranslationUnit.hpp" 19 20 20 21 class Declaration; … … 23 24 /// generates thunks where needed 24 25 void convertSpecializations( std::list< Declaration* >& translationUnit ); 26 27 void convertSpecializations( ast::TranslationUnit & translationUnit ); 25 28 } // namespace GenPoly 26 29 -
src/GenPoly/module.mk
r4e2befe3 rdef751f 34 34 GenPoly/ScrubTyVars.h \ 35 35 GenPoly/Specialize.cc \ 36 GenPoly/SpecializeNew.cpp \ 36 37 GenPoly/Specialize.h 37 38 -
src/InitTweak/FixInitNew.cpp
r4e2befe3 rdef751f 73 73 /// wrap function application expressions as ImplicitCopyCtorExpr nodes so that it is easy to identify which 74 74 /// function calls need their parameters to be copy constructed 75 struct InsertImplicitCalls : public ast::With ConstTypeSubstitution, public ast::WithShortCircuiting {75 struct InsertImplicitCalls : public ast::WithShortCircuiting { 76 76 const ast::Expr * postvisit( const ast::ApplicationExpr * appExpr ); 77 77 … … 457 457 // is needed to obtain the type of temporary variables so that copy 458 458 // constructor calls can be resolved. 459 assert( typeSubs );460 459 expr->env = tmp; 461 460 return expr; -
src/InitTweak/GenInit.cc
r4e2befe3 rdef751f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // GenInit.cc -- 7 // GenInit.cc -- Generate initializers, and other stuff. 8 8 // 9 9 // Author : Rob Schluntz -
src/InitTweak/GenInit.h
r4e2befe3 rdef751f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // GenInit.h -- 7 // GenInit.h -- Generate initializers, and other stuff. 8 8 // 9 9 // Author : Rodolfo G. Esteves … … 29 29 void genInit( ast::TranslationUnit & translationUnit ); 30 30 31 /// Converts return statements into copy constructor calls on the hidden return variable 31 /// Converts return statements into copy constructor calls on the hidden return variable. 32 /// This pass must happen before auto-gen. 32 33 void fixReturnStatements( std::list< Declaration * > & translationUnit ); 33 34 void fixReturnStatements( ast::TranslationUnit & translationUnit ); -
src/ResolvExpr/CandidateFinder.cpp
r4e2befe3 rdef751f 1263 1263 newExpr, copy( tenv ), ast::OpenVarSet{}, ast::AssertionSet{}, Cost::zero, 1264 1264 cost ); 1265 1266 if (newCand->expr->env) { 1267 newCand->env.add(*newCand->expr->env); 1268 auto mutExpr = newCand->expr.get_and_mutate(); 1269 mutExpr->env = nullptr; 1270 newCand->expr = mutExpr; 1271 } 1272 1265 1273 PRINT( 1266 1274 std::cerr << "decl is "; -
src/ResolvExpr/Resolver.cc
r4e2befe3 rdef751f 1555 1555 if ( type->dimension ) { 1556 1556 ast::ptr< ast::Type > sizeType = context.global.sizeType; 1557 ast::ptr< ast::Expr > dimension = findSingleExpression( type->dimension, sizeType, context ); 1558 assertf(dimension->env->empty(), "array dimension expr has nonempty env"); 1559 dimension.get_and_mutate()->env = nullptr; 1557 1560 ast::mutate_field( 1558 1561 type, &PtrType::dimension, 1559 findSingleExpression( type->dimension, sizeType, context ));1562 dimension); 1560 1563 } 1561 1564 return type; … … 2008 2011 tmp->accept( *visitor ); 2009 2012 } 2013 else if (expr->env && expr->env->empty()) { 2014 expr = ast::mutate_field(expr.get(), &ast::Expr::env, nullptr); 2015 } 2010 2016 } 2011 2017 } -
src/Tuples/Tuples.cc
r4e2befe3 rdef751f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Tuples. h --7 // Tuples.cc -- A collection of tuple operations. 8 8 // 9 9 // Author : Andrew Beach -
src/Tuples/Tuples.h
r4e2befe3 rdef751f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Tuples.h -- 7 // Tuples.h -- A collection of tuple operations. 8 8 // 9 9 // Author : Rodolfo G. Esteves -
src/Validate/Autogen.hpp
r4e2befe3 rdef751f 22 22 namespace Validate { 23 23 24 /// Generate routines for all data types in the translation unit. 25 /// A lot of passes have to happen either before or after this pass. 24 26 void autogenerateRoutines( ast::TranslationUnit & translationUnit ); 25 27 -
src/Validate/CompoundLiteral.hpp
r4e2befe3 rdef751f 23 23 24 24 /// Use variables to implement compound literals. 25 /// Must happen after auto-gen routines are added. 25 26 void handleCompoundLiterals( ast::TranslationUnit & translationUnit ); 26 27 -
src/Validate/EnumAndPointerDecay.cpp
r4e2befe3 rdef751f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // EnumAndPointerDecay.cpp -- 7 // EnumAndPointerDecay.cpp -- Normalizes enumerations and types in functions. 8 8 // 9 9 // Author : Andrew Beach -
src/Validate/EnumAndPointerDecay.hpp
r4e2befe3 rdef751f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // EnumAndPointerDecay.hpp -- 7 // EnumAndPointerDecay.hpp -- Normalizes enumerations and types in functions. 8 8 // 9 9 // Author : Andrew Beach … … 22 22 namespace Validate { 23 23 24 /// Fix the parameter and return types of functions. Also assigns types to 25 /// enumeration values. This must happen before Link Reference to Types, 26 /// it needs correct types for mangling, and before auto-gen. 24 27 void decayEnumsAndPointers( ast::TranslationUnit & translationUnit ); 25 28 -
src/Validate/FindSpecialDecls.h
r4e2befe3 rdef751f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // FindSpecialDeclarations.h -- 7 // FindSpecialDeclarations.h -- Find special declarations used in the compiler. 8 8 // 9 9 // Author : Rob Schluntz … … 43 43 void findSpecialDecls( std::list< Declaration * > & translationUnit ); 44 44 45 /// find and remember some of the special declarations that are useful for45 /// Find and remember some of the special declarations that are useful for 46 46 /// generating code, so that they do not have to be discovered multiple times. 47 47 void findGlobalDecls( ast::TranslationUnit & translationUnit ); -
src/Validate/FixQualifiedTypes.cpp
r4e2befe3 rdef751f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // FixQualifiedTypes.cpp -- 7 // FixQualifiedTypes.cpp -- Replace the qualified type with a direct type. 8 8 // 9 9 // Author : Andrew Beach … … 76 76 ret->qualifiers = type->qualifiers; 77 77 ast::TypeSubstitution sub( aggr->params, instp->params ); 78 // = parent->genericSubstitution();79 78 auto result = sub.apply(ret); 80 79 return result.node.release(); -
src/Validate/FixQualifiedTypes.hpp
r4e2befe3 rdef751f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // FixQualifiedTypes.hpp -- 7 // FixQualifiedTypes.hpp -- Replace the qualified type with a direct type. 8 8 // 9 9 // Author : Andrew Beach … … 22 22 namespace Validate { 23 23 24 /// Replaces qualified types with an unqualified NamedTypeDecl. 25 /// Must happen after Link References To Types, 26 /// because aggregate members are accessed. 24 27 void fixQualifiedTypes( ast::TranslationUnit & translationUnit ); 25 28 -
src/Validate/FixReturnTypes.cpp
r4e2befe3 rdef751f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // FixReturnTypes.cpp -- 7 // FixReturnTypes.cpp -- Unifies the representation of return types. 8 8 // 9 9 // Author : Andrew Beach -
src/Validate/FixReturnTypes.hpp
r4e2befe3 rdef751f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // FixReturnTypes.hpp -- 7 // FixReturnTypes.hpp -- Unifies the representation of return types. 8 8 // 9 9 // Author : Andrew Beach … … 22 22 namespace Validate { 23 23 24 // This pass needs to happen early so that other passes can find tuple types 25 // in the right places, especially for function return types. 24 /// This pass needs to happen early so that other passes can find tuple types 25 /// in the right places, especially for function return types. 26 /// Must happen before auto-gen. 26 27 void fixReturnTypes( ast::TranslationUnit & translationUnit ); 27 28 -
src/Validate/ForallPointerDecay.hpp
r4e2befe3 rdef751f 29 29 /// Also checks that operator names are used properly on functions and 30 30 /// assigns unique IDs. This is a "legacy" pass. 31 /// Must be after implement concurrent keywords; because uniqueIds must be 32 /// set on declaration before resolution. 33 /// Must happen before auto-gen routines are added. 31 34 void decayForallPointers( ast::TranslationUnit & transUnit ); 32 35 -
src/Validate/GenericParameter.cpp
r4e2befe3 rdef751f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // GenericParameter.hpp -- 7 // GenericParameter.hpp -- Generic parameter related passes. 8 8 // 9 9 // Author : Andrew Beach -
src/Validate/GenericParameter.hpp
r4e2befe3 rdef751f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // GenericParameter.hpp -- 7 // GenericParameter.hpp -- Generic parameter related passes. 8 8 // 9 9 // Author : Andrew Beach … … 23 23 24 24 /// Perform substutions for generic parameters and fill in defaults. 25 /// Check as early as possible, but it can't happen before Link References to 26 /// Types and observed failing when attempted before eliminate typedef. 25 27 void fillGenericParameters( ast::TranslationUnit & translationUnit ); 26 28 -
src/Validate/HoistStruct.hpp
r4e2befe3 rdef751f 22 22 namespace Validate { 23 23 24 /// Flattens nested type declarations. 24 /// Flattens nested type declarations. (Run right after Fix Qualified Types.) 25 25 void hoistStruct( ast::TranslationUnit & translationUnit ); 26 26 -
src/Validate/HoistTypeDecls.cpp
r4e2befe3 rdef751f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // HoistTypeDecls.cpp -- 7 // HoistTypeDecls.cpp -- Hoists declarations of implicitly declared types. 8 8 // 9 9 // Author : Andrew Beach -
src/Validate/HoistTypeDecls.hpp
r4e2befe3 rdef751f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // HoistTypeDecls.hpp -- 7 // HoistTypeDecls.hpp -- Hoists declarations of implicitly declared types. 8 8 // 9 9 // Author : Andrew Beach … … 22 22 namespace Validate { 23 23 24 /// There are some places where a type can be declared but are usually only 25 /// referenced (with an *InstType). This inserts the declarations before 26 /// they are referenced. 24 27 void hoistTypeDecls( ast::TranslationUnit & translationUnit ); 25 28 -
src/Validate/LabelAddressFixer.cpp
r4e2befe3 rdef751f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // LabelAddressFixer.cpp -- 7 // LabelAddressFixer.cpp -- Create label address expressions. 8 8 // 9 9 // Author : Andrew Beach -
src/Validate/LabelAddressFixer.hpp
r4e2befe3 rdef751f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // LabelAddressFixer.hpp -- 7 // LabelAddressFixer.hpp -- Create label address expressions. 8 8 // 9 9 // Author : Andrew Beach … … 20 20 namespace Validate { 21 21 22 /// Label addresses are not actually created in the parser, this pass finds 23 /// the patterns that represent the label address expression. 22 24 void fixLabelAddresses( ast::TranslationUnit & translationUnit ); 23 25 -
src/Validate/LinkReferenceToTypes.hpp
r4e2befe3 rdef751f 22 22 namespace Validate { 23 23 24 /// Fills in the base value of various instance types, and some related 25 /// adjustments, such as setting the sized flag. 26 /// Because of the sized flag, it must happen before auto-gen. 24 27 void linkReferenceToTypes( ast::TranslationUnit & translationUnit ); 25 28 -
src/Validate/ReplaceTypedef.cpp
r4e2befe3 rdef751f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // ReplaceTypedef.cpp -- 7 // ReplaceTypedef.cpp -- Fill in all typedefs with the underlying type. 8 8 // 9 9 // Author : Andrew Beach 10 10 // Created On : Tue Jun 29 14:59:00 2022 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Mon Jul 12 14:17:00 202213 // Update Count : 012 // Last Modified On : Wed Jul 13 14:45:00 2022 13 // Update Count : 1 14 14 // 15 15 … … 63 63 void previsit( ast::TraitDecl const * ); 64 64 65 void previsit( ast::FunctionType const * );66 67 65 template<typename AggrDecl> 68 66 void addImplicitTypedef( AggrDecl * aggDecl ); … … 78 76 CodeLocation const * nearestLocation = nullptr; 79 77 int scopeLevel; 80 bool i nFunctionType= false;78 bool isAtFunctionTop = false; 81 79 }; 82 80 … … 105 103 ast::Type * ret = ast::deepCopy( def->second.first->base ); 106 104 ret->qualifiers |= type->qualifiers; 107 // GCC ignores certain attributes if they arrive by typedef, 108 // this mimics that. 109 // TODO: This might cover too much, it should just cover arguments 110 // and return values of a function. 111 if ( visitor->isInFunction() ) { 105 // We ignore certain attributes on function parameters if they arrive 106 // by typedef. GCC appears to do the same thing. 107 if ( isAtFunctionTop ) { 112 108 erase_if( ret->attributes, isNonParameterAttribute ); 113 109 } … … 207 203 GuardScope( typedefNames ); 208 204 GuardScope( typedeclNames ); 205 GuardValue( isAtFunctionTop ) = true; 209 206 } 210 207 … … 262 259 GuardScope( typedefNames ); 263 260 GuardScope( typedeclNames ); 261 GuardValue( isAtFunctionTop ) = false; 264 262 scopeLevel += 1; 265 263 } … … 292 290 GuardScope( typedefNames ); 293 291 GuardScope( typedeclNames ); 294 }295 296 void ReplaceTypedefCore::previsit( ast::FunctionType const * ) {297 GuardValue( inFunctionType ) = true;298 292 } 299 293 -
src/Validate/ReplaceTypedef.hpp
r4e2befe3 rdef751f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // ReplaceTypedef.hpp -- 7 // ReplaceTypedef.hpp -- Fill in all typedefs with the underlying type. 8 8 // 9 9 // Author : Andrew Beach … … 22 22 namespace Validate { 23 23 24 /// Uses of typedef are replaced with the type in the typedef. 24 25 void replaceTypedef( ast::TranslationUnit & translationUnit ); 25 26 -
src/Validate/VerifyCtorDtorAssign.cpp
r4e2befe3 rdef751f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // VerifyCtorDtorAssign.cpp -- 7 // VerifyCtorDtorAssign.cpp -- Check the form of operators. 8 8 // 9 9 // Author : Andrew Beach -
src/Validate/VerifyCtorDtorAssign.hpp
r4e2befe3 rdef751f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // VerifyCtorDtorAssign.hpp -- 7 // VerifyCtorDtorAssign.hpp -- Check the form of operators. 8 8 // 9 9 // Author : Andrew Beach … … 22 22 namespace Validate { 23 23 24 /// Check that constructors, destructors and assignments all have the correct 25 /// form. Must happen before auto-gen or anything that examines operators. 24 26 void verifyCtorDtorAssign( ast::TranslationUnit & translationUnit ); 25 27 -
src/Virtual/Tables.h
r4e2befe3 rdef751f 19 19 #include "AST/Fwd.hpp" 20 20 class Declaration; 21 class Expression; 22 class FunctionDecl; 23 class Initializer; 24 class ObjectDecl; 21 25 class StructDecl; 22 class Expression; 26 class StructInstType; 27 class Type; 23 28 24 29 namespace Virtual { -
src/main.cc
r4e2befe3 rdef751f 10 10 // Created On : Fri May 15 23:12:02 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Tue Jul 12 12:02:00 202213 // Update Count : 67 512 // Last Modified On : Mon Jul 18 11:08:00 2022 13 // Update Count : 676 14 14 // 15 15 … … 330 330 Stats::Time::StopBlock(); 331 331 332 PASS( "Translate Exception Declarations", ControlStruct::translateExcept( translationUnit ) );333 if ( exdeclp ) {334 dump( translationUnit );335 return EXIT_SUCCESS;336 } // if337 338 CodeTools::fillLocations( translationUnit );339 340 332 if( useNewAST ) { 341 CodeTools::fillLocations( translationUnit );342 343 333 if (Stats::Counters::enabled) { 344 334 ast::pass_visitor_stats.avg = Stats::Counters::build<Stats::Counters::AverageCounter<double>>("Average Depth - New"); … … 349 339 forceFillCodeLocations( transUnit ); 350 340 351 // Must happen before auto-gen, or anything that examines ops. 341 PASS( "Translate Exception Declarations", ControlStruct::translateExcept( transUnit ) ); 342 if ( exdeclp ) { 343 dump( move( transUnit ) ); 344 return EXIT_SUCCESS; 345 } 346 352 347 PASS( "Verify Ctor, Dtor & Assign", Validate::verifyCtorDtorAssign( transUnit ) ); 353 354 348 PASS( "Hoist Type Decls", Validate::hoistTypeDecls( transUnit ) ); 355 349 // Hoist Type Decls pulls some declarations out of contexts where … … 359 353 360 354 PASS( "Replace Typedefs", Validate::replaceTypedef( transUnit ) ); 361 362 // Must happen before auto-gen.363 355 PASS( "Fix Return Types", Validate::fixReturnTypes( transUnit ) ); 364 365 // Must happen before Link Reference to Types, it needs correct366 // types for mangling.367 356 PASS( "Enum and Pointer Decay", Validate::decayEnumsAndPointers( transUnit ) ); 368 357 369 // Must happen before auto-gen, because it uses the sized flag.370 358 PASS( "Link Reference To Types", Validate::linkReferenceToTypes( transUnit ) ); 371 359 372 // Must happen after Link References To Types,373 // because aggregate members are accessed.374 360 PASS( "Fix Qualified Types", Validate::fixQualifiedTypes( transUnit ) ); 375 376 361 PASS( "Hoist Struct", Validate::hoistStruct( transUnit ) ); 377 362 PASS( "Eliminate Typedef", Validate::eliminateTypedef( transUnit ) ); 378 379 // Check as early as possible. Can't happen before380 // LinkReferenceToType, observed failing when attempted381 // before eliminateTypedef382 363 PASS( "Validate Generic Parameters", Validate::fillGenericParameters( transUnit ) ); 383 384 364 PASS( "Translate Dimensions", Validate::translateDimensionParameters( transUnit ) ); 385 365 PASS( "Check Function Returns", Validate::checkReturnStatements( transUnit ) ); 386 387 // Must happen before Autogen.388 366 PASS( "Fix Return Statements", InitTweak::fixReturnStatements( transUnit ) ); 389 390 367 PASS( "Implement Concurrent Keywords", Concurrency::implementKeywords( transUnit ) ); 391 392 // Must be after implement concurrent keywords; because uniqueIds393 // must be set on declaration before resolution.394 // Must happen before autogen routines are added.395 368 PASS( "Forall Pointer Decay", Validate::decayForallPointers( transUnit ) ); 396 397 // Must happen before autogen routines are added.398 369 PASS( "Hoist Control Declarations", ControlStruct::hoistControlDecls( transUnit ) ); 399 370 400 // Must be after enum and pointer decay.401 // Must be before compound literals.402 371 PASS( "Generate Autogen Routines", Validate::autogenerateRoutines( transUnit ) ); 403 372 … … 470 439 PASS( "Translate Tries", ControlStruct::translateTries( transUnit ) ); 471 440 PASS( "Gen Waitfor", Concurrency::generateWaitFor( transUnit ) ); 441 PASS( "Convert Specializations", GenPoly::convertSpecializations( transUnit ) ); // needs to happen before tuple types are expanded 442 472 443 473 444 translationUnit = convert( move( transUnit ) ); 474 445 } else { 446 PASS( "Translate Exception Declarations", ControlStruct::translateExcept( translationUnit ) ); 447 if ( exdeclp ) { 448 dump( translationUnit ); 449 return EXIT_SUCCESS; 450 } // if 451 475 452 // add the assignment statement after the initialization of a type parameter 476 453 PASS( "Validate", SymTab::validate( translationUnit ) ); … … 538 515 PASS( "Translate Tries", ControlStruct::translateTries( translationUnit ) ); 539 516 PASS( "Gen Waitfor", Concurrency::generateWaitFor( translationUnit ) ); 517 PASS( "Convert Specializations", GenPoly::convertSpecializations( translationUnit ) ); // needs to happen before tuple types are expanded 518 540 519 } 541 520 542 PASS( "Convert Specializations", GenPoly::convertSpecializations( translationUnit ) ); // needs to happen before tuple types are expanded 521 522 // PASS( "Convert Specializations", GenPoly::convertSpecializations( translationUnit ) ); // needs to happen before tuple types are expanded 543 523 544 524 PASS( "Expand Tuples", Tuples::expandTuples( translationUnit ) ); // xxx - is this the right place for this?
Note:
See TracChangeset
for help on using the changeset viewer.