Changeset a0c7dc36
- Timestamp:
- Sep 12, 2017, 5:14:32 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:
- 70d826cd
- Parents:
- 96f9ef5
- Location:
- src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
r96f9ef5 ra0c7dc36 258 258 259 259 void CodeGenerator::visit( TraitDecl * traitDecl ) { 260 assertf( ! genC, "TraitDecl nodes should not reach code generation." );260 assertf( ! genC, "TraitDecls should not reach code generation." ); 261 261 extension( traitDecl ); 262 262 handleAggregate( traitDecl, "trait " ); … … 271 271 272 272 void CodeGenerator::visit( TypeDecl * typeDecl ) { 273 if ( genC ) { 274 // really, we should mutate this into something that isn't a TypeDecl but that requires large-scale changes, 275 // still to be done 276 extension( typeDecl ); 277 output << "extern unsigned long " << typeDecl->get_name(); 278 if ( typeDecl->get_base() ) { 279 output << " = sizeof( " << genType( typeDecl->get_base(), "", pretty, genC ) << " )"; 280 } // if 281 } else { 282 output << typeDecl->genTypeString() << " " << typeDecl->get_name(); 283 if ( typeDecl->get_kind() != TypeDecl::Any && typeDecl->get_sized() ) { 284 output << " | sized(" << typeDecl->get_name() << ")"; 285 } 286 if ( ! typeDecl->get_assertions().empty() ) { 287 output << " | { "; 288 genCommaList( typeDecl->get_assertions().begin(), typeDecl->get_assertions().end() ); 289 output << " }"; 290 } 273 assertf( ! genC, "TypeDecls should not reach code generation." ); 274 output << typeDecl->genTypeString() << " " << typeDecl->get_name(); 275 if ( typeDecl->get_kind() != TypeDecl::Any && typeDecl->get_sized() ) { 276 output << " | sized(" << typeDecl->get_name() << ")"; 277 } 278 if ( ! typeDecl->get_assertions().empty() ) { 279 output << " | { "; 280 genCommaList( typeDecl->get_assertions().begin(), typeDecl->get_assertions().end() ); 281 output << " }"; 291 282 } 292 283 } -
src/GenPoly/Box.cc
r96f9ef5 ra0c7dc36 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 … … 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 // } 764 770 arg = generalizedLvalue( new AddressExpr( arg ) ); 765 771 if ( ! ResolvExpr::typesCompatible( param, arg->get_result(), SymTab::Indexer() ) ) { … … 1353 1359 return handleDecl( typeDecl ); 1354 1360 } else { 1355 return Parent::mutate( typeDecl);1361 return dynamic_cast<TypeDecl*>( Parent::mutate( typeDecl ) ); 1356 1362 } 1357 1363 } … … 1466 1472 1467 1473 PolyGenericCalculator::PolyGenericCalculator() 1468 : Parent(), knownLayouts(), knownOffsets(), bufNamer( "_buf") {}1474 : knownLayouts(), knownOffsets(), bufNamer( "_buf" ), scopeTyVars( TypeDecl::Data{} ) {} 1469 1475 1470 1476 void PolyGenericCalculator::beginTypeScope( Type *ty ) { 1471 scopeTyVars.beginScope();1477 GuardScope( scopeTyVars ); 1472 1478 makeTyVarMap( ty, scopeTyVars ); 1473 1479 } 1474 1480 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 ) { 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 ) { 1512 1500 addToTyVarMap( typeDecl, scopeTyVars ); 1513 return Parent::mutate( typeDecl ); 1514 } 1515 1516 Type * PolyGenericCalculator::mutate( PointerType *pointerType ) { 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 ) { 1517 1526 beginTypeScope( pointerType ); 1518 1519 Type *ret = Parent::mutate( pointerType ); 1520 1521 endTypeScope(); 1522 return ret; 1523 } 1524 1525 Type * PolyGenericCalculator::mutate( FunctionType *funcType ) { 1527 } 1528 1529 void PolyGenericCalculator::premutate( FunctionType *funcType ) { 1526 1530 beginTypeScope( funcType ); 1527 1531 … … 1534 1538 } 1535 1539 } 1536 1537 Type *ret = Parent::mutate( funcType ); 1538 1539 endTypeScope(); 1540 return ret; 1541 } 1542 1543 Statement *PolyGenericCalculator::mutate( DeclStmt *declStmt ) { 1540 } 1541 1542 void PolyGenericCalculator::premutate( DeclStmt *declStmt ) { 1544 1543 if ( ObjectDecl *objectDecl = dynamic_cast< ObjectDecl *>( declStmt->get_decl() ) ) { 1545 1544 if ( findGeneric( objectDecl->get_type() ) ) { … … 1550 1549 new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::Kind::Char), new NameExpr( sizeofName( mangleType(declType) ) ), 1551 1550 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 ) );1551 stmtsToAddBefore.push_back( new DeclStmt( noLabels, newBuf ) ); 1553 1552 1554 1553 delete objectDecl->get_init(); … … 1556 1555 } 1557 1556 } 1558 return Parent::mutate( declStmt );1559 1557 } 1560 1558 … … 1583 1581 } 1584 1582 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 1583 Expression *PolyGenericCalculator::postmutate( MemberExpr *memberExpr ) { 1591 1584 // only mutate member expressions for polymorphic types 1592 1585 int tyDepth; … … 1635 1628 ObjectDecl *PolyGenericCalculator::makeVar( const std::string &name, Type *type, Initializer *init ) { 1636 1629 ObjectDecl *newObj = new ObjectDecl( name, Type::StorageClasses(), LinkageSpec::C, 0, type, init ); 1637 stmtsToAdd .push_back( new DeclStmt( noLabels, newObj ) );1630 stmtsToAddBefore.push_back( new DeclStmt( noLabels, newObj ) ); 1638 1631 return newObj; 1639 1632 } … … 1714 1707 addOtypeParamsToLayoutCall( layoutCall, otypeParams ); 1715 1708 1716 stmtsToAdd .push_back( new ExprStmt( noLabels, layoutCall ) );1709 stmtsToAddBefore.push_back( new ExprStmt( noLabels, layoutCall ) ); 1717 1710 } 1718 1711 … … 1740 1733 addOtypeParamsToLayoutCall( layoutCall, otypeParams ); 1741 1734 1742 stmtsToAdd .push_back( new ExprStmt( noLabels, layoutCall ) );1735 stmtsToAddBefore.push_back( new ExprStmt( noLabels, layoutCall ) ); 1743 1736 1744 1737 return true; … … 1748 1741 } 1749 1742 1750 Expression *PolyGenericCalculator:: mutate( SizeofExpr *sizeofExpr ) {1743 Expression *PolyGenericCalculator::postmutate( SizeofExpr *sizeofExpr ) { 1751 1744 Type *ty = sizeofExpr->get_isType() ? sizeofExpr->get_type() : sizeofExpr->get_expr()->get_result(); 1752 1745 if ( findGeneric( ty ) ) { … … 1758 1751 } 1759 1752 1760 Expression *PolyGenericCalculator:: mutate( AlignofExpr *alignofExpr ) {1753 Expression *PolyGenericCalculator::postmutate( AlignofExpr *alignofExpr ) { 1761 1754 Type *ty = alignofExpr->get_isType() ? alignofExpr->get_type() : alignofExpr->get_expr()->get_result(); 1762 1755 if ( findGeneric( ty ) ) { … … 1768 1761 } 1769 1762 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 1763 Expression *PolyGenericCalculator::postmutate( OffsetofExpr *offsetofExpr ) { 1776 1764 // only mutate expressions for polymorphic structs/unions 1777 1765 Type *ty = offsetofExpr->get_type(); … … 1793 1781 } 1794 1782 1795 Expression *PolyGenericCalculator:: mutate( OffsetPackExpr *offsetPackExpr ) {1783 Expression *PolyGenericCalculator::postmutate( OffsetPackExpr *offsetPackExpr ) { 1796 1784 StructInstType *ty = offsetPackExpr->get_type(); 1797 1785 … … 1832 1820 } 1833 1821 1834 void PolyGenericCalculator:: doBeginScope() {1822 void PolyGenericCalculator::beginScope() { 1835 1823 knownLayouts.beginScope(); 1836 1824 knownOffsets.beginScope(); 1837 1825 } 1838 1826 1839 void PolyGenericCalculator:: doEndScope() {1827 void PolyGenericCalculator::endScope() { 1840 1828 knownLayouts.endScope(); 1841 1829 knownOffsets.endScope(); … … 1894 1882 1895 1883 addToTyVarMap( typeDecl, scopeTyVars ); 1896 return Mutator::mutate( typeDecl);1884 return dynamic_cast<TypeDecl*>( Mutator::mutate( typeDecl ) ); 1897 1885 } 1898 1886
Note: See TracChangeset
for help on using the changeset viewer.