Changeset 888cbe4


Ignore:
Timestamp:
Jun 28, 2016, 3:17:26 PM (8 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
e39aa0f
Parents:
4d3ca1d8
Message:

generated labels contain unused attribute and fixed label code gen

Location:
src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/CodeGen/CodeGenerator.cc

    r4d3ca1d8 r888cbe4  
    4848        }
    4949
    50         ostream & CodeGenerator::Indenter::operator()( ostream & output ) {
     50        ostream & CodeGenerator::Indenter::operator()( ostream & output ) const {
    5151          return output << string( cg.cur_indent, ' ' );
    5252        }
    5353
    54         ostream & operator<<( ostream & output, CodeGenerator::Indenter &indent ) {
     54        ostream & operator<<( ostream & output, const CodeGenerator::Indenter &indent ) {
    5555                return indent( output );
    5656        }
    5757
    58         CodeGenerator::CodeGenerator( std::ostream &os ) : indent( *this), cur_indent( 0 ), insideFunction( false ), output( os ) { }
     58        CodeGenerator::LabelPrinter & CodeGenerator::LabelPrinter::operator()( std::list< Label > & l ) {
     59                labels = &l;
     60                return *this;
     61        }
     62
     63        ostream & operator<<( ostream & output, CodeGenerator::LabelPrinter &printLabels ) {
     64                std::list< Label > & labs = *printLabels.labels;
     65                // l.unique(); // assumes a sorted list. Why not use set? Does order matter?
     66                for ( Label & l : labs ) {
     67                        output << l.get_name() + ": ";
     68                        printLabels.cg.genAttributes( l.get_attributes() );
     69                }
     70                return output;
     71        }
     72
     73        CodeGenerator::CodeGenerator( std::ostream &os ) : indent( *this), cur_indent( 0 ), insideFunction( false ), output( os ), printLabels( *this ) { }
    5974
    6075        CodeGenerator::CodeGenerator( std::ostream &os, std::string init, int indentation, bool infunp )
    61                         : indent( *this), cur_indent( indentation ), insideFunction( infunp ), output( os ) {
     76                        : indent( *this), cur_indent( indentation ), insideFunction( infunp ), output( os ), printLabels( *this ) {
    6277                //output << std::string( init );
    6378        }
    6479
    6580        CodeGenerator::CodeGenerator( std::ostream &os, char *init, int indentation, bool infunp )
    66                         : indent( *this ), cur_indent( indentation ), insideFunction( infunp ), output( os ) {
     81                        : indent( *this ), cur_indent( indentation ), insideFunction( infunp ), output( os ), printLabels( *this ) {
    6782                //output << std::string( init );
    6883        }
     
    801816        }
    802817
    803         std::string CodeGenerator::printLabels( std::list< Label > &l ) {
    804                 std::string str( "" );
    805                 l.unique(); // assumes a sorted list. Why not use set?
    806 
    807                 for ( std::list< Label >::iterator i = l.begin(); i != l.end(); i++ )
    808                         str += (*i).get_name() + ": ";
    809 
    810                 return str;
    811         }
    812 
    813818        void CodeGenerator::handleStorageClass( Declaration *decl ) {
    814819                switch ( decl->get_storageClass() ) {
  • src/CodeGen/CodeGenerator.h

    r4d3ca1d8 r888cbe4  
    9494                        Indenter(CodeGenerator &cg) : cg(cg) {}
    9595                        CodeGenerator & cg;
    96                         std::ostream& operator()(std::ostream & os);
     96                        std::ostream& operator()(std::ostream & os) const;
     97                };
     98
     99                struct LabelPrinter {
     100                        LabelPrinter(CodeGenerator &cg) : cg(cg), labels( 0 ) {}
     101                        LabelPrinter & operator()( std::list< Label > & l );
     102                        CodeGenerator & cg;
     103                        std::list< Label > * labels;
    97104                };
    98105
     
    108115                bool insideFunction;
    109116                std::ostream &output;
     117                LabelPrinter printLabels;
    110118
    111119                void printDesignators( std::list< Expression * > & );
    112                 static std::string printLabels ( std::list < Label > & );
    113120                void handleStorageClass( Declaration *decl );
    114121                void handleAggregate( AggregateDecl *aggDecl );
  • src/ControlStruct/LabelGenerator.cc

    r4d3ca1d8 r888cbe4  
    1919#include "LabelGenerator.h"
    2020#include "SynTree/Label.h"
     21#include "SynTree/Attribute.h"
    2122
    2223namespace ControlStruct {
     
    3435                os << "__L" << current++ << "__" << suffix;
    3536                std::string ret = os.str();
    36                 return Label( ret );
     37                Label l( ret );
     38                l.get_attributes().push_back( new Attribute("unused") );
     39                return l;
    3740        }
    3841} // namespace ControlStruct
Note: See TracChangeset for help on using the changeset viewer.