[Mesa-dev] [PATCH] clover: Register an llvm diagnostic handler v2
Francisco Jerez
currojerez at gmail.com
Wed Oct 8 02:06:04 PDT 2014
Tom Stellard <thomas.stellard at amd.com> writes:
> This will allow us to handle internal compiler errors.
>
> v2:
> - Code cleanups.
> ---
> .../state_trackers/clover/llvm/invocation.cpp | 27 ++++++++++++++++++++++
> 1 file changed, 27 insertions(+)
>
> diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp
> index d9c3d11..5cc0825 100644
> --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
> +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
> @@ -33,6 +33,8 @@
> #include <llvm/Linker.h>
> #else
> #include <llvm/Linker/Linker.h>
> +#include <llvm/IR/DiagnosticInfo.h>
> +#include <llvm/IR/DiagnosticPrinter.h>
> #endif
> #if HAVE_LLVM < 0x0303
> #include <llvm/DerivedTypes.h>
> @@ -566,6 +568,26 @@ namespace {
> return m;
> }
>
> +#if HAVE_LLVM >= 0x0305
> +
> + void
> + diagnostic_handler(const llvm::DiagnosticInfo &di, void *data) {
> + if (di.getSeverity() == llvm::DS_Error) {
> + std::string message;
> + llvm::raw_string_ostream stream(message);
> + llvm::DiagnosticPrinterRawOStream dp(stream);
> + di.print(dp);
> + stream.flush();
> + compat::string *r_log = (compat::string*)data;
> + message.insert(0, *r_log);
> + *r_log = message;
Doesn't raw_string_ostream append to the end of the string? You could
save a copy by doing it like:
| std::string message = *(compat::string *)data;
| llvm::raw_string_ostream stream(message);
|
| ...
|
| stream.flush();
| *(compat::string *)data = message;
> +
> + throw build_error();
> + }
> + }
> +
> +#endif
> +
> void
> init_targets() {
> LLVMInitializeAllTargets();
> @@ -598,6 +620,10 @@ clover::compile_program_llvm(const compat::string &source,
> llvm::LLVMContext llvm_ctx;
> unsigned optimization_level;
>
> +#if HAVE_LLVM >= 0x0305
> + llvm_ctx.setDiagnosticHandler(diagnostic_handler, &r_log);
> +#endif
> +
> // The input file name must have the .cl extension in order for the
> // CompilerInvocation class to recognize it as an OpenCL source file.
> llvm::Module *mod = compile_llvm(llvm_ctx, source, "input.cl", triple,
> @@ -629,5 +655,6 @@ clover::compile_program_llvm(const compat::string &source,
> // LLVM 3.6 and newer, the user takes ownership of the module.
> delete mod;
> #endif
> +
> return m;
> }
> --
> 1.8.5.5
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 212 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20141008/ee271672/attachment.sig>
More information about the mesa-dev
mailing list