Revert "IVGCVSW-2056 + IVGCVSW-2064 : move ClContextControl to the ClBackend"

This reverts commit d4dfa684941a21314b70593d01b0fc2167eebad4.

Change-Id: Id61ce69215505c3cf5d30ec2a7ec9127fb2554fc
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e8d00de..48176c1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -154,7 +154,6 @@
     include/armnn/ILayerSupport.hpp
     include/armnn/INetwork.hpp
     include/armnn/IProfiler.hpp
-    include/armnn/IBackend.hpp
     include/armnn/IRuntime.hpp
     include/armnn/LayerSupport.hpp
     include/armnn/LstmParams.hpp
diff --git a/include/armnn/ArmNN.hpp b/include/armnn/ArmNN.hpp
index a9bb451..f03b79d 100644
--- a/include/armnn/ArmNN.hpp
+++ b/include/armnn/ArmNN.hpp
@@ -7,7 +7,6 @@
 #include "BackendId.hpp"
 #include "Descriptors.hpp"
 #include "Exceptions.hpp"
-#include "IBackend.hpp"
 #include "IRuntime.hpp"
 #include "INetwork.hpp"
 #include "LayerSupport.hpp"
diff --git a/include/armnn/IBackend.hpp b/include/armnn/IBackend.hpp
deleted file mode 100644
index 34df91c..0000000
--- a/include/armnn/IBackend.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#pragma once
-
-#include "BackendId.hpp"
-
-namespace armnn
-{
-
-class IBackend
-{
-protected:
-    IBackend() {}
-    virtual ~IBackend() {}
-
-public:
-    virtual const BackendId& GetId() const = 0;
-};
-
-} // namespace armnn
\ No newline at end of file
diff --git a/include/armnn/Types.hpp b/include/armnn/Types.hpp
index 2249a36..cd6e17b 100644
--- a/include/armnn/Types.hpp
+++ b/include/armnn/Types.hpp
@@ -139,6 +139,20 @@
     Ceiling     = 1
 };
 
+/// Each backend should implement an IBackend.
+class IBackend
+{
+protected:
+    IBackend() {}
+    virtual ~IBackend() {}
+
+public:
+    virtual const BackendId& GetId() const = 0;
+};
+
+using IBackendSharedPtr = std::shared_ptr<IBackend>;
+using IBackendUniquePtr = std::unique_ptr<IBackend, void(*)(IBackend* backend)>;
+
 /// Device specific knowledge to be passed to the optimizer.
 class IDeviceSpec
 {
@@ -208,6 +222,4 @@
 /// Define LayerGuid type.
 using LayerGuid = unsigned int;
 
-struct EmptyInitializer {};
-
 } // namespace armnn
diff --git a/src/armnn/LayerSupport.cpp b/src/armnn/LayerSupport.cpp
index e3009e2..fb3ce43 100644
--- a/src/armnn/LayerSupport.cpp
+++ b/src/armnn/LayerSupport.cpp
@@ -39,7 +39,7 @@
     bool isSupported; \
     try { \
         auto factoryFunc = LayerSupportRegistryInstance().GetFactory(backendId); \
-        auto layerSupportObject = factoryFunc(EmptyInitializer()); \
+        auto layerSupportObject = factoryFunc(); \
         isSupported = layerSupportObject->func(__VA_ARGS__, Optional<std::string&>(reasonIfUnsupportedFull)); \
         CopyErrorMessage(reasonIfUnsupported, reasonIfUnsupportedFull.c_str(), reasonIfUnsupportedMaxLength); \
     } catch (InvalidArgumentException e) { \
diff --git a/src/armnn/LoadedNetwork.cpp b/src/armnn/LoadedNetwork.cpp
index 97c8360..f58a115 100644
--- a/src/armnn/LoadedNetwork.cpp
+++ b/src/armnn/LoadedNetwork.cpp
@@ -38,7 +38,6 @@
 } // anonymous
 
 std::unique_ptr<LoadedNetwork> LoadedNetwork::MakeLoadedNetwork(std::unique_ptr<OptimizedNetwork> net,
-                                                                const IRuntime::CreationOptions& options,
                                                                 std::string & errorMessage)
 {
     std::unique_ptr<LoadedNetwork> loadedNetwork;
@@ -53,7 +52,7 @@
 
     try
     {
-        loadedNetwork.reset(new LoadedNetwork(std::move(net), options));
+        loadedNetwork.reset(new LoadedNetwork(std::move(net)));
     }
     catch (const armnn::RuntimeException& error)
     {
@@ -71,8 +70,7 @@
     return loadedNetwork;
 }
 
-LoadedNetwork::LoadedNetwork(std::unique_ptr<OptimizedNetwork> net,
-                             const IRuntime::CreationOptions& options)
+LoadedNetwork::LoadedNetwork(std::unique_ptr<OptimizedNetwork> net)
     : m_OptimizedNetwork(std::move(net))
     , m_WorkingMemLock(m_WorkingMemMutex, std::defer_lock)
 {
@@ -91,7 +89,7 @@
         if (m_Backends.count(backend) == 0)
         {
             auto createBackend = BackendRegistryInstance().GetFactory(backend);
-            auto it = m_Backends.emplace(std::make_pair(backend, createBackend(EmptyInitializer())));
+            auto it = m_Backends.emplace(std::make_pair(backend, createBackend()));
             m_WorkloadFactories.emplace(std::make_pair(backend,
                                                        it.first->second->CreateWorkloadFactory()));
         }
diff --git a/src/armnn/LoadedNetwork.hpp b/src/armnn/LoadedNetwork.hpp
index b36b69b..65dd4ec 100644
--- a/src/armnn/LoadedNetwork.hpp
+++ b/src/armnn/LoadedNetwork.hpp
@@ -40,7 +40,6 @@
     Status EnqueueWorkload(const InputTensors& inputTensors, const OutputTensors& outputTensors);
 
     static std::unique_ptr<LoadedNetwork> MakeLoadedNetwork(std::unique_ptr<OptimizedNetwork> net,
-                                                            const IRuntime::CreationOptions& options,
                                                             std::string & errorMessage);
 
     // NOTE we return by reference as the purpose of this method is only to provide
@@ -52,7 +51,7 @@
     void FreeWorkingMemory();
 
 private:
-    LoadedNetwork(std::unique_ptr<OptimizedNetwork> net, const IRuntime::CreationOptions& options);
+    LoadedNetwork(std::unique_ptr<OptimizedNetwork> net);
 
     void EnqueueInput(const BindableLayer& layer, ITensorHandle* tensorHandle, const TensorInfo& tensorInfo);
 
diff --git a/src/armnn/Runtime.cpp b/src/armnn/Runtime.cpp
index 7691364..37e25a7 100644
--- a/src/armnn/Runtime.cpp
+++ b/src/armnn/Runtime.cpp
@@ -6,10 +6,15 @@
 
 #include <armnn/Version.hpp>
 #include <backendsCommon/BackendRegistry.hpp>
-#include <backendsCommon/BackendContextRegistry.hpp>
 
 #include <iostream>
 
+#ifdef ARMCOMPUTECL_ENABLED
+#include <arm_compute/core/CL/OpenCL.h>
+#include <arm_compute/core/CL/CLKernelLibrary.h>
+#include <arm_compute/runtime/CL/CLScheduler.h>
+#endif
+
 #include <boost/log/trivial.hpp>
 #include <boost/polymorphic_cast.hpp>
 
@@ -52,7 +57,6 @@
     IOptimizedNetwork* rawNetwork = inNetwork.release();
     unique_ptr<LoadedNetwork> loadedNetwork = LoadedNetwork::MakeLoadedNetwork(
         std::unique_ptr<OptimizedNetwork>(boost::polymorphic_downcast<OptimizedNetwork*>(rawNetwork)),
-        m_Options,
         errorMessage);
 
     if (!loadedNetwork)
@@ -74,6 +78,24 @@
 
 Status Runtime::UnloadNetwork(NetworkId networkId)
 {
+#ifdef ARMCOMPUTECL_ENABLED
+    if (arm_compute::CLScheduler::get().context()() != NULL)
+    {
+        // Waits for all queued CL requests to finish before unloading the network they may be using.
+        try
+        {
+            // Coverity fix: arm_compute::CLScheduler::sync() may throw an exception of type cl::Error.
+            arm_compute::CLScheduler::get().sync();
+        }
+        catch (const cl::Error&)
+        {
+            BOOST_LOG_TRIVIAL(warning) << "WARNING: Runtime::UnloadNetwork(): an error occurred while waiting for "
+                                          "the queued CL requests to finish";
+            return Status::Failure;
+        }
+    }
+#endif
+
     {
         std::lock_guard<std::mutex> lockGuard(m_Mutex);
 
@@ -82,6 +104,14 @@
             BOOST_LOG_TRIVIAL(warning) << "WARNING: Runtime::UnloadNetwork(): " << networkId << " not found!";
             return Status::Failure;
         }
+
+#ifdef ARMCOMPUTECL_ENABLED
+        if (arm_compute::CLScheduler::get().context()() != NULL && m_LoadedNetworks.empty())
+        {
+            // There are no loaded networks left, so clear the CL cache to free up memory
+            m_ClContextControl.ClearClCache();
+        }
+#endif
     }
 
     BOOST_LOG_TRIVIAL(debug) << "Runtime::UnloadNetwork(): Unloaded network with ID: " << networkId;
@@ -101,26 +131,12 @@
 }
 
 Runtime::Runtime(const CreationOptions& options)
-    : m_Options{options}
+    : m_ClContextControl(options.m_GpuAccTunedParameters.get(),
+                         options.m_EnableGpuProfiling)
     , m_NetworkIdCounter(0)
     , m_DeviceSpec{BackendRegistryInstance().GetBackendIds()}
 {
     BOOST_LOG_TRIVIAL(info) << "ArmNN v" << ARMNN_VERSION << "\n";
-
-    for (const auto& id : BackendContextRegistryInstance().GetBackendIds())
-    {
-        // Store backend contexts for the supported ones
-        if (m_DeviceSpec.GetSupportedBackends().count(id) > 0)
-        {
-            // Don't throw an exception, rather return a dummy factory if not
-            // found.
-            auto factoryFun = BackendContextRegistryInstance().GetFactory(
-                id, [](const CreationOptions&) { return IBackendContextUniquePtr(); }
-            );
-
-            m_BackendContexts.emplace(std::make_pair(id, factoryFun(options)));
-        }
-    }
 }
 
 Runtime::~Runtime()
diff --git a/src/armnn/Runtime.hpp b/src/armnn/Runtime.hpp
index 694e1e5..e4d4d4d 100644
--- a/src/armnn/Runtime.hpp
+++ b/src/armnn/Runtime.hpp
@@ -10,7 +10,8 @@
 #include <armnn/IRuntime.hpp>
 #include <armnn/Tensor.hpp>
 #include <armnn/BackendId.hpp>
-#include <backendsCommon/IBackendContext.hpp>
+
+#include <cl/ClContextControl.hpp>
 
 #include <mutex>
 #include <unordered_map>
@@ -86,13 +87,14 @@
     }
 
     mutable std::mutex m_Mutex;
-    std::unordered_map<NetworkId, std::unique_ptr<LoadedNetwork>> m_LoadedNetworks;
-    CreationOptions m_Options;
-    int m_NetworkIdCounter;
-    DeviceSpec m_DeviceSpec;
 
-    using BackendContextMap = std::unordered_map<BackendId, IBackendContextUniquePtr>;
-    BackendContextMap m_BackendContexts;
+    std::unordered_map<NetworkId, std::unique_ptr<LoadedNetwork>> m_LoadedNetworks;
+
+    ClContextControl m_ClContextControl;
+
+    int m_NetworkIdCounter;
+
+    DeviceSpec m_DeviceSpec;
 };
 
 }
diff --git a/src/backends/backendsCommon/BackendContextRegistry.cpp b/src/backends/backendsCommon/BackendContextRegistry.cpp
deleted file mode 100644
index 0168a12..0000000
--- a/src/backends/backendsCommon/BackendContextRegistry.cpp
+++ /dev/null
@@ -1,17 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "BackendContextRegistry.hpp"
-
-namespace armnn
-{
-
-BackendContextRegistry& BackendContextRegistryInstance()
-{
-    static BackendContextRegistry instance;
-    return instance;
-}
-
-} // namespace armnn
diff --git a/src/backends/backendsCommon/BackendContextRegistry.hpp b/src/backends/backendsCommon/BackendContextRegistry.hpp
deleted file mode 100644
index 23830a0..0000000
--- a/src/backends/backendsCommon/BackendContextRegistry.hpp
+++ /dev/null
@@ -1,28 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#pragma once
-
-#include "IBackendContext.hpp"
-#include "RegistryCommon.hpp"
-
-#include <armnn/IRuntime.hpp>
-#include <armnn/Types.hpp>
-
-namespace armnn
-{
-
-using BackendContextRegistry = RegistryCommon<IBackendContext,
-                                              IBackendContextUniquePtr,
-                                              IRuntime::CreationOptions>;
-
-BackendContextRegistry& BackendContextRegistryInstance();
-
-template <>
-struct RegisteredTypeName<IBackendContext>
-{
-    static const char * Name() { return "IBackendContext"; }
-};
-
-} // namespace armnn
diff --git a/src/backends/backendsCommon/BackendRegistry.hpp b/src/backends/backendsCommon/BackendRegistry.hpp
index ba2d26a..145da88 100644
--- a/src/backends/backendsCommon/BackendRegistry.hpp
+++ b/src/backends/backendsCommon/BackendRegistry.hpp
@@ -12,9 +12,7 @@
 namespace armnn
 {
 
-using BackendRegistry = RegistryCommon<IBackendInternal,
-                                       IBackendInternalUniquePtr,
-                                       EmptyInitializer>;
+using BackendRegistry = RegistryCommon<IBackendInternal, IBackendInternalUniquePtr>;
 
 BackendRegistry& BackendRegistryInstance();
 
diff --git a/src/backends/backendsCommon/CMakeLists.txt b/src/backends/backendsCommon/CMakeLists.txt
index cb89aeb..9dd9b92 100644
--- a/src/backends/backendsCommon/CMakeLists.txt
+++ b/src/backends/backendsCommon/CMakeLists.txt
@@ -4,14 +4,11 @@
 #
 
 list(APPEND armnnBackendsCommon_sources
-    BackendContextRegistry.cpp
-    BackendContextRegistry.hpp
     BackendRegistry.cpp
     BackendRegistry.hpp
     CpuTensorHandle.cpp
     CpuTensorHandleFwd.hpp
     CpuTensorHandle.hpp
-    IBackendContext.hpp
     IBackendInternal.hpp
     ILayerSupport.cpp
     ITensorHandle.hpp
diff --git a/src/backends/backendsCommon/IBackendContext.hpp b/src/backends/backendsCommon/IBackendContext.hpp
deleted file mode 100644
index d073d12..0000000
--- a/src/backends/backendsCommon/IBackendContext.hpp
+++ /dev/null
@@ -1,27 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#pragma once
-
-#include <armnn/IRuntime.hpp>
-#include <memory>
-
-namespace armnn
-{
-
-class IBackendContext
-{
-public:
-    virtual ~IBackendContext() {}
-
-protected:
-    IBackendContext(const IRuntime::CreationOptions& options) {}
-
-private:
-    IBackendContext() = delete;
-};
-
-using IBackendContextUniquePtr = std::unique_ptr<IBackendContext>;
-
-} // namespace armnn
diff --git a/src/backends/backendsCommon/IBackendInternal.hpp b/src/backends/backendsCommon/IBackendInternal.hpp
index a24b600..7e44dbd 100644
--- a/src/backends/backendsCommon/IBackendInternal.hpp
+++ b/src/backends/backendsCommon/IBackendInternal.hpp
@@ -4,8 +4,7 @@
 //
 #pragma once
 
-#include <armnn/IBackend.hpp>
-#include <memory>
+#include <armnn/Types.hpp>
 
 namespace armnn
 {
@@ -14,6 +13,8 @@
 class IBackendInternal : public IBackend
 {
 protected:
+    // Creation must be done through a specific
+    // backend interface.
     IBackendInternal() = default;
 
 public:
diff --git a/src/backends/backendsCommon/LayerSupportRegistry.hpp b/src/backends/backendsCommon/LayerSupportRegistry.hpp
index 6124685..a5efad0 100644
--- a/src/backends/backendsCommon/LayerSupportRegistry.hpp
+++ b/src/backends/backendsCommon/LayerSupportRegistry.hpp
@@ -6,13 +6,11 @@
 
 #include "RegistryCommon.hpp"
 #include <armnn/ILayerSupport.hpp>
-#include <armnn/Types.hpp>
 
 namespace armnn
 {
-using LayerSupportRegistry = RegistryCommon<ILayerSupport,
-                                            ILayerSupportSharedPtr,
-                                            EmptyInitializer>;
+
+using LayerSupportRegistry = RegistryCommon<ILayerSupport, ILayerSupportSharedPtr>;
 
 LayerSupportRegistry& LayerSupportRegistryInstance();
 
diff --git a/src/backends/backendsCommon/RegistryCommon.hpp b/src/backends/backendsCommon/RegistryCommon.hpp
index 3dbfad2..03bd338 100644
--- a/src/backends/backendsCommon/RegistryCommon.hpp
+++ b/src/backends/backendsCommon/RegistryCommon.hpp
@@ -22,11 +22,11 @@
     static const char * Name() { return "UNKNOWN"; }
 };
 
-template <typename RegisteredType, typename PointerType, typename ParamType>
+template <typename RegisteredType, typename PointerType>
 class RegistryCommon
 {
 public:
-    using FactoryFunction = std::function<PointerType(const ParamType&)>;
+    using FactoryFunction = std::function<PointerType()>;
 
     void Register(const BackendId& id, FactoryFunction factory)
     {
@@ -53,20 +53,6 @@
         return it->second;
     }
 
-    FactoryFunction GetFactory(const BackendId& id,
-                               FactoryFunction defaultFactory) const
-    {
-        auto it = m_Factories.find(id);
-        if (it == m_Factories.end())
-        {
-            return defaultFactory;
-        }
-        else
-        {
-            return it->second;
-        }
-    }
-
     size_t Size() const
     {
         return m_Factories.size();
@@ -131,4 +117,4 @@
     }
 };
 
-} // namespace armnn
\ No newline at end of file
+} // namespace armnn
diff --git a/src/backends/backendsCommon/WorkloadFactory.cpp b/src/backends/backendsCommon/WorkloadFactory.cpp
index 83a20e8..9f97452 100644
--- a/src/backends/backendsCommon/WorkloadFactory.cpp
+++ b/src/backends/backendsCommon/WorkloadFactory.cpp
@@ -68,7 +68,7 @@
 
     auto const& layerSupportRegistry = LayerSupportRegistryInstance();
     auto layerSupportFactory = layerSupportRegistry.GetFactory(backendId);
-    auto layerSupportObject = layerSupportFactory(EmptyInitializer());
+    auto layerSupportObject = layerSupportFactory();
 
     switch(layer.GetType())
     {
diff --git a/src/backends/backendsCommon/common.mk b/src/backends/backendsCommon/common.mk
index 152ada3..b1583b9 100644
--- a/src/backends/backendsCommon/common.mk
+++ b/src/backends/backendsCommon/common.mk
@@ -8,7 +8,6 @@
 # file in the root of ArmNN
 
 COMMON_SOURCES := \
-    BackendContextRegistry.cpp \
     BackendRegistry.cpp \
     CpuTensorHandle.cpp \
     ILayerSupport.cpp \
@@ -27,4 +26,3 @@
     test/WorkloadDataValidation.cpp \
     test/TensorCopyUtils.cpp \
     test/LayerTests.cpp
-
diff --git a/src/backends/backendsCommon/test/BackendRegistryTests.cpp b/src/backends/backendsCommon/test/BackendRegistryTests.cpp
index 4afe273..0bc655b 100644
--- a/src/backends/backendsCommon/test/BackendRegistryTests.cpp
+++ b/src/backends/backendsCommon/test/BackendRegistryTests.cpp
@@ -54,7 +54,7 @@
     StaticRegistryInitializer<BackendRegistry> factoryHelper(
         BackendRegistryInstance(),
         "HelloWorld",
-        [&called](const EmptyInitializer&)
+        [&called]()
         {
             called = true;
             return armnn::IBackendInternalUniquePtr(nullptr);
@@ -69,7 +69,7 @@
     // sanity check: the factory still not called
     BOOST_TEST(called == false);
 
-    factoryFunction(EmptyInitializer());
+    factoryFunction();
     BOOST_TEST(called == true);
 }
 
@@ -81,7 +81,7 @@
     bool called = false;
     BackendRegistryInstance().Register(
         "HelloWorld",
-        [&called](const EmptyInitializer&)
+        [&called]()
         {
             called = true;
             return armnn::IBackendInternalUniquePtr(nullptr);
@@ -96,7 +96,7 @@
     // sanity check: the factory still not called
     BOOST_TEST(called == false);
 
-    factoryFunction(EmptyInitializer());
+    factoryFunction();
     BOOST_TEST(called == true);
 }
 
diff --git a/src/backends/cl/CMakeLists.txt b/src/backends/cl/CMakeLists.txt
index 3025458..d751854 100644
--- a/src/backends/cl/CMakeLists.txt
+++ b/src/backends/cl/CMakeLists.txt
@@ -3,23 +3,18 @@
 # SPDX-License-Identifier: MIT
 #
 
-list(APPEND armnnClBackend_sources
-    ClBackendId.hpp
-    ClLayerSupport.cpp
-    ClLayerSupport.hpp
-    ClWorkloadFactory.cpp
-    ClWorkloadFactory.hpp
-)
-
 if(ARMCOMPUTECL)
     list(APPEND armnnClBackend_sources
-        ClBackendContext.cpp
-        ClBackendContext.hpp
         ClBackend.cpp
         ClBackend.hpp
+        ClBackendId.hpp
         ClContextControl.cpp
         ClContextControl.hpp
+        ClLayerSupport.cpp
+        ClLayerSupport.hpp
         ClTensorHandle.hpp
+        ClWorkloadFactory.cpp
+        ClWorkloadFactory.hpp
         OpenClTimer.cpp
         OpenClTimer.hpp
     )
@@ -29,10 +24,20 @@
     if(BUILD_UNIT_TESTS)
         add_subdirectory(test)
     endif()
+
+else()
+    list(APPEND armnnClBackend_sources
+        ClBackendId.hpp
+        ClContextControl.cpp
+        ClContextControl.hpp
+        ClLayerSupport.cpp
+        ClLayerSupport.hpp
+        ClWorkloadFactory.cpp
+        ClWorkloadFactory.hpp
+    )
 endif()
 
 add_library(armnnClBackend OBJECT ${armnnClBackend_sources})
 target_include_directories(armnnClBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
 target_include_directories(armnnClBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnnUtils)
 target_include_directories(armnnClBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
-
diff --git a/src/backends/cl/ClBackend.cpp b/src/backends/cl/ClBackend.cpp
index 5d5cad5..b1857a3 100644
--- a/src/backends/cl/ClBackend.cpp
+++ b/src/backends/cl/ClBackend.cpp
@@ -8,7 +8,6 @@
 #include "ClWorkloadFactory.hpp"
 
 #include <backendsCommon/BackendRegistry.hpp>
-#include <boost/log/trivial.hpp>
 
 namespace armnn
 {
@@ -20,13 +19,13 @@
 {
     BackendRegistryInstance(),
     ClBackend::GetIdStatic(),
-    [](const EmptyInitializer&)
+    []()
     {
         return IBackendInternalUniquePtr(new ClBackend);
     }
 };
 
-} // anonymous namespace
+}
 
 const BackendId& ClBackend::GetIdStatic()
 {
@@ -39,4 +38,4 @@
     return std::make_unique<ClWorkloadFactory>();
 }
 
-} // namespace armnn
\ No newline at end of file
+} // namespace armnn
diff --git a/src/backends/cl/ClBackend.hpp b/src/backends/cl/ClBackend.hpp
index 381d808..223aeb3 100644
--- a/src/backends/cl/ClBackend.hpp
+++ b/src/backends/cl/ClBackend.hpp
@@ -12,8 +12,8 @@
 class ClBackend : public IBackendInternal
 {
 public:
-    ClBackend() = default;
-    ~ClBackend() override = default;
+    ClBackend()  = default;
+    ~ClBackend() = default;
 
     static const BackendId& GetIdStatic();
     const BackendId& GetId() const override { return GetIdStatic(); }
diff --git a/src/backends/cl/ClBackendContext.cpp b/src/backends/cl/ClBackendContext.cpp
deleted file mode 100644
index 7789415..0000000
--- a/src/backends/cl/ClBackendContext.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "ClBackendContext.hpp"
-#include "ClBackendId.hpp"
-#include "ClContextControl.hpp"
-
-#include <backendsCommon/BackendContextRegistry.hpp>
-#include <boost/log/trivial.hpp>
-
-#include <mutex>
-
-#ifdef ARMCOMPUTECL_ENABLED
-// Needed for the CL scheduler calls
-#include <arm_compute/core/CL/OpenCL.h>
-#include <arm_compute/core/CL/CLKernelLibrary.h>
-#include <arm_compute/runtime/CL/CLScheduler.h>
-#endif
-
-namespace armnn
-{
-
-namespace
-{
-
-static StaticRegistryInitializer<BackendContextRegistry> g_RegisterHelper
-{
-    BackendContextRegistryInstance(),
-    ClBackendId(),
-    [](const IRuntime::CreationOptions& options)
-    {
-        return IBackendContextUniquePtr(new ClBackendContext{options});
-    }
-};
-
-static std::mutex g_ContextControlMutex;
-
-std::shared_ptr<ClBackendContext::ContextControlWrapper>
-GetContextControlWrapper(const IRuntime::CreationOptions& options)
-{
-    static std::weak_ptr<ClBackendContext::ContextControlWrapper> contextControlWrapper;
-
-    std::lock_guard<std::mutex> lockGuard(g_ContextControlMutex);
-    std::shared_ptr<ClBackendContext::ContextControlWrapper> result;
-
-    if (contextControlWrapper.expired())
-    {
-        result = std::make_shared<ClBackendContext::ContextControlWrapper>(options);
-        contextControlWrapper = result;
-    }
-    else
-    {
-        result = contextControlWrapper.lock();
-    }
-
-    return result;
-}
-
-} // anonymous namespace
-
-
-#ifdef ARMCOMPUTECL_ENABLED
-struct ClBackendContext::ContextControlWrapper
-{
-    ContextControlWrapper(const IRuntime::CreationOptions& options)
-    : m_ClContextControl{options.m_GpuAccTunedParameters.get(),
-                         options.m_EnableGpuProfiling}
-    {
-    }
-
-    ~ContextControlWrapper()
-    {
-        if (arm_compute::CLScheduler::get().context()() != NULL)
-        {
-            // Waits for all queued CL requests to finish before unloading the network they may be using.
-            try
-            {
-                // Coverity fix: arm_compute::CLScheduler::sync() may throw an exception of type cl::Error.
-                arm_compute::CLScheduler::get().sync();
-                m_ClContextControl.ClearClCache();
-            }
-            catch (const cl::Error&)
-            {
-                BOOST_LOG_TRIVIAL(warning) << "WARNING: Runtime::UnloadNetwork(): an error occurred while waiting for "
-                                            "the queued CL requests to finish";
-            }
-        }
-    }
-
-    ClContextControl m_ClContextControl;
-};
-#else //ARMCOMPUTECL_ENABLED
-struct ClBackendContext::ContextControlWrapper
-{
-    ContextControlWrapper(const IRuntime::CreationOptions&){}
-};
-#endif //ARMCOMPUTECL_ENABLED
-
-ClBackendContext::ClBackendContext(const IRuntime::CreationOptions& options)
-: IBackendContext{options}
-, m_ContextControl{GetContextControlWrapper(options)}
-{
-}
-
-ClBackendContext::~ClBackendContext()
-{
-}
-
-} // namespace armnn
\ No newline at end of file
diff --git a/src/backends/cl/ClBackendContext.hpp b/src/backends/cl/ClBackendContext.hpp
deleted file mode 100644
index 4aaa8a9..0000000
--- a/src/backends/cl/ClBackendContext.hpp
+++ /dev/null
@@ -1,23 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#pragma once
-
-#include <backendsCommon/IBackendContext.hpp>
-
-namespace armnn
-{
-
-class ClBackendContext : public IBackendContext
-{
-public:
-    ClBackendContext(const IRuntime::CreationOptions& options);
-    ~ClBackendContext() override;
-
-    struct ContextControlWrapper;
-private:
-    std::shared_ptr<ContextControlWrapper> m_ContextControl;
-};
-
-} // namespace armnn
\ No newline at end of file
diff --git a/src/backends/cl/ClLayerSupport.cpp b/src/backends/cl/ClLayerSupport.cpp
index ab62eee..f4e14c2 100644
--- a/src/backends/cl/ClLayerSupport.cpp
+++ b/src/backends/cl/ClLayerSupport.cpp
@@ -53,7 +53,7 @@
 static StaticRegistryInitializer<LayerSupportRegistry> g_RegisterHelper{
     LayerSupportRegistryInstance(),
     ClBackendId(),
-    [](const EmptyInitializer&)
+    []()
     {
         return GetLayerSupportPointer();
     }
diff --git a/src/backends/cl/backend.mk b/src/backends/cl/backend.mk
index 8433240..97df8e4 100644
--- a/src/backends/cl/backend.mk
+++ b/src/backends/cl/backend.mk
@@ -8,7 +8,6 @@
 # file in the root of ArmNN
 
 BACKEND_SOURCES := \
-        ClBackendContext.cpp \
         ClBackend.cpp \
         ClContextControl.cpp \
         ClLayerSupport.cpp \
@@ -55,4 +54,3 @@
         test/ClRuntimeTests.cpp \
         test/Fp16SupportTest.cpp \
         test/OpenClTimerTest.cpp
-
diff --git a/src/backends/neon/CMakeLists.txt b/src/backends/neon/CMakeLists.txt
index 0f7759d..badad2f 100644
--- a/src/backends/neon/CMakeLists.txt
+++ b/src/backends/neon/CMakeLists.txt
@@ -3,20 +3,17 @@
 # SPDX-License-Identifier: MIT
 #
 
-list(APPEND armnnNeonBackend_sources
-    NeonBackendId.hpp
-    NeonLayerSupport.cpp
-    NeonLayerSupport.hpp
-    NeonWorkloadFactory.cpp
-    NeonWorkloadFactory.hpp
-)
-
 if(ARMCOMPUTENEON)
     list(APPEND armnnNeonBackend_sources
         NeonBackend.cpp
         NeonBackend.hpp
+        NeonBackendId.hpp
         NeonInterceptorScheduler.hpp
         NeonInterceptorScheduler.cpp
+        NeonLayerSupport.cpp
+        NeonLayerSupport.hpp
+        NeonWorkloadFactory.cpp
+        NeonWorkloadFactory.hpp
         NeonTensorHandle.hpp
         NeonTimer.hpp
         NeonTimer.cpp
@@ -27,10 +24,18 @@
     if(BUILD_UNIT_TESTS)
         add_subdirectory(test)
     endif()
+
+else()
+    list(APPEND armnnNeonBackend_sources
+        NeonBackendId.hpp
+        NeonLayerSupport.cpp
+        NeonLayerSupport.hpp
+        NeonWorkloadFactory.cpp
+        NeonWorkloadFactory.hpp
+    )
 endif()
 
 add_library(armnnNeonBackend OBJECT ${armnnNeonBackend_sources})
 target_include_directories(armnnNeonBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
 target_include_directories(armnnNeonBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnnUtils)
 target_include_directories(armnnNeonBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
-
diff --git a/src/backends/neon/NeonBackend.cpp b/src/backends/neon/NeonBackend.cpp
index 1e9f633..7058d24 100644
--- a/src/backends/neon/NeonBackend.cpp
+++ b/src/backends/neon/NeonBackend.cpp
@@ -9,6 +9,8 @@
 
 #include <backendsCommon/BackendRegistry.hpp>
 
+#include <boost/cast.hpp>
+
 namespace armnn
 {
 
@@ -19,7 +21,7 @@
 {
     BackendRegistryInstance(),
     NeonBackend::GetIdStatic(),
-    [](const EmptyInitializer&)
+    []()
     {
         return IBackendInternalUniquePtr(new NeonBackend);
     }
diff --git a/src/backends/neon/NeonBackend.hpp b/src/backends/neon/NeonBackend.hpp
index 27ad94d..b8bbd78 100644
--- a/src/backends/neon/NeonBackend.hpp
+++ b/src/backends/neon/NeonBackend.hpp
@@ -12,8 +12,8 @@
 class NeonBackend : public IBackendInternal
 {
 public:
-    NeonBackend() = default;
-    ~NeonBackend() override = default;
+    NeonBackend()  = default;
+    ~NeonBackend() = default;
 
     static const BackendId& GetIdStatic();
     const BackendId& GetId() const override { return GetIdStatic(); }
diff --git a/src/backends/neon/NeonLayerSupport.cpp b/src/backends/neon/NeonLayerSupport.cpp
index 4704135..a4a6b67 100644
--- a/src/backends/neon/NeonLayerSupport.cpp
+++ b/src/backends/neon/NeonLayerSupport.cpp
@@ -49,7 +49,7 @@
 static StaticRegistryInitializer<LayerSupportRegistry> g_RegisterHelper{
     LayerSupportRegistryInstance(),
     NeonBackendId(),
-    [](const EmptyInitializer&)
+    []()
     {
         return GetLayerSupportPointer();
     }
diff --git a/src/backends/neon/backend.mk b/src/backends/neon/backend.mk
index 29b3527..8f7e72b 100644
--- a/src/backends/neon/backend.mk
+++ b/src/backends/neon/backend.mk
@@ -49,4 +49,3 @@
         test/NeonOptimizedNetworkTests.cpp \
         test/NeonRuntimeTests.cpp \
         test/NeonTimerTest.cpp
-
diff --git a/src/backends/reference/CMakeLists.txt b/src/backends/reference/CMakeLists.txt
index 1799275..ff16f18 100644
--- a/src/backends/reference/CMakeLists.txt
+++ b/src/backends/reference/CMakeLists.txt
@@ -23,4 +23,3 @@
 if(BUILD_UNIT_TESTS)
     add_subdirectory(test)
 endif()
-
diff --git a/src/backends/reference/RefBackend.cpp b/src/backends/reference/RefBackend.cpp
index 91fc3c9..b6fb0ff 100644
--- a/src/backends/reference/RefBackend.cpp
+++ b/src/backends/reference/RefBackend.cpp
@@ -9,6 +9,8 @@
 
 #include <backendsCommon/BackendRegistry.hpp>
 
+#include <boost/cast.hpp>
+
 namespace armnn
 {
 
@@ -19,7 +21,7 @@
 {
     BackendRegistryInstance(),
     RefBackend::GetIdStatic(),
-    [](const EmptyInitializer&)
+    []()
     {
         return IBackendInternalUniquePtr(new RefBackend);
     }
diff --git a/src/backends/reference/RefBackend.hpp b/src/backends/reference/RefBackend.hpp
index e2f264d..48a9d52 100644
--- a/src/backends/reference/RefBackend.hpp
+++ b/src/backends/reference/RefBackend.hpp
@@ -12,8 +12,8 @@
 class RefBackend : public IBackendInternal
 {
 public:
-    RefBackend() = default;
-    ~RefBackend() override = default;
+    RefBackend()  = default;
+    ~RefBackend() = default;
 
     static const BackendId& GetIdStatic();
     const BackendId& GetId() const override { return GetIdStatic(); }
diff --git a/src/backends/reference/RefLayerSupport.cpp b/src/backends/reference/RefLayerSupport.cpp
index 1e8fa75..629903e 100644
--- a/src/backends/reference/RefLayerSupport.cpp
+++ b/src/backends/reference/RefLayerSupport.cpp
@@ -31,7 +31,7 @@
 static StaticRegistryInitializer<LayerSupportRegistry> g_RegisterHelper{
     LayerSupportRegistryInstance(),
     RefBackendId(),
-    [](const EmptyInitializer&)
+    []()
     {
         return GetLayerSupportPointer();
     }
diff --git a/src/backends/reference/backend.mk b/src/backends/reference/backend.mk
index 8a8a78a..007efce 100644
--- a/src/backends/reference/backend.mk
+++ b/src/backends/reference/backend.mk
@@ -71,4 +71,3 @@
         test/RefLayerTests.cpp \
         test/RefOptimizedNetworkTests.cpp \
         test/RefRuntimeTests.cpp
-