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