xref: /llvm-project/compiler-rt/lib/orc/debug.cpp (revision 3e04ad428313dde40c779af6d675b162e150125e)
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>
163e9919cfSLang Hames #include <cstdarg>
171d82e19fSLang Hames #include <cstdio>
181d82e19fSLang Hames #include <cstdlib>
193e9919cfSLang Hames #include <cstring>
203e9919cfSLang Hames 
21*3e04ad42SLang Hames namespace orc_rt {
221d82e19fSLang Hames 
231d82e19fSLang Hames #ifndef NDEBUG
241d82e19fSLang Hames 
251d82e19fSLang Hames std::atomic<const char *> DebugTypes;
261d82e19fSLang Hames char DebugTypesAll;
271d82e19fSLang Hames char DebugTypesNone;
281d82e19fSLang Hames 
291d82e19fSLang Hames /// Sets the DebugState and DebugTypes values -- this function may be called
301d82e19fSLang Hames /// concurrently on multiple threads, but will always assign the same values so
311d82e19fSLang Hames /// this should be safe.
321d82e19fSLang Hames const char *initializeDebug() {
331d82e19fSLang Hames   if (const char *DT = getenv("ORC_RT_DEBUG")) {
341d82e19fSLang Hames     // If ORC_RT_DEBUG=1 then log everything.
351d82e19fSLang Hames     if (strcmp(DT, "1") == 0) {
361d82e19fSLang Hames       DebugTypes.store(&DebugTypesAll, std::memory_order_relaxed);
371d82e19fSLang Hames       return &DebugTypesAll;
381d82e19fSLang Hames     }
391d82e19fSLang Hames 
401d82e19fSLang Hames     // If ORC_RT_DEBUG is non-empty then record the string for use in
411d82e19fSLang Hames     // debugTypeEnabled.
421d82e19fSLang Hames     if (strcmp(DT, "") != 0) {
431d82e19fSLang Hames       DebugTypes.store(DT, std::memory_order_relaxed);
441d82e19fSLang Hames       return DT;
451d82e19fSLang Hames     }
461d82e19fSLang Hames   }
471d82e19fSLang Hames 
481d82e19fSLang Hames   // If ORT_RT_DEBUG is undefined or defined as empty then log nothing.
491d82e19fSLang Hames   DebugTypes.store(&DebugTypesNone, std::memory_order_relaxed);
501d82e19fSLang Hames   return &DebugTypesNone;
511d82e19fSLang Hames }
521d82e19fSLang Hames 
531d82e19fSLang Hames bool debugTypeEnabled(const char *Type, const char *Types) {
541d82e19fSLang Hames   assert(Types && Types != &DebugTypesAll && Types != &DebugTypesNone &&
551d82e19fSLang Hames          "Invalid Types value");
561d82e19fSLang Hames   size_t TypeLen = strlen(Type);
571d82e19fSLang Hames   const char *Start = Types;
581d82e19fSLang Hames   const char *End = Start;
591d82e19fSLang Hames 
601d82e19fSLang Hames   do {
611d82e19fSLang Hames     if (*End == '\0' || *End == ',') {
621d82e19fSLang Hames       size_t ItemLen = End - Start;
631d82e19fSLang Hames       if (ItemLen == TypeLen && memcmp(Type, Start, TypeLen) == 0)
641d82e19fSLang Hames         return true;
651d82e19fSLang Hames       if (*End == '\0')
661d82e19fSLang Hames         return false;
671d82e19fSLang Hames       Start = End + 1;
681d82e19fSLang Hames     }
691d82e19fSLang Hames     ++End;
701d82e19fSLang Hames   } while (true);
711d82e19fSLang Hames }
721d82e19fSLang Hames 
731d82e19fSLang Hames void printdbg(const char *format, ...) {
741d82e19fSLang Hames   va_list Args;
751d82e19fSLang Hames   va_start(Args, format);
761d82e19fSLang Hames   vfprintf(stderr, format, Args);
771d82e19fSLang Hames   va_end(Args);
781d82e19fSLang Hames }
791d82e19fSLang Hames 
801d82e19fSLang Hames #endif // !NDEBUG
811d82e19fSLang Hames 
82*3e04ad42SLang Hames } // namespace orc_rt
83