[Mesa-dev] [PATCH] clover: Use Clang's diagnostics

Vedran Miletić vedran at miletic.net
Tue Dec 20 16:18:55 UTC 2016


Presently errors from frontend are handled only if they occur in
clang::CompilerInvocation::CreateFromArgs(). This patch uses
clang::DiagnosticsEngine to detect errors such as invalid values for
Clang frontend arguments.

Fixes Piglit's cl/program/build/fail/invalid-version-declaration.cl
test.

Signed-off-by: Vedran Miletić <vedran at miletic.net>
---
 src/gallium/state_trackers/clover/llvm/invocation.cpp | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp
index 675cf19..29dec44 100644
--- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
+++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
@@ -98,8 +98,9 @@ namespace {
                             const std::vector<std::string> &opts,
                             std::string &r_log) {
       std::unique_ptr<clang::CompilerInstance> c { new clang::CompilerInstance };
+      clang::TextDiagnosticBuffer* diag_buffer = new clang::TextDiagnosticBuffer;
       clang::DiagnosticsEngine diag { new clang::DiagnosticIDs,
-            new clang::DiagnosticOptions, new clang::TextDiagnosticBuffer };
+            new clang::DiagnosticOptions, diag_buffer };
 
       // Parse the compiler options.  A file name should be present at the end
       // and must have the .cl extension in order for the CompilerInvocation
@@ -111,6 +112,10 @@ namespace {
              c->getInvocation(), copts.data(), copts.data() + copts.size(), diag))
          throw invalid_build_options_error();
 
+      diag_buffer->FlushDiagnostics(diag);
+      if (diag.hasErrorOccurred())
+          throw invalid_build_options_error();
+
       c->getTargetOpts().CPU = target.cpu;
       c->getTargetOpts().Triple = target.triple;
       c->getLangOpts().NoBuiltin = true;
-- 
2.7.4



More information about the mesa-dev mailing list