Преглед на файлове

Merge pull request #3817 from ghalliday/issue8361b

HPCC-8361 Improvements to IR generator

Reviewed-By: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman преди 12 години
родител
ревизия
1acf4ecce5
променени са 2 файла, в които са добавени 91 реда и са изтрити 14 реда
  1. 77 14
      ecl/hql/hqlir.cpp
  2. 14 0
      ecl/hql/hqlir.hpp

+ 77 - 14
ecl/hql/hqlir.cpp

@@ -1721,6 +1721,7 @@ public:
     }
 
     void play(IHqlExpression * expr);
+    void play(ITypeInfo * type);
 
 protected:
     id_t processType(ITypeInfo * type);
@@ -1743,6 +1744,12 @@ void ExpressionIRPlayer::play(IHqlExpression * expr)
     target->addReturn(id);
 }
 
+void ExpressionIRPlayer::play(ITypeInfo * type)
+{
+    id_t id = processType(type);
+    target->addReturn(id);
+}
+
 //----
 
 id_t ExpressionIRPlayer::processType(ITypeInfo * type)
@@ -1819,6 +1826,7 @@ id_t ExpressionIRPlayer::doProcessType(ITypeInfo * type)
         case type_transform:
         case type_table:    // more??
         case type_groupedtable:
+        case type_dictionary:
             {
                 CompoundTypeBuilderInfo info;
                 info.baseType = processType(type->queryChildType());
@@ -1826,8 +1834,6 @@ id_t ExpressionIRPlayer::doProcessType(ITypeInfo * type)
             }
         case type_function:
             return target->addUnknownType(tc);
-        case type_dictionary:
-            return target->addUnknownType(tc);
         case type_none:
         case type_ifblock:
         case type_alias:
@@ -2013,37 +2019,79 @@ extern HQL_API void testIR(IHqlExpression * expr)
     assertex(expr == result);
 }
 
-extern HQL_API void dump_ir(IHqlExpression * expr)
+//-- Dump the IR for the expression(s)/type to stdout ----------------------------------------------------------------
+
+static void playIR(IEclBuilder & output, IHqlExpression * expr, const HqlExprArray * exprs, ITypeInfo * type)
+{
+    ExpressionIRPlayer reader(&output);
+    if (expr)
+        reader.play(expr);
+    if (exprs)
+    {
+        ForEachItemIn(i, *exprs)
+            reader.play(&exprs->item(i));
+    }
+    if (type)
+        reader.play(type);
+}
+
+static void dump_ir(IHqlExpression * expr, const HqlExprArray * exprs, ITypeInfo * type)
 {
     printf("\nIR Expression Dumper\n====================\n");
     FileIRBuilder output(defaultDumpOptions, stdout);
-    ExpressionIRPlayer reader(&output);
-    reader.play(expr);
+    playIR(output, expr, exprs, type);
+}
+
+extern HQL_API void dump_ir(IHqlExpression * expr)
+{
+    dump_ir(expr, NULL, NULL);
 }
 
 extern HQL_API void dump_ir(const HqlExprArray & exprs)
 {
-    printf("\nIR Expression Dumper\n====================\n");
+    dump_ir(NULL, &exprs, NULL);
+}
+
+extern HQL_API void dump_ir(ITypeInfo * type)
+{
+    dump_ir(NULL, NULL, type);
+}
+
+extern HQL_API void dump_ir(ITypeInfo * type1, ITypeInfo * type2)
+{
+    FileIRBuilder output(defaultDumpOptions, stdout);
+    ExpressionIRPlayer reader(&output);
+    reader.play(type1);
+    reader.play(type2);
+}
+
+extern HQL_API void dump_ir(IHqlExpression * expr1, IHqlExpression * expr2)
+{
     FileIRBuilder output(defaultDumpOptions, stdout);
     ExpressionIRPlayer reader(&output);
-    ForEachItemIn(i, exprs)
-        reader.play(&exprs.item(i));
+    reader.play(expr1);
+    reader.play(expr2);
 }
 
+//-- Dump the IR for the expression(s)/type to DBGLOG ----------------------------------------------------------------
+
 extern HQL_API void dbglogIR(IHqlExpression * expr)
 {
     DblgLogIRBuilder output(defaultDumpOptions);
-    ExpressionIRPlayer reader(&output);
-    reader.play(expr);
+    playIR(output, expr, NULL, NULL);
 }
 
 
 extern HQL_API void dbglogIR(const HqlExprArray & exprs)
 {
     DblgLogIRBuilder output(defaultDumpOptions);
-    ExpressionIRPlayer reader(&output);
-    ForEachItemIn(i, exprs)
-        reader.play(&exprs.item(i));
+    playIR(output, NULL, &exprs, NULL);
+}
+
+extern HQL_API void dbglogIR(ITypeInfo * type)
+{
+    DblgLogIRBuilder output(defaultDumpOptions);
+    playIR(output, NULL, NULL, type);
 }
 
 extern HQL_API void getIRText(StringBuffer & target, unsigned options, IHqlExpression * expr)
@@ -2053,13 +2101,28 @@ extern HQL_API void getIRText(StringBuffer & target, unsigned options, IHqlExpre
     reader.play(expr);
 }
 
-static void getIRText(StringArray & target, unsigned options, IHqlExpression * expr)
+extern HQL_API void getIRText(StringArray & target, unsigned options, IHqlExpression * expr)
 {
     StringArrayIRBuilder output(target, options);
     ExpressionIRPlayer reader(&output);
     reader.play(expr);
 }
 
+static StringBuffer staticDebuggingStringBuffer;
+extern HQL_API const char * getIRText(IHqlExpression * expr)
+{
+    StringBufferIRBuilder output(staticDebuggingStringBuffer, defaultDumpOptions);
+    playIR(output, expr, NULL, NULL);
+    return staticDebuggingStringBuffer.str();
+}
+
+extern HQL_API const char * getIRText(ITypeInfo * type)
+{
+    StringBufferIRBuilder output(staticDebuggingStringBuffer, defaultDumpOptions);
+    playIR(output, NULL, NULL, type);
+    return staticDebuggingStringBuffer.str();
+}
+
 } // end namespace
 
 

+ 14 - 0
ecl/hql/hqlir.hpp

@@ -48,10 +48,24 @@ extern HQL_API const char * getOperatorIRText(node_operator op);
 extern HQL_API const char * getTypeIRText(type_t type);
 
 extern HQL_API void dump_ir(IHqlExpression * expr);
+extern HQL_API void dump_ir(ITypeInfo * type);
 extern HQL_API void dump_ir(const HqlExprArray & exprs);
+
+//The following are useful for finding the differences between two types or expressions - the output between the two returns
+extern HQL_API void dump_ir(ITypeInfo * type1, ITypeInfo * type2);
+extern HQL_API void dump_ir(IHqlExpression * expr1, IHqlExpression * expr2);
+
 extern HQL_API void dbglogIR(IHqlExpression * expr);
+extern HQL_API void dbglogIR(ITypeInfo * type);
 extern HQL_API void dbglogIR(const HqlExprArray & exprs);
 
+extern HQL_API void getIRText(StringBuffer & target, unsigned options, IHqlExpression * expr);
+extern HQL_API void getIRText(StringArray & target, unsigned options, IHqlExpression * expr);
+
+//These functions are not thread safe, they are only designed to be called from within a debugger
+extern HQL_API const char * getIRText(IHqlExpression * expr);
+extern HQL_API const char * getIRText(ITypeInfo * type);
+
 } // namespace EclIR
 
 #endif /* HQLIR_INCL */