diff --git a/offload/include/Shared/Debug.h b/offload/include/Shared/Debug.h index d5cf719f1ebf3..2ff0eb80788b8 100644 --- a/offload/include/Shared/Debug.h +++ b/offload/include/Shared/Debug.h @@ -432,15 +432,22 @@ static inline raw_ostream &operator<<(raw_ostream &Os, // helper templates to support lambdas with different number of arguments template struct LambdaHelper { - template > - struct has_two_args : std::false_type {}; - template - struct has_two_args().operator()(1, 2))>> - : std::true_type {}; + template + static constexpr size_t CountArgs(RetTy (FuncTy::*)(Args...)) { + return sizeof...(Args); + } + template + static constexpr size_t CountArgs(RetTy (FuncTy::*)(Args...) const) { + return sizeof...(Args); + } + static constexpr size_t NArgs = CountArgs(&LambdaTy::operator()); +} + +template +struct LambdaOs : public LambdaHelper { static void dispatch(LambdaTy func, llvm::raw_ostream &Os, uint32_t Level) { - if constexpr (has_two_args::value) + if constexpr (NArgs == 2) func(Os, Level); else func(Os); @@ -457,8 +464,8 @@ template struct LambdaHelper { RealLevel, /*ShouldPrefixNextString=*/true, \ /*ShouldEmitNewLineOnDestruction=*/true}; \ auto F = Callback; \ - ::llvm::offload::debug::LambdaHelper::dispatch(F, OS, \ - RealLevel); \ + ::llvm::offload::debug::LambdaOs::dispatch(F, OS, \ + RealLevel); \ } \ } @@ -476,6 +483,33 @@ template struct LambdaHelper { #define ODBG_OS(...) \ ODBG_OS_SELECT(__VA_ARGS__ __VA_OPT__(, ) 3, 2, 1)(__VA_ARGS__) +// helper templates to support lambdas with different number of arguments +template struct LambdaIf : public LambdaHelper { + static void dispatch(LambdaTy func, uint32_t Level) { + if constexpr (NArgs == 1) + func(Level); + else + func(); + } +}; + +#define ODBG_IF_BASE(Type, Level, Callback) \ + if (::llvm::offload::debug::isDebugEnabled()) { \ + uint32_t RealLevel = (Level); \ + if (::llvm::offload::debug::shouldPrintDebug(GETNAME(TARGET_NAME), (Type), \ + RealLevel)) { \ + auto F = Callback; \ + ::llvm::offload::debug::LambdaIf::dispatch(F, RealLevel); \ + } \ + } + +#define ODBG_IF_3(Type, Level, Callback) ODBG_IF_BASE(Type, Level, Callback) +#define ODBG_IF_2(Type, Callback) ODBG_IF_3(Type, 1, Callback) +#define ODBG_IF_1(Callback) ODBG_IF_2("default", Callback) +#define ODBG_IF_SELECT(Type, Level, Callback, NArgs, ...) ODBG_IF_##NArgs +#define ODBG_IF(...) \ + ODBG_IF_SELECT(__VA_ARGS__ __VA_OPT__(, ) 3, 2, 1)(__VA_ARGS__) + #else inline bool isDebugEnabled() { return false; } @@ -496,6 +530,9 @@ inline bool isDebugEnabled() { return false; } #define ODBG_OS_STREAM(Stream, Type, Level, Callback) #define ODBG_OS(...) +#define ODBG_IF_BASE(Type, Level, Callback) +#define ODBG_IF(...) + #endif } // namespace llvm::offload::debug