clover/llvm: Tidy debug handling.
authorFrancisco Jerez <currojerez@riseup.net>
Tue, 17 May 2016 14:02:46 +0000 (16:02 +0200)
committerFrancisco Jerez <currojerez@riseup.net>
Tue, 12 Jul 2016 03:22:40 +0000 (20:22 -0700)
Most significant change is debugging flags are now a scoped enum and
all debugging helpers live in the debug namespace.

Reviewed-by: Serge Martin <edb+mesa@sigluy.net>
Tested-by: Jan Vesely <jan.vesely@rutgers.edu>
src/gallium/state_trackers/clover/llvm/invocation.cpp

index fc5859d6c9b1dbfcb4917bcb07bc67ef1abcc9ab..16229e5caf78c3cd50ebd2445a3dd3a4ee0c1e2c 100644 (file)
@@ -94,16 +94,6 @@ namespace {
       throw e;
    }
 
-   void debug_log(const std::string &msg, const std::string &suffix) {
-      const char *dbg_file = debug_get_option("CLOVER_DEBUG_FILE", "stderr");
-      if (!strcmp("stderr", dbg_file)) {
-         std::cerr << msg;
-       } else {
-        std::ofstream file(dbg_file + suffix, std::ios::app);
-        file << msg;
-       }
-   }
-
    inline std::vector<std::string>
    tokenize(const std::string &s) {
       std::vector<std::string> ss;
@@ -125,6 +115,39 @@ namespace {
       std::string triple;
    };
 
+   namespace debug {
+      enum flag {
+         clc = 1 << 0,
+         llvm = 1 << 1,
+         native = 1 << 2
+      };
+
+      inline bool
+      has_flag(flag f) {
+         static const struct debug_named_value debug_options[] = {
+            { "clc", clc, "Dump the OpenCL C code for all kernels." },
+            { "llvm", llvm, "Dump the generated LLVM IR for all kernels." },
+            { "native", native, "Dump kernel assembly code for targets "
+              "specifying PIPE_SHADER_IR_NATIVE" },
+            DEBUG_NAMED_VALUE_END
+         };
+         static const unsigned flags =
+            debug_get_flags_option("CLOVER_DEBUG", debug_options, 0);
+
+         return flags & f;
+      }
+
+      inline void
+      log(const std::string &suffix, const std::string &s) {
+         const std::string path = debug_get_option("CLOVER_DEBUG_FILE",
+                                                   "stderr");
+         if (path == "stderr")
+            std::cerr << s;
+         else
+            std::ofstream(path + suffix, std::ios::app) << s;
+      }
+   }
+
    void
    init_targets() {
       static bool targets_initialized = false;
@@ -597,7 +620,7 @@ namespace {
    }
 
    std::vector<char>
-   compile_native(const llvm::Module *mod, const target &t, bool dump_asm,
+   compile_native(const llvm::Module *mod, const target &t,
                   std::string &r_log) {
 
       std::string log;
@@ -624,7 +647,7 @@ namespace {
          fail(r_log, compile_error(),
               "Could not create TargetMachine: " + t.triple);
 
-      if (dump_asm) {
+      if (has_flag(debug::native)) {
          LLVMSetTargetMachineAsmVerbosity(tm, true);
 #if HAVE_LLVM >= 0x0308
          LLVMModuleRef debug_mod = wrap(llvm::CloneModule(mod).release());
@@ -634,7 +657,7 @@ namespace {
          emit_code(tm, debug_mod, LLVMAssemblyFile, &out_buffer, r_log);
          buffer_size = LLVMGetBufferSize(out_buffer);
          buffer_data = LLVMGetBufferStart(out_buffer);
-         debug_log(std::string(buffer_data, buffer_size), ".asm");
+         debug::log(".asm", std::string(buffer_data, buffer_size));
 
          LLVMSetTargetMachineAsmVerbosity(tm, false);
          LLVMDisposeMemoryBuffer(out_buffer);
@@ -749,26 +772,6 @@ namespace {
 
       return m;
    }
-
-#define DBG_CLC  (1 << 0)
-#define DBG_LLVM (1 << 1)
-#define DBG_ASM  (1 << 2)
-
-   unsigned
-   get_debug_flags() {
-      static const struct debug_named_value debug_options[] = {
-         {"clc", DBG_CLC, "Dump the OpenCL C code for all kernels."},
-         {"llvm", DBG_LLVM, "Dump the generated LLVM IR for all kernels."},
-         {"asm", DBG_ASM, "Dump kernel assembly code for targets specifying "
-          "PIPE_SHADER_IR_NATIVE"},
-         DEBUG_NAMED_VALUE_END // must be last
-      };
-      static const unsigned debug_flags =
-         debug_get_flags_option("CLOVER_DEBUG", debug_options, 0);
-
-      return debug_flags;
-   }
-
 } // End anonymous namespace
 
 module
@@ -778,8 +781,8 @@ clover::compile_program_llvm(const std::string &source,
                              const std::string &target,
                              const std::string &opts,
                              std::string &r_log) {
-   if (get_debug_flags() & DBG_CLC)
-      debug_log("// Build options: " + opts + '\n' + source, ".cl");
+   if (has_flag(debug::clc))
+      debug::log(".cl", "// Build options: " + opts + '\n' + source);
 
    auto ctx = create_context(r_log);
    // The input file name must have the .cl extension in order for the
@@ -790,12 +793,12 @@ clover::compile_program_llvm(const std::string &source,
 
    optimize(*mod, c->getCodeGenOpts().OptimizationLevel);
 
-   if (get_debug_flags() & DBG_LLVM) {
+   if (has_flag(debug::llvm)) {
       std::string log;
       raw_string_ostream s_log(log);
       mod->print(s_log, NULL);
       s_log.flush();
-      debug_log(log, ".ll");
+      debug::log(".ll", log);
     }
 
    module m;
@@ -811,9 +814,7 @@ clover::compile_program_llvm(const std::string &source,
          m = build_module_llvm(&*mod, *c);
          break;
       case PIPE_SHADER_IR_NATIVE: {
-         std::vector<char> code = compile_native(&*mod, target,
-                                                 get_debug_flags() & DBG_ASM,
-                                                 r_log);
+         std::vector<char> code = compile_native(&*mod, target, r_log);
          m = build_module_native(code, &*mod, *c, r_log);
          break;
       }