source: src/SynTree/GcTracer.h @ 2efe4b8

new-envwith_gc
Last change on this file since 2efe4b8 was 2efe4b8, checked in by Aaron Moss <a3moss@…>, 4 years ago

Assorted GC bugfixes

  • Property mode set to 100644
File size: 3.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// GcTracer.h --
8//
9// Author           : Aaron B. Moss
10// Created On       : Thu Mar 15 14:47:00 2018
11// Last Modified By : Aaron B. Moss
12// Last Modified On : Thu Mar 15 14:47:00 2018
13// Update Count     : 1
14//
15
16#pragma once
17
18#include <list>
19
20#include "BaseSyntaxNode.h"
21#include "Expression.h"
22#include "Label.h"
23#include "Type.h"
24
25#include "Common/GC.h"
26#include "Common/PassVisitor.h"
27
28class Expression;
29
30/// Implements `trace` method for syntax nodes
31class GcTracer final : public WithShortCircuiting, public WithVisitorRef<GcTracer> {
32        const GC& gc;
33
34public:
35        GcTracer( const GC& gc ) : gc(gc) {}
36
37        // mark node and children
38
39        void previsit( BaseSyntaxNode * node ) {
40                // skip tree if already seen
41                if ( node->mark == gc.mark ) {
42                        visit_children = false;
43                        return;
44                }
45
46                // mark node
47                node->mark = gc.mark;
48        }
49
50        // add visits left out by PassVisitor
51
52        void postvisit( Constant* con ) {
53                maybeAccept( con->get_type(), *visitor );
54        }
55
56        void postvisit( AggregateDecl* decl ) {
57                acceptAll( decl->attributes, *visitor );
58        }
59
60        void postvisit( DeclarationWithType* decl ) {
61                maybeAccept( decl->asmName, *visitor );
62        }
63
64private:
65        void visit( InferredParams& inferParams ) {
66                for ( auto& entry : inferParams ) {
67                        maybeAccept( entry.second.actualType, *visitor );
68                        maybeAccept( entry.second.formalType, *visitor );
69                        maybeAccept( entry.second.expr, *visitor );
70                        visit( *entry.second.inferParams );
71                }
72        }
73
74public:
75        void postvisit( Expression* expr ) {
76                maybeAccept( expr->env, *visitor );
77                visit( expr->inferParams );
78        }
79
80        void postvisit( UniqueExpr* expr ) {
81                postvisit( static_cast<Expression*>(expr) );
82                maybeAccept( expr->object, *visitor );
83                maybeAccept( expr->var, *visitor );
84        }
85
86        void postvisit( UntypedExpr* expr ) {
87                postvisit( static_cast<Expression*>(expr) );
88                maybeAccept( expr->function, *visitor );
89        }
90
91        void postvisit( VariableExpr* expr ) {
92                postvisit( static_cast<Expression*>(expr) );
93                maybeAccept( expr->var, *visitor );  // not in PassVisitor because it causes cycle
94        }
95
96private:
97        void visit( Label& lbl ) {
98                acceptAll( lbl.get_attributes(), *visitor );
99                maybeAccept( lbl.get_statement(), *visitor );  // xxx - not sure this is needed...
100        }
101
102public:
103        void postvisit( Statement* stmt ) {
104                for ( Label& l : stmt->labels ) {
105                        visit( l );
106                }
107        }
108
109        void postvisit( Type* type ) {
110                acceptAll( type->attributes, *visitor );
111        }
112
113        void postvisit( PointerType* type ) {
114                postvisit( static_cast<Type*>(type) );
115                maybeAccept( type->dimension, *visitor );
116        }
117};
118
119/// Traces entire translation unit recursively
120static inline const GC& operator<< ( const GC& gc, const std::list<Declaration*>& translationUnit ) {
121        PassVisitor<GcTracer> tracer{ gc };
122        acceptAll( const_cast<std::list<Declaration*>&>( translationUnit ), tracer );
123        return gc;
124}
125
126// Local Variables: //
127// tab-width: 4 //
128// mode: c++ //
129// compile-command: "make install" //
130// End: //
Note: See TracBrowser for help on using the repository browser.