Changeset 5809461 for src/SymTab
- Timestamp:
- Sep 1, 2017, 6:59:48 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:
- b0dfbc4
- Parents:
- bc3127d
- Location:
- src/SymTab
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Indexer.cc
rbc3127d r5809461 398 398 void Indexer::visit( LabelAddressExpr *labAddressExpr ) { 399 399 acceptNewScope( labAddressExpr->get_result(), *this ); 400 maybeAccept( labAddressExpr->get_arg(), *this );401 400 } 402 401 -
src/SymTab/Validate.cc
rbc3127d r5809461 244 244 }; 245 245 246 struct LabelAddressFixer final : public WithGuards { 247 std::set< Label > labels; 248 249 void premutate( FunctionDecl * funcDecl ); 250 Expression * postmutate( AddressExpr * addrExpr ); 251 }; 246 252 247 253 FunctionDecl * dereferenceOperator = nullptr; … … 257 263 PassVisitor<ValidateGenericParameters> genericParams; 258 264 PassVisitor<FindSpecialDeclarations> finder; 265 PassVisitor<LabelAddressFixer> labelAddrFixer; 259 266 260 267 EliminateTypedef::eliminateTypedef( translationUnit ); … … 274 281 ArrayLength::computeLength( translationUnit ); 275 282 acceptAll( translationUnit, finder ); 283 mutateAll( translationUnit, labelAddrFixer ); 276 284 } 277 285 … … 977 985 } 978 986 987 struct LabelFinder { 988 std::set< Label > & labels; 989 LabelFinder( std::set< Label > & labels ) : labels( labels ) {} 990 void previsit( Statement * stmt ) { 991 for ( Label & l : stmt->labels ) { 992 labels.insert( l ); 993 } 994 } 995 }; 996 997 void LabelAddressFixer::premutate( FunctionDecl * funcDecl ) { 998 GuardValue( labels ); 999 PassVisitor<LabelFinder> finder( labels ); 1000 funcDecl->accept( finder ); 1001 } 1002 1003 Expression * LabelAddressFixer::postmutate( AddressExpr * addrExpr ) { 1004 // convert &&label into label address 1005 if ( AddressExpr * inner = dynamic_cast< AddressExpr * >( addrExpr->arg ) ) { 1006 if ( NameExpr * nameExpr = dynamic_cast< NameExpr * >( inner->arg ) ) { 1007 if ( labels.count( nameExpr->name ) ) { 1008 Label name = nameExpr->name; 1009 delete addrExpr; 1010 return new LabelAddressExpr( name ); 1011 } 1012 } 1013 } 1014 return addrExpr; 1015 } 1016 979 1017 void FindSpecialDeclarations::previsit( FunctionDecl * funcDecl ) { 980 1018 if ( ! dereferenceOperator ) {
Note: See TracChangeset
for help on using the changeset viewer.