source: src/GenPoly/GenPoly.h @ a46f7b6

ADTast-experimental
Last change on this file since a46f7b6 was c8837e5, checked in by Andrew Beach <ajbeach@…>, 2 years ago

Rewrite in GenPoly? to avoid mixing new AST and TyVarMap? (which internally has old AST code). Some nearby functions got writen out even though they are not used, and hence not tested.

  • Property mode set to 100644
File size: 7.7 KB
RevLine 
[51587aa]1//
2// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
[33a7b6d]7// GenPoly.h --
[51587aa]8//
9// Author           : Richard C. Bilson
10// Created On       : Mon May 18 07:44:20 2015
[3606fe4]11// Last Modified By : Andrew Beach
[c8837e5]12// Last Modified On : Fri Oct  7 15:06:00 2022
13// Update Count     : 9
[51587aa]14//
[51b7345]15
[6b0b624]16#pragma once
[b1a6d6b]17
[08fc48f]18#include <iostream>               // for ostream
19#include <string>                 // for string, allocator, operator+, basic...
[ffad73a]20
[08fc48f]21#include "ErasableScopedMap.h"    // for ErasableScopedMap
[c8837e5]22#include "AST/Decl.hpp"           // for TypeDecl::Data
23#include "AST/Fwd.hpp"            // for ApplicationExpr, BaseInstType, Func...
[08fc48f]24#include "SymTab/Mangler.h"       // for Mangler
25#include "SynTree/Declaration.h"  // for TypeDecl::Data, AggregateDecl, Type...
26#include "SynTree/SynTree.h"      // for Visitor Nodes
[51b7345]27
28namespace GenPoly {
[bdf1954]29
[3606fe4]30        // TODO Via some tricks this works for ast::TypeDecl::Data as well.
[490fb92e]31        typedef ErasableScopedMap< std::string, TypeDecl::Data > TyVarMap;
[c8837e5]32        using TypeVarMap = ErasableScopedMap< std::string, ast::TypeDecl::Data >;
[3606fe4]33
[c2ad3c9]34        /// Replaces a TypeInstType by its referrent in the environment, if applicable
35        Type* replaceTypeInst( Type* type, const TypeSubstitution* env );
[33a7b6d]36
[ffad73a]37        /// returns polymorphic type if is polymorphic type, NULL otherwise; will look up substitution in env if provided
[0f889a77]38        Type *isPolyType( Type *type, const TypeSubstitution *env = 0 );
[490fb92e]39        const ast::Type * isPolyType(const ast::Type * type, const ast::TypeSubstitution * env = nullptr);
[33a7b6d]40
[0f889a77]41        /// returns polymorphic type if is polymorphic type in tyVars, NULL otherwise; will look up substitution in env if provided
[ffad73a]42        Type *isPolyType( Type *type, const TyVarMap &tyVars, const TypeSubstitution *env = 0 );
[c8837e5]43        const ast::Type * isPolyType( const ast::Type * type, const TypeVarMap & typeVars, const ast::TypeSubstitution * subst = nullptr );
[ffad73a]44
[3bb195cb]45        /// returns dynamic-layout type if is dynamic-layout type in tyVars, NULL otherwise; will look up substitution in env if provided
[33a7b6d]46        ReferenceToType *isDynType( Type *type, const TyVarMap &tyVars, const TypeSubstitution *env = 0 );
[c8837e5]47        const ast::BaseInstType *isDynType( const ast::Type * type, const TypeVarMap & typeVars, const ast::TypeSubstitution * subst = 0 );
[3bb195cb]48
49        /// true iff function has dynamic-layout return type under the given type variable map
50        ReferenceToType *isDynRet( FunctionType *function, const TyVarMap &tyVars );
[c8837e5]51        const ast::BaseInstType *isDynRet( const ast::FunctionType * type, const TypeVarMap & typeVars );
[3bb195cb]52
53        /// true iff function has dynamic-layout return type under the type variable map generated from its forall-parameters
54        ReferenceToType *isDynRet( FunctionType *function );
55
56        /// A function needs an adapter if it returns a dynamic-layout value or if any of its parameters have dynamic-layout type
57        bool needsAdapter( FunctionType *adaptee, const TyVarMap &tyVarr );
[c8837e5]58        bool needsAdapter( ast::FunctionType const * adaptee, const TypeVarMap & typeVars );
[3bb195cb]59
[ffad73a]60        /// returns polymorphic type if is pointer to polymorphic type, NULL otherwise; will look up substitution in env if provided
[0f889a77]61        Type *isPolyPtr( Type *type, const TypeSubstitution *env = 0 );
[33a7b6d]62
[0f889a77]63        /// returns polymorphic type if is pointer to polymorphic type in tyVars, NULL otherwise; will look up substitution in env if provided
[ffad73a]64        Type *isPolyPtr( Type *type, const TyVarMap &tyVars, const TypeSubstitution *env = 0 );
[c8837e5]65        const ast::Type * isPolyPtr( const ast::Type * type, const TypeVarMap & typeVars, const ast::TypeSubstitution * env = 0 );
[ffad73a]66
[8488c715]67        /// if the base type (after dereferencing N >= 0 pointers) is a polymorphic type, returns the base type, NULL otherwise;
68        /// N will be stored in levels, if provided, will look up substitution in env if provided
69        Type *hasPolyBase( Type *type, int *levels = 0, const TypeSubstitution *env = 0 );
[05d47278]70
[8488c715]71        /// if the base type (after dereferencing N >= 0 pointers) is a polymorphic type in tyVars, returns the base type, NULL otherwise;
72        /// N will be stored in levels, if provided, will look up substitution in env if provided
73        Type *hasPolyBase( Type *type, const TyVarMap &tyVars, int *levels = 0, const TypeSubstitution *env = 0 );
[c8837e5]74        const ast::Type * hasPolyBase( const ast::Type * type, const TypeVarMap & typeVars, int * levels = 0, const ast::TypeSubstitution * env = 0 );
[05d47278]75
[08fc48f]76        /// true iff this type or some base of this type after dereferencing pointers is either polymorphic or a generic type with at least one
[5a3ac84]77        /// polymorphic parameter; will look up substitution in env if provided.
78        bool includesPolyType( Type *type, const TypeSubstitution *env = 0 );
79
[08fc48f]80        /// true iff this type or some base of this type after dereferencing pointers is either polymorphic in tyVars, or a generic type with
[5a3ac84]81        /// at least one polymorphic parameter in tyVars; will look up substitution in env if provided.
82        bool includesPolyType( Type *type, const TyVarMap &tyVars, const TypeSubstitution *env = 0 );
83
[7754cde]84        /// Returns a pointer to the base FunctionType if ty is the type of a function (or pointer to one), NULL otherwise
[05d47278]85        FunctionType *getFunctionType( Type *ty );
[d76c588]86        const ast::FunctionType * getFunctionType( const ast::Type * ty );
[05d47278]87
[8488c715]88        /// If expr (after dereferencing N >= 0 pointers) is a variable expression, returns the variable expression, NULL otherwise;
89        /// N will be stored in levels, if provided
90        VariableExpr *getBaseVar( Expression *expr, int *levels = 0 );
[7754cde]91
[5a3ac84]92        /// true iff types are structurally identical, where TypeInstType's match any type.
93        bool typesPolyCompatible( Type *aty, Type *bty );
[3606fe4]94        bool typesPolyCompatible( ast::Type const * lhs, ast::Type const * rhs );
[5a3ac84]95
[ae1b9ea]96        /// true if arg requires boxing given exprTyVars
[02fdb8e]97        bool needsBoxing( Type * param, Type * arg, const TyVarMap &exprTyVars, const TypeSubstitution * env );
[c8837e5]98        bool needsBoxing( const ast::Type * param, const ast::Type * arg, const TypeVarMap & typeVars, const ast::TypeSubstitution * subst );
[ae1b9ea]99
100        /// true if arg requires boxing in the call to appExpr
[02fdb8e]101        bool needsBoxing( Type * param, Type * arg, ApplicationExpr * appExpr, const TypeSubstitution * env );
[c8837e5]102        bool needsBoxing( const ast::Type * param, const ast::Type * arg, const ast::ApplicationExpr * expr, const ast::TypeSubstitution * subst );
[ae1b9ea]103
[2c57025]104        /// Adds the type variable `tyVar` to `tyVarMap`
105        void addToTyVarMap( TypeDecl * tyVar, TyVarMap &tyVarMap );
[c8837e5]106        void addToTypeVarMap( const ast::TypeDecl * type, TypeVarMap & typeVars );
[2c57025]107
[aadc9a4]108        /// Adds the declarations in the forall list of type (and its pointed-to type if it's a pointer type) to `tyVarMap`
109        void makeTyVarMap( Type *type, TyVarMap &tyVarMap );
[c8837e5]110        void makeTypeVarMap( const ast::Type * type, TypeVarMap & typeVars );
[33a7b6d]111
[ffad73a]112        /// Prints type variable map
[01aeade]113        void printTyVarMap( std::ostream &os, const TyVarMap &tyVarMap );
[c8837e5]114        void printTypeVarMap( std::ostream &os, const TypeVarMap & typeVars );
[ffad73a]115
[adc6781]116        /// Gets the mangled name of this type; alias for SymTab::Mangler::mangleType().
117        inline std::string mangleType( Type *ty ) { return SymTab::Mangler::mangleType( ty ); }
[33a7b6d]118
[adc6781]119        /// Gets the name of the sizeof parameter for the type, given its mangled name
120        inline std::string sizeofName( const std::string &name ) { return std::string( "_sizeof_" ) + name; }
121
122        /// Gets the name of the alignof parameter for the type, given its mangled name
123        inline std::string alignofName( const std::string &name ) { return std::string( "_alignof_" ) + name; }
[ffad73a]124
[adc6781]125        /// Gets the name of the offsetof parameter for the type, given its mangled name
126        inline std::string offsetofName( const std::string &name ) { return std::string( "_offsetof_" ) + name; }
[05d47278]127
[adc6781]128        /// Gets the name of the layout function for a given aggregate type, given its declaration
129        inline std::string layoutofName( AggregateDecl *decl ) { return std::string( "_layoutof_" ) + decl->get_name(); }
[33a7b6d]130
[51b7345]131} // namespace GenPoly
[b1a6d6b]132
[51587aa]133// Local Variables: //
134// tab-width: 4 //
135// mode: c++ //
136// compile-command: "make install" //
137// End: //
Note: See TracBrowser for help on using the repository browser.