Changeset 0720e049 for src/GenPoly
- Timestamp:
- Aug 11, 2017, 10:33:37 AM (8 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:
- 54cd58b0
- Parents:
- 3d4b23fa (diff), 59a75cb (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- src/GenPoly
- Files:
-
- 14 edited
-
Box.cc (modified) (7 diffs)
-
Box.h (modified) (2 diffs)
-
CopyParams.h (modified) (2 diffs)
-
DeclMutator.h (modified) (5 diffs)
-
ErasableScopedMap.h (modified) (2 diffs)
-
FindFunction.h (modified) (2 diffs)
-
GenPoly.h (modified) (2 diffs)
-
InstantiateGeneric.h (modified) (2 diffs)
-
Lvalue.cc (modified) (4 diffs)
-
Lvalue.h (modified) (2 diffs)
-
PolyMutator.h (modified) (2 diffs)
-
ScopedSet.h (modified) (2 diffs)
-
ScrubTyVars.h (modified) (2 diffs)
-
Specialize.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/Box.cc
r3d4b23fa r0720e049 27 27 #include "Box.h" 28 28 #include "DeclMutator.h" 29 #include "Lvalue.h" 30 #include "FindFunction.h" 29 31 #include "PolyMutator.h" 30 #include "FindFunction.h"31 32 #include "ScopedSet.h" 32 33 #include "ScrubTyVars.h" … … 202 203 }; 203 204 204 /// Replaces initialization of polymorphic values with alloca, declaration of dtype/ftype with appropriate void expression, and sizeof expressions of polymorphic types with the proper variable205 /// Replaces initialization of polymorphic values with alloca, declaration of dtype/ftype with appropriate void expression, sizeof expressions of polymorphic types with the proper variable, and strips fields from generic struct declarations. 205 206 class Pass3 final : public PolyMutator { 206 207 public: … … 210 211 using PolyMutator::mutate; 211 212 virtual DeclarationWithType *mutate( FunctionDecl *functionDecl ) override; 213 virtual Declaration *mutate( StructDecl *structDecl ) override; 214 virtual Declaration *mutate( UnionDecl *unionDecl ) override; 212 215 virtual ObjectDecl *mutate( ObjectDecl *objectDecl ) override; 213 216 virtual TypedefDecl *mutate( TypedefDecl *objectDecl ) override; … … 753 756 754 757 void Pass1::boxParam( Type *param, Expression *&arg, const TyVarMap &exprTyVars ) { 755 assert ( arg->has_result() );758 assertf( arg->has_result(), "arg does not have result: %s", toString( arg ).c_str() ); 756 759 if ( isPolyType( param, exprTyVars ) ) { 757 if ( isPolyType( arg->get_result() ) ) { 760 Type * newType = arg->get_result()->clone(); 761 if ( env ) env->apply( newType ); 762 std::auto_ptr<Type> manager( newType ); 763 if ( isPolyType( newType ) ) { 758 764 // if the argument's type is polymorphic, we don't need to box again! 759 765 return; 760 766 } else if ( arg->get_result()->get_lvalue() ) { 761 // VariableExpr and MemberExpr are lvalues; need to check this isn't coming from the second arg of a comma expression though (not an lvalue) 762 // xxx - need to test that this code is still reachable 763 if ( CommaExpr *commaArg = dynamic_cast< CommaExpr* >( arg ) ) { 764 commaArg->set_arg2( new AddressExpr( commaArg->get_arg2() ) ); 765 } else { 766 arg = new AddressExpr( arg ); 767 } 767 // argument expression may be CFA lvalue, but not C lvalue -- apply generalizedLvalue transformations. 768 arg = generalizedLvalue( new AddressExpr( arg ) ); 768 769 if ( ! ResolvExpr::typesCompatible( param, arg->get_result(), SymTab::Indexer() ) ) { 769 770 // silence warnings by casting boxed parameters when the actual type does not match up with the formal type. … … 1748 1749 1749 1750 Expression *PolyGenericCalculator::mutate( SizeofExpr *sizeofExpr ) { 1750 Type *ty = sizeofExpr->get_ type();1751 Type *ty = sizeofExpr->get_isType() ? sizeofExpr->get_type() : sizeofExpr->get_expr()->get_result(); 1751 1752 if ( findGeneric( ty ) ) { 1752 1753 Expression *ret = new NameExpr( sizeofName( mangleType( ty ) ) ); … … 1758 1759 1759 1760 Expression *PolyGenericCalculator::mutate( AlignofExpr *alignofExpr ) { 1760 Type *ty = alignofExpr->get_ type();1761 Type *ty = alignofExpr->get_isType() ? alignofExpr->get_type() : alignofExpr->get_expr()->get_result(); 1761 1762 if ( findGeneric( ty ) ) { 1762 1763 Expression *ret = new NameExpr( alignofName( mangleType( ty ) ) ); … … 1868 1869 } 1869 1870 1871 /// Strips the members from a generic aggregate 1872 void stripGenericMembers(AggregateDecl* decl) { 1873 if ( ! decl->get_parameters().empty() ) decl->get_members().clear(); 1874 } 1875 1876 Declaration *Pass3::mutate( StructDecl *structDecl ) { 1877 stripGenericMembers( structDecl ); 1878 return structDecl; 1879 } 1880 1881 Declaration *Pass3::mutate( UnionDecl *unionDecl ) { 1882 stripGenericMembers( unionDecl ); 1883 return unionDecl; 1884 } 1885 1870 1886 TypeDecl * Pass3::mutate( TypeDecl *typeDecl ) { 1871 1887 // Initializer *init = 0; -
src/GenPoly/Box.h
r3d4b23fa r0720e049 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Nov 19 17:24:01 201513 // Update Count : 512 // Last Modified On : Sat Jul 22 09:23:52 2017 13 // Update Count : 6 14 14 // 15 15 16 #ifndef _BOX_H 17 #define _BOX_H 16 #pragma once 18 17 19 18 #include <list> … … 25 24 } // namespace GenPoly 26 25 27 #endif // _BOX_H28 29 26 // Local Variables: // 30 27 // tab-width: 4 // -
src/GenPoly/CopyParams.h
r3d4b23fa r0720e049 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue May 19 07:34:25 201513 // Update Count : 112 // Last Modified On : Sat Jul 22 09:23:09 2017 13 // Update Count : 2 14 14 // 15 15 16 #ifndef _COPYPARAMS_H 17 #define _COPYPARAMS_H 16 #pragma once 18 17 19 18 #include "SynTree/SynTree.h" … … 24 23 } // namespace GenPoly 25 24 26 #endif // _COPYPARAMS_H27 28 25 // Local Variables: // 29 26 // tab-width: 4 // -
src/GenPoly/DeclMutator.h
r3d4b23fa r0720e049 10 10 // Created On : Fri Nov 27 14:44:00 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Jul 12 17:39:01 201613 // Update Count : 212 // Last Modified On : Sat Jul 22 09:21:12 2017 13 // Update Count : 4 14 14 // 15 15 16 #ifndef _DECLMUTATOR_H 17 #define _DECLMUTATOR_H 16 #pragma once 18 17 19 18 #include <list> … … 27 26 /// Mutates a list of declarations, providing a means of adding new declarations into the list 28 27 class DeclMutator : public Mutator { 29 public:28 public: 30 29 typedef Mutator Parent; 31 30 … … 50 49 /// Called on exit from a scope; overriders should call this as a super-class call 51 50 virtual void doEndScope(); 52 protected:51 protected: 53 52 /// Mutate a statement that forms its own scope 54 53 Statement* mutateStatement( Statement *stmt ); … … 59 58 /// Add a declaration to the list to be added after the current position 60 59 void addDeclarationAfter( Declaration* decl ); 61 private:60 private: 62 61 /// A stack of declarations to add before the current declaration or statement 63 62 std::vector< std::list< Declaration* > > declsToAdd; … … 67 66 } // namespace 68 67 69 #endif // _DECLMUTATOR_H70 71 68 // Local Variables: // 72 69 // tab-width: 4 // -
src/GenPoly/ErasableScopedMap.h
r3d4b23fa r0720e049 9 9 // Author : Aaron B. Moss 10 10 // Created On : Wed Dec 2 11:37:00 2015 11 // Last Modified By : Aaron B. Moss 12 // Last Modified On : Wed Dec 2 11:37:00 2015 13 // Update Count : 1 14 // 15 16 #ifndef _ERASABLESCOPEDMAP_H 17 #define _ERASABLESCOPEDMAP_H 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Jul 22 09:23:24 2017 13 // Update Count : 2 14 // 15 16 #pragma once 18 17 19 18 #include <cassert> … … 278 277 } // namespace GenPoly 279 278 280 #endif // _ERASABLESCOPEDMAP_H281 282 279 // Local Variables: // 283 280 // tab-width: 4 // -
src/GenPoly/FindFunction.h
r3d4b23fa r0720e049 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue May 19 07:36:35 201513 // Update Count : 112 // Last Modified On : Sat Jul 22 09:23:36 2017 13 // Update Count : 2 14 14 // 15 15 16 #ifndef FINDFUNCTION_H 17 #define FINDFUNCTION_H 16 #pragma once 18 17 19 18 #include "SynTree/SynTree.h" … … 29 28 } // namespace GenPoly 30 29 31 #endif // FINDFUNCTION_H32 33 30 // Local Variables: // 34 31 // tab-width: 4 // -
src/GenPoly/GenPoly.h
r3d4b23fa r0720e049 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Tue Nov 24 15:24:38 201513 // Update Count : 611 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Jul 22 09:22:57 2017 13 // Update Count : 7 14 14 // 15 15 16 #ifndef GENPOLY_H 17 #define GENPOLY_H 16 #pragma once 18 17 19 18 #include <string> … … 111 110 } // namespace GenPoly 112 111 113 #endif // GENPOLY_H114 115 112 // Local Variables: // 116 113 // tab-width: 4 // -
src/GenPoly/InstantiateGeneric.h
r3d4b23fa r0720e049 9 9 // Author : Aaron B. Moss 10 10 // Created On : Thu Aug 04 18:33:00 2016 11 // Last Modified By : Aaron B. Moss12 // Last Modified On : Thu Aug 04 18:33:00 201613 // Update Count : 111 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Jul 22 09:22:42 2017 13 // Update Count : 2 14 14 // 15 15 16 #ifndef _INSTANTIATEGENERIC_H 17 #define _INSTANTIATEGENERIC_H 16 #pragma once 18 17 19 18 #include "SynTree/SynTree.h" … … 26 25 } // namespace GenPoly 27 26 28 #endif // _INSTANTIATEGENERIC_H29 30 27 // Local Variables: // 31 28 // tab-width: 4 // -
src/GenPoly/Lvalue.cc
r3d4b23fa r0720e049 27 27 #include "SynTree/Mutator.h" 28 28 #include "SymTab/Indexer.h" 29 29 30 #include "ResolvExpr/Resolver.h" 31 #include "ResolvExpr/TypeEnvironment.h" 30 32 #include "ResolvExpr/typeops.h" 33 #include "ResolvExpr/Unify.h" 31 34 32 35 #include "Common/UniqueName.h" … … 60 63 typedef Mutator Parent; 61 64 65 virtual Expression * mutate( MemberExpr * memExpr ); 62 66 virtual Expression * mutate( AddressExpr * addressExpr ); 67 68 template<typename Func> 69 Expression * applyTransformation( Expression * expr, Expression * arg, Func mkExpr ); 63 70 }; 64 71 } // namespace … … 71 78 acceptAll( translationUnit, p2 ); 72 79 mutateAll( translationUnit, genLval ); 80 } 81 82 Expression * generalizedLvalue( Expression * expr ) { 83 GeneralizedLvalue genLval; 84 return expr->acceptMutator( genLval ); 73 85 } 74 86 … … 163 175 } 164 176 165 Expression * GeneralizedLvalue::mutate( AddressExpr * addrExpr ) {166 addrExpr = safe_dynamic_cast< AddressExpr * >( Parent::mutate( addrExpr ) );167 if ( CommaExpr * commaExpr = dynamic_cast< CommaExpr * >( a ddrExpr->get_arg()) ) {177 template<typename Func> 178 Expression * GeneralizedLvalue::applyTransformation( Expression * expr, Expression * arg, Func mkExpr ) { 179 if ( CommaExpr * commaExpr = dynamic_cast< CommaExpr * >( arg ) ) { 168 180 Expression * arg1 = commaExpr->get_arg1()->clone(); 169 181 Expression * arg2 = commaExpr->get_arg2()->clone(); 170 delete addrExpr; 171 return new CommaExpr( arg1, new AddressExpr( arg2 ) ); 172 } else if ( ConditionalExpr * condExpr = dynamic_cast< ConditionalExpr * >( addrExpr->get_arg() ) ) { 182 Expression * ret = new CommaExpr( arg1, mkExpr( arg2 ) ); 183 ret->set_env( expr->get_env() ); 184 expr->set_env( nullptr ); 185 delete expr; 186 return ret->acceptMutator( *this ); 187 } else if ( ConditionalExpr * condExpr = dynamic_cast< ConditionalExpr * >( arg ) ) { 173 188 Expression * arg1 = condExpr->get_arg1()->clone(); 174 189 Expression * arg2 = condExpr->get_arg2()->clone(); 175 190 Expression * arg3 = condExpr->get_arg3()->clone(); 176 delete addrExpr; 177 return new ConditionalExpr( arg1, new AddressExpr( arg2 ), new AddressExpr( arg3 ) ); 191 ConditionalExpr * ret = new ConditionalExpr( arg1, mkExpr( arg2 ), mkExpr( arg3 ) ); 192 ret->set_env( expr->get_env() ); 193 expr->set_env( nullptr ); 194 delete expr; 195 196 // conditional expr type may not be either of the argument types, need to unify 197 using namespace ResolvExpr; 198 Type* commonType = nullptr; 199 TypeEnvironment newEnv; 200 AssertionSet needAssertions, haveAssertions; 201 OpenVarSet openVars; 202 unify( ret->get_arg2()->get_result(), ret->get_arg3()->get_result(), newEnv, needAssertions, haveAssertions, openVars, SymTab::Indexer(), commonType ); 203 ret->set_result( commonType ? commonType : ret->get_arg2()->get_result()->clone() ); 204 return ret->acceptMutator( *this ); 178 205 } 179 return addrExpr; 206 return expr; 207 } 208 209 Expression * GeneralizedLvalue::mutate( MemberExpr * memExpr ) { 210 Parent::mutate( memExpr ); 211 return applyTransformation( memExpr, memExpr->get_aggregate(), [=]( Expression * aggr ) { return new MemberExpr( memExpr->get_member(), aggr ); } ); 212 } 213 214 Expression * GeneralizedLvalue::mutate( AddressExpr * addrExpr ) { 215 addrExpr = safe_dynamic_cast< AddressExpr * >( Parent::mutate( addrExpr ) ); 216 return applyTransformation( addrExpr, addrExpr->get_arg(), []( Expression * arg ) { return new AddressExpr( arg ); } ); 180 217 } 181 218 } // namespace -
src/GenPoly/Lvalue.h
r3d4b23fa r0720e049 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Lvalue.h -- 7 // Lvalue.h -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue May 19 07:42:09 201513 // Update Count : 112 // Last Modified On : Sat Jul 22 09:21:59 2017 13 // Update Count : 2 14 14 // 15 15 16 #ifndef _LVALUE_H 17 #define _LVALUE_H 16 #pragma once 18 17 19 18 #include <list> … … 24 23 /// replaces return type of `lvalue T` with `T*`, along with appropriate address-of and dereference operators 25 24 void convertLvalue( std::list< Declaration* >& translationUnit ); 25 26 /// applies transformations that allow GCC to accept more complicated lvalue expressions, e.g. &(a, b) 27 Expression * generalizedLvalue( Expression * expr ); 26 28 } // namespace GenPoly 27 28 #endif // _LVALUE_H29 29 30 30 // Local Variables: // -
src/GenPoly/PolyMutator.h
r3d4b23fa r0720e049 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Jul 12 17:39:41 201613 // Update Count : 612 // Last Modified On : Sat Jul 22 09:20:31 2017 13 // Update Count : 7 14 14 // 15 15 16 #ifndef _POLYMUTATOR_H 17 #define _POLYMUTATOR_H 16 #pragma once 18 17 19 18 #include <map> … … 66 65 } // namespace 67 66 68 #endif // _POLYMUTATOR_H69 70 67 // Local Variables: // 71 68 // tab-width: 4 // -
src/GenPoly/ScopedSet.h
r3d4b23fa r0720e049 9 9 // Author : Aaron B. Moss 10 10 // Created On : Thu Dec 3 11:51:00 2015 11 // Last Modified By : Aaron B. Moss 12 // Last Modified On : Thu Dec 3 11:51:00 2015 13 // Update Count : 1 14 // 15 16 #ifndef _SCOPEDSET_H 17 #define _SCOPEDSET_H 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Jul 22 09:22:17 2017 13 // Update Count : 2 14 // 15 16 #pragma once 18 17 19 18 #include <iterator> … … 247 246 } // namespace GenPoly 248 247 249 #endif // _SCOPEDSET_H250 251 248 // Local Variables: // 252 249 // tab-width: 4 // -
src/GenPoly/ScrubTyVars.h
r3d4b23fa r0720e049 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue May 19 07:48:14 201513 // Update Count : 112 // Last Modified On : Sat Jul 22 09:21:47 2017 13 // Update Count : 2 14 14 // 15 15 16 #ifndef _SCRUBTYVARS_H 17 #define _SCRUBTYVARS_H 16 #pragma once 18 17 19 18 #include <string> … … 95 94 } // namespace GenPoly 96 95 97 #endif // _SCRUBTYVARS_H98 99 96 // Local Variables: // 100 97 // tab-width: 4 // -
src/GenPoly/Specialize.h
r3d4b23fa r0720e049 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue May 19 07:53:58 201513 // Update Count : 112 // Last Modified On : Sat Jul 22 09:22:31 2017 13 // Update Count : 2 14 14 // 15 15 16 #ifndef _SPECIALIZE_H 17 #define _SPECIALIZE_H 16 #pragma once 18 17 19 18 #include <list> … … 26 25 } // namespace GenPoly 27 26 28 #endif // _SPECIALIZE_H29 30 27 // Local Variables: // 31 28 // tab-width: 4 //
Note:
See TracChangeset
for help on using the changeset viewer.