[Lldb-commits] [lldb] r279198 - Add StructuredData plugin type; showcase with new DarwinLog feature

Todd Fiala via lldb-commits lldb-commits at lists.llvm.org
Fri Aug 19 09:23:10 PDT 2016


(Since it never collided before, I never had to be that precise and I
always got the right entry on the list).

On Fri, Aug 19, 2016 at 9:22 AM, Todd Fiala <todd.fiala at gmail.com> wrote:

> That is indeed what happened.  On July 18th, 2016, Kate created a
> reviews.llvm.org entity called LLDB, which is a group that anyone can
> join (see link below):
>
> https://reviews.llvm.org/project/profile/39/
>
> Up until moments ago, she was the only member of the group.  (I just added
> myself).
>
> And I see how that would truncate the auto completion of lldb-commits.
>
> -Todd
>
>
> On Fri, Aug 19, 2016 at 8:56 AM, Todd Fiala <todd.fiala at gmail.com> wrote:
>
>> Ah okay. I usually type LLDB and it auto completes to the right thing. I
>> wonder if a new id with name LLDB was added - it appears to be valid - and
>> if that short circuited my normal lookup process. I'll look into that to
>> see if that's the case, as this probably won't be the only time when that
>> will happen.
>>
>> -Todd
>>
>> On Friday, August 19, 2016, Pavel Labath <labath at google.com> wrote:
>>
>>> You added LLDB as a subsriber. I don't know what that is, but the
>>> correct name for the list is "lldb-commits".
>>>
>>> pl
>>>
>>> On 19 August 2016 at 04:54, Todd Fiala via lldb-commits
>>> <lldb-commits at lists.llvm.org> wrote:
>>> > Huh, that is totally weird.  I wonder what happened there?
>>> >
>>> > On Thu, Aug 18, 2016 at 8:12 PM, Zachary Turner <zturner at google.com>
>>> wrote:
>>> >>
>>> >> Weird, you linked to a phabricator revision but i never saw it come
>>> across
>>> >> to the mailing list
>>> >>
>>> >> On Thu, Aug 18, 2016 at 8:00 PM Todd Fiala via lldb-commits
>>> >> <lldb-commits at lists.llvm.org> wrote:
>>> >>>
>>> >>> Author: tfiala
>>> >>> Date: Thu Aug 18 21:52:07 2016
>>> >>> New Revision: 279198
>>> >>>
>>> >>> URL: http://llvm.org/viewvc/llvm-project?rev=279198&view=rev
>>> >>> Log:
>>> >>> Add StructuredData plugin type; showcase with new DarwinLog feature
>>> >>>
>>> >>> See docs/structured_data/StructuredDataPlugins.md for details.
>>> >>>
>>> >>> differential review: https://reviews.llvm.org/D22976
>>> >>>
>>> >>> reviewers: clayborg, jingham
>>> >>>
>>> >>> Added:
>>> >>>     lldb/trunk/docs/structured_data/
>>> >>>     lldb/trunk/docs/structured_data/DarwinLog.md
>>> >>>     lldb/trunk/docs/structured_data/StructuredDataPlugins.md
>>> >>>     lldb/trunk/include/lldb/API/SBStructuredData.h
>>> >>>     lldb/trunk/include/lldb/Target/StructuredDataPlugin.h
>>> >>>     lldb/trunk/include/lldb/Target/ThreadPlanCallOnFunctionExit.h
>>> >>>     lldb/trunk/packages/Python/lldbsuite/test/darwin_log.py
>>> >>>     lldb/trunk/packages/Python/lldbsuite/test/functionalities/d
>>> arwin_log/
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/basic/
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/basic/Makefile
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/basic/TestDarwinLogBasic.py
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/basic/main.c
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/common/
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/common/darwin_log_common.h
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/exact_match/
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/exact_match/activity/
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/exact_match/activity-chain/
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/exact_match/activity-chain/Makefile
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/exact_match/activity-chain/TestDarwinLogFilt
>>> erMatchActivityChain.py
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/exact_match/activity-chain/main.c
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/exact_match/activity/Makefile
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/exact_match/activity/TestDarwinLogFilterMatchActivity.py
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/exact_match/activity/main.c
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/exact_match/category/
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/exact_match/category/Makefile
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/exact_match/category/TestDarwinLogFilterMatchCategory.py
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/exact_match/category/main.c
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/exact_match/message/
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/exact_match/message/Makefile
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/exact_match/message/TestDarwinLogFilterMatchMessage.py
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/exact_match/message/main.c
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/exact_match/subsystem/
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/exact_match/subsystem/Makefile
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/exact_match/subsystem/TestDarwinLogFilterMat
>>> chSubsystem.py
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/exact_match/subsystem/main.c
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/regex/
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/regex/activity/
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/regex/activity-chain/
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/regex/activity-chain/Makefile
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/regex/activity-chain/TestDarwinLogFilterRege
>>> xActivityChain.py
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/regex/activity-chain/main.c
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/regex/activity/Makefile
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/regex/activity/TestDarwinLogFilterRegexActivity.py
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/regex/activity/main.c
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/regex/category/
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/regex/category/Makefile
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/regex/category/TestDarwinLogFilterRegexCategory.py
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/regex/category/main.c
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/regex/message/
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/regex/message/Makefile
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/regex/message/TestDarwinLogFilterRegexMessage.py
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/regex/message/main.c
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/regex/subsystem/
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/regex/subsystem/Makefile
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/regex/subsystem/TestDarwinLogFilterRegexSubsystem.py
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/filter/regex/subsystem/main.c
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/format/
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/format/Makefile
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/format/TestDarwinLogMessageFormat.py
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/format/main.c
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/source/
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/source/debug/
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/source/debug/Makefile
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/source/debug/TestDarwinLogSourceDebug.py
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/source/debug/main.c
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/source/info/
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/source/info/Makefile
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/source/info/TestDarwinLogSourceInfo.py
>>> >>>
>>> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/da
>>> rwin_log/source/info/main.c
>>> >>>     lldb/trunk/scripts/interface/SBStructuredData.i
>>> >>>     lldb/trunk/source/API/SBStructuredData.cpp
>>> >>>     lldb/trunk/source/Plugins/StructuredData/
>>> >>>     lldb/trunk/source/Plugins/StructuredData/CMakeLists.txt
>>> >>>     lldb/trunk/source/Plugins/StructuredData/DarwinLog/
>>> >>>     lldb/trunk/source/Plugins/StructuredData/DarwinLog/CMakeLis
>>> ts.txt
>>> >>>
>>> >>> lldb/trunk/source/Plugins/StructuredData/DarwinLog/Structure
>>> dDataDarwinLog.cpp
>>> >>>
>>> >>> lldb/trunk/source/Plugins/StructuredData/DarwinLog/Structure
>>> dDataDarwinLog.h
>>> >>>     lldb/trunk/source/Target/StructuredDataPlugin.cpp
>>> >>>     lldb/trunk/source/Target/ThreadPlanCallOnFunctionExit.cpp
>>> >>>     lldb/trunk/tools/debugserver/source/JSON.cpp
>>> >>>     lldb/trunk/tools/debugserver/source/JSON.h
>>> >>>     lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/
>>> >>>
>>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/Activit
>>> yStore.cpp
>>> >>>     lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/Activi
>>> tyStore.h
>>> >>>
>>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/Activit
>>> yStreamSPI.h
>>> >>>     lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/CMakeL
>>> ists.txt
>>> >>>
>>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/DarwinL
>>> ogCollector.cpp
>>> >>>
>>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/DarwinL
>>> ogCollector.h
>>> >>>     lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/Darwin
>>> LogEvent.h
>>> >>>
>>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/DarwinL
>>> ogInterfaces.h
>>> >>>     lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/Darwin
>>> LogTypes.h
>>> >>>     lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogFil
>>> ter.cpp
>>> >>>     lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogFilter.h
>>> >>>
>>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogFilt
>>> erChain.cpp
>>> >>>     lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogFil
>>> terChain.h
>>> >>>
>>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogFilt
>>> erExactMatch.cpp
>>> >>>
>>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogFilt
>>> erExactMatch.h
>>> >>>
>>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogFilt
>>> erRegex.cpp
>>> >>>     lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogFil
>>> terRegex.h
>>> >>>     lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogMes
>>> sage.cpp
>>> >>>     lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogMes
>>> sage.h
>>> >>>
>>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogMess
>>> ageOsLog.cpp
>>> >>>
>>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogMess
>>> ageOsLog.h
>>> >>>     lldb/trunk/tools/debugserver/source/MacOSX/OsLogger.cpp
>>> >>>     lldb/trunk/tools/debugserver/source/MacOSX/OsLogger.h
>>> >>> Modified:
>>> >>>     lldb/trunk/.gitignore
>>> >>>     lldb/trunk/cmake/LLDBDependencies.cmake
>>> >>>     lldb/trunk/include/lldb/API/LLDB.h
>>> >>>     lldb/trunk/include/lldb/API/SBDefines.h
>>> >>>     lldb/trunk/include/lldb/API/SBError.h
>>> >>>     lldb/trunk/include/lldb/API/SBProcess.h
>>> >>>     lldb/trunk/include/lldb/API/SBStream.h
>>> >>>     lldb/trunk/include/lldb/Core/Broadcaster.h
>>> >>>     lldb/trunk/include/lldb/Core/Event.h
>>> >>>     lldb/trunk/include/lldb/Core/PluginManager.h
>>> >>>     lldb/trunk/include/lldb/Interpreter/Args.h
>>> >>>     lldb/trunk/include/lldb/Target/Process.h
>>> >>>     lldb/trunk/include/lldb/lldb-forward.h
>>> >>>     lldb/trunk/include/lldb/lldb-private-interfaces.h
>>> >>>     lldb/trunk/lldb.xcodeproj/project.pbxproj
>>> >>>     lldb/trunk/scripts/interface/SBProcess.i
>>> >>>     lldb/trunk/scripts/interface/SBTarget.i
>>> >>>     lldb/trunk/scripts/lldb.swig
>>> >>>     lldb/trunk/source/API/CMakeLists.txt
>>> >>>     lldb/trunk/source/API/SBDebugger.cpp
>>> >>>     lldb/trunk/source/API/SBProcess.cpp
>>> >>>     lldb/trunk/source/API/SystemInitializerFull.cpp
>>> >>>     lldb/trunk/source/Core/Debugger.cpp
>>> >>>     lldb/trunk/source/Core/Event.cpp
>>> >>>     lldb/trunk/source/Core/PluginManager.cpp
>>> >>>     lldb/trunk/source/Interpreter/Args.cpp
>>> >>>     lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteClien
>>> tBase.cpp
>>> >>>     lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteClien
>>> tBase.h
>>> >>>
>>> >>> lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommun
>>> icationClient.cpp
>>> >>>
>>> >>> lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommun
>>> icationClient.h
>>> >>>     lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemo
>>> te.cpp
>>> >>>     lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
>>> >>>     lldb/trunk/source/Target/CMakeLists.txt
>>> >>>     lldb/trunk/source/Target/Platform.cpp
>>> >>>     lldb/trunk/source/Target/Process.cpp
>>> >>>     lldb/trunk/tools/debugserver/debugserver.xcodeproj/project.
>>> pbxproj
>>> >>>     lldb/trunk/tools/debugserver/source/CMakeLists.txt
>>> >>>     lldb/trunk/tools/debugserver/source/DNB.cpp
>>> >>>     lldb/trunk/tools/debugserver/source/DNB.h
>>> >>>     lldb/trunk/tools/debugserver/source/DNBDefs.h
>>> >>>     lldb/trunk/tools/debugserver/source/MacOSX/CMakeLists.txt
>>> >>>     lldb/trunk/tools/debugserver/source/RNBContext.cpp
>>> >>>     lldb/trunk/tools/debugserver/source/RNBContext.h
>>> >>>     lldb/trunk/tools/debugserver/source/RNBRemote.cpp
>>> >>>     lldb/trunk/tools/debugserver/source/RNBRemote.h
>>> >>>     lldb/trunk/tools/debugserver/source/debugserver.cpp
>>> >>>     lldb/trunk/tools/lldb-mi/MICmnLLDBDebugger.cpp
>>> >>>     lldb/trunk/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp
>>> >>>
>>> >>> Modified: lldb/trunk/.gitignore
>>> >>> URL:
>>> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/.gitignore?re
>>> v=279198&r1=279197&r2=279198&view=diff
>>> >>>
>>> >>> ============================================================
>>> ==================
>>> >>> --- lldb/trunk/.gitignore (original)
>>> >>> +++ lldb/trunk/.gitignore Thu Aug 18 21:52:07 2016
>>> >>> @@ -40,7 +40,18 @@ __pycache__/
>>> >>>
>>> >>>  clang-module-cache
>>> >>>
>>> >>> +# Skip ctags-style tags files
>>> >>> +tags
>>> >>> +
>>> >>>  # We should ignore Xcode-style embedding of llvm/ at lldb root dir.
>>> >>>  # Do not add trailing '/'s, they skip symlinks.
>>> >>>  /llvm
>>> >>>  /DerivedData
>>> >>> +
>>> >>> +# Ignore test trace directories.
>>> >>> +20??-??-??-??_??_??/
>>> >>> +
>>> >>> +# Ignore crashlog support files.
>>> >>> +crashinfo.lock
>>> >>> +crashinfo.so
>>> >>> +
>>> >>>
>>> >>> Modified: lldb/trunk/cmake/LLDBDependencies.cmake
>>> >>> URL:
>>> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/cmake/LLDBDep
>>> endencies.cmake?rev=279198&r1=279197&r2=279198&view=diff
>>> >>>
>>> >>> ============================================================
>>> ==================
>>> >>> --- lldb/trunk/cmake/LLDBDependencies.cmake (original)
>>> >>> +++ lldb/trunk/cmake/LLDBDependencies.cmake Thu Aug 18 21:52:07 2016
>>> >>> @@ -47,6 +47,7 @@ set( LLDB_USED_LIBS
>>> >>>    lldbPluginObjectContainerMachOArchive
>>> >>>    lldbPluginObjectContainerBSDArchive
>>> >>>    lldbPluginPlatformMacOSX
>>> >>> +  lldbPluginStructuredDataDarwinLog
>>> >>>    lldbPluginDynamicLoaderMacOSXDYLD
>>> >>>    lldbPluginUnwindAssemblyInstEmulation
>>> >>>    lldbPluginUnwindAssemblyX86
>>> >>>
>>> >>> Added: lldb/trunk/docs/structured_data/DarwinLog.md
>>> >>> URL:
>>> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/docs/structur
>>> ed_data/DarwinLog.md?rev=279198&view=auto
>>> >>>
>>> >>> ============================================================
>>> ==================
>>> >>> --- lldb/trunk/docs/structured_data/DarwinLog.md (added)
>>> >>> +++ lldb/trunk/docs/structured_data/DarwinLog.md Thu Aug 18
>>> 21:52:07 2016
>>> >>> @@ -0,0 +1,160 @@
>>> >>> +# Change Notes
>>> >>> +
>>> >>> +## Summary
>>> >>> +
>>> >>> +This document describes the DarwinLog logging feature.
>>> >>> +
>>> >>> +## StructuredDataDarwinLog feature
>>> >>> +
>>> >>> +The DarwinLog feature supports logging os_log*() and NSLog()
>>> messages
>>> >>> +to the command-line lldb console, as well as making those messages
>>> >>> +available to LLDB clients via the event system.  Starting with fall
>>> >>> +2016 OSes, Apple platforms introduce a new fire-hose, stream-style
>>> >>> +logging system where the bulk of the log processing happens on the
>>> log
>>> >>> +consumer side.  This reduces logging impact on the system when there
>>> >>> +are no consumers, making it cheaper to include logging at all times.
>>> >>> +However, it also increases the work needed on the consumer end when
>>> >>> +log messages are desired.
>>> >>> +
>>> >>> +The debugserver binary has been modified to support collection of
>>> >>> +os_log*()/NSLog() messages, selection of which messages appear in
>>> the
>>> >>> +stream, and fine-grained filtering of what gets passed on to the
>>> LLDB
>>> >>> +client.  DarwinLog also tracks the activity chain (i.e.
>>> os_activity()
>>> >>> +hierarchy) in effect at the time the log messages were issued.  The
>>> >>> +user is able to configure a number of aspects related to the
>>> >>> +formatting of the log message header fields.
>>> >>> +
>>> >>> +The DarwinLog support is written in a way which should support the
>>> >>> +lldb client side on non-Apple clients talking to an Apple device or
>>> >>> +macOS system; hence, the plugin support is built into all LLDB
>>> >>> +clients, not just those built on an Apple platform.
>>> >>> +
>>> >>> +StructuredDataDarwinLog implements the 'DarwinLog' feature type, and
>>> >>> +the plugin name for it shows up as 'darwin-log'.
>>> >>> +
>>> >>> +The user interface to the darwin-log support is via the following:
>>> >>> +
>>> >>> +* 'plugin structured-data darwin-log enable' command
>>> >>> +
>>> >>> +  This is the main entry point for enabling the command.  It can be
>>> >>> +  set before launching a process or while the process is running.
>>> >>> +  If the user wants to squelch seeing info-level or debug-level
>>> >>> +  messages, which is the default behavior, then the enable command
>>> >>> +  must be made prior to launching the process; otherwise, the
>>> >>> +  info-level and debug-level messages will always show up.  Also,
>>> >>> +  there is a similar "echo os_log()/NSLog() messages to target
>>> >>> +  process stderr" mechanism which is properly disabled when enabling
>>> >>> +  the DarwinLog support prior to launch.  This cannot be squelched
>>> >>> +  if enabling DarwinLog after launch.
>>> >>> +
>>> >>> +  See the help for this command.  There are a number of options
>>> >>> +  to shrink or expand the number of messages that are processed
>>> >>> +  on the remote side and sent over to the client, and other
>>> >>> +  options to control the formatting of messages displayed.
>>> >>> +
>>> >>> +  This command is sticky.  Once enabled, it will stay enabled for
>>> >>> +  future process launches.
>>> >>> +
>>> >>> +* 'plugin structured-data darwin-log disable' command
>>> >>> +
>>> >>> +  Executing this command disables os_log() capture in the currently
>>> >>> +  running process and signals LLDB to stop attempting to launch
>>> >>> +  new processes with DarwinLog support enabled.
>>> >>> +
>>> >>> +* 'settings set \
>>> >>> +  plugin.structured-data.darwin-log.enable-on-startup'
>>> >>> +
>>> >>> +  and
>>> >>> +
>>> >>> +  'settings set \
>>> >>> +  plugin.structured-data.darwin-log.auto-enable-options --
>>> {options}'
>>> >>> +
>>> >>> +  When enable-on-startup is set to true, then LLDB will
>>> automatically
>>> >>> +  enable DarwinLog on startup of relevant processes.  It will use
>>> the
>>> >>> +  content provided in the auto-enable-options settings as the
>>> >>> +  options to pass to the enable command.
>>> >>> +
>>> >>> +  Note the '--' required after auto-enable-command.  That is
>>> necessary
>>> >>> +  for raw commands like settings set.  The '--' will not become part
>>> >>> +  of the options for the enable command.
>>> >>> +
>>> >>> +### Message flow and related performance considerations
>>> >>> +
>>> >>> +os_log()-style collection is not free.  The more data that must be
>>> >>> +processed, the slower it will be.  There are several knobs available
>>> >>> +to the developer to limit how much data goes through the pipe, and
>>> how
>>> >>> +much data ultimately goes over the wire to the LLDB client.  The
>>> >>> +user's goal should be to ensure he or she only collects as many log
>>> >>> +messages are needed, but no more.
>>> >>> +
>>> >>> +The flow of data looks like the following:
>>> >>> +
>>> >>> +1. Data comes into debugserver from the low-level OS facility that
>>> >>> +   receives log messages.  The data that comes through this pipe can
>>> >>> +   be limited or expanded by the '--debug', '--info' and
>>> >>> +   '--all-processes' options of the 'plugin structured-data
>>> darwin-log
>>> >>> +   enable' command.  options.  Exclude as many categories as
>>> possible
>>> >>> +   here (also the default).  The knobs here are very coarse - for
>>> >>> +   example, whether to include os_log_info()-level or
>>> >>> +   os_log_debug()-level info, or to include callstacks in the log
>>> >>> +   message event data.
>>> >>> +
>>> >>> +2. The debugserver process filters the messages that arrive through
>>> a
>>> >>> +   message log filter that may be fully customized by the user.  It
>>> >>> +   works similar to a rules-based packet filter: a set of rules are
>>> >>> +   matched against the log message, each rule tried in sequential
>>> >>> +   order.  The first rule that matches then either accepts or
>>> rejects
>>> >>> +   the message.  If the log message does not match any rule, then
>>> the
>>> >>> +   message gets the no-match (i.e. fall-through) action.  The
>>> no-match
>>> >>> +   action defaults to accepting but may be set to reject.
>>> >>> +
>>> >>> +   Filters can be added via the enable command's '--filter
>>> >>> +   {filter-spec}' option.  Filters are added in order, and multiple
>>> >>> +   --filter entries can be provided to the enable command.
>>> >>> +
>>> >>> +   Filters take the following form:
>>> >>> +
>>> >>> +   {action} {attribute} {op}
>>> >>> +
>>> >>> +   {action} :=
>>> >>> +       accept |
>>> >>> +       reject
>>> >>> +
>>> >>> +   {attribute} :=
>>> >>> +       category       |   // The log message category
>>> >>> +       subsystem      |   // The log message subsystem}
>>> >>> +       activity       |   // The child-most activity in force
>>> >>> +                          // at the time the message was logged.
>>> >>> +       activity-chain |   // The complete activity chain, specified
>>> >>> +                          // as {parent-activity}:{child-activity}:
>>> >>> +                          // {grandchild-activity}
>>> >>> +       message        |   // The fully expanded message contents.
>>> >>> +                          // Note this one is expensive because it
>>> >>> +                          // requires expanding the message.  Avoid
>>> >>> +                          // this if possible, or add it further
>>> >>> +                          // down the filter chain.
>>> >>> +
>>> >>> +   {op} :=
>>> >>> +              match {exact-match-text} |
>>> >>> +              regex {search-regex}        // uses C++ std::regex
>>> >>> +                                          // ECMAScript variant.
>>> >>> +
>>> >>> +e.g.
>>> >>> +   --filter "accept subsystem match com.example.mycompany.myproduc
>>> t"
>>> >>> +   --filter "accept subsystem regex com.example.+"
>>> >>> +   --filter "reject category regex spammy-system-[[:digit:]]+"
>>> >>> +
>>> >>> +3. Messages that are accepted by the log message filter get sent to
>>> >>> +   the lldb client, where they are mapped to the
>>> >>> +   StructuredDataDarwinLog plugin.  By default, command-line lldb
>>> will
>>> >>> +   issue a Process-level event containing the log message content,
>>> and
>>> >>> +   will request the plugin to print the message if the plugin is
>>> >>> +   enabled to do so.
>>> >>> +
>>> >>> +### Log message display
>>> >>> +
>>> >>> +Several settings control aspects of displaying log messages in
>>> >>> +command-line LLDB.  See the enable command's help for a description
>>> >>> +of these.
>>> >>> +
>>> >>> +
>>> >>>
>>> >>> Added: lldb/trunk/docs/structured_data/StructuredDataPlugins.md
>>> >>> URL:
>>> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/docs/structur
>>> ed_data/StructuredDataPlugins.md?rev=279198&view=auto
>>> >>>
>>> >>> ============================================================
>>> ==================
>>> >>> --- lldb/trunk/docs/structured_data/StructuredDataPlugins.md (added)
>>> >>> +++ lldb/trunk/docs/structured_data/StructuredDataPlugins.md Thu
>>> Aug 18
>>> >>> 21:52:07 2016
>>> >>> @@ -0,0 +1,136 @@
>>> >>> +# Change Notes
>>> >>> +
>>> >>> +## Overview
>>> >>> +
>>> >>> +This document describes an infrastructural feature called Structured
>>> >>> +Data plugins.  See the DarwinLog.md doc for a description of one
>>> >>> +such plugin that makes use of this feature.
>>> >>> +
>>> >>> +## StructuredDataPlugin
>>> >>> +
>>> >>> +StructuredDataPlugin instances have the following characteristics:
>>> >>> +
>>> >>> +* Each plugin instance is bound to a single Process instance.
>>> >>> +
>>> >>> +* Each StructuredData feature has a type name that identifies the
>>> >>> +  feature. For instance, the type name for the DarwinLog feature is
>>> >>> +  "DarwinLog". This feature type name is used in various places.
>>> >>> +
>>> >>> +* The process monitor reports the list of supported StructuredData
>>> >>> +  features advertised by the process monitor. Process goes through
>>> the
>>> >>> +  list of supported feature type names, and asks each known
>>> >>> +  StructuredDataPlugin if it can handle the feature. The first
>>> plugin
>>> >>> +  that supports the feature is mapped to that Process instance for
>>> >>> +  that feature.  Plugins are only mapped when the process monitor
>>> >>> +  advertises that a feature is supported.
>>> >>> +
>>> >>> +* The feature may send asynchronous messages in StructuredData
>>> format
>>> >>> +  to the Process instance. Process instances route the asynchronous
>>> >>> +  structured data messages to the plugin mapped to that feature
>>> type,
>>> >>> +  if one exists.
>>> >>> +
>>> >>> +* Plugins can request that the Process instance forward on
>>> >>> +  configuration data to the process monitor if the plugin
>>> needs/wants
>>> >>> +  to configure the feature. Plugins may call the new Process method
>>> >>> +
>>> >>> +  ```C++
>>> >>> +  virtual Error
>>> >>> +  ConfigureStructuredData(const ConstString &type_name,
>>> >>> +                          const StructuredData::ObjectSP &config_sp)
>>> >>> +  ```
>>> >>> +
>>> >>> +  where type_name is the feature name and config_sp points to the
>>> >>> +  configuration structured data, which may be nullptr.
>>> >>> +
>>> >>> +* Plugins for features present in a process are notified when
>>> modules
>>> >>> +  are loaded into the Process instance via this StructuredDataPlugin
>>> >>> +  method:
>>> >>> +
>>> >>> +  ```C++
>>> >>> +  virtual void
>>> >>> +  ModulesDidLoad(Process &process, ModuleList &module_list);
>>> >>> +  ```
>>> >>> +
>>> >>> +* Plugins may optionally broadcast their received structured data as
>>> >>> +  an LLDB process-level event via the following new Process call:
>>> >>> +
>>> >>> +  ```C++
>>> >>> +  void
>>> >>> +  BroadcastStructuredData(const StructuredData::ObjectSP &object_sp,
>>> >>> +                          const lldb::StructuredDataPluginSP
>>> >>> &plugin_sp);
>>> >>> +  ```
>>> >>> +
>>> >>> +  IDE clients might use this feature to receive information about
>>> the
>>> >>> +  process as it is running to monitor memory usage, CPU usage, and
>>> >>> +  logging.
>>> >>> +
>>> >>> +  Internally, the event type created is an instance of
>>> >>> +  EventDataStructuredData.
>>> >>> +
>>> >>> +* In the case where a plugin chooses to broadcast a received
>>> >>> +  StructuredData event, the command-line LLDB Debugger instance
>>> >>> +  listens for them. The Debugger instance then gives the plugin an
>>> >>> +  opportunity to display info to either the debugger output or error
>>> >>> +  stream at a time that is safe to write to them. The plugin can
>>> >>> +  choose to display something appropriate regarding the structured
>>> >>> +  data that time.
>>> >>> +
>>> >>> +* Plugins can provide a ProcessLaunchInfo filter method when the
>>> >>> +  plugin is registered.  If such a filter method is provided, then
>>> >>> +  when a process is about to be launched for debugging, the filter
>>> >>> +  callback is invoked, given both the launch info and the target.
>>> The
>>> >>> +  plugin may then alter the launch info if needed to better support
>>> >>> +  the feature of the plugin.
>>> >>> +
>>> >>> +* The plugin is entirely independent of the type of Process-derived
>>> >>> +  class that it is working with. The only requirements from the
>>> >>> +  process monitor are the following feature-agnostic elements:
>>> >>> +
>>> >>> +  * Provide a way to discover features supported by the process
>>> >>> +    monitor for the current process.
>>> >>> +
>>> >>> +  * Specify the list of supported feature type names to Process.
>>> >>> +    The process monitor does this by calling the following new
>>> >>> +    method on Process:
>>> >>> +
>>> >>> +    ```C++
>>> >>> +    void
>>> >>> +    MapSupportedStructuredDataPlugins(const StructuredData::Array
>>> >>> +                                      &supported_type_names)
>>> >>> +    ```
>>> >>> +
>>> >>> +    The supported_type_names specifies an array of string entries,
>>> >>> +    where each entry specifies the name of a StructuredData feature.
>>> >>> +
>>> >>> +  * Provide a way to forward on configuration data for a feature
>>> type
>>> >>> +    to the process monitor.  This is the manner by which LLDB can
>>> >>> +    configure a feature, perhaps based on settings or commands from
>>> >>> +    the user.  The following virtual method on Process (described
>>> >>> +    earlier) does the job:
>>> >>> +
>>> >>> +    ```C++
>>> >>> +    virtual Error
>>> >>> +    ConfigureStructuredData(const ConstString &type_name,
>>> >>> +                            const StructuredData::ObjectSP
>>> &config_sp)
>>> >>> +    ```
>>> >>> +
>>> >>> +  * Listen for asynchronous structured data packets from the process
>>> >>> +    monitor, and forward them on to Process via this new Process
>>> >>> +    member method:
>>> >>> +
>>> >>> +    ```C++
>>> >>> +    bool
>>> >>> +    RouteAsyncStructuredData(const StructuredData::ObjectSP
>>> object_sp)
>>> >>> +    ```
>>> >>> +
>>> >>> +* StructuredData producers must send their top-level data as a
>>> >>> +  Dictionary type, with a key called 'type' specifying a string
>>> value,
>>> >>> +  where the value is equal to the StructuredData feature/type name
>>> >>> +  previously advertised. Everything else about the content of the
>>> >>> +  dictionary is entirely up to the feature.
>>> >>> +
>>> >>> +* StructuredDataPlugin commands show up under 'plugin
>>> structured-data
>>> >>> +  plugin-name'.
>>> >>> +
>>> >>> +* StructuredDataPlugin settings show up under
>>> >>> +  'plugin.structured-data.{plugin-name}.
>>> >>>
>>> >>> Modified: lldb/trunk/include/lldb/API/LLDB.h
>>> >>> URL:
>>> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/
>>> API/LLDB.h?rev=279198&r1=279197&r2=279198&view=diff
>>> >>>
>>> >>> ============================================================
>>> ==================
>>> >>> --- lldb/trunk/include/lldb/API/LLDB.h (original)
>>> >>> +++ lldb/trunk/include/lldb/API/LLDB.h Thu Aug 18 21:52:07 2016
>>> >>> @@ -55,6 +55,7 @@
>>> >>>  #include "lldb/API/SBSourceManager.h"
>>> >>>  #include "lldb/API/SBStream.h"
>>> >>>  #include "lldb/API/SBStringList.h"
>>> >>> +#include "lldb/API/SBStructuredData.h"
>>> >>>  #include "lldb/API/SBSymbol.h"
>>> >>>  #include "lldb/API/SBSymbolContext.h"
>>> >>>  #include "lldb/API/SBSymbolContextList.h"
>>> >>>
>>> >>> Modified: lldb/trunk/include/lldb/API/SBDefines.h
>>> >>> URL:
>>> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/
>>> API/SBDefines.h?rev=279198&r1=279197&r2=279198&view=diff
>>> >>>
>>> >>> ============================================================
>>> ==================
>>> >>> --- lldb/trunk/include/lldb/API/SBDefines.h (original)
>>> >>> +++ lldb/trunk/include/lldb/API/SBDefines.h Thu Aug 18 21:52:07 2016
>>> >>> @@ -71,6 +71,7 @@ class LLDB_API SBSection;
>>> >>>  class LLDB_API SBSourceManager;
>>> >>>  class LLDB_API SBStream;
>>> >>>  class LLDB_API SBStringList;
>>> >>> +class LLDB_API SBStructuredData;
>>> >>>  class LLDB_API SBSymbol;
>>> >>>  class LLDB_API SBSymbolContext;
>>> >>>  class LLDB_API SBSymbolContextList;
>>> >>>
>>> >>> Modified: lldb/trunk/include/lldb/API/SBError.h
>>> >>> URL:
>>> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/
>>> API/SBError.h?rev=279198&r1=279197&r2=279198&view=diff
>>> >>>
>>> >>> ============================================================
>>> ==================
>>> >>> --- lldb/trunk/include/lldb/API/SBError.h (original)
>>> >>> +++ lldb/trunk/include/lldb/API/SBError.h Thu Aug 18 21:52:07 2016
>>> >>> @@ -73,6 +73,7 @@ protected:
>>> >>>      friend class SBHostOS;
>>> >>>      friend class SBPlatform;
>>> >>>      friend class SBProcess;
>>> >>> +    friend class SBStructuredData;
>>> >>>      friend class SBThread;
>>> >>>      friend class SBTarget;
>>> >>>      friend class SBValue;
>>> >>>
>>> >>> Modified: lldb/trunk/include/lldb/API/SBProcess.h
>>> >>> URL:
>>> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/
>>> API/SBProcess.h?rev=279198&r1=279197&r2=279198&view=diff
>>> >>>
>>> >>> ============================================================
>>> ==================
>>> >>> --- lldb/trunk/include/lldb/API/SBProcess.h (original)
>>> >>> +++ lldb/trunk/include/lldb/API/SBProcess.h Thu Aug 18 21:52:07 2016
>>> >>> @@ -32,7 +32,8 @@ public:
>>> >>>          eBroadcastBitInterrupt      = (1 << 1),
>>> >>>          eBroadcastBitSTDOUT         = (1 << 2),
>>> >>>          eBroadcastBitSTDERR         = (1 << 3),
>>> >>> -        eBroadcastBitProfileData    = (1 << 4)
>>> >>> +        eBroadcastBitProfileData    = (1 << 4),
>>> >>> +        eBroadcastBitStructuredData = (1 << 5)
>>> >>>      };
>>> >>>
>>> >>>      SBProcess ();
>>> >>> @@ -278,10 +279,16 @@ public:
>>> >>>
>>> >>>      static bool
>>> >>>      GetInterruptedFromEvent (const lldb::SBEvent &event);
>>> >>> -
>>> >>> +
>>> >>> +    static lldb::SBStructuredData
>>> >>> +    GetStructuredDataFromEvent (const lldb::SBEvent &event);
>>> >>> +
>>> >>>      static bool
>>> >>>      EventIsProcessEvent (const lldb::SBEvent &event);
>>> >>>
>>> >>> +    static bool
>>> >>> +    EventIsStructuredDataEvent (const lldb::SBEvent &event);
>>> >>> +
>>> >>>      lldb::SBBroadcaster
>>> >>>      GetBroadcaster () const;
>>> >>>
>>> >>>
>>> >>> Modified: lldb/trunk/include/lldb/API/SBStream.h
>>> >>> URL:
>>> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/
>>> API/SBStream.h?rev=279198&r1=279197&r2=279198&view=diff
>>> >>>
>>> >>> ============================================================
>>> ==================
>>> >>> --- lldb/trunk/include/lldb/API/SBStream.h (original)
>>> >>> +++ lldb/trunk/include/lldb/API/SBStream.h Thu Aug 18 21:52:07 2016
>>> >>> @@ -83,6 +83,7 @@ protected:
>>> >>>      friend class SBProcess;
>>> >>>      friend class SBSection;
>>> >>>      friend class SBSourceManager;
>>> >>> +    friend class SBStructuredData;
>>> >>>      friend class SBSymbol;
>>> >>>      friend class SBSymbolContext;
>>> >>>      friend class SBSymbolContextList;
>>> >>>
>>> >>> Added: lldb/trunk/include/lldb/API/SBStructuredData.h
>>> >>> URL:
>>> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/
>>> API/SBStructuredData.h?rev=279198&view=auto
>>> >>>
>>> >>> ============================================================
>>> ==================
>>> >>> --- lldb/trunk/include/lldb/API/SBStructuredData.h (added)
>>> >>> +++ lldb/trunk/include/lldb/API/SBStructuredData.h Thu Aug 18
>>> 21:52:07
>>> >>> 2016
>>> >>> @@ -0,0 +1,52 @@
>>> >>> +//===-- SBStructuredData.h --------------------------------------*-
>>> C++
>>> >>> -*-===//
>>> >>> +//
>>> >>> +//                     The LLVM Compiler Infrastructure
>>> >>> +//
>>> >>> +// This file is distributed under the University of Illinois Open
>>> Source
>>> >>> +// License. See LICENSE.TXT for details.
>>> >>> +//
>>> >>>
>>> >>> +//===------------------------------------------------------
>>> ----------------===//
>>> >>> +
>>> >>> +#ifndef SBStructuredData_h
>>> >>> +#define SBStructuredData_h
>>> >>> +
>>> >>> +#include "lldb/API/SBDefines.h"
>>> >>> +#include "lldb/API/SBModule.h"
>>> >>> +
>>> >>> +namespace lldb {
>>> >>> +
>>> >>> +    class SBStructuredData
>>> >>> +    {
>>> >>> +    public:
>>> >>> +
>>> >>> +        SBStructuredData();
>>> >>> +
>>> >>> +        SBStructuredData(const lldb::SBStructuredData &rhs);
>>> >>> +
>>> >>> +        SBStructuredData(const lldb::EventSP &event_sp);
>>> >>> +
>>> >>> +        ~SBStructuredData();
>>> >>> +
>>> >>> +        lldb::SBStructuredData &
>>> >>> +        operator =(const lldb::SBStructuredData &rhs);
>>> >>> +
>>> >>> +        bool
>>> >>> +        IsValid() const;
>>> >>> +
>>> >>> +        void
>>> >>> +        Clear();
>>> >>> +
>>> >>> +        lldb::SBError
>>> >>> +        GetAsJSON(lldb::SBStream &stream) const;
>>> >>> +
>>> >>> +        lldb::SBError
>>> >>> +        GetDescription(lldb::SBStream &stream) const;
>>> >>> +
>>> >>> +    private:
>>> >>> +
>>> >>> +        class Impl;
>>> >>> +        std::unique_ptr<Impl> m_impl_up;
>>> >>> +    };
>>> >>> +}
>>> >>> +
>>> >>> +#endif /* SBStructuredData_h */
>>> >>>
>>> >>> Modified: lldb/trunk/include/lldb/Core/Broadcaster.h
>>> >>> URL:
>>> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/
>>> Core/Broadcaster.h?rev=279198&r1=279197&r2=279198&view=diff
>>> >>>
>>> >>> ============================================================
>>> ==================
>>> >>> --- lldb/trunk/include/lldb/Core/Broadcaster.h (original)
>>> >>> +++ lldb/trunk/include/lldb/Core/Broadcaster.h Thu Aug 18 21:52:07
>>> 2016
>>> >>> @@ -272,11 +272,10 @@ private:
>>> >>>  ///         //---------------------------
>>> -------------------------------
>>> >>>  ///         enum
>>> >>>  ///         {
>>> >>> -///             eBroadcastBitStateChanged   = (1 << 0),
>>> >>> -///             eBroadcastBitInterrupt      = (1 << 1),
>>> >>> -///             eBroadcastBitSTDOUT         = (1 << 2),
>>> >>> -///             eBroadcastBitSTDERR         = (1 << 3),
>>> >>> -///             eBroadcastBitProfileData    = (1 << 4)
>>> >>> +///             eBroadcastBitOne   = (1 << 0),
>>> >>> +///             eBroadcastBitTwo   = (1 << 1),
>>> >>> +///             eBroadcastBitThree = (1 << 2),
>>> >>> +///             ...
>>> >>>  ///         };
>>> >>>  ///     \endcode
>>> >>>  //----------------------------------------------------------
>>> ------------
>>> >>>
>>> >>> Modified: lldb/trunk/include/lldb/Core/Event.h
>>> >>> URL:
>>> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/
>>> Core/Event.h?rev=279198&r1=279197&r2=279198&view=diff
>>> >>>
>>> >>> ============================================================
>>> ==================
>>> >>> --- lldb/trunk/include/lldb/Core/Event.h (original)
>>> >>> +++ lldb/trunk/include/lldb/Core/Event.h Thu Aug 18 21:52:07 2016
>>> >>> @@ -20,6 +20,7 @@
>>> >>>  // Project includes
>>> >>>  #include "lldb/lldb-private.h"
>>> >>>  #include "lldb/Core/ConstString.h"
>>> >>> +#include "lldb/Core/StructuredData.h"
>>> >>>  #include "lldb/Host/Predicate.h"
>>> >>>  #include "lldb/Core/Broadcaster.h"
>>> >>>
>>> >>> @@ -159,6 +160,80 @@ private:
>>> >>>  };
>>> >>>
>>> >>>  //----------------------------------------------------------
>>> ------------
>>> >>> +/// This class handles one or more StructuredData::Dictionary
>>> entries
>>> >>> +/// that are raised for structured data events.
>>> >>> +//---------------------------------------------------------
>>> -------------
>>> >>> +
>>> >>> +class EventDataStructuredData : public EventData
>>> >>> +{
>>> >>> +public:
>>> >>> +
>>> >>> +    //----------------------------------------------------------
>>> --------
>>> >>> +    // Constructors
>>> >>> +    //----------------------------------------------------------
>>> --------
>>> >>> +    EventDataStructuredData();
>>> >>> +
>>> >>> +    EventDataStructuredData(const lldb::ProcessSP &process_sp,
>>> >>> +                            const StructuredData::ObjectSP
>>> &object_sp,
>>> >>> +                            const lldb::StructuredDataPluginSP
>>> >>> &plugin_sp);
>>> >>> +
>>> >>> +    ~EventDataStructuredData() override;
>>> >>> +
>>> >>> +    //----------------------------------------------------------
>>> --------
>>> >>> +    // Member functions
>>> >>> +    //----------------------------------------------------------
>>> --------
>>> >>> +    const ConstString &
>>> >>> +    GetFlavor() const override;
>>> >>> +
>>> >>> +    void
>>> >>> +    Dump(Stream *s) const override;
>>> >>> +
>>> >>> +    const lldb::ProcessSP&
>>> >>> +    GetProcess() const;
>>> >>> +
>>> >>> +    const StructuredData::ObjectSP&
>>> >>> +    GetObject() const;
>>> >>> +
>>> >>> +    const lldb::StructuredDataPluginSP&
>>> >>> +    GetStructuredDataPlugin() const;
>>> >>> +
>>> >>> +    void
>>> >>> +    SetProcess(const lldb::ProcessSP &process_sp);
>>> >>> +
>>> >>> +    void
>>> >>> +    SetObject(const StructuredData::ObjectSP &object_sp);
>>> >>> +
>>> >>> +    void
>>> >>> +    SetStructuredDataPlugin(const lldb::StructuredDataPluginSP
>>> >>> &plugin_sp);
>>> >>> +
>>> >>> +    //----------------------------------------------------------
>>> --------
>>> >>> +    // Static functions
>>> >>> +    //----------------------------------------------------------
>>> --------
>>> >>> +    static const EventDataStructuredData*
>>> >>> +    GetEventDataFromEvent(const Event *event_ptr);
>>> >>> +
>>> >>> +    static lldb::ProcessSP
>>> >>> +    GetProcessFromEvent(const Event *event_ptr);
>>> >>> +
>>> >>> +    static StructuredData::ObjectSP
>>> >>> +    GetObjectFromEvent(const Event *event_ptr);
>>> >>> +
>>> >>> +    static lldb::StructuredDataPluginSP
>>> >>> +    GetPluginFromEvent(const Event *event_ptr);
>>> >>> +
>>> >>> +    static const ConstString &
>>> >>> +    GetFlavorString ();
>>> >>> +
>>> >>> +private:
>>> >>> +
>>> >>> +    lldb::ProcessSP               m_process_sp;
>>> >>> +    StructuredData::ObjectSP      m_object_sp;
>>> >>> +    lldb::StructuredDataPluginSP  m_plugin_sp;
>>> >>> +
>>> >>> +    DISALLOW_COPY_AND_ASSIGN(EventDataStructuredData);
>>> >>> +};
>>> >>> +
>>> >>> +//---------------------------------------------------------
>>> -------------
>>> >>>  // lldb::Event
>>> >>>  //----------------------------------------------------------
>>> ------------
>>> >>>  class Event
>>> >>>
>>> >>> Modified: lldb/trunk/include/lldb/Core/PluginManager.h
>>> >>> URL:
>>> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/
>>> Core/PluginManager.h?rev=279198&r1=279197&r2=279198&view=diff
>>> >>>
>>> >>> ============================================================
>>> ==================
>>> >>> --- lldb/trunk/include/lldb/Core/PluginManager.h (original)
>>> >>> +++ lldb/trunk/include/lldb/Core/PluginManager.h Thu Aug 18
>>> 21:52:07 2016
>>> >>> @@ -328,6 +328,65 @@ public:
>>> >>>                                      CommandInterpreter
>>> &interpreter);
>>> >>>
>>> >>>      //----------------------------------------------------------
>>> --------
>>> >>> +    // StructuredDataPlugin
>>> >>> +    //----------------------------------------------------------
>>> --------
>>> >>> +
>>> >>> +    //----------------------------------------------------------
>>> --------
>>> >>> +    /// Register a StructuredDataPlugin class along with optional
>>> >>> +    /// callbacks for debugger initialization and Process launch
>>> info
>>> >>> +    /// filtering and manipulation.
>>> >>> +    ///
>>> >>> +    /// @param[in] name
>>> >>> +    ///    The name of the plugin.
>>> >>> +    ///
>>> >>> +    /// @param[in] description
>>> >>> +    ///    A description string for the plugin.
>>> >>> +    ///
>>> >>> +    /// @param[in] create_callback
>>> >>> +    ///    The callback that will be invoked to create an instance
>>> of
>>> >>> +    ///    the callback.  This may not be nullptr.
>>> >>> +    ///
>>> >>> +    /// @param[in] debugger_init_callback
>>> >>> +    ///    An optional callback that will be made when a Debugger
>>> >>> +    ///    instance is initialized.
>>> >>> +    ///
>>> >>> +    /// @param[in] filter_callback
>>> >>> +    ///    An optional callback that will be invoked before LLDB
>>> >>> +    ///    launches a process for debugging.  The callback must
>>> >>> +    ///    do the following:
>>> >>> +    ///    1. Only do something if the plugin's behavior is enabled.
>>> >>> +    ///    2. Only make changes for processes that are relevant to
>>> the
>>> >>> +    ///       plugin.  The callback gets a pointer to the Target,
>>> which
>>> >>> +    ///       can be inspected as needed.  The ProcessLaunchInfo is
>>> >>> +    ///       provided in read-write mode, and may be modified by
>>> the
>>> >>> +    ///       plugin if, for instance, additional environment
>>> variables
>>> >>> +    ///       are needed to support the feature when enabled.
>>> >>> +    ///
>>> >>> +    /// @return
>>> >>> +    ///    Returns true upon success; otherwise, false.
>>> >>> +    //----------------------------------------------------------
>>> --------
>>> >>> +    static bool
>>> >>> +    RegisterPlugin(const ConstString &name,
>>> >>> +                   const char *description,
>>> >>> +                   StructuredDataPluginCreateInstance
>>> create_callback,
>>> >>> +                   DebuggerInitializeCallback
>>> debugger_init_callback =
>>> >>> nullptr,
>>> >>> +                   StructuredDataFilterLaunchInfo filter_callback
>>> >>> +                   = nullptr);
>>> >>> +
>>> >>> +    static bool
>>> >>> +    UnregisterPlugin(StructuredDataPluginCreateInstance
>>> >>> create_callback);
>>> >>> +
>>> >>> +    static StructuredDataPluginCreateInstance
>>> >>> +    GetStructuredDataPluginCreateCallbackAtIndex(uint32_t idx);
>>> >>> +
>>> >>> +    static StructuredDataPluginCreateInstance
>>> >>> +    GetStructuredDataPluginCreateCallbackForPluginName(const
>>> ConstString
>>> >>> &name);
>>> >>> +
>>> >>> +    static StructuredDataFilterLaunchInfo
>>> >>> +    GetStructuredDataFilterCallbackAtIndex(uint32_t idx,
>>> >>> +                                           bool
>>> &iteration_complete);
>>> >>> +
>>> >>> +    //----------------------------------------------------------
>>> --------
>>> >>>      // SymbolFile
>>> >>>      //----------------------------------------------------------
>>> --------
>>> >>>      static bool
>>> >>> @@ -531,6 +590,16 @@ public:
>>> >>>      static bool CreateSettingForOperatingSystemPlugin(Debugger
>>> >>> &debugger,
>>> >>>                                                        const
>>> >>> lldb::OptionValuePropertiesSP &properties_sp,
>>> >>>                                                        const
>>> ConstString
>>> >>> &description, bool is_global_property);
>>> >>> +
>>> >>> +    static lldb::OptionValuePropertiesSP
>>> >>> +    GetSettingForStructuredDataPlugin(Debugger &debugger,
>>> >>> +                                      const ConstString
>>> &setting_name);
>>> >>> +
>>> >>> +    static bool
>>> >>> +    CreateSettingForStructuredDataPlugin(Debugger &debugger,
>>> >>> +                                         const
>>> >>> lldb::OptionValuePropertiesSP &properties_sp,
>>> >>> +                                         const ConstString
>>> &description,
>>> >>> +                                         bool is_global_property);
>>> >>>  };
>>> >>>
>>> >>>  } // namespace lldb_private
>>> >>>
>>> >>> Modified: lldb/trunk/include/lldb/Interpreter/Args.h
>>> >>> URL:
>>> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/
>>> Interpreter/Args.h?rev=279198&r1=279197&r2=279198&view=diff
>>> >>>
>>> >>> ============================================================
>>> ==================
>>> >>> --- lldb/trunk/include/lldb/Interpreter/Args.h (original)
>>> >>> +++ lldb/trunk/include/lldb/Interpreter/Args.h Thu Aug 18 21:52:07
>>> 2016
>>> >>> @@ -451,6 +451,17 @@ public:
>>> >>>      LongestCommonPrefix (std::string &common_prefix);
>>> >>>
>>> >>>      //----------------------------------------------------------
>>> --------
>>> >>> +    /// Add or replace an environment variable with the given value.
>>> >>> +    ///
>>> >>> +    /// This command adds the environment variable if it is not
>>> already
>>> >>> +    /// present using the given value.  If the environment variable
>>> is
>>> >>> +    /// already in the list, it replaces the first such occurrence
>>> >>> +    /// with the new value.
>>> >>> +    //----------------------------------------------------------
>>> --------
>>> >>> +    void
>>> >>> +    AddOrReplaceEnvironmentVariable(const char *env_var_name,
>>> >>> +                                    const char *new_value);
>>> >>> +
>>> >>>      /// Return whether a given environment variable exists.
>>> >>>      ///
>>> >>>      /// This command treats Args like a list of environment
>>> variables,
>>> >>> @@ -460,12 +471,18 @@ public:
>>> >>>      /// @param[in] env_var_name
>>> >>>      ///     Specifies the name of the environment variable to check.
>>> >>>      ///
>>> >>> +    /// @param[out] argument_index
>>> >>> +    ///     If non-null, then when the environment variable is
>>> found,
>>> >>> +    ///     the index of the argument position will be returned in
>>> >>> +    ///     the size_t pointed to by this argument.
>>> >>> +    ///
>>> >>>      /// @return
>>> >>>      ///     true if the specified env var name exists in the list in
>>> >>>      ///     either of the above-mentioned formats; otherwise, false.
>>> >>>      //----------------------------------------------------------
>>> --------
>>> >>>      bool
>>> >>> -    ContainsEnvironmentVariable(const char *env_var_name) const;
>>> >>> +    ContainsEnvironmentVariable(const char *env_var_name,
>>> >>> +                                size_t *argument_index = nullptr)
>>> const;
>>> >>>
>>> >>>  protected:
>>> >>>      //----------------------------------------------------------
>>> --------
>>> >>>
>>> >>> Modified: lldb/trunk/include/lldb/Target/Process.h
>>> >>> URL:
>>> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/
>>> Target/Process.h?rev=279198&r1=279197&r2=279198&view=diff
>>> >>>
>>> >>> ============================================================
>>> ==================
>>> >>> --- lldb/trunk/include/lldb/Target/Process.h (original)
>>> >>> +++ lldb/trunk/include/lldb/Target/Process.h Thu Aug 18 21:52:07
>>> 2016
>>> >>> @@ -760,7 +760,8 @@ public:
>>> >>>          eBroadcastBitInterrupt      = (1 << 1),
>>> >>>          eBroadcastBitSTDOUT         = (1 << 2),
>>> >>>          eBroadcastBitSTDERR         = (1 << 3),
>>> >>> -        eBroadcastBitProfileData    = (1 << 4)
>>> >>> +        eBroadcastBitProfileData    = (1 << 4),
>>> >>> +        eBroadcastBitStructuredData = (1 << 5),
>>> >>>      };
>>> >>>
>>> >>>      enum
>>> >>> @@ -3254,6 +3255,71 @@ public:
>>> >>>      AdvanceAddressToNextBranchInstruction (Address
>>> default_stop_addr,
>>> >>>                                             AddressRange
>>> range_bounds);
>>> >>>
>>> >>> +    //----------------------------------------------------------
>>> --------
>>> >>> +    /// Configure asynchronous structured data feature.
>>> >>> +    ///
>>> >>> +    /// Each Process type that supports using an asynchronous
>>> >>> StructuredData
>>> >>> +    /// feature should implement this to enable/disable/configure
>>> the
>>> >>> feature.
>>> >>> +    /// The default implementation here will always return an error
>>> >>> indiciating
>>> >>> +    /// the feature is unsupported.
>>> >>> +    ///
>>> >>> +    /// StructuredDataPlugin implementations will call this to
>>> configure
>>> >>> +    /// a feature that has been reported as being supported.
>>> >>> +    ///
>>> >>> +    /// @param[in] type_name
>>> >>> +    ///     The StructuredData type name as previously discovered by
>>> >>> +    ///     the Process-derived instance.
>>> >>> +    ///
>>> >>> +    /// @param[in] config
>>> >>> +    ///     Configuration data for the feature being enabled.  This
>>> >>> config
>>> >>> +    ///     data, which may be null, will be passed along to the
>>> feature
>>> >>> +    ///     to process.  The feature will dictate whether this is a
>>> >>> dictionary,
>>> >>> +    ///     an array or some other object.  If the feature needs to
>>> be
>>> >>> +    ///     set up properly before it can be enabled, then the
>>> config
>>> >>> should
>>> >>> +    ///     also take an enable/disable flag.
>>> >>> +    ///
>>> >>> +    /// @return
>>> >>> +    ///     Returns the result of attempting to configure the
>>> feature.
>>> >>> +    //----------------------------------------------------------
>>> --------
>>> >>> +    virtual Error
>>> >>> +    ConfigureStructuredData(const ConstString &type_name,
>>> >>> +                            const StructuredData::ObjectSP
>>> &config_sp);
>>> >>> +
>>> >>> +    //----------------------------------------------------------
>>> --------
>>> >>> +    /// Broadcasts the given structured data object from the given
>>> >>> +    /// plugin.
>>> >>> +    ///
>>> >>> +    /// StructuredDataPlugin instances can use this to optionally
>>> >>> +    /// broadcast any of their data if they want to make it
>>> available
>>> >>> +    /// for clients.  The data will come in on the structured data
>>> >>> +    /// event bit (eBroadcastBitStructuredData).
>>> >>> +    ///
>>> >>> +    /// @param[in] object_sp
>>> >>> +    ///     The structured data object to broadcast.
>>> >>> +    ///
>>> >>> +    /// @param[in] plugin_sp
>>> >>> +    ///     The plugin that will be reported in the event's plugin
>>> >>> +    ///     parameter.
>>> >>> +    //----------------------------------------------------------
>>> --------
>>> >>> +    void
>>> >>> +    BroadcastStructuredData(const StructuredData::ObjectSP
>>> &object_sp,
>>> >>> +                            const lldb::StructuredDataPluginSP
>>> >>> &plugin_sp);
>>> >>> +
>>> >>> +    //----------------------------------------------------------
>>> --------
>>> >>> +    /// Returns the StructuredDataPlugin associated with a given
>>> type
>>> >>> +    /// name, if there is one.
>>> >>> +    ///
>>> >>> +    /// There will only be a plugin for a given StructuredDataType
>>> if
>>> >>> the
>>> >>> +    /// debugged process monitor claims that the feature is
>>> supported.
>>> >>> +    /// This is one way to tell whether a feature is available.
>>> >>> +    ///
>>> >>> +    /// @return
>>> >>> +    ///     The plugin if one is available for the specified
>>> feature;
>>> >>> +    ///     otherwise, returns an empty shared pointer.
>>> >>> +    //----------------------------------------------------------
>>> --------
>>> >>> +    lldb::StructuredDataPluginSP
>>> >>> +    GetStructuredDataPlugin(const ConstString &type_name) const;
>>> >>> +
>>> >>>  protected:
>>> >>>      void
>>> >>>      SetState (lldb::EventSP &event_sp);
>>> >>> @@ -3392,6 +3458,57 @@ protected:
>>> >>>      }
>>> >>>
>>> >>>      //----------------------------------------------------------
>>> --------
>>> >>> +    /// Loads any plugins associated with asynchronous structured
>>> data
>>> >>> +    /// and maps the relevant supported type name to the plugin.
>>> >>> +    ///
>>> >>> +    /// Processes can receive asynchronous structured data from the
>>> >>> +    /// process monitor.  This method will load and map any
>>> structured
>>> >>> +    /// data plugins that support the given set of supported type
>>> names.
>>> >>> +    /// Later, if any of these features are enabled, the process
>>> monitor
>>> >>> +    /// is free to generate asynchronous structured data.  The data
>>> must
>>> >>> +    /// come in as a single \b StructuredData::Dictionary.  That
>>> >>> dictionary
>>> >>> +    /// must have a string field named 'type', with a value that
>>> equals
>>> >>> +    /// the relevant type name string (one of the values in
>>> >>> +    /// \b supported_type_names).
>>> >>> +    ///
>>> >>> +    /// @param[in] supported_type_names
>>> >>> +    ///     An array of zero or more type names.  Each must be
>>> unique.
>>> >>> +    ///     For each entry in the list, a StructuredDataPlugin will
>>> be
>>> >>> +    ///     searched for that supports the structured data type
>>> name.
>>> >>> +    //----------------------------------------------------------
>>> --------
>>> >>> +    void
>>> >>> +    MapSupportedStructuredDataPlugins(const StructuredData::Array
>>> >>> +                                           &supported_type_names);
>>> >>> +
>>> >>> +    //----------------------------------------------------------
>>> --------
>>> >>> +    /// Route the incoming structured data dictionary to the right
>>> >>> plugin.
>>> >>> +    ///
>>> >>> +    /// The incoming structured data must be a dictionary, and it
>>> must
>>> >>> +    /// have a key named 'type' that stores a string value.  The
>>> string
>>> >>> +    /// value must be the name of the structured data feature that
>>> >>> +    /// knows how to handle it.
>>> >>> +    ///
>>> >>> +    /// @param[in] object_sp
>>> >>> +    ///     When non-null and pointing to a dictionary, the 'type'
>>> >>> +    ///     key's string value is used to look up the plugin that
>>> >>> +    ///     was registered for that structured data type.  It then
>>> >>> +    ///     calls the following method on the StructuredDataPlugin
>>> >>> +    ///     instance:
>>> >>> +    ///
>>> >>> +    ///     virtual void
>>> >>> +    ///     HandleArrivalOfStructuredData(Process &process,
>>> >>> +    ///                                   const ConstString
>>> &type_name,
>>> >>> +    ///                                   const
>>> StructuredData::ObjectSP
>>> >>> +    ///                                   &object_sp)
>>> >>> +    ///
>>> >>> +    /// @return
>>> >>> +    ///     True if the structured data was routed to a plugin;
>>> >>> otherwise,
>>> >>> +    ///     false.
>>> >>> +    //----------------------------------------------------------
>>> --------
>>> >>> +    bool
>>> >>> +    RouteAsyncStructuredData(const StructuredData::ObjectSP
>>> object_sp);
>>> >>> +
>>> >>> +    //----------------------------------------------------------
>>> --------
>>> >>>      // Type definitions
>>> >>>      //----------------------------------------------------------
>>> --------
>>> >>>      typedef std::map<lldb::LanguageType, lldb::LanguageRuntimeSP>
>>> >>> LanguageRuntimeCollection;
>>> >>> @@ -3408,6 +3525,9 @@ protected:
>>> >>>          {
>>> >>>          }
>>> >>>      };
>>> >>> +
>>> >>> +    using StructuredDataPluginMap = std::map<ConstString,
>>> >>> +
>>> >>> lldb::StructuredDataPluginSP>;
>>> >>>
>>> >>>      //----------------------------------------------------------
>>> --------
>>> >>>      // Member variables
>>> >>> @@ -3477,7 +3597,9 @@ protected:
>>> >>>      bool m_can_interpret_function_calls; // Some targets, e.g the
>>> OSX
>>> >>> kernel, don't support the ability to modify the stack.
>>> >>>      WarningsCollection          m_warnings_issued;  // A set of
>>> object
>>> >>> pointers which have already had warnings printed
>>> >>>      std::mutex                  m_run_thread_plan_lock;
>>> >>> -
>>> >>> +    StructuredDataPluginMap     m_structured_data_plugin_map;
>>> >>> +
>>> >>> +
>>> >>>      enum {
>>> >>>          eCanJITDontKnow= 0,
>>> >>>          eCanJITYes,
>>> >>> @@ -3562,7 +3684,7 @@ protected:
>>> >>>
>>> >>>      void
>>> >>>      BroadcastAsyncProfileData(const std::string &one_profile_data);
>>> >>> -
>>> >>> +
>>> >>>      static void
>>> >>>      STDIOReadThreadBytesReceived (void *baton, const void *src,
>>> size_t
>>> >>> src_len);
>>> >>>
>>> >>>
>>> >>> Added: lldb/trunk/include/lldb/Target/StructuredDataPlugin.h
>>> >>> URL:
>>> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/
>>> Target/StructuredDataPlugin.h?rev=279198&view=auto
>>> >>>
>>> >>> ============================================================
>>> ==================
>>> >>> --- lldb/trunk/include/lldb/Target/StructuredDataPlugin.h (added)
>>> >>> +++ lldb/trunk/include/lldb/Target/StructuredDataPlugin.h Thu Aug 18
>>> >>> 21:52:07 2016
>>> >>> @@ -0,0 +1,204 @@
>>> >>> +//===-- StructuredDataPlugin.h ----------------------------------*-
>>> C++
>>> >>> -*-===//
>>> >>> +//
>>> >>> +//                     The LLVM Compiler Infrastructure
>>> >>> +//
>>> >>> +// This file is distributed under the University of Illinois Open
>>> Source
>>> >>> +// License. See LICENSE.TXT for details.
>>> >>> +//
>>> >>>
>>> >>> +//===------------------------------------------------------
>>> ----------------===//
>>> >>> +
>>> >>> +#ifndef StructuredDataPlugin_h
>>> >>> +#define StructuredDataPlugin_h
>>> >>> +
>>> >>> +#include "lldb/Core/PluginInterface.h"
>>> >>> +#include "lldb/Core/StructuredData.h"
>>> >>> +
>>> >>> +namespace lldb_private
>>> >>> +{
>>> >>> +
>>> >>> +class CommandObjectMultiword;
>>> >>> +
>>> >>> +//
>>> >>> ------------------------------------------------------------
>>> -----------------
>>> >>> +/// Plugin that supports process-related structured data sent
>>> >>> asynchronously
>>> >>> +/// from the debug monitor (e.g. debugserver, lldb-server, etc.)
>>> >>> +///
>>> >>> +/// This plugin type is activated by a Process-derived instance when
>>> >>> that
>>> >>> +/// instance detects that a given structured data feature is
>>> available.
>>> >>> +///
>>> >>> +/// StructuredDataPlugin instances are inherently tied to a process.
>>> >>> The
>>> >>> +/// main functionality they support is the ability to consume
>>> >>> asynchronously-
>>> >>> +/// delivered structured data from the process monitor, and do
>>> something
>>> >>> +/// reasonable with it.  Something reasonable can include
>>> broadcasting a
>>> >>> +/// StructuredData event, which other parts of the system can then
>>> do
>>> >>> with
>>> >>> +/// as they please.  An IDE could use this facility to retrieve CPU
>>> >>> usage,
>>> >>> +/// memory usage, and other run-time aspects of the process.  That
>>> data
>>> >>> +/// can then be displayed meaningfully to the user through the IDE.
>>> >>> +
>>> >>> +/// For command-line LLDB, the Debugger instance listens for the
>>> >>> structured
>>> >>> +/// data events raised by the plugin, and give the plugin both the
>>> >>> output
>>> >>> +/// and error streams such that the plugin can display something
>>> about
>>> >>> the
>>> >>> +/// event, at a time when the debugger ensures it is safe to write
>>> to
>>> >>> the
>>> >>> +/// output or error streams.
>>> >>> +//
>>> >>> ------------------------------------------------------------
>>> -----------------
>>> >>> +
>>> >>> +class StructuredDataPlugin :
>>> >>> +    public PluginInterface,
>>> >>> +    public std::enable_shared_from_this<StructuredDataPlugin>
>>> >>> +{
>>> >>> +public:
>>> >>> +
>>> >>> +    virtual ~StructuredDataPlugin();
>>> >>> +
>>> >>> +    lldb::ProcessSP
>>> >>> +    GetProcess() const;
>>> >>> +
>>> >>> +    //
>>> >>> ------------------------------------------------------------
>>> -------------
>>> >>> +    // Public instance API
>>> >>> +    //
>>> >>> ------------------------------------------------------------
>>> -------------
>>> >>> +
>>> >>> +    //
>>> >>> ------------------------------------------------------------
>>> -------------
>>> >>> +    /// Return whether this plugin supports the given StructuredData
>>> >>> feature.
>>> >>> +    ///
>>> >>> +    /// When Process is informed of a list of
>>> process-monitor-supported
>>> >>> +    /// structured data features, Process will go through the list
>>> of
>>> >>> plugins,
>>> >>> +    /// one at a time, and have the first plugin that supports a
>>> given
>>> >>> feature
>>> >>> +    /// be the plugin instantiated to handle that feature.  There
>>> is a
>>> >>> 1-1
>>> >>> +    /// correspondence between a Process instance and a
>>> >>> StructuredDataPlugin
>>> >>> +    /// mapped to that process.  A plugin can support handling
>>> multiple
>>> >>> +    /// features, and if that happens, there is a single plugin
>>> instance
>>> >>> +    /// created covering all of the mapped features for a given
>>> process.
>>> >>> +    ///
>>> >>> +    /// @param[in] type_name
>>> >>> +    ///     The name of the feature tag supported by a process.
>>> >>> +    ///     e.g. "darwin-log".
>>> >>> +    ///
>>> >>> +    /// @return
>>> >>> +    ///     true if the plugin supports the feature; otherwise,
>>> false.
>>> >>> +    //
>>> >>> ------------------------------------------------------------
>>> -------------
>>> >>> +    virtual bool
>>> >>> +    SupportsStructuredDataType(const ConstString &type_name) = 0;
>>> >>> +
>>> >>> +    //
>>> >>> ------------------------------------------------------------
>>> -------------
>>> >>> +    /// Handle the arrival of asynchronous structured data from the
>>> >>> process.
>>> >>> +    ///
>>> >>> +    /// When asynchronous structured data arrives from the process
>>> >>> monitor,
>>> >>> +    /// it is immediately delivered to the plugin mapped for that
>>> >>> feature
>>> >>> +    /// if one exists.  The structured data that arrives from a
>>> process
>>> >>> +    /// monitor must be a dictionary, and it must have a string
>>> field
>>> >>> named
>>> >>> +    /// "type" that must contain the StructuredData feature name
>>> set as
>>> >>> the
>>> >>> +    /// value.  This is the manner in which the data is routed to
>>> the
>>> >>> proper
>>> >>> +    /// plugin instance.
>>> >>> +    ///
>>> >>> +    /// @param[in] process
>>> >>> +    ///     The process instance that just received the structured
>>> data.
>>> >>> +    ///     This will always be the same process for a given
>>> instance of
>>> >>> +    ///     a plugin.
>>> >>> +    ///
>>> >>> +    /// @param[in] type_name
>>> >>> +    ///     The name of the feature tag for the asynchronous
>>> structured
>>> >>> data.
>>> >>> +    ///     Note this data will also be present in the \b object_sp
>>> >>> dictionary
>>> >>> +    ///     under the string value with key "type".
>>> >>> +    ///
>>> >>> +    /// @param[in] object_sp
>>> >>> +    ///     A shared pointer to the structured data that arrived.
>>> This
>>> >>> must
>>> >>> +    ///> _______________________________________________
>>> > lldb-commits mailing list
>>> > lldb-commits at lists.llvm.org
>>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
>>> >
>>>
>>
>>
>> --
>> -Todd
>>
>>
>
>
> --
> -Todd
>



-- 
-Todd
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20160819/1a766bcc/attachment-0001.html>


More information about the lldb-commits mailing list