clang 20.0.0 (based on r547379) from build 12806354. Bug: http://b/379133546 Test: N/A Change-Id: I2eb8938af55d809de674be63cb30cf27e801862b Upstream-Commit: ad834e67b1105d15ef907f6255d4c96e8e733f57
129 lines
4.5 KiB
C++
129 lines
4.5 KiB
C++
//===--- 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
|