Changeset 5cbacf1
- Timestamp:
- Jul 30, 2018, 4:43:48 PM (7 years ago)
- 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)
- Location:
- src
- Files:
-
- 1 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified src/Common/module.mk ¶
r05e6eb5 r5cbacf1 19 19 Common/DebugMalloc.cc \ 20 20 Common/Assert.cc \ 21 Common/Heap.cc 21 Common/Heap.cc \ 22 Common/Eval.cc -
TabularUnified src/Common/utility.h ¶
r05e6eb5 r5cbacf1 31 31 #include "Common/Indenter.h" 32 32 33 class Expression; 34 33 35 template< typename T > 34 36 static inline T * maybeClone( const T *orig ) { … … 456 458 } // ilog2 457 459 460 // ----------------------------------------------------------------------------- 461 /// evaluates expr as a long long int. If second is false, expr could not be evaluated 462 std::pair<long long int, bool> eval(Expression * expr); 458 463 459 464 // Local Variables: // -
TabularUnified src/Makefile.in ¶
r05e6eb5 r5cbacf1 169 169 Common/driver_cfa_cpp-Assert.$(OBJEXT) \ 170 170 Common/driver_cfa_cpp-Heap.$(OBJEXT) \ 171 Common/driver_cfa_cpp-Eval.$(OBJEXT) \ 171 172 ControlStruct/driver_cfa_cpp-LabelGenerator.$(OBJEXT) \ 172 173 ControlStruct/driver_cfa_cpp-LabelFixer.$(OBJEXT) \ … … 494 495 Concurrency/Waitfor.cc Common/SemanticError.cc \ 495 496 Common/UniqueName.cc Common/DebugMalloc.cc Common/Assert.cc \ 496 Common/Heap.cc Co ntrolStruct/LabelGenerator.cc \497 Common/Heap.cc Common/Eval.cc ControlStruct/LabelGenerator.cc \ 497 498 ControlStruct/LabelFixer.cc ControlStruct/MLEMutator.cc \ 498 499 ControlStruct/Mutate.cc ControlStruct/ForExprMutator.cc \ … … 683 684 Common/$(DEPDIR)/$(am__dirstamp) 684 685 Common/driver_cfa_cpp-Heap.$(OBJEXT): Common/$(am__dirstamp) \ 686 Common/$(DEPDIR)/$(am__dirstamp) 687 Common/driver_cfa_cpp-Eval.$(OBJEXT): Common/$(am__dirstamp) \ 685 688 Common/$(DEPDIR)/$(am__dirstamp) 686 689 ControlStruct/$(am__dirstamp): … … 994 997 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-Assert.Po@am__quote@ 995 998 @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@ 996 1000 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-Heap.Po@am__quote@ 997 1001 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-SemanticError.Po@am__quote@ … … 1359 1363 @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` 1360 1364 1365 Common/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 1372 Common/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 1361 1379 ControlStruct/driver_cfa_cpp-LabelGenerator.o: ControlStruct/LabelGenerator.cc 1362 1380 @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 -
TabularUnified src/Validate/HandleAttributes.cc ¶
r05e6eb5 r5cbacf1 16 16 #include "HandleAttributes.h" 17 17 18 #include <utility> // for pair19 20 18 #include "CompilationState.h" 21 19 #include "Common/PassVisitor.h" 22 20 #include "Common/SemanticError.h" 23 #include "InitTweak/InitTweak.h"24 21 #include "ResolvExpr/Resolver.h" 25 22 #include "SynTree/Attribute.h" … … 29 26 namespace Validate { 30 27 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 valid49 }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 valueOf55 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 functions90 }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 103 28 struct HandleAttributes : public WithIndexer { 104 29 void previsit( ObjectDecl * decl );
Note: See TracChangeset
for help on using the changeset viewer.