瀏覽代碼

Merge pull request #15735 from ghalliday/issue27133

HPCC-27133 Add eclcc -fgenerateIR option to output IR for a query

Reviewed-By: Shamser Ahmed <shamser.ahmed@lexisnexis.co.uk>
Reviewed-By: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 3 年之前
父節點
當前提交
f97f590407
共有 8 個文件被更改,包括 50 次插入18 次删除
  1. 1 0
      ecl/eclcc/eclcc.hpp
  2. 6 6
      ecl/hql/hqlir.cpp
  3. 8 0
      ecl/hql/hqlir.hpp
  4. 3 0
      ecl/hqlcpp/hqlcpp.cpp
  5. 3 0
      ecl/hqlcpp/hqlcpp.ipp
  6. 12 12
      ecl/hqlcpp/hqlecl.cpp
  7. 11 0
      ecl/hqlcpp/hqlhtcpp.cpp
  8. 6 0
      ecl/hqlcpp/hqlttcpp.cpp

+ 1 - 0
ecl/eclcc/eclcc.hpp

@@ -140,6 +140,7 @@ const char * const helpText[] = {
     "?!  -fcheckAsserts          Check ASSERT() statements",
     "?!  -fcheckDuplicateThreshold=n Warn if SEQUENTIAL or workflow may duplicate more than n%% activities",
     "?!  -fexportDependencies    Generate information about inter-definition dependencies",
+    "!   -fgenerateIR            Output the internal representation for the query to stdout",
     "?!  -fmaxCompileThreads     Number of compiler instances to compile the c++",
     "?!  -fmaxErrors             Maximum number of errors to report",
     "?!  -fnoteRecordSizeInGraph Add estimates of record sizes to the graph",

+ 6 - 6
ecl/hql/hqlir.cpp

@@ -1118,12 +1118,6 @@ IAtom * BinaryIRPlayer::readName()
 //- Text
 //--------------------------------------------------------------------------------------------------------------------
 
-enum
-{
-    TIRexpandSimpleTypes    = 0x00000001,
-    TIRexpandAttributes     = 0x00000002,
-    TIRstripAnnotatations   = 0x00000004,
-};
 class TextIRBuilder : public CInterfaceOf<IEclBuilder>
 {
     class Definition
@@ -2206,6 +2200,12 @@ extern HQL_API void dump_ir(ITypeInfo * type)
     dump_ir(NULL, NULL, type);
 }
 
+void dump_ir_external(const HqlExprArray & exprs, unsigned options)
+{
+    FileIRBuilder output(options, stdout);
+    playIR(output, nullptr, &exprs, nullptr);
+}
+
 extern HQL_API void dump_ir(ITypeInfo * type1, ITypeInfo * type2)
 {
     FileIRBuilder output(defaultDumpOptions, stdout);

+ 8 - 0
ecl/hql/hqlir.hpp

@@ -44,12 +44,20 @@
 
 namespace EclIR
 {
+enum
+{
+    TIRexpandSimpleTypes    = 0x00000001,
+    TIRexpandAttributes     = 0x00000002,
+    TIRstripAnnotatations   = 0x00000004,
+};
+
 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);
+extern HQL_API void dump_ir_external(const HqlExprArray & exprs, unsigned options);
 
 //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);

+ 3 - 0
ecl/hqlcpp/hqlcpp.cpp

@@ -1868,6 +1868,9 @@ void HqlCppTranslator::cacheOptions()
         DebugOption(options.generateDiskFormats, "generateDiskFormats", false),
         DebugOption(options.maxOptimizeSize, "maxOptimizeSize", 5),             // Remove the overhead from very small functions e.g. function prolog
         DebugOption(options.minNoOptimizeSize, "minNoOptimizeSize", 10000),     // functions larger than this will take a long time to optimize, better to not try
+        DebugOption(options.generateIR, "generateIR", false),
+        DebugOption(options.generateIRAfterTransform, "generateIRAfterTransform", false),
+        DebugOption(options.irOptions, "irOptions", EclIR::TIRexpandSimpleTypes),
     };
 
     //get options values from workunit

+ 3 - 0
ecl/hqlcpp/hqlcpp.ipp

@@ -634,6 +634,7 @@ struct HqlCppOptions
     DBZaction           divideByZeroAction;
     unsigned            maxOptimizeSize;
     unsigned            minNoOptimizeSize;
+    unsigned            irOptions;
     bool                peephole;
     bool                foldConstantCast;
     bool                optimizeBoolReturn;
@@ -835,6 +836,8 @@ struct HqlCppOptions
     bool                genericDiskReads;
     bool                generateActivityFormats;
     bool                generateDiskFormats;
+    bool                generateIR;
+    bool                generateIRAfterTransform;
 };
 
 //Any information gathered while processing the query should be moved into here, rather than cluttering up the translator class

+ 12 - 12
ecl/hqlcpp/hqlecl.cpp

@@ -175,18 +175,18 @@ public:
     }
     IMPLEMENT_IINTERFACE
 
-    virtual void addLibrary(const char * name);
-    virtual bool processQuery(OwnedHqlExpr & parsedQuery, EclGenerateTarget _generateTarget);
-    virtual bool generateDll(ICppCompiler * compiler);
-    virtual bool generateExe(ICppCompiler * compiler);
-    virtual bool generatePackage(const char * packageName);
-    virtual void setMaxCompileThreads(unsigned value) { defaultMaxCompileThreads = value; }
-    virtual void addManifest(const char *filename) { code->addManifest(filename, ctxCallback); }
-    virtual void addManifestsFromArchive(IPropertyTree *archive) { code->addManifestsFromArchive(archive, ctxCallback); }
-    virtual void addWebServiceInfo(IPropertyTree *wsinfo){ code->addWebServiceInfo(wsinfo); }
-
-    virtual double getECLcomplexity(IHqlExpression * exprs);
-    virtual void setSaveGeneratedFiles(bool value) { deleteGenerated = !value; }
+    virtual void addLibrary(const char * name) override;
+    virtual bool processQuery(OwnedHqlExpr & parsedQuery, EclGenerateTarget _generateTarget) override;
+    virtual bool generateDll(ICppCompiler * compiler) override;
+    virtual bool generateExe(ICppCompiler * compiler) override;
+    virtual bool generatePackage(const char * packageName) override;
+    virtual void setMaxCompileThreads(unsigned value) override { defaultMaxCompileThreads = value; }
+    virtual void addManifest(const char *filename) override { code->addManifest(filename, ctxCallback); }
+    virtual void addManifestsFromArchive(IPropertyTree *archive) override { code->addManifestsFromArchive(archive, ctxCallback); }
+    virtual void addWebServiceInfo(IPropertyTree *wsinfo) override { code->addWebServiceInfo(wsinfo); }
+    virtual void setSaveGeneratedFiles(bool value) override { deleteGenerated = !value; }
+
+    double getECLcomplexity(IHqlExpression * exprs);
 
 protected:
     void addCppName(const char * filename, unsigned minActivity, unsigned maxActivity);

+ 11 - 0
ecl/hqlcpp/hqlhtcpp.cpp

@@ -5997,6 +5997,17 @@ bool HqlCppTranslator::buildCode(HqlQueryContext & query, const char * embeddedL
     bool ok = prepareToGenerate(query, workflow, (embeddedLibraryName != NULL));
     if (ok)
     {
+        if (options.generateIRAfterTransform)
+        {
+            ForEachItemIn(i, workflow)
+            {
+                WorkflowItem & cur = workflow.item(i);
+                printf("Workflow %u:\n", cur.queryWfid());
+                EclIR::dump_ir_external(cur.queryExprs(), options.irOptions);
+            }
+            return false;
+        }
+
         //This is done late so that pickBestEngine has decided which engine we are definitely targeting.
         if (!embeddedLibraryName)
             updateClusterType();

+ 6 - 0
ecl/hqlcpp/hqlttcpp.cpp

@@ -14308,6 +14308,12 @@ bool HqlCppTranslator::transformGraphForGeneration(HqlQueryContext & query, Work
         curActivityId = creator.queryMaxActivityId();
     }
 
+    if (options.generateIR)
+    {
+        EclIR::dump_ir_external(exprs, options.irOptions);
+        return false;
+    }
+
     applyGlobalOptimizations(exprs);
     if (exprs.ordinality() == 0)
         return false;   // No action needed