Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/ScrubTyVars.cc

    rc6b4432 r2f61765  
    2121#include "ScrubTyVars.h"
    2222#include "SymTab/Mangler.h"             // for mangleType
     23#include "SynTree/Declaration.h"        // for TypeDecl, TypeDecl::Data, Typ...
     24#include "SynTree/Expression.h"         // for Expression (ptr only), NameExpr
     25#include "SynTree/Mutator.h"            // for Mutator
     26#include "SynTree/Type.h"               // for PointerType, TypeInstType, Type
    2327
    2428namespace GenPoly {
     29        Type * ScrubTyVars::postmutate( TypeInstType * typeInst ) {
     30                if ( ! tyVars ) {
     31                        if ( typeInst->get_isFtype() ) {
     32                                delete typeInst;
     33                                return new PointerType( Type::Qualifiers(), new FunctionType( Type::Qualifiers(), true ) );
     34                        } else {
     35                                PointerType * ret = new PointerType( Type::Qualifiers(), new VoidType( typeInst->get_qualifiers() ) );
     36                                delete typeInst;
     37                                return ret;
     38                        }
     39                }
     40
     41                TyVarMap::const_iterator tyVar = tyVars->find( typeInst->name );
     42                if ( tyVar != tyVars->end() ) {
     43                        switch ( tyVar->second.kind ) {
     44                          case TypeDecl::Dtype:
     45                          case TypeDecl::Ttype:
     46                                {
     47                                        PointerType * ret = new PointerType( Type::Qualifiers(), new VoidType( typeInst->get_qualifiers() ) );
     48                                        delete typeInst;
     49                                        return ret;
     50                                }
     51                          case TypeDecl::Ftype:
     52                                delete typeInst;
     53                                return new PointerType( Type::Qualifiers(), new FunctionType( Type::Qualifiers(), true ) );
     54                          default:
     55                                assertf(false, "Unhandled tyvar kind: %d", tyVar->second.kind);
     56                        } // switch
     57                } // if
     58                return typeInst;
     59        }
     60
     61        Type * ScrubTyVars::mutateAggregateType( Type * ty ) {
     62                if ( shouldScrub( ty ) ) {
     63                        PointerType * ret = new PointerType( Type::Qualifiers(), new VoidType( ty->get_qualifiers() ) );
     64                        delete ty;
     65                        return ret;
     66                }
     67                return ty;
     68        }
     69
     70        Type * ScrubTyVars::postmutate( StructInstType * structInst ) {
     71                return mutateAggregateType( structInst );
     72        }
     73
     74        Type * ScrubTyVars::postmutate( UnionInstType * unionInst ) {
     75                return mutateAggregateType( unionInst );
     76        }
     77
     78        void ScrubTyVars::primeBaseScrub( Type * type ) {
     79                // need to determine whether type needs to be scrubbed to determine whether
     80                // automatic recursion is necessary
     81                if ( Type * t = shouldScrub( type ) ) {
     82                        visit_children = false;
     83                        GuardValue( dynType );
     84                        dynType = t;
     85                }
     86        }
     87
     88        Expression * ScrubTyVars::postmutate( SizeofExpr * szeof ) {
     89                // sizeof( T ) => _sizeof_T parameter, which is the size of T
     90                if ( dynType ) {
     91                        Expression *expr = new NameExpr( sizeofName( mangleType( dynType ) ) );
     92                        return expr;
     93                } // if
     94                return szeof;
     95        }
     96
     97        Expression * ScrubTyVars::postmutate( AlignofExpr * algnof ) {
     98                // alignof( T ) => _alignof_T parameter, which is the alignment of T
     99                if ( dynType ) {
     100                        Expression *expr = new NameExpr( alignofName( mangleType( dynType ) ) );
     101                        return expr;
     102                } // if
     103                return algnof;
     104        }
     105
     106        Type * ScrubTyVars::postmutate( PointerType * pointer ) {
     107                if ( dynType ) {
     108                        Type * ret = dynType->acceptMutator( *visitor );
     109                        ret->get_qualifiers() |= pointer->get_qualifiers();
     110                        pointer->base = nullptr;
     111                        delete pointer;
     112                        return ret;
     113                }
     114                return pointer;
     115        }
    25116
    26117namespace {
Note: See TracChangeset for help on using the changeset viewer.