Changes in / [58cb21c:29cf9c8]
- Location:
- src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified src/Common/utility.h ¶
r58cb21c r29cf9c8 322 322 std::string filename; 323 323 324 324 /// Create a new unset CodeLocation. 325 325 CodeLocation() 326 326 : linenumber( -1 ) … … 328 328 {} 329 329 330 330 /// Create a new CodeLocation with the given values. 331 331 CodeLocation( const char* filename, int lineno ) 332 332 : linenumber( lineno ) … … 334 334 {} 335 335 336 337 338 339 340 341 342 336 bool isSet () const { 337 return -1 != linenumber; 338 } 339 340 bool isUnset () const { 341 return !isSet(); 342 } 343 343 344 344 void unset () { … … 353 353 return location.isSet() ? location.filename + ":" + std::to_string(location.linenumber) + " " : ""; 354 354 } 355 356 355 #endif // _UTILITY_H 357 356 -
TabularUnified src/GenPoly/Box.cc ¶
r58cb21c r29cf9c8 765 765 arg = new AddressExpr( arg ); 766 766 } 767 if ( ! ResolvExpr::typesCompatible( param, arg->get_result(), SymTab::Indexer() ) ) {768 // silence warnings by casting boxed parameters when the actual type does not match up with the formal type.769 arg = new CastExpr( arg, param->clone() );770 }771 767 } else { 772 768 // use type computed in unification to declare boxed variables … … 906 902 } // if 907 903 UntypedExpr *assign = new UntypedExpr( new NameExpr( "?=?" ) ); 908 UntypedExpr *deref = UntypedExpr::createDeref( new CastExpr( new VariableExpr( *param++ ), new PointerType( Type::Qualifiers(), realType->get_returnVals().front()->get_type()->clone() ) ) ); 904 UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) ); 905 deref->get_args().push_back( new CastExpr( new VariableExpr( *param++ ), new PointerType( Type::Qualifiers(), realType->get_returnVals().front()->get_type()->clone() ) ) ); 909 906 assign->get_args().push_back( deref ); 910 907 addAdapterParams( adapteeApp, arg, param, adapterType->get_parameters().end(), realParam, tyVars ); … … 1220 1217 1221 1218 Statement * Pass1::mutate( ReturnStmt *returnStmt ) { 1219 // maybe need access to the env when mutating the expr 1220 if ( Expression * expr = returnStmt->get_expr() ) { 1221 if ( expr->get_env() ) { 1222 env = expr->get_env(); 1223 } 1224 } 1225 1222 1226 if ( retval && returnStmt->get_expr() ) { 1223 1227 assert( returnStmt->get_expr()->has_result() && ! returnStmt->get_expr()->get_result()->isVoid() ); … … 1535 1539 Type *declType = objectDecl->get_type(); 1536 1540 std::string bufName = bufNamer.newName(); 1537 ObjectDecl *newBuf = new ObjectDecl( bufName, Type::StorageClasses(), LinkageSpec::C, 0, 1538 new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::Kind::Char), new NameExpr( sizeofName( mangleType(declType) ) ), 1541 ObjectDecl *newBuf = new ObjectDecl( bufName, Type::StorageClasses(), LinkageSpec::C, 0, 1542 new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::Kind::Char), new NameExpr( sizeofName( mangleType(declType) ) ), 1539 1543 true, false, std::list<Attribute*>{ new Attribute( std::string{"aligned"}, std::list<Expression*>{ new ConstantExpr( Constant::from_int(8) ) } ) } ), 0 ); 1540 1544 stmtsToAdd.push_back( new DeclStmt( noLabels, newBuf ) ); … … 1574 1578 } 1575 1579 1580 /// Returns an expression dereferenced n times 1581 Expression *makeDerefdVar( Expression *derefdVar, long n ) { 1582 for ( int i = 1; i < n; ++i ) { 1583 UntypedExpr *derefExpr = new UntypedExpr( new NameExpr( "*?" ) ); 1584 derefExpr->get_args().push_back( derefdVar ); 1585 // xxx - should set results on derefExpr 1586 derefdVar = derefExpr; 1587 } 1588 return derefdVar; 1589 } 1590 1576 1591 Expression *PolyGenericCalculator::mutate( MemberExpr *memberExpr ) { 1577 1592 // mutate, exiting early if no longer MemberExpr … … 1580 1595 if ( ! memberExpr ) return expr; 1581 1596 1597 // get declaration for base struct, exiting early if not found 1598 int varDepth; 1599 VariableExpr *varExpr = getBaseVar( memberExpr->get_aggregate(), &varDepth ); 1600 if ( ! varExpr ) return memberExpr; 1601 ObjectDecl *objectDecl = dynamic_cast< ObjectDecl* >( varExpr->get_var() ); 1602 if ( ! objectDecl ) return memberExpr; 1603 1582 1604 // only mutate member expressions for polymorphic types 1583 1605 int tyDepth; 1584 Type *objectType = hasPolyBase( memberExpr->get_aggregate()->get_result(), scopeTyVars, &tyDepth );1606 Type *objectType = hasPolyBase( objectDecl->get_type(), scopeTyVars, &tyDepth ); 1585 1607 if ( ! objectType ) return memberExpr; 1586 1608 findGeneric( objectType ); // ensure layout for this type is available … … 1600 1622 fieldLoc->get_args().push_back( aggr ); 1601 1623 fieldLoc->get_args().push_back( makeOffsetIndex( objectType, i ) ); 1602 fieldLoc->set_result( memberExpr->get_result()->clone() );1603 1624 newMemberExpr = fieldLoc; 1604 1625 } else if ( dynamic_cast< UnionInstType* >( objectType ) ) { 1605 // union members are all at offset zero, so just use the aggregate expr 1606 Expression * aggr = memberExpr->get_aggregate()->clone(); 1607 delete aggr->get_env(); // xxx - there's a problem with keeping the env for some reason, so for now just get rid of it 1608 aggr->set_env( nullptr ); 1609 newMemberExpr = aggr; 1610 newMemberExpr->set_result( memberExpr->get_result()->clone() ); 1626 // union members are all at offset zero, so build appropriately-dereferenced variable 1627 newMemberExpr = makeDerefdVar( varExpr->clone(), varDepth ); 1611 1628 } else return memberExpr; 1612 1629 assert( newMemberExpr ); … … 1616 1633 // Not all members of a polymorphic type are themselves of polymorphic type; in this case the member expression should be wrapped and dereferenced to form an lvalue 1617 1634 CastExpr *ptrCastExpr = new CastExpr( newMemberExpr, new PointerType( Type::Qualifiers(), memberType->clone() ) ); 1618 UntypedExpr *derefExpr = UntypedExpr::createDeref( ptrCastExpr ); 1635 UntypedExpr *derefExpr = new UntypedExpr( new NameExpr( "*?" ) ); 1636 derefExpr->get_args().push_back( ptrCastExpr ); 1619 1637 newMemberExpr = derefExpr; 1620 1638 }
Note: See TracChangeset
for help on using the changeset viewer.