124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- lldb-log.cpp --------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1684cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham#include "lldb/Interpreter/Args.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamFile.h"
19ce6fe885c2e30f5ac6e0c787cb571a01f9d41f85Eli Friedman#include <string.h>
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton// We want to avoid global constructors where code needs to be run so here we
26e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton// control access to our static g_log_sp by hiding it in a singleton function
27e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton// that will construct the static g_lob_sp the first time this function is
28e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton// called.
29952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton
30952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Claytonstatic bool g_log_enabled = false;
31952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Claytonstatic Log * g_log = NULL;
32952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Claytonstatic Log *
33e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg ClaytonGetLog ()
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    if (!g_log_enabled)
36952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton        return NULL;
37952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    return g_log;
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::GetLogMask ()
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
43952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(GetLog ());
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
45f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return log->GetMask().Get();
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::IsLogVerbose ()
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t mask = GetLogMask();
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return (mask & LIBLLDB_LOG_VERBOSE);
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg ClaytonLog *
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::GetLogIfAllCategoriesSet (uint32_t mask)
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
59952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(GetLog ());
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log && mask)
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
62f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        uint32_t log_mask = log->GetMask().Get();
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if ((log_mask & mask) != mask)
64952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton            return NULL;
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return log;
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::LogIfAllCategoriesSet (uint32_t mask, const char *format, ...)
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
72952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(GetLogIfAllCategoriesSet (mask));
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        va_list args;
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        va_start (args, format);
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->VAPrintf (format, args);
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        va_end (args);
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::LogIfAnyCategoriesSet (uint32_t mask, const char *format, ...)
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
85952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(GetLogIfAnyCategoriesSet (mask));
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        va_list args;
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        va_start (args, format);
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->VAPrintf (format, args);
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        va_end (args);
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
95952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg ClaytonLog *
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::GetLogIfAnyCategoriesSet (uint32_t mask)
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
98952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(GetLog ());
99f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (log && mask && (mask & log->GetMask().Get()))
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return log;
101952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    return NULL;
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
1056c530f2201be4788dedf3d5970399220fbd50b11Jim Inghamlldb_private::DisableLog (const char **categories, Stream *feedback_strm)
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
107952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(GetLog ());
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
109926060e198137f8a64face70455324a8cd4362a5Caroline Tice    if (log)
110926060e198137f8a64face70455324a8cd4362a5Caroline Tice    {
111990de7bb41d3afec6b789155408ff322187d8682Greg Clayton        uint32_t flag_bits = 0;
1126c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham        if (categories[0] != NULL)
113926060e198137f8a64face70455324a8cd4362a5Caroline Tice        {
114990de7bb41d3afec6b789155408ff322187d8682Greg Clayton            flag_bits = log->GetMask().Get();
1156c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham            for (size_t i = 0; categories[i] != NULL; ++i)
116926060e198137f8a64face70455324a8cd4362a5Caroline Tice            {
1176c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham                const char *arg = categories[i];
118990de7bb41d3afec6b789155408ff322187d8682Greg Clayton
119d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton                if      (0 == ::strcasecmp(arg, "all"))         flag_bits &= ~LIBLLDB_LOG_ALL;
120d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton                else if (0 == ::strcasecmp(arg, "api"))         flag_bits &= ~LIBLLDB_LOG_API;
121d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton                else if (0 == ::strncasecmp(arg, "break", 5))   flag_bits &= ~LIBLLDB_LOG_BREAKPOINTS;
122d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton                else if (0 == ::strcasecmp(arg, "commands"))    flag_bits &= ~LIBLLDB_LOG_COMMANDS;
123d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton                else if (0 == ::strcasecmp(arg, "default"))     flag_bits &= ~LIBLLDB_LOG_DEFAULT;
124d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton                else if (0 == ::strcasecmp(arg, "dyld"))        flag_bits &= ~LIBLLDB_LOG_DYNAMIC_LOADER;
125d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton                else if (0 == ::strncasecmp(arg, "event", 5))   flag_bits &= ~LIBLLDB_LOG_EVENTS;
126d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton                else if (0 == ::strncasecmp(arg, "expr", 4))    flag_bits &= ~LIBLLDB_LOG_EXPRESSIONS;
127d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton                else if (0 == ::strncasecmp(arg, "object", 6))  flag_bits &= ~LIBLLDB_LOG_OBJECT;
128d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton                else if (0 == ::strcasecmp(arg, "process"))     flag_bits &= ~LIBLLDB_LOG_PROCESS;
129d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton                else if (0 == ::strcasecmp(arg, "script"))      flag_bits &= ~LIBLLDB_LOG_SCRIPT;
130d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton                else if (0 == ::strcasecmp(arg, "state"))       flag_bits &= ~LIBLLDB_LOG_STATE;
131d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton                else if (0 == ::strcasecmp(arg, "step"))        flag_bits &= ~LIBLLDB_LOG_STEP;
132d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton                else if (0 == ::strcasecmp(arg, "thread"))      flag_bits &= ~LIBLLDB_LOG_THREAD;
1338c6cf432039ef0c4dd2d10f98511438a4c204f4fJason Molenda                else if (0 == ::strcasecmp(arg, "target"))      flag_bits &= ~LIBLLDB_LOG_TARGET;
134d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton                else if (0 == ::strcasecmp(arg, "verbose"))     flag_bits &= ~LIBLLDB_LOG_VERBOSE;
135d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton                else if (0 == ::strncasecmp(arg, "watch", 5))   flag_bits &= ~LIBLLDB_LOG_WATCHPOINTS;
136d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton                else if (0 == ::strncasecmp(arg, "temp", 4))    flag_bits &= ~LIBLLDB_LOG_TEMPORARY;
137d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton                else if (0 == ::strncasecmp(arg, "comm", 4))    flag_bits &= ~LIBLLDB_LOG_COMMUNICATION;
138d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton                else if (0 == ::strncasecmp(arg, "conn", 4))    flag_bits &= ~LIBLLDB_LOG_CONNECTION;
139d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton                else if (0 == ::strncasecmp(arg, "host", 4))    flag_bits &= ~LIBLLDB_LOG_HOST;
140d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton                else if (0 == ::strncasecmp(arg, "unwind", 6))  flag_bits &= ~LIBLLDB_LOG_UNWIND;
141de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                else if (0 == ::strncasecmp(arg, "types", 5))   flag_bits &= ~LIBLLDB_LOG_TYPES;
142ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton                else if (0 == ::strncasecmp(arg, "symbol", 6))  flag_bits &= ~LIBLLDB_LOG_SYMBOLS;
143f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton                else if (0 == ::strncasecmp(arg, "module", 6))  flag_bits &= ~LIBLLDB_LOG_MODULES;
144cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                else if (0 == ::strncasecmp(arg, "mmap", 4))    flag_bits &= ~LIBLLDB_LOG_MMAP;
1458c2c41ebe01681932affbfd5d8fbe582b887bb08Greg Clayton                else if (0 == ::strcasecmp(arg, "os"))          flag_bits &= ~LIBLLDB_LOG_OS;
146990de7bb41d3afec6b789155408ff322187d8682Greg Clayton                else
147990de7bb41d3afec6b789155408ff322187d8682Greg Clayton                {
148990de7bb41d3afec6b789155408ff322187d8682Greg Clayton                    feedback_strm->Printf ("error:  unrecognized log category '%s'\n", arg);
149990de7bb41d3afec6b789155408ff322187d8682Greg Clayton                    ListLogCategories (feedback_strm);
150990de7bb41d3afec6b789155408ff322187d8682Greg Clayton                    return;
151990de7bb41d3afec6b789155408ff322187d8682Greg Clayton                }
152990de7bb41d3afec6b789155408ff322187d8682Greg Clayton
153926060e198137f8a64face70455324a8cd4362a5Caroline Tice            }
154926060e198137f8a64face70455324a8cd4362a5Caroline Tice        }
155952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton        log->GetMask().Reset (flag_bits);
156926060e198137f8a64face70455324a8cd4362a5Caroline Tice        if (flag_bits == 0)
157952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton            g_log_enabled = false;
158926060e198137f8a64face70455324a8cd4362a5Caroline Tice    }
159926060e198137f8a64face70455324a8cd4362a5Caroline Tice
160926060e198137f8a64face70455324a8cd4362a5Caroline Tice    return;
161926060e198137f8a64face70455324a8cd4362a5Caroline Tice}
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
163952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg ClaytonLog *
1646c530f2201be4788dedf3d5970399220fbd50b11Jim Inghamlldb_private::EnableLog (StreamSP &log_stream_sp, uint32_t log_options, const char **categories, Stream *feedback_strm)
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Try see if there already is a log - that way we can reuse its settings.
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // We could reuse the log in toto, but we don't know that the stream is the same.
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t flag_bits;
169952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    if (g_log)
170952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton        flag_bits = g_log->GetMask().Get();
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        flag_bits = 0;
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
174e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    // Now make a new log with this stream if one was provided
175e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    if (log_stream_sp)
176e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    {
177952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton        if (g_log)
178952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton            g_log->SetStream(log_stream_sp);
179952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton        else
180952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton            g_log = new Log(log_stream_sp);
181e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    }
182e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton
183952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    if (g_log)
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1856c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham        for (size_t i=0; categories[i] != NULL; ++i)
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
1876c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham            const char *arg = categories[i];
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
189d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton            if      (0 == ::strcasecmp(arg, "all"))         flag_bits |= LIBLLDB_LOG_ALL;
190d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton            else if (0 == ::strcasecmp(arg, "api"))         flag_bits |= LIBLLDB_LOG_API;
191d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton            else if (0 == ::strncasecmp(arg, "break", 5))   flag_bits |= LIBLLDB_LOG_BREAKPOINTS;
192d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton            else if (0 == ::strcasecmp(arg, "commands"))    flag_bits |= LIBLLDB_LOG_COMMANDS;
193d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton            else if (0 == ::strcasecmp(arg, "default"))     flag_bits |= LIBLLDB_LOG_DEFAULT;
194d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton            else if (0 == ::strcasecmp(arg, "dyld"))        flag_bits |= LIBLLDB_LOG_DYNAMIC_LOADER;
195d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton            else if (0 == ::strncasecmp(arg, "event", 5))   flag_bits |= LIBLLDB_LOG_EVENTS;
196d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton            else if (0 == ::strncasecmp(arg, "expr", 4))    flag_bits |= LIBLLDB_LOG_EXPRESSIONS;
197d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton            else if (0 == ::strncasecmp(arg, "object", 6))  flag_bits |= LIBLLDB_LOG_OBJECT;
198d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton            else if (0 == ::strcasecmp(arg, "process"))     flag_bits |= LIBLLDB_LOG_PROCESS;
199d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton            else if (0 == ::strcasecmp(arg, "script"))      flag_bits |= LIBLLDB_LOG_SCRIPT;
200d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton            else if (0 == ::strcasecmp(arg, "state"))       flag_bits |= LIBLLDB_LOG_STATE;
201d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton            else if (0 == ::strcasecmp(arg, "step"))        flag_bits |= LIBLLDB_LOG_STEP;
202d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton            else if (0 == ::strcasecmp(arg, "thread"))      flag_bits |= LIBLLDB_LOG_THREAD;
2038c6cf432039ef0c4dd2d10f98511438a4c204f4fJason Molenda            else if (0 == ::strcasecmp(arg, "target"))      flag_bits |= LIBLLDB_LOG_TARGET;
204d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton            else if (0 == ::strcasecmp(arg, "verbose"))     flag_bits |= LIBLLDB_LOG_VERBOSE;
205d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton            else if (0 == ::strncasecmp(arg, "watch", 5))   flag_bits |= LIBLLDB_LOG_WATCHPOINTS;
206d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton            else if (0 == ::strncasecmp(arg, "temp", 4))    flag_bits |= LIBLLDB_LOG_TEMPORARY;
207d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton            else if (0 == ::strncasecmp(arg, "comm", 4))    flag_bits |= LIBLLDB_LOG_COMMUNICATION;
208d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton            else if (0 == ::strncasecmp(arg, "conn", 4))    flag_bits |= LIBLLDB_LOG_CONNECTION;
209d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton            else if (0 == ::strncasecmp(arg, "host", 4))    flag_bits |= LIBLLDB_LOG_HOST;
210d5f76bbe035329cb4270d1462bd052204228af94Greg Clayton            else if (0 == ::strncasecmp(arg, "unwind", 6))  flag_bits |= LIBLLDB_LOG_UNWIND;
211de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            else if (0 == ::strncasecmp(arg, "types", 5))   flag_bits |= LIBLLDB_LOG_TYPES;
212ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987Greg Clayton            else if (0 == ::strncasecmp(arg, "symbol", 6))  flag_bits |= LIBLLDB_LOG_SYMBOLS;
213f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton            else if (0 == ::strncasecmp(arg, "module", 6))  flag_bits |= LIBLLDB_LOG_MODULES;
214cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton            else if (0 == ::strncasecmp(arg, "mmap", 4))    flag_bits |= LIBLLDB_LOG_MMAP;
2158c2c41ebe01681932affbfd5d8fbe582b887bb08Greg Clayton            else if (0 == ::strcasecmp(arg, "os"))          flag_bits |= LIBLLDB_LOG_OS;
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                feedback_strm->Printf("error: unrecognized log category '%s'\n", arg);
2197aeed48580d388af7c496b9cb95b7ed7e34580cdGreg Clayton                ListLogCategories (feedback_strm);
220952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton                return g_log;
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
224952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton        g_log->GetMask().Reset(flag_bits);
225952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton        g_log->GetOptions().Reset(log_options);
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
227952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    g_log_enabled = true;
228952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    return g_log;
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::ListLogCategories (Stream *strm)
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    strm->Printf("Logging categories for 'lldb':\n"
236f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton                 "  all - turn on all available logging categories\n"
237f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton                 "  api - enable logging of API calls and return values\n"
238f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton                 "  break - log breakpoints\n"
2398b8a8303efbd6e8c4fa8224428c0c0f02db9d859Andrew Kaylor                 "  commands - log command argument parsing\n"
240f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton                 "  default - enable the default set of logging categories for liblldb\n"
241f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton                 "  dyld - log shared library related activities\n"
242f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton                 "  events - log broadcaster, listener and event queue activities\n"
243f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton                 "  expr - log expressions\n"
244f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton                 "  object - log object construction/destruction for important objects\n"
245f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton                 "  module - log module activities such as when modules are created, detroyed, replaced, and more\n"
246f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton                 "  process - log process events and activities\n"
247f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton                 "  script - log events about the script interpreter\n"
248f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton                 "  state - log private and public process state changes\n"
249f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton                 "  step - log step related activities\n"
250f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton                 "  symbol - log symbol related issues and warnings\n"
2518c6cf432039ef0c4dd2d10f98511438a4c204f4fJason Molenda                 "  target - log target events and activities\n"
252f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton                 "  thread - log thread events and activities\n"
253f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton                 "  types - log type system related activities\n"
254f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton                 "  unwind - log stack unwind activities\n"
255f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton                 "  verbose - enable verbose logging\n"
256f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton                 "  watch - log watchpoint related activities\n");
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
258