167ab875fSJohannes Doerfert //===--- Debug.cpp -------- Debug utilities ----------------------- C++ -*-===//
267ab875fSJohannes Doerfert //
367ab875fSJohannes Doerfert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
467ab875fSJohannes Doerfert // See https://llvm.org/LICENSE.txt for license information.
567ab875fSJohannes Doerfert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
667ab875fSJohannes Doerfert //
767ab875fSJohannes Doerfert //===----------------------------------------------------------------------===//
867ab875fSJohannes Doerfert //
967ab875fSJohannes Doerfert // This file contains debug utilities
1067ab875fSJohannes Doerfert //
1167ab875fSJohannes Doerfert //===----------------------------------------------------------------------===//
1267ab875fSJohannes Doerfert 
1367ab875fSJohannes Doerfert #include "Debug.h"
1467ab875fSJohannes Doerfert #include "Configuration.h"
1574f91741SJoseph Huber #include "Interface.h"
16277b681eSJoseph Huber #include "Mapping.h"
17277b681eSJoseph Huber #include "Types.h"
1867ab875fSJohannes Doerfert 
1967ab875fSJohannes Doerfert using namespace _OMP;
2067ab875fSJohannes Doerfert 
21b4f8443dSJoseph Huber #pragma omp begin declare target device_type(nohost)
2267ab875fSJohannes Doerfert 
2367ab875fSJohannes Doerfert extern "C" {
__assert_assume(bool condition)242c6a4e56SJoseph Huber void __assert_assume(bool condition) { __builtin_assume(condition); }
25b266bcb1SJoseph Huber 
__assert_fail(const char * assertion,const char * file,unsigned line,const char * function)26b266bcb1SJoseph Huber void __assert_fail(const char *assertion, const char *file, unsigned line,
27b266bcb1SJoseph Huber                    const char *function) {
28b266bcb1SJoseph Huber   PRINTF("%s:%u: %s: Assertion `%s' failed.\n", file, line, function,
29b266bcb1SJoseph Huber          assertion);
30b266bcb1SJoseph Huber   __builtin_trap();
31b266bcb1SJoseph Huber }
3227177b82SJon Chesterfield 
33b4f8443dSJoseph Huber namespace impl {
34b4f8443dSJoseph Huber int32_t omp_vprintf(const char *Format, void *Arguments, uint32_t);
35b4f8443dSJoseph Huber }
36b4f8443dSJoseph Huber 
3727177b82SJon Chesterfield #pragma omp begin declare variant match(                                       \
3827177b82SJon Chesterfield     device = {arch(nvptx, nvptx64)}, implementation = {extension(match_any)})
39*ae766526SJoseph Huber int32_t vprintf(const char *, void *);
4027177b82SJon Chesterfield namespace impl {
omp_vprintf(const char * Format,void * Arguments,uint32_t)41ce0caf41SJoseph Huber int32_t omp_vprintf(const char *Format, void *Arguments, uint32_t) {
4227177b82SJon Chesterfield   return vprintf(Format, Arguments);
4327177b82SJon Chesterfield }
4427177b82SJon Chesterfield } // namespace impl
4527177b82SJon Chesterfield #pragma omp end declare variant
4627177b82SJon Chesterfield 
4727177b82SJon Chesterfield // We do not have a vprintf implementation for AMD GPU yet so we use a stub.
4827177b82SJon Chesterfield #pragma omp begin declare variant match(device = {arch(amdgcn)})
4927177b82SJon Chesterfield namespace impl {
omp_vprintf(const char * Format,void * Arguments,uint32_t)50ce0caf41SJoseph Huber int32_t omp_vprintf(const char *Format, void *Arguments, uint32_t) {
5127177b82SJon Chesterfield   return -1;
5227177b82SJon Chesterfield }
5327177b82SJon Chesterfield } // namespace impl
5427177b82SJon Chesterfield #pragma omp end declare variant
5527177b82SJon Chesterfield 
__llvm_omp_vprintf(const char * Format,void * Arguments,uint32_t Size)5627177b82SJon Chesterfield int32_t __llvm_omp_vprintf(const char *Format, void *Arguments, uint32_t Size) {
5727177b82SJon Chesterfield   return impl::omp_vprintf(Format, Arguments, Size);
5827177b82SJon Chesterfield }
5967ab875fSJohannes Doerfert }
6067ab875fSJohannes Doerfert 
61277b681eSJoseph Huber /// Current indentation level for the function trace. Only accessed by thread 0.
62b4f8443dSJoseph Huber __attribute__((loader_uninitialized)) static uint32_t Level;
63277b681eSJoseph Huber #pragma omp allocate(Level) allocator(omp_pteam_mem_alloc)
64277b681eSJoseph Huber 
DebugEntryRAII(const char * File,const unsigned Line,const char * Function)6574f91741SJoseph Huber DebugEntryRAII::DebugEntryRAII(const char *File, const unsigned Line,
6674f91741SJoseph Huber                                const char *Function) {
67277b681eSJoseph Huber   if (config::isDebugMode(config::DebugKind::FunctionTracing) &&
6874f91741SJoseph Huber       mapping::getThreadIdInBlock() == 0 && mapping::getBlockId() == 0) {
69277b681eSJoseph Huber 
70277b681eSJoseph Huber     for (int I = 0; I < Level; ++I)
71277b681eSJoseph Huber       PRINTF("%s", "  ");
72277b681eSJoseph Huber 
7374f91741SJoseph Huber     PRINTF("%s:%u: Thread %u Entering %s\n", File, Line,
74277b681eSJoseph Huber            mapping::getThreadIdInBlock(), Function);
75277b681eSJoseph Huber     Level++;
76277b681eSJoseph Huber   }
77277b681eSJoseph Huber }
78277b681eSJoseph Huber 
~DebugEntryRAII()79277b681eSJoseph Huber DebugEntryRAII::~DebugEntryRAII() {
80277b681eSJoseph Huber   if (config::isDebugMode(config::DebugKind::FunctionTracing) &&
8174f91741SJoseph Huber       mapping::getThreadIdInBlock() == 0 && mapping::getBlockId() == 0)
82277b681eSJoseph Huber     Level--;
83277b681eSJoseph Huber }
84277b681eSJoseph Huber 
init()85374cd0fbSJoseph Huber void DebugEntryRAII::init() { Level = 0; }
86374cd0fbSJoseph Huber 
8767ab875fSJohannes Doerfert #pragma omp end declare target
88