Ignore:
Timestamp:
Jan 7, 2021, 3:27:00 PM (5 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
2b4daf2, 64aeca0
Parents:
3c64c668 (diff), eef8dfb (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' into park_unpark

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Specialize.cc

    r3c64c668 r58fe85a  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 23:40:49 2019
    13 // Update Count     : 32
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Thr Jul  2 17:42:00 2020
     13// Update Count     : 33
    1414//
    1515
     
    4242
    4343namespace GenPoly {
    44         struct Specialize final : public WithConstTypeSubstitution, public WithStmtsToAdd, public WithVisitorRef<Specialize> {
     44        struct Specialize final : public WithConstTypeSubstitution,
     45                        public WithDeclsToAdd, public WithVisitorRef<Specialize> {
    4546                Expression * postmutate( ApplicationExpr *applicationExpr );
    4647                Expression * postmutate( CastExpr *castExpr );
     
    217218                thunkFunc->get_attributes().push_back( new Attribute( "unused" ) );
    218219
     220                // Thunks at the global level must be static to avoid collisions between files.
     221                // (Conversly thunks inside a function must be unique and not static.)
     222                thunkFunc->storageClasses.is_static = !isInFunction();
     223
    219224                // thread thunk parameters into call to actual function, naming thunk parameters as we go
    220225                UniqueName paramNamer( paramPrefix );
     
    248253                } // if
    249254
    250                 // handle any specializations that may still be present
    251                 std::string oldParamPrefix = paramPrefix;
    252                 paramPrefix += "p";
    253                 // save stmtsToAddBefore in oldStmts
    254                 std::list< Statement* > oldStmts;
    255                 oldStmts.splice( oldStmts.end(), stmtsToAddBefore );
    256                 appExpr->acceptMutator( *visitor );
    257                 paramPrefix = oldParamPrefix;
    258                 // write any statements added for recursive specializations into the thunk body
    259                 thunkFunc->statements->kids.splice( thunkFunc->statements->kids.end(), stmtsToAddBefore );
    260                 // restore oldStmts into stmtsToAddBefore
    261                 stmtsToAddBefore.splice( stmtsToAddBefore.end(), oldStmts );
     255                // Handle any specializations that may still be present.
     256                {
     257                        std::string oldParamPrefix = paramPrefix;
     258                        paramPrefix += "p";
     259                        std::list< Declaration * > oldDecls;
     260                        oldDecls.splice( oldDecls.end(), declsToAddBefore );
     261
     262                        appExpr->acceptMutator( *visitor );
     263                        // Write recursive specializations into the thunk body.
     264                        for ( Declaration * decl : declsToAddBefore ) {
     265                                thunkFunc->statements->kids.push_back( new DeclStmt( decl ) );
     266                        }
     267
     268                        declsToAddBefore = std::move( oldDecls );
     269                        paramPrefix = oldParamPrefix;
     270                }
    262271
    263272                // add return (or valueless expression) to the thunk
     
    270279                thunkFunc->statements->kids.push_back( appStmt );
    271280
    272                 // add thunk definition to queue of statements to add
    273                 stmtsToAddBefore.push_back( new DeclStmt( thunkFunc ) );
     281                // Add the thunk definition (converted to DeclStmt if appproprate).
     282                declsToAddBefore.push_back( thunkFunc );
    274283                // return address of thunk function as replacement expression
    275284                return new AddressExpr( new VariableExpr( thunkFunc ) );
Note: See TracChangeset for help on using the changeset viewer.