diff --git a/compiler-rt/lib/orc/CMakeLists.txt b/compiler-rt/lib/orc/CMakeLists.txt --- a/compiler-rt/lib/orc/CMakeLists.txt +++ b/compiler-rt/lib/orc/CMakeLists.txt @@ -2,6 +2,7 @@ # ORC runtime library implementation files. set(ORC_SOURCES + debug.cpp extensible_rtti.cpp log_error_to_stderr.cpp macho_ehframe_registration.cpp diff --git a/compiler-rt/lib/orc/debug.h b/compiler-rt/lib/orc/debug.h new file mode 100644 --- /dev/null +++ b/compiler-rt/lib/orc/debug.h @@ -0,0 +1,49 @@ +//===- 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 + +namespace __orc_rt { +struct DebugStates { + enum Values { Uninitialized, Disabled, Enabled }; +}; + +extern std::atomic DebugState; +void initializeDebug(); +bool isCurrentDebugType(const char *Type); +} // namespace __orc_rt + +#ifndef NDEBUG + +#define ORC_RT_DEBUG_WITH_TYPE(TYPE, X) \ + do { \ + if (::__orc_rt::DebugState == DebugStates::Uninitialized) \ + initializeDebug(); \ + if (::__orc_rt::DebugState == DebugStates::Enabled && \ + ::__orc_rt::isCurrentDebugType(TYPE)) \ + 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 diff --git a/compiler-rt/lib/orc/debug.cpp b/compiler-rt/lib/orc/debug.cpp new file mode 100644 --- /dev/null +++ b/compiler-rt/lib/orc/debug.cpp @@ -0,0 +1,56 @@ +//===- 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 + +namespace __orc_rt { + +std::atomic DebugState; +std::atomic DebugTypes; + +/// 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. +void initializeDebug() { + if (const char *DT = getenv("ORC_RT_DEBUG_TYPES")) + DebugTypes = DT; + if (getenv("ORC_RT_DEBUG")) + DebugState = DebugStates::Enabled; + else + DebugState = DebugStates::Disabled; +} + +bool isCurrentDebugType(const char *Type) { + if (!DebugTypes) + return true; + + size_t TypeLen = strlen(Type); + const char *Start = DebugTypes; + 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; + if (*End == ',') + Start = End + 1; + } + ++End; + } while (true); +} + +} // end namespace __orc_rt