source: src/GenPoly/ScrubTyVars.h@ affb51b

ADT ast-experimental
Last change on this file since affb51b was c8837e5, checked in by Andrew Beach <ajbeach@…>, 3 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: 6.0 KB
Line 
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//
7// ScrubTyVars.h --
8//
9// Author : Richard C. Bilson
10// Created On : Mon May 18 07:44:20 2015
11// Last Modified By : Andrew Beach
12// Last Modified On : Fri Oct 7 15:51:00 2022
13// Update Count : 4
14//
15
16#pragma once
17
18#include <cassert> // for assert
19
20#include "AST/Fwd.hpp" // for Node
21#include "Common/PassVisitor.h"
22#include "GenPoly.h" // for TyVarMap, isPolyType, isDynType
23#include "SynTree/Mutator.h" // for Mutator
24#include "SynTree/Type.h" // for Type (ptr only), PointerType (ptr only)
25
26class AlignofExpr;
27class Expression;
28class SizeofExpr;
29
30namespace GenPoly {
31 struct ScrubTyVars : public WithVisitorRef<ScrubTyVars>, public WithShortCircuiting, public WithGuards {
32 /// Whether to scrub all type variables from the provided map, dynamic type variables from the provided map, or all type variables
33 enum ScrubMode { FromMap, DynamicFromMap, All };
34
35 ScrubTyVars() : tyVars(nullptr), mode( All ) {}
36
37 ScrubTyVars( const TyVarMap &tyVars, ScrubMode mode = FromMap ): tyVars( &tyVars ), mode( mode ) {}
38
39 public:
40 /// For all polymorphic types with type variables in `tyVars`, replaces generic types, dtypes, and ftypes with the appropriate void type,
41 /// and sizeof/alignof expressions with the proper variable
42 template< typename SynTreeClass >
43 static SynTreeClass *scrub( SynTreeClass *target, const TyVarMap &tyVars );
44
45 /// For all dynamic-layout types with type variables in `tyVars`, replaces generic types, dtypes, and ftypes with the appropriate void type,
46 /// and sizeof/alignof expressions with the proper variable
47 template< typename SynTreeClass >
48 static SynTreeClass *scrubDynamic( SynTreeClass *target, const TyVarMap &tyVars );
49
50 /// For all polymorphic types, replaces generic types, dtypes, and ftypes with the appropriate void type,
51 /// and sizeof/alignof expressions with the proper variable
52 template< typename SynTreeClass >
53 static SynTreeClass *scrubAll( SynTreeClass *target );
54
55 /// determine if children should be visited based on whether base type should be scrubbed.
56 void primeBaseScrub( Type * );
57
58 void premutate( TypeInstType * ) { visit_children = false; }
59 void premutate( StructInstType * ) { visit_children = false; }
60 void premutate( UnionInstType * ) { visit_children = false; }
61 void premutate( SizeofExpr * szeof ) { primeBaseScrub( szeof->type ); }
62 void premutate( AlignofExpr * algnof ) { primeBaseScrub( algnof->type ); }
63 void premutate( PointerType * pointer ) { primeBaseScrub( pointer->base ); }
64
65 Type * postmutate( TypeInstType * typeInst );
66 Type * postmutate( StructInstType * structInst );
67 Type * postmutate( UnionInstType * unionInst );
68 Expression * postmutate( SizeofExpr * szeof );
69 Expression * postmutate( AlignofExpr * algnof );
70 Type * postmutate( PointerType * pointer );
71
72 private:
73 /// Returns the type if it should be scrubbed, NULL otherwise.
74 Type* shouldScrub( Type *ty ) {
75 switch ( mode ) {
76 case FromMap: return isPolyType( ty, *tyVars );
77 case DynamicFromMap: return isDynType( ty, *tyVars );
78 case All: return isPolyType( ty );
79 }
80 assert(false); return nullptr; // unreachable
81 // return dynamicOnly ? isDynType( ty, tyVars ) : isPolyType( ty, tyVars );
82 }
83
84 /// Mutates (possibly generic) aggregate types appropriately
85 Type* mutateAggregateType( Type *ty );
86
87 const TyVarMap *tyVars; ///< Type variables to scrub
88 ScrubMode mode; ///< which type variables to scrub? [FromMap]
89
90 Type * dynType = nullptr; ///< result of shouldScrub
91 };
92
93 template< typename SynTreeClass >
94 SynTreeClass * ScrubTyVars::scrub( SynTreeClass *target, const TyVarMap &tyVars ) {
95 PassVisitor<ScrubTyVars> scrubber( tyVars );
96 return static_cast< SynTreeClass * >( target->acceptMutator( scrubber ) );
97 }
98
99 template< typename SynTreeClass >
100 SynTreeClass * ScrubTyVars::scrubDynamic( SynTreeClass *target, const TyVarMap &tyVars ) {
101 PassVisitor<ScrubTyVars> scrubber( tyVars, ScrubTyVars::DynamicFromMap );
102 return static_cast< SynTreeClass * >( target->acceptMutator( scrubber ) );
103 }
104
105 template< typename SynTreeClass >
106 SynTreeClass * ScrubTyVars::scrubAll( SynTreeClass *target ) {
107 PassVisitor<ScrubTyVars> scrubber;
108 return static_cast< SynTreeClass * >( target->acceptMutator( scrubber ) );
109 }
110
111/// For all polymorphic types with type variables in `typeVars`,
112/// replaces generic types, dtypes, and ftypes with the appropriate void type,
113/// and sizeof/alignof expressions with the proper variable.
114template<typename node_t>
115node_t const * scrubTypeVars(
116 node_t const * target, const TypeVarMap & typeVars ) {
117 return strict_dynamic_cast<node_t const *>(
118 scrubTypeVars<ast::Node>( target ) );
119}
120
121/// For all dynamic-layout types with type variables in `typeVars`,
122/// replaces generic types, dtypes, and ftypes with the appropriate void type,
123/// and sizeof/alignof expressions with the proper variable.
124template<typename node_t>
125ast::Node const * scrubTypeVarsDynamic(
126 node_t const * target, const TypeVarMap & typeVars ) {
127 return strict_dynamic_cast<node_t const *>(
128 scrubTypeVarsDynamic<ast::Node>( target, typeVars ) );
129}
130
131/// For all polymorphic types, replaces generic types, with the appropriate
132/// void type, and sizeof/alignof expressions with the proper variable.
133template<typename node_t>
134node_t const * scrubAllTypeVars( node_t const * target ) {
135 return strict_dynamic_cast<node_t const *>(
136 scrubAllTypeVars<ast::Node>( target ) );
137}
138
139// We specialize for Node as a base case.
140template<>
141ast::Node const * scrubTypeVars<ast::Node>(
142 const ast::Node * target, const TypeVarMap & typeVars );
143
144template<>
145ast::Node const * scrubTypeVarsDynamic<ast::Node>(
146 ast::Node const * target, const TypeVarMap & typeVars );
147
148template<>
149ast::Node const * scrubAllTypeVars<ast::Node>( const ast::Node * target );
150
151} // namespace GenPoly
152
153// Local Variables: //
154// tab-width: 4 //
155// mode: c++ //
156// compile-command: "make install" //
157// End: //
Note: See TracBrowser for help on using the repository browser.