Changes in / [6726a3a:d677355]


Ignore:
Files:
1 deleted
39 edited

Legend:

Unmodified
Added
Removed
  • doc/theses/thierry_delisle_PhD/thesis/text/existing.tex

    r6726a3a rd677355  
    1414
    1515\section{Naming Convention}
    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.
     16Scheduling 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.
    1917
    2018\section{Static Scheduling}
     
    2826\section{Dynamic Scheduling}
    2927\newterm{Dynamic schedulers} determine \ats dependencies and costs during scheduling, if at all.
    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.
     28Hence, 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.
    3229Furthermore, each \ats has the responsibility of adding dependent \ats back into the system once dependencies are fulfilled.
    3330As 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

    r6726a3a rd677355  
    11\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.
     2As 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.
    33Different 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.
    44
     
    7272
    7373\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.)
    7575Furthermore, @poll@ is non-destructive, so the array of structures does not have to be re-initialize on every call.
    7676Like @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@.
     
    277277While this example is artificial, in the presence of many \glspl{thrd}, it is possible for this problem to arise ``in the wild''.
    278278Furthermore, 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.
     279Once in this situation, the only escape is to interrupted the spinning \gls{thrd}, either directly or via some regular preemption (\eg time slicing).
    280280Having 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.
    281283Interrupts are needed here entirely because the \gls{proc} is tied to an instance it is not using.
    282284Therefore, 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.
     
    299301Free 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.
    300302Allocation also requires no ordering guarantee as all free SQEs are interchangeable.
     303% This requires a simple concurrent bag.
    301304The only added complexity is that the number of SQEs is fixed, which means allocation can fail.
    302305
     
    307310
    308311Once 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.
    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.
     312The 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.
    310313However, as mentioned, the system call itself can fail with the expectation that it can be retried once some submitted operations complete.
    311314
     
    343346While instance borrowing looks similar to work sharing and stealing, I think it is different enough to warrant a different verb to avoid confusion.}
    344347
    345 In this approach, each cluster, see Figure~\ref{fig:system}, owns a pool of @io_uring@ instances managed by an \newterm{arbiter}.
     348In this approach, each cluster (see Figure~\ref{fig:system}) owns a pool of @io_uring@ instances managed by an \newterm{arbiter}.
    346349When a \gls{thrd} attempts to issue an \io operation, it ask for an instance from the arbiter and issues requests to that instance.
    347350This instance is now bound to the \gls{proc} the \gls{thrd} is running on.
    348351This 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.
    349352This 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.
    350 However, it differs in that revocation by the arbiter means this approach does not suffer from the deadlock scenario described above.
     353However, it differs in that revocation by the arbiter (an interrupt) means this approach does not suffer from the deadlock scenario described above.
    351354
    352355Arbitration is needed in the following cases:
     
    374377
    375378\paragraph{External Submissions} are handled by the arbiter by revoking the appropriate instance and adding the submission to the submission ring.
    376 However, there is no need to immediately revoke the instance.
     379However,  there is no need to immediately revoke the instance.
    377380External submissions must simply be added to the ring before the next system call, \ie, when the submission ring is flushed.
    378381This means whoever is responsible for the system call, first checks if the instance has any external submissions.
     
    450453
    451454\section{Interface}
     455
    452456The last important part of the \io subsystem is its interface.
    453457There are multiple approaches that can be offered to programmers, each with advantages and disadvantages.
  • src/AST/Expr.cpp

    r6726a3a rd677355  
    272272        // Adjust the length of the string for the terminator.
    273273        const Expr * strSize = from_ulong( loc, str.size() + 1 );
    274         const Type * strType = new ArrayType( charType, strSize, FixedLen, DynamicDim );
     274        const Type * strType = new ArrayType( charType, strSize, FixedLen, StaticDim );
    275275        const std::string strValue = "\"" + str + "\"";
    276276        return new ConstantExpr( loc, strType, strValue, std::nullopt );
  • src/CodeGen/FixNames.cc

    r6726a3a rd677355  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // FixNames.cc -- Adjustments to typed declarations.
     7// FixNames.cc --
    88//
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Wed Jul 20 11:49:00 2022
    13 // Update Count     : 24
     12// Last Modified On : Fri Oct 29 15:49:00 2021
     13// Update Count     : 23
    1414//
    1515
     
    8787
    8888/// Does work with the main function and scopeLevels.
    89 class FixNames_new final {
     89class FixNames_new : public ast::WithGuards {
    9090        int scopeLevel = 1;
    9191
     
    103103
    104104        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;
     107
     108                if ( shouldSetScopeLevel( functionDecl ) ) {
     109                        mutDecl = ast::mutate( functionDecl );
     110                        mutDecl->scopeLevel = scopeLevel;
     111                }
     112
    105113                if ( FixMain::isMain( functionDecl ) ) {
    106                         auto mutDecl = ast::mutate( functionDecl );
    107 
    108                         if ( shouldSetScopeLevel( mutDecl ) ) {
    109                                 mutDecl->scopeLevel = scopeLevel;
    110                         }
     114                        if ( !mutDecl ) { mutDecl = ast::mutate( functionDecl ); }
    111115
    112116                        int nargs = mutDecl->params.size();
     
    120124                                )
    121125                        );
    122 
    123                         return mutDecl;
    124                 } else if ( shouldSetScopeLevel( functionDecl ) ) {
    125                         return ast::mutate_field( functionDecl, &ast::FunctionDecl::scopeLevel, scopeLevel );
    126                 } else {
    127                         return functionDecl;
    128126                }
     127                return mutDecl ? mutDecl : functionDecl;
    129128        }
    130129
    131130        void previsit( const ast::CompoundStmt * ) {
    132                 scopeLevel += 1;
    133         }
    134 
    135         void postvisit( const ast::CompoundStmt * ) {
    136                 scopeLevel -= 1;
     131                GuardValue( scopeLevel ) += 1;
    137132        }
    138133};
  • src/CodeGen/FixNames.h

    r6726a3a rd677355  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // FixNames.h -- Adjustments to typed declarations.
     7// FixNames.h --
    88//
    99// Author           : Richard C. Bilson
     
    2626        /// mangles object and function names
    2727        void fixNames( std::list< Declaration* > & translationUnit );
    28 /// Sets scope levels and fills in main's default return.
    29 void fixNames( ast::TranslationUnit & translationUnit );
     28        void fixNames( ast::TranslationUnit & translationUnit );
    3029} // namespace CodeGen
    3130
  • src/Concurrency/Keywords.h

    r6726a3a rd677355  
    2828        void implementThreadStarter( std::list< Declaration * > & translationUnit );
    2929
    30 /// Implement the sue-like keywords and the suspend keyword. Pre-Autogen
     30/// Implement the sue-like keywords and the suspend keyword.
    3131void implementKeywords( ast::TranslationUnit & translationUnit );
    32 /// Implement the mutex parameters and mutex statement. Post-Autogen
     32/// Implement the mutex parameters and mutex statement.
    3333void implementMutex( ast::TranslationUnit & translationUnit );
    34 /// Add the thread starter code to constructors. Post-Autogen
     34/// Add the thread starter code to constructors.
    3535void implementThreadStarter( ast::TranslationUnit & translationUnit );
    3636};
  • src/ControlStruct/ExceptDecl.cc

    r6726a3a rd677355  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // ExceptDecl.cc -- Handles declarations of exception types.
     7// ExceptDecl.cc --
    88//
    99// Author           : Henry Xue
  • src/ControlStruct/ExceptDecl.h

    r6726a3a rd677355  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // ExceptDecl.h -- Handles declarations of exception types.
     7// ExceptDecl.h --
    88//
    99// Author           : Henry Xue
    1010// Created On       : Tue Jul 20 04:10:50 2021
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Tue Jul 12 15:49:00 2022
    13 // Update Count     : 2
     11// Last Modified By : Henry Xue
     12// Last Modified On : Tue Jul 20 04:10:50 2021
     13// Update Count     : 1
    1414//
    1515
     
    2020class Declaration;
    2121
    22 namespace ast {
    23         class TranslationUnit;
     22namespace ControlStruct {
     23        void translateExcept( std::list< Declaration *> & translationUnit );
    2424}
    25 
    26 namespace ControlStruct {
    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 );
    31 }
  • src/ControlStruct/HoistControlDecls.hpp

    r6726a3a rd677355  
    2121
    2222namespace ControlStruct {
    23 /// Hoist declarations out of control flow statements into compound statement.
    24 /// Must happen before auto-gen routines are added.
     23// Hoist declarations out of control flow statements into compound statement.
    2524void hoistControlDecls( ast::TranslationUnit & translationUnit );
    2625} // namespace ControlStruct
  • src/ControlStruct/MultiLevelExit.cpp

    r6726a3a rd677355  
    149149};
    150150
    151 NullStmt * labelledNullStmt( const CodeLocation & cl, const Label & label ) {
     151NullStmt * labelledNullStmt(
     152        const CodeLocation & cl, const Label & label ) {
    152153        return new NullStmt( cl, vector<Label>{ label } );
    153154}
     
    163164
    164165const CompoundStmt * MultiLevelExitCore::previsit(
    165                 const CompoundStmt * stmt ) {
     166        const CompoundStmt * stmt ) {
    166167        visit_children = false;
    167168
     
    188189}
    189190
    190 size_t getUnusedIndex( const Stmt * stmt, const Label & originalTarget ) {
     191size_t getUnusedIndex(
     192        const Stmt * stmt, const Label & originalTarget ) {
    191193        const size_t size = stmt->labels.size();
    192194
     
    208210}
    209211
    210 const Stmt * addUnused( const Stmt * stmt, const Label & originalTarget ) {
     212const Stmt * addUnused(
     213        const Stmt * stmt, const Label & originalTarget ) {
    211214        size_t i = getUnusedIndex( stmt, originalTarget );
    212215        if ( i == stmt->labels.size() ) {
     
    353356
    354357// Mimic what the built-in push_front would do anyways. It is O(n).
    355 void push_front( vector<ptr<Stmt>> & vec, const Stmt * element ) {
     358void push_front(
     359        vector<ptr<Stmt>> & vec, const Stmt * element ) {
    356360        vec.emplace_back( nullptr );
    357361        for ( size_t i = vec.size() - 1 ; 0 < i ; --i ) {
     
    586590
    587591                ptr<Stmt> else_stmt = nullptr;
    588                 const Stmt * loop_kid = nullptr;
     592                Stmt * loop_kid = nullptr;
    589593                // check if loop node and if so add else clause if it exists
    590                 const WhileDoStmt * whilePtr = kid.as<WhileDoStmt>();
    591                 if ( whilePtr && whilePtr->else_ ) {
     594                const WhileDoStmt * whilePtr = dynamic_cast<const WhileDoStmt *>(kid.get());
     595                if ( whilePtr && whilePtr->else_) {
    592596                        else_stmt = whilePtr->else_;
    593                         loop_kid = mutate_field( whilePtr, &WhileDoStmt::else_, nullptr );
    594                 }
    595                 const ForStmt * forPtr = kid.as<ForStmt>();
    596                 if ( forPtr && forPtr->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_) {
    597603                        else_stmt = forPtr->else_;
    598                         loop_kid = mutate_field( forPtr, &ForStmt::else_, nullptr );
     604                        ForStmt * mutate_ptr = mutate(forPtr);
     605                        mutate_ptr->else_ = nullptr;
     606                        loop_kid = mutate_ptr;
    599607                }
    600608
  • src/ControlStruct/module.mk

    r6726a3a rd677355  
    1717SRC += \
    1818        ControlStruct/ExceptDecl.cc \
    19         ControlStruct/ExceptDeclNew.cpp \
    2019        ControlStruct/ExceptDecl.h \
    2120        ControlStruct/ExceptTranslateNew.cpp \
  • src/InitTweak/GenInit.cc

    r6726a3a rd677355  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // GenInit.cc -- Generate initializers, and other stuff.
     7// GenInit.cc --
    88//
    99// Author           : Rob Schluntz
  • src/InitTweak/GenInit.h

    r6726a3a rd677355  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // GenInit.h -- Generate initializers, and other stuff.
     7// GenInit.h --
    88//
    99// Author           : Rodolfo G. Esteves
     
    2929        void genInit( ast::TranslationUnit & translationUnit );
    3030
    31         /// Converts return statements into copy constructor calls on the hidden return variable.
    32         /// This pass must happen before auto-gen.
     31        /// Converts return statements into copy constructor calls on the hidden return variable
    3332        void fixReturnStatements( std::list< Declaration * > & translationUnit );
    3433        void fixReturnStatements( ast::TranslationUnit & translationUnit );
  • src/Tuples/Tuples.cc

    r6726a3a rd677355  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // Tuples.cc -- A collection of tuple operations.
     7// Tuples.h --
    88//
    99// Author           : Andrew Beach
  • src/Tuples/Tuples.h

    r6726a3a rd677355  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // Tuples.h -- A collection of tuple operations.
     7// Tuples.h --
    88//
    99// Author           : Rodolfo G. Esteves
  • src/Validate/Autogen.hpp

    r6726a3a rd677355  
    2222namespace Validate {
    2323
    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.
    2624void autogenerateRoutines( ast::TranslationUnit & translationUnit );
    2725
  • src/Validate/CompoundLiteral.hpp

    r6726a3a rd677355  
    2323
    2424/// Use variables to implement compound literals.
    25 /// Must happen after auto-gen routines are added.
    2625void handleCompoundLiterals( ast::TranslationUnit & translationUnit );
    2726
  • src/Validate/EnumAndPointerDecay.cpp

    r6726a3a rd677355  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // EnumAndPointerDecay.cpp -- Normalizes enumerations and types in functions.
     7// EnumAndPointerDecay.cpp --
    88//
    99// Author           : Andrew Beach
  • src/Validate/EnumAndPointerDecay.hpp

    r6726a3a rd677355  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // EnumAndPointerDecay.hpp -- Normalizes enumerations and types in functions.
     7// EnumAndPointerDecay.hpp --
    88//
    99// Author           : Andrew Beach
     
    2222namespace Validate {
    2323
    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.
    2724void decayEnumsAndPointers( ast::TranslationUnit & translationUnit );
    2825
  • src/Validate/FindSpecialDecls.h

    r6726a3a rd677355  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // FindSpecialDeclarations.h -- Find special declarations used in the compiler.
     7// FindSpecialDeclarations.h --
    88//
    99// Author           : Rob Schluntz
     
    4343        void findSpecialDecls( std::list< Declaration * > & translationUnit );
    4444
    45 /// Find and remember some of the special declarations that are useful for
     45/// find and remember some of the special declarations that are useful for
    4646/// generating code, so that they do not have to be discovered multiple times.
    4747void findGlobalDecls( ast::TranslationUnit & translationUnit );
  • src/Validate/FixQualifiedTypes.cpp

    r6726a3a rd677355  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // FixQualifiedTypes.cpp -- Replace the qualified type with a direct type.
     7// FixQualifiedTypes.cpp --
    88//
    99// Author           : Andrew Beach
     
    7676                                                        ret->qualifiers = type->qualifiers;
    7777                                                        ast::TypeSubstitution sub( aggr->params, instp->params );
     78                                                        // = parent->genericSubstitution();
    7879                                                        auto result = sub.apply(ret);
    7980                                                        return result.node.release();
  • src/Validate/FixQualifiedTypes.hpp

    r6726a3a rd677355  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // FixQualifiedTypes.hpp -- Replace the qualified type with a direct type.
     7// FixQualifiedTypes.hpp --
    88//
    99// Author           : Andrew Beach
     
    2222namespace Validate {
    2323
    24 /// Replaces qualified types with an unqualified NamedTypeDecl.
    25 /// Must happen after Link References To Types,
    26 /// because aggregate members are accessed.
    2724void fixQualifiedTypes( ast::TranslationUnit & translationUnit );
    2825
  • src/Validate/FixReturnTypes.cpp

    r6726a3a rd677355  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // FixReturnTypes.cpp -- Unifies the representation of return types.
     7// FixReturnTypes.cpp --
    88//
    99// Author           : Andrew Beach
  • src/Validate/FixReturnTypes.hpp

    r6726a3a rd677355  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // FixReturnTypes.hpp -- Unifies the representation of return types.
     7// FixReturnTypes.hpp --
    88//
    99// Author           : Andrew Beach
     
    2222namespace Validate {
    2323
    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.
     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.
    2726void fixReturnTypes( ast::TranslationUnit & translationUnit );
    2827
  • src/Validate/ForallPointerDecay.hpp

    r6726a3a rd677355  
    2929/// Also checks that operator names are used properly on functions and
    3030/// 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.
    3431void decayForallPointers( ast::TranslationUnit & transUnit );
    3532
  • src/Validate/GenericParameter.cpp

    r6726a3a rd677355  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // GenericParameter.hpp -- Generic parameter related passes.
     7// GenericParameter.hpp --
    88//
    99// Author           : Andrew Beach
  • src/Validate/GenericParameter.hpp

    r6726a3a rd677355  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // GenericParameter.hpp -- Generic parameter related passes.
     7// GenericParameter.hpp --
    88//
    99// Author           : Andrew Beach
     
    2323
    2424/// 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.
    2725void fillGenericParameters( ast::TranslationUnit & translationUnit );
    2826
  • src/Validate/HoistStruct.hpp

    r6726a3a rd677355  
    2222namespace Validate {
    2323
    24 /// Flattens nested type declarations. (Run right after Fix Qualified Types.)
     24/// Flattens nested type declarations.
    2525void hoistStruct( ast::TranslationUnit & translationUnit );
    2626
  • src/Validate/HoistTypeDecls.cpp

    r6726a3a rd677355  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // HoistTypeDecls.cpp -- Hoists declarations of implicitly declared types.
     7// HoistTypeDecls.cpp --
    88//
    99// Author           : Andrew Beach
  • src/Validate/HoistTypeDecls.hpp

    r6726a3a rd677355  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // HoistTypeDecls.hpp -- Hoists declarations of implicitly declared types.
     7// HoistTypeDecls.hpp --
    88//
    99// Author           : Andrew Beach
     
    2222namespace Validate {
    2323
    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.
    2724void hoistTypeDecls( ast::TranslationUnit & translationUnit );
    2825
  • src/Validate/LabelAddressFixer.cpp

    r6726a3a rd677355  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // LabelAddressFixer.cpp -- Create label address expressions.
     7// LabelAddressFixer.cpp --
    88//
    99// Author           : Andrew Beach
  • src/Validate/LabelAddressFixer.hpp

    r6726a3a rd677355  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // LabelAddressFixer.hpp -- Create label address expressions.
     7// LabelAddressFixer.hpp --
    88//
    99// Author           : Andrew Beach
     
    2020namespace Validate {
    2121
    22 /// Label addresses are not actually created in the parser, this pass finds
    23 /// the patterns that represent the label address expression.
    2422void fixLabelAddresses( ast::TranslationUnit & translationUnit );
    2523
  • src/Validate/LinkReferenceToTypes.hpp

    r6726a3a rd677355  
    2222namespace Validate {
    2323
    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.
    2724void linkReferenceToTypes( ast::TranslationUnit & translationUnit );
    2825
  • src/Validate/ReplaceTypedef.cpp

    r6726a3a rd677355  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // ReplaceTypedef.cpp -- Fill in all typedefs with the underlying type.
     7// ReplaceTypedef.cpp --
    88//
    99// Author           : Andrew Beach
  • src/Validate/ReplaceTypedef.hpp

    r6726a3a rd677355  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // ReplaceTypedef.hpp -- Fill in all typedefs with the underlying type.
     7// ReplaceTypedef.hpp --
    88//
    99// Author           : Andrew Beach
     
    2222namespace Validate {
    2323
    24 /// Uses of typedef are replaced with the type in the typedef.
    2524void replaceTypedef( ast::TranslationUnit & translationUnit );
    2625
  • src/Validate/VerifyCtorDtorAssign.cpp

    r6726a3a rd677355  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // VerifyCtorDtorAssign.cpp -- Check the form of operators.
     7// VerifyCtorDtorAssign.cpp --
    88//
    99// Author           : Andrew Beach
  • src/Validate/VerifyCtorDtorAssign.hpp

    r6726a3a rd677355  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // VerifyCtorDtorAssign.hpp -- Check the form of operators.
     7// VerifyCtorDtorAssign.hpp --
    88//
    99// Author           : Andrew Beach
     
    2222namespace Validate {
    2323
    24 /// Check that constructors, destructors and assignments all have the correct
    25 /// form. Must happen before auto-gen or anything that examines operators.
    2624void verifyCtorDtorAssign( ast::TranslationUnit & translationUnit );
    2725
  • src/Virtual/Tables.h

    r6726a3a rd677355  
    1919#include "AST/Fwd.hpp"
    2020class Declaration;
     21class StructDecl;
    2122class Expression;
    22 class FunctionDecl;
    23 class Initializer;
    24 class ObjectDecl;
    25 class StructDecl;
    26 class StructInstType;
    27 class Type;
    2823
    2924namespace Virtual {
  • src/main.cc

    r6726a3a rd677355  
    1010// Created On       : Fri May 15 23:12:02 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Mon Jul 18 11:08:00 2022
    13 // Update Count     : 676
     12// Last Modified On : Tue Jul 12 12:02:00 2022
     13// Update Count     : 675
    1414//
    1515
     
    330330                Stats::Time::StopBlock();
    331331
     332                PASS( "Translate Exception Declarations", ControlStruct::translateExcept( translationUnit ) );
     333                if ( exdeclp ) {
     334                        dump( translationUnit );
     335                        return EXIT_SUCCESS;
     336                } // if
     337
     338                CodeTools::fillLocations( translationUnit );
     339
    332340                if( useNewAST ) {
     341                        CodeTools::fillLocations( translationUnit );
     342
    333343                        if (Stats::Counters::enabled) {
    334344                                ast::pass_visitor_stats.avg = Stats::Counters::build<Stats::Counters::AverageCounter<double>>("Average Depth - New");
     
    339349                        forceFillCodeLocations( transUnit );
    340350
    341                         PASS( "Translate Exception Declarations", ControlStruct::translateExcept( transUnit ) );
    342                         if ( exdeclp ) {
    343                                 dump( move( transUnit ) );
    344                                 return EXIT_SUCCESS;
    345                         }
    346 
     351                        // Must happen before auto-gen, or anything that examines ops.
    347352                        PASS( "Verify Ctor, Dtor & Assign", Validate::verifyCtorDtorAssign( transUnit ) );
     353
    348354                        PASS( "Hoist Type Decls", Validate::hoistTypeDecls( transUnit ) );
    349355                        // Hoist Type Decls pulls some declarations out of contexts where
     
    353359
    354360                        PASS( "Replace Typedefs", Validate::replaceTypedef( transUnit ) );
     361
     362                        // Must happen before auto-gen.
    355363                        PASS( "Fix Return Types", Validate::fixReturnTypes( transUnit ) );
     364
     365                        // Must happen before Link Reference to Types, it needs correct
     366                        // types for mangling.
    356367                        PASS( "Enum and Pointer Decay", Validate::decayEnumsAndPointers( transUnit ) );
    357368
     369                        // Must happen before auto-gen, because it uses the sized flag.
    358370                        PASS( "Link Reference To Types", Validate::linkReferenceToTypes( transUnit ) );
    359371
     372                        // Must happen after Link References To Types,
     373                        // because aggregate members are accessed.
    360374                        PASS( "Fix Qualified Types", Validate::fixQualifiedTypes( transUnit ) );
     375
    361376                        PASS( "Hoist Struct", Validate::hoistStruct( transUnit ) );
    362377                        PASS( "Eliminate Typedef", Validate::eliminateTypedef( transUnit ) );
     378
     379                        // Check as early as possible. Can't happen before
     380                        // LinkReferenceToType, observed failing when attempted
     381                        // before eliminateTypedef
    363382                        PASS( "Validate Generic Parameters", Validate::fillGenericParameters( transUnit ) );
     383
    364384                        PASS( "Translate Dimensions", Validate::translateDimensionParameters( transUnit ) );
    365385                        PASS( "Check Function Returns", Validate::checkReturnStatements( transUnit ) );
     386
     387                        // Must happen before Autogen.
    366388                        PASS( "Fix Return Statements", InitTweak::fixReturnStatements( transUnit ) );
     389
    367390                        PASS( "Implement Concurrent Keywords", Concurrency::implementKeywords( transUnit ) );
     391
     392                        // Must be after implement concurrent keywords; because uniqueIds
     393                        //   must be set on declaration before resolution.
     394                        // Must happen before autogen routines are added.
    368395                        PASS( "Forall Pointer Decay", Validate::decayForallPointers( transUnit ) );
     396
     397                        // Must happen before autogen routines are added.
    369398                        PASS( "Hoist Control Declarations", ControlStruct::hoistControlDecls( transUnit ) );
    370399
     400                        // Must be after enum and pointer decay.
     401                        // Must be before compound literals.
    371402                        PASS( "Generate Autogen Routines", Validate::autogenerateRoutines( transUnit ) );
    372403
     
    442473                        translationUnit = convert( move( transUnit ) );
    443474                } else {
    444                         PASS( "Translate Exception Declarations", ControlStruct::translateExcept( translationUnit ) );
    445                         if ( exdeclp ) {
    446                                 dump( translationUnit );
    447                                 return EXIT_SUCCESS;
    448                         } // if
    449 
    450475                        // add the assignment statement after the initialization of a type parameter
    451476                        PASS( "Validate", SymTab::validate( translationUnit ) );
Note: See TracChangeset for help on using the changeset viewer.