1 //===--- Debug.cpp -------- Debug utilities ----------------------- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file contains debug utilities 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "Debug.h" 14 #include "Configuration.h" 15 #include "Interface.h" 16 #include "Mapping.h" 17 #include "Types.h" 18 19 using namespace _OMP; 20 21 #pragma omp begin declare target device_type(nohost) 22 23 extern "C" { 24 void __assert_assume(bool condition) { __builtin_assume(condition); } 25 26 void __assert_fail(const char *assertion, const char *file, unsigned line, 27 const char *function) { 28 PRINTF("%s:%u: %s: Assertion `%s' failed.\n", file, line, function, 29 assertion); 30 __builtin_trap(); 31 } 32 33 namespace impl { 34 int32_t omp_vprintf(const char *Format, void *Arguments, uint32_t); 35 } 36 37 #pragma omp begin declare variant match( \ 38 device = {arch(nvptx, nvptx64)}, implementation = {extension(match_any)}) 39 int32_t vprintf(const char *, void *); 40 namespace impl { 41 int32_t omp_vprintf(const char *Format, void *Arguments, uint32_t) { 42 return vprintf(Format, Arguments); 43 } 44 } // namespace impl 45 #pragma omp end declare variant 46 47 // We do not have a vprintf implementation for AMD GPU yet so we use a stub. 48 #pragma omp begin declare variant match(device = {arch(amdgcn)}) 49 namespace impl { 50 int32_t omp_vprintf(const char *Format, void *Arguments, uint32_t) { 51 return -1; 52 } 53 } // namespace impl 54 #pragma omp end declare variant 55 56 int32_t __llvm_omp_vprintf(const char *Format, void *Arguments, uint32_t Size) { 57 return impl::omp_vprintf(Format, Arguments, Size); 58 } 59 } 60 61 /// Current indentation level for the function trace. Only accessed by thread 0. 62 __attribute__((loader_uninitialized)) static uint32_t Level; 63 #pragma omp allocate(Level) allocator(omp_pteam_mem_alloc) 64 65 DebugEntryRAII::DebugEntryRAII(const char *File, const unsigned Line, 66 const char *Function) { 67 if (config::isDebugMode(config::DebugKind::FunctionTracing) && 68 mapping::getThreadIdInBlock() == 0 && mapping::getBlockId() == 0) { 69 70 for (int I = 0; I < Level; ++I) 71 PRINTF("%s", " "); 72 73 PRINTF("%s:%u: Thread %u Entering %s\n", File, Line, 74 mapping::getThreadIdInBlock(), Function); 75 Level++; 76 } 77 } 78 79 DebugEntryRAII::~DebugEntryRAII() { 80 if (config::isDebugMode(config::DebugKind::FunctionTracing) && 81 mapping::getThreadIdInBlock() == 0 && mapping::getBlockId() == 0) 82 Level--; 83 } 84 85 void DebugEntryRAII::init() { Level = 0; } 86 87 #pragma omp end declare target 88