11d82e19fSLang Hames //===- debug.cpp ----------------------------------------------------------===//
21d82e19fSLang Hames //
31d82e19fSLang Hames // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
41d82e19fSLang Hames // See https://llvm.org/LICENSE.txt for license information.
51d82e19fSLang Hames // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
61d82e19fSLang Hames //
71d82e19fSLang Hames //===----------------------------------------------------------------------===//
81d82e19fSLang Hames //
91d82e19fSLang Hames // This file is a part of the ORC runtime support library.
101d82e19fSLang Hames //
111d82e19fSLang Hames //===----------------------------------------------------------------------===//
121d82e19fSLang Hames
131d82e19fSLang Hames #include "debug.h"
141d82e19fSLang Hames
151d82e19fSLang Hames #include <cassert>
16*3e9919cfSLang Hames #include <cstdarg>
171d82e19fSLang Hames #include <cstdio>
181d82e19fSLang Hames #include <cstdlib>
19*3e9919cfSLang Hames #include <cstring>
20*3e9919cfSLang Hames
211d82e19fSLang Hames
221d82e19fSLang Hames namespace __orc_rt {
231d82e19fSLang Hames
241d82e19fSLang Hames #ifndef NDEBUG
251d82e19fSLang Hames
261d82e19fSLang Hames std::atomic<const char *> DebugTypes;
271d82e19fSLang Hames char DebugTypesAll;
281d82e19fSLang Hames char DebugTypesNone;
291d82e19fSLang Hames
301d82e19fSLang Hames /// Sets the DebugState and DebugTypes values -- this function may be called
311d82e19fSLang Hames /// concurrently on multiple threads, but will always assign the same values so
321d82e19fSLang Hames /// this should be safe.
initializeDebug()331d82e19fSLang Hames const char *initializeDebug() {
341d82e19fSLang Hames if (const char *DT = getenv("ORC_RT_DEBUG")) {
351d82e19fSLang Hames // If ORC_RT_DEBUG=1 then log everything.
361d82e19fSLang Hames if (strcmp(DT, "1") == 0) {
371d82e19fSLang Hames DebugTypes.store(&DebugTypesAll, std::memory_order_relaxed);
381d82e19fSLang Hames return &DebugTypesAll;
391d82e19fSLang Hames }
401d82e19fSLang Hames
411d82e19fSLang Hames // If ORC_RT_DEBUG is non-empty then record the string for use in
421d82e19fSLang Hames // debugTypeEnabled.
431d82e19fSLang Hames if (strcmp(DT, "") != 0) {
441d82e19fSLang Hames DebugTypes.store(DT, std::memory_order_relaxed);
451d82e19fSLang Hames return DT;
461d82e19fSLang Hames }
471d82e19fSLang Hames }
481d82e19fSLang Hames
491d82e19fSLang Hames // If ORT_RT_DEBUG is undefined or defined as empty then log nothing.
501d82e19fSLang Hames DebugTypes.store(&DebugTypesNone, std::memory_order_relaxed);
511d82e19fSLang Hames return &DebugTypesNone;
521d82e19fSLang Hames }
531d82e19fSLang Hames
debugTypeEnabled(const char * Type,const char * Types)541d82e19fSLang Hames bool debugTypeEnabled(const char *Type, const char *Types) {
551d82e19fSLang Hames assert(Types && Types != &DebugTypesAll && Types != &DebugTypesNone &&
561d82e19fSLang Hames "Invalid Types value");
571d82e19fSLang Hames size_t TypeLen = strlen(Type);
581d82e19fSLang Hames const char *Start = Types;
591d82e19fSLang Hames const char *End = Start;
601d82e19fSLang Hames
611d82e19fSLang Hames do {
621d82e19fSLang Hames if (*End == '\0' || *End == ',') {
631d82e19fSLang Hames size_t ItemLen = End - Start;
641d82e19fSLang Hames if (ItemLen == TypeLen && memcmp(Type, Start, TypeLen) == 0)
651d82e19fSLang Hames return true;
661d82e19fSLang Hames if (*End == '\0')
671d82e19fSLang Hames return false;
681d82e19fSLang Hames Start = End + 1;
691d82e19fSLang Hames }
701d82e19fSLang Hames ++End;
711d82e19fSLang Hames } while (true);
721d82e19fSLang Hames }
731d82e19fSLang Hames
printdbg(const char * format,...)741d82e19fSLang Hames void printdbg(const char *format, ...) {
751d82e19fSLang Hames va_list Args;
761d82e19fSLang Hames va_start(Args, format);
771d82e19fSLang Hames vfprintf(stderr, format, Args);
781d82e19fSLang Hames va_end(Args);
791d82e19fSLang Hames }
801d82e19fSLang Hames
811d82e19fSLang Hames #endif // !NDEBUG
821d82e19fSLang Hames
831d82e19fSLang Hames } // end namespace __orc_rt
84