[Mesa-dev] [PATCH v4] clover: restore support for LLVM <= 3.9

Francisco Jerez currojerez at riseup.net
Sat Nov 19 21:13:19 UTC 2016


Vedran Miletić <vedran at miletic.net> writes:

> The commit 8e430ff8b060b4e8e922bae24b3c57837da6ea77 support for LLVM
> 3.9 and older versionsin  Clover. This patch restores it and refactors
> the support using Clover compatibility layer for LLVM.
>
> Signed-off-by: Vedran Miletić <vedran at miletic.net>
> ---
>  .../state_trackers/clover/llvm/codegen/bitcode.cpp |  9 ++----
>  src/gallium/state_trackers/clover/llvm/compat.hpp  | 35 ++++++++++++++++++++++
>  2 files changed, 37 insertions(+), 7 deletions(-)
>
> diff --git a/src/gallium/state_trackers/clover/llvm/codegen/bitcode.cpp b/src/gallium/state_trackers/clover/llvm/codegen/bitcode.cpp
> index 5dcc4f8..4b4ae41 100644
> --- a/src/gallium/state_trackers/clover/llvm/codegen/bitcode.cpp
> +++ b/src/gallium/state_trackers/clover/llvm/codegen/bitcode.cpp
> @@ -32,6 +32,7 @@
>  ///
>  
>  #include "llvm/codegen.hpp"
> +#include "llvm/compat.hpp"
>  #include "llvm/metadata.hpp"
>  #include "core/error.hpp"
>  #include "util/algorithm.hpp"
> @@ -99,13 +100,7 @@ clover::llvm::parse_module_library(const module &m, ::llvm::LLVMContext &ctx,
>     auto mod = ::llvm::parseBitcodeFile(::llvm::MemoryBufferRef(
>                                          as_string(m.secs[0].data), " "), ctx);
>  
> -   if (::llvm::Error err = mod.takeError()) {
> -      std::string msg;
> -      ::llvm::handleAllErrors(std::move(err), [&](::llvm::ErrorInfoBase &EIB) {
> -         msg = EIB.message();
> -         fail(r_log, error(CL_INVALID_PROGRAM), msg.c_str());
> -      });
> -   }
> +   compat::handle_module_error(mod, r_log);
>  
>     return std::unique_ptr<::llvm::Module>(std::move(*mod));
>  }
> diff --git a/src/gallium/state_trackers/clover/llvm/compat.hpp b/src/gallium/state_trackers/clover/llvm/compat.hpp
> index a963cff..b29100f 100644
> --- a/src/gallium/state_trackers/clover/llvm/compat.hpp
> +++ b/src/gallium/state_trackers/clover/llvm/compat.hpp
> @@ -39,6 +39,11 @@
>  #include <llvm/Linker/Linker.h>
>  #include <llvm/Transforms/IPO.h>
>  #include <llvm/Target/TargetMachine.h>
> +#if HAVE_LLVM >= 0x0400
> +#include <llvm/Support/Error.h>
> +#else
> +#include <llvm/Support/ErrorOr.h>
> +#endif
>  
>  #if HAVE_LLVM >= 0x0307
>  #include <llvm/IR/LegacyPassManager.h>
> @@ -53,6 +58,14 @@
>  #include <clang/Frontend/CodeGenOptions.h>
>  #include <clang/Frontend/CompilerInstance.h>
>  
> +#if HAVE_LLVM >= 0x0307
> +#include <memory>
> +#endif
> +
> +namespace llvm {
> +   class Module;
> +}
> +
>  namespace clover {
>     namespace llvm {
>        namespace compat {
> @@ -158,6 +171,28 @@ namespace clover {
>  #else
>           const auto default_reloc_model = ::llvm::Reloc::Default;
>  #endif
> +
> +#if HAVE_LLVM >= 0x0400
> +         typedef ::llvm::Expected<std::unique_ptr<::llvm::Module>> bitcode_module;
> +#elif HAVE_LLVM >= 0x0307
> +         typedef ::llvm::ErrorOr<std::unique_ptr<::llvm::Module>> bitcode_module;
> +#else
> +         typedef ::llvm::ErrorOr<::llvm::Module *> bitcode_module;
> +#endif
> +

You could avoid the preprocessor conditionals above (and also the
previous hunk) by making the function below a template parameterized on
the module type and let the compiler deduce the correct type by itself
(see attachment).

> +         inline void
> +         handle_module_error(bitcode_module &mod, std::string &r_log) {
> +#if HAVE_LLVM >= 0x0400
> +            if (::llvm::Error err = mod.takeError()) {
> +               ::llvm::handleAllErrors(std::move(err), [&](::llvm::ErrorInfoBase &EIB) {
> +                  fail(r_log, error(CL_INVALID_PROGRAM), EIB.message().c_str());
> +               });
> +            }
> +#else
> +            if (!mod)
> +               fail(r_log, error(CL_INVALID_PROGRAM), mod.getError().message());
> +#endif

To improve the usefulness/complexity ratio of this helper, let's not
hard-code any error handling policy here, instead just call an error
handler function provided as argument (see attachment) so the specific
error code and message are in control of the caller.  With the attached
patch squashed in, patch is:

Reviewed-by: Francisco Jerez <currojerez at riseup.net>

> +         }
>        }
>     }
>  }
> -- 
> 2.7.4

-------------- next part --------------
A non-text attachment was scrubbed...
Name: clover-llvm-compat-handle_module_error.patch
Type: text/x-diff
Size: 2606 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20161119/10949e98/attachment.patch>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 212 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20161119/10949e98/attachment.sig>


More information about the mesa-dev mailing list