瀏覽代碼

HPCC-24408 Allow extern "C" OPTIMIZE to be generated

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 5 年之前
父節點
當前提交
56374840a5

+ 4 - 0
ecl/hqlcpp/hqlcatom.cpp

@@ -52,6 +52,8 @@ IAtom * dictionaryAtom;
 IAtom * eclAtom;
 IAtom * endAtom;
 IAtom * ensureCapacityAtom;
+IAtom * externAtom;
+IAtom * externCAtom;
 IAtom * fileAtom;
 IAtom * funnelAtom;
 IAtom * forceAllCheckAtom;
@@ -1469,6 +1471,8 @@ MODULE_INIT(INIT_PRIORITY_HQLATOM-1)
     MAKEATOM(ecl);
     MAKEATOM(end);
     MAKEATOM(ensureCapacity);
+    MAKEATOM(extern);
+    MAKEATOM(externC);
     MAKEATOM(file);
     MAKEATOM(forceAllCheck);
     MAKEATOM(funnel);

+ 2 - 0
ecl/hqlcpp/hqlcatom.hpp

@@ -50,6 +50,8 @@ extern IAtom * dictionaryAtom;
 extern IAtom * eclAtom;
 extern IAtom * endAtom;
 extern IAtom * ensureCapacityAtom;
+extern IAtom * externAtom;
+extern IAtom * externCAtom;
 extern IAtom * fileAtom;
 extern IAtom * forceAllCheckAtom;
 extern IAtom * funnelAtom;

+ 2 - 0
ecl/hqlcpp/hqlcpp.ipp

@@ -20,6 +20,7 @@
 #include <stdio.h>
 
 #include "jfile.hpp"
+#include "jexcept.hpp"
 #include "hqlattr.hpp"
 #include "hqlcpp.hpp"
 #include "hqlstmt.ipp"
@@ -463,6 +464,7 @@ public:
     unsigned numStmts() const;
     void setIncomplete(bool value);
     void setIncluded(bool value);
+    void addOption(IAtom * name) { dbgassertex(stmt); stmt->addOption(name); }
 
     inline bool isExecutedOnce() const { return (flags & MFsingle) != 0; }
 

+ 12 - 10
ecl/hqlcpp/hqlhtcpp.cpp

@@ -2461,8 +2461,9 @@ void ActivityInstance::buildSuffix()
             addConstructorMetaParameter();
 
             StringBuffer s;
-            s.append("extern \"C\" ECL_API IHThorArg * ").append(factoryName).append("()");
-            globalctx.addQuotedFunction(s, true);
+            s.append("IHThorArg * ").append(factoryName).append("()");
+            IHqlStmt * stmt = globalctx.addQuotedFunction(s, true);
+            stmt->addOption(externCAtom);
             OwnedHqlExpr call = translator.bindFunctionCall(implementationClassName, constructorArgs);
 
             //Don't call buildReturn because we're lying about the return type, and we don't want a boolean temporary created.
@@ -11238,17 +11239,18 @@ IWUResult * HqlCppTranslator::createDatasetResultSchema(IHqlExpression * sequenc
 
             BuildCtx transformctx(*code, declareAtom);
             transformctx.setNextPriority(RecordTranslatorPrio);
-            s.clear().append("extern \"C\" ECL_API size32_t ").append(name).append("(ARowBuilder & crSelf, const byte * src)");
+            s.clear().append("size32_t ").append(name).append("(ARowBuilder & crSelf, const byte * src)");
 
-            MemberFunction tranformFunc(*this, transformctx, s, MFdynamicproto);
+            MemberFunction transformFunc(*this, transformctx, s, MFdynamicproto);
+            transformFunc.addOption(externCAtom);
 
-            BoundRow * selfCursor = bindSelf(tranformFunc.ctx, tds, "crSelf");
-            bindTableCursor(tranformFunc.ctx, ds, "src", no_left, seq);
-            associateSkipReturnMarker(tranformFunc.ctx, queryZero(), selfCursor);
-            ensureRowAllocated(tranformFunc.ctx, "crSelf");
+            BoundRow * selfCursor = bindSelf(transformFunc.ctx, tds, "crSelf");
+            bindTableCursor(transformFunc.ctx, ds, "src", no_left, seq);
+            associateSkipReturnMarker(transformFunc.ctx, queryZero(), selfCursor);
+            ensureRowAllocated(transformFunc.ctx, "crSelf");
 
-            doTransform(tranformFunc.ctx, transform, selfCursor);
-            buildReturnRecordSize(tranformFunc.ctx, selfCursor);
+            doTransform(transformFunc.ctx, transform, selfCursor);
+            buildReturnRecordSize(transformFunc.ctx, selfCursor);
 
             result->setResultTransformerEntry(name.str());
         }

+ 9 - 0
ecl/hqlcpp/hqlstmt.cpp

@@ -1226,6 +1226,11 @@ void HqlStmt::addExpr(IHqlExpression * expr)
     exprs.append(*expr);
 }
 
+void HqlStmt::addOption(IAtom * name)
+{
+    addExpr(createAttribute(name));
+}
+
 StmtKind HqlStmt::getStmt() const
 {
     return (StmtKind)kind;
@@ -1251,6 +1256,10 @@ static bool isEmptyGroup(IHqlStmt * stmt)
 
 StringBuffer & HqlStmt::appendTextPrefix(StringBuffer & out) const
 {
+    if (hasAttribute(externAtom, exprs))
+        out.append("extern ");
+    if (hasAttribute(externCAtom, exprs))
+        out.append("extern \"C\" ECL_API ");
     if (noOptimize)
         out.append("NOOPTIMIZE ");
     if (optimize)

+ 1 - 0
ecl/hqlcpp/hqlstmt.hpp

@@ -228,6 +228,7 @@ public:
     virtual void            setIncomplete(bool incomplete) = 0;
     virtual void            setIncluded(bool _included) = 0;
     virtual void            finishedFramework() = 0;
+    virtual void            addOption(IAtom * name) = 0;
 };
 
 class HqlCppTranslator;

+ 1 - 0
ecl/hqlcpp/hqlstmt.ipp

@@ -43,6 +43,7 @@ public:
             bool                    isIncomplete()  { return incomplete; }
             unsigned                queryPriority() { return priority; }
     virtual void                    mergeScopeWithContainer()  override {}
+    virtual void                    addOption(IAtom * name) override;
     virtual void                    setIncomplete(bool _incomplete) override { incomplete = _incomplete; }
     virtual void                    setIncluded(bool _included) override { included = _included; }
     virtual void                    setForceOptimize(bool value) override;

+ 1 - 1
ecl/hqlcpp/hqlwcpp.cpp

@@ -1751,7 +1751,7 @@ void HqlCppWriter::generateStmt(IHqlStmt * stmt)
                     indent(-1);
                     indent().append("}");
                     IHqlExpression * extra = stmt->queryExpr(0);
-                    if (extra)
+                    if (extra && !extra->isAttribute())
                         generateExprCpp(extra);
                     newline();
                 }