Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Validate.cc

    r8686f31 r1869adf  
    1010// Created On       : Sun May 17 21:50:04 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Tue Jul 07 10:41:23 2015
    13 // Update Count     : 136
     12// Last Modified On : Wed Jun 24 16:20:50 2015
     13// Update Count     : 30
    1414//
    1515
     
    5252#include "UniqueName.h"
    5353#include "AddVisit.h"
    54 #include "MakeLibCfa.h"
    5554
    5655
     
    127126                std::list< Declaration * > &get_declsToAdd() { return declsToAdd; }
    128127 
    129                 virtual void visit( EnumDecl *enumDecl );
    130128                virtual void visit( StructDecl *structDecl );
    131129                virtual void visit( UnionDecl *structDecl );
     
    293291 
    294292                for ( std::list< Declaration * >::iterator i = enumDecl->get_members().begin(); i != enumDecl->get_members().end(); ++i ) {
    295                         ObjectDecl * obj = dynamic_cast< ObjectDecl * >( *i );
     293                        ObjectDecl *obj = dynamic_cast< ObjectDecl * >( *i );
    296294                        assert( obj );
    297                         // obj->set_type( new EnumInstType( Type::Qualifiers( true, false, false, false, false, false ), enumDecl->get_name() ) );
    298                         BasicType * enumType = new BasicType( Type::Qualifiers(), BasicType::SignedInt );
    299                         obj->set_type( enumType ) ;
     295                        obj->set_type( new EnumInstType( Type::Qualifiers( true, false, false, false, false, false ), enumDecl->get_name() ) );
    300296                } // for
    301297                Parent::visit( enumDecl );
     
    547543        }
    548544
    549         //E ?=?(E volatile*, int),
    550         //  ?=?(E _Atomic volatile*, int);
    551         void makeEnumAssignment( EnumDecl *enumDecl, EnumInstType *refType, unsigned int functionNesting, std::list< Declaration * > &declsToAdd ) {
    552                 FunctionType *assignType = new FunctionType( Type::Qualifiers(), false );
    553  
    554                 ObjectDecl *returnVal = new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, refType->clone(), 0 );
    555                 assignType->get_returnVals().push_back( returnVal );
    556 
    557                 // need two assignment operators with different types
    558                 FunctionType * assignType2 = assignType->clone();
    559 
    560                 // E ?=?(E volatile *, E)
    561                 Type *etype = refType->clone();
    562                 // etype->get_qualifiers() += Type::Qualifiers(false, true, false, false, false, false);
    563 
    564                 ObjectDecl *dstParam = new ObjectDecl( "_dst", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), etype ), 0 );
    565                 assignType->get_parameters().push_back( dstParam );
    566 
    567                 ObjectDecl *srcParam = new ObjectDecl( "_src", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, etype->clone(), 0 );
    568                 assignType->get_parameters().push_back( srcParam );
    569 
    570                 // E ?=?(E volatile *, int)
    571                 assignType2->get_parameters().push_back( dstParam->clone() );
    572                 BasicType * paramType = new BasicType(Type::Qualifiers(), BasicType::SignedInt);
    573                 ObjectDecl *srcParam2 = new ObjectDecl( "_src", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, paramType, 0 );
    574                 assignType2->get_parameters().push_back( srcParam2 );
    575 
    576                 // Routines at global scope marked "static" to prevent multiple definitions is separate translation units
    577                 // because each unit generates copies of the default routines for each aggregate.
    578 
    579                 // since there is no definition, these should not be inline
    580                 // make these intrinsic so that the code generator does not make use of them
    581                 FunctionDecl *assignDecl = new FunctionDecl( "?=?", functionNesting > 0 ? DeclarationNode::NoStorageClass : DeclarationNode::Static, LinkageSpec::Intrinsic, assignType, 0, false, false );
    582                 assignDecl->fixUniqueId();
    583                 FunctionDecl *assignDecl2 = new FunctionDecl( "?=?", functionNesting > 0 ? DeclarationNode::NoStorageClass : DeclarationNode::Static, LinkageSpec::Intrinsic, assignType2, 0, false, false );
    584                 assignDecl2->fixUniqueId();
    585 
    586                 std::list< Declaration * > assigns;
    587                 assigns.push_back( assignDecl );
    588                 assigns.push_back( assignDecl2 );
    589 
    590                 LibCfa::makeLibCfa( assigns );
    591 
    592                 // need to remove the prototypes, since these can appear nested in a routine
    593                 for (int start = 0, end = assigns.size()/2; start < end; start++) {
    594                         delete assigns.front();
    595                         assigns.pop_front();
    596                 }
    597 
    598                 declsToAdd.insert( declsToAdd.begin(), assigns.begin(), assigns.end() );
    599 
    600                 // return assignDecl;
    601         }
    602 
    603 
    604545        Declaration *makeStructAssignment( StructDecl *aggregateDecl, StructInstType *refType, unsigned int functionNesting ) {
    605546                FunctionType *assignType = new FunctionType( Type::Qualifiers(), false );
     
    671612 
    672613                return assignDecl;
    673         }
    674 
    675         void AddStructAssignment::visit( EnumDecl *enumDecl ) {
    676                 if ( ! enumDecl->get_members().empty() ) {
    677                         EnumInstType *enumInst = new EnumInstType( Type::Qualifiers(), enumDecl->get_name() );
    678                         // enumInst->set_baseEnum( enumDecl );
    679                         // declsToAdd.push_back(
    680                         makeEnumAssignment( enumDecl, enumInst, functionNesting, declsToAdd );
    681                 }
    682614        }
    683615
Note: See TracChangeset for help on using the changeset viewer.