Changeset 25a1cb0 for src/AST


Ignore:
Timestamp:
Sep 1, 2020, 1:18:10 PM (5 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
86c1f1c3, a77496cb
Parents:
8d8ac3b (diff), d3aa64f1 (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.
Message:

Merge branch 'master' of plg.uwaterloo.ca:software/cfa/cfa-cc

Location:
src/AST
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • src/AST/Convert.cpp

    r8d8ac3b r25a1cb0  
    705705                        new KeywordCastExpr(
    706706                                get<Expression>().accept1(node->arg),
    707                                 castTarget
     707                                castTarget,
     708                                {node->concrete_target.field, node->concrete_target.getter}
    708709                        )
    709710                );
     
    20872088                                old->location,
    20882089                                GET_ACCEPT_1(arg, Expr),
    2089                                 castTarget
     2090                                castTarget,
     2091                                {old->concrete_target.field, old->concrete_target.getter}
    20902092                        )
    20912093                );
  • src/AST/Copy.hpp

    r8d8ac3b r25a1cb0  
    2121#include "Stmt.hpp"
    2222#include "Type.hpp"
     23#include <unordered_set>
     24#include <unordered_map>
    2325
    2426namespace ast {
  • src/AST/Expr.hpp

    r8d8ac3b r25a1cb0  
    312312public:
    313313        ptr<Expr> arg;
     314        struct Concrete {
     315                std::string field;
     316                std::string getter;
     317
     318                Concrete() = default;
     319                Concrete(const Concrete &) = default;
     320        };
    314321        ast::AggregateDecl::Aggregate target;
     322        Concrete concrete_target;
     323
    315324
    316325        KeywordCastExpr( const CodeLocation & loc, const Expr * a, ast::AggregateDecl::Aggregate t )
    317326        : Expr( loc ), arg( a ), target( t ) {}
     327
     328        KeywordCastExpr( const CodeLocation & loc, const Expr * a, ast::AggregateDecl::Aggregate t, const Concrete & ct )
     329        : Expr( loc ), arg( a ), target( t ), concrete_target( ct ) {}
    318330
    319331        /// Get a name for the target type
  • src/AST/Pass.hpp

    r8d8ac3b r25a1cb0  
    266266
    267267/// Keep track of the polymorphic const TypeSubstitution * env for the current expression
     268
     269/// marker to force shallow copies in pass visit
     270struct PureVisitor {};
     271
    268272struct WithConstTypeSubstitution {
    269273        const TypeSubstitution * env = nullptr;
  • src/AST/Pass.impl.hpp

    r8d8ac3b r25a1cb0  
    2121
    2222#include "AST/TypeSubstitution.hpp"
     23// #include "AST/Copy.hpp"
    2324
    2425#define VISIT_START( node ) \
     
    5758
    5859namespace ast {
     60        template<typename node_t>
     61        node_t * shallowCopy( const node_t * node );
     62
    5963        namespace __pass {
    6064                // Check if this is either a null pointer or a pointer to an empty container
     
    6266                static inline bool empty( T * ptr ) {
    6367                        return !ptr || ptr->empty();
     68                }
     69
     70                template< typename core_t, typename node_t >
     71                static inline node_t* mutate(const node_t *node) {
     72                        return std::is_base_of<PureVisitor, core_t>::value ? ::ast::shallowCopy(node) : ::ast::mutate(node);
    6473                }
    6574
     
    320329
    321330                if( __pass::differs(old_val, new_val) ) {
    322                         auto new_parent = mutate(parent);
     331                        // auto new_parent = mutate(parent);
     332                        auto new_parent = __pass::mutate<core_t>(parent);
    323333                        new_parent->*child = new_val;
    324334                        parent = new_parent;
     
    334344                        if ( node->forall.empty() ) return;
    335345
    336                         node_t * mut = mutate( node );
     346                        node_t * mut = __pass::mutate<core_t>( node );
    337347                        mut->forall = subs->clone( node->forall, *this );
    338348                        node = mut;
     
    894904
    895905                if(mutated) {
    896                         auto n = mutate(node);
     906                        auto n = __pass::mutate<core_t>(node);
    897907                        n->clauses = std::move( new_clauses );
    898908                        node = n;
     
    904914                        auto nval = call_accept( node->field ); \
    905915                        if(nval != node->field ) { \
    906                                 auto nparent = mutate(node); \
     916                                auto nparent = __pass::mutate<core_t>(node); \
    907917                                nparent->field = nval; \
    908918                                node = nparent; \
     
    16101620
    16111621                if(mutated) {
    1612                         auto n = mutate(node);
     1622                        auto n = __pass::mutate<core_t>(node);
    16131623                        n->associations = std::move( new_kids );
    16141624                        node = n;
     
    19401950                        }
    19411951                        if (mutated) {
    1942                                 auto new_node = mutate( node );
     1952                                auto new_node = __pass::mutate<core_t>( node );
    19431953                                new_node->typeEnv.swap( new_map );
    19441954                                node = new_node;
     
    19561966                        }
    19571967                        if (mutated) {
    1958                                 auto new_node = mutate( node );
     1968                                auto new_node = __pass::mutate<core_t>( node );
    19591969                                new_node->varEnv.swap( new_map );
    19601970                                node = new_node;
  • src/AST/Pass.proto.hpp

    r8d8ac3b r25a1cb0  
    2222template<typename core_t>
    2323class Pass;
     24
     25struct PureVisitor;
    2426
    2527namespace __pass {
  • src/AST/Print.cpp

    r8d8ac3b r25a1cb0  
    2121#include "Type.hpp"
    2222#include "TypeSubstitution.hpp"
     23#include "CompilationState.h"
    2324
    2425#include "Common/utility.h" // for group_iterate
     
    239240
    240241                if ( node->result ) {
    241                         os << endl << indent << "... with resolved type:" << endl;
    242                         ++indent;
    243                         os << indent;
    244                         node->result->accept( *this );
    245                         --indent;
     242                        if (!deterministic_output) {
     243                                os << endl << indent << "... with resolved type:" << endl;
     244                                ++indent;
     245                                os << indent;
     246                                node->result->accept( *this );
     247                                --indent;
     248                        }
    246249                }
    247250
  • src/AST/TypeSubstitution.hpp

    r8d8ac3b r25a1cb0  
    159159
    160160// definitition must happen after PassVisitor is included so that WithGuards can be used
    161 struct TypeSubstitution::Substituter : public WithGuards, public WithVisitorRef<Substituter> {
     161struct TypeSubstitution::Substituter : public WithGuards, public WithVisitorRef<Substituter>, public PureVisitor {
    162162                static size_t traceId;
    163163
     
    187187        assert( input );
    188188        Pass<Substituter> sub( *this, false );
    189         input = strict_dynamic_cast< const SynTreeClass * >( deepCopy(input)->accept( sub ) );
     189//      input = strict_dynamic_cast< const SynTreeClass * >( deepCopy(input)->accept( sub ) );
     190        input = strict_dynamic_cast< const SynTreeClass * >( input->accept( sub ) );
    190191        return { input, sub.core.subCount };
    191192}
     
    195196        assert( input );
    196197        Pass<Substituter> sub( *this, true );
    197         input = strict_dynamic_cast< const SynTreeClass * >( deepCopy(input)->accept( sub ) );
     198//      input = strict_dynamic_cast< const SynTreeClass * >( deepCopy(input)->accept( sub ) );
     199        input = strict_dynamic_cast< const SynTreeClass * >( input->accept( sub ) );
    198200        return { input, sub.core.subCount };
    199201}
  • src/AST/module.mk

    r8d8ac3b r25a1cb0  
    1717SRC_AST = \
    1818        AST/AssertAcyclic.cpp \
     19        AST/AssertAcyclic.hpp \
    1920        AST/Attribute.cpp \
     21        AST/Attribute.hpp \
     22        AST/Bitfield.hpp \
     23        AST/Chain.hpp \
    2024        AST/Convert.cpp \
     25        AST/Convert.hpp \
     26        AST/Copy.hpp \
     27        AST/CVQualifiers.hpp \
    2128        AST/Decl.cpp \
     29        AST/Decl.hpp \
    2230        AST/DeclReplacer.cpp \
     31        AST/DeclReplacer.hpp \
     32        AST/Eval.hpp \
    2333        AST/Expr.cpp \
     34        AST/Expr.hpp \
    2435        AST/ForallSubstitutionTable.cpp \
     36        AST/ForallSubstitutionTable.hpp \
     37        AST/ForallSubstitutor.hpp \
     38        AST/FunctionSpec.hpp \
     39        AST/Fwd.hpp \
    2540        AST/GenericSubstitution.cpp \
     41        AST/GenericSubstitution.hpp \
    2642        AST/Init.cpp \
     43        AST/Init.hpp \
     44        AST/Label.hpp \
    2745        AST/LinkageSpec.cpp \
     46        AST/LinkageSpec.hpp \
    2847        AST/Node.cpp \
     48        AST/Node.hpp \
     49        AST/ParseNode.hpp \
    2950        AST/Pass.cpp \
     51        AST/Pass.hpp \
     52        AST/Pass.impl.hpp \
     53        AST/Pass.proto.hpp \
    3054        AST/Print.cpp \
     55        AST/Print.hpp \
    3156        AST/Stmt.cpp \
     57        AST/Stmt.hpp \
     58        AST/StorageClasses.hpp \
    3259        AST/SymbolTable.cpp \
     60        AST/SymbolTable.hpp \
    3361        AST/Type.cpp \
     62        AST/Type.hpp \
    3463        AST/TypeEnvironment.cpp \
    35         AST/TypeSubstitution.cpp
     64        AST/TypeEnvironment.hpp \
     65        AST/TypeSubstitution.cpp \
     66        AST/TypeSubstitution.hpp \
     67        AST/Visitor.hpp
    3668
    3769SRC += $(SRC_AST)
Note: See TracChangeset for help on using the changeset viewer.