--- /dev/null
+//===- debug.cpp ----------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of the ORC runtime support library.
+//
+//===----------------------------------------------------------------------===//
+
+#include "debug.h"
+
+#include <cassert>
+#include <cstdio>
+#include <cstdlib>
+
+namespace __orc_rt {
+
+#ifndef NDEBUG
+
+std::atomic<const char *> DebugTypes;
+char DebugTypesAll;
+char DebugTypesNone;
+
+/// Sets the DebugState and DebugTypes values -- this function may be called
+/// concurrently on multiple threads, but will always assign the same values so
+/// this should be safe.
+const char *initializeDebug() {
+ if (const char *DT = getenv("ORC_RT_DEBUG")) {
+ // If ORC_RT_DEBUG=1 then log everything.
+ if (strcmp(DT, "1") == 0) {
+ DebugTypes.store(&DebugTypesAll, std::memory_order_relaxed);
+ return &DebugTypesAll;
+ }
+
+ // If ORC_RT_DEBUG is non-empty then record the string for use in
+ // debugTypeEnabled.
+ if (strcmp(DT, "") != 0) {
+ DebugTypes.store(DT, std::memory_order_relaxed);
+ return DT;
+ }
+ }
+
+ // If ORT_RT_DEBUG is undefined or defined as empty then log nothing.
+ DebugTypes.store(&DebugTypesNone, std::memory_order_relaxed);
+ return &DebugTypesNone;
+}
+
+bool debugTypeEnabled(const char *Type, const char *Types) {
+ assert(Types && Types != &DebugTypesAll && Types != &DebugTypesNone &&
+ "Invalid Types value");
+ size_t TypeLen = strlen(Type);
+ const char *Start = Types;
+ const char *End = Start;
+
+ do {
+ if (*End == '\0' || *End == ',') {
+ size_t ItemLen = End - Start;
+ if (ItemLen == TypeLen && memcmp(Type, Start, TypeLen) == 0)
+ return true;
+ if (*End == '\0')
+ return false;
+ Start = End + 1;
+ }
+ ++End;
+ } while (true);
+}
+
+void printdbg(const char *format, ...) {
+ va_list Args;
+ va_start(Args, format);
+ vfprintf(stderr, format, Args);
+ va_end(Args);
+}
+
+#endif // !NDEBUG
+
+} // end namespace __orc_rt
--- /dev/null
+//===- debug.h - Debugging output utilities ---------------------*- 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
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of the ORC runtime support library.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef ORC_RT_DEBUG_H
+#define ORC_RT_DEBUG_H
+
+#include <atomic>
+
+#ifndef NDEBUG
+
+namespace __orc_rt {
+
+extern std::atomic<const char *> DebugTypes;
+extern char DebugTypesAll;
+extern char DebugTypesNone;
+
+const char *initializeDebug();
+bool debugTypeEnabled(const char *Type, const char *Types);
+void printdbg(const char *format, ...);
+
+} // namespace __orc_rt
+
+#define ORC_RT_DEBUG_WITH_TYPE(TYPE, X) \
+ do { \
+ const char *Types = \
+ ::__orc_rt::DebugTypes.load(std::memory_order_relaxed); \
+ if (!Types) \
+ Types = initializeDebug(); \
+ if (Types == &DebugTypesNone) \
+ break; \
+ if (Types == &DebugTypesAll || \
+ ::__orc_rt::debugTypeEnabled(TYPE, Types)) { \
+ X; \
+ } \
+ } while (false)
+
+#else
+
+#define ORC_RT_DEBUG_WITH_TYPE(TYPE, X) \
+ do { \
+ } while (false)
+
+#endif // !NDEBUG
+
+#define ORC_RT_DEBUG(X) ORC_RT_DEBUG_WITH_TYPE(DEBUG_TYPE, X)
+
+#endif // ORC_RT_COMMON_H