Changeset 5cbacf1


Ignore:
Timestamp:
Jul 30, 2018, 4:43:48 PM (6 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, no_list, persistent-indexer, pthread-emulation, qualifiedEnum
Children:
ba4a1d8
Parents:
05e6eb5
git-author:
Rob Schluntz <rschlunt@…> (07/30/18 16:30:06)
git-committer:
Rob Schluntz <rschlunt@…> (07/30/18 16:43:48)
Message:

Refactor eval into Common

Location:
src
Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • src/Common/module.mk

    r05e6eb5 r5cbacf1  
    1919       Common/DebugMalloc.cc \
    2020       Common/Assert.cc \
    21        Common/Heap.cc
     21       Common/Heap.cc \
     22       Common/Eval.cc
  • src/Common/utility.h

    r05e6eb5 r5cbacf1  
    3131#include "Common/Indenter.h"
    3232
     33class Expression;
     34
    3335template< typename T >
    3436static inline T * maybeClone( const T *orig ) {
     
    456458} // ilog2
    457459
     460// -----------------------------------------------------------------------------
     461/// evaluates expr as a long long int. If second is false, expr could not be evaluated
     462std::pair<long long int, bool> eval(Expression * expr);
    458463
    459464// Local Variables: //
  • src/Makefile.in

    r05e6eb5 r5cbacf1  
    169169        Common/driver_cfa_cpp-Assert.$(OBJEXT) \
    170170        Common/driver_cfa_cpp-Heap.$(OBJEXT) \
     171        Common/driver_cfa_cpp-Eval.$(OBJEXT) \
    171172        ControlStruct/driver_cfa_cpp-LabelGenerator.$(OBJEXT) \
    172173        ControlStruct/driver_cfa_cpp-LabelFixer.$(OBJEXT) \
     
    494495        Concurrency/Waitfor.cc Common/SemanticError.cc \
    495496        Common/UniqueName.cc Common/DebugMalloc.cc Common/Assert.cc \
    496         Common/Heap.cc ControlStruct/LabelGenerator.cc \
     497        Common/Heap.cc Common/Eval.cc ControlStruct/LabelGenerator.cc \
    497498        ControlStruct/LabelFixer.cc ControlStruct/MLEMutator.cc \
    498499        ControlStruct/Mutate.cc ControlStruct/ForExprMutator.cc \
     
    683684        Common/$(DEPDIR)/$(am__dirstamp)
    684685Common/driver_cfa_cpp-Heap.$(OBJEXT): Common/$(am__dirstamp) \
     686        Common/$(DEPDIR)/$(am__dirstamp)
     687Common/driver_cfa_cpp-Eval.$(OBJEXT): Common/$(am__dirstamp) \
    685688        Common/$(DEPDIR)/$(am__dirstamp)
    686689ControlStruct/$(am__dirstamp):
     
    994997@AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-Assert.Po@am__quote@
    995998@AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-DebugMalloc.Po@am__quote@
     999@AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-Eval.Po@am__quote@
    9961000@AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-Heap.Po@am__quote@
    9971001@AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-SemanticError.Po@am__quote@
     
    13591363@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Common/driver_cfa_cpp-Heap.obj `if test -f 'Common/Heap.cc'; then $(CYGPATH_W) 'Common/Heap.cc'; else $(CYGPATH_W) '$(srcdir)/Common/Heap.cc'; fi`
    13601364
     1365Common/driver_cfa_cpp-Eval.o: Common/Eval.cc
     1366@am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Common/driver_cfa_cpp-Eval.o -MD -MP -MF Common/$(DEPDIR)/driver_cfa_cpp-Eval.Tpo -c -o Common/driver_cfa_cpp-Eval.o `test -f 'Common/Eval.cc' || echo '$(srcdir)/'`Common/Eval.cc
     1367@am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) Common/$(DEPDIR)/driver_cfa_cpp-Eval.Tpo Common/$(DEPDIR)/driver_cfa_cpp-Eval.Po
     1368@AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='Common/Eval.cc' object='Common/driver_cfa_cpp-Eval.o' libtool=no @AMDEPBACKSLASH@
     1369@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1370@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Common/driver_cfa_cpp-Eval.o `test -f 'Common/Eval.cc' || echo '$(srcdir)/'`Common/Eval.cc
     1371
     1372Common/driver_cfa_cpp-Eval.obj: Common/Eval.cc
     1373@am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Common/driver_cfa_cpp-Eval.obj -MD -MP -MF Common/$(DEPDIR)/driver_cfa_cpp-Eval.Tpo -c -o Common/driver_cfa_cpp-Eval.obj `if test -f 'Common/Eval.cc'; then $(CYGPATH_W) 'Common/Eval.cc'; else $(CYGPATH_W) '$(srcdir)/Common/Eval.cc'; fi`
     1374@am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) Common/$(DEPDIR)/driver_cfa_cpp-Eval.Tpo Common/$(DEPDIR)/driver_cfa_cpp-Eval.Po
     1375@AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='Common/Eval.cc' object='Common/driver_cfa_cpp-Eval.obj' libtool=no @AMDEPBACKSLASH@
     1376@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1377@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Common/driver_cfa_cpp-Eval.obj `if test -f 'Common/Eval.cc'; then $(CYGPATH_W) 'Common/Eval.cc'; else $(CYGPATH_W) '$(srcdir)/Common/Eval.cc'; fi`
     1378
    13611379ControlStruct/driver_cfa_cpp-LabelGenerator.o: ControlStruct/LabelGenerator.cc
    13621380@am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT ControlStruct/driver_cfa_cpp-LabelGenerator.o -MD -MP -MF ControlStruct/$(DEPDIR)/driver_cfa_cpp-LabelGenerator.Tpo -c -o ControlStruct/driver_cfa_cpp-LabelGenerator.o `test -f 'ControlStruct/LabelGenerator.cc' || echo '$(srcdir)/'`ControlStruct/LabelGenerator.cc
  • src/Validate/HandleAttributes.cc

    r05e6eb5 r5cbacf1  
    1616#include "HandleAttributes.h"
    1717
    18 #include <utility> // for pair
    19 
    2018#include "CompilationState.h"
    2119#include "Common/PassVisitor.h"
    2220#include "Common/SemanticError.h"
    23 #include "InitTweak/InitTweak.h"
    2421#include "ResolvExpr/Resolver.h"
    2522#include "SynTree/Attribute.h"
     
    2926namespace Validate {
    3027        namespace {
    31                 std::pair<long long int, bool> eval(Expression * expr);
    32 
    33                 struct Eval : public WithShortCircuiting {
    34                         long long int value = 0;
    35                         bool valid = true;
    36 
    37                         void previsit( BaseSyntaxNode * ) { visit_children = false; }
    38                         void postvisit( BaseSyntaxNode * ) { valid = false; }
    39 
    40                         void postvisit( ConstantExpr * expr ) {
    41                                 value = expr->intValue();
    42                         }
    43 
    44                         void postvisit( CastExpr * expr ) {
    45                                 auto arg = eval(expr->arg);
    46                                 valid = arg.second;
    47                                 value = arg.first;
    48                                 // TODO: perform type conversion on value if valid
    49                         }
    50 
    51                         void postvisit( VariableExpr * expr ) {
    52                                 if ( EnumInstType * inst = dynamic_cast<EnumInstType *>(expr->result) ) {
    53                                         if ( EnumDecl * decl = inst->baseEnum ) {
    54                                                 if ( decl->valueOf( expr->var, value ) ) { // value filled by valueOf
    55                                                         return;
    56                                                 }
    57                                         }
    58                                 }
    59                                 valid = false;
    60                         }
    61 
    62                         void postvisit( ApplicationExpr * expr ) {
    63                                 DeclarationWithType * function = InitTweak::getFunction(expr);
    64                                 if ( ! function || function->linkage != LinkageSpec::Intrinsic ) { valid = false; return; }
    65                                 const std::string & fname = function->name;
    66                                 assertf( expr->args.size() == 1 || expr->args.size() == 2, "Intrinsic function with %zd arguments: %s", expr->args.size(), fname.c_str() );
    67                                 std::pair<long long int, bool> arg1, arg2;
    68                                 arg1 = eval(expr->args.front());
    69                                 valid = valid && arg1.second;
    70                                 if ( ! valid ) return;
    71                                 if ( expr->args.size() == 2 ) {
    72                                         arg2 = eval(expr->args.back());
    73                                         valid = valid && arg2.second;
    74                                         if ( ! valid ) return;
    75                                 }
    76                                 if (fname == "?+?") {
    77                                         value = arg1.first + arg2.first;
    78                                 } else if (fname == "?-?") {
    79                                         value = arg1.first - arg2.first;
    80                                 } else if (fname == "?*?") {
    81                                         value = arg1.first * arg2.first;
    82                                 } else if (fname == "?/?") {
    83                                         value = arg1.first / arg2.first;
    84                                 } else if (fname == "?%?") {
    85                                         value = arg1.first % arg2.first;
    86                                 } else {
    87                                         valid = false;
    88                                 }
    89                                 // TODO: implement other intrinsic functions
    90                         }
    91                 };
    92 
    93                 std::pair<long long int, bool> eval(Expression * expr) {
    94                         PassVisitor<Eval> ev;
    95                         if (expr) {
    96                                 expr->accept(ev);
    97                                 return std::make_pair(ev.pass.value, ev.pass.valid);
    98                         } else {
    99                                 return std::make_pair(0, false);
    100                         }
    101                 }
    102 
    10328                struct HandleAttributes : public WithIndexer {
    10429                        void previsit( ObjectDecl * decl );
Note: See TracChangeset for help on using the changeset viewer.