Changeset 6726a3a
- Timestamp:
- Jul 20, 2022, 2:37:57 PM (2 years ago)
- Branches:
- ADT, ast-experimental, master, pthread-emulation, qualifiedEnum
- Children:
- 6bf35d1, e6662f5
- Parents:
- d677355 (diff), 2fd0de0 (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. - Files:
-
- 1 added
- 39 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/theses/thierry_delisle_PhD/thesis/text/existing.tex
rd677355 r6726a3a 14 14 15 15 \section{Naming Convention} 16 Scheduling has been studied by various communities concentrating on different incarnation of the same problems. As a result, there are no standard naming conventions for scheduling that is respected across these communities. This document uses the term \newterm{\Gls{at}} to refer to the abstract objects being scheduled and the term \newterm{\Gls{proc}} to refer to the concrete objects executing these \ats. 16 Scheduling has been studied by various communities concentrating on different incarnation of the same problems. 17 As a result, there are no standard naming conventions for scheduling that is respected across these communities. 18 This document uses the term \newterm{\Gls{at}} to refer to the abstract objects being scheduled and the term \newterm{\Gls{proc}} to refer to the concrete objects executing these \ats. 17 19 18 20 \section{Static Scheduling} … … 26 28 \section{Dynamic Scheduling} 27 29 \newterm{Dynamic schedulers} determine \ats dependencies and costs during scheduling, if at all. 28 Hence, unlike static scheduling, \ats dependencies are conditional and detected at runtime. This detection takes the form of observing new \ats(s) in the system and determining dependencies from their behaviour, including suspending or halting a \ats that dynamically detects unfulfilled dependencies. 30 Hence, unlike static scheduling, \ats dependencies are conditional and detected at runtime. 31 This detection takes the form of observing new \ats(s) in the system and determining dependencies from their behaviour, including suspending or halting a \ats that dynamically detects unfulfilled dependencies. 29 32 Furthermore, each \ats has the responsibility of adding dependent \ats back into the system once dependencies are fulfilled. 30 33 As a consequence, the scheduler often has an incomplete view of the system, seeing only \ats with no pending dependencies. -
doc/theses/thierry_delisle_PhD/thesis/text/io.tex
rd677355 r6726a3a 1 1 \chapter{User Level \io} 2 As mentioned in Section~\ref{prev:io}, user- Level \io requires multiplexing the \io operations of many \glspl{thrd} onto fewer \glspl{proc} using asynchronous \io operations.2 As mentioned in Section~\ref{prev:io}, user-level \io requires multiplexing the \io operations of many \glspl{thrd} onto fewer \glspl{proc} using asynchronous \io operations. 3 3 Different operating systems offer various forms of asynchronous operations and, as mentioned in Chapter~\ref{intro}, this work is exclusively focused on the Linux operating-system. 4 4 … … 72 72 73 73 \paragraph{\lstinline{poll}} is the next oldest option, and takes as input an array of structures containing the FD numbers rather than their position in an array of bits, allowing a more compact input for interest sets that contain widely spaced FDs. 74 (For small interest sets with densely packed FDs, the @select@ bit mask can take less storage, and hence, copy less information into the kernel.) 74 For small interest sets with densely packed FDs, the @select@ bit mask can take less storage, and hence, copy less information into the kernel. 75 75 Furthermore, @poll@ is non-destructive, so the array of structures does not have to be re-initialize on every call. 76 76 Like @select@, @poll@ suffers from the limitation that the interest set cannot be changed by other \gls{kthrd}, while a manager thread is blocked in @poll@. … … 277 277 While this example is artificial, in the presence of many \glspl{thrd}, it is possible for this problem to arise ``in the wild''. 278 278 Furthermore, this pattern is difficult to reliably detect and avoid. 279 Once in this situation, the only escape is to interrupted the spinning \gls{thrd}, either directly or via some regular preemption (\eg time slicing).279 Once in this situation, the only escape is to interrupted the spinning \gls{thrd}, either directly or via some regular preemption, \eg time slicing. 280 280 Having to interrupt \glspl{thrd} for this purpose is costly, the latency can be large between interrupts, and the situation may be hard to detect. 281 % However, a more important reason why interrupting the \gls{thrd} is not a satisfying solution is that the \gls{proc} is using the instance it is tied to.282 % If it were to use it, then helping could be done as part of the usage.283 281 Interrupts are needed here entirely because the \gls{proc} is tied to an instance it is not using. 284 282 Therefore, a more satisfying solution is for the \gls{thrd} submitting the operation to notice that the instance is unused and simply go ahead and use it. … … 301 299 Free SQEs, \ie, SQEs that are not currently being used to represent a request, can be written to safely and have a field called @user_data@ that the kernel only reads to copy to @cqe@s. 302 300 Allocation also requires no ordering guarantee as all free SQEs are interchangeable. 303 % This requires a simple concurrent bag.304 301 The only added complexity is that the number of SQEs is fixed, which means allocation can fail. 305 302 … … 310 307 311 308 Once an SQE is filled in, it is added to the submission ring buffer, an operation that is not thread-safe, and then the kernel must be notified using the @io_uring_enter@ system call. 312 The submission ring buffer is the same size as the pre-allocated SQE buffer, therefore pushing to the ring buffer cannot fail because it is invalid to have the same \lstinline{sqe} multiple times in a ring buffer.309 The submission ring buffer is the same size as the pre-allocated SQE buffer, therefore pushing to the ring buffer cannot fail because it would mean a \lstinline{sqe} multiple times in the ring buffer, which is undefined behaviour. 313 310 However, as mentioned, the system call itself can fail with the expectation that it can be retried once some submitted operations complete. 314 311 … … 346 343 While instance borrowing looks similar to work sharing and stealing, I think it is different enough to warrant a different verb to avoid confusion.} 347 344 348 In this approach, each cluster (see Figure~\ref{fig:system})owns a pool of @io_uring@ instances managed by an \newterm{arbiter}.345 In this approach, each cluster, see Figure~\ref{fig:system}, owns a pool of @io_uring@ instances managed by an \newterm{arbiter}. 349 346 When a \gls{thrd} attempts to issue an \io operation, it ask for an instance from the arbiter and issues requests to that instance. 350 347 This instance is now bound to the \gls{proc} the \gls{thrd} is running on. 351 348 This binding is kept until the arbiter decides to revoke it, taking back the instance and reverting the \gls{proc} to its initial state with respect to \io. 352 349 This tight coupling means that synchronization can be minimal since only one \gls{proc} can use the instance at a time, akin to the private instances approach. 353 However, it differs in that revocation by the arbiter (an interrupt)means this approach does not suffer from the deadlock scenario described above.350 However, it differs in that revocation by the arbiter means this approach does not suffer from the deadlock scenario described above. 354 351 355 352 Arbitration is needed in the following cases: … … 377 374 378 375 \paragraph{External Submissions} are handled by the arbiter by revoking the appropriate instance and adding the submission to the submission ring. 379 However, 376 However, there is no need to immediately revoke the instance. 380 377 External submissions must simply be added to the ring before the next system call, \ie, when the submission ring is flushed. 381 378 This means whoever is responsible for the system call, first checks if the instance has any external submissions. … … 453 450 454 451 \section{Interface} 455 456 452 The last important part of the \io subsystem is its interface. 457 453 There are multiple approaches that can be offered to programmers, each with advantages and disadvantages. -
src/AST/Expr.cpp
rd677355 r6726a3a 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/CodeGen/FixNames.cc
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 17 17 SRC += \ 18 18 ControlStruct/ExceptDecl.cc \ 19 ControlStruct/ExceptDeclNew.cpp \ 19 20 ControlStruct/ExceptDecl.h \ 20 21 ControlStruct/ExceptTranslateNew.cpp \ -
src/InitTweak/GenInit.cc
rd677355 r6726a3a 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
rd677355 r6726a3a 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/Tuples/Tuples.cc
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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 -
src/Validate/ReplaceTypedef.hpp
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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
rd677355 r6726a3a 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 … … 473 442 translationUnit = convert( move( transUnit ) ); 474 443 } else { 444 PASS( "Translate Exception Declarations", ControlStruct::translateExcept( translationUnit ) ); 445 if ( exdeclp ) { 446 dump( translationUnit ); 447 return EXIT_SUCCESS; 448 } // if 449 475 450 // add the assignment statement after the initialization of a type parameter 476 451 PASS( "Validate", SymTab::validate( translationUnit ) );
Note: See TracChangeset
for help on using the changeset viewer.