[Openmp-commits] [llvm] [openmp] [Offload] Implement double free (and other allocation error) reporting (PR #100261)
Johannes Doerfert via Openmp-commits
openmp-commits at lists.llvm.org
Thu Jul 25 12:58:04 PDT 2024
================
@@ -0,0 +1,223 @@
+//===- ErrorReporting.h - Helper to provide nice error messages ----- c++ -===//
+//
+// 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 OFFLOAD_PLUGINS_NEXTGEN_COMMON_ERROR_REPORTING_H
+#define OFFLOAD_PLUGINS_NEXTGEN_COMMON_ERROR_REPORTING_H
+
+#include "PluginInterface.h"
+#include "Shared/EnvironmentVar.h"
+
+#include "llvm/ADT/SmallString.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/WithColor.h"
+#include "llvm/Support/raw_ostream.h"
+
+#include <cstdint>
+#include <cstdio>
+#include <cstdlib>
+#include <functional>
+#include <optional>
+#include <string>
+#include <unistd.h>
+
+namespace llvm {
+namespace omp {
+namespace target {
+namespace plugin {
+
+class ErrorReporter {
+
+ enum ColorTy {
+ Yellow = int(HighlightColor::Address),
+ Green = int(HighlightColor::String),
+ DarkBlue = int(HighlightColor::Tag),
+ Cyan = int(HighlightColor::Attribute),
+ DarkPurple = int(HighlightColor::Enumerator),
+ DarkRed = int(HighlightColor::Macro),
+ BoldRed = int(HighlightColor::Error),
+ BoldLightPurple = int(HighlightColor::Warning),
+ BoldDarkGrey = int(HighlightColor::Note),
+ BoldLightBlue = int(HighlightColor::Remark),
+ };
+
+ /// The banner printed at the beginning of an error report.
+ static constexpr auto ErrorBanner = "OFFLOAD ERROR: ";
+
+ /// Return the device id as string, or n/a if not available.
+ static std::string getDeviceIdStr(GenericDeviceTy *Device) {
+ return Device ? std::to_string(Device->getDeviceId()) : "n/a";
+ }
+
+ /// Return a nice name for an TargetAllocTy.
+ static StringRef getAllocTyName(TargetAllocTy Kind) {
+ switch (Kind) {
+ case TARGET_ALLOC_DEVICE_NON_BLOCKING:
+ case TARGET_ALLOC_DEFAULT:
+ case TARGET_ALLOC_DEVICE:
+ return "device memory";
+ case TARGET_ALLOC_HOST:
+ return "pinned host memory";
+ case TARGET_ALLOC_SHARED:
+ return "managed memory";
+ break;
+ }
+ llvm_unreachable("Unknown target alloc kind");
+ }
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wgcc-compat"
+#pragma clang diagnostic ignored "-Wformat-security"
+ /// Print \p Format, instantiated with \p Args to stderr.
+ /// TODO: Allow redirection into a file stream.
+ template <typename... ArgsTy>
+ [[gnu::format(__printf__, 1, 2)]] static void print(const char *Format,
+ ArgsTy &&...Args) {
+ raw_fd_ostream OS(STDERR_FILENO, false);
+ OS << llvm::format(Format, Args...);
+ }
+
+ /// Print \p Format, instantiated with \p Args to stderr, but colored.
+ /// TODO: Allow redirection into a file stream.
+ template <typename... ArgsTy>
+ [[gnu::format(__printf__, 2, 3)]] static void
+ print(ColorTy Color, const char *Format, ArgsTy &&...Args) {
+ raw_fd_ostream OS(STDERR_FILENO, false);
+ WithColor(OS, HighlightColor(Color)) << llvm::format(Format, Args...);
+ }
+
+ /// Print \p Format, instantiated with \p Args to stderr, but colored and with
+ /// a banner.
+ /// TODO: Allow redirection into a file stream.
+ template <typename... ArgsTy>
+ [[gnu::format(__printf__, 1, 2)]] static void reportError(const char *Format,
+ ArgsTy &&...Args) {
+ raw_fd_ostream OS(STDERR_FILENO, false);
+ WithColor(OS, HighlightColor::Error)
+ << ErrorBanner << llvm::format(Format, Args...) << "\n";
+ }
+#pragma clang diagnostic pop
+
+ static void reportError(const char *Str) { reportError("%s", Str); }
+ static void print(const char *Str) { print("%s", Str); }
+ static void print(StringRef Str) { print("%s", Str.str().c_str()); }
+ static void print(ColorTy Color, const char *Str) { print(Color, "%s", Str); }
+ static void print(ColorTy Color, StringRef Str) {
+ print(Color, "%s", Str.str().c_str());
+ }
+
+ /// Pretty print a stack trace.
+ static void reportStackTrace(StringRef StackTrace) {
----------------
jdoerfert wrote:
We use LLVM to get the stack trace as string.
>From there, we 1) remove the first line (nobody want's to know we are printing the stack trace) 2) add color and 3) decide where to print it to (for now stderr).
Top is LLVMs stack trace as printed to errs(), bottom what we print with this.
<img width="1467" alt="Screenshot 2024-07-25 at 12 56 16 PM" src="https://github.com/user-attachments/assets/b7086eac-ff34-4c19-8881-b91fcb99e2ed">
https://github.com/llvm/llvm-project/pull/100261
More information about the Openmp-commits
mailing list