Changeset adc6781 for src/GenPoly
- Timestamp:
- Apr 8, 2016, 2:43:20 PM (9 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, string, with_gc
- Children:
- 63c0dbf
- Parents:
- 224e52f
- Location:
- src/GenPoly
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/Box.cc
r224e52f radc6781 385 385 for ( std::list< TypeDecl* >::const_iterator param = otypeParams.begin(); param != otypeParams.end(); ++param ) { 386 386 TypeInstType paramType( Type::Qualifiers(), (*param)->get_name(), *param ); 387 layoutFnType->get_parameters().push_back( new ObjectDecl( sizeofName( ¶mType ), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, sizeAlignType.clone(), 0 ) ); 388 layoutFnType->get_parameters().push_back( new ObjectDecl( alignofName( ¶mType ), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, sizeAlignType.clone(), 0 ) ); 387 std::string paramName = mangleType( ¶mType ); 388 layoutFnType->get_parameters().push_back( new ObjectDecl( sizeofName( paramName ), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, sizeAlignType.clone(), 0 ) ); 389 layoutFnType->get_parameters().push_back( new ObjectDecl( alignofName( paramName ), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, sizeAlignType.clone(), 0 ) ); 389 390 } 390 391 } 391 392 392 393 /// Builds a layout function declaration 393 FunctionDecl *buildLayoutFunctionDecl( const std::string &typeName, unsigned int functionNesting, FunctionType *layoutFnType ) {394 FunctionDecl *buildLayoutFunctionDecl( AggregateDecl *typeDecl, unsigned int functionNesting, FunctionType *layoutFnType ) { 394 395 // Routines at global scope marked "static" to prevent multiple definitions is separate translation units 395 396 // because each unit generates copies of the default routines for each aggregate. 396 397 FunctionDecl *layoutDecl = new FunctionDecl( 397 "__layoutof_" + typeName, functionNesting > 0 ? DeclarationNode::NoStorageClass : DeclarationNode::Static, LinkageSpec::AutoGen, layoutFnType, new CompoundStmt( noLabels ), true, false );398 layoutofName( typeDecl ), functionNesting > 0 ? DeclarationNode::NoStorageClass : DeclarationNode::Static, LinkageSpec::AutoGen, layoutFnType, new CompoundStmt( noLabels ), true, false ); 398 399 layoutDecl->fixUniqueId(); 399 400 return layoutDecl; … … 462 463 PointerType *sizeAlignOutType = new PointerType( Type::Qualifiers(), sizeAlignType ); 463 464 464 ObjectDecl *sizeParam = new ObjectDecl( "__sizeof_" + structDecl->get_name(), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, sizeAlignOutType, 0 );465 ObjectDecl *sizeParam = new ObjectDecl( sizeofName( structDecl->get_name() ), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, sizeAlignOutType, 0 ); 465 466 layoutFnType->get_parameters().push_back( sizeParam ); 466 ObjectDecl *alignParam = new ObjectDecl( "__alignof_" + structDecl->get_name(), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, sizeAlignOutType->clone(), 0 );467 ObjectDecl *alignParam = new ObjectDecl( alignofName( structDecl->get_name() ), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, sizeAlignOutType->clone(), 0 ); 467 468 layoutFnType->get_parameters().push_back( alignParam ); 468 ObjectDecl *offsetParam = new ObjectDecl( "__offsetof_" + structDecl->get_name(), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, sizeAlignOutType->clone(), 0 );469 ObjectDecl *offsetParam = new ObjectDecl( offsetofName( structDecl->get_name() ), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, sizeAlignOutType->clone(), 0 ); 469 470 layoutFnType->get_parameters().push_back( offsetParam ); 470 471 addOtypeParams( layoutFnType, otypeParams ); 471 472 472 473 // build function decl 473 FunctionDecl *layoutDecl = buildLayoutFunctionDecl( structDecl ->get_name(), functionNesting, layoutFnType );474 FunctionDecl *layoutDecl = buildLayoutFunctionDecl( structDecl, functionNesting, layoutFnType ); 474 475 475 476 // calculate struct layout in function body … … 523 524 PointerType *sizeAlignOutType = new PointerType( Type::Qualifiers(), sizeAlignType ); 524 525 525 ObjectDecl *sizeParam = new ObjectDecl( "__sizeof_" + unionDecl->get_name(), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, sizeAlignOutType, 0 );526 ObjectDecl *sizeParam = new ObjectDecl( sizeofName( unionDecl->get_name() ), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, sizeAlignOutType, 0 ); 526 527 layoutFnType->get_parameters().push_back( sizeParam ); 527 ObjectDecl *alignParam = new ObjectDecl( "__alignof_" + unionDecl->get_name(), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, sizeAlignOutType->clone(), 0 );528 ObjectDecl *alignParam = new ObjectDecl( alignofName( unionDecl->get_name() ), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, sizeAlignOutType->clone(), 0 ); 528 529 layoutFnType->get_parameters().push_back( alignParam ); 529 530 addOtypeParams( layoutFnType, otypeParams ); 530 531 531 532 // build function decl 532 FunctionDecl *layoutDecl = buildLayoutFunctionDecl( unionDecl ->get_name(), functionNesting, layoutFnType );533 FunctionDecl *layoutDecl = buildLayoutFunctionDecl( unionDecl, functionNesting, layoutFnType ); 533 534 534 535 // calculate union layout in function body … … 747 748 Type *polyBase = hasPolyBase( parmType, exprTyVars ); 748 749 if ( polyBase && ! dynamic_cast< TypeInstType* >( polyBase ) ) { 749 std::string sizeName = sizeofName( polyBase );750 if ( seenTypes.count( sizeName ) ) return;750 std::string typeName = mangleType( polyBase ); 751 if ( seenTypes.count( typeName ) ) return; 751 752 752 753 arg = appExpr->get_args().insert( arg, new SizeofExpr( argBaseType->clone() ) ); … … 766 767 } 767 768 768 seenTypes.insert( sizeName );769 seenTypes.insert( typeName ); 769 770 } 770 771 } … … 1124 1125 addAssign->get_args().push_back( appExpr->get_args().front() ); 1125 1126 } // if 1126 addAssign->get_args().push_back( new NameExpr( sizeofName( polyType) ) );1127 addAssign->get_args().push_back( new NameExpr( sizeofName( mangleType( polyType ) ) ) ); 1127 1128 addAssign->get_results().front() = appExpr->get_results().front()->clone(); 1128 1129 if ( appExpr->get_env() ) { … … 1151 1152 UntypedExpr *multiply = new UntypedExpr( new NameExpr( "?*?" ) ); 1152 1153 multiply->get_args().push_back( appExpr->get_args().back() ); 1153 multiply->get_args().push_back( new NameExpr( sizeofName( baseType1) ) );1154 multiply->get_args().push_back( new SizeofExpr( baseType1->clone() ) ); 1154 1155 ret->get_args().push_back( appExpr->get_args().front() ); 1155 1156 ret->get_args().push_back( multiply ); … … 1157 1158 UntypedExpr *multiply = new UntypedExpr( new NameExpr( "?*?" ) ); 1158 1159 multiply->get_args().push_back( appExpr->get_args().front() ); 1159 multiply->get_args().push_back( new NameExpr( sizeofName( baseType2) ) );1160 multiply->get_args().push_back( new SizeofExpr( baseType2->clone() ) ); 1160 1161 ret->get_args().push_back( multiply ); 1161 1162 ret->get_args().push_back( appExpr->get_args().back() ); … … 1220 1221 UntypedExpr *divide = new UntypedExpr( new NameExpr( "?/?" ) ); 1221 1222 divide->get_args().push_back( appExpr ); 1222 divide->get_args().push_back( new NameExpr( sizeofName( baseType1) ) );1223 divide->get_args().push_back( new SizeofExpr( baseType1->clone() ) ); 1223 1224 divide->get_results().push_front( appExpr->get_results().front()->clone() ); 1224 1225 if ( appExpr->get_env() ) { … … 1230 1231 UntypedExpr *multiply = new UntypedExpr( new NameExpr( "?*?" ) ); 1231 1232 multiply->get_args().push_back( appExpr->get_args().back() ); 1232 multiply->get_args().push_back( new NameExpr( sizeofName( baseType1) ) );1233 multiply->get_args().push_back( new SizeofExpr( baseType1->clone() ) ); 1233 1234 appExpr->get_args().back() = multiply; 1234 1235 } else if ( baseType2 ) { 1235 1236 UntypedExpr *multiply = new UntypedExpr( new NameExpr( "?*?" ) ); 1236 1237 multiply->get_args().push_back( appExpr->get_args().front() ); 1237 multiply->get_args().push_back( new NameExpr( sizeofName( baseType2) ) );1238 multiply->get_args().push_back( new SizeofExpr( baseType2->clone() ) ); 1238 1239 appExpr->get_args().front() = multiply; 1239 1240 } // if … … 1245 1246 UntypedExpr *multiply = new UntypedExpr( new NameExpr( "?*?" ) ); 1246 1247 multiply->get_args().push_back( appExpr->get_args().back() ); 1247 multiply->get_args().push_back( new NameExpr( sizeofName( baseType) ) );1248 multiply->get_args().push_back( new SizeofExpr( baseType->clone() ) ); 1248 1249 appExpr->get_args().back() = multiply; 1249 1250 } // if … … 1572 1573 if ( (*tyParm)->get_kind() == TypeDecl::Any ) { 1573 1574 TypeInstType parmType( Type::Qualifiers(), (*tyParm)->get_name(), *tyParm ); 1575 std::string parmName = mangleType( &parmType ); 1574 1576 1575 1577 sizeParm = newObj.clone(); 1576 sizeParm->set_name( sizeofName( &parmType ) );1578 sizeParm->set_name( sizeofName( parmName ) ); 1577 1579 last = funcType->get_parameters().insert( last, sizeParm ); 1578 1580 ++last; 1579 1581 1580 1582 alignParm = newObj.clone(); 1581 alignParm->set_name( alignofName( &parmType ) );1583 alignParm->set_name( alignofName( parmName ) ); 1582 1584 last = funcType->get_parameters().insert( last, alignParm ); 1583 1585 ++last; … … 1596 1598 Type *polyBase = hasPolyBase( (*fnParm)->get_type(), scopeTyVars ); 1597 1599 if ( polyBase && ! dynamic_cast< TypeInstType* >( polyBase ) ) { 1598 std::string sizeName = sizeofName( polyBase );1599 if ( seenTypes.count( sizeName ) ) continue;1600 std::string typeName = mangleType( polyBase ); 1601 if ( seenTypes.count( typeName ) ) continue; 1600 1602 1601 1603 ObjectDecl *sizeParm, *alignParm, *offsetParm; 1602 1604 sizeParm = newObj.clone(); 1603 sizeParm->set_name( size Name);1605 sizeParm->set_name( sizeofName( typeName ) ); 1604 1606 last = funcType->get_parameters().insert( last, sizeParm ); 1605 1607 ++last; 1606 1608 1607 1609 alignParm = newObj.clone(); 1608 alignParm->set_name( alignofName( polyBase ) );1610 alignParm->set_name( alignofName( typeName ) ); 1609 1611 last = funcType->get_parameters().insert( last, alignParm ); 1610 1612 ++last; … … 1614 1616 if ( ! polyBaseStruct->get_baseStruct()->get_members().empty() ) { 1615 1617 offsetParm = newPtr.clone(); 1616 offsetParm->set_name( offsetofName( polyBase ) );1618 offsetParm->set_name( offsetofName( typeName ) ); 1617 1619 last = funcType->get_parameters().insert( last, offsetParm ); 1618 1620 ++last; … … 1620 1622 } 1621 1623 1622 seenTypes.insert( sizeName );1624 seenTypes.insert( typeName ); 1623 1625 } 1624 1626 } … … 1872 1874 Type *polyBase = hasPolyBase( (*fnParm)->get_type(), scopeTyVars ); 1873 1875 if ( polyBase && ! dynamic_cast< TypeInstType* >( polyBase ) ) { 1874 knownLayouts.insert( sizeofName( polyBase ) );1876 knownLayouts.insert( mangleType( polyBase ) ); 1875 1877 } 1876 1878 } … … 1889 1891 Type *declType = objectDecl->get_type(); 1890 1892 UntypedExpr *alloc = new UntypedExpr( new NameExpr( "__builtin_alloca" ) ); 1891 alloc->get_args().push_back( new NameExpr( sizeofName( declType) ) );1893 alloc->get_args().push_back( new NameExpr( sizeofName( mangleType( declType ) ) ) ); 1892 1894 1893 1895 delete objectDecl->get_init(); … … 1921 1923 ConstantExpr *fieldIndex = new ConstantExpr( Constant( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), offset_namer.str() ) ); 1922 1924 UntypedExpr *fieldOffset = new UntypedExpr( new NameExpr( "?[?]" ) ); 1923 fieldOffset->get_args().push_back( new NameExpr( offsetofName( objectType) ) );1925 fieldOffset->get_args().push_back( new NameExpr( offsetofName( mangleType( objectType ) ) ) ); 1924 1926 fieldOffset->get_args().push_back( fieldIndex ); 1925 1927 return fieldOffset; … … 1995 1997 if ( findGeneric( *param ) ) { 1996 1998 // push size/align vars for a generic parameter back 1997 layoutCall->get_args().push_back( new NameExpr( sizeofName( *param ) ) ); 1998 layoutCall->get_args().push_back( new NameExpr( alignofName( *param ) ) ); 1999 std::string paramName = mangleType( *param ); 2000 layoutCall->get_args().push_back( new NameExpr( sizeofName( paramName ) ) ); 2001 layoutCall->get_args().push_back( new NameExpr( alignofName( paramName ) ) ); 1999 2002 } else { 2000 2003 layoutCall->get_args().push_back( new SizeofExpr( (*param)->clone() ) ); … … 2040 2043 } else if ( StructInstType *structTy = dynamic_cast< StructInstType* >( ty ) ) { 2041 2044 // check if this type already has a layout generated for it 2042 std::string sizeName = sizeofName( ty );2043 if ( knownLayouts.find( sizeName ) != knownLayouts.end() ) return true;2045 std::string typeName = mangleType( ty ); 2046 if ( knownLayouts.find( typeName ) != knownLayouts.end() ) return true; 2044 2047 2045 2048 // check if any of the type parameters have dynamic layout; if none do, this type is (or will be) monomorphized … … 2048 2051 2049 2052 // insert local variables for layout and generate call to layout function 2050 knownLayouts.insert( sizeName ); // done early so as not to interfere with the later addition of parameters to the layout call2053 knownLayouts.insert( typeName ); // done early so as not to interfere with the later addition of parameters to the layout call 2051 2054 Type *layoutType = new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ); 2052 2055 … … 2054 2057 if ( n_members == 0 ) { 2055 2058 // all empty structs have the same layout - size 1, align 1 2056 makeVar( size Name, layoutType, new SingleInit( new ConstantExpr( Constant::from( (unsigned long)1 ) ) ) );2057 makeVar( alignofName( ty ), layoutType->clone(), new SingleInit( new ConstantExpr( Constant::from( (unsigned long)1 ) ) ) );2059 makeVar( sizeofName( typeName ), layoutType, new SingleInit( new ConstantExpr( Constant::from( (unsigned long)1 ) ) ) ); 2060 makeVar( alignofName( typeName ), layoutType->clone(), new SingleInit( new ConstantExpr( Constant::from( (unsigned long)1 ) ) ) ); 2058 2061 // NOTE zero-length arrays are forbidden in C, so empty structs have no offsetof array 2059 2062 } else { 2060 ObjectDecl *sizeVar = makeVar( size Name, layoutType );2061 ObjectDecl *alignVar = makeVar( alignofName( ty ), layoutType->clone() );2062 ObjectDecl *offsetVar = makeVar( offsetofName( ty ), new ArrayType( Type::Qualifiers(), layoutType->clone(), new ConstantExpr( Constant::from( n_members ) ), false, false ) );2063 ObjectDecl *sizeVar = makeVar( sizeofName( typeName ), layoutType ); 2064 ObjectDecl *alignVar = makeVar( alignofName( typeName ), layoutType->clone() ); 2065 ObjectDecl *offsetVar = makeVar( offsetofName( typeName ), new ArrayType( Type::Qualifiers(), layoutType->clone(), new ConstantExpr( Constant::from( n_members ) ), false, false ) ); 2063 2066 2064 2067 // generate call to layout function 2065 UntypedExpr *layoutCall = new UntypedExpr( new NameExpr( "__layoutof_" + structTy->get_baseStruct()->get_name() ) );2068 UntypedExpr *layoutCall = new UntypedExpr( new NameExpr( layoutofName( structTy->get_baseStruct() ) ) ); 2066 2069 layoutCall->get_args().push_back( new AddressExpr( new VariableExpr( sizeVar ) ) ); 2067 2070 layoutCall->get_args().push_back( new AddressExpr( new VariableExpr( alignVar ) ) ); … … 2075 2078 } else if ( UnionInstType *unionTy = dynamic_cast< UnionInstType* >( ty ) ) { 2076 2079 // check if this type already has a layout generated for it 2077 std::string sizeName = sizeofName( ty );2078 if ( knownLayouts.find( sizeName ) != knownLayouts.end() ) return true;2080 std::string typeName = mangleType( ty ); 2081 if ( knownLayouts.find( typeName ) != knownLayouts.end() ) return true; 2079 2082 2080 2083 // check if any of the type parameters have dynamic layout; if none do, this type is (or will be) monomorphized … … 2083 2086 2084 2087 // insert local variables for layout and generate call to layout function 2085 knownLayouts.insert( sizeName ); // done early so as not to interfere with the later addition of parameters to the layout call2088 knownLayouts.insert( typeName ); // done early so as not to interfere with the later addition of parameters to the layout call 2086 2089 Type *layoutType = new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ); 2087 2090 2088 ObjectDecl *sizeVar = makeVar( size Name, layoutType );2089 ObjectDecl *alignVar = makeVar( alignofName( ty ), layoutType->clone() );2091 ObjectDecl *sizeVar = makeVar( sizeofName( typeName ), layoutType ); 2092 ObjectDecl *alignVar = makeVar( alignofName( typeName ), layoutType->clone() ); 2090 2093 2091 2094 // generate call to layout function 2092 UntypedExpr *layoutCall = new UntypedExpr( new NameExpr( "__layoutof_" + unionTy->get_baseUnion()->get_name() ) );2095 UntypedExpr *layoutCall = new UntypedExpr( new NameExpr( layoutofName( unionTy->get_baseUnion() ) ) ); 2093 2096 layoutCall->get_args().push_back( new AddressExpr( new VariableExpr( sizeVar ) ) ); 2094 2097 layoutCall->get_args().push_back( new AddressExpr( new VariableExpr( alignVar ) ) ); … … 2106 2109 Type *ty = sizeofExpr->get_type(); 2107 2110 if ( findGeneric( ty ) ) { 2108 Expression *ret = new NameExpr( sizeofName( ty) );2111 Expression *ret = new NameExpr( sizeofName( mangleType( ty ) ) ); 2109 2112 delete sizeofExpr; 2110 2113 return ret; … … 2116 2119 Type *ty = alignofExpr->get_type(); 2117 2120 if ( findGeneric( ty ) ) { 2118 Expression *ret = new NameExpr( alignofName( ty) );2121 Expression *ret = new NameExpr( alignofName( mangleType( ty ) ) ); 2119 2122 delete alignofExpr; 2120 2123 return ret; … … 2154 2157 if ( findGeneric( ty ) ) { 2155 2158 // pull offset back from generated type information 2156 ret = new NameExpr( offsetofName( ty) );2159 ret = new NameExpr( offsetofName( mangleType( ty ) ) ); 2157 2160 } else { 2158 std::string offsetName = offsetofName( ty);2161 std::string offsetName = offsetofName( mangleType( ty ) ); 2159 2162 if ( knownOffsets.find( offsetName ) != knownOffsets.end() ) { 2160 2163 // use the already-generated offsets for this type … … 2196 2199 void PolyGenericCalculator::doEndScope() { 2197 2200 knownLayouts.endScope(); 2198 knownOffsets. beginScope();2201 knownOffsets.endScope(); 2199 2202 } 2200 2203 -
src/GenPoly/GenPoly.cc
r224e52f radc6781 16 16 #include "GenPoly.h" 17 17 18 #include "SymTab/Mangler.h"19 18 #include "SynTree/Expression.h" 20 19 #include "SynTree/Type.h" … … 218 217 } 219 218 220 std::string sizeofName( Type *ty ) {221 return std::string( "_sizeof_" ) + SymTab::Mangler::mangleType( ty );222 }223 224 std::string alignofName( Type *ty ) {225 return std::string( "_alignof_" ) + SymTab::Mangler::mangleType( ty );226 }227 228 std::string offsetofName( Type* ty ) {229 return std::string( "_offsetof_" ) + SymTab::Mangler::mangleType( ty );230 }231 232 219 } // namespace GenPoly 233 220 -
src/GenPoly/GenPoly.h
r224e52f radc6781 21 21 #include <iostream> 22 22 #include <utility> 23 24 #include "SymTab/Mangler.h" 23 25 24 26 #include "SynTree/Declaration.h" … … 69 71 void printTyVarMap( std::ostream &os, const TyVarMap &tyVarMap ); 70 72 71 /// Gets the name of the sizeof parameter for the type 72 std::string sizeofName( Type *ty ); 73 /// Gets the mangled name of this type; alias for SymTab::Mangler::mangleType(). 74 inline std::string mangleType( Type *ty ) { return SymTab::Mangler::mangleType( ty ); } 75 76 /// Gets the name of the sizeof parameter for the type, given its mangled name 77 inline std::string sizeofName( const std::string &name ) { return std::string( "_sizeof_" ) + name; } 73 78 74 /// Gets the name of the alignof parameter for the type 75 std::string alignofName( Type *ty );79 /// Gets the name of the alignof parameter for the type, given its mangled name 80 inline std::string alignofName( const std::string &name ) { return std::string( "_alignof_" ) + name; } 76 81 77 /// Gets the name of the offsetof parameter for the type 78 std::string offsetofName( Type *ty ); 82 /// Gets the name of the offsetof parameter for the type, given its mangled name 83 inline std::string offsetofName( const std::string &name ) { return std::string( "_offsetof_" ) + name; } 84 85 /// Gets the name of the layout function for a given aggregate type, given its declaration 86 inline std::string layoutofName( AggregateDecl *decl ) { return std::string( "_layoutof_" ) + decl->get_name(); } 87 79 88 } // namespace GenPoly 80 89 -
src/GenPoly/ScrubTyVars.cc
r224e52f radc6781 64 64 // sizeof( T ) => _sizeof_T parameter, which is the size of T 65 65 if ( Type *polyType = isPolyType( szeof->get_type() ) ) { 66 Expression *expr = new NameExpr( sizeofName( polyType) );66 Expression *expr = new NameExpr( sizeofName( mangleType( polyType ) ) ); 67 67 return expr; 68 68 } else { … … 74 74 // alignof( T ) => _alignof_T parameter, which is the alignment of T 75 75 if ( Type *polyType = isPolyType( algnof->get_type() ) ) { 76 Expression *expr = new NameExpr( alignofName( polyType) );76 Expression *expr = new NameExpr( alignofName( mangleType( polyType ) ) ); 77 77 return expr; 78 78 } else {
Note: See TracChangeset
for help on using the changeset viewer.