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