Changeset 22bc276
- Timestamp:
- Sep 21, 2017, 3:23:33 PM (7 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 05807e9, 29bc63e
- Parents:
- e4d6335
- git-author:
- Rob Schluntz <rschlunt@…> (09/21/17 15:19:47)
- git-committer:
- Rob Schluntz <rschlunt@…> (09/21/17 15:23:33)
- Location:
- src
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
re4d6335 r22bc276 443 443 void CodeGenerator::postvisit( UntypedExpr * untypedExpr ) { 444 444 extension( untypedExpr ); 445 if ( NameExpr * nameExpr = dynamic_cast< NameExpr* >( untypedExpr-> get_function()) ) {445 if ( NameExpr * nameExpr = dynamic_cast< NameExpr* >( untypedExpr->function ) ) { 446 446 OperatorInfo opInfo; 447 if ( operatorLookup( nameExpr-> get_name(), opInfo ) ) {448 std::list< Expression* >::iterator arg = untypedExpr-> get_args().begin();447 if ( operatorLookup( nameExpr->name, opInfo ) ) { 448 std::list< Expression* >::iterator arg = untypedExpr->args.begin(); 449 449 switch ( opInfo.type ) { 450 450 case OT_INDEX: 451 assert( untypedExpr-> get_args().size() == 2 );451 assert( untypedExpr->args.size() == 2 ); 452 452 (*arg++)->accept( *visitor ); 453 453 output << "["; … … 461 461 case OT_CTOR: 462 462 case OT_DTOR: 463 if ( untypedExpr-> get_args().size() == 1 ) {463 if ( untypedExpr->args.size() == 1 ) { 464 464 // the expression fed into a single parameter constructor or destructor may contain side 465 465 // effects, so must still output this expression … … 480 480 (*arg++)->accept( *visitor ); 481 481 output << opInfo.symbol << "{ "; 482 genCommaList( arg, untypedExpr-> get_args().end() );482 genCommaList( arg, untypedExpr->args.end() ); 483 483 output << "}) /* " << opInfo.inputName << " */"; 484 484 } // if … … 488 488 case OT_PREFIXASSIGN: 489 489 case OT_LABELADDRESS: 490 assert( untypedExpr-> get_args().size() == 1 );490 assert( untypedExpr->args.size() == 1 ); 491 491 output << "("; 492 492 output << opInfo.symbol; … … 497 497 case OT_POSTFIX: 498 498 case OT_POSTFIXASSIGN: 499 assert( untypedExpr-> get_args().size() == 1 );499 assert( untypedExpr->args.size() == 1 ); 500 500 (*arg)->accept( *visitor ); 501 501 output << opInfo.symbol; … … 504 504 case OT_INFIX: 505 505 case OT_INFIXASSIGN: 506 assert( untypedExpr-> get_args().size() == 2 );506 assert( untypedExpr->args.size() == 2 ); 507 507 output << "("; 508 508 (*arg++)->accept( *visitor ); … … 517 517 } // switch 518 518 } else { 519 if ( nameExpr->get_name() == "..." ) { // case V1 ... V2 or case V1~V2 520 assert( untypedExpr->get_args().size() == 2 ); 521 (*untypedExpr->get_args().begin())->accept( *visitor ); 522 output << " ... "; 523 (*--untypedExpr->get_args().end())->accept( *visitor ); 524 } else { // builtin routines 525 nameExpr->accept( *visitor ); 526 output << "("; 527 genCommaList( untypedExpr->get_args().begin(), untypedExpr->get_args().end() ); 528 output << ")"; 529 } // if 519 // builtin routines 520 nameExpr->accept( *visitor ); 521 output << "("; 522 genCommaList( untypedExpr->args.begin(), untypedExpr->args.end() ); 523 output << ")"; 530 524 } // if 531 525 } else { 532 untypedExpr-> get_function()->accept( *visitor );526 untypedExpr->function->accept( *visitor ); 533 527 output << "("; 534 genCommaList( untypedExpr-> get_args().begin(), untypedExpr->get_args().end() );528 genCommaList( untypedExpr->args.begin(), untypedExpr->args.end() ); 535 529 output << ")"; 536 530 } // if … … 538 532 539 533 void CodeGenerator::postvisit( RangeExpr * rangeExpr ) { 540 rangeExpr-> get_low()->accept( *visitor );534 rangeExpr->low->accept( *visitor ); 541 535 output << " ... "; 542 rangeExpr-> get_high()->accept( *visitor );536 rangeExpr->high->accept( *visitor ); 543 537 } 544 538 -
src/InitTweak/GenInit.cc
re4d6335 r22bc276 62 62 }; 63 63 64 struct CtorDtor : public WithGuards, public WithShortCircuiting {64 struct CtorDtor : public WithGuards, public WithShortCircuiting, public WithVisitorRef<CtorDtor> { 65 65 /// create constructor and destructor statements for object declarations. 66 66 /// the actual call statements will be added in after the resolver has run … … 75 75 // that need to be constructed or destructed 76 76 void previsit( StructDecl *aggregateDecl ); 77 void previsit( __attribute__((unused)) UnionDecl * aggregateDecl ) { visit_children = false; } 78 void previsit( __attribute__((unused)) EnumDecl * aggregateDecl ) { visit_children = false; } 79 void previsit( __attribute__((unused)) TraitDecl * aggregateDecl ) { visit_children = false; } 80 void previsit( __attribute__((unused)) TypeDecl * typeDecl ) { visit_children = false; } 81 void previsit( __attribute__((unused)) TypedefDecl * typeDecl ) { visit_children = false; } 82 void previsit( __attribute__((unused)) FunctionType * funcType ) { visit_children = false; } 77 void premutate( AggregateDecl * ) { visit_children = false; } 78 void premutate( NamedTypeDecl * ) { visit_children = false; } 79 void previsit( FunctionType * ) { visit_children = false; } 83 80 84 81 void previsit( CompoundStmt * compoundStmt ); … … 96 93 }; 97 94 98 class HoistArrayDimension final : public GenPoly::DeclMutator { 99 public: 100 typedef GenPoly::DeclMutator Parent; 101 95 struct HoistArrayDimension final : public WithDeclsToAdd, public WithShortCircuiting, public WithGuards { 102 96 /// hoist dimension from array types in object declaration so that it uses a single 103 97 /// const variable of type size_t, so that side effecting array dimensions are only … … 105 99 static void hoistArrayDimension( std::list< Declaration * > & translationUnit ); 106 100 107 private: 108 using Parent::mutate; 109 110 virtual DeclarationWithType * mutate( ObjectDecl * objectDecl ) override; 111 virtual DeclarationWithType * mutate( FunctionDecl *functionDecl ) override; 101 void premutate( ObjectDecl * objectDecl ); 102 DeclarationWithType * postmutate( ObjectDecl * objectDecl ); 103 void premutate( FunctionDecl *functionDecl ); 112 104 // should not traverse into any of these declarations to find objects 113 105 // that need to be constructed or destructed 114 virtual Declaration* mutate( StructDecl *aggregateDecl ) override { return aggregateDecl; } 115 virtual Declaration* mutate( UnionDecl *aggregateDecl ) override { return aggregateDecl; } 116 virtual Declaration* mutate( EnumDecl *aggregateDecl ) override { return aggregateDecl; } 117 virtual Declaration* mutate( TraitDecl *aggregateDecl ) override { return aggregateDecl; } 118 virtual TypeDecl* mutate( TypeDecl *typeDecl ) override { return typeDecl; } 119 virtual Declaration* mutate( TypedefDecl *typeDecl ) override { return typeDecl; } 120 121 virtual Type* mutate( FunctionType *funcType ) override { return funcType; } 106 void premutate( AggregateDecl * ) { visit_children = false; } 107 void premutate( NamedTypeDecl * ) { visit_children = false; } 108 void premutate( FunctionType * ) { visit_children = false; } 122 109 123 110 void hoist( Type * type ); … … 143 130 // hands off if the function returns a reference - we don't want to allocate a temporary if a variable's address 144 131 // is being returned 145 if ( returnStmt->get_expr() && returnVals.size() == 1 && ! dynamic_cast< ReferenceType * >( returnVals.front()->get_type() ) ) {132 if ( returnStmt->get_expr() && returnVals.size() == 1 && tryConstruct( returnVals.front() ) ) { 146 133 // explicitly construct the return value using the return expression and the retVal object 147 134 assertf( returnVals.front()->get_name() != "", "Function %s has unnamed return value\n", funcName.c_str() ); … … 158 145 GuardValue( funcName ); 159 146 160 ftype = functionDecl-> get_functionType();161 funcName = functionDecl-> get_name();147 ftype = functionDecl->type; 148 funcName = functionDecl->name; 162 149 } 163 150 … … 165 152 // which would be incorrect if it is a side-effecting computation. 166 153 void HoistArrayDimension::hoistArrayDimension( std::list< Declaration * > & translationUnit ) { 167 HoistArrayDimension hoister; 168 hoister.mutateDeclarationList( translationUnit ); 169 } 170 171 DeclarationWithType * HoistArrayDimension::mutate( ObjectDecl * objectDecl ) { 154 PassVisitor<HoistArrayDimension> hoister; 155 mutateAll( translationUnit, hoister ); 156 } 157 158 void HoistArrayDimension::premutate( ObjectDecl * objectDecl ) { 159 GuardValue( storageClasses ); 172 160 storageClasses = objectDecl->get_storageClasses(); 173 DeclarationWithType * temp = Parent::mutate( objectDecl ); 161 } 162 163 DeclarationWithType * HoistArrayDimension::postmutate( ObjectDecl * objectDecl ) { 174 164 hoist( objectDecl->get_type() ); 175 return temp;165 return objectDecl; 176 166 } 177 167 … … 194 184 195 185 arrayType->set_dimension( new VariableExpr( arrayDimension ) ); 196 addDeclaration( arrayDimension );186 declsToAddBefore.push_back( arrayDimension ); 197 187 198 188 hoist( arrayType->get_base() ); … … 201 191 } 202 192 203 DeclarationWithType * HoistArrayDimension::mutate( FunctionDecl *functionDecl ) { 204 ValueGuard< bool > oldInFunc( inFunction ); 205 inFunction = true; 206 DeclarationWithType * decl = Parent::mutate( functionDecl ); 207 return decl; 193 void HoistArrayDimension::premutate( FunctionDecl * ) { 194 GuardValue( inFunction ); 208 195 } 209 196 … … 214 201 215 202 bool CtorDtor::isManaged( Type * type ) const { 216 // at least for now,references are never constructed203 // references are never constructed 217 204 if ( dynamic_cast< ReferenceType * >( type ) ) return false; 218 205 // need to clear and reset qualifiers when determining if a type is managed … … 221 208 if ( TupleType * tupleType = dynamic_cast< TupleType * > ( type ) ) { 222 209 // tuple is also managed if any of its components are managed 223 if ( std::any_of( tupleType-> get_types().begin(), tupleType->get_types().end(), [&](Type * type) { return isManaged( type ); }) ) {210 if ( std::any_of( tupleType->types.begin(), tupleType->types.end(), [&](Type * type) { return isManaged( type ); }) ) { 224 211 return true; 225 212 } … … 305 292 306 293 void CtorDtor::previsit( FunctionDecl *functionDecl ) { 294 visit_children = false; // do not try and construct parameters or forall parameters 307 295 GuardValue( inFunction ); 308 296 inFunction = true; … … 318 306 } 319 307 320 PassVisitor<CtorDtor> newCtorDtor; 321 newCtorDtor.pass = *this; 322 maybeAccept( functionDecl->get_statements(), newCtorDtor ); 323 visit_children = false; // do not try and construct parameters or forall parameters - must happen after maybeAccept 308 maybeAccept( functionDecl->get_statements(), *visitor ); 324 309 } 325 310 … … 340 325 } 341 326 342 void CtorDtor::previsit( __attribute__((unused)) CompoundStmt * compoundStmt) {327 void CtorDtor::previsit( CompoundStmt * ) { 343 328 GuardScope( managedTypes ); 344 329 } -
src/InitTweak/InitTweak.cc
re4d6335 r22bc276 1 #include <stddef.h> // for NULL2 1 #include <algorithm> // for find, all_of 3 2 #include <cassert> // for assertf, assert, strict_dynamic_cast … … 184 183 callExpr->get_args().splice( callExpr->get_args().end(), args ); 185 184 186 *out++ = new IfStmt( noLabels, cond, new ExprStmt( noLabels, callExpr ), NULL);185 *out++ = new IfStmt( noLabels, cond, new ExprStmt( noLabels, callExpr ), nullptr ); 187 186 188 187 UntypedExpr * increment = new UntypedExpr( new NameExpr( "++?" ) ); … … 250 249 // To accomplish this, generate switch statement, consuming all of expander's elements 251 250 Statement * InitImpl::buildListInit( UntypedExpr * dst, std::list< Expression * > & indices ) { 252 if ( ! init ) return NULL;251 if ( ! init ) return nullptr; 253 252 CompoundStmt * block = new CompoundStmt( noLabels ); 254 253 build( dst, indices.begin(), indices.end(), init, back_inserter( block->get_kids() ) ); 255 254 if ( block->get_kids().empty() ) { 256 255 delete block; 257 return NULL;256 return nullptr; 258 257 } else { 259 init = NULL; // init was consumed in creating the list init258 init = nullptr; // init was consumed in creating the list init 260 259 return block; 261 260 } 262 261 } 263 262 264 Statement * ExprImpl::buildListInit( __attribute((unused)) UntypedExpr * dst, __attribute((unused)) std::list< Expression * > & indices) {265 return NULL;263 Statement * ExprImpl::buildListInit( UntypedExpr *, std::list< Expression * > & ) { 264 return nullptr; 266 265 } 267 266 … … 270 269 } 271 270 272 bool tryConstruct( ObjectDecl * objDecl ) { 271 bool tryConstruct( DeclarationWithType * dwt ) { 272 ObjectDecl * objDecl = dynamic_cast< ObjectDecl * >( dwt ); 273 if ( ! objDecl ) return false; 273 274 return ! LinkageSpec::isBuiltin( objDecl->get_linkage() ) && 274 (objDecl->get_init() == NULL || 275 ( objDecl->get_init() != NULL && objDecl->get_init()->get_maybeConstructed() )) 276 && ! objDecl->get_storageClasses().is_extern; 275 (objDecl->get_init() == nullptr || 276 ( objDecl->get_init() != nullptr && objDecl->get_init()->get_maybeConstructed() )) 277 && ! objDecl->get_storageClasses().is_extern 278 && ! dynamic_cast< ReferenceType * >( objDecl->type ); 277 279 } 278 280 … … 314 316 collectCtorDtorCalls( stmt, matches ); 315 317 assert( matches.size() <= 1 ); 316 return matches.size() == 1 ? matches.front() : NULL;318 return matches.size() == 1 ? matches.front() : nullptr; 317 319 } 318 320 … … 359 361 ApplicationExpr * isIntrinsicCallExpr( Expression * expr ) { 360 362 ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( expr ); 361 if ( ! appExpr ) return NULL;363 if ( ! appExpr ) return nullptr; 362 364 DeclarationWithType * function = getCalledFunction( appExpr->get_function() ); 363 365 assertf( function, "getCalledFunction returned nullptr: %s", toString( appExpr->get_function() ).c_str() ); 364 366 // check for Intrinsic only - don't want to remove all overridable ctor/dtors because autogenerated ctor/dtor 365 367 // will call all member dtors, and some members may have a user defined dtor. 366 return function->get_linkage() == LinkageSpec::Intrinsic ? appExpr : NULL;368 return function->get_linkage() == LinkageSpec::Intrinsic ? appExpr : nullptr; 367 369 } 368 370 … … 482 484 return refType->get_base(); 483 485 } else { 484 return NULL;486 return nullptr; 485 487 } 486 488 } … … 488 490 Type * isPointerType( Type * type ) { 489 491 if ( getPointerBase( type ) ) return type; 490 else return NULL;492 else return nullptr; 491 493 } 492 494 -
src/InitTweak/InitTweak.h
re4d6335 r22bc276 33 33 std::list< Expression * > makeInitList( Initializer * init ); 34 34 35 /// True if the resolver should try to construct objDecl36 bool tryConstruct( ObjectDecl * objDecl);35 /// True if the resolver should try to construct dwt 36 bool tryConstruct( DeclarationWithType * dwt ); 37 37 38 38 /// True if the Initializer contains designations
Note: See TracChangeset
for help on using the changeset viewer.