| //===--- RuntimeDebugBuilder.h --- Helper to insert prints into LLVM-IR ---===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef RUNTIME_DEBUG_BUILDER_H | |
| #define RUNTIME_DEBUG_BUILDER_H | |
| #include "polly/CodeGen/IRBuilder.h" | |
| #include "llvm/ADT/ArrayRef.h" | |
| #include "llvm/ADT/StringRef.h" | |
| #include <vector> | |
| namespace llvm { | |
| class Value; | |
| class Function; | |
| } // namespace llvm | |
| namespace polly { | |
| /// Insert function calls that print certain LLVM values at run time. | |
| /// | |
| /// This class inserts libc function calls to print certain LLVM values at | |
| /// run time. | |
| struct RuntimeDebugBuilder { | |
| /// Generate a constant string into the builder's llvm::Module which can be | |
| /// passed to createCPUPrinter(). | |
| /// | |
| /// @param Builder The builder used to emit the printer calls. | |
| /// @param Str The string to be printed. | |
| /// @return A global containing @p Str. | |
| static llvm::Value *getPrintableString(PollyIRBuilder &Builder, | |
| llvm::StringRef Str); | |
| /// Return whether an llvm::Value of the type @p Ty is printable for | |
| /// debugging. | |
| /// | |
| /// That is, whether such a value can be passed to createGPUPrinter() | |
| /// to be dumped as runtime. If false is returned, those | |
| /// functions will fail. | |
| static bool isPrintable(llvm::Type *Ty); | |
| /// Print a set of LLVM-IR Values or StringRefs via printf | |
| /// | |
| /// This function emits a call to printf that will print the given arguments. | |
| /// It is useful for debugging CPU programs. All arguments given in this list | |
| /// will be automatically concatenated and the resulting string will be | |
| /// printed atomically. We also support ArrayRef arguments, which can be used | |
| /// to provide of id values. | |
| /// | |
| /// @param Builder The builder used to emit the printer calls. | |
| /// @param Args The list of values to print. | |
| template <typename... Args> | |
| static void createCPUPrinter(PollyIRBuilder &Builder, Args... args) { | |
| std::vector<llvm::Value *> Vector; | |
| createPrinter(Builder, Vector, args...); | |
| } | |
| private: | |
| /// Handle Values. | |
| template <typename... Args> | |
| static void createPrinter(PollyIRBuilder &Builder, | |
| std::vector<llvm::Value *> &Values, | |
| llvm::Value *Value, Args... args) { | |
| Values.push_back(Value); | |
| createPrinter(Builder, Values, args...); | |
| } | |
| /// Handle StringRefs. | |
| template <typename... Args> | |
| static void createPrinter(PollyIRBuilder &Builder, | |
| std::vector<llvm::Value *> &Values, | |
| llvm::StringRef String, Args... args) { | |
| Values.push_back(getPrintableString(Builder, String)); | |
| createPrinter(Builder, Values, args...); | |
| } | |
| /// Handle ArrayRefs. | |
| template <typename... Args> | |
| static void createPrinter(PollyIRBuilder &Builder, | |
| std::vector<llvm::Value *> &Values, | |
| llvm::ArrayRef<llvm::Value *> Array, Args... args) { | |
| Values.insert(Values.end(), Array.begin(), Array.end()); | |
| createPrinter(Builder, Values, args...); | |
| } | |
| /// Print a list of Values. | |
| static void createPrinter(PollyIRBuilder &Builder, | |
| llvm::ArrayRef<llvm::Value *> Values); | |
| /// Print a list of Values on a CPU. | |
| static void createCPUPrinterT(PollyIRBuilder &Builder, | |
| llvm::ArrayRef<llvm::Value *> Values); | |
| /// Get a reference to the 'printf' function. | |
| /// | |
| /// If the current module does not yet contain a reference to printf, we | |
| /// insert a reference to it. Otherwise the existing reference is returned. | |
| static llvm::Function *getPrintF(PollyIRBuilder &Builder); | |
| /// Call printf | |
| /// | |
| /// @param Builder The builder used to insert the code. | |
| /// @param Format The format string. | |
| /// @param Values The set of values to print. | |
| static void createPrintF(PollyIRBuilder &Builder, std::string Format, | |
| llvm::ArrayRef<llvm::Value *> Values); | |
| /// Get (and possibly insert) a vprintf declaration into the module. | |
| static llvm::Function *getVPrintF(PollyIRBuilder &Builder); | |
| /// Call fflush | |
| /// | |
| /// @parma Builder The builder used to insert the code. | |
| static void createFlush(PollyIRBuilder &Builder); | |
| }; | |
| } // namespace polly | |
| extern bool PollyDebugPrinting; | |
| #endif |