> On Jan 19, 2022, at 6:40 AM, Pavel Labath <pa...@labath.sk> wrote:
> 
> Hi all,
> 
> In case you haven't noticed, I'd like to draw your attention to the in-flight 
> patches (https://reviews.llvm.org/D117382, https://reviews.llvm.org/D117490) 
> whose goal clean up/improve/streamline the logging infrastructure.
> 
> I'm don't want go into technical details here (they're on the patch), but the 
> general idea is to replace statements like 
> GetLogIf(Any/All)CategoriesSet(LIBLLDB_LOG_CAT1 | LIBLLDB_LOG_CAT2)
> with
> GetLogIf(Any/All)(LLDBLog::Cat1 | LLDBLog::Cat2)
> i.e., drop macros and make use of templates to make the function calls 
> shorter and safer.
> 
> The reason I'm writing this email is to ask about the "All" versions of these 
> logging functions. Do you find them useful in practice?
> 
> I'm asking that because I've never used this functionality. While I can't 
> find anything wrong with the concept in theory, practically I think it's just 
> confusing to have some log message appear only for some combination of 
> enabled channels. It might have made some sense when we had a "verbose" 
> logging channel, but that one is long gone (we still have a verbose logging 
> *flag*).
> 
> In fact, out of all our GetLogIf calls (1203), less than 1% (11*) uses the 
> GetLogIfAll form with more than one category. Of those, three are in tests, 
> one is definitely a bug (it combines the category with 
> LLDB_LOG_OPTION_VERBOSE), and the others (7) are of questionable usefulness 
> (to me anyway).
> 
> If we got rid of this, we could simplify the logging calls even further and 
> have something like:
> Log *log = GetLog(LLDBLog::Process);

Can a template function deduce the log type from an argument? Wouldn't this 
have to be:

Log *log = GetLog<LLDBLog>(LLDBLog::Process);

That is why I was hinting if we want to just use the enum class itself:

Log *log = LLDBLog::GetLog(LLDBLog::Process);

The template class in your second patch seems cool, but I don't understand how 
it worked without going and reading up on templates in C++ and spending 20 
minutes trying to wrap my brain around it.

Or do we just switch to a dedicated log class with unique methods:

class LLDBLog: public Log {
  Log *Process() { return GetLog(1u << 0); }
  Log *Thread() { return GetLog(1u << 1); }
};

and avoid all the enums? Then we can't ever feed a bad enum or #define into the 
wrong log class.
_______________________________________________
lldb-dev mailing list
lldb-dev@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev

Reply via email to