Changes in src/GenPoly/Box.cc [e3e16bc:eada3cf]
- File:
-
- 1 edited
-
src/GenPoly/Box.cc (modified) (24 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/Box.cc
re3e16bc reada3cf 27 27 28 28 #include "CodeGen/OperatorTable.h" 29 #include "Common/PassVisitor.h" // for PassVisitor 29 30 #include "Common/ScopedMap.h" // for ScopedMap, ScopedMap<>::iter... 30 31 #include "Common/SemanticError.h" // for SemanticError … … 157 158 /// * Calculates polymorphic offsetof expressions from offset array 158 159 /// * Inserts dynamic calculation of polymorphic type layouts where needed 159 class PolyGenericCalculator final : public PolyMutator{160 class PolyGenericCalculator final : public WithGuards, public WithVisitorRef<PolyGenericCalculator>, public WithStmtsToAdd, public WithDeclsToAdd, public WithTypeSubstitution { 160 161 public: 161 typedef PolyMutator Parent;162 using Parent::mutate;163 164 162 PolyGenericCalculator(); 165 163 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; 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(); 183 180 184 181 private: … … 194 191 /// Exits the type-variable scope 195 192 void endTypeScope(); 193 /// Enters a new scope for knowLayouts and knownOffsets and queues exit calls 194 void beginGenericScope(); 196 195 197 196 ScopedSet< std::string > knownLayouts; ///< Set of generic type layouts known in the current scope, indexed by sizeofName 198 197 ScopedSet< std::string > knownOffsets; ///< Set of non-generic types for which the offset array exists in the current scope, indexed by offsetofName 199 198 UniqueName bufNamer; ///< Namer for VLA buffers 199 TyVarMap scopeTyVars; 200 200 }; 201 201 … … 250 250 Pass1 pass1; 251 251 Pass2 pass2; 252 P olyGenericCalculatorpolyCalculator;252 PassVisitor<PolyGenericCalculator> polyCalculator; 253 253 Pass3 pass3; 254 254 … … 256 256 mutateTranslationUnit/*All*/( translationUnit, pass1 ); 257 257 mutateTranslationUnit/*All*/( translationUnit, pass2 ); 258 mutate TranslationUnit/*All*/( translationUnit, polyCalculator );258 mutateAll( translationUnit, polyCalculator ); 259 259 mutateTranslationUnit/*All*/( translationUnit, pass3 ); 260 260 } … … 555 555 TypeDecl *Pass1::mutate( TypeDecl *typeDecl ) { 556 556 addToTyVarMap( typeDecl, scopeTyVars ); 557 return Mutator::mutate( typeDecl);557 return dynamic_cast<TypeDecl*>( Mutator::mutate( typeDecl ) ); 558 558 } 559 559 … … 628 628 } else { 629 629 // xxx - should this be an assertion? 630 std::string x = env ? toString( *env ) : "missing env"; 631 throw SemanticError( x + "\n" + "unbound type variable: " + tyParm->first + " in application ", appExpr ); 630 throw SemanticError( toString( *env, "\nunbound type variable: ", tyParm->first, " in application " ), appExpr ); 632 631 } // if 633 632 } // if … … 706 705 if ( concrete == 0 ) { 707 706 return typeInst; 708 // xxx - should this be an assertion?709 // std::string x = env ? toString( *env ) : "missing env";710 // throw SemanticError( x + "\n" + "Unbound type variable " + typeInst->get_name() + " in ", appExpr );711 707 } // if 712 708 return concrete; … … 762 758 } else if ( arg->get_result()->get_lvalue() ) { 763 759 // argument expression may be CFA lvalue, but not C lvalue -- apply generalizedLvalue transformations. 760 // if ( VariableExpr * varExpr = dynamic_cast< VariableExpr * >( arg ) ) { 761 // if ( dynamic_cast<ArrayType *>( varExpr->var->get_type() ) ){ 762 // // temporary hack - don't box arrays, because &arr is not the same as &arr[0] 763 // return; 764 // } 765 // } 764 766 arg = generalizedLvalue( new AddressExpr( arg ) ); 765 767 if ( ! ResolvExpr::typesCompatible( param, arg->get_result(), SymTab::Indexer() ) ) { … … 1353 1355 return handleDecl( typeDecl ); 1354 1356 } else { 1355 return Parent::mutate( typeDecl);1357 return dynamic_cast<TypeDecl*>( Parent::mutate( typeDecl ) ); 1356 1358 } 1357 1359 } … … 1466 1468 1467 1469 PolyGenericCalculator::PolyGenericCalculator() 1468 : Parent(), knownLayouts(), knownOffsets(), bufNamer( "_buf") {}1470 : knownLayouts(), knownOffsets(), bufNamer( "_buf" ), scopeTyVars( TypeDecl::Data{} ) {} 1469 1471 1470 1472 void PolyGenericCalculator::beginTypeScope( Type *ty ) { 1471 scopeTyVars.beginScope();1473 GuardScope( scopeTyVars ); 1472 1474 makeTyVarMap( ty, scopeTyVars ); 1473 1475 } 1474 1476 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 ) { 1477 void PolyGenericCalculator::beginGenericScope() { 1478 GuardScope( *this ); 1479 } 1480 1481 void PolyGenericCalculator::premutate( ObjectDecl *objectDecl ) { 1482 beginTypeScope( objectDecl->get_type() ); 1483 } 1484 1485 void PolyGenericCalculator::premutate( FunctionDecl *functionDecl ) { 1486 beginGenericScope(); 1487 1488 beginTypeScope( functionDecl->get_functionType() ); 1489 } 1490 1491 void PolyGenericCalculator::premutate( TypedefDecl *typedefDecl ) { 1492 beginTypeScope( typedefDecl->get_base() ); 1493 } 1494 1495 void PolyGenericCalculator::premutate( TypeDecl * typeDecl ) { 1512 1496 addToTyVarMap( typeDecl, scopeTyVars ); 1513 return Parent::mutate( typeDecl ); 1514 } 1515 1516 Type * PolyGenericCalculator::mutate( PointerType *pointerType ) { 1497 } 1498 1499 Declaration * PolyGenericCalculator::postmutate( TypeDecl *typeDecl ) { 1500 if ( Type * base = typeDecl->base ) { 1501 // add size/align variables for opaque type declarations 1502 TypeInstType inst( Type::Qualifiers(), typeDecl->name, typeDecl ); 1503 std::string typeName = mangleType( &inst ); 1504 Type *layoutType = new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ); 1505 1506 ObjectDecl * sizeDecl = ObjectDecl::newObject( sizeofName( typeName ), layoutType, new SingleInit( new SizeofExpr( base->clone() ) ) ); 1507 ObjectDecl * alignDecl = ObjectDecl::newObject( alignofName( typeName ), layoutType->clone(), new SingleInit( new AlignofExpr( base->clone() ) ) ); 1508 1509 // ensure that the initializing sizeof/alignof exprs are properly mutated 1510 sizeDecl->acceptMutator( *visitor ); 1511 alignDecl->acceptMutator( *visitor ); 1512 1513 // can't use makeVar, because it inserts into stmtsToAdd and TypeDecls can occur at global scope 1514 declsToAddAfter.push_back( alignDecl ); 1515 // replace with sizeDecl 1516 return sizeDecl; 1517 } 1518 return typeDecl; 1519 } 1520 1521 void PolyGenericCalculator::premutate( PointerType *pointerType ) { 1517 1522 beginTypeScope( pointerType ); 1518 1519 Type *ret = Parent::mutate( pointerType ); 1520 1521 endTypeScope(); 1522 return ret; 1523 } 1524 1525 Type * PolyGenericCalculator::mutate( FunctionType *funcType ) { 1523 } 1524 1525 void PolyGenericCalculator::premutate( FunctionType *funcType ) { 1526 1526 beginTypeScope( funcType ); 1527 1527 … … 1534 1534 } 1535 1535 } 1536 1537 Type *ret = Parent::mutate( funcType ); 1538 1539 endTypeScope(); 1540 return ret; 1541 } 1542 1543 Statement *PolyGenericCalculator::mutate( DeclStmt *declStmt ) { 1536 } 1537 1538 void PolyGenericCalculator::premutate( DeclStmt *declStmt ) { 1544 1539 if ( ObjectDecl *objectDecl = dynamic_cast< ObjectDecl *>( declStmt->get_decl() ) ) { 1545 1540 if ( findGeneric( objectDecl->get_type() ) ) { … … 1550 1545 new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::Kind::Char), new NameExpr( sizeofName( mangleType(declType) ) ), 1551 1546 true, false, std::list<Attribute*>{ new Attribute( "aligned", std::list<Expression*>{ new ConstantExpr( Constant::from_int(8) ) } ) } ), 0 ); 1552 stmtsToAdd .push_back( new DeclStmt( noLabels, newBuf ) );1547 stmtsToAddBefore.push_back( new DeclStmt( noLabels, newBuf ) ); 1553 1548 1554 1549 delete objectDecl->get_init(); … … 1556 1551 } 1557 1552 } 1558 return Parent::mutate( declStmt );1559 1553 } 1560 1554 … … 1583 1577 } 1584 1578 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 1579 Expression *PolyGenericCalculator::postmutate( MemberExpr *memberExpr ) { 1591 1580 // only mutate member expressions for polymorphic types 1592 1581 int tyDepth; … … 1635 1624 ObjectDecl *PolyGenericCalculator::makeVar( const std::string &name, Type *type, Initializer *init ) { 1636 1625 ObjectDecl *newObj = new ObjectDecl( name, Type::StorageClasses(), LinkageSpec::C, 0, type, init ); 1637 stmtsToAdd .push_back( new DeclStmt( noLabels, newObj ) );1626 stmtsToAddBefore.push_back( new DeclStmt( noLabels, newObj ) ); 1638 1627 return newObj; 1639 1628 } … … 1714 1703 addOtypeParamsToLayoutCall( layoutCall, otypeParams ); 1715 1704 1716 stmtsToAdd .push_back( new ExprStmt( noLabels, layoutCall ) );1705 stmtsToAddBefore.push_back( new ExprStmt( noLabels, layoutCall ) ); 1717 1706 } 1718 1707 … … 1740 1729 addOtypeParamsToLayoutCall( layoutCall, otypeParams ); 1741 1730 1742 stmtsToAdd .push_back( new ExprStmt( noLabels, layoutCall ) );1731 stmtsToAddBefore.push_back( new ExprStmt( noLabels, layoutCall ) ); 1743 1732 1744 1733 return true; … … 1748 1737 } 1749 1738 1750 Expression *PolyGenericCalculator:: mutate( SizeofExpr *sizeofExpr ) {1739 Expression *PolyGenericCalculator::postmutate( SizeofExpr *sizeofExpr ) { 1751 1740 Type *ty = sizeofExpr->get_isType() ? sizeofExpr->get_type() : sizeofExpr->get_expr()->get_result(); 1752 1741 if ( findGeneric( ty ) ) { … … 1758 1747 } 1759 1748 1760 Expression *PolyGenericCalculator:: mutate( AlignofExpr *alignofExpr ) {1749 Expression *PolyGenericCalculator::postmutate( AlignofExpr *alignofExpr ) { 1761 1750 Type *ty = alignofExpr->get_isType() ? alignofExpr->get_type() : alignofExpr->get_expr()->get_result(); 1762 1751 if ( findGeneric( ty ) ) { … … 1768 1757 } 1769 1758 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 1759 Expression *PolyGenericCalculator::postmutate( OffsetofExpr *offsetofExpr ) { 1776 1760 // only mutate expressions for polymorphic structs/unions 1777 1761 Type *ty = offsetofExpr->get_type(); … … 1793 1777 } 1794 1778 1795 Expression *PolyGenericCalculator:: mutate( OffsetPackExpr *offsetPackExpr ) {1779 Expression *PolyGenericCalculator::postmutate( OffsetPackExpr *offsetPackExpr ) { 1796 1780 StructInstType *ty = offsetPackExpr->get_type(); 1797 1781 … … 1832 1816 } 1833 1817 1834 void PolyGenericCalculator:: doBeginScope() {1818 void PolyGenericCalculator::beginScope() { 1835 1819 knownLayouts.beginScope(); 1836 1820 knownOffsets.beginScope(); 1837 1821 } 1838 1822 1839 void PolyGenericCalculator:: doEndScope() {1823 void PolyGenericCalculator::endScope() { 1840 1824 knownLayouts.endScope(); 1841 1825 knownOffsets.endScope(); … … 1894 1878 1895 1879 addToTyVarMap( typeDecl, scopeTyVars ); 1896 return Mutator::mutate( typeDecl);1880 return dynamic_cast<TypeDecl*>( Mutator::mutate( typeDecl ) ); 1897 1881 } 1898 1882
Note:
See TracChangeset
for help on using the changeset viewer.