xref: /aosp_15_r20/external/mesa3d/src/gallium/frontends/clover/llvm/util.hpp (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1  //
2  // Copyright 2012-2016 Francisco Jerez
3  // Copyright 2012-2016 Advanced Micro Devices, Inc.
4  //
5  // Permission is hereby granted, free of charge, to any person obtaining a
6  // copy of this software and associated documentation files (the "Software"),
7  // to deal in the Software without restriction, including without limitation
8  // the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  // and/or sell copies of the Software, and to permit persons to whom the
10  // Software is furnished to do so, subject to the following conditions:
11  //
12  // The above copyright notice and this permission notice shall be included in
13  // all copies or substantial portions of the Software.
14  //
15  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19  // OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20  // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21  // OTHER DEALINGS IN THE SOFTWARE.
22  //
23  
24  #ifndef CLOVER_LLVM_UTIL_HPP
25  #define CLOVER_LLVM_UTIL_HPP
26  
27  #include "core/error.hpp"
28  #include "util/u_debug.h"
29  
30  #include <vector>
31  #include <fstream>
32  #include <iostream>
33  
34  namespace clover {
35     namespace llvm {
36        template<typename E> void
fail(std::string & r_log,E && e,const std::string & s)37        fail(std::string &r_log, E &&e, const std::string &s) {
38           r_log += s;
39           throw std::forward<E>(e);
40        }
41  
42        inline std::string
as_string(const std::vector<char> & v)43        as_string(const std::vector<char> &v) {
44           return { v.begin(), v.end() };
45        }
46  
47        struct target {
targetclover::llvm::target48           target(const std::string &s) :
49              cpu(s.begin(), s.begin() + s.find_first_of("-")),
50              triple(s.begin() + s.find_first_of("-") + 1, s.end()) {}
51  
52           std::string cpu;
53           std::string triple;
54        };
55  
56        namespace debug {
57           enum flag {
58              clc = 1 << 0,
59              llvm = 1 << 1,
60              native = 1 << 2,
61              spirv = 1 << 3,
62           };
63  
64           inline bool
has_flag(flag f)65           has_flag(flag f) {
66              static const struct debug_named_value debug_options[] = {
67                 { "clc", clc, "Dump the OpenCL C code for all kernels." },
68                 { "llvm", llvm, "Dump the generated LLVM IR for all kernels." },
69                 { "native", native, "Dump kernel assembly code for targets "
70                   "specifying PIPE_SHADER_IR_NATIVE" },
71                 { "spirv", spirv, "Dump the generated SPIR-V for all kernels." },
72                 DEBUG_NAMED_VALUE_END
73              };
74              static const unsigned flags =
75                 debug_get_flags_option("CLOVER_DEBUG", debug_options, 0);
76  
77              return flags & f;
78           }
79  
80           inline void
log(const std::string & suffix,const std::string & s)81           log(const std::string &suffix, const std::string &s) {
82              const std::string path = debug_get_option("CLOVER_DEBUG_FILE",
83                                                        "stderr");
84              if (path == "stderr")
85                 std::cerr << s;
86              else
87                 std::ofstream(path + suffix, std::ios::app) << s;
88           }
89        }
90     }
91  }
92  
93  #endif
94