tdf#100883 - opencl impls. that use SEH are still bad.

Amazingly we fell-back to the old calculation path for
crashes in older LibreOffices.

Change-Id: Ia182f7a25c5560b68494d5cdd68e02925bfd5845
Reviewed-on: https://gerrit.libreoffice.org/27169
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
diff --git a/desktop/source/app/opencl.cxx b/desktop/source/app/opencl.cxx
index 09f2204..2b8d6d6 100644
--- a/desktop/source/app/opencl.cxx
+++ b/desktop/source/app/opencl.cxx
@@ -46,6 +46,8 @@ bool testOpenCLCompute(const Reference< XDesktop2 > &xDesktop, const OUString &r
    bool bSuccess = false;
    css::uno::Reference< css::lang::XComponent > xComponent;

    sal_uInt64 nKernelFailures = opencl::kernelFailures;

    SAL_INFO("opencl", "Starting CL test spreadsheet");

    try {
@@ -95,11 +97,21 @@ bool testOpenCLCompute(const Reference< XDesktop2 > &xDesktop, const OUString &r
        SAL_WARN("opencl", "OpenCL testing failed - disabling: " << e.Message);
    }

    if (nKernelFailures != opencl::kernelFailures)
    {
        // tdf#
        SAL_WARN("opencl", "OpenCL kernels failed to compile, "
                 "or took SEH exceptions "
                 << nKernelFailures << " != " << opencl::kernelFailures);
        bSuccess = false;
    }

    if (!bSuccess)
        OpenCLZone::hardDisable();
    if (xComponent.is())
        xComponent->dispose();


    return bSuccess;
}

diff --git a/include/opencl/openclwrapper.hxx b/include/opencl/openclwrapper.hxx
index b173d89..afd34c6 100644
--- a/include/opencl/openclwrapper.hxx
+++ b/include/opencl/openclwrapper.hxx
@@ -53,6 +53,7 @@ struct OPENCL_DLLPUBLIC GPUEnv
};

extern OPENCL_DLLPUBLIC GPUEnv gpuEnv;
extern OPENCL_DLLPUBLIC sal_uInt64 kernelFailures;

OPENCL_DLLPUBLIC bool generatBinFromKernelSource( cl_program program, const char * clFileName );
OPENCL_DLLPUBLIC bool buildProgramFromBinary(const char* buildOption, GPUEnv* gpuEnv, const char* filename, int idx);
diff --git a/opencl/source/openclwrapper.cxx b/opencl/source/openclwrapper.cxx
index a54e94d..123c2c9 100644
--- a/opencl/source/openclwrapper.cxx
+++ b/opencl/source/openclwrapper.cxx
@@ -58,6 +58,7 @@ using namespace std;
namespace opencl {

GPUEnv gpuEnv;
sal_uInt64 kernelFailures = 0;

namespace {

diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx
index fbd4b0a..6be5dec 100644
--- a/sc/source/core/opencl/formulagroupcl.cxx
+++ b/sc/source/core/opencl/formulagroupcl.cxx
@@ -4053,6 +4053,7 @@ DynamicKernel* DynamicKernel::create( const ScCalcConfig& rConfig, ScTokenArray&
    catch (...)
    {
        SAL_WARN("sc.opencl", "Dynamic formula compiler: unhandled compiler error");
        ::opencl::kernelFailures++;
        return nullptr;
    }
    return pDynamicKernel;
@@ -4163,21 +4164,25 @@ public:
        catch (const UnhandledToken& ut)
        {
            SAL_WARN("sc.opencl", "Dynamic formula compiler: unhandled token: " << ut.mMessage << " at " << ut.mFile << ":" << ut.mLineNumber);
            ::opencl::kernelFailures++;
            return CLInterpreterResult();
        }
        catch (const OpenCLError& oce)
        {
            SAL_WARN("sc.opencl", "Dynamic formula compiler: OpenCL error from " << oce.mFunction << ": " << ::opencl::errorString(oce.mError) << " at " << oce.mFile << ":" << oce.mLineNumber);
            ::opencl::kernelFailures++;
            return CLInterpreterResult();
        }
        catch (const Unhandled& uh)
        {
            SAL_WARN("sc.opencl", "Dynamic formula compiler: unhandled case at " << uh.mFile << ":" << uh.mLineNumber);
            ::opencl::kernelFailures++;
            return CLInterpreterResult();
        }
        catch (...)
        {
            SAL_WARN("sc.opencl", "Dynamic formula compiler: unhandled compiler error");
            ::opencl::kernelFailures++;
            return CLInterpreterResult();
        }