Changeset b8b5535 for src/GenPoly/GenPoly.h
- Timestamp:
- Nov 15, 2023, 5:01:36 PM (9 months ago)
- Branches:
- master
- Children:
- f22b170b
- Parents:
- 45a091b
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/GenPoly.h
r45a091b rb8b5535 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // GenPoly.h -- 7 // GenPoly.h -- General GenPoly utilities. 8 8 // 9 9 // Author : Richard C. Bilson … … 30 30 namespace GenPoly { 31 31 32 33 34 32 struct TypeVarMap : public ErasableScopedMap<ast::TypeEnvKey, ast::TypeData> { 33 TypeVarMap() : ErasableScopedMap( ast::TypeData() ) {} 34 }; 35 35 36 /// Replaces a TypeInstType by its referrent in the environment, if applicable 37 36 /// Replaces a TypeInstType by its referrent in the environment, if applicable. 37 const ast::Type * replaceTypeInst( const ast::Type *, const ast::TypeSubstitution * ); 38 38 39 /// returns polymorphic type if is polymorphic type, NULL otherwise; will look up substitution in env if provided 40 const ast::Type * isPolyType(const ast::Type * type, const ast::TypeSubstitution * env = nullptr);39 /// Returns polymorphic type if is polymorphic type, NULL otherwise; will look up substitution in env if provided. 40 const ast::Type * isPolyType( const ast::Type * type, const ast::TypeSubstitution * subst = nullptr ); 41 41 42 /// returns polymorphic type if is polymorphic type in tyVars, NULL otherwise; will look up substitution in env if provided 43 42 /// Returns polymorphic type if is polymorphic type in tyVars, NULL otherwise; will look up substitution in env if provided. 43 const ast::Type * isPolyType( const ast::Type * type, const TypeVarMap & typeVars, const ast::TypeSubstitution * subst = nullptr ); 44 44 45 /// returns dynamic-layout type if is dynamic-layout type in tyVars, NULL otherwise; will look up substitution in env if provided 46 45 /// Returns dynamic-layout type if is dynamic-layout type in tyVars, NULL otherwise; will look up substitution in env if provided. 46 const ast::BaseInstType *isDynType( const ast::Type * type, const TypeVarMap & typeVars, const ast::TypeSubstitution * subst = 0 ); 47 47 48 /// true iff function has dynamic-layout return type under the given type variable map 49 48 /// Returns true iff function has dynamic-layout return type under the given type variable map. 49 const ast::BaseInstType *isDynRet( const ast::FunctionType * type, const TypeVarMap & typeVars ); 50 50 51 /// true iff function has dynamic-layout return type under the type variable map generated from its forall-parameters 52 51 /// Returns true iff function has dynamic-layout return type under the type variable map generated from its forall-parameters. 52 const ast::BaseInstType *isDynRet( const ast::FunctionType * func ); 53 53 54 /// A function needs an adapter if it returns a dynamic-layout value or if any of its parameters have dynamic-layout type 55 54 /// A function needs an adapter if it returns a dynamic-layout value or if any of its parameters have dynamic-layout type. 55 bool needsAdapter( ast::FunctionType const * adaptee, const TypeVarMap & typeVars ); 56 56 57 /// returns polymorphic type if is pointer to polymorphic type in tyVars, NULL otherwise; will look up substitution in env if provided 58 57 /// Returns polymorphic type if is pointer to polymorphic type in tyVars, NULL otherwise; will look up substitution in env if provided. 58 const ast::Type * isPolyPtr( const ast::Type * type, const TypeVarMap & typeVars, const ast::TypeSubstitution * env = 0 ); 59 59 60 /// if the base type (after dereferencing N >= 0 pointers) is a polymorphic type in tyVars, returns the base type, NULL otherwise;61 /// N will be stored in levels, if provided, will look up substitution in env if provided 62 60 /// If the base type (after dereferencing N >= 0 pointers) is a polymorphic type in tyVars, returns the base type, NULL otherwise; 61 /// N will be stored in levels, if provided, will look up substitution in env if provided. 62 const ast::Type * hasPolyBase( const ast::Type * type, const TypeVarMap & typeVars, int * levels = 0, const ast::TypeSubstitution * env = 0 ); 63 63 64 /// Returns a pointer to the base FunctionType if ty is the type of a function (or pointer to one), NULL otherwise 65 64 /// Returns a pointer to the base FunctionType if ty is the type of a function (or pointer to one), NULL otherwise. 65 const ast::FunctionType * getFunctionType( const ast::Type * ty ); 66 66 67 ///true iff types are structurally identical, where TypeInstType's match any type.68 67 /// Returns true iff types are structurally identical, where TypeInstType's match any type. 68 bool typesPolyCompatible( ast::Type const * lhs, ast::Type const * rhs ); 69 69 70 /// true if arg requires boxing given exprTyVars 71 70 /// Returns true if arg requires boxing given typeVars. 71 bool needsBoxing( const ast::Type * param, const ast::Type * arg, const TypeVarMap & typeVars, const ast::TypeSubstitution * subst ); 72 72 73 /// true if arg requires boxing in the call to appExpr 74 73 /// Returns true if arg requires boxing in the call to appExpr. 74 bool needsBoxing( const ast::Type * param, const ast::Type * arg, const ast::ApplicationExpr * expr, const ast::TypeSubstitution * subst ); 75 75 76 /// Adds the type variable `tyVar` to `tyVarMap` 77 78 76 /// Adds the type variable `type` to `typeVars`. 77 void addToTypeVarMap( const ast::TypeDecl * type, TypeVarMap & typeVars ); 78 void addToTypeVarMap( const ast::TypeInstType * type, TypeVarMap & typeVars ); 79 79 80 /// Adds the declarations in the forall list of type (and its pointed-to type if it's a pointer type) to `tyVarMap` 81 82 80 /// Adds the declarations in the forall list of type (and its pointed-to type if it's a pointer type) to `typeVars`. 81 void makeTypeVarMap( const ast::Type * type, TypeVarMap & typeVars ); 82 void makeTypeVarMap( const ast::FunctionDecl * decl, TypeVarMap & typeVars ); 83 83 84 /// Gets the name of the sizeof parameter for the type, given its mangled name 85 84 /// Gets the name of the sizeof parameter for the type, given its mangled name. 85 inline std::string sizeofName( const std::string &name ) { return std::string( "_sizeof_" ) + name; } 86 86 87 /// Gets the name of the alignof parameter for the type, given its mangled name 88 87 /// Gets the name of the alignof parameter for the type, given its mangled name. 88 inline std::string alignofName( const std::string &name ) { return std::string( "_alignof_" ) + name; } 89 89 90 /// Gets the name of the offsetof parameter for the type, given its mangled name 91 90 /// Gets the name of the offsetof parameter for the type, given its mangled name. 91 inline std::string offsetofName( const std::string &name ) { return std::string( "_offsetof_" ) + name; } 92 92 93 /// Gets the name of the layout function for a given aggregate type, given its declaration 94 95 96 93 /// Gets the name of the layout function for a given aggregate type, given its declaration. 94 inline std::string layoutofName( ast::AggregateDecl const * decl ) { 95 return std::string( "_layoutof_" ) + decl->name; 96 } 97 97 98 98 } // namespace GenPoly
Note: See TracChangeset
for help on using the changeset viewer.