Changeset 0d70e0d


Ignore:
Timestamp:
May 28, 2019, 3:35:00 PM (3 years ago)
Author:
Andrew Beach <ajbeach@…>
Branches:
arm-eh, cleanup-dtors, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr
Children:
eba615c
Parents:
2c04369
Message:

I'll be fixing this fix a different way.

Location:
src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Lvalue.cc

    r2c04369 r0d70e0d  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Tue May 28 11:07:00 2019
    13 // Update Count     : 6
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Mar 17 09:11:18 2017
     13// Update Count     : 5
    1414//
    1515
     
    4242namespace GenPoly {
    4343        namespace {
    44                 /// Local helper for pass visitors that need to add reference operations.
    45                 struct WithDerefOp {
    46                         FunctionDecl * dereferenceOperator = nullptr;
    47 
    48                         // TODO: fold this into the general createDeref function??
    49                         Expression * mkDeref( Expression * arg ) {
    50                                 if ( dereferenceOperator ) {
    51                                         // note: reference depth can be arbitrarily deep here, so peel off the
    52                                         // outermost pointer/reference, not just pointer because they are effecitvely
    53                                         // equivalent in this pass
    54                                         VariableExpr * deref = new VariableExpr( dereferenceOperator );
    55                                         deref->result = new PointerType( Type::Qualifiers(), deref->result );
    56                                         Type * base = InitTweak::getPointerBase( arg->result );
    57                                         assertf( base, "expected pointer type in dereference (type was %s)",
    58                                                 toString( arg->result ).c_str() );
    59                                         ApplicationExpr * ret = new ApplicationExpr( deref, { arg } );
    60                                         delete ret->result;
    61                                         ret->result = base->clone();
    62                                         ret->result->set_lvalue( true );
    63                                         return ret;
    64                                 } else {
    65                                         return UntypedExpr::createDeref( arg );
    66                                 }
    67                         }
    68 
    69                         void previsit( FunctionDecl * funcDecl ) {
    70                                 if ( dereferenceOperator ) return;
    71                                 if ( funcDecl->get_name() != "*?" ) return;
    72                                 if ( funcDecl->get_linkage() == LinkageSpec::Intrinsic ) return;
    73                                 FunctionType * ftype = funcDecl->get_functionType();
    74                                 if ( ftype->get_parameters().size() != 1 ) return;
    75                                 DeclarationWithType * arg0 = ftype->get_parameters().front();
    76                                 if ( arg0->get_type()->get_qualifiers() == Type::Qualifiers() ) return;
    77                                 dereferenceOperator = funcDecl;
    78                         }
    79                 };
    80 
    81                 struct ReferenceConversions final : public WithStmtsToAdd, public WithDerefOp {
     44                // TODO: fold this into the general createDeref function??
     45                Expression * mkDeref( Expression * arg ) {
     46                        if ( SymTab::dereferenceOperator ) {
     47                                // note: reference depth can be arbitrarily deep here, so peel off the outermost pointer/reference, not just pointer because they are effecitvely equivalent in this pass
     48                                VariableExpr * deref = new VariableExpr( SymTab::dereferenceOperator );
     49                                deref->result = new PointerType( Type::Qualifiers(), deref->result );
     50                                Type * base = InitTweak::getPointerBase( arg->result );
     51                                assertf( base, "expected pointer type in dereference (type was %s)", toString( arg->result ).c_str() );
     52                                ApplicationExpr * ret = new ApplicationExpr( deref, { arg } );
     53                                delete ret->result;
     54                                ret->result = base->clone();
     55                                ret->result->set_lvalue( true );
     56                                return ret;
     57                        } else {
     58                                return UntypedExpr::createDeref( arg );
     59                        }
     60                }
     61
     62                struct ReferenceConversions final : public WithStmtsToAdd {
    8263                        Expression * postmutate( CastExpr * castExpr );
    8364                        Expression * postmutate( AddressExpr * addrExpr );
     
    8566
    8667                /// Intrinsic functions that take reference parameters don't REALLY take reference parameters -- their reference arguments must always be implicitly dereferenced.
    87                 struct FixIntrinsicArgs final : public WithDerefOp {
     68                struct FixIntrinsicArgs final {
    8869                        Expression * postmutate( ApplicationExpr * appExpr );
    8970                };
     
    11798                };
    11899
    119                 struct AddrRef final : public WithGuards, public WithVisitorRef<AddrRef>,
    120                                 public WithShortCircuiting, public WithDerefOp {
     100                struct AddrRef final : public WithGuards, public WithVisitorRef<AddrRef>, public WithShortCircuiting {
    121101                        void premutate( AddressExpr * addrExpr );
    122102                        Expression * postmutate( AddressExpr * addrExpr );
  • src/SymTab/Autogen.h

    r2c04369 r0d70e0d  
    99// Author           : Rob Schluntz
    1010// Created On       : Sun May 17 21:53:34 2015
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Tue May 28 11:04:00 2019
    13 // Update Count     : 16
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:50:25 2017
     13// Update Count     : 15
    1414//
    1515
     
    4040        /// such as in determining array dimension type
    4141        extern Type * SizeType;
     42
     43        /// intrinsic dereference operator for unqualified types - set when *? function is seen in FindSpecialDeclarations.
     44        /// Useful for creating dereference ApplicationExprs without a full resolver pass.
     45        extern FunctionDecl * dereferenceOperator;
    4246
    4347        // generate the type of an assignment function for paramType
  • src/SymTab/Validate.cc

    r2c04369 r0d70e0d  
    99// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 21:50:04 2015
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Tue May 28 11:07:00 2019
    13 // Update Count     : 360
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Mon Aug 28 13:47:23 2017
     13// Update Count     : 359
    1414//
    1515
     
    288288        };
    289289
     290        FunctionDecl * dereferenceOperator = nullptr;
     291        struct FindSpecialDeclarations final {
     292                void previsit( FunctionDecl * funcDecl );
     293        };
     294
    290295        void validate( std::list< Declaration * > &translationUnit, __attribute__((unused)) bool doDebug ) {
    291296                PassVisitor<EnumAndPointerDecay> epc;
     
    294299                PassVisitor<CompoundLiteral> compoundliteral;
    295300                PassVisitor<ValidateGenericParameters> genericParams;
     301                PassVisitor<FindSpecialDeclarations> finder;
    296302                PassVisitor<LabelAddressFixer> labelAddrFixer;
    297303                PassVisitor<HoistTypeDecls> hoistDecls;
     
    370376                        Stats::Time::TimeBlock("Array Length", [&]() {
    371377                                ArrayLength::computeLength( translationUnit );
     378                        });
     379                        Stats::Time::TimeBlock("Find Special Declarations", [&]() {
     380                                acceptAll( translationUnit, finder ); // xxx - remove this pass soon
    372381                        });
    373382                        Stats::Time::TimeBlock("Fix Label Address", [&]() {
     
    13631372                return addrExpr;
    13641373        }
     1374
     1375        void FindSpecialDeclarations::previsit( FunctionDecl * funcDecl ) {
     1376                if ( ! dereferenceOperator ) {
     1377                        if ( funcDecl->get_name() == "*?" && funcDecl->get_linkage() == LinkageSpec::Intrinsic ) {
     1378                                FunctionType * ftype = funcDecl->get_functionType();
     1379                                if ( ftype->get_parameters().size() == 1 && ftype->get_parameters().front()->get_type()->get_qualifiers() == Type::Qualifiers() ) {
     1380                                        dereferenceOperator = funcDecl;
     1381                                }
     1382                        }
     1383                }
     1384        }
    13651385} // namespace SymTab
    13661386
Note: See TracChangeset for help on using the changeset viewer.