Changes in src/GenPoly/Box.cc [a0c7dc36:bc3127d]
- File:
-
- 1 edited
-
src/GenPoly/Box.cc (modified) (22 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/Box.cc
ra0c7dc36 rbc3127d 27 27 28 28 #include "CodeGen/OperatorTable.h" 29 #include "Common/PassVisitor.h" // for PassVisitor30 29 #include "Common/ScopedMap.h" // for ScopedMap, ScopedMap<>::iter... 31 30 #include "Common/SemanticError.h" // for SemanticError … … 158 157 /// * Calculates polymorphic offsetof expressions from offset array 159 158 /// * Inserts dynamic calculation of polymorphic type layouts where needed 160 class PolyGenericCalculator final : public WithGuards, public WithVisitorRef<PolyGenericCalculator>, public WithStmtsToAdd, public WithDeclsToAdd, public WithTypeSubstitution{159 class PolyGenericCalculator final : public PolyMutator { 161 160 public: 161 typedef PolyMutator Parent; 162 using Parent::mutate; 163 162 164 PolyGenericCalculator(); 163 165 164 void premutate( ObjectDecl *objectDecl ); 165 void premutate( FunctionDecl *functionDecl ); 166 void premutate( TypedefDecl *objectDecl ); 167 void premutate( TypeDecl *objectDecl ); 168 Declaration * postmutate( TypeDecl *TraitDecl ); 169 void premutate( PointerType *pointerType ); 170 void premutate( FunctionType *funcType ); 171 void premutate( DeclStmt *declStmt ); 172 Expression *postmutate( MemberExpr *memberExpr ); 173 Expression *postmutate( SizeofExpr *sizeofExpr ); 174 Expression *postmutate( AlignofExpr *alignofExpr ); 175 Expression *postmutate( OffsetofExpr *offsetofExpr ); 176 Expression *postmutate( OffsetPackExpr *offsetPackExpr ); 177 178 void beginScope(); 179 void endScope(); 166 template< typename DeclClass > 167 DeclClass *handleDecl( DeclClass *decl, Type *type ); 168 virtual DeclarationWithType *mutate( FunctionDecl *functionDecl ) override; 169 virtual ObjectDecl *mutate( ObjectDecl *objectDecl ) override; 170 virtual TypedefDecl *mutate( TypedefDecl *objectDecl ) override; 171 virtual TypeDecl *mutate( TypeDecl *objectDecl ) override; 172 virtual Statement *mutate( DeclStmt *declStmt ) override; 173 virtual Type *mutate( PointerType *pointerType ) override; 174 virtual Type *mutate( FunctionType *funcType ) override; 175 virtual Expression *mutate( MemberExpr *memberExpr ) override; 176 virtual Expression *mutate( SizeofExpr *sizeofExpr ) override; 177 virtual Expression *mutate( AlignofExpr *alignofExpr ) override; 178 virtual Expression *mutate( OffsetofExpr *offsetofExpr ) override; 179 virtual Expression *mutate( OffsetPackExpr *offsetPackExpr ) override; 180 181 virtual void doBeginScope() override; 182 virtual void doEndScope() override; 180 183 181 184 private: … … 191 194 /// Exits the type-variable scope 192 195 void endTypeScope(); 193 /// Enters a new scope for knowLayouts and knownOffsets and queues exit calls194 void beginGenericScope();195 196 196 197 ScopedSet< std::string > knownLayouts; ///< Set of generic type layouts known in the current scope, indexed by sizeofName 197 198 ScopedSet< std::string > knownOffsets; ///< Set of non-generic types for which the offset array exists in the current scope, indexed by offsetofName 198 199 UniqueName bufNamer; ///< Namer for VLA buffers 199 TyVarMap scopeTyVars;200 200 }; 201 201 … … 250 250 Pass1 pass1; 251 251 Pass2 pass2; 252 P assVisitor<PolyGenericCalculator>polyCalculator;252 PolyGenericCalculator polyCalculator; 253 253 Pass3 pass3; 254 254 … … 256 256 mutateTranslationUnit/*All*/( translationUnit, pass1 ); 257 257 mutateTranslationUnit/*All*/( translationUnit, pass2 ); 258 mutate All( translationUnit, polyCalculator );258 mutateTranslationUnit/*All*/( translationUnit, polyCalculator ); 259 259 mutateTranslationUnit/*All*/( translationUnit, pass3 ); 260 260 } … … 555 555 TypeDecl *Pass1::mutate( TypeDecl *typeDecl ) { 556 556 addToTyVarMap( typeDecl, scopeTyVars ); 557 return dynamic_cast<TypeDecl*>( Mutator::mutate( typeDecl ));557 return Mutator::mutate( typeDecl ); 558 558 } 559 559 … … 762 762 } else if ( arg->get_result()->get_lvalue() ) { 763 763 // argument expression may be CFA lvalue, but not C lvalue -- apply generalizedLvalue transformations. 764 // if ( VariableExpr * varExpr = dynamic_cast< VariableExpr * >( arg ) ) {765 // if ( dynamic_cast<ArrayType *>( varExpr->var->get_type() ) ){766 // // temporary hack - don't box arrays, because &arr is not the same as &arr[0]767 // return;768 // }769 // }770 764 arg = generalizedLvalue( new AddressExpr( arg ) ); 771 765 if ( ! ResolvExpr::typesCompatible( param, arg->get_result(), SymTab::Indexer() ) ) { … … 1359 1353 return handleDecl( typeDecl ); 1360 1354 } else { 1361 return dynamic_cast<TypeDecl*>( Parent::mutate( typeDecl ));1355 return Parent::mutate( typeDecl ); 1362 1356 } 1363 1357 } … … 1472 1466 1473 1467 PolyGenericCalculator::PolyGenericCalculator() 1474 : knownLayouts(), knownOffsets(), bufNamer( "_buf" ), scopeTyVars( TypeDecl::Data{}) {}1468 : Parent(), knownLayouts(), knownOffsets(), bufNamer( "_buf" ) {} 1475 1469 1476 1470 void PolyGenericCalculator::beginTypeScope( Type *ty ) { 1477 GuardScope( scopeTyVars);1471 scopeTyVars.beginScope(); 1478 1472 makeTyVarMap( ty, scopeTyVars ); 1479 1473 } 1480 1474 1481 void PolyGenericCalculator::beginGenericScope() { 1482 GuardScope( *this ); 1483 } 1484 1485 void PolyGenericCalculator::premutate( ObjectDecl *objectDecl ) { 1486 beginTypeScope( objectDecl->get_type() ); 1487 } 1488 1489 void PolyGenericCalculator::premutate( FunctionDecl *functionDecl ) { 1490 beginGenericScope(); 1491 1492 beginTypeScope( functionDecl->get_functionType() ); 1493 } 1494 1495 void PolyGenericCalculator::premutate( TypedefDecl *typedefDecl ) { 1496 beginTypeScope( typedefDecl->get_base() ); 1497 } 1498 1499 void PolyGenericCalculator::premutate( TypeDecl * typeDecl ) { 1475 void PolyGenericCalculator::endTypeScope() { 1476 scopeTyVars.endScope(); 1477 } 1478 1479 template< typename DeclClass > 1480 DeclClass * PolyGenericCalculator::handleDecl( DeclClass *decl, Type *type ) { 1481 beginTypeScope( type ); 1482 // knownLayouts.beginScope(); 1483 // knownOffsets.beginScope(); 1484 1485 DeclClass *ret = static_cast< DeclClass *>( Parent::mutate( decl ) ); 1486 1487 // knownOffsets.endScope(); 1488 // knownLayouts.endScope(); 1489 endTypeScope(); 1490 return ret; 1491 } 1492 1493 ObjectDecl * PolyGenericCalculator::mutate( ObjectDecl *objectDecl ) { 1494 return handleDecl( objectDecl, objectDecl->get_type() ); 1495 } 1496 1497 DeclarationWithType * PolyGenericCalculator::mutate( FunctionDecl *functionDecl ) { 1498 knownLayouts.beginScope(); 1499 knownOffsets.beginScope(); 1500 1501 DeclarationWithType * decl = handleDecl( functionDecl, functionDecl->get_functionType() ); 1502 knownOffsets.endScope(); 1503 knownLayouts.endScope(); 1504 return decl; 1505 } 1506 1507 TypedefDecl * PolyGenericCalculator::mutate( TypedefDecl *typedefDecl ) { 1508 return handleDecl( typedefDecl, typedefDecl->get_base() ); 1509 } 1510 1511 TypeDecl * PolyGenericCalculator::mutate( TypeDecl *typeDecl ) { 1500 1512 addToTyVarMap( typeDecl, scopeTyVars ); 1501 } 1502 1503 Declaration * PolyGenericCalculator::postmutate( TypeDecl *typeDecl ) { 1504 if ( Type * base = typeDecl->base ) { 1505 // add size/align variables for opaque type declarations 1506 TypeInstType inst( Type::Qualifiers(), typeDecl->name, typeDecl ); 1507 std::string typeName = mangleType( &inst ); 1508 Type *layoutType = new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ); 1509 1510 ObjectDecl * sizeDecl = ObjectDecl::newObject( sizeofName( typeName ), layoutType, new SingleInit( new SizeofExpr( base->clone() ) ) ); 1511 ObjectDecl * alignDecl = ObjectDecl::newObject( alignofName( typeName ), layoutType->clone(), new SingleInit( new AlignofExpr( base->clone() ) ) ); 1512 1513 // ensure that the initializing sizeof/alignof exprs are properly mutated 1514 sizeDecl->acceptMutator( *visitor ); 1515 alignDecl->acceptMutator( *visitor ); 1516 1517 // can't use makeVar, because it inserts into stmtsToAdd and TypeDecls can occur at global scope 1518 declsToAddAfter.push_back( alignDecl ); 1519 // replace with sizeDecl 1520 return sizeDecl; 1521 } 1522 return typeDecl; 1523 } 1524 1525 void PolyGenericCalculator::premutate( PointerType *pointerType ) { 1513 return Parent::mutate( typeDecl ); 1514 } 1515 1516 Type * PolyGenericCalculator::mutate( PointerType *pointerType ) { 1526 1517 beginTypeScope( pointerType ); 1527 } 1528 1529 void PolyGenericCalculator::premutate( FunctionType *funcType ) { 1518 1519 Type *ret = Parent::mutate( pointerType ); 1520 1521 endTypeScope(); 1522 return ret; 1523 } 1524 1525 Type * PolyGenericCalculator::mutate( FunctionType *funcType ) { 1530 1526 beginTypeScope( funcType ); 1531 1527 … … 1538 1534 } 1539 1535 } 1540 } 1541 1542 void PolyGenericCalculator::premutate( DeclStmt *declStmt ) { 1536 1537 Type *ret = Parent::mutate( funcType ); 1538 1539 endTypeScope(); 1540 return ret; 1541 } 1542 1543 Statement *PolyGenericCalculator::mutate( DeclStmt *declStmt ) { 1543 1544 if ( ObjectDecl *objectDecl = dynamic_cast< ObjectDecl *>( declStmt->get_decl() ) ) { 1544 1545 if ( findGeneric( objectDecl->get_type() ) ) { … … 1549 1550 new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::Kind::Char), new NameExpr( sizeofName( mangleType(declType) ) ), 1550 1551 true, false, std::list<Attribute*>{ new Attribute( "aligned", std::list<Expression*>{ new ConstantExpr( Constant::from_int(8) ) } ) } ), 0 ); 1551 stmtsToAdd Before.push_back( new DeclStmt( noLabels, newBuf ) );1552 stmtsToAdd.push_back( new DeclStmt( noLabels, newBuf ) ); 1552 1553 1553 1554 delete objectDecl->get_init(); … … 1555 1556 } 1556 1557 } 1558 return Parent::mutate( declStmt ); 1557 1559 } 1558 1560 … … 1581 1583 } 1582 1584 1583 Expression *PolyGenericCalculator::postmutate( MemberExpr *memberExpr ) { 1585 Expression *PolyGenericCalculator::mutate( MemberExpr *memberExpr ) { 1586 // mutate, exiting early if no longer MemberExpr 1587 Expression *expr = Parent::mutate( memberExpr ); 1588 memberExpr = dynamic_cast< MemberExpr* >( expr ); 1589 if ( ! memberExpr ) return expr; 1590 1584 1591 // only mutate member expressions for polymorphic types 1585 1592 int tyDepth; … … 1628 1635 ObjectDecl *PolyGenericCalculator::makeVar( const std::string &name, Type *type, Initializer *init ) { 1629 1636 ObjectDecl *newObj = new ObjectDecl( name, Type::StorageClasses(), LinkageSpec::C, 0, type, init ); 1630 stmtsToAdd Before.push_back( new DeclStmt( noLabels, newObj ) );1637 stmtsToAdd.push_back( new DeclStmt( noLabels, newObj ) ); 1631 1638 return newObj; 1632 1639 } … … 1707 1714 addOtypeParamsToLayoutCall( layoutCall, otypeParams ); 1708 1715 1709 stmtsToAdd Before.push_back( new ExprStmt( noLabels, layoutCall ) );1716 stmtsToAdd.push_back( new ExprStmt( noLabels, layoutCall ) ); 1710 1717 } 1711 1718 … … 1733 1740 addOtypeParamsToLayoutCall( layoutCall, otypeParams ); 1734 1741 1735 stmtsToAdd Before.push_back( new ExprStmt( noLabels, layoutCall ) );1742 stmtsToAdd.push_back( new ExprStmt( noLabels, layoutCall ) ); 1736 1743 1737 1744 return true; … … 1741 1748 } 1742 1749 1743 Expression *PolyGenericCalculator:: postmutate( SizeofExpr *sizeofExpr ) {1750 Expression *PolyGenericCalculator::mutate( SizeofExpr *sizeofExpr ) { 1744 1751 Type *ty = sizeofExpr->get_isType() ? sizeofExpr->get_type() : sizeofExpr->get_expr()->get_result(); 1745 1752 if ( findGeneric( ty ) ) { … … 1751 1758 } 1752 1759 1753 Expression *PolyGenericCalculator:: postmutate( AlignofExpr *alignofExpr ) {1760 Expression *PolyGenericCalculator::mutate( AlignofExpr *alignofExpr ) { 1754 1761 Type *ty = alignofExpr->get_isType() ? alignofExpr->get_type() : alignofExpr->get_expr()->get_result(); 1755 1762 if ( findGeneric( ty ) ) { … … 1761 1768 } 1762 1769 1763 Expression *PolyGenericCalculator::postmutate( OffsetofExpr *offsetofExpr ) { 1770 Expression *PolyGenericCalculator::mutate( OffsetofExpr *offsetofExpr ) { 1771 // mutate, exiting early if no longer OffsetofExpr 1772 Expression *expr = Parent::mutate( offsetofExpr ); 1773 offsetofExpr = dynamic_cast< OffsetofExpr* >( expr ); 1774 if ( ! offsetofExpr ) return expr; 1775 1764 1776 // only mutate expressions for polymorphic structs/unions 1765 1777 Type *ty = offsetofExpr->get_type(); … … 1781 1793 } 1782 1794 1783 Expression *PolyGenericCalculator:: postmutate( OffsetPackExpr *offsetPackExpr ) {1795 Expression *PolyGenericCalculator::mutate( OffsetPackExpr *offsetPackExpr ) { 1784 1796 StructInstType *ty = offsetPackExpr->get_type(); 1785 1797 … … 1820 1832 } 1821 1833 1822 void PolyGenericCalculator:: beginScope() {1834 void PolyGenericCalculator::doBeginScope() { 1823 1835 knownLayouts.beginScope(); 1824 1836 knownOffsets.beginScope(); 1825 1837 } 1826 1838 1827 void PolyGenericCalculator:: endScope() {1839 void PolyGenericCalculator::doEndScope() { 1828 1840 knownLayouts.endScope(); 1829 1841 knownOffsets.endScope(); … … 1882 1894 1883 1895 addToTyVarMap( typeDecl, scopeTyVars ); 1884 return dynamic_cast<TypeDecl*>( Mutator::mutate( typeDecl ));1896 return Mutator::mutate( typeDecl ); 1885 1897 } 1886 1898
Note:
See TracChangeset
for help on using the changeset viewer.