diff --git a/linux-x64/clang/lib/python2.7/site-packages/lldb/__init__.py b/linux-x64/clang/lib/python2.7/site-packages/lldb/__init__.py
new file mode 100644
index 0000000..52a36c7
--- /dev/null
+++ b/linux-x64/clang/lib/python2.7/site-packages/lldb/__init__.py
@@ -0,0 +1,15639 @@
+# This file was automatically generated by SWIG (http://www.swig.org).
+# Version 3.0.12
+#
+# Do not make changes to this file unless you know what you are doing--modify
+# the SWIG interface file instead.
+
+"""
+The lldb module contains the public APIs for Python binding.
+
+Some of the important classes are described here:
+
+o SBTarget: Represents the target program running under the debugger.
+o SBProcess: Represents the process associated with the target program.
+o SBThread: Represents a thread of execution. SBProcess contains SBThread(s).
+o SBFrame: Represents one of the stack frames associated with a thread. SBThread
+      contains SBFrame(s).
+o SBSymbolContext: A container that stores various debugger related info.
+o SBValue: Represents the value of a variable, a register, or an expression.
+o SBModule: Represents an executable image and its associated object and symbol
+      files.  SBTarget contains SBModule(s).
+o SBBreakpoint: Represents a logical breakpoint and its associated settings.
+      SBTarget contains SBBreakpoint(s).
+o SBSymbol: Represents the symbol possibly associated with a stack frame.
+o SBCompileUnit: Represents a compilation unit, or compiled source file.
+o SBFunction: Represents a generic function, which can be inlined or not.
+o SBBlock: Represents a lexical block. SBFunction contains SBBlock(s).
+o SBLineEntry: Specifies an association with a contiguous range of instructions
+      and a source file location. SBCompileUnit contains SBLineEntry(s).
+"""
+
+
+try:
+    # Try an absolute import first.  If we're being loaded from lldb,
+    # _lldb should be a built-in module.
+    import _lldb
+except ImportError:
+    # Relative import should work if we are being loaded by Python.
+    from . import _lldb
+try:
+    _swig_property = property
+except NameError:
+    pass  # Python < 2.2 doesn't have 'property'.
+
+try:
+    import builtins as __builtin__
+except ImportError:
+    import __builtin__
+
+def _swig_setattr_nondynamic(self, class_type, name, value, static=1):
+    if (name == "thisown"):
+        return self.this.own(value)
+    if (name == "this"):
+        if type(value).__name__ == 'SwigPyObject':
+            self.__dict__[name] = value
+            return
+    method = class_type.__swig_setmethods__.get(name, None)
+    if method:
+        return method(self, value)
+    if (not static):
+        if _newclass:
+            object.__setattr__(self, name, value)
+        else:
+            self.__dict__[name] = value
+    else:
+        raise AttributeError("You cannot add attributes to %s" % self)
+
+
+def _swig_setattr(self, class_type, name, value):
+    return _swig_setattr_nondynamic(self, class_type, name, value, 0)
+
+
+def _swig_getattr(self, class_type, name):
+    if (name == "thisown"):
+        return self.this.own()
+    method = class_type.__swig_getmethods__.get(name, None)
+    if method:
+        return method(self)
+    raise AttributeError("'%s' object has no attribute '%s'" % (class_type.__name__, name))
+
+
+def _swig_repr(self):
+    try:
+        strthis = "proxy of " + self.this.__repr__()
+    except __builtin__.Exception:
+        strthis = ""
+    return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,)
+
+try:
+    _object = object
+    _newclass = 1
+except __builtin__.Exception:
+    class _object:
+        pass
+    _newclass = 0
+
+
+import uuid
+import re
+import os
+
+import six
+
+
+#SWIG_VERSION is written as a single hex number, but the components of it are
+#meant to be interpreted in decimal. So, 0x030012 is swig 3.0.12, and not
+#3.0.18.
+def _to_int(hex):
+    return hex // 0x10 % 0x10 * 10 + hex % 0x10
+swig_version = (_to_int(0x030012 // 0x10000), _to_int(0x030012 // 0x100), _to_int(0x030012))
+del _to_int
+
+
+# ===================================
+# Iterator for lldb container objects
+# ===================================
+def lldb_iter(obj, getsize, getelem):
+    """A generator adaptor to support iteration for lldb container objects."""
+    size = getattr(obj, getsize)
+    elem = getattr(obj, getelem)
+    for i in range(size()):
+        yield elem(i)
+
+INT32_MAX = _lldb.INT32_MAX
+UINT32_MAX = _lldb.UINT32_MAX
+UINT64_MAX = _lldb.UINT64_MAX
+LLDB_GENERIC_ERROR = _lldb.LLDB_GENERIC_ERROR
+LLDB_INVALID_BREAK_ID = _lldb.LLDB_INVALID_BREAK_ID
+LLDB_DEFAULT_BREAK_SIZE = _lldb.LLDB_DEFAULT_BREAK_SIZE
+LLDB_INVALID_WATCH_ID = _lldb.LLDB_INVALID_WATCH_ID
+LLDB_WATCH_TYPE_READ = _lldb.LLDB_WATCH_TYPE_READ
+LLDB_WATCH_TYPE_WRITE = _lldb.LLDB_WATCH_TYPE_WRITE
+LLDB_REGNUM_GENERIC_PC = _lldb.LLDB_REGNUM_GENERIC_PC
+LLDB_REGNUM_GENERIC_SP = _lldb.LLDB_REGNUM_GENERIC_SP
+LLDB_REGNUM_GENERIC_FP = _lldb.LLDB_REGNUM_GENERIC_FP
+LLDB_REGNUM_GENERIC_RA = _lldb.LLDB_REGNUM_GENERIC_RA
+LLDB_REGNUM_GENERIC_FLAGS = _lldb.LLDB_REGNUM_GENERIC_FLAGS
+LLDB_REGNUM_GENERIC_ARG1 = _lldb.LLDB_REGNUM_GENERIC_ARG1
+LLDB_REGNUM_GENERIC_ARG2 = _lldb.LLDB_REGNUM_GENERIC_ARG2
+LLDB_REGNUM_GENERIC_ARG3 = _lldb.LLDB_REGNUM_GENERIC_ARG3
+LLDB_REGNUM_GENERIC_ARG4 = _lldb.LLDB_REGNUM_GENERIC_ARG4
+LLDB_REGNUM_GENERIC_ARG5 = _lldb.LLDB_REGNUM_GENERIC_ARG5
+LLDB_REGNUM_GENERIC_ARG6 = _lldb.LLDB_REGNUM_GENERIC_ARG6
+LLDB_REGNUM_GENERIC_ARG7 = _lldb.LLDB_REGNUM_GENERIC_ARG7
+LLDB_REGNUM_GENERIC_ARG8 = _lldb.LLDB_REGNUM_GENERIC_ARG8
+LLDB_INVALID_ADDRESS = _lldb.LLDB_INVALID_ADDRESS
+LLDB_INVALID_INDEX32 = _lldb.LLDB_INVALID_INDEX32
+LLDB_INVALID_IVAR_OFFSET = _lldb.LLDB_INVALID_IVAR_OFFSET
+LLDB_INVALID_IMAGE_TOKEN = _lldb.LLDB_INVALID_IMAGE_TOKEN
+LLDB_INVALID_MODULE_VERSION = _lldb.LLDB_INVALID_MODULE_VERSION
+LLDB_INVALID_REGNUM = _lldb.LLDB_INVALID_REGNUM
+LLDB_INVALID_UID = _lldb.LLDB_INVALID_UID
+LLDB_INVALID_PROCESS_ID = _lldb.LLDB_INVALID_PROCESS_ID
+LLDB_INVALID_THREAD_ID = _lldb.LLDB_INVALID_THREAD_ID
+LLDB_INVALID_FRAME_ID = _lldb.LLDB_INVALID_FRAME_ID
+LLDB_INVALID_SIGNAL_NUMBER = _lldb.LLDB_INVALID_SIGNAL_NUMBER
+LLDB_INVALID_OFFSET = _lldb.LLDB_INVALID_OFFSET
+LLDB_INVALID_LINE_NUMBER = _lldb.LLDB_INVALID_LINE_NUMBER
+LLDB_INVALID_QUEUE_ID = _lldb.LLDB_INVALID_QUEUE_ID
+LLDB_ARCH_DEFAULT = _lldb.LLDB_ARCH_DEFAULT
+LLDB_ARCH_DEFAULT_32BIT = _lldb.LLDB_ARCH_DEFAULT_32BIT
+LLDB_ARCH_DEFAULT_64BIT = _lldb.LLDB_ARCH_DEFAULT_64BIT
+LLDB_INVALID_CPUTYPE = _lldb.LLDB_INVALID_CPUTYPE
+LLDB_MAX_NUM_OPTION_SETS = _lldb.LLDB_MAX_NUM_OPTION_SETS
+LLDB_OPT_SET_ALL = _lldb.LLDB_OPT_SET_ALL
+LLDB_OPT_SET_1 = _lldb.LLDB_OPT_SET_1
+LLDB_OPT_SET_2 = _lldb.LLDB_OPT_SET_2
+LLDB_OPT_SET_3 = _lldb.LLDB_OPT_SET_3
+LLDB_OPT_SET_4 = _lldb.LLDB_OPT_SET_4
+LLDB_OPT_SET_5 = _lldb.LLDB_OPT_SET_5
+LLDB_OPT_SET_6 = _lldb.LLDB_OPT_SET_6
+LLDB_OPT_SET_7 = _lldb.LLDB_OPT_SET_7
+LLDB_OPT_SET_8 = _lldb.LLDB_OPT_SET_8
+LLDB_OPT_SET_9 = _lldb.LLDB_OPT_SET_9
+LLDB_OPT_SET_10 = _lldb.LLDB_OPT_SET_10
+LLDB_OPT_SET_11 = _lldb.LLDB_OPT_SET_11
+eStateInvalid = _lldb.eStateInvalid
+eStateUnloaded = _lldb.eStateUnloaded
+eStateConnected = _lldb.eStateConnected
+eStateAttaching = _lldb.eStateAttaching
+eStateLaunching = _lldb.eStateLaunching
+eStateStopped = _lldb.eStateStopped
+eStateRunning = _lldb.eStateRunning
+eStateStepping = _lldb.eStateStepping
+eStateCrashed = _lldb.eStateCrashed
+eStateDetached = _lldb.eStateDetached
+eStateExited = _lldb.eStateExited
+eStateSuspended = _lldb.eStateSuspended
+kLastStateType = _lldb.kLastStateType
+eLaunchFlagNone = _lldb.eLaunchFlagNone
+eLaunchFlagExec = _lldb.eLaunchFlagExec
+eLaunchFlagDebug = _lldb.eLaunchFlagDebug
+eLaunchFlagStopAtEntry = _lldb.eLaunchFlagStopAtEntry
+eLaunchFlagDisableASLR = _lldb.eLaunchFlagDisableASLR
+eLaunchFlagDisableSTDIO = _lldb.eLaunchFlagDisableSTDIO
+eLaunchFlagLaunchInTTY = _lldb.eLaunchFlagLaunchInTTY
+eLaunchFlagLaunchInShell = _lldb.eLaunchFlagLaunchInShell
+eLaunchFlagLaunchInSeparateProcessGroup = _lldb.eLaunchFlagLaunchInSeparateProcessGroup
+eLaunchFlagDontSetExitStatus = _lldb.eLaunchFlagDontSetExitStatus
+eLaunchFlagDetachOnError = _lldb.eLaunchFlagDetachOnError
+eLaunchFlagShellExpandArguments = _lldb.eLaunchFlagShellExpandArguments
+eLaunchFlagCloseTTYOnExit = _lldb.eLaunchFlagCloseTTYOnExit
+eOnlyThisThread = _lldb.eOnlyThisThread
+eAllThreads = _lldb.eAllThreads
+eOnlyDuringStepping = _lldb.eOnlyDuringStepping
+eByteOrderInvalid = _lldb.eByteOrderInvalid
+eByteOrderBig = _lldb.eByteOrderBig
+eByteOrderPDP = _lldb.eByteOrderPDP
+eByteOrderLittle = _lldb.eByteOrderLittle
+eEncodingInvalid = _lldb.eEncodingInvalid
+eEncodingUint = _lldb.eEncodingUint
+eEncodingSint = _lldb.eEncodingSint
+eEncodingIEEE754 = _lldb.eEncodingIEEE754
+eEncodingVector = _lldb.eEncodingVector
+eFormatDefault = _lldb.eFormatDefault
+eFormatInvalid = _lldb.eFormatInvalid
+eFormatBoolean = _lldb.eFormatBoolean
+eFormatBinary = _lldb.eFormatBinary
+eFormatBytes = _lldb.eFormatBytes
+eFormatBytesWithASCII = _lldb.eFormatBytesWithASCII
+eFormatChar = _lldb.eFormatChar
+eFormatCharPrintable = _lldb.eFormatCharPrintable
+eFormatComplex = _lldb.eFormatComplex
+eFormatComplexFloat = _lldb.eFormatComplexFloat
+eFormatCString = _lldb.eFormatCString
+eFormatDecimal = _lldb.eFormatDecimal
+eFormatEnum = _lldb.eFormatEnum
+eFormatHex = _lldb.eFormatHex
+eFormatHexUppercase = _lldb.eFormatHexUppercase
+eFormatFloat = _lldb.eFormatFloat
+eFormatOctal = _lldb.eFormatOctal
+eFormatOSType = _lldb.eFormatOSType
+eFormatUnicode16 = _lldb.eFormatUnicode16
+eFormatUnicode32 = _lldb.eFormatUnicode32
+eFormatUnsigned = _lldb.eFormatUnsigned
+eFormatPointer = _lldb.eFormatPointer
+eFormatVectorOfChar = _lldb.eFormatVectorOfChar
+eFormatVectorOfSInt8 = _lldb.eFormatVectorOfSInt8
+eFormatVectorOfUInt8 = _lldb.eFormatVectorOfUInt8
+eFormatVectorOfSInt16 = _lldb.eFormatVectorOfSInt16
+eFormatVectorOfUInt16 = _lldb.eFormatVectorOfUInt16
+eFormatVectorOfSInt32 = _lldb.eFormatVectorOfSInt32
+eFormatVectorOfUInt32 = _lldb.eFormatVectorOfUInt32
+eFormatVectorOfSInt64 = _lldb.eFormatVectorOfSInt64
+eFormatVectorOfUInt64 = _lldb.eFormatVectorOfUInt64
+eFormatVectorOfFloat16 = _lldb.eFormatVectorOfFloat16
+eFormatVectorOfFloat32 = _lldb.eFormatVectorOfFloat32
+eFormatVectorOfFloat64 = _lldb.eFormatVectorOfFloat64
+eFormatVectorOfUInt128 = _lldb.eFormatVectorOfUInt128
+eFormatComplexInteger = _lldb.eFormatComplexInteger
+eFormatCharArray = _lldb.eFormatCharArray
+eFormatAddressInfo = _lldb.eFormatAddressInfo
+eFormatHexFloat = _lldb.eFormatHexFloat
+eFormatInstruction = _lldb.eFormatInstruction
+eFormatVoid = _lldb.eFormatVoid
+kNumFormats = _lldb.kNumFormats
+eDescriptionLevelBrief = _lldb.eDescriptionLevelBrief
+eDescriptionLevelFull = _lldb.eDescriptionLevelFull
+eDescriptionLevelVerbose = _lldb.eDescriptionLevelVerbose
+eDescriptionLevelInitial = _lldb.eDescriptionLevelInitial
+kNumDescriptionLevels = _lldb.kNumDescriptionLevels
+eScriptLanguageNone = _lldb.eScriptLanguageNone
+eScriptLanguagePython = _lldb.eScriptLanguagePython
+eScriptLanguageDefault = _lldb.eScriptLanguageDefault
+eScriptLanguageUnknown = _lldb.eScriptLanguageUnknown
+eRegisterKindEHFrame = _lldb.eRegisterKindEHFrame
+eRegisterKindDWARF = _lldb.eRegisterKindDWARF
+eRegisterKindGeneric = _lldb.eRegisterKindGeneric
+eRegisterKindProcessPlugin = _lldb.eRegisterKindProcessPlugin
+eRegisterKindLLDB = _lldb.eRegisterKindLLDB
+kNumRegisterKinds = _lldb.kNumRegisterKinds
+eStopReasonInvalid = _lldb.eStopReasonInvalid
+eStopReasonNone = _lldb.eStopReasonNone
+eStopReasonTrace = _lldb.eStopReasonTrace
+eStopReasonBreakpoint = _lldb.eStopReasonBreakpoint
+eStopReasonWatchpoint = _lldb.eStopReasonWatchpoint
+eStopReasonSignal = _lldb.eStopReasonSignal
+eStopReasonException = _lldb.eStopReasonException
+eStopReasonExec = _lldb.eStopReasonExec
+eStopReasonPlanComplete = _lldb.eStopReasonPlanComplete
+eStopReasonThreadExiting = _lldb.eStopReasonThreadExiting
+eStopReasonInstrumentation = _lldb.eStopReasonInstrumentation
+eReturnStatusInvalid = _lldb.eReturnStatusInvalid
+eReturnStatusSuccessFinishNoResult = _lldb.eReturnStatusSuccessFinishNoResult
+eReturnStatusSuccessFinishResult = _lldb.eReturnStatusSuccessFinishResult
+eReturnStatusSuccessContinuingNoResult = _lldb.eReturnStatusSuccessContinuingNoResult
+eReturnStatusSuccessContinuingResult = _lldb.eReturnStatusSuccessContinuingResult
+eReturnStatusStarted = _lldb.eReturnStatusStarted
+eReturnStatusFailed = _lldb.eReturnStatusFailed
+eReturnStatusQuit = _lldb.eReturnStatusQuit
+eExpressionCompleted = _lldb.eExpressionCompleted
+eExpressionSetupError = _lldb.eExpressionSetupError
+eExpressionParseError = _lldb.eExpressionParseError
+eExpressionDiscarded = _lldb.eExpressionDiscarded
+eExpressionInterrupted = _lldb.eExpressionInterrupted
+eExpressionHitBreakpoint = _lldb.eExpressionHitBreakpoint
+eExpressionTimedOut = _lldb.eExpressionTimedOut
+eExpressionResultUnavailable = _lldb.eExpressionResultUnavailable
+eExpressionStoppedForDebug = _lldb.eExpressionStoppedForDebug
+eSearchDepthInvalid = _lldb.eSearchDepthInvalid
+eSearchDepthTarget = _lldb.eSearchDepthTarget
+eSearchDepthModule = _lldb.eSearchDepthModule
+eSearchDepthCompUnit = _lldb.eSearchDepthCompUnit
+eSearchDepthFunction = _lldb.eSearchDepthFunction
+eSearchDepthBlock = _lldb.eSearchDepthBlock
+eSearchDepthAddress = _lldb.eSearchDepthAddress
+kLastSearchDepthKind = _lldb.kLastSearchDepthKind
+eConnectionStatusSuccess = _lldb.eConnectionStatusSuccess
+eConnectionStatusEndOfFile = _lldb.eConnectionStatusEndOfFile
+eConnectionStatusError = _lldb.eConnectionStatusError
+eConnectionStatusTimedOut = _lldb.eConnectionStatusTimedOut
+eConnectionStatusNoConnection = _lldb.eConnectionStatusNoConnection
+eConnectionStatusLostConnection = _lldb.eConnectionStatusLostConnection
+eConnectionStatusInterrupted = _lldb.eConnectionStatusInterrupted
+eErrorTypeInvalid = _lldb.eErrorTypeInvalid
+eErrorTypeGeneric = _lldb.eErrorTypeGeneric
+eErrorTypeMachKernel = _lldb.eErrorTypeMachKernel
+eErrorTypePOSIX = _lldb.eErrorTypePOSIX
+eErrorTypeExpression = _lldb.eErrorTypeExpression
+eErrorTypeWin32 = _lldb.eErrorTypeWin32
+eValueTypeInvalid = _lldb.eValueTypeInvalid
+eValueTypeVariableGlobal = _lldb.eValueTypeVariableGlobal
+eValueTypeVariableStatic = _lldb.eValueTypeVariableStatic
+eValueTypeVariableArgument = _lldb.eValueTypeVariableArgument
+eValueTypeVariableLocal = _lldb.eValueTypeVariableLocal
+eValueTypeRegister = _lldb.eValueTypeRegister
+eValueTypeRegisterSet = _lldb.eValueTypeRegisterSet
+eValueTypeConstResult = _lldb.eValueTypeConstResult
+eValueTypeVariableThreadLocal = _lldb.eValueTypeVariableThreadLocal
+eInputReaderGranularityInvalid = _lldb.eInputReaderGranularityInvalid
+eInputReaderGranularityByte = _lldb.eInputReaderGranularityByte
+eInputReaderGranularityWord = _lldb.eInputReaderGranularityWord
+eInputReaderGranularityLine = _lldb.eInputReaderGranularityLine
+eInputReaderGranularityAll = _lldb.eInputReaderGranularityAll
+eSymbolContextTarget = _lldb.eSymbolContextTarget
+eSymbolContextModule = _lldb.eSymbolContextModule
+eSymbolContextCompUnit = _lldb.eSymbolContextCompUnit
+eSymbolContextFunction = _lldb.eSymbolContextFunction
+eSymbolContextBlock = _lldb.eSymbolContextBlock
+eSymbolContextLineEntry = _lldb.eSymbolContextLineEntry
+eSymbolContextSymbol = _lldb.eSymbolContextSymbol
+eSymbolContextEverything = _lldb.eSymbolContextEverything
+eSymbolContextVariable = _lldb.eSymbolContextVariable
+ePermissionsWritable = _lldb.ePermissionsWritable
+ePermissionsReadable = _lldb.ePermissionsReadable
+ePermissionsExecutable = _lldb.ePermissionsExecutable
+eInputReaderActivate = _lldb.eInputReaderActivate
+eInputReaderAsynchronousOutputWritten = _lldb.eInputReaderAsynchronousOutputWritten
+eInputReaderReactivate = _lldb.eInputReaderReactivate
+eInputReaderDeactivate = _lldb.eInputReaderDeactivate
+eInputReaderGotToken = _lldb.eInputReaderGotToken
+eInputReaderInterrupt = _lldb.eInputReaderInterrupt
+eInputReaderEndOfFile = _lldb.eInputReaderEndOfFile
+eInputReaderDone = _lldb.eInputReaderDone
+eBreakpointEventTypeInvalidType = _lldb.eBreakpointEventTypeInvalidType
+eBreakpointEventTypeAdded = _lldb.eBreakpointEventTypeAdded
+eBreakpointEventTypeRemoved = _lldb.eBreakpointEventTypeRemoved
+eBreakpointEventTypeLocationsAdded = _lldb.eBreakpointEventTypeLocationsAdded
+eBreakpointEventTypeLocationsRemoved = _lldb.eBreakpointEventTypeLocationsRemoved
+eBreakpointEventTypeLocationsResolved = _lldb.eBreakpointEventTypeLocationsResolved
+eBreakpointEventTypeEnabled = _lldb.eBreakpointEventTypeEnabled
+eBreakpointEventTypeDisabled = _lldb.eBreakpointEventTypeDisabled
+eBreakpointEventTypeCommandChanged = _lldb.eBreakpointEventTypeCommandChanged
+eBreakpointEventTypeConditionChanged = _lldb.eBreakpointEventTypeConditionChanged
+eBreakpointEventTypeIgnoreChanged = _lldb.eBreakpointEventTypeIgnoreChanged
+eBreakpointEventTypeThreadChanged = _lldb.eBreakpointEventTypeThreadChanged
+eBreakpointEventTypeAutoContinueChanged = _lldb.eBreakpointEventTypeAutoContinueChanged
+eWatchpointEventTypeInvalidType = _lldb.eWatchpointEventTypeInvalidType
+eWatchpointEventTypeAdded = _lldb.eWatchpointEventTypeAdded
+eWatchpointEventTypeRemoved = _lldb.eWatchpointEventTypeRemoved
+eWatchpointEventTypeEnabled = _lldb.eWatchpointEventTypeEnabled
+eWatchpointEventTypeDisabled = _lldb.eWatchpointEventTypeDisabled
+eWatchpointEventTypeCommandChanged = _lldb.eWatchpointEventTypeCommandChanged
+eWatchpointEventTypeConditionChanged = _lldb.eWatchpointEventTypeConditionChanged
+eWatchpointEventTypeIgnoreChanged = _lldb.eWatchpointEventTypeIgnoreChanged
+eWatchpointEventTypeThreadChanged = _lldb.eWatchpointEventTypeThreadChanged
+eWatchpointEventTypeTypeChanged = _lldb.eWatchpointEventTypeTypeChanged
+eLanguageTypeUnknown = _lldb.eLanguageTypeUnknown
+eLanguageTypeC89 = _lldb.eLanguageTypeC89
+eLanguageTypeC = _lldb.eLanguageTypeC
+eLanguageTypeAda83 = _lldb.eLanguageTypeAda83
+eLanguageTypeC_plus_plus = _lldb.eLanguageTypeC_plus_plus
+eLanguageTypeCobol74 = _lldb.eLanguageTypeCobol74
+eLanguageTypeCobol85 = _lldb.eLanguageTypeCobol85
+eLanguageTypeFortran77 = _lldb.eLanguageTypeFortran77
+eLanguageTypeFortran90 = _lldb.eLanguageTypeFortran90
+eLanguageTypePascal83 = _lldb.eLanguageTypePascal83
+eLanguageTypeModula2 = _lldb.eLanguageTypeModula2
+eLanguageTypeJava = _lldb.eLanguageTypeJava
+eLanguageTypeC99 = _lldb.eLanguageTypeC99
+eLanguageTypeAda95 = _lldb.eLanguageTypeAda95
+eLanguageTypeFortran95 = _lldb.eLanguageTypeFortran95
+eLanguageTypePLI = _lldb.eLanguageTypePLI
+eLanguageTypeObjC = _lldb.eLanguageTypeObjC
+eLanguageTypeObjC_plus_plus = _lldb.eLanguageTypeObjC_plus_plus
+eLanguageTypeUPC = _lldb.eLanguageTypeUPC
+eLanguageTypeD = _lldb.eLanguageTypeD
+eLanguageTypePython = _lldb.eLanguageTypePython
+eLanguageTypeOpenCL = _lldb.eLanguageTypeOpenCL
+eLanguageTypeGo = _lldb.eLanguageTypeGo
+eLanguageTypeModula3 = _lldb.eLanguageTypeModula3
+eLanguageTypeHaskell = _lldb.eLanguageTypeHaskell
+eLanguageTypeC_plus_plus_03 = _lldb.eLanguageTypeC_plus_plus_03
+eLanguageTypeC_plus_plus_11 = _lldb.eLanguageTypeC_plus_plus_11
+eLanguageTypeOCaml = _lldb.eLanguageTypeOCaml
+eLanguageTypeRust = _lldb.eLanguageTypeRust
+eLanguageTypeC11 = _lldb.eLanguageTypeC11
+eLanguageTypeSwift = _lldb.eLanguageTypeSwift
+eLanguageTypeJulia = _lldb.eLanguageTypeJulia
+eLanguageTypeDylan = _lldb.eLanguageTypeDylan
+eLanguageTypeC_plus_plus_14 = _lldb.eLanguageTypeC_plus_plus_14
+eLanguageTypeFortran03 = _lldb.eLanguageTypeFortran03
+eLanguageTypeFortran08 = _lldb.eLanguageTypeFortran08
+eLanguageTypeMipsAssembler = _lldb.eLanguageTypeMipsAssembler
+eLanguageTypeExtRenderScript = _lldb.eLanguageTypeExtRenderScript
+eNumLanguageTypes = _lldb.eNumLanguageTypes
+eInstrumentationRuntimeTypeAddressSanitizer = _lldb.eInstrumentationRuntimeTypeAddressSanitizer
+eInstrumentationRuntimeTypeThreadSanitizer = _lldb.eInstrumentationRuntimeTypeThreadSanitizer
+eInstrumentationRuntimeTypeUndefinedBehaviorSanitizer = _lldb.eInstrumentationRuntimeTypeUndefinedBehaviorSanitizer
+eInstrumentationRuntimeTypeMainThreadChecker = _lldb.eInstrumentationRuntimeTypeMainThreadChecker
+eInstrumentationRuntimeTypeSwiftRuntimeReporting = _lldb.eInstrumentationRuntimeTypeSwiftRuntimeReporting
+eNumInstrumentationRuntimeTypes = _lldb.eNumInstrumentationRuntimeTypes
+eNoDynamicValues = _lldb.eNoDynamicValues
+eDynamicCanRunTarget = _lldb.eDynamicCanRunTarget
+eDynamicDontRunTarget = _lldb.eDynamicDontRunTarget
+eStopShowColumnAnsiOrCaret = _lldb.eStopShowColumnAnsiOrCaret
+eStopShowColumnAnsi = _lldb.eStopShowColumnAnsi
+eStopShowColumnCaret = _lldb.eStopShowColumnCaret
+eStopShowColumnNone = _lldb.eStopShowColumnNone
+eAccessNone = _lldb.eAccessNone
+eAccessPublic = _lldb.eAccessPublic
+eAccessPrivate = _lldb.eAccessPrivate
+eAccessProtected = _lldb.eAccessProtected
+eAccessPackage = _lldb.eAccessPackage
+eArgTypeAddress = _lldb.eArgTypeAddress
+eArgTypeAddressOrExpression = _lldb.eArgTypeAddressOrExpression
+eArgTypeAliasName = _lldb.eArgTypeAliasName
+eArgTypeAliasOptions = _lldb.eArgTypeAliasOptions
+eArgTypeArchitecture = _lldb.eArgTypeArchitecture
+eArgTypeBoolean = _lldb.eArgTypeBoolean
+eArgTypeBreakpointID = _lldb.eArgTypeBreakpointID
+eArgTypeBreakpointIDRange = _lldb.eArgTypeBreakpointIDRange
+eArgTypeBreakpointName = _lldb.eArgTypeBreakpointName
+eArgTypeByteSize = _lldb.eArgTypeByteSize
+eArgTypeClassName = _lldb.eArgTypeClassName
+eArgTypeCommandName = _lldb.eArgTypeCommandName
+eArgTypeCount = _lldb.eArgTypeCount
+eArgTypeDescriptionVerbosity = _lldb.eArgTypeDescriptionVerbosity
+eArgTypeDirectoryName = _lldb.eArgTypeDirectoryName
+eArgTypeDisassemblyFlavor = _lldb.eArgTypeDisassemblyFlavor
+eArgTypeEndAddress = _lldb.eArgTypeEndAddress
+eArgTypeExpression = _lldb.eArgTypeExpression
+eArgTypeExpressionPath = _lldb.eArgTypeExpressionPath
+eArgTypeExprFormat = _lldb.eArgTypeExprFormat
+eArgTypeFilename = _lldb.eArgTypeFilename
+eArgTypeFormat = _lldb.eArgTypeFormat
+eArgTypeFrameIndex = _lldb.eArgTypeFrameIndex
+eArgTypeFullName = _lldb.eArgTypeFullName
+eArgTypeFunctionName = _lldb.eArgTypeFunctionName
+eArgTypeFunctionOrSymbol = _lldb.eArgTypeFunctionOrSymbol
+eArgTypeGDBFormat = _lldb.eArgTypeGDBFormat
+eArgTypeHelpText = _lldb.eArgTypeHelpText
+eArgTypeIndex = _lldb.eArgTypeIndex
+eArgTypeLanguage = _lldb.eArgTypeLanguage
+eArgTypeLineNum = _lldb.eArgTypeLineNum
+eArgTypeLogCategory = _lldb.eArgTypeLogCategory
+eArgTypeLogChannel = _lldb.eArgTypeLogChannel
+eArgTypeMethod = _lldb.eArgTypeMethod
+eArgTypeName = _lldb.eArgTypeName
+eArgTypeNewPathPrefix = _lldb.eArgTypeNewPathPrefix
+eArgTypeNumLines = _lldb.eArgTypeNumLines
+eArgTypeNumberPerLine = _lldb.eArgTypeNumberPerLine
+eArgTypeOffset = _lldb.eArgTypeOffset
+eArgTypeOldPathPrefix = _lldb.eArgTypeOldPathPrefix
+eArgTypeOneLiner = _lldb.eArgTypeOneLiner
+eArgTypePath = _lldb.eArgTypePath
+eArgTypePermissionsNumber = _lldb.eArgTypePermissionsNumber
+eArgTypePermissionsString = _lldb.eArgTypePermissionsString
+eArgTypePid = _lldb.eArgTypePid
+eArgTypePlugin = _lldb.eArgTypePlugin
+eArgTypeProcessName = _lldb.eArgTypeProcessName
+eArgTypePythonClass = _lldb.eArgTypePythonClass
+eArgTypePythonFunction = _lldb.eArgTypePythonFunction
+eArgTypePythonScript = _lldb.eArgTypePythonScript
+eArgTypeQueueName = _lldb.eArgTypeQueueName
+eArgTypeRegisterName = _lldb.eArgTypeRegisterName
+eArgTypeRegularExpression = _lldb.eArgTypeRegularExpression
+eArgTypeRunArgs = _lldb.eArgTypeRunArgs
+eArgTypeRunMode = _lldb.eArgTypeRunMode
+eArgTypeScriptedCommandSynchronicity = _lldb.eArgTypeScriptedCommandSynchronicity
+eArgTypeScriptLang = _lldb.eArgTypeScriptLang
+eArgTypeSearchWord = _lldb.eArgTypeSearchWord
+eArgTypeSelector = _lldb.eArgTypeSelector
+eArgTypeSettingIndex = _lldb.eArgTypeSettingIndex
+eArgTypeSettingKey = _lldb.eArgTypeSettingKey
+eArgTypeSettingPrefix = _lldb.eArgTypeSettingPrefix
+eArgTypeSettingVariableName = _lldb.eArgTypeSettingVariableName
+eArgTypeShlibName = _lldb.eArgTypeShlibName
+eArgTypeSourceFile = _lldb.eArgTypeSourceFile
+eArgTypeSortOrder = _lldb.eArgTypeSortOrder
+eArgTypeStartAddress = _lldb.eArgTypeStartAddress
+eArgTypeSummaryString = _lldb.eArgTypeSummaryString
+eArgTypeSymbol = _lldb.eArgTypeSymbol
+eArgTypeThreadID = _lldb.eArgTypeThreadID
+eArgTypeThreadIndex = _lldb.eArgTypeThreadIndex
+eArgTypeThreadName = _lldb.eArgTypeThreadName
+eArgTypeTypeName = _lldb.eArgTypeTypeName
+eArgTypeUnsignedInteger = _lldb.eArgTypeUnsignedInteger
+eArgTypeUnixSignal = _lldb.eArgTypeUnixSignal
+eArgTypeVarName = _lldb.eArgTypeVarName
+eArgTypeValue = _lldb.eArgTypeValue
+eArgTypeWidth = _lldb.eArgTypeWidth
+eArgTypeNone = _lldb.eArgTypeNone
+eArgTypePlatform = _lldb.eArgTypePlatform
+eArgTypeWatchpointID = _lldb.eArgTypeWatchpointID
+eArgTypeWatchpointIDRange = _lldb.eArgTypeWatchpointIDRange
+eArgTypeWatchType = _lldb.eArgTypeWatchType
+eArgRawInput = _lldb.eArgRawInput
+eArgTypeCommand = _lldb.eArgTypeCommand
+eArgTypeLastArg = _lldb.eArgTypeLastArg
+eSymbolTypeAny = _lldb.eSymbolTypeAny
+eSymbolTypeInvalid = _lldb.eSymbolTypeInvalid
+eSymbolTypeAbsolute = _lldb.eSymbolTypeAbsolute
+eSymbolTypeCode = _lldb.eSymbolTypeCode
+eSymbolTypeResolver = _lldb.eSymbolTypeResolver
+eSymbolTypeData = _lldb.eSymbolTypeData
+eSymbolTypeTrampoline = _lldb.eSymbolTypeTrampoline
+eSymbolTypeRuntime = _lldb.eSymbolTypeRuntime
+eSymbolTypeException = _lldb.eSymbolTypeException
+eSymbolTypeSourceFile = _lldb.eSymbolTypeSourceFile
+eSymbolTypeHeaderFile = _lldb.eSymbolTypeHeaderFile
+eSymbolTypeObjectFile = _lldb.eSymbolTypeObjectFile
+eSymbolTypeCommonBlock = _lldb.eSymbolTypeCommonBlock
+eSymbolTypeBlock = _lldb.eSymbolTypeBlock
+eSymbolTypeLocal = _lldb.eSymbolTypeLocal
+eSymbolTypeParam = _lldb.eSymbolTypeParam
+eSymbolTypeVariable = _lldb.eSymbolTypeVariable
+eSymbolTypeVariableType = _lldb.eSymbolTypeVariableType
+eSymbolTypeLineEntry = _lldb.eSymbolTypeLineEntry
+eSymbolTypeLineHeader = _lldb.eSymbolTypeLineHeader
+eSymbolTypeScopeBegin = _lldb.eSymbolTypeScopeBegin
+eSymbolTypeScopeEnd = _lldb.eSymbolTypeScopeEnd
+eSymbolTypeAdditional = _lldb.eSymbolTypeAdditional
+eSymbolTypeCompiler = _lldb.eSymbolTypeCompiler
+eSymbolTypeInstrumentation = _lldb.eSymbolTypeInstrumentation
+eSymbolTypeUndefined = _lldb.eSymbolTypeUndefined
+eSymbolTypeObjCClass = _lldb.eSymbolTypeObjCClass
+eSymbolTypeObjCMetaClass = _lldb.eSymbolTypeObjCMetaClass
+eSymbolTypeObjCIVar = _lldb.eSymbolTypeObjCIVar
+eSymbolTypeReExported = _lldb.eSymbolTypeReExported
+eSectionTypeInvalid = _lldb.eSectionTypeInvalid
+eSectionTypeCode = _lldb.eSectionTypeCode
+eSectionTypeContainer = _lldb.eSectionTypeContainer
+eSectionTypeData = _lldb.eSectionTypeData
+eSectionTypeDataCString = _lldb.eSectionTypeDataCString
+eSectionTypeDataCStringPointers = _lldb.eSectionTypeDataCStringPointers
+eSectionTypeDataSymbolAddress = _lldb.eSectionTypeDataSymbolAddress
+eSectionTypeData4 = _lldb.eSectionTypeData4
+eSectionTypeData8 = _lldb.eSectionTypeData8
+eSectionTypeData16 = _lldb.eSectionTypeData16
+eSectionTypeDataPointers = _lldb.eSectionTypeDataPointers
+eSectionTypeDebug = _lldb.eSectionTypeDebug
+eSectionTypeZeroFill = _lldb.eSectionTypeZeroFill
+eSectionTypeDataObjCMessageRefs = _lldb.eSectionTypeDataObjCMessageRefs
+eSectionTypeDataObjCCFStrings = _lldb.eSectionTypeDataObjCCFStrings
+eSectionTypeDWARFDebugAbbrev = _lldb.eSectionTypeDWARFDebugAbbrev
+eSectionTypeDWARFDebugAddr = _lldb.eSectionTypeDWARFDebugAddr
+eSectionTypeDWARFDebugAranges = _lldb.eSectionTypeDWARFDebugAranges
+eSectionTypeDWARFDebugCuIndex = _lldb.eSectionTypeDWARFDebugCuIndex
+eSectionTypeDWARFDebugFrame = _lldb.eSectionTypeDWARFDebugFrame
+eSectionTypeDWARFDebugInfo = _lldb.eSectionTypeDWARFDebugInfo
+eSectionTypeDWARFDebugLine = _lldb.eSectionTypeDWARFDebugLine
+eSectionTypeDWARFDebugLoc = _lldb.eSectionTypeDWARFDebugLoc
+eSectionTypeDWARFDebugMacInfo = _lldb.eSectionTypeDWARFDebugMacInfo
+eSectionTypeDWARFDebugMacro = _lldb.eSectionTypeDWARFDebugMacro
+eSectionTypeDWARFDebugPubNames = _lldb.eSectionTypeDWARFDebugPubNames
+eSectionTypeDWARFDebugPubTypes = _lldb.eSectionTypeDWARFDebugPubTypes
+eSectionTypeDWARFDebugRanges = _lldb.eSectionTypeDWARFDebugRanges
+eSectionTypeDWARFDebugStr = _lldb.eSectionTypeDWARFDebugStr
+eSectionTypeDWARFDebugStrOffsets = _lldb.eSectionTypeDWARFDebugStrOffsets
+eSectionTypeDWARFAppleNames = _lldb.eSectionTypeDWARFAppleNames
+eSectionTypeDWARFAppleTypes = _lldb.eSectionTypeDWARFAppleTypes
+eSectionTypeDWARFAppleNamespaces = _lldb.eSectionTypeDWARFAppleNamespaces
+eSectionTypeDWARFAppleObjC = _lldb.eSectionTypeDWARFAppleObjC
+eSectionTypeELFSymbolTable = _lldb.eSectionTypeELFSymbolTable
+eSectionTypeELFDynamicSymbols = _lldb.eSectionTypeELFDynamicSymbols
+eSectionTypeELFRelocationEntries = _lldb.eSectionTypeELFRelocationEntries
+eSectionTypeELFDynamicLinkInfo = _lldb.eSectionTypeELFDynamicLinkInfo
+eSectionTypeEHFrame = _lldb.eSectionTypeEHFrame
+eSectionTypeARMexidx = _lldb.eSectionTypeARMexidx
+eSectionTypeARMextab = _lldb.eSectionTypeARMextab
+eSectionTypeCompactUnwind = _lldb.eSectionTypeCompactUnwind
+eSectionTypeGoSymtab = _lldb.eSectionTypeGoSymtab
+eSectionTypeAbsoluteAddress = _lldb.eSectionTypeAbsoluteAddress
+eSectionTypeDWARFGNUDebugAltLink = _lldb.eSectionTypeDWARFGNUDebugAltLink
+eSectionTypeDWARFDebugTypes = _lldb.eSectionTypeDWARFDebugTypes
+eSectionTypeDWARFDebugNames = _lldb.eSectionTypeDWARFDebugNames
+eSectionTypeOther = _lldb.eSectionTypeOther
+eSectionTypeDWARFDebugLineStr = _lldb.eSectionTypeDWARFDebugLineStr
+eSectionTypeDWARFDebugRngLists = _lldb.eSectionTypeDWARFDebugRngLists
+eSectionTypeDWARFDebugLocLists = _lldb.eSectionTypeDWARFDebugLocLists
+eSectionTypeDWARFDebugAbbrevDwo = _lldb.eSectionTypeDWARFDebugAbbrevDwo
+eSectionTypeDWARFDebugInfoDwo = _lldb.eSectionTypeDWARFDebugInfoDwo
+eSectionTypeDWARFDebugStrDwo = _lldb.eSectionTypeDWARFDebugStrDwo
+eSectionTypeDWARFDebugStrOffsetsDwo = _lldb.eSectionTypeDWARFDebugStrOffsetsDwo
+eSectionTypeDWARFDebugTypesDwo = _lldb.eSectionTypeDWARFDebugTypesDwo
+eEmulateInstructionOptionNone = _lldb.eEmulateInstructionOptionNone
+eEmulateInstructionOptionAutoAdvancePC = _lldb.eEmulateInstructionOptionAutoAdvancePC
+eEmulateInstructionOptionIgnoreConditions = _lldb.eEmulateInstructionOptionIgnoreConditions
+eFunctionNameTypeNone = _lldb.eFunctionNameTypeNone
+eFunctionNameTypeAuto = _lldb.eFunctionNameTypeAuto
+eFunctionNameTypeFull = _lldb.eFunctionNameTypeFull
+eFunctionNameTypeBase = _lldb.eFunctionNameTypeBase
+eFunctionNameTypeMethod = _lldb.eFunctionNameTypeMethod
+eFunctionNameTypeSelector = _lldb.eFunctionNameTypeSelector
+eFunctionNameTypeAny = _lldb.eFunctionNameTypeAny
+eBasicTypeInvalid = _lldb.eBasicTypeInvalid
+eBasicTypeVoid = _lldb.eBasicTypeVoid
+eBasicTypeChar = _lldb.eBasicTypeChar
+eBasicTypeSignedChar = _lldb.eBasicTypeSignedChar
+eBasicTypeUnsignedChar = _lldb.eBasicTypeUnsignedChar
+eBasicTypeWChar = _lldb.eBasicTypeWChar
+eBasicTypeSignedWChar = _lldb.eBasicTypeSignedWChar
+eBasicTypeUnsignedWChar = _lldb.eBasicTypeUnsignedWChar
+eBasicTypeChar16 = _lldb.eBasicTypeChar16
+eBasicTypeChar32 = _lldb.eBasicTypeChar32
+eBasicTypeShort = _lldb.eBasicTypeShort
+eBasicTypeUnsignedShort = _lldb.eBasicTypeUnsignedShort
+eBasicTypeInt = _lldb.eBasicTypeInt
+eBasicTypeUnsignedInt = _lldb.eBasicTypeUnsignedInt
+eBasicTypeLong = _lldb.eBasicTypeLong
+eBasicTypeUnsignedLong = _lldb.eBasicTypeUnsignedLong
+eBasicTypeLongLong = _lldb.eBasicTypeLongLong
+eBasicTypeUnsignedLongLong = _lldb.eBasicTypeUnsignedLongLong
+eBasicTypeInt128 = _lldb.eBasicTypeInt128
+eBasicTypeUnsignedInt128 = _lldb.eBasicTypeUnsignedInt128
+eBasicTypeBool = _lldb.eBasicTypeBool
+eBasicTypeHalf = _lldb.eBasicTypeHalf
+eBasicTypeFloat = _lldb.eBasicTypeFloat
+eBasicTypeDouble = _lldb.eBasicTypeDouble
+eBasicTypeLongDouble = _lldb.eBasicTypeLongDouble
+eBasicTypeFloatComplex = _lldb.eBasicTypeFloatComplex
+eBasicTypeDoubleComplex = _lldb.eBasicTypeDoubleComplex
+eBasicTypeLongDoubleComplex = _lldb.eBasicTypeLongDoubleComplex
+eBasicTypeObjCID = _lldb.eBasicTypeObjCID
+eBasicTypeObjCClass = _lldb.eBasicTypeObjCClass
+eBasicTypeObjCSel = _lldb.eBasicTypeObjCSel
+eBasicTypeNullPtr = _lldb.eBasicTypeNullPtr
+eBasicTypeOther = _lldb.eBasicTypeOther
+eTraceTypeNone = _lldb.eTraceTypeNone
+eTraceTypeProcessorTrace = _lldb.eTraceTypeProcessorTrace
+eStructuredDataTypeInvalid = _lldb.eStructuredDataTypeInvalid
+eStructuredDataTypeNull = _lldb.eStructuredDataTypeNull
+eStructuredDataTypeGeneric = _lldb.eStructuredDataTypeGeneric
+eStructuredDataTypeArray = _lldb.eStructuredDataTypeArray
+eStructuredDataTypeInteger = _lldb.eStructuredDataTypeInteger
+eStructuredDataTypeFloat = _lldb.eStructuredDataTypeFloat
+eStructuredDataTypeBoolean = _lldb.eStructuredDataTypeBoolean
+eStructuredDataTypeString = _lldb.eStructuredDataTypeString
+eStructuredDataTypeDictionary = _lldb.eStructuredDataTypeDictionary
+eTypeClassInvalid = _lldb.eTypeClassInvalid
+eTypeClassArray = _lldb.eTypeClassArray
+eTypeClassBlockPointer = _lldb.eTypeClassBlockPointer
+eTypeClassBuiltin = _lldb.eTypeClassBuiltin
+eTypeClassClass = _lldb.eTypeClassClass
+eTypeClassComplexFloat = _lldb.eTypeClassComplexFloat
+eTypeClassComplexInteger = _lldb.eTypeClassComplexInteger
+eTypeClassEnumeration = _lldb.eTypeClassEnumeration
+eTypeClassFunction = _lldb.eTypeClassFunction
+eTypeClassMemberPointer = _lldb.eTypeClassMemberPointer
+eTypeClassObjCObject = _lldb.eTypeClassObjCObject
+eTypeClassObjCInterface = _lldb.eTypeClassObjCInterface
+eTypeClassObjCObjectPointer = _lldb.eTypeClassObjCObjectPointer
+eTypeClassPointer = _lldb.eTypeClassPointer
+eTypeClassReference = _lldb.eTypeClassReference
+eTypeClassStruct = _lldb.eTypeClassStruct
+eTypeClassTypedef = _lldb.eTypeClassTypedef
+eTypeClassUnion = _lldb.eTypeClassUnion
+eTypeClassVector = _lldb.eTypeClassVector
+eTypeClassOther = _lldb.eTypeClassOther
+eTypeClassAny = _lldb.eTypeClassAny
+eTemplateArgumentKindNull = _lldb.eTemplateArgumentKindNull
+eTemplateArgumentKindType = _lldb.eTemplateArgumentKindType
+eTemplateArgumentKindDeclaration = _lldb.eTemplateArgumentKindDeclaration
+eTemplateArgumentKindIntegral = _lldb.eTemplateArgumentKindIntegral
+eTemplateArgumentKindTemplate = _lldb.eTemplateArgumentKindTemplate
+eTemplateArgumentKindTemplateExpansion = _lldb.eTemplateArgumentKindTemplateExpansion
+eTemplateArgumentKindExpression = _lldb.eTemplateArgumentKindExpression
+eTemplateArgumentKindPack = _lldb.eTemplateArgumentKindPack
+eTemplateArgumentKindNullPtr = _lldb.eTemplateArgumentKindNullPtr
+eTypeOptionNone = _lldb.eTypeOptionNone
+eTypeOptionCascade = _lldb.eTypeOptionCascade
+eTypeOptionSkipPointers = _lldb.eTypeOptionSkipPointers
+eTypeOptionSkipReferences = _lldb.eTypeOptionSkipReferences
+eTypeOptionHideChildren = _lldb.eTypeOptionHideChildren
+eTypeOptionHideValue = _lldb.eTypeOptionHideValue
+eTypeOptionShowOneLiner = _lldb.eTypeOptionShowOneLiner
+eTypeOptionHideNames = _lldb.eTypeOptionHideNames
+eTypeOptionNonCacheable = _lldb.eTypeOptionNonCacheable
+eTypeOptionHideEmptyAggregates = _lldb.eTypeOptionHideEmptyAggregates
+eTypeOptionFrontEndWantsDereference = _lldb.eTypeOptionFrontEndWantsDereference
+eFrameCompareInvalid = _lldb.eFrameCompareInvalid
+eFrameCompareUnknown = _lldb.eFrameCompareUnknown
+eFrameCompareEqual = _lldb.eFrameCompareEqual
+eFrameCompareSameParent = _lldb.eFrameCompareSameParent
+eFrameCompareYounger = _lldb.eFrameCompareYounger
+eFrameCompareOlder = _lldb.eFrameCompareOlder
+eFilePermissionsUserRead = _lldb.eFilePermissionsUserRead
+eFilePermissionsUserWrite = _lldb.eFilePermissionsUserWrite
+eFilePermissionsUserExecute = _lldb.eFilePermissionsUserExecute
+eFilePermissionsGroupRead = _lldb.eFilePermissionsGroupRead
+eFilePermissionsGroupWrite = _lldb.eFilePermissionsGroupWrite
+eFilePermissionsGroupExecute = _lldb.eFilePermissionsGroupExecute
+eFilePermissionsWorldRead = _lldb.eFilePermissionsWorldRead
+eFilePermissionsWorldWrite = _lldb.eFilePermissionsWorldWrite
+eFilePermissionsWorldExecute = _lldb.eFilePermissionsWorldExecute
+eFilePermissionsUserRW = _lldb.eFilePermissionsUserRW
+eFileFilePermissionsUserRX = _lldb.eFileFilePermissionsUserRX
+eFilePermissionsUserRWX = _lldb.eFilePermissionsUserRWX
+eFilePermissionsGroupRW = _lldb.eFilePermissionsGroupRW
+eFilePermissionsGroupRX = _lldb.eFilePermissionsGroupRX
+eFilePermissionsGroupRWX = _lldb.eFilePermissionsGroupRWX
+eFilePermissionsWorldRW = _lldb.eFilePermissionsWorldRW
+eFilePermissionsWorldRX = _lldb.eFilePermissionsWorldRX
+eFilePermissionsWorldRWX = _lldb.eFilePermissionsWorldRWX
+eFilePermissionsEveryoneR = _lldb.eFilePermissionsEveryoneR
+eFilePermissionsEveryoneW = _lldb.eFilePermissionsEveryoneW
+eFilePermissionsEveryoneX = _lldb.eFilePermissionsEveryoneX
+eFilePermissionsEveryoneRW = _lldb.eFilePermissionsEveryoneRW
+eFilePermissionsEveryoneRX = _lldb.eFilePermissionsEveryoneRX
+eFilePermissionsEveryoneRWX = _lldb.eFilePermissionsEveryoneRWX
+eFilePermissionsFileDefault = _lldb.eFilePermissionsFileDefault
+eFilePermissionsDirectoryDefault = _lldb.eFilePermissionsDirectoryDefault
+eQueueItemKindUnknown = _lldb.eQueueItemKindUnknown
+eQueueItemKindFunction = _lldb.eQueueItemKindFunction
+eQueueItemKindBlock = _lldb.eQueueItemKindBlock
+eQueueKindUnknown = _lldb.eQueueKindUnknown
+eQueueKindSerial = _lldb.eQueueKindSerial
+eQueueKindConcurrent = _lldb.eQueueKindConcurrent
+eExpressionEvaluationParse = _lldb.eExpressionEvaluationParse
+eExpressionEvaluationIRGen = _lldb.eExpressionEvaluationIRGen
+eExpressionEvaluationExecution = _lldb.eExpressionEvaluationExecution
+eExpressionEvaluationComplete = _lldb.eExpressionEvaluationComplete
+eWatchpointKindWrite = _lldb.eWatchpointKindWrite
+eWatchpointKindRead = _lldb.eWatchpointKindRead
+eGdbSignalBadAccess = _lldb.eGdbSignalBadAccess
+eGdbSignalBadInstruction = _lldb.eGdbSignalBadInstruction
+eGdbSignalArithmetic = _lldb.eGdbSignalArithmetic
+eGdbSignalEmulation = _lldb.eGdbSignalEmulation
+eGdbSignalSoftware = _lldb.eGdbSignalSoftware
+eGdbSignalBreakpoint = _lldb.eGdbSignalBreakpoint
+ePathTypeLLDBShlibDir = _lldb.ePathTypeLLDBShlibDir
+ePathTypeSupportExecutableDir = _lldb.ePathTypeSupportExecutableDir
+ePathTypeHeaderDir = _lldb.ePathTypeHeaderDir
+ePathTypePythonDir = _lldb.ePathTypePythonDir
+ePathTypeLLDBSystemPlugins = _lldb.ePathTypeLLDBSystemPlugins
+ePathTypeLLDBUserPlugins = _lldb.ePathTypeLLDBUserPlugins
+ePathTypeLLDBTempSystemDir = _lldb.ePathTypeLLDBTempSystemDir
+ePathTypeGlobalLLDBTempSystemDir = _lldb.ePathTypeGlobalLLDBTempSystemDir
+ePathTypeClangDir = _lldb.ePathTypeClangDir
+eMemberFunctionKindUnknown = _lldb.eMemberFunctionKindUnknown
+eMemberFunctionKindConstructor = _lldb.eMemberFunctionKindConstructor
+eMemberFunctionKindDestructor = _lldb.eMemberFunctionKindDestructor
+eMemberFunctionKindInstanceMethod = _lldb.eMemberFunctionKindInstanceMethod
+eMemberFunctionKindStaticMethod = _lldb.eMemberFunctionKindStaticMethod
+eMatchTypeNormal = _lldb.eMatchTypeNormal
+eMatchTypeRegex = _lldb.eMatchTypeRegex
+eMatchTypeStartsWith = _lldb.eMatchTypeStartsWith
+eTypeHasChildren = _lldb.eTypeHasChildren
+eTypeHasValue = _lldb.eTypeHasValue
+eTypeIsArray = _lldb.eTypeIsArray
+eTypeIsBlock = _lldb.eTypeIsBlock
+eTypeIsBuiltIn = _lldb.eTypeIsBuiltIn
+eTypeIsClass = _lldb.eTypeIsClass
+eTypeIsCPlusPlus = _lldb.eTypeIsCPlusPlus
+eTypeIsEnumeration = _lldb.eTypeIsEnumeration
+eTypeIsFuncPrototype = _lldb.eTypeIsFuncPrototype
+eTypeIsMember = _lldb.eTypeIsMember
+eTypeIsObjC = _lldb.eTypeIsObjC
+eTypeIsPointer = _lldb.eTypeIsPointer
+eTypeIsReference = _lldb.eTypeIsReference
+eTypeIsStructUnion = _lldb.eTypeIsStructUnion
+eTypeIsTemplate = _lldb.eTypeIsTemplate
+eTypeIsTypedef = _lldb.eTypeIsTypedef
+eTypeIsVector = _lldb.eTypeIsVector
+eTypeIsScalar = _lldb.eTypeIsScalar
+eTypeIsInteger = _lldb.eTypeIsInteger
+eTypeIsFloat = _lldb.eTypeIsFloat
+eTypeIsComplex = _lldb.eTypeIsComplex
+eTypeIsSigned = _lldb.eTypeIsSigned
+eTypeInstanceIsPointer = _lldb.eTypeInstanceIsPointer
+eCommandRequiresTarget = _lldb.eCommandRequiresTarget
+eCommandRequiresProcess = _lldb.eCommandRequiresProcess
+eCommandRequiresThread = _lldb.eCommandRequiresThread
+eCommandRequiresFrame = _lldb.eCommandRequiresFrame
+eCommandRequiresRegContext = _lldb.eCommandRequiresRegContext
+eCommandTryTargetAPILock = _lldb.eCommandTryTargetAPILock
+eCommandProcessMustBeLaunched = _lldb.eCommandProcessMustBeLaunched
+eCommandProcessMustBePaused = _lldb.eCommandProcessMustBePaused
+eTypeSummaryCapped = _lldb.eTypeSummaryCapped
+eTypeSummaryUncapped = _lldb.eTypeSummaryUncapped
+class SBAddress(_object):
+    """
+    A section + offset based address class.
+
+    The SBAddress class allows addresses to be relative to a section
+    that can move during runtime due to images (executables, shared
+    libraries, bundles, frameworks) being loaded at different
+    addresses than the addresses found in the object file that
+    represents them on disk. There are currently two types of addresses
+    for a section:
+        o file addresses
+        o load addresses
+
+    File addresses represents the virtual addresses that are in the 'on
+    disk' object files. These virtual addresses are converted to be
+    relative to unique sections scoped to the object file so that
+    when/if the addresses slide when the images are loaded/unloaded
+    in memory, we can easily track these changes without having to
+    update every object (compile unit ranges, line tables, function
+    address ranges, lexical block and inlined subroutine address
+    ranges, global and static variables) each time an image is loaded or
+    unloaded.
+
+    Load addresses represents the virtual addresses where each section
+    ends up getting loaded at runtime. Before executing a program, it
+    is common for all of the load addresses to be unresolved. When a
+    DynamicLoader plug-in receives notification that shared libraries
+    have been loaded/unloaded, the load addresses of the main executable
+    and any images (shared libraries) will be  resolved/unresolved. When
+    this happens, breakpoints that are in one of these sections can be
+    set/cleared.
+
+    See docstring of SBFunction for example usage of SBAddress.
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBAddress, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBAddress, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBAddress self) -> SBAddress
+        __init__(lldb::SBAddress self, SBAddress rhs) -> SBAddress
+        __init__(lldb::SBAddress self, SBSection section, lldb::addr_t offset) -> SBAddress
+        __init__(lldb::SBAddress self, lldb::addr_t load_addr, SBTarget target) -> SBAddress
+
+
+        Create an address by resolving a load address using the supplied target.
+        """
+        this = _lldb.new_SBAddress(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBAddress
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBAddress self) -> bool"""
+        return _lldb.SBAddress_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBAddress___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def __eq__(self, other):
+      return not self.__ne__(other)
+
+
+    def __ne__(self, rhs):
+        """__ne__(SBAddress self, SBAddress rhs) -> bool"""
+        return _lldb.SBAddress___ne__(self, rhs)
+
+
+    def Clear(self):
+        """Clear(SBAddress self)"""
+        return _lldb.SBAddress_Clear(self)
+
+
+    def GetFileAddress(self):
+        """GetFileAddress(SBAddress self) -> lldb::addr_t"""
+        return _lldb.SBAddress_GetFileAddress(self)
+
+
+    def GetLoadAddress(self, target):
+        """GetLoadAddress(SBAddress self, SBTarget target) -> lldb::addr_t"""
+        return _lldb.SBAddress_GetLoadAddress(self, target)
+
+
+    def SetLoadAddress(self, load_addr, target):
+        """SetLoadAddress(SBAddress self, lldb::addr_t load_addr, SBTarget target)"""
+        return _lldb.SBAddress_SetLoadAddress(self, load_addr, target)
+
+
+    def OffsetAddress(self, offset):
+        """OffsetAddress(SBAddress self, lldb::addr_t offset) -> bool"""
+        return _lldb.SBAddress_OffsetAddress(self, offset)
+
+
+    def GetDescription(self, description):
+        """GetDescription(SBAddress self, SBStream description) -> bool"""
+        return _lldb.SBAddress_GetDescription(self, description)
+
+
+    def GetSection(self):
+        """GetSection(SBAddress self) -> SBSection"""
+        return _lldb.SBAddress_GetSection(self)
+
+
+    def GetOffset(self):
+        """GetOffset(SBAddress self) -> lldb::addr_t"""
+        return _lldb.SBAddress_GetOffset(self)
+
+
+    def SetAddress(self, section, offset):
+        """SetAddress(SBAddress self, SBSection section, lldb::addr_t offset)"""
+        return _lldb.SBAddress_SetAddress(self, section, offset)
+
+
+    def GetSymbolContext(self, resolve_scope):
+        """
+        GetSymbolContext(SBAddress self, uint32_t resolve_scope) -> SBSymbolContext
+
+
+        GetSymbolContext() and the following can lookup symbol information for a given address.
+        An address might refer to code or data from an existing module, or it
+        might refer to something on the stack or heap. The following functions
+        will only return valid values if the address has been resolved to a code
+        or data address using 'void SBAddress::SetLoadAddress(...)' or
+        'lldb::SBAddress SBTarget::ResolveLoadAddress (...)'.
+        """
+        return _lldb.SBAddress_GetSymbolContext(self, resolve_scope)
+
+
+    def GetModule(self):
+        """
+        GetModule(SBAddress self) -> SBModule
+
+
+        GetModule() and the following grab individual objects for a given address and
+        are less efficient if you want more than one symbol related objects.
+        Use one of the following when you want multiple debug symbol related
+        objects for an address:
+           lldb::SBSymbolContext SBAddress::GetSymbolContext (uint32_t resolve_scope);
+           lldb::SBSymbolContext SBTarget::ResolveSymbolContextForAddress (const SBAddress &addr, uint32_t resolve_scope);
+        One or more bits from the SymbolContextItem enumerations can be logically
+        OR'ed together to more efficiently retrieve multiple symbol objects.
+        """
+        return _lldb.SBAddress_GetModule(self)
+
+
+    def GetCompileUnit(self):
+        """GetCompileUnit(SBAddress self) -> SBCompileUnit"""
+        return _lldb.SBAddress_GetCompileUnit(self)
+
+
+    def GetFunction(self):
+        """GetFunction(SBAddress self) -> SBFunction"""
+        return _lldb.SBAddress_GetFunction(self)
+
+
+    def GetBlock(self):
+        """GetBlock(SBAddress self) -> SBBlock"""
+        return _lldb.SBAddress_GetBlock(self)
+
+
+    def GetSymbol(self):
+        """GetSymbol(SBAddress self) -> SBSymbol"""
+        return _lldb.SBAddress_GetSymbol(self)
+
+
+    def GetLineEntry(self):
+        """GetLineEntry(SBAddress self) -> SBLineEntry"""
+        return _lldb.SBAddress_GetLineEntry(self)
+
+
+    def __get_load_addr_property__ (self):
+        '''Get the load address for a lldb.SBAddress using the current target.'''
+        return self.GetLoadAddress (target)
+
+    def __set_load_addr_property__ (self, load_addr):
+        '''Set the load address for a lldb.SBAddress using the current target.'''
+        return self.SetLoadAddress (load_addr, target)
+
+    def __int__(self):
+        '''Convert an address to a load address if there is a process and that process is alive, or to a file address otherwise.'''
+        if process.is_alive:
+            return self.GetLoadAddress (target)
+        else:
+            return self.GetFileAddress ()
+
+    def __oct__(self):
+        '''Convert the address to an octal string'''
+        return '%o' % int(self)
+
+    def __hex__(self):
+        '''Convert the address to an hex string'''
+        return '0x%x' % int(self)
+
+    module = property(GetModule, None, doc='''A read only property that returns an lldb object that represents the module (lldb.SBModule) that this address resides within.''')
+    compile_unit = property(GetCompileUnit, None, doc='''A read only property that returns an lldb object that represents the compile unit (lldb.SBCompileUnit) that this address resides within.''')
+    line_entry = property(GetLineEntry, None, doc='''A read only property that returns an lldb object that represents the line entry (lldb.SBLineEntry) that this address resides within.''')
+    function = property(GetFunction, None, doc='''A read only property that returns an lldb object that represents the function (lldb.SBFunction) that this address resides within.''')
+    block = property(GetBlock, None, doc='''A read only property that returns an lldb object that represents the block (lldb.SBBlock) that this address resides within.''')
+    symbol = property(GetSymbol, None, doc='''A read only property that returns an lldb object that represents the symbol (lldb.SBSymbol) that this address resides within.''')
+    offset = property(GetOffset, None, doc='''A read only property that returns the section offset in bytes as an integer.''')
+    section = property(GetSection, None, doc='''A read only property that returns an lldb object that represents the section (lldb.SBSection) that this address resides within.''')
+    file_addr = property(GetFileAddress, None, doc='''A read only property that returns file address for the section as an integer. This is the address that represents the address as it is found in the object file that defines it.''')
+    load_addr = property(__get_load_addr_property__, __set_load_addr_property__, doc='''A read/write property that gets/sets the SBAddress using load address. The setter resolves SBAddress using the SBTarget from lldb.target so this property can ONLY be used in the interactive script interpreter (i.e. under the lldb script command) and not in Python based commands, or breakpoint commands.''')
+
+
+    def __str__(self):
+        """__str__(SBAddress self) -> PyObject *"""
+        return _lldb.SBAddress___str__(self)
+
+SBAddress_swigregister = _lldb.SBAddress_swigregister
+SBAddress_swigregister(SBAddress)
+
+class SBAttachInfo(_object):
+    """Proxy of C++ lldb::SBAttachInfo class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBAttachInfo, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBAttachInfo, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBAttachInfo self) -> SBAttachInfo
+        __init__(lldb::SBAttachInfo self, lldb::pid_t pid) -> SBAttachInfo
+        __init__(lldb::SBAttachInfo self, char const * path, bool wait_for) -> SBAttachInfo
+        __init__(lldb::SBAttachInfo self, char const * path, bool wait_for, bool async) -> SBAttachInfo
+        __init__(lldb::SBAttachInfo self, SBAttachInfo rhs) -> SBAttachInfo
+        """
+        this = _lldb.new_SBAttachInfo(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+
+    def GetProcessID(self):
+        """GetProcessID(SBAttachInfo self) -> lldb::pid_t"""
+        return _lldb.SBAttachInfo_GetProcessID(self)
+
+
+    def SetProcessID(self, pid):
+        """SetProcessID(SBAttachInfo self, lldb::pid_t pid)"""
+        return _lldb.SBAttachInfo_SetProcessID(self, pid)
+
+
+    def SetExecutable(self, *args):
+        """
+        SetExecutable(SBAttachInfo self, char const * path)
+        SetExecutable(SBAttachInfo self, SBFileSpec exe_file)
+        """
+        return _lldb.SBAttachInfo_SetExecutable(self, *args)
+
+
+    def GetWaitForLaunch(self):
+        """GetWaitForLaunch(SBAttachInfo self) -> bool"""
+        return _lldb.SBAttachInfo_GetWaitForLaunch(self)
+
+
+    def SetWaitForLaunch(self, *args):
+        """
+        SetWaitForLaunch(SBAttachInfo self, bool b)
+        SetWaitForLaunch(SBAttachInfo self, bool b, bool async)
+        """
+        return _lldb.SBAttachInfo_SetWaitForLaunch(self, *args)
+
+
+    def GetIgnoreExisting(self):
+        """GetIgnoreExisting(SBAttachInfo self) -> bool"""
+        return _lldb.SBAttachInfo_GetIgnoreExisting(self)
+
+
+    def SetIgnoreExisting(self, b):
+        """SetIgnoreExisting(SBAttachInfo self, bool b)"""
+        return _lldb.SBAttachInfo_SetIgnoreExisting(self, b)
+
+
+    def GetResumeCount(self):
+        """GetResumeCount(SBAttachInfo self) -> uint32_t"""
+        return _lldb.SBAttachInfo_GetResumeCount(self)
+
+
+    def SetResumeCount(self, c):
+        """SetResumeCount(SBAttachInfo self, uint32_t c)"""
+        return _lldb.SBAttachInfo_SetResumeCount(self, c)
+
+
+    def GetProcessPluginName(self):
+        """GetProcessPluginName(SBAttachInfo self) -> char const *"""
+        return _lldb.SBAttachInfo_GetProcessPluginName(self)
+
+
+    def SetProcessPluginName(self, plugin_name):
+        """SetProcessPluginName(SBAttachInfo self, char const * plugin_name)"""
+        return _lldb.SBAttachInfo_SetProcessPluginName(self, plugin_name)
+
+
+    def GetUserID(self):
+        """GetUserID(SBAttachInfo self) -> uint32_t"""
+        return _lldb.SBAttachInfo_GetUserID(self)
+
+
+    def GetGroupID(self):
+        """GetGroupID(SBAttachInfo self) -> uint32_t"""
+        return _lldb.SBAttachInfo_GetGroupID(self)
+
+
+    def UserIDIsValid(self):
+        """UserIDIsValid(SBAttachInfo self) -> bool"""
+        return _lldb.SBAttachInfo_UserIDIsValid(self)
+
+
+    def GroupIDIsValid(self):
+        """GroupIDIsValid(SBAttachInfo self) -> bool"""
+        return _lldb.SBAttachInfo_GroupIDIsValid(self)
+
+
+    def SetUserID(self, uid):
+        """SetUserID(SBAttachInfo self, uint32_t uid)"""
+        return _lldb.SBAttachInfo_SetUserID(self, uid)
+
+
+    def SetGroupID(self, gid):
+        """SetGroupID(SBAttachInfo self, uint32_t gid)"""
+        return _lldb.SBAttachInfo_SetGroupID(self, gid)
+
+
+    def GetEffectiveUserID(self):
+        """GetEffectiveUserID(SBAttachInfo self) -> uint32_t"""
+        return _lldb.SBAttachInfo_GetEffectiveUserID(self)
+
+
+    def GetEffectiveGroupID(self):
+        """GetEffectiveGroupID(SBAttachInfo self) -> uint32_t"""
+        return _lldb.SBAttachInfo_GetEffectiveGroupID(self)
+
+
+    def EffectiveUserIDIsValid(self):
+        """EffectiveUserIDIsValid(SBAttachInfo self) -> bool"""
+        return _lldb.SBAttachInfo_EffectiveUserIDIsValid(self)
+
+
+    def EffectiveGroupIDIsValid(self):
+        """EffectiveGroupIDIsValid(SBAttachInfo self) -> bool"""
+        return _lldb.SBAttachInfo_EffectiveGroupIDIsValid(self)
+
+
+    def SetEffectiveUserID(self, uid):
+        """SetEffectiveUserID(SBAttachInfo self, uint32_t uid)"""
+        return _lldb.SBAttachInfo_SetEffectiveUserID(self, uid)
+
+
+    def SetEffectiveGroupID(self, gid):
+        """SetEffectiveGroupID(SBAttachInfo self, uint32_t gid)"""
+        return _lldb.SBAttachInfo_SetEffectiveGroupID(self, gid)
+
+
+    def GetParentProcessID(self):
+        """GetParentProcessID(SBAttachInfo self) -> lldb::pid_t"""
+        return _lldb.SBAttachInfo_GetParentProcessID(self)
+
+
+    def SetParentProcessID(self, pid):
+        """SetParentProcessID(SBAttachInfo self, lldb::pid_t pid)"""
+        return _lldb.SBAttachInfo_SetParentProcessID(self, pid)
+
+
+    def ParentProcessIDIsValid(self):
+        """ParentProcessIDIsValid(SBAttachInfo self) -> bool"""
+        return _lldb.SBAttachInfo_ParentProcessIDIsValid(self)
+
+
+    def GetListener(self):
+        """GetListener(SBAttachInfo self) -> SBListener"""
+        return _lldb.SBAttachInfo_GetListener(self)
+
+
+    def SetListener(self, listener):
+        """SetListener(SBAttachInfo self, SBListener listener)"""
+        return _lldb.SBAttachInfo_SetListener(self, listener)
+
+    __swig_destroy__ = _lldb.delete_SBAttachInfo
+    __del__ = lambda self: None
+SBAttachInfo_swigregister = _lldb.SBAttachInfo_swigregister
+SBAttachInfo_swigregister(SBAttachInfo)
+
+class SBBlock(_object):
+    """Represents a lexical block. SBFunction contains SBBlock(s)."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBBlock, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBBlock, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBBlock self) -> SBBlock
+        __init__(lldb::SBBlock self, SBBlock rhs) -> SBBlock
+        """
+        this = _lldb.new_SBBlock(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBBlock
+    __del__ = lambda self: None
+
+    def IsInlined(self):
+        """
+        IsInlined(SBBlock self) -> bool
+
+        Does this block represent an inlined function?
+        """
+        return _lldb.SBBlock_IsInlined(self)
+
+
+    def IsValid(self):
+        """IsValid(SBBlock self) -> bool"""
+        return _lldb.SBBlock_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBBlock___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetInlinedName(self):
+        """
+        GetInlinedName(SBBlock self) -> char const *
+
+
+        Get the function name if this block represents an inlined function;
+        otherwise, return None.
+        """
+        return _lldb.SBBlock_GetInlinedName(self)
+
+
+    def GetInlinedCallSiteFile(self):
+        """
+        GetInlinedCallSiteFile(SBBlock self) -> SBFileSpec
+
+
+        Get the call site file if this block represents an inlined function;
+        otherwise, return an invalid file spec.
+        """
+        return _lldb.SBBlock_GetInlinedCallSiteFile(self)
+
+
+    def GetInlinedCallSiteLine(self):
+        """
+        GetInlinedCallSiteLine(SBBlock self) -> uint32_t
+
+
+        Get the call site line if this block represents an inlined function;
+        otherwise, return 0.
+        """
+        return _lldb.SBBlock_GetInlinedCallSiteLine(self)
+
+
+    def GetInlinedCallSiteColumn(self):
+        """
+        GetInlinedCallSiteColumn(SBBlock self) -> uint32_t
+
+
+        Get the call site column if this block represents an inlined function;
+        otherwise, return 0.
+        """
+        return _lldb.SBBlock_GetInlinedCallSiteColumn(self)
+
+
+    def GetParent(self):
+        """
+        GetParent(SBBlock self) -> SBBlock
+
+        Get the parent block.
+        """
+        return _lldb.SBBlock_GetParent(self)
+
+
+    def GetContainingInlinedBlock(self):
+        """
+        GetContainingInlinedBlock(SBBlock self) -> SBBlock
+
+        Get the inlined block that is or contains this block.
+        """
+        return _lldb.SBBlock_GetContainingInlinedBlock(self)
+
+
+    def GetSibling(self):
+        """
+        GetSibling(SBBlock self) -> SBBlock
+
+        Get the sibling block for this block.
+        """
+        return _lldb.SBBlock_GetSibling(self)
+
+
+    def GetFirstChild(self):
+        """
+        GetFirstChild(SBBlock self) -> SBBlock
+
+        Get the first child block.
+        """
+        return _lldb.SBBlock_GetFirstChild(self)
+
+
+    def GetNumRanges(self):
+        """GetNumRanges(SBBlock self) -> uint32_t"""
+        return _lldb.SBBlock_GetNumRanges(self)
+
+
+    def GetRangeStartAddress(self, idx):
+        """GetRangeStartAddress(SBBlock self, uint32_t idx) -> SBAddress"""
+        return _lldb.SBBlock_GetRangeStartAddress(self, idx)
+
+
+    def GetRangeEndAddress(self, idx):
+        """GetRangeEndAddress(SBBlock self, uint32_t idx) -> SBAddress"""
+        return _lldb.SBBlock_GetRangeEndAddress(self, idx)
+
+
+    def GetRangeIndexForBlockAddress(self, block_addr):
+        """GetRangeIndexForBlockAddress(SBBlock self, SBAddress block_addr) -> uint32_t"""
+        return _lldb.SBBlock_GetRangeIndexForBlockAddress(self, block_addr)
+
+
+    def GetDescription(self, description):
+        """GetDescription(SBBlock self, SBStream description) -> bool"""
+        return _lldb.SBBlock_GetDescription(self, description)
+
+
+    def GetVariables(self, *args):
+        """
+        GetVariables(SBBlock self, SBFrame frame, bool arguments, bool locals, bool statics, lldb::DynamicValueType use_dynamic) -> SBValueList
+        GetVariables(SBBlock self, SBTarget target, bool arguments, bool locals, bool statics) -> SBValueList
+        """
+        return _lldb.SBBlock_GetVariables(self, *args)
+
+
+    def get_range_at_index(self, idx):
+        if idx < self.GetNumRanges():
+            return [self.GetRangeStartAddress(idx), self.GetRangeEndAddress(idx)]
+        return []
+
+    class ranges_access(object):
+        '''A helper object that will lazily hand out an array of lldb.SBAddress that represent address ranges for a block.'''
+        def __init__(self, sbblock):
+            self.sbblock = sbblock
+
+        def __len__(self):
+            if self.sbblock:
+                return int(self.sbblock.GetNumRanges())
+            return 0
+
+        def __getitem__(self, key):
+            count = len(self)
+            if type(key) is int:
+                return self.sbblock.get_range_at_index (key);
+            if isinstance(key, SBAddress):
+                range_idx = self.sbblock.GetRangeIndexForBlockAddress(key);
+                if range_idx < len(self):
+                    return [self.sbblock.GetRangeStartAddress(range_idx), self.sbblock.GetRangeEndAddress(range_idx)]
+            else:
+                print("error: unsupported item type: %s" % type(key))
+            return None
+
+    def get_ranges_access_object(self):
+        '''An accessor function that returns a ranges_access() object which allows lazy block address ranges access.'''
+        return self.ranges_access (self)
+
+    def get_ranges_array(self):
+        '''An accessor function that returns an array object that contains all ranges in this block object.'''
+        if not hasattr(self, 'ranges_array'):
+            self.ranges_array = []
+            for idx in range(self.num_ranges):
+                self.ranges_array.append ([self.GetRangeStartAddress(idx), self.GetRangeEndAddress(idx)])
+        return self.ranges_array
+
+    def get_call_site(self):
+        return declaration(self.GetInlinedCallSiteFile(), self.GetInlinedCallSiteLine(), self.GetInlinedCallSiteColumn())
+
+    parent = property(GetParent, None, doc='''A read only property that returns the same result as GetParent().''')
+    first_child = property(GetFirstChild, None, doc='''A read only property that returns the same result as GetFirstChild().''')
+    call_site = property(get_call_site, None, doc='''A read only property that returns a lldb.declaration object that contains the inlined call site file, line and column.''')
+    sibling = property(GetSibling, None, doc='''A read only property that returns the same result as GetSibling().''')
+    name = property(GetInlinedName, None, doc='''A read only property that returns the same result as GetInlinedName().''')
+    inlined_block = property(GetContainingInlinedBlock, None, doc='''A read only property that returns the same result as GetContainingInlinedBlock().''')
+    range = property(get_ranges_access_object, None, doc='''A read only property that allows item access to the address ranges for a block by integer (range = block.range[0]) and by lldb.SBAdddress (find the range that contains the specified lldb.SBAddress like "pc_range = lldb.frame.block.range[frame.addr]").''')
+    ranges = property(get_ranges_array, None, doc='''A read only property that returns a list() object that contains all of the address ranges for the block.''')
+    num_ranges = property(GetNumRanges, None, doc='''A read only property that returns the same result as GetNumRanges().''')
+
+
+    def __str__(self):
+        """__str__(SBBlock self) -> PyObject *"""
+        return _lldb.SBBlock___str__(self)
+
+SBBlock_swigregister = _lldb.SBBlock_swigregister
+SBBlock_swigregister(SBBlock)
+
+class SBBreakpoint(_object):
+    """
+    Represents a logical breakpoint and its associated settings.
+
+    For example (from test/functionalities/breakpoint/breakpoint_ignore_count/
+    TestBreakpointIgnoreCount.py),
+
+        def breakpoint_ignore_count_python(self):
+            '''Use Python APIs to set breakpoint ignore count.'''
+            exe = os.path.join(os.getcwd(), 'a.out')
+
+            # Create a target by the debugger.
+            target = self.dbg.CreateTarget(exe)
+            self.assertTrue(target, VALID_TARGET)
+
+            # Now create a breakpoint on main.c by name 'c'.
+            breakpoint = target.BreakpointCreateByName('c', 'a.out')
+            self.assertTrue(breakpoint and
+                            breakpoint.GetNumLocations() == 1,
+                            VALID_BREAKPOINT)
+
+            # Get the breakpoint location from breakpoint after we verified that,
+            # indeed, it has one location.
+            location = breakpoint.GetLocationAtIndex(0)
+            self.assertTrue(location and
+                            location.IsEnabled(),
+                            VALID_BREAKPOINT_LOCATION)
+
+            # Set the ignore count on the breakpoint location.
+            location.SetIgnoreCount(2)
+            self.assertTrue(location.GetIgnoreCount() == 2,
+                            'SetIgnoreCount() works correctly')
+
+            # Now launch the process, and do not stop at entry point.
+            process = target.LaunchSimple(None, None, os.getcwd())
+            self.assertTrue(process, PROCESS_IS_VALID)
+
+            # Frame#0 should be on main.c:37, frame#1 should be on main.c:25, and
+            # frame#2 should be on main.c:48.
+            #lldbutil.print_stacktraces(process)
+            from lldbutil import get_stopped_thread
+            thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint)
+            self.assertTrue(thread != None, 'There should be a thread stopped due to breakpoint')
+            frame0 = thread.GetFrameAtIndex(0)
+            frame1 = thread.GetFrameAtIndex(1)
+            frame2 = thread.GetFrameAtIndex(2)
+            self.assertTrue(frame0.GetLineEntry().GetLine() == self.line1 and
+                            frame1.GetLineEntry().GetLine() == self.line3 and
+                            frame2.GetLineEntry().GetLine() == self.line4,
+                            STOPPED_DUE_TO_BREAKPOINT_IGNORE_COUNT)
+
+            # The hit count for the breakpoint should be 3.
+            self.assertTrue(breakpoint.GetHitCount() == 3)
+
+            process.Continue()
+
+    SBBreakpoint supports breakpoint location iteration, for example,
+
+        for bl in breakpoint:
+            print('breakpoint location load addr: %s' % hex(bl.GetLoadAddress()))
+            print('breakpoint location condition: %s' % hex(bl.GetCondition()))
+
+    and rich comparison methods which allow the API program to use,
+
+        if aBreakpoint == bBreakpoint:
+            ...
+
+    to compare two breakpoints for equality.
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBBreakpoint, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBBreakpoint, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBBreakpoint self) -> SBBreakpoint
+        __init__(lldb::SBBreakpoint self, SBBreakpoint rhs) -> SBBreakpoint
+        """
+        this = _lldb.new_SBBreakpoint(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBBreakpoint
+    __del__ = lambda self: None
+
+    def __eq__(self, rhs):
+        """__eq__(SBBreakpoint self, SBBreakpoint rhs) -> bool"""
+        return _lldb.SBBreakpoint___eq__(self, rhs)
+
+
+    def __ne__(self, rhs):
+        """__ne__(SBBreakpoint self, SBBreakpoint rhs) -> bool"""
+        return _lldb.SBBreakpoint___ne__(self, rhs)
+
+
+    def GetID(self):
+        """GetID(SBBreakpoint self) -> lldb::break_id_t"""
+        return _lldb.SBBreakpoint_GetID(self)
+
+
+    def IsValid(self):
+        """IsValid(SBBreakpoint self) -> bool"""
+        return _lldb.SBBreakpoint_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBBreakpoint___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def ClearAllBreakpointSites(self):
+        """ClearAllBreakpointSites(SBBreakpoint self)"""
+        return _lldb.SBBreakpoint_ClearAllBreakpointSites(self)
+
+
+    def FindLocationByAddress(self, vm_addr):
+        """FindLocationByAddress(SBBreakpoint self, lldb::addr_t vm_addr) -> SBBreakpointLocation"""
+        return _lldb.SBBreakpoint_FindLocationByAddress(self, vm_addr)
+
+
+    def FindLocationIDByAddress(self, vm_addr):
+        """FindLocationIDByAddress(SBBreakpoint self, lldb::addr_t vm_addr) -> lldb::break_id_t"""
+        return _lldb.SBBreakpoint_FindLocationIDByAddress(self, vm_addr)
+
+
+    def FindLocationByID(self, bp_loc_id):
+        """FindLocationByID(SBBreakpoint self, lldb::break_id_t bp_loc_id) -> SBBreakpointLocation"""
+        return _lldb.SBBreakpoint_FindLocationByID(self, bp_loc_id)
+
+
+    def GetLocationAtIndex(self, index):
+        """GetLocationAtIndex(SBBreakpoint self, uint32_t index) -> SBBreakpointLocation"""
+        return _lldb.SBBreakpoint_GetLocationAtIndex(self, index)
+
+
+    def SetEnabled(self, enable):
+        """SetEnabled(SBBreakpoint self, bool enable)"""
+        return _lldb.SBBreakpoint_SetEnabled(self, enable)
+
+
+    def IsEnabled(self):
+        """IsEnabled(SBBreakpoint self) -> bool"""
+        return _lldb.SBBreakpoint_IsEnabled(self)
+
+
+    def SetOneShot(self, one_shot):
+        """SetOneShot(SBBreakpoint self, bool one_shot)"""
+        return _lldb.SBBreakpoint_SetOneShot(self, one_shot)
+
+
+    def IsOneShot(self):
+        """IsOneShot(SBBreakpoint self) -> bool"""
+        return _lldb.SBBreakpoint_IsOneShot(self)
+
+
+    def IsInternal(self):
+        """IsInternal(SBBreakpoint self) -> bool"""
+        return _lldb.SBBreakpoint_IsInternal(self)
+
+
+    def GetHitCount(self):
+        """GetHitCount(SBBreakpoint self) -> uint32_t"""
+        return _lldb.SBBreakpoint_GetHitCount(self)
+
+
+    def SetIgnoreCount(self, count):
+        """SetIgnoreCount(SBBreakpoint self, uint32_t count)"""
+        return _lldb.SBBreakpoint_SetIgnoreCount(self, count)
+
+
+    def GetIgnoreCount(self):
+        """GetIgnoreCount(SBBreakpoint self) -> uint32_t"""
+        return _lldb.SBBreakpoint_GetIgnoreCount(self)
+
+
+    def SetCondition(self, condition):
+        """
+        SetCondition(SBBreakpoint self, char const * condition)
+
+
+        The breakpoint stops only if the condition expression evaluates to true.
+        """
+        return _lldb.SBBreakpoint_SetCondition(self, condition)
+
+
+    def GetCondition(self):
+        """
+        GetCondition(SBBreakpoint self) -> char const *
+
+
+        Get the condition expression for the breakpoint.
+        """
+        return _lldb.SBBreakpoint_GetCondition(self)
+
+
+    def SetAutoContinue(self, auto_continue):
+        """SetAutoContinue(SBBreakpoint self, bool auto_continue)"""
+        return _lldb.SBBreakpoint_SetAutoContinue(self, auto_continue)
+
+
+    def GetAutoContinue(self):
+        """GetAutoContinue(SBBreakpoint self) -> bool"""
+        return _lldb.SBBreakpoint_GetAutoContinue(self)
+
+
+    def SetThreadID(self, sb_thread_id):
+        """SetThreadID(SBBreakpoint self, lldb::tid_t sb_thread_id)"""
+        return _lldb.SBBreakpoint_SetThreadID(self, sb_thread_id)
+
+
+    def GetThreadID(self):
+        """GetThreadID(SBBreakpoint self) -> lldb::tid_t"""
+        return _lldb.SBBreakpoint_GetThreadID(self)
+
+
+    def SetThreadIndex(self, index):
+        """SetThreadIndex(SBBreakpoint self, uint32_t index)"""
+        return _lldb.SBBreakpoint_SetThreadIndex(self, index)
+
+
+    def GetThreadIndex(self):
+        """GetThreadIndex(SBBreakpoint self) -> uint32_t"""
+        return _lldb.SBBreakpoint_GetThreadIndex(self)
+
+
+    def SetThreadName(self, thread_name):
+        """SetThreadName(SBBreakpoint self, char const * thread_name)"""
+        return _lldb.SBBreakpoint_SetThreadName(self, thread_name)
+
+
+    def GetThreadName(self):
+        """GetThreadName(SBBreakpoint self) -> char const *"""
+        return _lldb.SBBreakpoint_GetThreadName(self)
+
+
+    def SetQueueName(self, queue_name):
+        """SetQueueName(SBBreakpoint self, char const * queue_name)"""
+        return _lldb.SBBreakpoint_SetQueueName(self, queue_name)
+
+
+    def GetQueueName(self):
+        """GetQueueName(SBBreakpoint self) -> char const *"""
+        return _lldb.SBBreakpoint_GetQueueName(self)
+
+
+    def SetScriptCallbackFunction(self, callback_function_name):
+        """
+        SetScriptCallbackFunction(SBBreakpoint self, char const * callback_function_name)
+
+
+        Set the name of the script function to be called when the breakpoint is hit.
+        """
+        return _lldb.SBBreakpoint_SetScriptCallbackFunction(self, callback_function_name)
+
+
+    def SetScriptCallbackBody(self, script_body_text):
+        """
+        SetScriptCallbackBody(SBBreakpoint self, char const * script_body_text) -> SBError
+
+
+        Provide the body for the script function to be called when the breakpoint is hit.
+        The body will be wrapped in a function, which be passed two arguments:
+        'frame' - which holds the bottom-most SBFrame of the thread that hit the breakpoint
+        'bpno'  - which is the SBBreakpointLocation to which the callback was attached.
+
+        The error parameter is currently ignored, but will at some point hold the Python
+        compilation diagnostics.
+        Returns true if the body compiles successfully, false if not.
+        """
+        return _lldb.SBBreakpoint_SetScriptCallbackBody(self, script_body_text)
+
+
+    def SetCommandLineCommands(self, commands):
+        """SetCommandLineCommands(SBBreakpoint self, SBStringList commands)"""
+        return _lldb.SBBreakpoint_SetCommandLineCommands(self, commands)
+
+
+    def GetCommandLineCommands(self, commands):
+        """GetCommandLineCommands(SBBreakpoint self, SBStringList commands) -> bool"""
+        return _lldb.SBBreakpoint_GetCommandLineCommands(self, commands)
+
+
+    def AddName(self, new_name):
+        """AddName(SBBreakpoint self, char const * new_name) -> bool"""
+        return _lldb.SBBreakpoint_AddName(self, new_name)
+
+
+    def RemoveName(self, name_to_remove):
+        """RemoveName(SBBreakpoint self, char const * name_to_remove)"""
+        return _lldb.SBBreakpoint_RemoveName(self, name_to_remove)
+
+
+    def MatchesName(self, name):
+        """MatchesName(SBBreakpoint self, char const * name) -> bool"""
+        return _lldb.SBBreakpoint_MatchesName(self, name)
+
+
+    def GetNames(self, names):
+        """GetNames(SBBreakpoint self, SBStringList names)"""
+        return _lldb.SBBreakpoint_GetNames(self, names)
+
+
+    def GetNumResolvedLocations(self):
+        """GetNumResolvedLocations(SBBreakpoint self) -> size_t"""
+        return _lldb.SBBreakpoint_GetNumResolvedLocations(self)
+
+
+    def GetNumLocations(self):
+        """GetNumLocations(SBBreakpoint self) -> size_t"""
+        return _lldb.SBBreakpoint_GetNumLocations(self)
+
+
+    def GetDescription(self, *args):
+        """
+        GetDescription(SBBreakpoint self, SBStream description) -> bool
+        GetDescription(SBBreakpoint self, SBStream description, bool include_locations) -> bool
+        """
+        return _lldb.SBBreakpoint_GetDescription(self, *args)
+
+
+    def AddLocation(self, address):
+        """AddLocation(SBBreakpoint self, SBAddress address) -> SBError"""
+        return _lldb.SBBreakpoint_AddLocation(self, address)
+
+
+    def EventIsBreakpointEvent(event):
+        """EventIsBreakpointEvent(SBEvent event) -> bool"""
+        return _lldb.SBBreakpoint_EventIsBreakpointEvent(event)
+
+    EventIsBreakpointEvent = staticmethod(EventIsBreakpointEvent)
+
+    def GetBreakpointEventTypeFromEvent(event):
+        """GetBreakpointEventTypeFromEvent(SBEvent event) -> lldb::BreakpointEventType"""
+        return _lldb.SBBreakpoint_GetBreakpointEventTypeFromEvent(event)
+
+    GetBreakpointEventTypeFromEvent = staticmethod(GetBreakpointEventTypeFromEvent)
+
+    def GetBreakpointFromEvent(event):
+        """GetBreakpointFromEvent(SBEvent event) -> SBBreakpoint"""
+        return _lldb.SBBreakpoint_GetBreakpointFromEvent(event)
+
+    GetBreakpointFromEvent = staticmethod(GetBreakpointFromEvent)
+
+    def GetBreakpointLocationAtIndexFromEvent(event, loc_idx):
+        """GetBreakpointLocationAtIndexFromEvent(SBEvent event, uint32_t loc_idx) -> SBBreakpointLocation"""
+        return _lldb.SBBreakpoint_GetBreakpointLocationAtIndexFromEvent(event, loc_idx)
+
+    GetBreakpointLocationAtIndexFromEvent = staticmethod(GetBreakpointLocationAtIndexFromEvent)
+
+    def GetNumBreakpointLocationsFromEvent(event_sp):
+        """GetNumBreakpointLocationsFromEvent(SBEvent event_sp) -> uint32_t"""
+        return _lldb.SBBreakpoint_GetNumBreakpointLocationsFromEvent(event_sp)
+
+    GetNumBreakpointLocationsFromEvent = staticmethod(GetNumBreakpointLocationsFromEvent)
+
+    def IsHardware(self):
+        """IsHardware(SBBreakpoint self) -> bool"""
+        return _lldb.SBBreakpoint_IsHardware(self)
+
+
+
+    class locations_access(object):
+        '''A helper object that will lazily hand out locations for a breakpoint when supplied an index.'''
+        def __init__(self, sbbreakpoint):
+            self.sbbreakpoint = sbbreakpoint
+
+        def __len__(self):
+            if self.sbbreakpoint:
+                return int(self.sbbreakpoint.GetNumLocations())
+            return 0
+
+        def __getitem__(self, key):
+            if type(key) is int and key < len(self):
+                return self.sbbreakpoint.GetLocationAtIndex(key)
+            return None
+
+    def get_locations_access_object(self):
+        '''An accessor function that returns a locations_access() object which allows lazy location access from a lldb.SBBreakpoint object.'''
+        return self.locations_access (self)
+
+    def get_breakpoint_location_list(self):
+        '''An accessor function that returns a list() that contains all locations in a lldb.SBBreakpoint object.'''
+        locations = []
+        accessor = self.get_locations_access_object()
+        for idx in range(len(accessor)):
+            locations.append(accessor[idx])
+        return locations
+
+    def __iter__(self):
+        '''Iterate over all breakpoint locations in a lldb.SBBreakpoint
+        object.'''
+        return lldb_iter(self, 'GetNumLocations', 'GetLocationAtIndex')
+
+    def __len__(self):
+        '''Return the number of breakpoint locations in a lldb.SBBreakpoint
+        object.'''
+        return self.GetNumLocations()
+
+    locations = property(get_breakpoint_location_list, None, doc='''A read only property that returns a list() of lldb.SBBreakpointLocation objects for this breakpoint.''')
+    location = property(get_locations_access_object, None, doc='''A read only property that returns an object that can access locations by index (not location ID) (location = bkpt.location[12]).''')
+    id = property(GetID, None, doc='''A read only property that returns the ID of this breakpoint.''')
+    enabled = property(IsEnabled, SetEnabled, doc='''A read/write property that configures whether this breakpoint is enabled or not.''')
+    one_shot = property(IsOneShot, SetOneShot, doc='''A read/write property that configures whether this breakpoint is one-shot (deleted when hit) or not.''')
+    num_locations = property(GetNumLocations, None, doc='''A read only property that returns the count of locations of this breakpoint.''')
+
+
+    def __str__(self):
+        """__str__(SBBreakpoint self) -> PyObject *"""
+        return _lldb.SBBreakpoint___str__(self)
+
+
+    def __eq__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return False 
+
+        return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
+
+    def __ne__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return True 
+
+        return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
+
+SBBreakpoint_swigregister = _lldb.SBBreakpoint_swigregister
+SBBreakpoint_swigregister(SBBreakpoint)
+
+def SBBreakpoint_EventIsBreakpointEvent(event):
+    """SBBreakpoint_EventIsBreakpointEvent(SBEvent event) -> bool"""
+    return _lldb.SBBreakpoint_EventIsBreakpointEvent(event)
+
+def SBBreakpoint_GetBreakpointEventTypeFromEvent(event):
+    """SBBreakpoint_GetBreakpointEventTypeFromEvent(SBEvent event) -> lldb::BreakpointEventType"""
+    return _lldb.SBBreakpoint_GetBreakpointEventTypeFromEvent(event)
+
+def SBBreakpoint_GetBreakpointFromEvent(event):
+    """SBBreakpoint_GetBreakpointFromEvent(SBEvent event) -> SBBreakpoint"""
+    return _lldb.SBBreakpoint_GetBreakpointFromEvent(event)
+
+def SBBreakpoint_GetBreakpointLocationAtIndexFromEvent(event, loc_idx):
+    """SBBreakpoint_GetBreakpointLocationAtIndexFromEvent(SBEvent event, uint32_t loc_idx) -> SBBreakpointLocation"""
+    return _lldb.SBBreakpoint_GetBreakpointLocationAtIndexFromEvent(event, loc_idx)
+
+def SBBreakpoint_GetNumBreakpointLocationsFromEvent(event_sp):
+    """SBBreakpoint_GetNumBreakpointLocationsFromEvent(SBEvent event_sp) -> uint32_t"""
+    return _lldb.SBBreakpoint_GetNumBreakpointLocationsFromEvent(event_sp)
+
+class SBBreakpointList(_object):
+    """Proxy of C++ lldb::SBBreakpointList class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBBreakpointList, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBBreakpointList, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, target):
+        """__init__(lldb::SBBreakpointList self, SBTarget target) -> SBBreakpointList"""
+        this = _lldb.new_SBBreakpointList(target)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBBreakpointList
+    __del__ = lambda self: None
+
+    def GetSize(self):
+        """GetSize(SBBreakpointList self) -> size_t"""
+        return _lldb.SBBreakpointList_GetSize(self)
+
+
+    def GetBreakpointAtIndex(self, idx):
+        """GetBreakpointAtIndex(SBBreakpointList self, size_t idx) -> SBBreakpoint"""
+        return _lldb.SBBreakpointList_GetBreakpointAtIndex(self, idx)
+
+
+    def FindBreakpointByID(self, arg2):
+        """FindBreakpointByID(SBBreakpointList self, lldb::break_id_t arg2) -> SBBreakpoint"""
+        return _lldb.SBBreakpointList_FindBreakpointByID(self, arg2)
+
+
+    def Append(self, sb_bkpt):
+        """Append(SBBreakpointList self, SBBreakpoint sb_bkpt)"""
+        return _lldb.SBBreakpointList_Append(self, sb_bkpt)
+
+
+    def AppendIfUnique(self, sb_bkpt):
+        """AppendIfUnique(SBBreakpointList self, SBBreakpoint sb_bkpt) -> bool"""
+        return _lldb.SBBreakpointList_AppendIfUnique(self, sb_bkpt)
+
+
+    def AppendByID(self, id):
+        """AppendByID(SBBreakpointList self, lldb::break_id_t id)"""
+        return _lldb.SBBreakpointList_AppendByID(self, id)
+
+
+    def Clear(self):
+        """Clear(SBBreakpointList self)"""
+        return _lldb.SBBreakpointList_Clear(self)
+
+SBBreakpointList_swigregister = _lldb.SBBreakpointList_swigregister
+SBBreakpointList_swigregister(SBBreakpointList)
+
+class SBBreakpointLocation(_object):
+    """
+    Represents one unique instance (by address) of a logical breakpoint.
+
+    A breakpoint location is defined by the breakpoint that produces it,
+    and the address that resulted in this particular instantiation.
+    Each breakpoint location has its settable options.
+
+    SBBreakpoint contains SBBreakpointLocation(s). See docstring of SBBreakpoint
+    for retrieval of an SBBreakpointLocation from an SBBreakpoint.
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBBreakpointLocation, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBBreakpointLocation, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBBreakpointLocation self) -> SBBreakpointLocation
+        __init__(lldb::SBBreakpointLocation self, SBBreakpointLocation rhs) -> SBBreakpointLocation
+        """
+        this = _lldb.new_SBBreakpointLocation(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBBreakpointLocation
+    __del__ = lambda self: None
+
+    def GetID(self):
+        """GetID(SBBreakpointLocation self) -> lldb::break_id_t"""
+        return _lldb.SBBreakpointLocation_GetID(self)
+
+
+    def IsValid(self):
+        """IsValid(SBBreakpointLocation self) -> bool"""
+        return _lldb.SBBreakpointLocation_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBBreakpointLocation___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetAddress(self):
+        """GetAddress(SBBreakpointLocation self) -> SBAddress"""
+        return _lldb.SBBreakpointLocation_GetAddress(self)
+
+
+    def GetLoadAddress(self):
+        """GetLoadAddress(SBBreakpointLocation self) -> lldb::addr_t"""
+        return _lldb.SBBreakpointLocation_GetLoadAddress(self)
+
+
+    def SetEnabled(self, enabled):
+        """SetEnabled(SBBreakpointLocation self, bool enabled)"""
+        return _lldb.SBBreakpointLocation_SetEnabled(self, enabled)
+
+
+    def IsEnabled(self):
+        """IsEnabled(SBBreakpointLocation self) -> bool"""
+        return _lldb.SBBreakpointLocation_IsEnabled(self)
+
+
+    def GetHitCount(self):
+        """GetHitCount(SBBreakpointLocation self) -> uint32_t"""
+        return _lldb.SBBreakpointLocation_GetHitCount(self)
+
+
+    def GetIgnoreCount(self):
+        """GetIgnoreCount(SBBreakpointLocation self) -> uint32_t"""
+        return _lldb.SBBreakpointLocation_GetIgnoreCount(self)
+
+
+    def SetIgnoreCount(self, n):
+        """SetIgnoreCount(SBBreakpointLocation self, uint32_t n)"""
+        return _lldb.SBBreakpointLocation_SetIgnoreCount(self, n)
+
+
+    def SetCondition(self, condition):
+        """
+        SetCondition(SBBreakpointLocation self, char const * condition)
+
+
+        The breakpoint location stops only if the condition expression evaluates
+        to true.
+        """
+        return _lldb.SBBreakpointLocation_SetCondition(self, condition)
+
+
+    def GetCondition(self):
+        """
+        GetCondition(SBBreakpointLocation self) -> char const *
+
+
+        Get the condition expression for the breakpoint location.
+        """
+        return _lldb.SBBreakpointLocation_GetCondition(self)
+
+
+    def GetAutoContinue(self):
+        """GetAutoContinue(SBBreakpointLocation self) -> bool"""
+        return _lldb.SBBreakpointLocation_GetAutoContinue(self)
+
+
+    def SetAutoContinue(self, auto_continue):
+        """SetAutoContinue(SBBreakpointLocation self, bool auto_continue)"""
+        return _lldb.SBBreakpointLocation_SetAutoContinue(self, auto_continue)
+
+
+    def SetScriptCallbackFunction(self, callback_function_name):
+        """
+        SetScriptCallbackFunction(SBBreakpointLocation self, char const * callback_function_name)
+
+
+        Set the callback to the given Python function name.
+        """
+        return _lldb.SBBreakpointLocation_SetScriptCallbackFunction(self, callback_function_name)
+
+
+    def SetScriptCallbackBody(self, script_body_text):
+        """
+        SetScriptCallbackBody(SBBreakpointLocation self, char const * script_body_text) -> SBError
+
+
+        Provide the body for the script function to be called when the breakpoint location is hit.
+        The body will be wrapped in a function, which be passed two arguments:
+        'frame' - which holds the bottom-most SBFrame of the thread that hit the breakpoint
+        'bpno'  - which is the SBBreakpointLocation to which the callback was attached.
+
+        The error parameter is currently ignored, but will at some point hold the Python
+        compilation diagnostics.
+        Returns true if the body compiles successfully, false if not.
+        """
+        return _lldb.SBBreakpointLocation_SetScriptCallbackBody(self, script_body_text)
+
+
+    def SetCommandLineCommands(self, commands):
+        """SetCommandLineCommands(SBBreakpointLocation self, SBStringList commands)"""
+        return _lldb.SBBreakpointLocation_SetCommandLineCommands(self, commands)
+
+
+    def GetCommandLineCommands(self, commands):
+        """GetCommandLineCommands(SBBreakpointLocation self, SBStringList commands) -> bool"""
+        return _lldb.SBBreakpointLocation_GetCommandLineCommands(self, commands)
+
+
+    def SetThreadID(self, sb_thread_id):
+        """SetThreadID(SBBreakpointLocation self, lldb::tid_t sb_thread_id)"""
+        return _lldb.SBBreakpointLocation_SetThreadID(self, sb_thread_id)
+
+
+    def GetThreadID(self):
+        """GetThreadID(SBBreakpointLocation self) -> lldb::tid_t"""
+        return _lldb.SBBreakpointLocation_GetThreadID(self)
+
+
+    def SetThreadIndex(self, index):
+        """SetThreadIndex(SBBreakpointLocation self, uint32_t index)"""
+        return _lldb.SBBreakpointLocation_SetThreadIndex(self, index)
+
+
+    def GetThreadIndex(self):
+        """GetThreadIndex(SBBreakpointLocation self) -> uint32_t"""
+        return _lldb.SBBreakpointLocation_GetThreadIndex(self)
+
+
+    def SetThreadName(self, thread_name):
+        """SetThreadName(SBBreakpointLocation self, char const * thread_name)"""
+        return _lldb.SBBreakpointLocation_SetThreadName(self, thread_name)
+
+
+    def GetThreadName(self):
+        """GetThreadName(SBBreakpointLocation self) -> char const *"""
+        return _lldb.SBBreakpointLocation_GetThreadName(self)
+
+
+    def SetQueueName(self, queue_name):
+        """SetQueueName(SBBreakpointLocation self, char const * queue_name)"""
+        return _lldb.SBBreakpointLocation_SetQueueName(self, queue_name)
+
+
+    def GetQueueName(self):
+        """GetQueueName(SBBreakpointLocation self) -> char const *"""
+        return _lldb.SBBreakpointLocation_GetQueueName(self)
+
+
+    def IsResolved(self):
+        """IsResolved(SBBreakpointLocation self) -> bool"""
+        return _lldb.SBBreakpointLocation_IsResolved(self)
+
+
+    def GetDescription(self, description, level):
+        """GetDescription(SBBreakpointLocation self, SBStream description, lldb::DescriptionLevel level) -> bool"""
+        return _lldb.SBBreakpointLocation_GetDescription(self, description, level)
+
+
+    def GetBreakpoint(self):
+        """GetBreakpoint(SBBreakpointLocation self) -> SBBreakpoint"""
+        return _lldb.SBBreakpointLocation_GetBreakpoint(self)
+
+
+    def __str__(self):
+        """__str__(SBBreakpointLocation self) -> PyObject *"""
+        return _lldb.SBBreakpointLocation___str__(self)
+
+SBBreakpointLocation_swigregister = _lldb.SBBreakpointLocation_swigregister
+SBBreakpointLocation_swigregister(SBBreakpointLocation)
+
+class SBBreakpointName(_object):
+    """
+    Represents a breakpoint name registered in a given SBTarget.
+
+    Breakpoint names provide a way to act on groups of breakpoints.  When you add a
+    name to a group of breakpoints, you can then use the name in all the command
+    line lldb commands for that name.  You can also configure the SBBreakpointName
+    options and those options will be propagated to any SBBreakpoints currently
+    using that name.  Adding a name to a breakpoint will also apply any of the
+    set options to that breakpoint.
+
+    You can also set permissions on a breakpoint name to disable listing, deleting
+    and disabling breakpoints.  That will disallow the given operation for breakpoints
+    except when the breakpoint is mentioned by ID.  So for instance deleting all the
+    breakpoints won't delete breakpoints so marked.
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBBreakpointName, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBBreakpointName, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBBreakpointName self) -> SBBreakpointName
+        __init__(lldb::SBBreakpointName self, SBTarget target, char const * name) -> SBBreakpointName
+        __init__(lldb::SBBreakpointName self, SBBreakpoint bkpt, char const * name) -> SBBreakpointName
+        __init__(lldb::SBBreakpointName self, SBBreakpointName rhs) -> SBBreakpointName
+        """
+        this = _lldb.new_SBBreakpointName(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBBreakpointName
+    __del__ = lambda self: None
+
+    def __eq__(self, rhs):
+        """__eq__(SBBreakpointName self, SBBreakpointName rhs) -> bool"""
+        return _lldb.SBBreakpointName___eq__(self, rhs)
+
+
+    def __ne__(self, rhs):
+        """__ne__(SBBreakpointName self, SBBreakpointName rhs) -> bool"""
+        return _lldb.SBBreakpointName___ne__(self, rhs)
+
+
+    def __nonzero__(self):
+        return _lldb.SBBreakpointName___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def IsValid(self):
+        """IsValid(SBBreakpointName self) -> bool"""
+        return _lldb.SBBreakpointName_IsValid(self)
+
+
+    def GetName(self):
+        """GetName(SBBreakpointName self) -> char const *"""
+        return _lldb.SBBreakpointName_GetName(self)
+
+
+    def SetEnabled(self, enable):
+        """SetEnabled(SBBreakpointName self, bool enable)"""
+        return _lldb.SBBreakpointName_SetEnabled(self, enable)
+
+
+    def IsEnabled(self):
+        """IsEnabled(SBBreakpointName self) -> bool"""
+        return _lldb.SBBreakpointName_IsEnabled(self)
+
+
+    def SetOneShot(self, one_shot):
+        """SetOneShot(SBBreakpointName self, bool one_shot)"""
+        return _lldb.SBBreakpointName_SetOneShot(self, one_shot)
+
+
+    def IsOneShot(self):
+        """IsOneShot(SBBreakpointName self) -> bool"""
+        return _lldb.SBBreakpointName_IsOneShot(self)
+
+
+    def SetIgnoreCount(self, count):
+        """SetIgnoreCount(SBBreakpointName self, uint32_t count)"""
+        return _lldb.SBBreakpointName_SetIgnoreCount(self, count)
+
+
+    def GetIgnoreCount(self):
+        """GetIgnoreCount(SBBreakpointName self) -> uint32_t"""
+        return _lldb.SBBreakpointName_GetIgnoreCount(self)
+
+
+    def SetCondition(self, condition):
+        """SetCondition(SBBreakpointName self, char const * condition)"""
+        return _lldb.SBBreakpointName_SetCondition(self, condition)
+
+
+    def GetCondition(self):
+        """GetCondition(SBBreakpointName self) -> char const *"""
+        return _lldb.SBBreakpointName_GetCondition(self)
+
+
+    def SetAutoContinue(self, auto_continue):
+        """SetAutoContinue(SBBreakpointName self, bool auto_continue)"""
+        return _lldb.SBBreakpointName_SetAutoContinue(self, auto_continue)
+
+
+    def GetAutoContinue(self):
+        """GetAutoContinue(SBBreakpointName self) -> bool"""
+        return _lldb.SBBreakpointName_GetAutoContinue(self)
+
+
+    def SetThreadID(self, sb_thread_id):
+        """SetThreadID(SBBreakpointName self, lldb::tid_t sb_thread_id)"""
+        return _lldb.SBBreakpointName_SetThreadID(self, sb_thread_id)
+
+
+    def GetThreadID(self):
+        """GetThreadID(SBBreakpointName self) -> lldb::tid_t"""
+        return _lldb.SBBreakpointName_GetThreadID(self)
+
+
+    def SetThreadIndex(self, index):
+        """SetThreadIndex(SBBreakpointName self, uint32_t index)"""
+        return _lldb.SBBreakpointName_SetThreadIndex(self, index)
+
+
+    def GetThreadIndex(self):
+        """GetThreadIndex(SBBreakpointName self) -> uint32_t"""
+        return _lldb.SBBreakpointName_GetThreadIndex(self)
+
+
+    def SetThreadName(self, thread_name):
+        """SetThreadName(SBBreakpointName self, char const * thread_name)"""
+        return _lldb.SBBreakpointName_SetThreadName(self, thread_name)
+
+
+    def GetThreadName(self):
+        """GetThreadName(SBBreakpointName self) -> char const *"""
+        return _lldb.SBBreakpointName_GetThreadName(self)
+
+
+    def SetQueueName(self, queue_name):
+        """SetQueueName(SBBreakpointName self, char const * queue_name)"""
+        return _lldb.SBBreakpointName_SetQueueName(self, queue_name)
+
+
+    def GetQueueName(self):
+        """GetQueueName(SBBreakpointName self) -> char const *"""
+        return _lldb.SBBreakpointName_GetQueueName(self)
+
+
+    def SetScriptCallbackFunction(self, callback_function_name):
+        """SetScriptCallbackFunction(SBBreakpointName self, char const * callback_function_name)"""
+        return _lldb.SBBreakpointName_SetScriptCallbackFunction(self, callback_function_name)
+
+
+    def SetCommandLineCommands(self, commands):
+        """SetCommandLineCommands(SBBreakpointName self, SBStringList commands)"""
+        return _lldb.SBBreakpointName_SetCommandLineCommands(self, commands)
+
+
+    def GetCommandLineCommands(self, commands):
+        """GetCommandLineCommands(SBBreakpointName self, SBStringList commands) -> bool"""
+        return _lldb.SBBreakpointName_GetCommandLineCommands(self, commands)
+
+
+    def SetScriptCallbackBody(self, script_body_text):
+        """SetScriptCallbackBody(SBBreakpointName self, char const * script_body_text) -> SBError"""
+        return _lldb.SBBreakpointName_SetScriptCallbackBody(self, script_body_text)
+
+
+    def GetHelpString(self):
+        """GetHelpString(SBBreakpointName self) -> char const *"""
+        return _lldb.SBBreakpointName_GetHelpString(self)
+
+
+    def SetHelpString(self, help_string):
+        """SetHelpString(SBBreakpointName self, char const * help_string)"""
+        return _lldb.SBBreakpointName_SetHelpString(self, help_string)
+
+
+    def GetAllowList(self):
+        """GetAllowList(SBBreakpointName self) -> bool"""
+        return _lldb.SBBreakpointName_GetAllowList(self)
+
+
+    def SetAllowList(self, value):
+        """SetAllowList(SBBreakpointName self, bool value)"""
+        return _lldb.SBBreakpointName_SetAllowList(self, value)
+
+
+    def GetAllowDelete(self):
+        """GetAllowDelete(SBBreakpointName self) -> bool"""
+        return _lldb.SBBreakpointName_GetAllowDelete(self)
+
+
+    def SetAllowDelete(self, value):
+        """SetAllowDelete(SBBreakpointName self, bool value)"""
+        return _lldb.SBBreakpointName_SetAllowDelete(self, value)
+
+
+    def GetAllowDisable(self):
+        """GetAllowDisable(SBBreakpointName self) -> bool"""
+        return _lldb.SBBreakpointName_GetAllowDisable(self)
+
+
+    def SetAllowDisable(self, value):
+        """SetAllowDisable(SBBreakpointName self, bool value)"""
+        return _lldb.SBBreakpointName_SetAllowDisable(self, value)
+
+
+    def GetDescription(self, description):
+        """GetDescription(SBBreakpointName self, SBStream description) -> bool"""
+        return _lldb.SBBreakpointName_GetDescription(self, description)
+
+
+    def __str__(self):
+        """__str__(SBBreakpointName self) -> PyObject *"""
+        return _lldb.SBBreakpointName___str__(self)
+
+SBBreakpointName_swigregister = _lldb.SBBreakpointName_swigregister
+SBBreakpointName_swigregister(SBBreakpointName)
+
+class SBBroadcaster(_object):
+    """
+    Represents an entity which can broadcast events. A default broadcaster is
+    associated with an SBCommandInterpreter, SBProcess, and SBTarget.  For
+    example, use
+
+        broadcaster = process.GetBroadcaster()
+
+    to retrieve the process's broadcaster.
+
+    See also SBEvent for example usage of interacting with a broadcaster.
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBBroadcaster, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBBroadcaster, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBBroadcaster self) -> SBBroadcaster
+        __init__(lldb::SBBroadcaster self, char const * name) -> SBBroadcaster
+        __init__(lldb::SBBroadcaster self, SBBroadcaster rhs) -> SBBroadcaster
+        """
+        this = _lldb.new_SBBroadcaster(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBBroadcaster
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBBroadcaster self) -> bool"""
+        return _lldb.SBBroadcaster_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBBroadcaster___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def Clear(self):
+        """Clear(SBBroadcaster self)"""
+        return _lldb.SBBroadcaster_Clear(self)
+
+
+    def BroadcastEventByType(self, event_type, unique=False):
+        """
+        BroadcastEventByType(SBBroadcaster self, uint32_t event_type, bool unique=False)
+        BroadcastEventByType(SBBroadcaster self, uint32_t event_type)
+        """
+        return _lldb.SBBroadcaster_BroadcastEventByType(self, event_type, unique)
+
+
+    def BroadcastEvent(self, event, unique=False):
+        """
+        BroadcastEvent(SBBroadcaster self, SBEvent event, bool unique=False)
+        BroadcastEvent(SBBroadcaster self, SBEvent event)
+        """
+        return _lldb.SBBroadcaster_BroadcastEvent(self, event, unique)
+
+
+    def AddInitialEventsToListener(self, listener, requested_events):
+        """AddInitialEventsToListener(SBBroadcaster self, SBListener listener, uint32_t requested_events)"""
+        return _lldb.SBBroadcaster_AddInitialEventsToListener(self, listener, requested_events)
+
+
+    def AddListener(self, listener, event_mask):
+        """AddListener(SBBroadcaster self, SBListener listener, uint32_t event_mask) -> uint32_t"""
+        return _lldb.SBBroadcaster_AddListener(self, listener, event_mask)
+
+
+    def GetName(self):
+        """GetName(SBBroadcaster self) -> char const *"""
+        return _lldb.SBBroadcaster_GetName(self)
+
+
+    def EventTypeHasListeners(self, event_type):
+        """EventTypeHasListeners(SBBroadcaster self, uint32_t event_type) -> bool"""
+        return _lldb.SBBroadcaster_EventTypeHasListeners(self, event_type)
+
+
+    def RemoveListener(self, listener, event_mask=4294967295):
+        """
+        RemoveListener(SBBroadcaster self, SBListener listener, uint32_t event_mask=4294967295) -> bool
+        RemoveListener(SBBroadcaster self, SBListener listener) -> bool
+        """
+        return _lldb.SBBroadcaster_RemoveListener(self, listener, event_mask)
+
+
+    def __eq__(self, rhs):
+        """__eq__(SBBroadcaster self, SBBroadcaster rhs) -> bool"""
+        return _lldb.SBBroadcaster___eq__(self, rhs)
+
+
+    def __ne__(self, rhs):
+        """__ne__(SBBroadcaster self, SBBroadcaster rhs) -> bool"""
+        return _lldb.SBBroadcaster___ne__(self, rhs)
+
+
+    def __eq__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return False 
+
+        return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
+
+    def __ne__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return True 
+
+        return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
+
+SBBroadcaster_swigregister = _lldb.SBBroadcaster_swigregister
+SBBroadcaster_swigregister(SBBroadcaster)
+
+class SBCommandInterpreterRunOptions(_object):
+    """
+    SBCommandInterpreterRunOptions controls how the RunCommandInterpreter runs the code it is fed.
+    A default SBCommandInterpreterRunOptions object has:
+        StopOnContinue: false
+        StopOnError:    false
+        StopOnCrash:    false
+        EchoCommands:   true
+        PrintResults:   true
+        AddToHistory:   true
+
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBCommandInterpreterRunOptions, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBCommandInterpreterRunOptions, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """__init__(lldb::SBCommandInterpreterRunOptions self) -> SBCommandInterpreterRunOptions"""
+        this = _lldb.new_SBCommandInterpreterRunOptions()
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBCommandInterpreterRunOptions
+    __del__ = lambda self: None
+
+    def GetStopOnContinue(self):
+        """GetStopOnContinue(SBCommandInterpreterRunOptions self) -> bool"""
+        return _lldb.SBCommandInterpreterRunOptions_GetStopOnContinue(self)
+
+
+    def SetStopOnContinue(self, arg2):
+        """SetStopOnContinue(SBCommandInterpreterRunOptions self, bool arg2)"""
+        return _lldb.SBCommandInterpreterRunOptions_SetStopOnContinue(self, arg2)
+
+
+    def GetStopOnError(self):
+        """GetStopOnError(SBCommandInterpreterRunOptions self) -> bool"""
+        return _lldb.SBCommandInterpreterRunOptions_GetStopOnError(self)
+
+
+    def SetStopOnError(self, arg2):
+        """SetStopOnError(SBCommandInterpreterRunOptions self, bool arg2)"""
+        return _lldb.SBCommandInterpreterRunOptions_SetStopOnError(self, arg2)
+
+
+    def GetStopOnCrash(self):
+        """GetStopOnCrash(SBCommandInterpreterRunOptions self) -> bool"""
+        return _lldb.SBCommandInterpreterRunOptions_GetStopOnCrash(self)
+
+
+    def SetStopOnCrash(self, arg2):
+        """SetStopOnCrash(SBCommandInterpreterRunOptions self, bool arg2)"""
+        return _lldb.SBCommandInterpreterRunOptions_SetStopOnCrash(self, arg2)
+
+
+    def GetEchoCommands(self):
+        """GetEchoCommands(SBCommandInterpreterRunOptions self) -> bool"""
+        return _lldb.SBCommandInterpreterRunOptions_GetEchoCommands(self)
+
+
+    def SetEchoCommands(self, arg2):
+        """SetEchoCommands(SBCommandInterpreterRunOptions self, bool arg2)"""
+        return _lldb.SBCommandInterpreterRunOptions_SetEchoCommands(self, arg2)
+
+
+    def GetPrintResults(self):
+        """GetPrintResults(SBCommandInterpreterRunOptions self) -> bool"""
+        return _lldb.SBCommandInterpreterRunOptions_GetPrintResults(self)
+
+
+    def SetPrintResults(self, arg2):
+        """SetPrintResults(SBCommandInterpreterRunOptions self, bool arg2)"""
+        return _lldb.SBCommandInterpreterRunOptions_SetPrintResults(self, arg2)
+
+
+    def GetAddToHistory(self):
+        """GetAddToHistory(SBCommandInterpreterRunOptions self) -> bool"""
+        return _lldb.SBCommandInterpreterRunOptions_GetAddToHistory(self)
+
+
+    def SetAddToHistory(self, arg2):
+        """SetAddToHistory(SBCommandInterpreterRunOptions self, bool arg2)"""
+        return _lldb.SBCommandInterpreterRunOptions_SetAddToHistory(self, arg2)
+
+SBCommandInterpreterRunOptions_swigregister = _lldb.SBCommandInterpreterRunOptions_swigregister
+SBCommandInterpreterRunOptions_swigregister(SBCommandInterpreterRunOptions)
+
+class SBCommandInterpreter(_object):
+    """
+    SBCommandInterpreter handles/interprets commands for lldb.  You get the
+    command interpreter from the SBDebugger instance. For example (from test/
+    python_api/interpreter/TestCommandInterpreterAPI.py),
+
+        def command_interpreter_api(self):
+            '''Test the SBCommandInterpreter APIs.'''
+            exe = os.path.join(os.getcwd(), 'a.out')
+
+            # Create a target by the debugger.
+            target = self.dbg.CreateTarget(exe)
+            self.assertTrue(target, VALID_TARGET)
+
+            # Retrieve the associated command interpreter from our debugger.
+            ci = self.dbg.GetCommandInterpreter()
+            self.assertTrue(ci, VALID_COMMAND_INTERPRETER)
+
+            # Exercise some APIs....
+
+            self.assertTrue(ci.HasCommands())
+            self.assertTrue(ci.HasAliases())
+            self.assertTrue(ci.HasAliasOptions())
+            self.assertTrue(ci.CommandExists('breakpoint'))
+            self.assertTrue(ci.CommandExists('target'))
+            self.assertTrue(ci.CommandExists('platform'))
+            self.assertTrue(ci.AliasExists('file'))
+            self.assertTrue(ci.AliasExists('run'))
+            self.assertTrue(ci.AliasExists('bt'))
+
+            res = lldb.SBCommandReturnObject()
+            ci.HandleCommand('breakpoint set -f main.c -l %d' % self.line, res)
+            self.assertTrue(res.Succeeded())
+            ci.HandleCommand('process launch', res)
+            self.assertTrue(res.Succeeded())
+
+            process = ci.GetProcess()
+            self.assertTrue(process)
+
+            ...
+
+    The HandleCommand() instance method takes two args: the command string and
+    an SBCommandReturnObject instance which encapsulates the result of command
+    execution.
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBCommandInterpreter, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBCommandInterpreter, name)
+    __repr__ = _swig_repr
+    eBroadcastBitThreadShouldExit = _lldb.SBCommandInterpreter_eBroadcastBitThreadShouldExit
+    eBroadcastBitResetPrompt = _lldb.SBCommandInterpreter_eBroadcastBitResetPrompt
+    eBroadcastBitQuitCommandReceived = _lldb.SBCommandInterpreter_eBroadcastBitQuitCommandReceived
+    eBroadcastBitAsynchronousOutputData = _lldb.SBCommandInterpreter_eBroadcastBitAsynchronousOutputData
+    eBroadcastBitAsynchronousErrorData = _lldb.SBCommandInterpreter_eBroadcastBitAsynchronousErrorData
+
+    def __init__(self, rhs):
+        """__init__(lldb::SBCommandInterpreter self, SBCommandInterpreter rhs) -> SBCommandInterpreter"""
+        this = _lldb.new_SBCommandInterpreter(rhs)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBCommandInterpreter
+    __del__ = lambda self: None
+
+    def GetArgumentTypeAsCString(arg_type):
+        """GetArgumentTypeAsCString(lldb::CommandArgumentType const arg_type) -> char const *"""
+        return _lldb.SBCommandInterpreter_GetArgumentTypeAsCString(arg_type)
+
+    GetArgumentTypeAsCString = staticmethod(GetArgumentTypeAsCString)
+
+    def GetArgumentDescriptionAsCString(arg_type):
+        """GetArgumentDescriptionAsCString(lldb::CommandArgumentType const arg_type) -> char const *"""
+        return _lldb.SBCommandInterpreter_GetArgumentDescriptionAsCString(arg_type)
+
+    GetArgumentDescriptionAsCString = staticmethod(GetArgumentDescriptionAsCString)
+
+    def EventIsCommandInterpreterEvent(event):
+        """EventIsCommandInterpreterEvent(SBEvent event) -> bool"""
+        return _lldb.SBCommandInterpreter_EventIsCommandInterpreterEvent(event)
+
+    EventIsCommandInterpreterEvent = staticmethod(EventIsCommandInterpreterEvent)
+
+    def IsValid(self):
+        """IsValid(SBCommandInterpreter self) -> bool"""
+        return _lldb.SBCommandInterpreter_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBCommandInterpreter___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetIOHandlerControlSequence(self, ch):
+        """GetIOHandlerControlSequence(SBCommandInterpreter self, char ch) -> char const *"""
+        return _lldb.SBCommandInterpreter_GetIOHandlerControlSequence(self, ch)
+
+
+    def GetPromptOnQuit(self):
+        """GetPromptOnQuit(SBCommandInterpreter self) -> bool"""
+        return _lldb.SBCommandInterpreter_GetPromptOnQuit(self)
+
+
+    def SetPromptOnQuit(self, b):
+        """SetPromptOnQuit(SBCommandInterpreter self, bool b)"""
+        return _lldb.SBCommandInterpreter_SetPromptOnQuit(self, b)
+
+
+    def AllowExitCodeOnQuit(self, b):
+        """AllowExitCodeOnQuit(SBCommandInterpreter self, bool b)"""
+        return _lldb.SBCommandInterpreter_AllowExitCodeOnQuit(self, b)
+
+
+    def HasCustomQuitExitCode(self):
+        """HasCustomQuitExitCode(SBCommandInterpreter self) -> bool"""
+        return _lldb.SBCommandInterpreter_HasCustomQuitExitCode(self)
+
+
+    def GetQuitStatus(self):
+        """GetQuitStatus(SBCommandInterpreter self) -> int"""
+        return _lldb.SBCommandInterpreter_GetQuitStatus(self)
+
+
+    def ResolveCommand(self, command_line, result):
+        """ResolveCommand(SBCommandInterpreter self, char const * command_line, SBCommandReturnObject result)"""
+        return _lldb.SBCommandInterpreter_ResolveCommand(self, command_line, result)
+
+
+    def CommandExists(self, cmd):
+        """CommandExists(SBCommandInterpreter self, char const * cmd) -> bool"""
+        return _lldb.SBCommandInterpreter_CommandExists(self, cmd)
+
+
+    def AliasExists(self, cmd):
+        """AliasExists(SBCommandInterpreter self, char const * cmd) -> bool"""
+        return _lldb.SBCommandInterpreter_AliasExists(self, cmd)
+
+
+    def GetBroadcaster(self):
+        """GetBroadcaster(SBCommandInterpreter self) -> SBBroadcaster"""
+        return _lldb.SBCommandInterpreter_GetBroadcaster(self)
+
+
+    def GetBroadcasterClass():
+        """GetBroadcasterClass() -> char const *"""
+        return _lldb.SBCommandInterpreter_GetBroadcasterClass()
+
+    GetBroadcasterClass = staticmethod(GetBroadcasterClass)
+
+    def HasCommands(self):
+        """HasCommands(SBCommandInterpreter self) -> bool"""
+        return _lldb.SBCommandInterpreter_HasCommands(self)
+
+
+    def HasAliases(self):
+        """HasAliases(SBCommandInterpreter self) -> bool"""
+        return _lldb.SBCommandInterpreter_HasAliases(self)
+
+
+    def HasAliasOptions(self):
+        """HasAliasOptions(SBCommandInterpreter self) -> bool"""
+        return _lldb.SBCommandInterpreter_HasAliasOptions(self)
+
+
+    def GetProcess(self):
+        """GetProcess(SBCommandInterpreter self) -> SBProcess"""
+        return _lldb.SBCommandInterpreter_GetProcess(self)
+
+
+    def GetDebugger(self):
+        """GetDebugger(SBCommandInterpreter self) -> SBDebugger"""
+        return _lldb.SBCommandInterpreter_GetDebugger(self)
+
+
+    def SourceInitFileInHomeDirectory(self, result):
+        """SourceInitFileInHomeDirectory(SBCommandInterpreter self, SBCommandReturnObject result)"""
+        return _lldb.SBCommandInterpreter_SourceInitFileInHomeDirectory(self, result)
+
+
+    def SourceInitFileInCurrentWorkingDirectory(self, result):
+        """SourceInitFileInCurrentWorkingDirectory(SBCommandInterpreter self, SBCommandReturnObject result)"""
+        return _lldb.SBCommandInterpreter_SourceInitFileInCurrentWorkingDirectory(self, result)
+
+
+    def HandleCommand(self, *args):
+        """
+        HandleCommand(SBCommandInterpreter self, char const * command_line, SBCommandReturnObject result, bool add_to_history=False) -> lldb::ReturnStatus
+        HandleCommand(SBCommandInterpreter self, char const * command_line, SBCommandReturnObject result) -> lldb::ReturnStatus
+        HandleCommand(SBCommandInterpreter self, char const * command_line, SBExecutionContext exe_ctx, SBCommandReturnObject result, bool add_to_history=False) -> lldb::ReturnStatus
+        HandleCommand(SBCommandInterpreter self, char const * command_line, SBExecutionContext exe_ctx, SBCommandReturnObject result) -> lldb::ReturnStatus
+        """
+        return _lldb.SBCommandInterpreter_HandleCommand(self, *args)
+
+
+    def HandleCommandsFromFile(self, file, override_context, options, result):
+        """HandleCommandsFromFile(SBCommandInterpreter self, SBFileSpec file, SBExecutionContext override_context, SBCommandInterpreterRunOptions options, SBCommandReturnObject result)"""
+        return _lldb.SBCommandInterpreter_HandleCommandsFromFile(self, file, override_context, options, result)
+
+
+    def HandleCompletion(self, current_line, cursor_pos, match_start_point, max_return_elements, matches):
+        """HandleCompletion(SBCommandInterpreter self, char const * current_line, uint32_t cursor_pos, int match_start_point, int max_return_elements, SBStringList matches) -> int"""
+        return _lldb.SBCommandInterpreter_HandleCompletion(self, current_line, cursor_pos, match_start_point, max_return_elements, matches)
+
+
+    def HandleCompletionWithDescriptions(self, current_line, cursor_pos, match_start_point, max_return_elements, matches, descriptions):
+        """HandleCompletionWithDescriptions(SBCommandInterpreter self, char const * current_line, uint32_t cursor_pos, int match_start_point, int max_return_elements, SBStringList matches, SBStringList descriptions) -> int"""
+        return _lldb.SBCommandInterpreter_HandleCompletionWithDescriptions(self, current_line, cursor_pos, match_start_point, max_return_elements, matches, descriptions)
+
+
+    def IsActive(self):
+        """IsActive(SBCommandInterpreter self) -> bool"""
+        return _lldb.SBCommandInterpreter_IsActive(self)
+
+
+    def WasInterrupted(self):
+        """WasInterrupted(SBCommandInterpreter self) -> bool"""
+        return _lldb.SBCommandInterpreter_WasInterrupted(self)
+
+SBCommandInterpreter_swigregister = _lldb.SBCommandInterpreter_swigregister
+SBCommandInterpreter_swigregister(SBCommandInterpreter)
+
+def SBCommandInterpreter_GetArgumentTypeAsCString(arg_type):
+    """SBCommandInterpreter_GetArgumentTypeAsCString(lldb::CommandArgumentType const arg_type) -> char const *"""
+    return _lldb.SBCommandInterpreter_GetArgumentTypeAsCString(arg_type)
+
+def SBCommandInterpreter_GetArgumentDescriptionAsCString(arg_type):
+    """SBCommandInterpreter_GetArgumentDescriptionAsCString(lldb::CommandArgumentType const arg_type) -> char const *"""
+    return _lldb.SBCommandInterpreter_GetArgumentDescriptionAsCString(arg_type)
+
+def SBCommandInterpreter_EventIsCommandInterpreterEvent(event):
+    """SBCommandInterpreter_EventIsCommandInterpreterEvent(SBEvent event) -> bool"""
+    return _lldb.SBCommandInterpreter_EventIsCommandInterpreterEvent(event)
+
+def SBCommandInterpreter_GetBroadcasterClass():
+    """SBCommandInterpreter_GetBroadcasterClass() -> char const *"""
+    return _lldb.SBCommandInterpreter_GetBroadcasterClass()
+
+class SBCommandReturnObject(_object):
+    """
+    Represents a container which holds the result from command execution.
+    It works with SBCommandInterpreter.HandleCommand() to encapsulate the result
+    of command execution.
+
+    See SBCommandInterpreter for example usage of SBCommandReturnObject.
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBCommandReturnObject, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBCommandReturnObject, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBCommandReturnObject self) -> SBCommandReturnObject
+        __init__(lldb::SBCommandReturnObject self, SBCommandReturnObject rhs) -> SBCommandReturnObject
+        """
+        this = _lldb.new_SBCommandReturnObject(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBCommandReturnObject
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBCommandReturnObject self) -> bool"""
+        return _lldb.SBCommandReturnObject_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBCommandReturnObject___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetOutputSize(self):
+        """GetOutputSize(SBCommandReturnObject self) -> size_t"""
+        return _lldb.SBCommandReturnObject_GetOutputSize(self)
+
+
+    def GetErrorSize(self):
+        """GetErrorSize(SBCommandReturnObject self) -> size_t"""
+        return _lldb.SBCommandReturnObject_GetErrorSize(self)
+
+
+    def GetOutput(self, *args):
+        """
+        GetOutput(SBCommandReturnObject self) -> char const
+        GetOutput(SBCommandReturnObject self, bool only_if_no_immediate) -> char const *
+        """
+        return _lldb.SBCommandReturnObject_GetOutput(self, *args)
+
+
+    def GetError(self, *args):
+        """
+        GetError(SBCommandReturnObject self) -> char const
+        GetError(SBCommandReturnObject self, bool if_no_immediate) -> char const *
+        """
+        return _lldb.SBCommandReturnObject_GetError(self, *args)
+
+
+    def PutOutput(self, fh):
+        """PutOutput(SBCommandReturnObject self, FILE * fh) -> size_t"""
+        return _lldb.SBCommandReturnObject_PutOutput(self, fh)
+
+
+    def PutError(self, fh):
+        """PutError(SBCommandReturnObject self, FILE * fh) -> size_t"""
+        return _lldb.SBCommandReturnObject_PutError(self, fh)
+
+
+    def Clear(self):
+        """Clear(SBCommandReturnObject self)"""
+        return _lldb.SBCommandReturnObject_Clear(self)
+
+
+    def SetStatus(self, status):
+        """SetStatus(SBCommandReturnObject self, lldb::ReturnStatus status)"""
+        return _lldb.SBCommandReturnObject_SetStatus(self, status)
+
+
+    def SetError(self, *args):
+        """
+        SetError(SBCommandReturnObject self, SBError error, char const * fallback_error_cstr=None)
+        SetError(SBCommandReturnObject self, SBError error)
+        SetError(SBCommandReturnObject self, char const * error_cstr)
+        """
+        return _lldb.SBCommandReturnObject_SetError(self, *args)
+
+
+    def GetStatus(self):
+        """GetStatus(SBCommandReturnObject self) -> lldb::ReturnStatus"""
+        return _lldb.SBCommandReturnObject_GetStatus(self)
+
+
+    def Succeeded(self):
+        """Succeeded(SBCommandReturnObject self) -> bool"""
+        return _lldb.SBCommandReturnObject_Succeeded(self)
+
+
+    def HasResult(self):
+        """HasResult(SBCommandReturnObject self) -> bool"""
+        return _lldb.SBCommandReturnObject_HasResult(self)
+
+
+    def AppendMessage(self, message):
+        """AppendMessage(SBCommandReturnObject self, char const * message)"""
+        return _lldb.SBCommandReturnObject_AppendMessage(self, message)
+
+
+    def AppendWarning(self, message):
+        """AppendWarning(SBCommandReturnObject self, char const * message)"""
+        return _lldb.SBCommandReturnObject_AppendWarning(self, message)
+
+
+    def GetDescription(self, description):
+        """GetDescription(SBCommandReturnObject self, SBStream description) -> bool"""
+        return _lldb.SBCommandReturnObject_GetDescription(self, description)
+
+
+    def SetImmediateOutputFile(self, fh):
+        """SetImmediateOutputFile(SBCommandReturnObject self, FILE * fh)"""
+        return _lldb.SBCommandReturnObject_SetImmediateOutputFile(self, fh)
+
+
+    def SetImmediateErrorFile(self, fh):
+        """SetImmediateErrorFile(SBCommandReturnObject self, FILE * fh)"""
+        return _lldb.SBCommandReturnObject_SetImmediateErrorFile(self, fh)
+
+
+    def PutCString(self, string):
+        """PutCString(SBCommandReturnObject self, char const * string)"""
+        return _lldb.SBCommandReturnObject_PutCString(self, string)
+
+
+    def Print(self, str):
+        """Print(SBCommandReturnObject self, char const * str)"""
+        return _lldb.SBCommandReturnObject_Print(self, str)
+
+
+    def __str__(self):
+        """__str__(SBCommandReturnObject self) -> PyObject *"""
+        return _lldb.SBCommandReturnObject___str__(self)
+
+
+    def write(self, str):
+        """write(SBCommandReturnObject self, char const * str)"""
+        return _lldb.SBCommandReturnObject_write(self, str)
+
+
+    def flush(self):
+        """flush(SBCommandReturnObject self)"""
+        return _lldb.SBCommandReturnObject_flush(self)
+
+SBCommandReturnObject_swigregister = _lldb.SBCommandReturnObject_swigregister
+SBCommandReturnObject_swigregister(SBCommandReturnObject)
+
+class SBCommunication(_object):
+    """Proxy of C++ lldb::SBCommunication class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBCommunication, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBCommunication, name)
+    __repr__ = _swig_repr
+    eBroadcastBitDisconnected = _lldb.SBCommunication_eBroadcastBitDisconnected
+    eBroadcastBitReadThreadGotBytes = _lldb.SBCommunication_eBroadcastBitReadThreadGotBytes
+    eBroadcastBitReadThreadDidExit = _lldb.SBCommunication_eBroadcastBitReadThreadDidExit
+    eBroadcastBitReadThreadShouldExit = _lldb.SBCommunication_eBroadcastBitReadThreadShouldExit
+    eBroadcastBitPacketAvailable = _lldb.SBCommunication_eBroadcastBitPacketAvailable
+    eAllEventBits = _lldb.SBCommunication_eAllEventBits
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBCommunication self) -> SBCommunication
+        __init__(lldb::SBCommunication self, char const * broadcaster_name) -> SBCommunication
+        """
+        this = _lldb.new_SBCommunication(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBCommunication
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBCommunication self) -> bool"""
+        return _lldb.SBCommunication_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBCommunication___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetBroadcaster(self):
+        """GetBroadcaster(SBCommunication self) -> SBBroadcaster"""
+        return _lldb.SBCommunication_GetBroadcaster(self)
+
+
+    def GetBroadcasterClass():
+        """GetBroadcasterClass() -> char const *"""
+        return _lldb.SBCommunication_GetBroadcasterClass()
+
+    GetBroadcasterClass = staticmethod(GetBroadcasterClass)
+
+    def AdoptFileDesriptor(self, fd, owns_fd):
+        """AdoptFileDesriptor(SBCommunication self, int fd, bool owns_fd) -> lldb::ConnectionStatus"""
+        return _lldb.SBCommunication_AdoptFileDesriptor(self, fd, owns_fd)
+
+
+    def Connect(self, url):
+        """Connect(SBCommunication self, char const * url) -> lldb::ConnectionStatus"""
+        return _lldb.SBCommunication_Connect(self, url)
+
+
+    def Disconnect(self):
+        """Disconnect(SBCommunication self) -> lldb::ConnectionStatus"""
+        return _lldb.SBCommunication_Disconnect(self)
+
+
+    def IsConnected(self):
+        """IsConnected(SBCommunication self) -> bool"""
+        return _lldb.SBCommunication_IsConnected(self)
+
+
+    def GetCloseOnEOF(self):
+        """GetCloseOnEOF(SBCommunication self) -> bool"""
+        return _lldb.SBCommunication_GetCloseOnEOF(self)
+
+
+    def SetCloseOnEOF(self, b):
+        """SetCloseOnEOF(SBCommunication self, bool b)"""
+        return _lldb.SBCommunication_SetCloseOnEOF(self, b)
+
+
+    def Read(self, dst, dst_len, timeout_usec, status):
+        """Read(SBCommunication self, void * dst, size_t dst_len, uint32_t timeout_usec, lldb::ConnectionStatus & status) -> size_t"""
+        return _lldb.SBCommunication_Read(self, dst, dst_len, timeout_usec, status)
+
+
+    def Write(self, src, src_len, status):
+        """Write(SBCommunication self, void const * src, size_t src_len, lldb::ConnectionStatus & status) -> size_t"""
+        return _lldb.SBCommunication_Write(self, src, src_len, status)
+
+
+    def ReadThreadStart(self):
+        """ReadThreadStart(SBCommunication self) -> bool"""
+        return _lldb.SBCommunication_ReadThreadStart(self)
+
+
+    def ReadThreadStop(self):
+        """ReadThreadStop(SBCommunication self) -> bool"""
+        return _lldb.SBCommunication_ReadThreadStop(self)
+
+
+    def ReadThreadIsRunning(self):
+        """ReadThreadIsRunning(SBCommunication self) -> bool"""
+        return _lldb.SBCommunication_ReadThreadIsRunning(self)
+
+
+    def SetReadThreadBytesReceivedCallback(self, callback, callback_baton):
+        """SetReadThreadBytesReceivedCallback(SBCommunication self, lldb::SBCommunication::ReadThreadBytesReceived callback, void * callback_baton) -> bool"""
+        return _lldb.SBCommunication_SetReadThreadBytesReceivedCallback(self, callback, callback_baton)
+
+SBCommunication_swigregister = _lldb.SBCommunication_swigregister
+SBCommunication_swigregister(SBCommunication)
+
+def SBCommunication_GetBroadcasterClass():
+    """SBCommunication_GetBroadcasterClass() -> char const *"""
+    return _lldb.SBCommunication_GetBroadcasterClass()
+
+class SBCompileUnit(_object):
+    """
+    Represents a compilation unit, or compiled source file.
+
+    SBCompileUnit supports line entry iteration. For example,
+
+        # Now get the SBSymbolContext from this frame.  We want everything. :-)
+        context = frame0.GetSymbolContext(lldb.eSymbolContextEverything)
+        ...
+
+        compileUnit = context.GetCompileUnit()
+
+        for lineEntry in compileUnit:
+            print('line entry: %s:%d' % (str(lineEntry.GetFileSpec()),
+                                        lineEntry.GetLine()))
+            print('start addr: %s' % str(lineEntry.GetStartAddress()))
+            print('end   addr: %s' % str(lineEntry.GetEndAddress()))
+
+    produces:
+
+    line entry: /Volumes/data/lldb/svn/trunk/test/python_api/symbol-context/main.c:20
+    start addr: a.out[0x100000d98]
+    end   addr: a.out[0x100000da3]
+    line entry: /Volumes/data/lldb/svn/trunk/test/python_api/symbol-context/main.c:21
+    start addr: a.out[0x100000da3]
+    end   addr: a.out[0x100000da9]
+    line entry: /Volumes/data/lldb/svn/trunk/test/python_api/symbol-context/main.c:22
+    start addr: a.out[0x100000da9]
+    end   addr: a.out[0x100000db6]
+    line entry: /Volumes/data/lldb/svn/trunk/test/python_api/symbol-context/main.c:23
+    start addr: a.out[0x100000db6]
+    end   addr: a.out[0x100000dbc]
+    ...
+
+    See also SBSymbolContext and SBLineEntry
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBCompileUnit, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBCompileUnit, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBCompileUnit self) -> SBCompileUnit
+        __init__(lldb::SBCompileUnit self, SBCompileUnit rhs) -> SBCompileUnit
+        """
+        this = _lldb.new_SBCompileUnit(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBCompileUnit
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBCompileUnit self) -> bool"""
+        return _lldb.SBCompileUnit_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBCompileUnit___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetFileSpec(self):
+        """GetFileSpec(SBCompileUnit self) -> SBFileSpec"""
+        return _lldb.SBCompileUnit_GetFileSpec(self)
+
+
+    def GetNumLineEntries(self):
+        """GetNumLineEntries(SBCompileUnit self) -> uint32_t"""
+        return _lldb.SBCompileUnit_GetNumLineEntries(self)
+
+
+    def GetLineEntryAtIndex(self, idx):
+        """GetLineEntryAtIndex(SBCompileUnit self, uint32_t idx) -> SBLineEntry"""
+        return _lldb.SBCompileUnit_GetLineEntryAtIndex(self, idx)
+
+
+    def FindLineEntryIndex(self, *args):
+        """
+        FindLineEntryIndex(SBCompileUnit self, uint32_t start_idx, uint32_t line, SBFileSpec inline_file_spec) -> uint32_t
+        FindLineEntryIndex(SBCompileUnit self, uint32_t start_idx, uint32_t line, SBFileSpec inline_file_spec, bool exact) -> uint32_t
+        """
+        return _lldb.SBCompileUnit_FindLineEntryIndex(self, *args)
+
+
+    def GetSupportFileAtIndex(self, idx):
+        """GetSupportFileAtIndex(SBCompileUnit self, uint32_t idx) -> SBFileSpec"""
+        return _lldb.SBCompileUnit_GetSupportFileAtIndex(self, idx)
+
+
+    def GetNumSupportFiles(self):
+        """GetNumSupportFiles(SBCompileUnit self) -> uint32_t"""
+        return _lldb.SBCompileUnit_GetNumSupportFiles(self)
+
+
+    def FindSupportFileIndex(self, start_idx, sb_file, full):
+        """FindSupportFileIndex(SBCompileUnit self, uint32_t start_idx, SBFileSpec sb_file, bool full) -> uint32_t"""
+        return _lldb.SBCompileUnit_FindSupportFileIndex(self, start_idx, sb_file, full)
+
+
+    def GetTypes(self, *args):
+        """
+        GetTypes(SBCompileUnit self, uint32_t type_mask) -> SBTypeList
+        GetTypes(SBCompileUnit self) -> SBTypeList
+
+
+        Get all types matching type_mask from debug info in this
+        compile unit.
+
+        @param[in] type_mask
+           A bitfield that consists of one or more bits logically OR'ed
+           together from the lldb::TypeClass enumeration. This allows
+           you to request only structure types, or only class, struct
+           and union types. Passing in lldb::eTypeClassAny will return
+           all types found in the debug information for this compile
+           unit.
+
+        @return
+           A list of types in this compile unit that match type_mask
+        """
+        return _lldb.SBCompileUnit_GetTypes(self, *args)
+
+
+    def GetLanguage(self):
+        """GetLanguage(SBCompileUnit self) -> lldb::LanguageType"""
+        return _lldb.SBCompileUnit_GetLanguage(self)
+
+
+    def GetDescription(self, description):
+        """GetDescription(SBCompileUnit self, SBStream description) -> bool"""
+        return _lldb.SBCompileUnit_GetDescription(self, description)
+
+
+    def __eq__(self, rhs):
+        """__eq__(SBCompileUnit self, SBCompileUnit rhs) -> bool"""
+        return _lldb.SBCompileUnit___eq__(self, rhs)
+
+
+    def __ne__(self, rhs):
+        """__ne__(SBCompileUnit self, SBCompileUnit rhs) -> bool"""
+        return _lldb.SBCompileUnit___ne__(self, rhs)
+
+
+    def __iter__(self):
+        '''Iterate over all line entries in a lldb.SBCompileUnit object.'''
+        return lldb_iter(self, 'GetNumLineEntries', 'GetLineEntryAtIndex')
+
+    def __len__(self):
+        '''Return the number of line entries in a lldb.SBCompileUnit
+        object.'''
+        return self.GetNumLineEntries()
+
+    file = property(GetFileSpec, None, doc='''A read only property that returns the same result an lldb object that represents the source file (lldb.SBFileSpec) for the compile unit.''')
+    num_line_entries = property(GetNumLineEntries, None, doc='''A read only property that returns the number of line entries in a compile unit as an integer.''')
+
+
+    def __str__(self):
+        """__str__(SBCompileUnit self) -> PyObject *"""
+        return _lldb.SBCompileUnit___str__(self)
+
+
+    def __eq__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return False 
+
+        return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
+
+    def __ne__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return True 
+
+        return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
+
+SBCompileUnit_swigregister = _lldb.SBCompileUnit_swigregister
+SBCompileUnit_swigregister(SBCompileUnit)
+
+class SBData(_object):
+    """Proxy of C++ lldb::SBData class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBData, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBData, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBData self) -> SBData
+        __init__(lldb::SBData self, SBData rhs) -> SBData
+        """
+        this = _lldb.new_SBData(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBData
+    __del__ = lambda self: None
+
+    def GetAddressByteSize(self):
+        """GetAddressByteSize(SBData self) -> uint8_t"""
+        return _lldb.SBData_GetAddressByteSize(self)
+
+
+    def SetAddressByteSize(self, addr_byte_size):
+        """SetAddressByteSize(SBData self, uint8_t addr_byte_size)"""
+        return _lldb.SBData_SetAddressByteSize(self, addr_byte_size)
+
+
+    def Clear(self):
+        """Clear(SBData self)"""
+        return _lldb.SBData_Clear(self)
+
+
+    def IsValid(self):
+        """IsValid(SBData self) -> bool"""
+        return _lldb.SBData_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBData___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetByteSize(self):
+        """GetByteSize(SBData self) -> size_t"""
+        return _lldb.SBData_GetByteSize(self)
+
+
+    def GetByteOrder(self):
+        """GetByteOrder(SBData self) -> lldb::ByteOrder"""
+        return _lldb.SBData_GetByteOrder(self)
+
+
+    def SetByteOrder(self, endian):
+        """SetByteOrder(SBData self, lldb::ByteOrder endian)"""
+        return _lldb.SBData_SetByteOrder(self, endian)
+
+
+    def GetFloat(self, error, offset):
+        """GetFloat(SBData self, SBError error, lldb::offset_t offset) -> float"""
+        return _lldb.SBData_GetFloat(self, error, offset)
+
+
+    def GetDouble(self, error, offset):
+        """GetDouble(SBData self, SBError error, lldb::offset_t offset) -> double"""
+        return _lldb.SBData_GetDouble(self, error, offset)
+
+
+    def GetLongDouble(self, error, offset):
+        """GetLongDouble(SBData self, SBError error, lldb::offset_t offset) -> long double"""
+        return _lldb.SBData_GetLongDouble(self, error, offset)
+
+
+    def GetAddress(self, error, offset):
+        """GetAddress(SBData self, SBError error, lldb::offset_t offset) -> lldb::addr_t"""
+        return _lldb.SBData_GetAddress(self, error, offset)
+
+
+    def GetUnsignedInt8(self, error, offset):
+        """GetUnsignedInt8(SBData self, SBError error, lldb::offset_t offset) -> uint8_t"""
+        return _lldb.SBData_GetUnsignedInt8(self, error, offset)
+
+
+    def GetUnsignedInt16(self, error, offset):
+        """GetUnsignedInt16(SBData self, SBError error, lldb::offset_t offset) -> uint16_t"""
+        return _lldb.SBData_GetUnsignedInt16(self, error, offset)
+
+
+    def GetUnsignedInt32(self, error, offset):
+        """GetUnsignedInt32(SBData self, SBError error, lldb::offset_t offset) -> uint32_t"""
+        return _lldb.SBData_GetUnsignedInt32(self, error, offset)
+
+
+    def GetUnsignedInt64(self, error, offset):
+        """GetUnsignedInt64(SBData self, SBError error, lldb::offset_t offset) -> uint64_t"""
+        return _lldb.SBData_GetUnsignedInt64(self, error, offset)
+
+
+    def GetSignedInt8(self, error, offset):
+        """GetSignedInt8(SBData self, SBError error, lldb::offset_t offset) -> int8_t"""
+        return _lldb.SBData_GetSignedInt8(self, error, offset)
+
+
+    def GetSignedInt16(self, error, offset):
+        """GetSignedInt16(SBData self, SBError error, lldb::offset_t offset) -> int16_t"""
+        return _lldb.SBData_GetSignedInt16(self, error, offset)
+
+
+    def GetSignedInt32(self, error, offset):
+        """GetSignedInt32(SBData self, SBError error, lldb::offset_t offset) -> int32_t"""
+        return _lldb.SBData_GetSignedInt32(self, error, offset)
+
+
+    def GetSignedInt64(self, error, offset):
+        """GetSignedInt64(SBData self, SBError error, lldb::offset_t offset) -> int64_t"""
+        return _lldb.SBData_GetSignedInt64(self, error, offset)
+
+
+    def GetString(self, error, offset):
+        """GetString(SBData self, SBError error, lldb::offset_t offset) -> char const *"""
+        return _lldb.SBData_GetString(self, error, offset)
+
+
+    def GetDescription(self, description, base_addr):
+        """GetDescription(SBData self, SBStream description, lldb::addr_t base_addr) -> bool"""
+        return _lldb.SBData_GetDescription(self, description, base_addr)
+
+
+    def ReadRawData(self, error, offset, buf):
+        """ReadRawData(SBData self, SBError error, lldb::offset_t offset, void * buf) -> size_t"""
+        return _lldb.SBData_ReadRawData(self, error, offset, buf)
+
+
+    def SetData(self, error, buf, endian, addr_size):
+        """SetData(SBData self, SBError error, void const * buf, lldb::ByteOrder endian, uint8_t addr_size)"""
+        return _lldb.SBData_SetData(self, error, buf, endian, addr_size)
+
+
+    def Append(self, rhs):
+        """Append(SBData self, SBData rhs) -> bool"""
+        return _lldb.SBData_Append(self, rhs)
+
+
+    def CreateDataFromCString(endian, addr_byte_size, data):
+        """CreateDataFromCString(lldb::ByteOrder endian, uint32_t addr_byte_size, char const * data) -> SBData"""
+        return _lldb.SBData_CreateDataFromCString(endian, addr_byte_size, data)
+
+    CreateDataFromCString = staticmethod(CreateDataFromCString)
+
+    def CreateDataFromUInt64Array(endian, addr_byte_size, array):
+        """CreateDataFromUInt64Array(lldb::ByteOrder endian, uint32_t addr_byte_size, uint64_t * array) -> SBData"""
+        return _lldb.SBData_CreateDataFromUInt64Array(endian, addr_byte_size, array)
+
+    CreateDataFromUInt64Array = staticmethod(CreateDataFromUInt64Array)
+
+    def CreateDataFromUInt32Array(endian, addr_byte_size, array):
+        """CreateDataFromUInt32Array(lldb::ByteOrder endian, uint32_t addr_byte_size, uint32_t * array) -> SBData"""
+        return _lldb.SBData_CreateDataFromUInt32Array(endian, addr_byte_size, array)
+
+    CreateDataFromUInt32Array = staticmethod(CreateDataFromUInt32Array)
+
+    def CreateDataFromSInt64Array(endian, addr_byte_size, array):
+        """CreateDataFromSInt64Array(lldb::ByteOrder endian, uint32_t addr_byte_size, int64_t * array) -> SBData"""
+        return _lldb.SBData_CreateDataFromSInt64Array(endian, addr_byte_size, array)
+
+    CreateDataFromSInt64Array = staticmethod(CreateDataFromSInt64Array)
+
+    def CreateDataFromSInt32Array(endian, addr_byte_size, array):
+        """CreateDataFromSInt32Array(lldb::ByteOrder endian, uint32_t addr_byte_size, int32_t * array) -> SBData"""
+        return _lldb.SBData_CreateDataFromSInt32Array(endian, addr_byte_size, array)
+
+    CreateDataFromSInt32Array = staticmethod(CreateDataFromSInt32Array)
+
+    def CreateDataFromDoubleArray(endian, addr_byte_size, array):
+        """CreateDataFromDoubleArray(lldb::ByteOrder endian, uint32_t addr_byte_size, double * array) -> SBData"""
+        return _lldb.SBData_CreateDataFromDoubleArray(endian, addr_byte_size, array)
+
+    CreateDataFromDoubleArray = staticmethod(CreateDataFromDoubleArray)
+
+    def SetDataFromCString(self, data):
+        """SetDataFromCString(SBData self, char const * data) -> bool"""
+        return _lldb.SBData_SetDataFromCString(self, data)
+
+
+    def SetDataFromUInt64Array(self, array):
+        """SetDataFromUInt64Array(SBData self, uint64_t * array) -> bool"""
+        return _lldb.SBData_SetDataFromUInt64Array(self, array)
+
+
+    def SetDataFromUInt32Array(self, array):
+        """SetDataFromUInt32Array(SBData self, uint32_t * array) -> bool"""
+        return _lldb.SBData_SetDataFromUInt32Array(self, array)
+
+
+    def SetDataFromSInt64Array(self, array):
+        """SetDataFromSInt64Array(SBData self, int64_t * array) -> bool"""
+        return _lldb.SBData_SetDataFromSInt64Array(self, array)
+
+
+    def SetDataFromSInt32Array(self, array):
+        """SetDataFromSInt32Array(SBData self, int32_t * array) -> bool"""
+        return _lldb.SBData_SetDataFromSInt32Array(self, array)
+
+
+    def SetDataFromDoubleArray(self, array):
+        """SetDataFromDoubleArray(SBData self, double * array) -> bool"""
+        return _lldb.SBData_SetDataFromDoubleArray(self, array)
+
+
+
+    class read_data_helper:
+        def __init__(self, sbdata, readerfunc, item_size):
+            self.sbdata = sbdata
+            self.readerfunc = readerfunc
+            self.item_size = item_size
+        def __getitem__(self,key):
+            if isinstance(key,slice):
+                list = []
+                for x in range(*key.indices(self.__len__())):
+                    list.append(self.__getitem__(x))
+                return list
+            if not (isinstance(key,six.integer_types)):
+                raise TypeError('must be int')
+            key = key * self.item_size # SBData uses byte-based indexes, but we want to use itemsize-based indexes here
+            error = SBError()
+            my_data = self.readerfunc(self.sbdata,error,key)
+            if error.Fail():
+                raise IndexError(error.GetCString())
+            else:
+                return my_data
+        def __len__(self):
+            return int(self.sbdata.GetByteSize()/self.item_size)
+        def all(self):
+            return self[0:len(self)]
+
+    @classmethod
+    def CreateDataFromInt (cls, value, size = None, target = None, ptr_size = None, endian = None):
+        import sys
+        lldbmodule = sys.modules[cls.__module__]
+        lldbdict = lldbmodule.__dict__
+        if 'target' in lldbdict:
+            lldbtarget = lldbdict['target']
+        else:
+            lldbtarget = None
+        if target == None and lldbtarget != None and lldbtarget.IsValid():
+            target = lldbtarget
+        if ptr_size == None:
+            if target and target.IsValid():
+                ptr_size = target.addr_size
+            else:
+                ptr_size = 8
+        if endian == None:
+            if target and target.IsValid():
+                endian = target.byte_order
+            else:
+                endian = lldbdict['eByteOrderLittle']
+        if size == None:
+            if value > 2147483647:
+                size = 8
+            elif value < -2147483648:
+                size = 8
+            elif value > 4294967295:
+                size = 8
+            else:
+                size = 4
+        if size == 4:
+            if value < 0:
+                return SBData().CreateDataFromSInt32Array(endian, ptr_size, [value])
+            return SBData().CreateDataFromUInt32Array(endian, ptr_size, [value])
+        if size == 8:
+            if value < 0:
+                return SBData().CreateDataFromSInt64Array(endian, ptr_size, [value])
+            return SBData().CreateDataFromUInt64Array(endian, ptr_size, [value])
+        return None
+
+    def _make_helper(self, sbdata, getfunc, itemsize):
+        return self.read_data_helper(sbdata, getfunc, itemsize)
+
+    def _make_helper_uint8(self):
+        return self._make_helper(self, SBData.GetUnsignedInt8, 1)
+
+    def _make_helper_uint16(self):
+        return self._make_helper(self, SBData.GetUnsignedInt16, 2)
+
+    def _make_helper_uint32(self):
+        return self._make_helper(self, SBData.GetUnsignedInt32, 4)
+
+    def _make_helper_uint64(self):
+        return self._make_helper(self, SBData.GetUnsignedInt64, 8)
+
+    def _make_helper_sint8(self):
+        return self._make_helper(self, SBData.GetSignedInt8, 1)
+
+    def _make_helper_sint16(self):
+        return self._make_helper(self, SBData.GetSignedInt16, 2)
+
+    def _make_helper_sint32(self):
+        return self._make_helper(self, SBData.GetSignedInt32, 4)
+
+    def _make_helper_sint64(self):
+        return self._make_helper(self, SBData.GetSignedInt64, 8)
+
+    def _make_helper_float(self):
+        return self._make_helper(self, SBData.GetFloat, 4)
+
+    def _make_helper_double(self):
+        return self._make_helper(self, SBData.GetDouble, 8)
+
+    def _read_all_uint8(self):
+        return self._make_helper_uint8().all()
+
+    def _read_all_uint16(self):
+        return self._make_helper_uint16().all()
+
+    def _read_all_uint32(self):
+        return self._make_helper_uint32().all()
+
+    def _read_all_uint64(self):
+        return self._make_helper_uint64().all()
+
+    def _read_all_sint8(self):
+        return self._make_helper_sint8().all()
+
+    def _read_all_sint16(self):
+        return self._make_helper_sint16().all()
+
+    def _read_all_sint32(self):
+        return self._make_helper_sint32().all()
+
+    def _read_all_sint64(self):
+        return self._make_helper_sint64().all()
+
+    def _read_all_float(self):
+        return self._make_helper_float().all()
+
+    def _read_all_double(self):
+        return self._make_helper_double().all()
+
+    uint8 = property(_make_helper_uint8, None, doc='''A read only property that returns an array-like object out of which you can read uint8 values.''')
+    uint16 = property(_make_helper_uint16, None, doc='''A read only property that returns an array-like object out of which you can read uint16 values.''')
+    uint32 = property(_make_helper_uint32, None, doc='''A read only property that returns an array-like object out of which you can read uint32 values.''')
+    uint64 = property(_make_helper_uint64, None, doc='''A read only property that returns an array-like object out of which you can read uint64 values.''')
+    sint8 = property(_make_helper_sint8, None, doc='''A read only property that returns an array-like object out of which you can read sint8 values.''')
+    sint16 = property(_make_helper_sint16, None, doc='''A read only property that returns an array-like object out of which you can read sint16 values.''')
+    sint32 = property(_make_helper_sint32, None, doc='''A read only property that returns an array-like object out of which you can read sint32 values.''')
+    sint64 = property(_make_helper_sint64, None, doc='''A read only property that returns an array-like object out of which you can read sint64 values.''')
+    float = property(_make_helper_float, None, doc='''A read only property that returns an array-like object out of which you can read float values.''')
+    double = property(_make_helper_double, None, doc='''A read only property that returns an array-like object out of which you can read double values.''')
+    uint8s = property(_read_all_uint8, None, doc='''A read only property that returns an array with all the contents of this SBData represented as uint8 values.''')
+    uint16s = property(_read_all_uint16, None, doc='''A read only property that returns an array with all the contents of this SBData represented as uint16 values.''')
+    uint32s = property(_read_all_uint32, None, doc='''A read only property that returns an array with all the contents of this SBData represented as uint32 values.''')
+    uint64s = property(_read_all_uint64, None, doc='''A read only property that returns an array with all the contents of this SBData represented as uint64 values.''')
+    sint8s = property(_read_all_sint8, None, doc='''A read only property that returns an array with all the contents of this SBData represented as sint8 values.''')
+    sint16s = property(_read_all_sint16, None, doc='''A read only property that returns an array with all the contents of this SBData represented as sint16 values.''')
+    sint32s = property(_read_all_sint32, None, doc='''A read only property that returns an array with all the contents of this SBData represented as sint32 values.''')
+    sint64s = property(_read_all_sint64, None, doc='''A read only property that returns an array with all the contents of this SBData represented as sint64 values.''')
+    floats = property(_read_all_float, None, doc='''A read only property that returns an array with all the contents of this SBData represented as float values.''')
+    doubles = property(_read_all_double, None, doc='''A read only property that returns an array with all the contents of this SBData represented as double values.''')
+    byte_order = property(GetByteOrder, SetByteOrder, doc='''A read/write property getting and setting the endianness of this SBData (data.byte_order = lldb.eByteOrderLittle).''')
+    size = property(GetByteSize, None, doc='''A read only property that returns the size the same result as GetByteSize().''')
+
+
+    def __str__(self):
+        """__str__(SBData self) -> PyObject *"""
+        return _lldb.SBData___str__(self)
+
+SBData_swigregister = _lldb.SBData_swigregister
+SBData_swigregister(SBData)
+
+def SBData_CreateDataFromCString(endian, addr_byte_size, data):
+    """SBData_CreateDataFromCString(lldb::ByteOrder endian, uint32_t addr_byte_size, char const * data) -> SBData"""
+    return _lldb.SBData_CreateDataFromCString(endian, addr_byte_size, data)
+
+def SBData_CreateDataFromUInt64Array(endian, addr_byte_size, array):
+    """SBData_CreateDataFromUInt64Array(lldb::ByteOrder endian, uint32_t addr_byte_size, uint64_t * array) -> SBData"""
+    return _lldb.SBData_CreateDataFromUInt64Array(endian, addr_byte_size, array)
+
+def SBData_CreateDataFromUInt32Array(endian, addr_byte_size, array):
+    """SBData_CreateDataFromUInt32Array(lldb::ByteOrder endian, uint32_t addr_byte_size, uint32_t * array) -> SBData"""
+    return _lldb.SBData_CreateDataFromUInt32Array(endian, addr_byte_size, array)
+
+def SBData_CreateDataFromSInt64Array(endian, addr_byte_size, array):
+    """SBData_CreateDataFromSInt64Array(lldb::ByteOrder endian, uint32_t addr_byte_size, int64_t * array) -> SBData"""
+    return _lldb.SBData_CreateDataFromSInt64Array(endian, addr_byte_size, array)
+
+def SBData_CreateDataFromSInt32Array(endian, addr_byte_size, array):
+    """SBData_CreateDataFromSInt32Array(lldb::ByteOrder endian, uint32_t addr_byte_size, int32_t * array) -> SBData"""
+    return _lldb.SBData_CreateDataFromSInt32Array(endian, addr_byte_size, array)
+
+def SBData_CreateDataFromDoubleArray(endian, addr_byte_size, array):
+    """SBData_CreateDataFromDoubleArray(lldb::ByteOrder endian, uint32_t addr_byte_size, double * array) -> SBData"""
+    return _lldb.SBData_CreateDataFromDoubleArray(endian, addr_byte_size, array)
+
+class SBDebugger(_object):
+    """
+    SBDebugger is the primordial object that creates SBTargets and provides
+    access to them.  It also manages the overall debugging experiences.
+
+    For example (from example/disasm.py),
+
+    import lldb
+    import os
+    import sys
+
+    def disassemble_instructions (insts):
+        for i in insts:
+            print i
+
+    ...
+
+    # Create a new debugger instance
+    debugger = lldb.SBDebugger.Create()
+
+    # When we step or continue, don't return from the function until the process
+    # stops. We do this by setting the async mode to false.
+    debugger.SetAsync (False)
+
+    # Create a target from a file and arch
+    print('Creating a target for '%s'' % exe)
+
+    target = debugger.CreateTargetWithFileAndArch (exe, lldb.LLDB_ARCH_DEFAULT)
+
+    if target:
+        # If the target is valid set a breakpoint at main
+        main_bp = target.BreakpointCreateByName (fname, target.GetExecutable().GetFilename());
+
+        print main_bp
+
+        # Launch the process. Since we specified synchronous mode, we won't return
+        # from this function until we hit the breakpoint at main
+        process = target.LaunchSimple (None, None, os.getcwd())
+
+        # Make sure the launch went ok
+        if process:
+            # Print some simple process info
+            state = process.GetState ()
+            print process
+            if state == lldb.eStateStopped:
+                # Get the first thread
+                thread = process.GetThreadAtIndex (0)
+                if thread:
+                    # Print some simple thread info
+                    print thread
+                    # Get the first frame
+                    frame = thread.GetFrameAtIndex (0)
+                    if frame:
+                        # Print some simple frame info
+                        print frame
+                        function = frame.GetFunction()
+                        # See if we have debug info (a function)
+                        if function:
+                            # We do have a function, print some info for the function
+                            print function
+                            # Now get all instructions for this function and print them
+                            insts = function.GetInstructions(target)
+                            disassemble_instructions (insts)
+                        else:
+                            # See if we have a symbol in the symbol table for where we stopped
+                            symbol = frame.GetSymbol();
+                            if symbol:
+                                # We do have a symbol, print some info for the symbol
+                                print symbol
+                                # Now get all instructions for this symbol and print them
+                                insts = symbol.GetInstructions(target)
+                                disassemble_instructions (insts)
+
+                        registerList = frame.GetRegisters()
+                        print('Frame registers (size of register set = %d):' % registerList.GetSize())
+                        for value in registerList:
+                            #print value
+                            print('%s (number of children = %d):' % (value.GetName(), value.GetNumChildren()))
+                            for child in value:
+                                print('Name: ', child.GetName(), ' Value: ', child.GetValue())
+
+                print('Hit the breakpoint at main, enter to continue and wait for program to exit or 'Ctrl-D'/'quit' to terminate the program')
+                next = sys.stdin.readline()
+                if not next or next.rstrip('
+    ') == 'quit':
+                    print('Terminating the inferior process...')
+                    process.Kill()
+                else:
+                    # Now continue to the program exit
+                    process.Continue()
+                    # When we return from the above function we will hopefully be at the
+                    # program exit. Print out some process info
+                    print process
+            elif state == lldb.eStateExited:
+                print('Didn't hit the breakpoint at main, program has exited...')
+            else:
+                print('Unexpected process state: %s, killing process...' % debugger.StateAsCString (state))
+                process.Kill()
+
+    Sometimes you need to create an empty target that will get filled in later.  The most common use for this
+    is to attach to a process by name or pid where you don't know the executable up front.  The most convenient way
+    to do this is:
+
+    target = debugger.CreateTarget('')
+    error = lldb.SBError()
+    process = target.AttachToProcessWithName(debugger.GetListener(), 'PROCESS_NAME', False, error)
+
+    or the equivalent arguments for AttachToProcessWithID.
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBDebugger, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBDebugger, name)
+    __repr__ = _swig_repr
+
+    def Initialize():
+        """Initialize()"""
+        return _lldb.SBDebugger_Initialize()
+
+    Initialize = staticmethod(Initialize)
+
+    def InitializeWithErrorHandling():
+        """InitializeWithErrorHandling() -> SBError"""
+        return _lldb.SBDebugger_InitializeWithErrorHandling()
+
+    InitializeWithErrorHandling = staticmethod(InitializeWithErrorHandling)
+
+    def Terminate():
+        """Terminate()"""
+        return _lldb.SBDebugger_Terminate()
+
+    Terminate = staticmethod(Terminate)
+
+    def Create(*args):
+        """
+        Create() -> SBDebugger
+        Create(bool source_init_files) -> SBDebugger
+        Create(bool source_init_files, lldb::LogOutputCallback log_callback) -> SBDebugger
+        """
+        return _lldb.SBDebugger_Create(*args)
+
+    Create = staticmethod(Create)
+
+    def Destroy(debugger):
+        """Destroy(SBDebugger debugger)"""
+        return _lldb.SBDebugger_Destroy(debugger)
+
+    Destroy = staticmethod(Destroy)
+
+    def MemoryPressureDetected():
+        """MemoryPressureDetected()"""
+        return _lldb.SBDebugger_MemoryPressureDetected()
+
+    MemoryPressureDetected = staticmethod(MemoryPressureDetected)
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBDebugger self) -> SBDebugger
+        __init__(lldb::SBDebugger self, SBDebugger rhs) -> SBDebugger
+        """
+        this = _lldb.new_SBDebugger(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBDebugger
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBDebugger self) -> bool"""
+        return _lldb.SBDebugger_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBDebugger___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def Clear(self):
+        """Clear(SBDebugger self)"""
+        return _lldb.SBDebugger_Clear(self)
+
+
+    def SetAsync(self, b):
+        """SetAsync(SBDebugger self, bool b)"""
+        return _lldb.SBDebugger_SetAsync(self, b)
+
+
+    def GetAsync(self):
+        """GetAsync(SBDebugger self) -> bool"""
+        return _lldb.SBDebugger_GetAsync(self)
+
+
+    def SkipLLDBInitFiles(self, b):
+        """SkipLLDBInitFiles(SBDebugger self, bool b)"""
+        return _lldb.SBDebugger_SkipLLDBInitFiles(self, b)
+
+
+    def SetInputFileHandle(self, f, transfer_ownership):
+        """SetInputFileHandle(SBDebugger self, FILE * f, bool transfer_ownership)"""
+        return _lldb.SBDebugger_SetInputFileHandle(self, f, transfer_ownership)
+
+
+    def SetOutputFileHandle(self, f, transfer_ownership):
+        """SetOutputFileHandle(SBDebugger self, FILE * f, bool transfer_ownership)"""
+        return _lldb.SBDebugger_SetOutputFileHandle(self, f, transfer_ownership)
+
+
+    def SetErrorFileHandle(self, f, transfer_ownership):
+        """SetErrorFileHandle(SBDebugger self, FILE * f, bool transfer_ownership)"""
+        return _lldb.SBDebugger_SetErrorFileHandle(self, f, transfer_ownership)
+
+
+    def GetInputFileHandle(self):
+        """GetInputFileHandle(SBDebugger self) -> FILE *"""
+        return _lldb.SBDebugger_GetInputFileHandle(self)
+
+
+    def GetOutputFileHandle(self):
+        """GetOutputFileHandle(SBDebugger self) -> FILE *"""
+        return _lldb.SBDebugger_GetOutputFileHandle(self)
+
+
+    def GetErrorFileHandle(self):
+        """GetErrorFileHandle(SBDebugger self) -> FILE *"""
+        return _lldb.SBDebugger_GetErrorFileHandle(self)
+
+
+    def GetCommandInterpreter(self):
+        """GetCommandInterpreter(SBDebugger self) -> SBCommandInterpreter"""
+        return _lldb.SBDebugger_GetCommandInterpreter(self)
+
+
+    def HandleCommand(self, command):
+        """HandleCommand(SBDebugger self, char const * command)"""
+        return _lldb.SBDebugger_HandleCommand(self, command)
+
+
+    def GetListener(self):
+        """GetListener(SBDebugger self) -> SBListener"""
+        return _lldb.SBDebugger_GetListener(self)
+
+
+    def HandleProcessEvent(self, process, event, out, err):
+        """HandleProcessEvent(SBDebugger self, SBProcess process, SBEvent event, FILE * out, FILE * err)"""
+        return _lldb.SBDebugger_HandleProcessEvent(self, process, event, out, err)
+
+
+    def CreateTargetWithFileAndTargetTriple(self, filename, target_triple):
+        """CreateTargetWithFileAndTargetTriple(SBDebugger self, char const * filename, char const * target_triple) -> SBTarget"""
+        return _lldb.SBDebugger_CreateTargetWithFileAndTargetTriple(self, filename, target_triple)
+
+
+    def CreateTargetWithFileAndArch(self, filename, archname):
+        """CreateTargetWithFileAndArch(SBDebugger self, char const * filename, char const * archname) -> SBTarget"""
+        return _lldb.SBDebugger_CreateTargetWithFileAndArch(self, filename, archname)
+
+
+    def CreateTarget(self, *args):
+        """
+        CreateTarget(SBDebugger self, char const * filename, char const * target_triple, char const * platform_name, bool add_dependent_modules, SBError sb_error) -> SBTarget
+        CreateTarget(SBDebugger self, char const * filename) -> SBTarget
+        """
+        return _lldb.SBDebugger_CreateTarget(self, *args)
+
+
+    def GetDummyTarget(self):
+        """
+        GetDummyTarget(SBDebugger self) -> SBTarget
+
+        The dummy target holds breakpoints and breakpoint names that will prime newly created targets.
+        """
+        return _lldb.SBDebugger_GetDummyTarget(self)
+
+
+    def DeleteTarget(self, target):
+        """
+        DeleteTarget(SBDebugger self, SBTarget target) -> bool
+
+        Return true if target is deleted from the target list of the debugger.
+        """
+        return _lldb.SBDebugger_DeleteTarget(self, target)
+
+
+    def GetTargetAtIndex(self, idx):
+        """GetTargetAtIndex(SBDebugger self, uint32_t idx) -> SBTarget"""
+        return _lldb.SBDebugger_GetTargetAtIndex(self, idx)
+
+
+    def GetIndexOfTarget(self, target):
+        """GetIndexOfTarget(SBDebugger self, SBTarget target) -> uint32_t"""
+        return _lldb.SBDebugger_GetIndexOfTarget(self, target)
+
+
+    def FindTargetWithProcessID(self, pid):
+        """FindTargetWithProcessID(SBDebugger self, lldb::pid_t pid) -> SBTarget"""
+        return _lldb.SBDebugger_FindTargetWithProcessID(self, pid)
+
+
+    def FindTargetWithFileAndArch(self, filename, arch):
+        """FindTargetWithFileAndArch(SBDebugger self, char const * filename, char const * arch) -> SBTarget"""
+        return _lldb.SBDebugger_FindTargetWithFileAndArch(self, filename, arch)
+
+
+    def GetNumTargets(self):
+        """GetNumTargets(SBDebugger self) -> uint32_t"""
+        return _lldb.SBDebugger_GetNumTargets(self)
+
+
+    def GetSelectedTarget(self):
+        """GetSelectedTarget(SBDebugger self) -> SBTarget"""
+        return _lldb.SBDebugger_GetSelectedTarget(self)
+
+
+    def SetSelectedTarget(self, target):
+        """SetSelectedTarget(SBDebugger self, SBTarget target)"""
+        return _lldb.SBDebugger_SetSelectedTarget(self, target)
+
+
+    def GetSelectedPlatform(self):
+        """GetSelectedPlatform(SBDebugger self) -> SBPlatform"""
+        return _lldb.SBDebugger_GetSelectedPlatform(self)
+
+
+    def SetSelectedPlatform(self, platform):
+        """SetSelectedPlatform(SBDebugger self, SBPlatform platform)"""
+        return _lldb.SBDebugger_SetSelectedPlatform(self, platform)
+
+
+    def GetNumPlatforms(self):
+        """
+        GetNumPlatforms(SBDebugger self) -> uint32_t
+
+        Get the number of currently active platforms.
+        """
+        return _lldb.SBDebugger_GetNumPlatforms(self)
+
+
+    def GetPlatformAtIndex(self, idx):
+        """
+        GetPlatformAtIndex(SBDebugger self, uint32_t idx) -> SBPlatform
+
+        Get one of the currently active platforms.
+        """
+        return _lldb.SBDebugger_GetPlatformAtIndex(self, idx)
+
+
+    def GetNumAvailablePlatforms(self):
+        """
+        GetNumAvailablePlatforms(SBDebugger self) -> uint32_t
+
+        Get the number of available platforms.
+        """
+        return _lldb.SBDebugger_GetNumAvailablePlatforms(self)
+
+
+    def GetAvailablePlatformInfoAtIndex(self, idx):
+        """
+        GetAvailablePlatformInfoAtIndex(SBDebugger self, uint32_t idx) -> SBStructuredData
+
+
+        Get the name and description of one of the available platforms.
+
+        @param idx Zero-based index of the platform for which info should be
+                   retrieved, must be less than the value returned by
+                   GetNumAvailablePlatforms().
+        """
+        return _lldb.SBDebugger_GetAvailablePlatformInfoAtIndex(self, idx)
+
+
+    def GetSourceManager(self):
+        """GetSourceManager(SBDebugger self) -> SBSourceManager"""
+        return _lldb.SBDebugger_GetSourceManager(self)
+
+
+    def SetCurrentPlatform(self, platform_name):
+        """SetCurrentPlatform(SBDebugger self, char const * platform_name) -> SBError"""
+        return _lldb.SBDebugger_SetCurrentPlatform(self, platform_name)
+
+
+    def SetCurrentPlatformSDKRoot(self, sysroot):
+        """SetCurrentPlatformSDKRoot(SBDebugger self, char const * sysroot) -> bool"""
+        return _lldb.SBDebugger_SetCurrentPlatformSDKRoot(self, sysroot)
+
+
+    def SetUseExternalEditor(self, input):
+        """SetUseExternalEditor(SBDebugger self, bool input) -> bool"""
+        return _lldb.SBDebugger_SetUseExternalEditor(self, input)
+
+
+    def GetUseExternalEditor(self):
+        """GetUseExternalEditor(SBDebugger self) -> bool"""
+        return _lldb.SBDebugger_GetUseExternalEditor(self)
+
+
+    def SetUseColor(self, use_color):
+        """SetUseColor(SBDebugger self, bool use_color) -> bool"""
+        return _lldb.SBDebugger_SetUseColor(self, use_color)
+
+
+    def GetUseColor(self):
+        """GetUseColor(SBDebugger self) -> bool"""
+        return _lldb.SBDebugger_GetUseColor(self)
+
+
+    def GetDefaultArchitecture(arch_name, arch_name_len):
+        """GetDefaultArchitecture(char * arch_name, size_t arch_name_len) -> bool"""
+        return _lldb.SBDebugger_GetDefaultArchitecture(arch_name, arch_name_len)
+
+    GetDefaultArchitecture = staticmethod(GetDefaultArchitecture)
+
+    def SetDefaultArchitecture(arch_name):
+        """SetDefaultArchitecture(char const * arch_name) -> bool"""
+        return _lldb.SBDebugger_SetDefaultArchitecture(arch_name)
+
+    SetDefaultArchitecture = staticmethod(SetDefaultArchitecture)
+
+    def GetScriptingLanguage(self, script_language_name):
+        """GetScriptingLanguage(SBDebugger self, char const * script_language_name) -> lldb::ScriptLanguage"""
+        return _lldb.SBDebugger_GetScriptingLanguage(self, script_language_name)
+
+
+    def GetVersionString():
+        """GetVersionString() -> char const *"""
+        return _lldb.SBDebugger_GetVersionString()
+
+    GetVersionString = staticmethod(GetVersionString)
+
+    def StateAsCString(state):
+        """StateAsCString(lldb::StateType state) -> char const *"""
+        return _lldb.SBDebugger_StateAsCString(state)
+
+    StateAsCString = staticmethod(StateAsCString)
+
+    def GetBuildConfiguration():
+        """GetBuildConfiguration() -> SBStructuredData"""
+        return _lldb.SBDebugger_GetBuildConfiguration()
+
+    GetBuildConfiguration = staticmethod(GetBuildConfiguration)
+
+    def StateIsRunningState(state):
+        """StateIsRunningState(lldb::StateType state) -> bool"""
+        return _lldb.SBDebugger_StateIsRunningState(state)
+
+    StateIsRunningState = staticmethod(StateIsRunningState)
+
+    def StateIsStoppedState(state):
+        """StateIsStoppedState(lldb::StateType state) -> bool"""
+        return _lldb.SBDebugger_StateIsStoppedState(state)
+
+    StateIsStoppedState = staticmethod(StateIsStoppedState)
+
+    def EnableLog(self, channel, types):
+        """EnableLog(SBDebugger self, char const * channel, char const ** types) -> bool"""
+        return _lldb.SBDebugger_EnableLog(self, channel, types)
+
+
+    def SetLoggingCallback(self, log_callback):
+        """SetLoggingCallback(SBDebugger self, lldb::LogOutputCallback log_callback)"""
+        return _lldb.SBDebugger_SetLoggingCallback(self, log_callback)
+
+
+    def DispatchInput(self, data):
+        """DispatchInput(SBDebugger self, void const * data)"""
+        return _lldb.SBDebugger_DispatchInput(self, data)
+
+
+    def DispatchInputInterrupt(self):
+        """DispatchInputInterrupt(SBDebugger self)"""
+        return _lldb.SBDebugger_DispatchInputInterrupt(self)
+
+
+    def DispatchInputEndOfFile(self):
+        """DispatchInputEndOfFile(SBDebugger self)"""
+        return _lldb.SBDebugger_DispatchInputEndOfFile(self)
+
+
+    def GetInstanceName(self):
+        """GetInstanceName(SBDebugger self) -> char const *"""
+        return _lldb.SBDebugger_GetInstanceName(self)
+
+
+    def FindDebuggerWithID(id):
+        """FindDebuggerWithID(int id) -> SBDebugger"""
+        return _lldb.SBDebugger_FindDebuggerWithID(id)
+
+    FindDebuggerWithID = staticmethod(FindDebuggerWithID)
+
+    def SetInternalVariable(var_name, value, debugger_instance_name):
+        """SetInternalVariable(char const * var_name, char const * value, char const * debugger_instance_name) -> SBError"""
+        return _lldb.SBDebugger_SetInternalVariable(var_name, value, debugger_instance_name)
+
+    SetInternalVariable = staticmethod(SetInternalVariable)
+
+    def GetInternalVariableValue(var_name, debugger_instance_name):
+        """GetInternalVariableValue(char const * var_name, char const * debugger_instance_name) -> SBStringList"""
+        return _lldb.SBDebugger_GetInternalVariableValue(var_name, debugger_instance_name)
+
+    GetInternalVariableValue = staticmethod(GetInternalVariableValue)
+
+    def GetDescription(self, description):
+        """GetDescription(SBDebugger self, SBStream description) -> bool"""
+        return _lldb.SBDebugger_GetDescription(self, description)
+
+
+    def GetTerminalWidth(self):
+        """GetTerminalWidth(SBDebugger self) -> uint32_t"""
+        return _lldb.SBDebugger_GetTerminalWidth(self)
+
+
+    def SetTerminalWidth(self, term_width):
+        """SetTerminalWidth(SBDebugger self, uint32_t term_width)"""
+        return _lldb.SBDebugger_SetTerminalWidth(self, term_width)
+
+
+    def GetID(self):
+        """GetID(SBDebugger self) -> lldb::user_id_t"""
+        return _lldb.SBDebugger_GetID(self)
+
+
+    def GetPrompt(self):
+        """GetPrompt(SBDebugger self) -> char const *"""
+        return _lldb.SBDebugger_GetPrompt(self)
+
+
+    def SetPrompt(self, prompt):
+        """SetPrompt(SBDebugger self, char const * prompt)"""
+        return _lldb.SBDebugger_SetPrompt(self, prompt)
+
+
+    def GetReproducerPath(self):
+        """GetReproducerPath(SBDebugger self) -> char const *"""
+        return _lldb.SBDebugger_GetReproducerPath(self)
+
+
+    def GetScriptLanguage(self):
+        """GetScriptLanguage(SBDebugger self) -> lldb::ScriptLanguage"""
+        return _lldb.SBDebugger_GetScriptLanguage(self)
+
+
+    def SetScriptLanguage(self, script_lang):
+        """SetScriptLanguage(SBDebugger self, lldb::ScriptLanguage script_lang)"""
+        return _lldb.SBDebugger_SetScriptLanguage(self, script_lang)
+
+
+    def GetCloseInputOnEOF(self):
+        """GetCloseInputOnEOF(SBDebugger self) -> bool"""
+        return _lldb.SBDebugger_GetCloseInputOnEOF(self)
+
+
+    def SetCloseInputOnEOF(self, b):
+        """SetCloseInputOnEOF(SBDebugger self, bool b)"""
+        return _lldb.SBDebugger_SetCloseInputOnEOF(self, b)
+
+
+    def GetCategory(self, *args):
+        """
+        GetCategory(SBDebugger self, char const * category_name) -> SBTypeCategory
+        GetCategory(SBDebugger self, lldb::LanguageType lang_type) -> SBTypeCategory
+        """
+        return _lldb.SBDebugger_GetCategory(self, *args)
+
+
+    def CreateCategory(self, category_name):
+        """CreateCategory(SBDebugger self, char const * category_name) -> SBTypeCategory"""
+        return _lldb.SBDebugger_CreateCategory(self, category_name)
+
+
+    def DeleteCategory(self, category_name):
+        """DeleteCategory(SBDebugger self, char const * category_name) -> bool"""
+        return _lldb.SBDebugger_DeleteCategory(self, category_name)
+
+
+    def GetNumCategories(self):
+        """GetNumCategories(SBDebugger self) -> uint32_t"""
+        return _lldb.SBDebugger_GetNumCategories(self)
+
+
+    def GetCategoryAtIndex(self, arg2):
+        """GetCategoryAtIndex(SBDebugger self, uint32_t arg2) -> SBTypeCategory"""
+        return _lldb.SBDebugger_GetCategoryAtIndex(self, arg2)
+
+
+    def GetDefaultCategory(self):
+        """GetDefaultCategory(SBDebugger self) -> SBTypeCategory"""
+        return _lldb.SBDebugger_GetDefaultCategory(self)
+
+
+    def GetFormatForType(self, arg2):
+        """GetFormatForType(SBDebugger self, SBTypeNameSpecifier arg2) -> SBTypeFormat"""
+        return _lldb.SBDebugger_GetFormatForType(self, arg2)
+
+
+    def GetSummaryForType(self, arg2):
+        """GetSummaryForType(SBDebugger self, SBTypeNameSpecifier arg2) -> SBTypeSummary"""
+        return _lldb.SBDebugger_GetSummaryForType(self, arg2)
+
+
+    def GetFilterForType(self, arg2):
+        """GetFilterForType(SBDebugger self, SBTypeNameSpecifier arg2) -> SBTypeFilter"""
+        return _lldb.SBDebugger_GetFilterForType(self, arg2)
+
+
+    def GetSyntheticForType(self, arg2):
+        """GetSyntheticForType(SBDebugger self, SBTypeNameSpecifier arg2) -> SBTypeSynthetic"""
+        return _lldb.SBDebugger_GetSyntheticForType(self, arg2)
+
+
+    def RunCommandInterpreter(self, auto_handle_events, spawn_thread, options, num_errors, quit_requested, stopped_for_crash):
+        """
+        RunCommandInterpreter(SBDebugger self, bool auto_handle_events, bool spawn_thread, SBCommandInterpreterRunOptions options, int & num_errors, bool & quit_requested, bool & stopped_for_crash)
+
+        Launch a command interpreter session. Commands are read from standard input or
+        from the input handle specified for the debugger object. Output/errors are
+        similarly redirected to standard output/error or the configured handles.
+
+        @param[in] auto_handle_events If true, automatically handle resulting events.
+        @param[in] spawn_thread If true, start a new thread for IO handling.
+        @param[in] options Parameter collection of type SBCommandInterpreterRunOptions.
+        @param[in] num_errors Initial error counter.
+        @param[in] quit_requested Initial quit request flag.
+        @param[in] stopped_for_crash Initial crash flag.
+
+        @return
+        A tuple with the number of errors encountered by the interpreter, a boolean
+        indicating whether quitting the interpreter was requested and another boolean
+        set to True in case of a crash.
+
+        Example:
+
+        # Start an interactive lldb session from a script (with a valid debugger object
+        # created beforehand):
+        n_errors, quit_requested, has_crashed = debugger.RunCommandInterpreter(True,
+            False, lldb.SBCommandInterpreterRunOptions(), 0, False, False)
+        """
+        return _lldb.SBDebugger_RunCommandInterpreter(self, auto_handle_events, spawn_thread, options, num_errors, quit_requested, stopped_for_crash)
+
+
+    def RunREPL(self, language, repl_options):
+        """RunREPL(SBDebugger self, lldb::LanguageType language, char const * repl_options) -> SBError"""
+        return _lldb.SBDebugger_RunREPL(self, language, repl_options)
+
+
+    def __iter__(self):
+        '''Iterate over all targets in a lldb.SBDebugger object.'''
+        return lldb_iter(self, 'GetNumTargets', 'GetTargetAtIndex')
+
+    def __len__(self):
+        '''Return the number of targets in a lldb.SBDebugger object.'''
+        return self.GetNumTargets()
+
+
+    def __str__(self):
+        """__str__(SBDebugger self) -> PyObject *"""
+        return _lldb.SBDebugger___str__(self)
+
+SBDebugger_swigregister = _lldb.SBDebugger_swigregister
+SBDebugger_swigregister(SBDebugger)
+
+def SBDebugger_Initialize():
+    """SBDebugger_Initialize()"""
+    return _lldb.SBDebugger_Initialize()
+
+def SBDebugger_InitializeWithErrorHandling():
+    """SBDebugger_InitializeWithErrorHandling() -> SBError"""
+    return _lldb.SBDebugger_InitializeWithErrorHandling()
+
+def SBDebugger_Terminate():
+    """SBDebugger_Terminate()"""
+    return _lldb.SBDebugger_Terminate()
+
+def SBDebugger_Create(*args):
+    """
+    Create() -> SBDebugger
+    Create(bool source_init_files) -> SBDebugger
+    SBDebugger_Create(bool source_init_files, lldb::LogOutputCallback log_callback) -> SBDebugger
+    """
+    return _lldb.SBDebugger_Create(*args)
+
+def SBDebugger_Destroy(debugger):
+    """SBDebugger_Destroy(SBDebugger debugger)"""
+    return _lldb.SBDebugger_Destroy(debugger)
+
+def SBDebugger_MemoryPressureDetected():
+    """SBDebugger_MemoryPressureDetected()"""
+    return _lldb.SBDebugger_MemoryPressureDetected()
+
+def SBDebugger_GetDefaultArchitecture(arch_name, arch_name_len):
+    """SBDebugger_GetDefaultArchitecture(char * arch_name, size_t arch_name_len) -> bool"""
+    return _lldb.SBDebugger_GetDefaultArchitecture(arch_name, arch_name_len)
+
+def SBDebugger_SetDefaultArchitecture(arch_name):
+    """SBDebugger_SetDefaultArchitecture(char const * arch_name) -> bool"""
+    return _lldb.SBDebugger_SetDefaultArchitecture(arch_name)
+
+def SBDebugger_GetVersionString():
+    """SBDebugger_GetVersionString() -> char const *"""
+    return _lldb.SBDebugger_GetVersionString()
+
+def SBDebugger_StateAsCString(state):
+    """SBDebugger_StateAsCString(lldb::StateType state) -> char const *"""
+    return _lldb.SBDebugger_StateAsCString(state)
+
+def SBDebugger_GetBuildConfiguration():
+    """SBDebugger_GetBuildConfiguration() -> SBStructuredData"""
+    return _lldb.SBDebugger_GetBuildConfiguration()
+
+def SBDebugger_StateIsRunningState(state):
+    """SBDebugger_StateIsRunningState(lldb::StateType state) -> bool"""
+    return _lldb.SBDebugger_StateIsRunningState(state)
+
+def SBDebugger_StateIsStoppedState(state):
+    """SBDebugger_StateIsStoppedState(lldb::StateType state) -> bool"""
+    return _lldb.SBDebugger_StateIsStoppedState(state)
+
+def SBDebugger_FindDebuggerWithID(id):
+    """SBDebugger_FindDebuggerWithID(int id) -> SBDebugger"""
+    return _lldb.SBDebugger_FindDebuggerWithID(id)
+
+def SBDebugger_SetInternalVariable(var_name, value, debugger_instance_name):
+    """SBDebugger_SetInternalVariable(char const * var_name, char const * value, char const * debugger_instance_name) -> SBError"""
+    return _lldb.SBDebugger_SetInternalVariable(var_name, value, debugger_instance_name)
+
+def SBDebugger_GetInternalVariableValue(var_name, debugger_instance_name):
+    """SBDebugger_GetInternalVariableValue(char const * var_name, char const * debugger_instance_name) -> SBStringList"""
+    return _lldb.SBDebugger_GetInternalVariableValue(var_name, debugger_instance_name)
+
+class SBDeclaration(_object):
+    """Specifies an association with a line and column for a variable."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBDeclaration, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBDeclaration, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBDeclaration self) -> SBDeclaration
+        __init__(lldb::SBDeclaration self, SBDeclaration rhs) -> SBDeclaration
+        """
+        this = _lldb.new_SBDeclaration(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBDeclaration
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBDeclaration self) -> bool"""
+        return _lldb.SBDeclaration_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBDeclaration___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetFileSpec(self):
+        """GetFileSpec(SBDeclaration self) -> SBFileSpec"""
+        return _lldb.SBDeclaration_GetFileSpec(self)
+
+
+    def GetLine(self):
+        """GetLine(SBDeclaration self) -> uint32_t"""
+        return _lldb.SBDeclaration_GetLine(self)
+
+
+    def GetColumn(self):
+        """GetColumn(SBDeclaration self) -> uint32_t"""
+        return _lldb.SBDeclaration_GetColumn(self)
+
+
+    def GetDescription(self, description):
+        """GetDescription(SBDeclaration self, SBStream description) -> bool"""
+        return _lldb.SBDeclaration_GetDescription(self, description)
+
+
+    def SetFileSpec(self, filespec):
+        """SetFileSpec(SBDeclaration self, SBFileSpec filespec)"""
+        return _lldb.SBDeclaration_SetFileSpec(self, filespec)
+
+
+    def SetLine(self, line):
+        """SetLine(SBDeclaration self, uint32_t line)"""
+        return _lldb.SBDeclaration_SetLine(self, line)
+
+
+    def SetColumn(self, column):
+        """SetColumn(SBDeclaration self, uint32_t column)"""
+        return _lldb.SBDeclaration_SetColumn(self, column)
+
+
+    def __eq__(self, rhs):
+        """__eq__(SBDeclaration self, SBDeclaration rhs) -> bool"""
+        return _lldb.SBDeclaration___eq__(self, rhs)
+
+
+    def __ne__(self, rhs):
+        """__ne__(SBDeclaration self, SBDeclaration rhs) -> bool"""
+        return _lldb.SBDeclaration___ne__(self, rhs)
+
+
+    file = property(GetFileSpec, None, doc='''A read only property that returns an lldb object that represents the file (lldb.SBFileSpec) for this line entry.''')
+    line = property(GetLine, None, doc='''A read only property that returns the 1 based line number for this line entry, a return value of zero indicates that no line information is available.''')
+    column = property(GetColumn, None, doc='''A read only property that returns the 1 based column number for this line entry, a return value of zero indicates that no column information is available.''')
+
+
+    def __str__(self):
+        """__str__(SBDeclaration self) -> PyObject *"""
+        return _lldb.SBDeclaration___str__(self)
+
+
+    def __eq__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return False 
+
+        return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
+
+    def __ne__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return True 
+
+        return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
+
+SBDeclaration_swigregister = _lldb.SBDeclaration_swigregister
+SBDeclaration_swigregister(SBDeclaration)
+
+class SBError(_object):
+    """
+    Represents a container for holding any error code.
+
+    For example (from test/python_api/hello_world/TestHelloWorld.py),
+
+        def hello_world_attach_with_id_api(self):
+            '''Create target, spawn a process, and attach to it by id.'''
+
+            target = self.dbg.CreateTarget(self.exe)
+
+            # Spawn a new process and don't display the stdout if not in TraceOn() mode.
+            import subprocess
+            popen = subprocess.Popen([self.exe, 'abc', 'xyz'],
+                                     stdout = open(os.devnull, 'w') if not self.TraceOn() else None)
+
+            listener = lldb.SBListener('my.attach.listener')
+            error = lldb.SBError()
+            process = target.AttachToProcessWithID(listener, popen.pid, error)
+
+            self.assertTrue(error.Success() and process, PROCESS_IS_VALID)
+
+            # Let's check the stack traces of the attached process.
+            import lldbutil
+            stacktraces = lldbutil.print_stacktraces(process, string_buffer=True)
+            self.expect(stacktraces, exe=False,
+                substrs = ['main.c:%d' % self.line2,
+                           '(int)argc=3'])
+
+            listener = lldb.SBListener('my.attach.listener')
+            error = lldb.SBError()
+            process = target.AttachToProcessWithID(listener, popen.pid, error)
+
+            self.assertTrue(error.Success() and process, PROCESS_IS_VALID)
+
+    checks that after the attach, there is no error condition by asserting
+    that error.Success() is True and we get back a valid process object.
+
+    And (from test/python_api/event/TestEvent.py),
+
+            # Now launch the process, and do not stop at entry point.
+            error = lldb.SBError()
+            process = target.Launch(listener, None, None, None, None, None, None, 0, False, error)
+            self.assertTrue(error.Success() and process, PROCESS_IS_VALID)
+
+    checks that after calling the target.Launch() method there's no error
+    condition and we get back a void process object.
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBError, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBError, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBError self) -> SBError
+        __init__(lldb::SBError self, SBError rhs) -> SBError
+        """
+        this = _lldb.new_SBError(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBError
+    __del__ = lambda self: None
+
+    def GetCString(self):
+        """GetCString(SBError self) -> char const *"""
+        return _lldb.SBError_GetCString(self)
+
+
+    def Clear(self):
+        """Clear(SBError self)"""
+        return _lldb.SBError_Clear(self)
+
+
+    def Fail(self):
+        """Fail(SBError self) -> bool"""
+        return _lldb.SBError_Fail(self)
+
+
+    def Success(self):
+        """Success(SBError self) -> bool"""
+        return _lldb.SBError_Success(self)
+
+
+    def GetError(self):
+        """GetError(SBError self) -> uint32_t"""
+        return _lldb.SBError_GetError(self)
+
+
+    def GetType(self):
+        """GetType(SBError self) -> lldb::ErrorType"""
+        return _lldb.SBError_GetType(self)
+
+
+    def SetError(self, err, type):
+        """SetError(SBError self, uint32_t err, lldb::ErrorType type)"""
+        return _lldb.SBError_SetError(self, err, type)
+
+
+    def SetErrorToErrno(self):
+        """SetErrorToErrno(SBError self)"""
+        return _lldb.SBError_SetErrorToErrno(self)
+
+
+    def SetErrorToGenericError(self):
+        """SetErrorToGenericError(SBError self)"""
+        return _lldb.SBError_SetErrorToGenericError(self)
+
+
+    def SetErrorString(self, err_str):
+        """SetErrorString(SBError self, char const * err_str)"""
+        return _lldb.SBError_SetErrorString(self, err_str)
+
+
+    def SetErrorStringWithFormat(self, format, str1=None, str2=None, str3=None):
+        """
+        SetErrorStringWithFormat(SBError self, char const * format, char * str1=None, char * str2=None, char * str3=None) -> int
+        SetErrorStringWithFormat(SBError self, char const * format, char * str1=None, char * str2=None) -> int
+        SetErrorStringWithFormat(SBError self, char const * format, char * str1=None) -> int
+        SetErrorStringWithFormat(SBError self, char const * format) -> int
+        """
+        return _lldb.SBError_SetErrorStringWithFormat(self, format, str1, str2, str3)
+
+
+    def IsValid(self):
+        """IsValid(SBError self) -> bool"""
+        return _lldb.SBError_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBError___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetDescription(self, description):
+        """GetDescription(SBError self, SBStream description) -> bool"""
+        return _lldb.SBError_GetDescription(self, description)
+
+
+    value = property(GetError, None, doc='''A read only property that returns the same result as GetError().''')
+    fail = property(Fail, None, doc='''A read only property that returns the same result as Fail().''')
+    success = property(Success, None, doc='''A read only property that returns the same result as Success().''')
+    description = property(GetCString, None, doc='''A read only property that returns the same result as GetCString().''')
+    type = property(GetType, None, doc='''A read only property that returns the same result as GetType().''')
+
+
+    def __str__(self):
+        """__str__(SBError self) -> PyObject *"""
+        return _lldb.SBError___str__(self)
+
+SBError_swigregister = _lldb.SBError_swigregister
+SBError_swigregister(SBError)
+
+class SBEvent(_object):
+    """
+    API clients can register to receive events.
+
+    For example, check out the following output:
+
+    Try wait for event...
+    Event description: 0x103d0bb70 Event: broadcaster = 0x1009c8410, type = 0x00000001, data = { process = 0x1009c8400 (pid = 21528), state = running}
+    Event data flavor: Process::ProcessEventData
+    Process state: running
+
+    Try wait for event...
+    Event description: 0x103a700a0 Event: broadcaster = 0x1009c8410, type = 0x00000001, data = { process = 0x1009c8400 (pid = 21528), state = stopped}
+    Event data flavor: Process::ProcessEventData
+    Process state: stopped
+
+    Try wait for event...
+    Event description: 0x103d0d4a0 Event: broadcaster = 0x1009c8410, type = 0x00000001, data = { process = 0x1009c8400 (pid = 21528), state = exited}
+    Event data flavor: Process::ProcessEventData
+    Process state: exited
+
+    Try wait for event...
+    timeout occurred waiting for event...
+
+    from test/python_api/event/TestEventspy:
+
+        def do_listen_for_and_print_event(self):
+            '''Create a listener and use SBEvent API to print the events received.'''
+            exe = os.path.join(os.getcwd(), 'a.out')
+
+            # Create a target by the debugger.
+            target = self.dbg.CreateTarget(exe)
+            self.assertTrue(target, VALID_TARGET)
+
+            # Now create a breakpoint on main.c by name 'c'.
+            breakpoint = target.BreakpointCreateByName('c', 'a.out')
+
+            # Now launch the process, and do not stop at the entry point.
+            process = target.LaunchSimple(None, None, os.getcwd())
+            self.assertTrue(process.GetState() == lldb.eStateStopped,
+                            PROCESS_STOPPED)
+
+            # Get a handle on the process's broadcaster.
+            broadcaster = process.GetBroadcaster()
+
+            # Create an empty event object.
+            event = lldb.SBEvent()
+
+            # Create a listener object and register with the broadcaster.
+            listener = lldb.SBListener('my listener')
+            rc = broadcaster.AddListener(listener, lldb.SBProcess.eBroadcastBitStateChanged)
+            self.assertTrue(rc, 'AddListener successfully retruns')
+
+            traceOn = self.TraceOn()
+            if traceOn:
+                lldbutil.print_stacktraces(process)
+
+            # Create MyListeningThread class to wait for any kind of event.
+            import threading
+            class MyListeningThread(threading.Thread):
+                def run(self):
+                    count = 0
+                    # Let's only try at most 4 times to retrieve any kind of event.
+                    # After that, the thread exits.
+                    while not count > 3:
+                        if traceOn:
+                            print('Try wait for event...')
+                        if listener.WaitForEventForBroadcasterWithType(5,
+                                                                       broadcaster,
+                                                                       lldb.SBProcess.eBroadcastBitStateChanged,
+                                                                       event):
+                            if traceOn:
+                                desc = lldbutil.get_description(event))
+                                print('Event description:', desc)
+                                print('Event data flavor:', event.GetDataFlavor())
+                                print('Process state:', lldbutil.state_type_to_str(process.GetState()))
+                                print()
+                        else:
+                            if traceOn:
+                                print 'timeout occurred waiting for event...'
+                        count = count + 1
+                    return
+
+            # Let's start the listening thread to retrieve the events.
+            my_thread = MyListeningThread()
+            my_thread.start()
+
+            # Use Python API to continue the process.  The listening thread should be
+            # able to receive the state changed events.
+            process.Continue()
+
+            # Use Python API to kill the process.  The listening thread should be
+            # able to receive the state changed event, too.
+            process.Kill()
+
+            # Wait until the 'MyListeningThread' terminates.
+            my_thread.join()
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBEvent, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBEvent, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBEvent self) -> SBEvent
+        __init__(lldb::SBEvent self, SBEvent rhs) -> SBEvent
+        __init__(self, int type, str data) -> SBEvent (make an event that contains a C string)
+        """
+        this = _lldb.new_SBEvent(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBEvent
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBEvent self) -> bool"""
+        return _lldb.SBEvent_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBEvent___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetDataFlavor(self):
+        """GetDataFlavor(SBEvent self) -> char const *"""
+        return _lldb.SBEvent_GetDataFlavor(self)
+
+
+    def GetType(self):
+        """GetType(SBEvent self) -> uint32_t"""
+        return _lldb.SBEvent_GetType(self)
+
+
+    def GetBroadcaster(self):
+        """GetBroadcaster(SBEvent self) -> SBBroadcaster"""
+        return _lldb.SBEvent_GetBroadcaster(self)
+
+
+    def GetBroadcasterClass(self):
+        """GetBroadcasterClass(SBEvent self) -> char const *"""
+        return _lldb.SBEvent_GetBroadcasterClass(self)
+
+
+    def BroadcasterMatchesRef(self, broadcaster):
+        """BroadcasterMatchesRef(SBEvent self, SBBroadcaster broadcaster) -> bool"""
+        return _lldb.SBEvent_BroadcasterMatchesRef(self, broadcaster)
+
+
+    def Clear(self):
+        """Clear(SBEvent self)"""
+        return _lldb.SBEvent_Clear(self)
+
+
+    def GetCStringFromEvent(event):
+        """GetCStringFromEvent(SBEvent event) -> char const *"""
+        return _lldb.SBEvent_GetCStringFromEvent(event)
+
+    GetCStringFromEvent = staticmethod(GetCStringFromEvent)
+
+    def GetDescription(self, description):
+        """GetDescription(SBEvent self, SBStream description) -> bool"""
+        return _lldb.SBEvent_GetDescription(self, description)
+
+SBEvent_swigregister = _lldb.SBEvent_swigregister
+SBEvent_swigregister(SBEvent)
+
+def SBEvent_GetCStringFromEvent(event):
+    """SBEvent_GetCStringFromEvent(SBEvent event) -> char const *"""
+    return _lldb.SBEvent_GetCStringFromEvent(event)
+
+class SBExecutionContext(_object):
+    """Proxy of C++ lldb::SBExecutionContext class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBExecutionContext, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBExecutionContext, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBExecutionContext self) -> SBExecutionContext
+        __init__(lldb::SBExecutionContext self, SBExecutionContext rhs) -> SBExecutionContext
+        __init__(lldb::SBExecutionContext self, SBTarget target) -> SBExecutionContext
+        __init__(lldb::SBExecutionContext self, SBProcess process) -> SBExecutionContext
+        __init__(lldb::SBExecutionContext self, SBThread thread) -> SBExecutionContext
+        __init__(lldb::SBExecutionContext self, SBFrame frame) -> SBExecutionContext
+        """
+        this = _lldb.new_SBExecutionContext(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBExecutionContext
+    __del__ = lambda self: None
+
+    def GetTarget(self):
+        """GetTarget(SBExecutionContext self) -> SBTarget"""
+        return _lldb.SBExecutionContext_GetTarget(self)
+
+
+    def GetProcess(self):
+        """GetProcess(SBExecutionContext self) -> SBProcess"""
+        return _lldb.SBExecutionContext_GetProcess(self)
+
+
+    def GetThread(self):
+        """GetThread(SBExecutionContext self) -> SBThread"""
+        return _lldb.SBExecutionContext_GetThread(self)
+
+
+    def GetFrame(self):
+        """GetFrame(SBExecutionContext self) -> SBFrame"""
+        return _lldb.SBExecutionContext_GetFrame(self)
+
+
+    target = property(GetTarget, None, doc='''A read only property that returns the same result as GetTarget().''')
+    process = property(GetProcess, None, doc='''A read only property that returns the same result as GetProcess().''')
+    thread = property(GetThread, None, doc='''A read only property that returns the same result as GetThread().''')
+    frame = property(GetFrame, None, doc='''A read only property that returns the same result as GetFrame().''')
+
+SBExecutionContext_swigregister = _lldb.SBExecutionContext_swigregister
+SBExecutionContext_swigregister(SBExecutionContext)
+
+class SBExpressionOptions(_object):
+    """A container for options to use when evaluating expressions."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBExpressionOptions, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBExpressionOptions, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBExpressionOptions self) -> SBExpressionOptions
+        __init__(lldb::SBExpressionOptions self, SBExpressionOptions rhs) -> SBExpressionOptions
+        """
+        this = _lldb.new_SBExpressionOptions(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBExpressionOptions
+    __del__ = lambda self: None
+
+    def GetCoerceResultToId(self):
+        """GetCoerceResultToId(SBExpressionOptions self) -> bool"""
+        return _lldb.SBExpressionOptions_GetCoerceResultToId(self)
+
+
+    def SetCoerceResultToId(self, coerce=True):
+        """
+        SetCoerceResultToId(SBExpressionOptions self, bool coerce=True)
+        SetCoerceResultToId(SBExpressionOptions self)
+
+        Sets whether to coerce the expression result to ObjC id type after evaluation.
+        """
+        return _lldb.SBExpressionOptions_SetCoerceResultToId(self, coerce)
+
+
+    def GetUnwindOnError(self):
+        """GetUnwindOnError(SBExpressionOptions self) -> bool"""
+        return _lldb.SBExpressionOptions_GetUnwindOnError(self)
+
+
+    def SetUnwindOnError(self, unwind=True):
+        """
+        SetUnwindOnError(SBExpressionOptions self, bool unwind=True)
+        SetUnwindOnError(SBExpressionOptions self)
+
+        Sets whether to unwind the expression stack on error.
+        """
+        return _lldb.SBExpressionOptions_SetUnwindOnError(self, unwind)
+
+
+    def GetIgnoreBreakpoints(self):
+        """GetIgnoreBreakpoints(SBExpressionOptions self) -> bool"""
+        return _lldb.SBExpressionOptions_GetIgnoreBreakpoints(self)
+
+
+    def SetIgnoreBreakpoints(self, ignore=True):
+        """
+        SetIgnoreBreakpoints(SBExpressionOptions self, bool ignore=True)
+        SetIgnoreBreakpoints(SBExpressionOptions self)
+        """
+        return _lldb.SBExpressionOptions_SetIgnoreBreakpoints(self, ignore)
+
+
+    def GetFetchDynamicValue(self):
+        """GetFetchDynamicValue(SBExpressionOptions self) -> lldb::DynamicValueType"""
+        return _lldb.SBExpressionOptions_GetFetchDynamicValue(self)
+
+
+    def SetFetchDynamicValue(self, *args):
+        """
+        SetFetchDynamicValue(SBExpressionOptions self, lldb::DynamicValueType dynamic)
+        SetFetchDynamicValue(SBExpressionOptions self)
+
+        Sets whether to cast the expression result to its dynamic type.
+        """
+        return _lldb.SBExpressionOptions_SetFetchDynamicValue(self, *args)
+
+
+    def GetTimeoutInMicroSeconds(self):
+        """GetTimeoutInMicroSeconds(SBExpressionOptions self) -> uint32_t"""
+        return _lldb.SBExpressionOptions_GetTimeoutInMicroSeconds(self)
+
+
+    def SetTimeoutInMicroSeconds(self, timeout=0):
+        """
+        SetTimeoutInMicroSeconds(SBExpressionOptions self, uint32_t timeout=0)
+        SetTimeoutInMicroSeconds(SBExpressionOptions self)
+
+        Sets the timeout in microseconds to run the expression for. If try all threads is set to true and the expression doesn't complete within the specified timeout, all threads will be resumed for the same timeout to see if the expresson will finish.
+        """
+        return _lldb.SBExpressionOptions_SetTimeoutInMicroSeconds(self, timeout)
+
+
+    def GetOneThreadTimeoutInMicroSeconds(self):
+        """GetOneThreadTimeoutInMicroSeconds(SBExpressionOptions self) -> uint32_t"""
+        return _lldb.SBExpressionOptions_GetOneThreadTimeoutInMicroSeconds(self)
+
+
+    def SetOneThreadTimeoutInMicroSeconds(self, timeout=0):
+        """
+        SetOneThreadTimeoutInMicroSeconds(SBExpressionOptions self, uint32_t timeout=0)
+        SetOneThreadTimeoutInMicroSeconds(SBExpressionOptions self)
+        """
+        return _lldb.SBExpressionOptions_SetOneThreadTimeoutInMicroSeconds(self, timeout)
+
+
+    def GetTryAllThreads(self):
+        """GetTryAllThreads(SBExpressionOptions self) -> bool"""
+        return _lldb.SBExpressionOptions_GetTryAllThreads(self)
+
+
+    def SetTryAllThreads(self, run_others=True):
+        """
+        SetTryAllThreads(SBExpressionOptions self, bool run_others=True)
+        SetTryAllThreads(SBExpressionOptions self)
+
+        Sets whether to run all threads if the expression does not complete on one thread.
+        """
+        return _lldb.SBExpressionOptions_SetTryAllThreads(self, run_others)
+
+
+    def GetStopOthers(self):
+        """GetStopOthers(SBExpressionOptions self) -> bool"""
+        return _lldb.SBExpressionOptions_GetStopOthers(self)
+
+
+    def SetStopOthers(self, stop_others=True):
+        """
+        SetStopOthers(SBExpressionOptions self, bool stop_others=True)
+        SetStopOthers(SBExpressionOptions self)
+        """
+        return _lldb.SBExpressionOptions_SetStopOthers(self, stop_others)
+
+
+    def GetTrapExceptions(self):
+        """GetTrapExceptions(SBExpressionOptions self) -> bool"""
+        return _lldb.SBExpressionOptions_GetTrapExceptions(self)
+
+
+    def SetTrapExceptions(self, trap_exceptions=True):
+        """
+        SetTrapExceptions(SBExpressionOptions self, bool trap_exceptions=True)
+        SetTrapExceptions(SBExpressionOptions self)
+        """
+        return _lldb.SBExpressionOptions_SetTrapExceptions(self, trap_exceptions)
+
+
+    def SetLanguage(self, language):
+        """
+        SetLanguage(SBExpressionOptions self, lldb::LanguageType language)
+
+        Sets the language that LLDB should assume the expression is written in
+        """
+        return _lldb.SBExpressionOptions_SetLanguage(self, language)
+
+
+    def GetGenerateDebugInfo(self):
+        """GetGenerateDebugInfo(SBExpressionOptions self) -> bool"""
+        return _lldb.SBExpressionOptions_GetGenerateDebugInfo(self)
+
+
+    def SetGenerateDebugInfo(self, b=True):
+        """
+        SetGenerateDebugInfo(SBExpressionOptions self, bool b=True)
+        SetGenerateDebugInfo(SBExpressionOptions self)
+
+        Sets whether to generate debug information for the expression and also controls if a SBModule is generated.
+        """
+        return _lldb.SBExpressionOptions_SetGenerateDebugInfo(self, b)
+
+
+    def GetSuppressPersistentResult(self):
+        """GetSuppressPersistentResult(SBExpressionOptions self) -> bool"""
+        return _lldb.SBExpressionOptions_GetSuppressPersistentResult(self)
+
+
+    def SetSuppressPersistentResult(self, b=False):
+        """
+        SetSuppressPersistentResult(SBExpressionOptions self, bool b=False)
+        SetSuppressPersistentResult(SBExpressionOptions self)
+
+        Sets whether to produce a persistent result that can be used in future expressions.
+        """
+        return _lldb.SBExpressionOptions_SetSuppressPersistentResult(self, b)
+
+
+    def GetPrefix(self):
+        """
+        GetPrefix(SBExpressionOptions self) -> char const *
+
+        Gets the prefix to use for this expression.
+        """
+        return _lldb.SBExpressionOptions_GetPrefix(self)
+
+
+    def SetPrefix(self, prefix):
+        """
+        SetPrefix(SBExpressionOptions self, char const * prefix)
+
+        Sets the prefix to use for this expression. This prefix gets inserted after the 'target.expr-prefix' prefix contents, but before the wrapped expression function body.
+        """
+        return _lldb.SBExpressionOptions_SetPrefix(self, prefix)
+
+
+    def SetAutoApplyFixIts(self, b=True):
+        """
+        SetAutoApplyFixIts(SBExpressionOptions self, bool b=True)
+        SetAutoApplyFixIts(SBExpressionOptions self)
+
+        Sets whether to auto-apply fix-it hints to the expression being evaluated.
+        """
+        return _lldb.SBExpressionOptions_SetAutoApplyFixIts(self, b)
+
+
+    def GetAutoApplyFixIts(self):
+        """
+        GetAutoApplyFixIts(SBExpressionOptions self) -> bool
+
+        Gets whether to auto-apply fix-it hints to an expression.
+        """
+        return _lldb.SBExpressionOptions_GetAutoApplyFixIts(self)
+
+
+    def GetTopLevel(self):
+        """GetTopLevel(SBExpressionOptions self) -> bool"""
+        return _lldb.SBExpressionOptions_GetTopLevel(self)
+
+
+    def SetTopLevel(self, b=True):
+        """
+        SetTopLevel(SBExpressionOptions self, bool b=True)
+        SetTopLevel(SBExpressionOptions self)
+        """
+        return _lldb.SBExpressionOptions_SetTopLevel(self, b)
+
+
+    def GetAllowJIT(self):
+        """
+        GetAllowJIT(SBExpressionOptions self) -> bool
+
+        Gets whether to JIT an expression if it cannot be interpreted.
+        """
+        return _lldb.SBExpressionOptions_GetAllowJIT(self)
+
+
+    def SetAllowJIT(self, allow):
+        """
+        SetAllowJIT(SBExpressionOptions self, bool allow)
+
+        Sets whether to JIT an expression if it cannot be interpreted.
+        """
+        return _lldb.SBExpressionOptions_SetAllowJIT(self, allow)
+
+SBExpressionOptions_swigregister = _lldb.SBExpressionOptions_swigregister
+SBExpressionOptions_swigregister(SBExpressionOptions)
+
+class SBFileSpec(_object):
+    """
+    Represents a file specification that divides the path into a directory and
+    basename.  The string values of the paths are put into uniqued string pools
+    for fast comparisons and efficient memory usage.
+
+    For example, the following code
+
+            lineEntry = context.GetLineEntry()
+            self.expect(lineEntry.GetFileSpec().GetDirectory(), 'The line entry should have the correct directory',
+                        exe=False,
+                substrs = [self.mydir])
+            self.expect(lineEntry.GetFileSpec().GetFilename(), 'The line entry should have the correct filename',
+                        exe=False,
+                substrs = ['main.c'])
+            self.assertTrue(lineEntry.GetLine() == self.line,
+                            'The line entry's line number should match ')
+
+    gets the line entry from the symbol context when a thread is stopped.
+    It gets the file spec corresponding to the line entry and checks that
+    the filename and the directory matches what we expect.
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBFileSpec, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBFileSpec, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBFileSpec self) -> SBFileSpec
+        __init__(lldb::SBFileSpec self, SBFileSpec rhs) -> SBFileSpec
+        __init__(lldb::SBFileSpec self, char const * path) -> SBFileSpec
+        __init__(lldb::SBFileSpec self, char const * path, bool resolve) -> SBFileSpec
+        """
+        this = _lldb.new_SBFileSpec(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBFileSpec
+    __del__ = lambda self: None
+
+    def __eq__(self, rhs):
+        """__eq__(SBFileSpec self, SBFileSpec rhs) -> bool"""
+        return _lldb.SBFileSpec___eq__(self, rhs)
+
+
+    def __ne__(self, rhs):
+        """__ne__(SBFileSpec self, SBFileSpec rhs) -> bool"""
+        return _lldb.SBFileSpec___ne__(self, rhs)
+
+
+    def IsValid(self):
+        """IsValid(SBFileSpec self) -> bool"""
+        return _lldb.SBFileSpec_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBFileSpec___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def Exists(self):
+        """Exists(SBFileSpec self) -> bool"""
+        return _lldb.SBFileSpec_Exists(self)
+
+
+    def ResolveExecutableLocation(self):
+        """ResolveExecutableLocation(SBFileSpec self) -> bool"""
+        return _lldb.SBFileSpec_ResolveExecutableLocation(self)
+
+
+    def GetFilename(self):
+        """GetFilename(SBFileSpec self) -> char const *"""
+        return _lldb.SBFileSpec_GetFilename(self)
+
+
+    def GetDirectory(self):
+        """GetDirectory(SBFileSpec self) -> char const *"""
+        return _lldb.SBFileSpec_GetDirectory(self)
+
+
+    def SetFilename(self, filename):
+        """SetFilename(SBFileSpec self, char const * filename)"""
+        return _lldb.SBFileSpec_SetFilename(self, filename)
+
+
+    def SetDirectory(self, directory):
+        """SetDirectory(SBFileSpec self, char const * directory)"""
+        return _lldb.SBFileSpec_SetDirectory(self, directory)
+
+
+    def GetPath(self, dst_path, dst_len):
+        """GetPath(SBFileSpec self, char * dst_path, size_t dst_len) -> uint32_t"""
+        return _lldb.SBFileSpec_GetPath(self, dst_path, dst_len)
+
+
+    def ResolvePath(src_path, dst_path, dst_len):
+        """ResolvePath(char const * src_path, char * dst_path, size_t dst_len) -> int"""
+        return _lldb.SBFileSpec_ResolvePath(src_path, dst_path, dst_len)
+
+    ResolvePath = staticmethod(ResolvePath)
+
+    def GetDescription(self, description):
+        """GetDescription(SBFileSpec self, SBStream description) -> bool"""
+        return _lldb.SBFileSpec_GetDescription(self, description)
+
+
+    def AppendPathComponent(self, file_or_directory):
+        """AppendPathComponent(SBFileSpec self, char const * file_or_directory)"""
+        return _lldb.SBFileSpec_AppendPathComponent(self, file_or_directory)
+
+
+    def __get_fullpath__(self):
+        spec_dir = self.GetDirectory()
+        spec_file = self.GetFilename()
+        if spec_dir and spec_file:
+            return '%s/%s' % (spec_dir, spec_file)
+        elif spec_dir:
+            return spec_dir
+        elif spec_file:
+            return spec_file
+        return None
+
+    fullpath = property(__get_fullpath__, None, doc='''A read only property that returns the fullpath as a python string.''')
+    basename = property(GetFilename, None, doc='''A read only property that returns the path basename as a python string.''')
+    dirname = property(GetDirectory, None, doc='''A read only property that returns the path directory name as a python string.''')
+    exists = property(Exists, None, doc='''A read only property that returns a boolean value that indicates if the file exists.''')
+
+
+    def __str__(self):
+        """__str__(SBFileSpec self) -> PyObject *"""
+        return _lldb.SBFileSpec___str__(self)
+
+SBFileSpec_swigregister = _lldb.SBFileSpec_swigregister
+SBFileSpec_swigregister(SBFileSpec)
+
+def SBFileSpec_ResolvePath(src_path, dst_path, dst_len):
+    """SBFileSpec_ResolvePath(char const * src_path, char * dst_path, size_t dst_len) -> int"""
+    return _lldb.SBFileSpec_ResolvePath(src_path, dst_path, dst_len)
+
+class SBFileSpecList(_object):
+    """Proxy of C++ lldb::SBFileSpecList class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBFileSpecList, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBFileSpecList, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBFileSpecList self) -> SBFileSpecList
+        __init__(lldb::SBFileSpecList self, SBFileSpecList rhs) -> SBFileSpecList
+        """
+        this = _lldb.new_SBFileSpecList(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBFileSpecList
+    __del__ = lambda self: None
+
+    def GetSize(self):
+        """GetSize(SBFileSpecList self) -> uint32_t"""
+        return _lldb.SBFileSpecList_GetSize(self)
+
+
+    def GetDescription(self, description):
+        """GetDescription(SBFileSpecList self, SBStream description) -> bool"""
+        return _lldb.SBFileSpecList_GetDescription(self, description)
+
+
+    def Append(self, sb_file):
+        """Append(SBFileSpecList self, SBFileSpec sb_file)"""
+        return _lldb.SBFileSpecList_Append(self, sb_file)
+
+
+    def AppendIfUnique(self, sb_file):
+        """AppendIfUnique(SBFileSpecList self, SBFileSpec sb_file) -> bool"""
+        return _lldb.SBFileSpecList_AppendIfUnique(self, sb_file)
+
+
+    def Clear(self):
+        """Clear(SBFileSpecList self)"""
+        return _lldb.SBFileSpecList_Clear(self)
+
+
+    def FindFileIndex(self, idx, sb_file, full):
+        """FindFileIndex(SBFileSpecList self, uint32_t idx, SBFileSpec sb_file, bool full) -> uint32_t"""
+        return _lldb.SBFileSpecList_FindFileIndex(self, idx, sb_file, full)
+
+
+    def GetFileSpecAtIndex(self, idx):
+        """GetFileSpecAtIndex(SBFileSpecList self, uint32_t idx) -> SBFileSpec"""
+        return _lldb.SBFileSpecList_GetFileSpecAtIndex(self, idx)
+
+SBFileSpecList_swigregister = _lldb.SBFileSpecList_swigregister
+SBFileSpecList_swigregister(SBFileSpecList)
+
+class SBFrame(_object):
+    """
+    Represents one of the stack frames associated with a thread.
+    SBThread contains SBFrame(s). For example (from test/lldbutil.py),
+
+    def print_stacktrace(thread, string_buffer = False):
+        '''Prints a simple stack trace of this thread.'''
+
+        ...
+
+        for i in range(depth):
+            frame = thread.GetFrameAtIndex(i)
+            function = frame.GetFunction()
+
+            load_addr = addrs[i].GetLoadAddress(target)
+            if not function:
+                file_addr = addrs[i].GetFileAddress()
+                start_addr = frame.GetSymbol().GetStartAddress().GetFileAddress()
+                symbol_offset = file_addr - start_addr
+                print >> output, '  frame #{num}: {addr:#016x} {mod}`{symbol} + {offset}'.format(
+                    num=i, addr=load_addr, mod=mods[i], symbol=symbols[i], offset=symbol_offset)
+            else:
+                print >> output, '  frame #{num}: {addr:#016x} {mod}`{func} at {file}:{line} {args}'.format(
+                    num=i, addr=load_addr, mod=mods[i],
+                    func='%s [inlined]' % funcs[i] if frame.IsInlined() else funcs[i],
+                    file=files[i], line=lines[i],
+                    args=get_args_as_string(frame, showFuncName=False) if not frame.IsInlined() else '()')
+
+        ...
+
+    And,
+
+        for frame in thread:
+            print frame
+
+    See also SBThread.
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBFrame, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBFrame, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBFrame self) -> SBFrame
+        __init__(lldb::SBFrame self, SBFrame rhs) -> SBFrame
+        """
+        this = _lldb.new_SBFrame(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBFrame
+    __del__ = lambda self: None
+
+    def IsEqual(self, rhs):
+        """IsEqual(SBFrame self, SBFrame rhs) -> bool"""
+        return _lldb.SBFrame_IsEqual(self, rhs)
+
+
+    def IsValid(self):
+        """IsValid(SBFrame self) -> bool"""
+        return _lldb.SBFrame_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBFrame___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetFrameID(self):
+        """GetFrameID(SBFrame self) -> uint32_t"""
+        return _lldb.SBFrame_GetFrameID(self)
+
+
+    def GetCFA(self):
+        """
+        GetCFA(SBFrame self) -> lldb::addr_t
+
+
+        Get the Canonical Frame Address for this stack frame.
+        This is the DWARF standard's definition of a CFA, a stack address
+        that remains constant throughout the lifetime of the function.
+        Returns an lldb::addr_t stack address, or LLDB_INVALID_ADDRESS if
+        the CFA cannot be determined.
+        """
+        return _lldb.SBFrame_GetCFA(self)
+
+
+    def GetPC(self):
+        """GetPC(SBFrame self) -> lldb::addr_t"""
+        return _lldb.SBFrame_GetPC(self)
+
+
+    def SetPC(self, new_pc):
+        """SetPC(SBFrame self, lldb::addr_t new_pc) -> bool"""
+        return _lldb.SBFrame_SetPC(self, new_pc)
+
+
+    def GetSP(self):
+        """GetSP(SBFrame self) -> lldb::addr_t"""
+        return _lldb.SBFrame_GetSP(self)
+
+
+    def GetFP(self):
+        """GetFP(SBFrame self) -> lldb::addr_t"""
+        return _lldb.SBFrame_GetFP(self)
+
+
+    def GetPCAddress(self):
+        """GetPCAddress(SBFrame self) -> SBAddress"""
+        return _lldb.SBFrame_GetPCAddress(self)
+
+
+    def GetSymbolContext(self, resolve_scope):
+        """GetSymbolContext(SBFrame self, uint32_t resolve_scope) -> SBSymbolContext"""
+        return _lldb.SBFrame_GetSymbolContext(self, resolve_scope)
+
+
+    def GetModule(self):
+        """GetModule(SBFrame self) -> SBModule"""
+        return _lldb.SBFrame_GetModule(self)
+
+
+    def GetCompileUnit(self):
+        """GetCompileUnit(SBFrame self) -> SBCompileUnit"""
+        return _lldb.SBFrame_GetCompileUnit(self)
+
+
+    def GetFunction(self):
+        """GetFunction(SBFrame self) -> SBFunction"""
+        return _lldb.SBFrame_GetFunction(self)
+
+
+    def GetSymbol(self):
+        """GetSymbol(SBFrame self) -> SBSymbol"""
+        return _lldb.SBFrame_GetSymbol(self)
+
+
+    def GetBlock(self):
+        """
+        GetBlock(SBFrame self) -> SBBlock
+
+
+        Gets the deepest block that contains the frame PC.
+
+        See also GetFrameBlock().
+        """
+        return _lldb.SBFrame_GetBlock(self)
+
+
+    def GetDisplayFunctionName(self):
+        """GetDisplayFunctionName(SBFrame self) -> char const *"""
+        return _lldb.SBFrame_GetDisplayFunctionName(self)
+
+
+    def GetFunctionName(self, *args):
+        """
+        GetFunctionName(SBFrame self) -> char const
+        GetFunctionName(SBFrame self) -> char const *
+
+
+        Get the appropriate function name for this frame. Inlined functions in
+        LLDB are represented by Blocks that have inlined function information, so
+        just looking at the SBFunction or SBSymbol for a frame isn't enough.
+        This function will return the appropriate function, symbol or inlined
+        function name for the frame.
+
+        This function returns:
+        - the name of the inlined function (if there is one)
+        - the name of the concrete function (if there is one)
+        - the name of the symbol (if there is one)
+        - NULL
+
+        See also IsInlined().
+        """
+        return _lldb.SBFrame_GetFunctionName(self, *args)
+
+
+    def GuessLanguage(self):
+        """
+        GuessLanguage(SBFrame self) -> lldb::LanguageType
+
+
+        Returns the language of the frame's SBFunction, or if there.
+        is no SBFunction, guess the language from the mangled name.
+        .
+        """
+        return _lldb.SBFrame_GuessLanguage(self)
+
+
+    def IsInlined(self, *args):
+        """
+        IsInlined(SBFrame self) -> bool
+        IsInlined(SBFrame self) -> bool
+
+
+        Return true if this frame represents an inlined function.
+
+        See also GetFunctionName().
+        """
+        return _lldb.SBFrame_IsInlined(self, *args)
+
+
+    def IsArtificial(self, *args):
+        """
+        IsArtificial(SBFrame self) -> bool
+        IsArtificial(SBFrame self) -> bool
+
+
+        Return true if this frame is artificial (e.g a frame synthesized to
+        capture a tail call). Local variables may not be available in an artificial
+        frame.
+        """
+        return _lldb.SBFrame_IsArtificial(self, *args)
+
+
+    def EvaluateExpression(self, *args):
+        """
+        EvaluateExpression(SBFrame self, char const * expr) -> SBValue
+        EvaluateExpression(SBFrame self, char const * expr, lldb::DynamicValueType use_dynamic) -> SBValue
+        EvaluateExpression(SBFrame self, char const * expr, lldb::DynamicValueType use_dynamic, bool unwind_on_error) -> SBValue
+        EvaluateExpression(SBFrame self, char const * expr, SBExpressionOptions options) -> SBValue
+
+
+        The version that doesn't supply a 'use_dynamic' value will use the
+        target's default.
+        """
+        return _lldb.SBFrame_EvaluateExpression(self, *args)
+
+
+    def GetFrameBlock(self):
+        """
+        GetFrameBlock(SBFrame self) -> SBBlock
+
+
+        Gets the lexical block that defines the stack frame. Another way to think
+        of this is it will return the block that contains all of the variables
+        for a stack frame. Inlined functions are represented as SBBlock objects
+        that have inlined function information: the name of the inlined function,
+        where it was called from. The block that is returned will be the first
+        block at or above the block for the PC (SBFrame::GetBlock()) that defines
+        the scope of the frame. When a function contains no inlined functions,
+        this will be the top most lexical block that defines the function.
+        When a function has inlined functions and the PC is currently
+        in one of those inlined functions, this method will return the inlined
+        block that defines this frame. If the PC isn't currently in an inlined
+        function, the lexical block that defines the function is returned.
+        """
+        return _lldb.SBFrame_GetFrameBlock(self)
+
+
+    def GetLineEntry(self):
+        """GetLineEntry(SBFrame self) -> SBLineEntry"""
+        return _lldb.SBFrame_GetLineEntry(self)
+
+
+    def GetThread(self):
+        """GetThread(SBFrame self) -> SBThread"""
+        return _lldb.SBFrame_GetThread(self)
+
+
+    def Disassemble(self):
+        """Disassemble(SBFrame self) -> char const *"""
+        return _lldb.SBFrame_Disassemble(self)
+
+
+    def Clear(self):
+        """Clear(SBFrame self)"""
+        return _lldb.SBFrame_Clear(self)
+
+
+    def __eq__(self, rhs):
+        """__eq__(SBFrame self, SBFrame rhs) -> bool"""
+        return _lldb.SBFrame___eq__(self, rhs)
+
+
+    def __ne__(self, rhs):
+        """__ne__(SBFrame self, SBFrame rhs) -> bool"""
+        return _lldb.SBFrame___ne__(self, rhs)
+
+
+    def GetVariables(self, *args):
+        """
+        GetVariables(SBFrame self, bool arguments, bool locals, bool statics, bool in_scope_only) -> SBValueList
+        GetVariables(SBFrame self, bool arguments, bool locals, bool statics, bool in_scope_only, lldb::DynamicValueType use_dynamic) -> SBValueList
+        GetVariables(SBFrame self, SBVariablesOptions options) -> SBValueList
+
+
+        The version that doesn't supply a 'use_dynamic' value will use the
+        target's default.
+        """
+        return _lldb.SBFrame_GetVariables(self, *args)
+
+
+    def GetRegisters(self):
+        """GetRegisters(SBFrame self) -> SBValueList"""
+        return _lldb.SBFrame_GetRegisters(self)
+
+
+    def FindVariable(self, *args):
+        """
+        FindVariable(SBFrame self, char const * var_name) -> SBValue
+        FindVariable(SBFrame self, char const * var_name, lldb::DynamicValueType use_dynamic) -> SBValue
+
+
+        The version that doesn't supply a 'use_dynamic' value will use the
+        target's default.
+        """
+        return _lldb.SBFrame_FindVariable(self, *args)
+
+
+    def FindRegister(self, name):
+        """FindRegister(SBFrame self, char const * name) -> SBValue"""
+        return _lldb.SBFrame_FindRegister(self, name)
+
+
+    def GetValueForVariablePath(self, *args):
+        """
+        GetValueForVariablePath(SBFrame self, char const * var_path) -> SBValue
+        GetValueForVariablePath(SBFrame self, char const * var_path, lldb::DynamicValueType use_dynamic) -> SBValue
+
+
+        Get a lldb.SBValue for a variable path.
+
+        Variable paths can include access to pointer or instance members:
+            rect_ptr->origin.y
+            pt.x
+        Pointer dereferences:
+            *this->foo_ptr
+            **argv
+        Address of:
+            &pt
+            &my_array[3].x
+        Array accesses and treating pointers as arrays:
+            int_array[1]
+            pt_ptr[22].x
+
+        Unlike EvaluateExpression() which returns lldb.SBValue objects
+        with constant copies of the values at the time of evaluation,
+        the result of this function is a value that will continue to
+        track the current value of the value as execution progresses
+        in the current frame.
+        """
+        return _lldb.SBFrame_GetValueForVariablePath(self, *args)
+
+
+    def FindValue(self, *args):
+        """
+        FindValue(SBFrame self, char const * name, lldb::ValueType value_type) -> SBValue
+        FindValue(SBFrame self, char const * name, lldb::ValueType value_type, lldb::DynamicValueType use_dynamic) -> SBValue
+
+
+        Find variables, register sets, registers, or persistent variables using
+        the frame as the scope.
+
+        The version that doesn't supply a 'use_dynamic' value will use the
+        target's default.
+        """
+        return _lldb.SBFrame_FindValue(self, *args)
+
+
+    def GetDescription(self, description):
+        """GetDescription(SBFrame self, SBStream description) -> bool"""
+        return _lldb.SBFrame_GetDescription(self, description)
+
+
+    def get_all_variables(self):
+        return self.GetVariables(True,True,True,True)
+
+    def get_parent_frame(self):
+        parent_idx = self.idx + 1
+        if parent_idx >= 0 and parent_idx < len(self.thread.frame):
+            return self.thread.frame[parent_idx]
+        else:
+            return SBFrame()
+
+    def get_arguments(self):
+        return self.GetVariables(True,False,False,False)
+
+    def get_locals(self):
+        return self.GetVariables(False,True,False,False)
+
+    def get_statics(self):
+        return self.GetVariables(False,False,True,False)
+
+    def var(self, var_expr_path):
+        '''Calls through to lldb.SBFrame.GetValueForVariablePath() and returns
+        a value that represents the variable expression path'''
+        return self.GetValueForVariablePath(var_expr_path)
+
+    def get_registers_access(self):
+        class registers_access(object):
+            '''A helper object that exposes a flattened view of registers, masking away the notion of register sets for easy scripting.'''
+            def __init__(self, regs):
+                self.regs = regs
+
+            def __getitem__(self, key):
+                if type(key) is str:
+                    for i in range(0,len(self.regs)):
+                        rs = self.regs[i]
+                        for j in range (0,rs.num_children):
+                            reg = rs.GetChildAtIndex(j)
+                            if reg.name == key: return reg
+                else:
+                    return lldb.SBValue()
+
+        return registers_access(self.registers)
+
+    pc = property(GetPC, SetPC)
+    addr = property(GetPCAddress, None, doc='''A read only property that returns the program counter (PC) as a section offset address (lldb.SBAddress).''')
+    fp = property(GetFP, None, doc='''A read only property that returns the frame pointer (FP) as an unsigned integer.''')
+    sp = property(GetSP, None, doc='''A read only property that returns the stack pointer (SP) as an unsigned integer.''')
+    module = property(GetModule, None, doc='''A read only property that returns an lldb object that represents the module (lldb.SBModule) for this stack frame.''')
+    compile_unit = property(GetCompileUnit, None, doc='''A read only property that returns an lldb object that represents the compile unit (lldb.SBCompileUnit) for this stack frame.''')
+    function = property(GetFunction, None, doc='''A read only property that returns an lldb object that represents the function (lldb.SBFunction) for this stack frame.''')
+    symbol = property(GetSymbol, None, doc='''A read only property that returns an lldb object that represents the symbol (lldb.SBSymbol) for this stack frame.''')
+    block = property(GetBlock, None, doc='''A read only property that returns an lldb object that represents the block (lldb.SBBlock) for this stack frame.''')
+    is_inlined = property(IsInlined, None, doc='''A read only property that returns an boolean that indicates if the block frame is an inlined function.''')
+    name = property(GetFunctionName, None, doc='''A read only property that retuns the name for the function that this frame represents. Inlined stack frame might have a concrete function that differs from the name of the inlined function (a named lldb.SBBlock).''')
+    line_entry = property(GetLineEntry, None, doc='''A read only property that returns an lldb object that represents the line table entry (lldb.SBLineEntry) for this stack frame.''')
+    thread = property(GetThread, None, doc='''A read only property that returns an lldb object that represents the thread (lldb.SBThread) for this stack frame.''')
+    disassembly = property(Disassemble, None, doc='''A read only property that returns the disassembly for this stack frame as a python string.''')
+    idx = property(GetFrameID, None, doc='''A read only property that returns the zero based stack frame index.''')
+    variables = property(get_all_variables, None, doc='''A read only property that returns a list() that contains a collection of lldb.SBValue objects that represent the variables in this stack frame.''')
+    vars = property(get_all_variables, None, doc='''A read only property that returns a list() that contains a collection of lldb.SBValue objects that represent the variables in this stack frame.''')
+    locals = property(get_locals, None, doc='''A read only property that returns a list() that contains a collection of lldb.SBValue objects that represent the local variables in this stack frame.''')
+    args = property(get_arguments, None, doc='''A read only property that returns a list() that contains a collection of lldb.SBValue objects that represent the argument variables in this stack frame.''')
+    arguments = property(get_arguments, None, doc='''A read only property that returns a list() that contains a collection of lldb.SBValue objects that represent the argument variables in this stack frame.''')
+    statics = property(get_statics, None, doc='''A read only property that returns a list() that contains a collection of lldb.SBValue objects that represent the static variables in this stack frame.''')
+    registers = property(GetRegisters, None, doc='''A read only property that returns a list() that contains a collection of lldb.SBValue objects that represent the CPU registers for this stack frame.''')
+    regs = property(GetRegisters, None, doc='''A read only property that returns a list() that contains a collection of lldb.SBValue objects that represent the CPU registers for this stack frame.''')
+    register = property(get_registers_access, None, doc='''A read only property that returns an helper object providing a flattened indexable view of the CPU registers for this stack frame.''')
+    reg = property(get_registers_access, None, doc='''A read only property that returns an helper object providing a flattened indexable view of the CPU registers for this stack frame''')
+    parent = property(get_parent_frame, None, doc='''A read only property that returns the parent (caller) frame of the current frame.''')
+
+
+    def __str__(self):
+        """__str__(SBFrame self) -> PyObject *"""
+        return _lldb.SBFrame___str__(self)
+
+SBFrame_swigregister = _lldb.SBFrame_swigregister
+SBFrame_swigregister(SBFrame)
+
+class SBFunction(_object):
+    """
+    Represents a generic function, which can be inlined or not.
+
+    For example (from test/lldbutil.py, but slightly modified for doc purpose),
+
+            ...
+
+            frame = thread.GetFrameAtIndex(i)
+            addr = frame.GetPCAddress()
+            load_addr = addr.GetLoadAddress(target)
+            function = frame.GetFunction()
+            mod_name = frame.GetModule().GetFileSpec().GetFilename()
+
+            if not function:
+                # No debug info for 'function'.
+                symbol = frame.GetSymbol()
+                file_addr = addr.GetFileAddress()
+                start_addr = symbol.GetStartAddress().GetFileAddress()
+                symbol_name = symbol.GetName()
+                symbol_offset = file_addr - start_addr
+                print >> output, '  frame #{num}: {addr:#016x} {mod}`{symbol} + {offset}'.format(
+                    num=i, addr=load_addr, mod=mod_name, symbol=symbol_name, offset=symbol_offset)
+            else:
+                # Debug info is available for 'function'.
+                func_name = frame.GetFunctionName()
+                file_name = frame.GetLineEntry().GetFileSpec().GetFilename()
+                line_num = frame.GetLineEntry().GetLine()
+                print >> output, '  frame #{num}: {addr:#016x} {mod}`{func} at {file}:{line} {args}'.format(
+                    num=i, addr=load_addr, mod=mod_name,
+                    func='%s [inlined]' % func_name] if frame.IsInlined() else func_name,
+                    file=file_name, line=line_num, args=get_args_as_string(frame, showFuncName=False))
+
+            ...
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBFunction, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBFunction, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBFunction self) -> SBFunction
+        __init__(lldb::SBFunction self, SBFunction rhs) -> SBFunction
+        """
+        this = _lldb.new_SBFunction(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBFunction
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBFunction self) -> bool"""
+        return _lldb.SBFunction_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBFunction___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetName(self):
+        """GetName(SBFunction self) -> char const *"""
+        return _lldb.SBFunction_GetName(self)
+
+
+    def GetDisplayName(self):
+        """GetDisplayName(SBFunction self) -> char const *"""
+        return _lldb.SBFunction_GetDisplayName(self)
+
+
+    def GetMangledName(self):
+        """GetMangledName(SBFunction self) -> char const *"""
+        return _lldb.SBFunction_GetMangledName(self)
+
+
+    def GetInstructions(self, *args):
+        """
+        GetInstructions(SBFunction self, SBTarget target) -> SBInstructionList
+        GetInstructions(SBFunction self, SBTarget target, char const * flavor) -> SBInstructionList
+        """
+        return _lldb.SBFunction_GetInstructions(self, *args)
+
+
+    def GetStartAddress(self):
+        """GetStartAddress(SBFunction self) -> SBAddress"""
+        return _lldb.SBFunction_GetStartAddress(self)
+
+
+    def GetEndAddress(self):
+        """GetEndAddress(SBFunction self) -> SBAddress"""
+        return _lldb.SBFunction_GetEndAddress(self)
+
+
+    def GetArgumentName(self, arg_idx):
+        """GetArgumentName(SBFunction self, uint32_t arg_idx) -> char const *"""
+        return _lldb.SBFunction_GetArgumentName(self, arg_idx)
+
+
+    def GetPrologueByteSize(self):
+        """GetPrologueByteSize(SBFunction self) -> uint32_t"""
+        return _lldb.SBFunction_GetPrologueByteSize(self)
+
+
+    def GetType(self):
+        """GetType(SBFunction self) -> SBType"""
+        return _lldb.SBFunction_GetType(self)
+
+
+    def GetBlock(self):
+        """GetBlock(SBFunction self) -> SBBlock"""
+        return _lldb.SBFunction_GetBlock(self)
+
+
+    def GetLanguage(self):
+        """GetLanguage(SBFunction self) -> lldb::LanguageType"""
+        return _lldb.SBFunction_GetLanguage(self)
+
+
+    def GetIsOptimized(self):
+        """
+        GetIsOptimized(SBFunction self) -> bool
+
+
+        Returns true if the function was compiled with optimization.
+        Optimization, in this case, is meant to indicate that the debugger
+        experience may be confusing for the user -- variables optimized away,
+        stepping jumping between source lines -- and the driver may want to
+        provide some guidance to the user about this.
+        Returns false if unoptimized, or unknown.
+        """
+        return _lldb.SBFunction_GetIsOptimized(self)
+
+
+    def GetDescription(self, description):
+        """GetDescription(SBFunction self, SBStream description) -> bool"""
+        return _lldb.SBFunction_GetDescription(self, description)
+
+
+    def __eq__(self, rhs):
+        """__eq__(SBFunction self, SBFunction rhs) -> bool"""
+        return _lldb.SBFunction___eq__(self, rhs)
+
+
+    def __ne__(self, rhs):
+        """__ne__(SBFunction self, SBFunction rhs) -> bool"""
+        return _lldb.SBFunction___ne__(self, rhs)
+
+
+    def get_instructions_from_current_target (self):
+        return self.GetInstructions (target)
+
+    addr = property(GetStartAddress, None, doc='''A read only property that returns an lldb object that represents the start address (lldb.SBAddress) for this function.''')
+    end_addr = property(GetEndAddress, None, doc='''A read only property that returns an lldb object that represents the end address (lldb.SBAddress) for this function.''')
+    block = property(GetBlock, None, doc='''A read only property that returns an lldb object that represents the top level lexical block (lldb.SBBlock) for this function.''')
+    instructions = property(get_instructions_from_current_target, None, doc='''A read only property that returns an lldb object that represents the instructions (lldb.SBInstructionList) for this function.''')
+    mangled = property(GetMangledName, None, doc='''A read only property that returns the mangled (linkage) name for this function as a string.''')
+    name = property(GetName, None, doc='''A read only property that returns the name for this function as a string.''')
+    prologue_size = property(GetPrologueByteSize, None, doc='''A read only property that returns the size in bytes of the prologue instructions as an unsigned integer.''')
+    type = property(GetType, None, doc='''A read only property that returns an lldb object that represents the return type (lldb.SBType) for this function.''')
+
+
+    def __str__(self):
+        """__str__(SBFunction self) -> PyObject *"""
+        return _lldb.SBFunction___str__(self)
+
+
+    def __eq__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return False 
+
+        return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
+
+    def __ne__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return True 
+
+        return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
+
+SBFunction_swigregister = _lldb.SBFunction_swigregister
+SBFunction_swigregister(SBFunction)
+
+class SBHostOS(_object):
+    """Proxy of C++ lldb::SBHostOS class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBHostOS, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBHostOS, name)
+    __repr__ = _swig_repr
+
+    def GetProgramFileSpec():
+        """GetProgramFileSpec() -> SBFileSpec"""
+        return _lldb.SBHostOS_GetProgramFileSpec()
+
+    GetProgramFileSpec = staticmethod(GetProgramFileSpec)
+
+    def GetLLDBPythonPath():
+        """GetLLDBPythonPath() -> SBFileSpec"""
+        return _lldb.SBHostOS_GetLLDBPythonPath()
+
+    GetLLDBPythonPath = staticmethod(GetLLDBPythonPath)
+
+    def GetLLDBPath(path_type):
+        """GetLLDBPath(lldb::PathType path_type) -> SBFileSpec"""
+        return _lldb.SBHostOS_GetLLDBPath(path_type)
+
+    GetLLDBPath = staticmethod(GetLLDBPath)
+
+    def GetUserHomeDirectory():
+        """GetUserHomeDirectory() -> SBFileSpec"""
+        return _lldb.SBHostOS_GetUserHomeDirectory()
+
+    GetUserHomeDirectory = staticmethod(GetUserHomeDirectory)
+
+    def ThreadCreated(name):
+        """ThreadCreated(char const * name)"""
+        return _lldb.SBHostOS_ThreadCreated(name)
+
+    ThreadCreated = staticmethod(ThreadCreated)
+
+    def ThreadCreate(name, arg2, thread_arg, err):
+        """ThreadCreate(char const * name, lldb::thread_func_t arg2, void * thread_arg, SBError err) -> lldb::thread_t"""
+        return _lldb.SBHostOS_ThreadCreate(name, arg2, thread_arg, err)
+
+    ThreadCreate = staticmethod(ThreadCreate)
+
+    def ThreadCancel(thread, err):
+        """ThreadCancel(lldb::thread_t thread, SBError err) -> bool"""
+        return _lldb.SBHostOS_ThreadCancel(thread, err)
+
+    ThreadCancel = staticmethod(ThreadCancel)
+
+    def ThreadDetach(thread, err):
+        """ThreadDetach(lldb::thread_t thread, SBError err) -> bool"""
+        return _lldb.SBHostOS_ThreadDetach(thread, err)
+
+    ThreadDetach = staticmethod(ThreadDetach)
+
+    def ThreadJoin(thread, result, err):
+        """ThreadJoin(lldb::thread_t thread, lldb::thread_result_t * result, SBError err) -> bool"""
+        return _lldb.SBHostOS_ThreadJoin(thread, result, err)
+
+    ThreadJoin = staticmethod(ThreadJoin)
+
+    def __init__(self):
+        """__init__(lldb::SBHostOS self) -> SBHostOS"""
+        this = _lldb.new_SBHostOS()
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBHostOS
+    __del__ = lambda self: None
+SBHostOS_swigregister = _lldb.SBHostOS_swigregister
+SBHostOS_swigregister(SBHostOS)
+
+def SBHostOS_GetProgramFileSpec():
+    """SBHostOS_GetProgramFileSpec() -> SBFileSpec"""
+    return _lldb.SBHostOS_GetProgramFileSpec()
+
+def SBHostOS_GetLLDBPythonPath():
+    """SBHostOS_GetLLDBPythonPath() -> SBFileSpec"""
+    return _lldb.SBHostOS_GetLLDBPythonPath()
+
+def SBHostOS_GetLLDBPath(path_type):
+    """SBHostOS_GetLLDBPath(lldb::PathType path_type) -> SBFileSpec"""
+    return _lldb.SBHostOS_GetLLDBPath(path_type)
+
+def SBHostOS_GetUserHomeDirectory():
+    """SBHostOS_GetUserHomeDirectory() -> SBFileSpec"""
+    return _lldb.SBHostOS_GetUserHomeDirectory()
+
+def SBHostOS_ThreadCreated(name):
+    """SBHostOS_ThreadCreated(char const * name)"""
+    return _lldb.SBHostOS_ThreadCreated(name)
+
+def SBHostOS_ThreadCreate(name, arg3, thread_arg, err):
+    """SBHostOS_ThreadCreate(char const * name, lldb::thread_func_t arg3, void * thread_arg, SBError err) -> lldb::thread_t"""
+    return _lldb.SBHostOS_ThreadCreate(name, arg3, thread_arg, err)
+
+def SBHostOS_ThreadCancel(thread, err):
+    """SBHostOS_ThreadCancel(lldb::thread_t thread, SBError err) -> bool"""
+    return _lldb.SBHostOS_ThreadCancel(thread, err)
+
+def SBHostOS_ThreadDetach(thread, err):
+    """SBHostOS_ThreadDetach(lldb::thread_t thread, SBError err) -> bool"""
+    return _lldb.SBHostOS_ThreadDetach(thread, err)
+
+def SBHostOS_ThreadJoin(thread, result, err):
+    """SBHostOS_ThreadJoin(lldb::thread_t thread, lldb::thread_result_t * result, SBError err) -> bool"""
+    return _lldb.SBHostOS_ThreadJoin(thread, result, err)
+
+class SBInstruction(_object):
+    """Proxy of C++ lldb::SBInstruction class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBInstruction, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBInstruction, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBInstruction self) -> SBInstruction
+        __init__(lldb::SBInstruction self, SBInstruction rhs) -> SBInstruction
+        """
+        this = _lldb.new_SBInstruction(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBInstruction
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBInstruction self) -> bool"""
+        return _lldb.SBInstruction_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBInstruction___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetAddress(self):
+        """GetAddress(SBInstruction self) -> SBAddress"""
+        return _lldb.SBInstruction_GetAddress(self)
+
+
+    def GetMnemonic(self, target):
+        """GetMnemonic(SBInstruction self, SBTarget target) -> char const *"""
+        return _lldb.SBInstruction_GetMnemonic(self, target)
+
+
+    def GetOperands(self, target):
+        """GetOperands(SBInstruction self, SBTarget target) -> char const *"""
+        return _lldb.SBInstruction_GetOperands(self, target)
+
+
+    def GetComment(self, target):
+        """GetComment(SBInstruction self, SBTarget target) -> char const *"""
+        return _lldb.SBInstruction_GetComment(self, target)
+
+
+    def GetData(self, target):
+        """GetData(SBInstruction self, SBTarget target) -> SBData"""
+        return _lldb.SBInstruction_GetData(self, target)
+
+
+    def GetByteSize(self):
+        """GetByteSize(SBInstruction self) -> size_t"""
+        return _lldb.SBInstruction_GetByteSize(self)
+
+
+    def DoesBranch(self):
+        """DoesBranch(SBInstruction self) -> bool"""
+        return _lldb.SBInstruction_DoesBranch(self)
+
+
+    def HasDelaySlot(self):
+        """HasDelaySlot(SBInstruction self) -> bool"""
+        return _lldb.SBInstruction_HasDelaySlot(self)
+
+
+    def CanSetBreakpoint(self):
+        """CanSetBreakpoint(SBInstruction self) -> bool"""
+        return _lldb.SBInstruction_CanSetBreakpoint(self)
+
+
+    def Print(self, out):
+        """Print(SBInstruction self, FILE * out)"""
+        return _lldb.SBInstruction_Print(self, out)
+
+
+    def GetDescription(self, description):
+        """GetDescription(SBInstruction self, SBStream description) -> bool"""
+        return _lldb.SBInstruction_GetDescription(self, description)
+
+
+    def EmulateWithFrame(self, frame, evaluate_options):
+        """EmulateWithFrame(SBInstruction self, SBFrame frame, uint32_t evaluate_options) -> bool"""
+        return _lldb.SBInstruction_EmulateWithFrame(self, frame, evaluate_options)
+
+
+    def DumpEmulation(self, triple):
+        """DumpEmulation(SBInstruction self, char const * triple) -> bool"""
+        return _lldb.SBInstruction_DumpEmulation(self, triple)
+
+
+    def TestEmulation(self, output_stream, test_file):
+        """TestEmulation(SBInstruction self, SBStream output_stream, char const * test_file) -> bool"""
+        return _lldb.SBInstruction_TestEmulation(self, output_stream, test_file)
+
+
+    def __mnemonic_property__ (self):
+        return self.GetMnemonic (target)
+    def __operands_property__ (self):
+        return self.GetOperands (target)
+    def __comment_property__ (self):
+        return self.GetComment (target)
+    def __file_addr_property__ (self):
+        return self.GetAddress ().GetFileAddress()
+    def __load_adrr_property__ (self):
+        return self.GetComment (target)
+
+    mnemonic = property(__mnemonic_property__, None, doc='''A read only property that returns the mnemonic for this instruction as a string.''')
+    operands = property(__operands_property__, None, doc='''A read only property that returns the operands for this instruction as a string.''')
+    comment = property(__comment_property__, None, doc='''A read only property that returns the comment for this instruction as a string.''')
+    addr = property(GetAddress, None, doc='''A read only property that returns an lldb object that represents the address (lldb.SBAddress) for this instruction.''')
+    size = property(GetByteSize, None, doc='''A read only property that returns the size in bytes for this instruction as an integer.''')
+    is_branch = property(DoesBranch, None, doc='''A read only property that returns a boolean value that indicates if this instruction is a branch instruction.''')
+
+
+    def __str__(self):
+        """__str__(SBInstruction self) -> PyObject *"""
+        return _lldb.SBInstruction___str__(self)
+
+SBInstruction_swigregister = _lldb.SBInstruction_swigregister
+SBInstruction_swigregister(SBInstruction)
+
+class SBInstructionList(_object):
+    """
+    Represents a list of machine instructions.  SBFunction and SBSymbol have
+    GetInstructions() methods which return SBInstructionList instances.
+
+    SBInstructionList supports instruction (SBInstruction instance) iteration.
+    For example (see also SBDebugger for a more complete example),
+
+    def disassemble_instructions (insts):
+        for i in insts:
+            print i
+
+    defines a function which takes an SBInstructionList instance and prints out
+    the machine instructions in assembly format.
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBInstructionList, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBInstructionList, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBInstructionList self) -> SBInstructionList
+        __init__(lldb::SBInstructionList self, SBInstructionList rhs) -> SBInstructionList
+        """
+        this = _lldb.new_SBInstructionList(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBInstructionList
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBInstructionList self) -> bool"""
+        return _lldb.SBInstructionList_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBInstructionList___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetSize(self):
+        """GetSize(SBInstructionList self) -> size_t"""
+        return _lldb.SBInstructionList_GetSize(self)
+
+
+    def GetInstructionAtIndex(self, idx):
+        """GetInstructionAtIndex(SBInstructionList self, uint32_t idx) -> SBInstruction"""
+        return _lldb.SBInstructionList_GetInstructionAtIndex(self, idx)
+
+
+    def GetInstructionsCount(self, start, end, canSetBreakpoint):
+        """GetInstructionsCount(SBInstructionList self, SBAddress start, SBAddress end, bool canSetBreakpoint) -> size_t"""
+        return _lldb.SBInstructionList_GetInstructionsCount(self, start, end, canSetBreakpoint)
+
+
+    def Clear(self):
+        """Clear(SBInstructionList self)"""
+        return _lldb.SBInstructionList_Clear(self)
+
+
+    def AppendInstruction(self, inst):
+        """AppendInstruction(SBInstructionList self, SBInstruction inst)"""
+        return _lldb.SBInstructionList_AppendInstruction(self, inst)
+
+
+    def Print(self, out):
+        """Print(SBInstructionList self, FILE * out)"""
+        return _lldb.SBInstructionList_Print(self, out)
+
+
+    def GetDescription(self, description):
+        """GetDescription(SBInstructionList self, SBStream description) -> bool"""
+        return _lldb.SBInstructionList_GetDescription(self, description)
+
+
+    def DumpEmulationForAllInstructions(self, triple):
+        """DumpEmulationForAllInstructions(SBInstructionList self, char const * triple) -> bool"""
+        return _lldb.SBInstructionList_DumpEmulationForAllInstructions(self, triple)
+
+
+    def __iter__(self):
+        '''Iterate over all instructions in a lldb.SBInstructionList
+        object.'''
+        return lldb_iter(self, 'GetSize', 'GetInstructionAtIndex')
+
+    def __len__(self):
+        '''Access len of the instruction list.'''
+        return int(self.GetSize())
+
+    def __getitem__(self, key):
+        '''Access instructions by integer index for array access or by lldb.SBAddress to find an instruction that matches a section offset address object.'''
+        if type(key) is int:
+    # Find an instruction by index
+            if key < len(self):
+                return self.GetInstructionAtIndex(key)
+        elif type(key) is SBAddress:
+    # Find an instruction using a lldb.SBAddress object
+            lookup_file_addr = key.file_addr
+            closest_inst = None
+            for idx in range(self.GetSize()):
+                inst = self.GetInstructionAtIndex(idx)
+                inst_file_addr = inst.addr.file_addr
+                if inst_file_addr == lookup_file_addr:
+                    return inst
+                elif inst_file_addr > lookup_file_addr:
+                    return closest_inst
+                else:
+                    closest_inst = inst
+        return None
+
+
+    def __str__(self):
+        """__str__(SBInstructionList self) -> PyObject *"""
+        return _lldb.SBInstructionList___str__(self)
+
+SBInstructionList_swigregister = _lldb.SBInstructionList_swigregister
+SBInstructionList_swigregister(SBInstructionList)
+
+class SBLanguageRuntime(_object):
+    """Proxy of C++ lldb::SBLanguageRuntime class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBLanguageRuntime, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBLanguageRuntime, name)
+    __repr__ = _swig_repr
+
+    def GetLanguageTypeFromString(string):
+        """GetLanguageTypeFromString(char const * string) -> lldb::LanguageType"""
+        return _lldb.SBLanguageRuntime_GetLanguageTypeFromString(string)
+
+    GetLanguageTypeFromString = staticmethod(GetLanguageTypeFromString)
+
+    def GetNameForLanguageType(language):
+        """GetNameForLanguageType(lldb::LanguageType language) -> char const *"""
+        return _lldb.SBLanguageRuntime_GetNameForLanguageType(language)
+
+    GetNameForLanguageType = staticmethod(GetNameForLanguageType)
+
+    def __init__(self):
+        """__init__(lldb::SBLanguageRuntime self) -> SBLanguageRuntime"""
+        this = _lldb.new_SBLanguageRuntime()
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBLanguageRuntime
+    __del__ = lambda self: None
+SBLanguageRuntime_swigregister = _lldb.SBLanguageRuntime_swigregister
+SBLanguageRuntime_swigregister(SBLanguageRuntime)
+
+def SBLanguageRuntime_GetLanguageTypeFromString(string):
+    """SBLanguageRuntime_GetLanguageTypeFromString(char const * string) -> lldb::LanguageType"""
+    return _lldb.SBLanguageRuntime_GetLanguageTypeFromString(string)
+
+def SBLanguageRuntime_GetNameForLanguageType(language):
+    """SBLanguageRuntime_GetNameForLanguageType(lldb::LanguageType language) -> char const *"""
+    return _lldb.SBLanguageRuntime_GetNameForLanguageType(language)
+
+class SBLaunchInfo(_object):
+    """Proxy of C++ lldb::SBLaunchInfo class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBLaunchInfo, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBLaunchInfo, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, argv):
+        """__init__(lldb::SBLaunchInfo self, char const ** argv) -> SBLaunchInfo"""
+        this = _lldb.new_SBLaunchInfo(argv)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+
+    def GetProcessID(self):
+        """GetProcessID(SBLaunchInfo self) -> lldb::pid_t"""
+        return _lldb.SBLaunchInfo_GetProcessID(self)
+
+
+    def GetUserID(self):
+        """GetUserID(SBLaunchInfo self) -> uint32_t"""
+        return _lldb.SBLaunchInfo_GetUserID(self)
+
+
+    def GetGroupID(self):
+        """GetGroupID(SBLaunchInfo self) -> uint32_t"""
+        return _lldb.SBLaunchInfo_GetGroupID(self)
+
+
+    def UserIDIsValid(self):
+        """UserIDIsValid(SBLaunchInfo self) -> bool"""
+        return _lldb.SBLaunchInfo_UserIDIsValid(self)
+
+
+    def GroupIDIsValid(self):
+        """GroupIDIsValid(SBLaunchInfo self) -> bool"""
+        return _lldb.SBLaunchInfo_GroupIDIsValid(self)
+
+
+    def SetUserID(self, uid):
+        """SetUserID(SBLaunchInfo self, uint32_t uid)"""
+        return _lldb.SBLaunchInfo_SetUserID(self, uid)
+
+
+    def SetGroupID(self, gid):
+        """SetGroupID(SBLaunchInfo self, uint32_t gid)"""
+        return _lldb.SBLaunchInfo_SetGroupID(self, gid)
+
+
+    def GetExecutableFile(self):
+        """GetExecutableFile(SBLaunchInfo self) -> SBFileSpec"""
+        return _lldb.SBLaunchInfo_GetExecutableFile(self)
+
+
+    def SetExecutableFile(self, exe_file, add_as_first_arg):
+        """SetExecutableFile(SBLaunchInfo self, SBFileSpec exe_file, bool add_as_first_arg)"""
+        return _lldb.SBLaunchInfo_SetExecutableFile(self, exe_file, add_as_first_arg)
+
+
+    def GetListener(self):
+        """GetListener(SBLaunchInfo self) -> SBListener"""
+        return _lldb.SBLaunchInfo_GetListener(self)
+
+
+    def SetListener(self, listener):
+        """SetListener(SBLaunchInfo self, SBListener listener)"""
+        return _lldb.SBLaunchInfo_SetListener(self, listener)
+
+
+    def GetNumArguments(self):
+        """GetNumArguments(SBLaunchInfo self) -> uint32_t"""
+        return _lldb.SBLaunchInfo_GetNumArguments(self)
+
+
+    def GetArgumentAtIndex(self, idx):
+        """GetArgumentAtIndex(SBLaunchInfo self, uint32_t idx) -> char const *"""
+        return _lldb.SBLaunchInfo_GetArgumentAtIndex(self, idx)
+
+
+    def SetArguments(self, argv, append):
+        """SetArguments(SBLaunchInfo self, char const ** argv, bool append)"""
+        return _lldb.SBLaunchInfo_SetArguments(self, argv, append)
+
+
+    def GetNumEnvironmentEntries(self):
+        """GetNumEnvironmentEntries(SBLaunchInfo self) -> uint32_t"""
+        return _lldb.SBLaunchInfo_GetNumEnvironmentEntries(self)
+
+
+    def GetEnvironmentEntryAtIndex(self, idx):
+        """GetEnvironmentEntryAtIndex(SBLaunchInfo self, uint32_t idx) -> char const *"""
+        return _lldb.SBLaunchInfo_GetEnvironmentEntryAtIndex(self, idx)
+
+
+    def SetEnvironmentEntries(self, envp, append):
+        """SetEnvironmentEntries(SBLaunchInfo self, char const ** envp, bool append)"""
+        return _lldb.SBLaunchInfo_SetEnvironmentEntries(self, envp, append)
+
+
+    def Clear(self):
+        """Clear(SBLaunchInfo self)"""
+        return _lldb.SBLaunchInfo_Clear(self)
+
+
+    def GetWorkingDirectory(self):
+        """GetWorkingDirectory(SBLaunchInfo self) -> char const *"""
+        return _lldb.SBLaunchInfo_GetWorkingDirectory(self)
+
+
+    def SetWorkingDirectory(self, working_dir):
+        """SetWorkingDirectory(SBLaunchInfo self, char const * working_dir)"""
+        return _lldb.SBLaunchInfo_SetWorkingDirectory(self, working_dir)
+
+
+    def GetLaunchFlags(self):
+        """GetLaunchFlags(SBLaunchInfo self) -> uint32_t"""
+        return _lldb.SBLaunchInfo_GetLaunchFlags(self)
+
+
+    def SetLaunchFlags(self, flags):
+        """SetLaunchFlags(SBLaunchInfo self, uint32_t flags)"""
+        return _lldb.SBLaunchInfo_SetLaunchFlags(self, flags)
+
+
+    def GetProcessPluginName(self):
+        """GetProcessPluginName(SBLaunchInfo self) -> char const *"""
+        return _lldb.SBLaunchInfo_GetProcessPluginName(self)
+
+
+    def SetProcessPluginName(self, plugin_name):
+        """SetProcessPluginName(SBLaunchInfo self, char const * plugin_name)"""
+        return _lldb.SBLaunchInfo_SetProcessPluginName(self, plugin_name)
+
+
+    def GetShell(self):
+        """GetShell(SBLaunchInfo self) -> char const *"""
+        return _lldb.SBLaunchInfo_GetShell(self)
+
+
+    def SetShell(self, path):
+        """SetShell(SBLaunchInfo self, char const * path)"""
+        return _lldb.SBLaunchInfo_SetShell(self, path)
+
+
+    def GetShellExpandArguments(self):
+        """GetShellExpandArguments(SBLaunchInfo self) -> bool"""
+        return _lldb.SBLaunchInfo_GetShellExpandArguments(self)
+
+
+    def SetShellExpandArguments(self, expand):
+        """SetShellExpandArguments(SBLaunchInfo self, bool expand)"""
+        return _lldb.SBLaunchInfo_SetShellExpandArguments(self, expand)
+
+
+    def GetResumeCount(self):
+        """GetResumeCount(SBLaunchInfo self) -> uint32_t"""
+        return _lldb.SBLaunchInfo_GetResumeCount(self)
+
+
+    def SetResumeCount(self, c):
+        """SetResumeCount(SBLaunchInfo self, uint32_t c)"""
+        return _lldb.SBLaunchInfo_SetResumeCount(self, c)
+
+
+    def AddCloseFileAction(self, fd):
+        """AddCloseFileAction(SBLaunchInfo self, int fd) -> bool"""
+        return _lldb.SBLaunchInfo_AddCloseFileAction(self, fd)
+
+
+    def AddDuplicateFileAction(self, fd, dup_fd):
+        """AddDuplicateFileAction(SBLaunchInfo self, int fd, int dup_fd) -> bool"""
+        return _lldb.SBLaunchInfo_AddDuplicateFileAction(self, fd, dup_fd)
+
+
+    def AddOpenFileAction(self, fd, path, read, write):
+        """AddOpenFileAction(SBLaunchInfo self, int fd, char const * path, bool read, bool write) -> bool"""
+        return _lldb.SBLaunchInfo_AddOpenFileAction(self, fd, path, read, write)
+
+
+    def AddSuppressFileAction(self, fd, read, write):
+        """AddSuppressFileAction(SBLaunchInfo self, int fd, bool read, bool write) -> bool"""
+        return _lldb.SBLaunchInfo_AddSuppressFileAction(self, fd, read, write)
+
+
+    def SetLaunchEventData(self, data):
+        """SetLaunchEventData(SBLaunchInfo self, char const * data)"""
+        return _lldb.SBLaunchInfo_SetLaunchEventData(self, data)
+
+
+    def GetLaunchEventData(self):
+        """GetLaunchEventData(SBLaunchInfo self) -> char const *"""
+        return _lldb.SBLaunchInfo_GetLaunchEventData(self)
+
+
+    def GetDetachOnError(self):
+        """GetDetachOnError(SBLaunchInfo self) -> bool"""
+        return _lldb.SBLaunchInfo_GetDetachOnError(self)
+
+
+    def SetDetachOnError(self, enable):
+        """SetDetachOnError(SBLaunchInfo self, bool enable)"""
+        return _lldb.SBLaunchInfo_SetDetachOnError(self, enable)
+
+    __swig_destroy__ = _lldb.delete_SBLaunchInfo
+    __del__ = lambda self: None
+SBLaunchInfo_swigregister = _lldb.SBLaunchInfo_swigregister
+SBLaunchInfo_swigregister(SBLaunchInfo)
+
+class SBLineEntry(_object):
+    """
+    Specifies an association with a contiguous range of instructions and
+    a source file location. SBCompileUnit contains SBLineEntry(s). For example,
+
+        for lineEntry in compileUnit:
+            print('line entry: %s:%d' % (str(lineEntry.GetFileSpec()),
+                                        lineEntry.GetLine()))
+            print('start addr: %s' % str(lineEntry.GetStartAddress()))
+            print('end   addr: %s' % str(lineEntry.GetEndAddress()))
+
+    produces:
+
+    line entry: /Volumes/data/lldb/svn/trunk/test/python_api/symbol-context/main.c:20
+    start addr: a.out[0x100000d98]
+    end   addr: a.out[0x100000da3]
+    line entry: /Volumes/data/lldb/svn/trunk/test/python_api/symbol-context/main.c:21
+    start addr: a.out[0x100000da3]
+    end   addr: a.out[0x100000da9]
+    line entry: /Volumes/data/lldb/svn/trunk/test/python_api/symbol-context/main.c:22
+    start addr: a.out[0x100000da9]
+    end   addr: a.out[0x100000db6]
+    line entry: /Volumes/data/lldb/svn/trunk/test/python_api/symbol-context/main.c:23
+    start addr: a.out[0x100000db6]
+    end   addr: a.out[0x100000dbc]
+    ...
+
+    See also SBCompileUnit.
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBLineEntry, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBLineEntry, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBLineEntry self) -> SBLineEntry
+        __init__(lldb::SBLineEntry self, SBLineEntry rhs) -> SBLineEntry
+        """
+        this = _lldb.new_SBLineEntry(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBLineEntry
+    __del__ = lambda self: None
+
+    def GetStartAddress(self):
+        """GetStartAddress(SBLineEntry self) -> SBAddress"""
+        return _lldb.SBLineEntry_GetStartAddress(self)
+
+
+    def GetEndAddress(self):
+        """GetEndAddress(SBLineEntry self) -> SBAddress"""
+        return _lldb.SBLineEntry_GetEndAddress(self)
+
+
+    def IsValid(self):
+        """IsValid(SBLineEntry self) -> bool"""
+        return _lldb.SBLineEntry_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBLineEntry___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetFileSpec(self):
+        """GetFileSpec(SBLineEntry self) -> SBFileSpec"""
+        return _lldb.SBLineEntry_GetFileSpec(self)
+
+
+    def GetLine(self):
+        """GetLine(SBLineEntry self) -> uint32_t"""
+        return _lldb.SBLineEntry_GetLine(self)
+
+
+    def GetColumn(self):
+        """GetColumn(SBLineEntry self) -> uint32_t"""
+        return _lldb.SBLineEntry_GetColumn(self)
+
+
+    def GetDescription(self, description):
+        """GetDescription(SBLineEntry self, SBStream description) -> bool"""
+        return _lldb.SBLineEntry_GetDescription(self, description)
+
+
+    def SetFileSpec(self, filespec):
+        """SetFileSpec(SBLineEntry self, SBFileSpec filespec)"""
+        return _lldb.SBLineEntry_SetFileSpec(self, filespec)
+
+
+    def SetLine(self, line):
+        """SetLine(SBLineEntry self, uint32_t line)"""
+        return _lldb.SBLineEntry_SetLine(self, line)
+
+
+    def SetColumn(self, column):
+        """SetColumn(SBLineEntry self, uint32_t column)"""
+        return _lldb.SBLineEntry_SetColumn(self, column)
+
+
+    def __eq__(self, rhs):
+        """__eq__(SBLineEntry self, SBLineEntry rhs) -> bool"""
+        return _lldb.SBLineEntry___eq__(self, rhs)
+
+
+    def __ne__(self, rhs):
+        """__ne__(SBLineEntry self, SBLineEntry rhs) -> bool"""
+        return _lldb.SBLineEntry___ne__(self, rhs)
+
+
+    file = property(GetFileSpec, None, doc='''A read only property that returns an lldb object that represents the file (lldb.SBFileSpec) for this line entry.''')
+    line = property(GetLine, None, doc='''A read only property that returns the 1 based line number for this line entry, a return value of zero indicates that no line information is available.''')
+    column = property(GetColumn, None, doc='''A read only property that returns the 1 based column number for this line entry, a return value of zero indicates that no column information is available.''')
+    addr = property(GetStartAddress, None, doc='''A read only property that returns an lldb object that represents the start address (lldb.SBAddress) for this line entry.''')
+    end_addr = property(GetEndAddress, None, doc='''A read only property that returns an lldb object that represents the end address (lldb.SBAddress) for this line entry.''')
+
+
+    def __str__(self):
+        """__str__(SBLineEntry self) -> PyObject *"""
+        return _lldb.SBLineEntry___str__(self)
+
+
+    def __eq__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return False 
+
+        return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
+
+    def __ne__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return True 
+
+        return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
+
+SBLineEntry_swigregister = _lldb.SBLineEntry_swigregister
+SBLineEntry_swigregister(SBLineEntry)
+
+class SBListener(_object):
+    """
+    API clients can register its own listener to debugger events.
+
+    See aslo SBEvent for example usage of creating and adding a listener.
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBListener, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBListener, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBListener self) -> SBListener
+        __init__(lldb::SBListener self, char const * name) -> SBListener
+        __init__(lldb::SBListener self, SBListener rhs) -> SBListener
+        """
+        this = _lldb.new_SBListener(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBListener
+    __del__ = lambda self: None
+
+    def AddEvent(self, event):
+        """AddEvent(SBListener self, SBEvent event)"""
+        return _lldb.SBListener_AddEvent(self, event)
+
+
+    def Clear(self):
+        """Clear(SBListener self)"""
+        return _lldb.SBListener_Clear(self)
+
+
+    def IsValid(self):
+        """IsValid(SBListener self) -> bool"""
+        return _lldb.SBListener_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBListener___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def StartListeningForEventClass(self, debugger, broadcaster_class, event_mask):
+        """StartListeningForEventClass(SBListener self, SBDebugger debugger, char const * broadcaster_class, uint32_t event_mask) -> uint32_t"""
+        return _lldb.SBListener_StartListeningForEventClass(self, debugger, broadcaster_class, event_mask)
+
+
+    def StopListeningForEventClass(self, debugger, broadcaster_class, event_mask):
+        """StopListeningForEventClass(SBListener self, SBDebugger debugger, char const * broadcaster_class, uint32_t event_mask) -> uint32_t"""
+        return _lldb.SBListener_StopListeningForEventClass(self, debugger, broadcaster_class, event_mask)
+
+
+    def StartListeningForEvents(self, broadcaster, event_mask):
+        """StartListeningForEvents(SBListener self, SBBroadcaster broadcaster, uint32_t event_mask) -> uint32_t"""
+        return _lldb.SBListener_StartListeningForEvents(self, broadcaster, event_mask)
+
+
+    def StopListeningForEvents(self, broadcaster, event_mask):
+        """StopListeningForEvents(SBListener self, SBBroadcaster broadcaster, uint32_t event_mask) -> bool"""
+        return _lldb.SBListener_StopListeningForEvents(self, broadcaster, event_mask)
+
+
+    def WaitForEvent(self, num_seconds, event):
+        """WaitForEvent(SBListener self, uint32_t num_seconds, SBEvent event) -> bool"""
+        return _lldb.SBListener_WaitForEvent(self, num_seconds, event)
+
+
+    def WaitForEventForBroadcaster(self, num_seconds, broadcaster, sb_event):
+        """WaitForEventForBroadcaster(SBListener self, uint32_t num_seconds, SBBroadcaster broadcaster, SBEvent sb_event) -> bool"""
+        return _lldb.SBListener_WaitForEventForBroadcaster(self, num_seconds, broadcaster, sb_event)
+
+
+    def WaitForEventForBroadcasterWithType(self, num_seconds, broadcaster, event_type_mask, sb_event):
+        """WaitForEventForBroadcasterWithType(SBListener self, uint32_t num_seconds, SBBroadcaster broadcaster, uint32_t event_type_mask, SBEvent sb_event) -> bool"""
+        return _lldb.SBListener_WaitForEventForBroadcasterWithType(self, num_seconds, broadcaster, event_type_mask, sb_event)
+
+
+    def PeekAtNextEvent(self, sb_event):
+        """PeekAtNextEvent(SBListener self, SBEvent sb_event) -> bool"""
+        return _lldb.SBListener_PeekAtNextEvent(self, sb_event)
+
+
+    def PeekAtNextEventForBroadcaster(self, broadcaster, sb_event):
+        """PeekAtNextEventForBroadcaster(SBListener self, SBBroadcaster broadcaster, SBEvent sb_event) -> bool"""
+        return _lldb.SBListener_PeekAtNextEventForBroadcaster(self, broadcaster, sb_event)
+
+
+    def PeekAtNextEventForBroadcasterWithType(self, broadcaster, event_type_mask, sb_event):
+        """PeekAtNextEventForBroadcasterWithType(SBListener self, SBBroadcaster broadcaster, uint32_t event_type_mask, SBEvent sb_event) -> bool"""
+        return _lldb.SBListener_PeekAtNextEventForBroadcasterWithType(self, broadcaster, event_type_mask, sb_event)
+
+
+    def GetNextEvent(self, sb_event):
+        """GetNextEvent(SBListener self, SBEvent sb_event) -> bool"""
+        return _lldb.SBListener_GetNextEvent(self, sb_event)
+
+
+    def GetNextEventForBroadcaster(self, broadcaster, sb_event):
+        """GetNextEventForBroadcaster(SBListener self, SBBroadcaster broadcaster, SBEvent sb_event) -> bool"""
+        return _lldb.SBListener_GetNextEventForBroadcaster(self, broadcaster, sb_event)
+
+
+    def GetNextEventForBroadcasterWithType(self, broadcaster, event_type_mask, sb_event):
+        """GetNextEventForBroadcasterWithType(SBListener self, SBBroadcaster broadcaster, uint32_t event_type_mask, SBEvent sb_event) -> bool"""
+        return _lldb.SBListener_GetNextEventForBroadcasterWithType(self, broadcaster, event_type_mask, sb_event)
+
+
+    def HandleBroadcastEvent(self, event):
+        """HandleBroadcastEvent(SBListener self, SBEvent event) -> bool"""
+        return _lldb.SBListener_HandleBroadcastEvent(self, event)
+
+SBListener_swigregister = _lldb.SBListener_swigregister
+SBListener_swigregister(SBListener)
+
+class SBMemoryRegionInfo(_object):
+    """API clients can get information about memory regions in processes."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBMemoryRegionInfo, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBMemoryRegionInfo, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBMemoryRegionInfo self) -> SBMemoryRegionInfo
+        __init__(lldb::SBMemoryRegionInfo self, SBMemoryRegionInfo rhs) -> SBMemoryRegionInfo
+        """
+        this = _lldb.new_SBMemoryRegionInfo(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBMemoryRegionInfo
+    __del__ = lambda self: None
+
+    def Clear(self):
+        """Clear(SBMemoryRegionInfo self)"""
+        return _lldb.SBMemoryRegionInfo_Clear(self)
+
+
+    def GetRegionBase(self):
+        """GetRegionBase(SBMemoryRegionInfo self) -> lldb::addr_t"""
+        return _lldb.SBMemoryRegionInfo_GetRegionBase(self)
+
+
+    def GetRegionEnd(self):
+        """GetRegionEnd(SBMemoryRegionInfo self) -> lldb::addr_t"""
+        return _lldb.SBMemoryRegionInfo_GetRegionEnd(self)
+
+
+    def IsReadable(self):
+        """IsReadable(SBMemoryRegionInfo self) -> bool"""
+        return _lldb.SBMemoryRegionInfo_IsReadable(self)
+
+
+    def IsWritable(self):
+        """IsWritable(SBMemoryRegionInfo self) -> bool"""
+        return _lldb.SBMemoryRegionInfo_IsWritable(self)
+
+
+    def IsExecutable(self):
+        """IsExecutable(SBMemoryRegionInfo self) -> bool"""
+        return _lldb.SBMemoryRegionInfo_IsExecutable(self)
+
+
+    def IsMapped(self):
+        """IsMapped(SBMemoryRegionInfo self) -> bool"""
+        return _lldb.SBMemoryRegionInfo_IsMapped(self)
+
+
+    def GetName(self):
+        """GetName(SBMemoryRegionInfo self) -> char const *"""
+        return _lldb.SBMemoryRegionInfo_GetName(self)
+
+
+    def __eq__(self, rhs):
+        """__eq__(SBMemoryRegionInfo self, SBMemoryRegionInfo rhs) -> bool"""
+        return _lldb.SBMemoryRegionInfo___eq__(self, rhs)
+
+
+    def __ne__(self, rhs):
+        """__ne__(SBMemoryRegionInfo self, SBMemoryRegionInfo rhs) -> bool"""
+        return _lldb.SBMemoryRegionInfo___ne__(self, rhs)
+
+
+    def GetDescription(self, description):
+        """GetDescription(SBMemoryRegionInfo self, SBStream description) -> bool"""
+        return _lldb.SBMemoryRegionInfo_GetDescription(self, description)
+
+
+    def __str__(self):
+        """__str__(SBMemoryRegionInfo self) -> PyObject *"""
+        return _lldb.SBMemoryRegionInfo___str__(self)
+
+SBMemoryRegionInfo_swigregister = _lldb.SBMemoryRegionInfo_swigregister
+SBMemoryRegionInfo_swigregister(SBMemoryRegionInfo)
+
+class SBMemoryRegionInfoList(_object):
+    """Proxy of C++ lldb::SBMemoryRegionInfoList class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBMemoryRegionInfoList, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBMemoryRegionInfoList, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBMemoryRegionInfoList self) -> SBMemoryRegionInfoList
+        __init__(lldb::SBMemoryRegionInfoList self, SBMemoryRegionInfoList rhs) -> SBMemoryRegionInfoList
+        """
+        this = _lldb.new_SBMemoryRegionInfoList(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBMemoryRegionInfoList
+    __del__ = lambda self: None
+
+    def GetSize(self):
+        """GetSize(SBMemoryRegionInfoList self) -> uint32_t"""
+        return _lldb.SBMemoryRegionInfoList_GetSize(self)
+
+
+    def GetMemoryRegionAtIndex(self, idx, region_info):
+        """GetMemoryRegionAtIndex(SBMemoryRegionInfoList self, uint32_t idx, SBMemoryRegionInfo region_info) -> bool"""
+        return _lldb.SBMemoryRegionInfoList_GetMemoryRegionAtIndex(self, idx, region_info)
+
+
+    def Append(self, *args):
+        """
+        Append(SBMemoryRegionInfoList self, SBMemoryRegionInfo region)
+        Append(SBMemoryRegionInfoList self, SBMemoryRegionInfoList region_list)
+        """
+        return _lldb.SBMemoryRegionInfoList_Append(self, *args)
+
+
+    def Clear(self):
+        """Clear(SBMemoryRegionInfoList self)"""
+        return _lldb.SBMemoryRegionInfoList_Clear(self)
+
+SBMemoryRegionInfoList_swigregister = _lldb.SBMemoryRegionInfoList_swigregister
+SBMemoryRegionInfoList_swigregister(SBMemoryRegionInfoList)
+
+
+# ==================================
+# Helper function for SBModule class
+# ==================================
+def in_range(symbol, section):
+    """Test whether a symbol is within the range of a section."""
+    symSA = symbol.GetStartAddress().GetFileAddress()
+    symEA = symbol.GetEndAddress().GetFileAddress()
+    secSA = section.GetFileAddress()
+    secEA = secSA + section.GetByteSize()
+
+    if symEA != LLDB_INVALID_ADDRESS:
+        if secSA <= symSA and symEA <= secEA:
+            return True
+        else:
+            return False
+    else:
+        if secSA <= symSA and symSA < secEA:
+            return True
+        else:
+            return False
+
+class SBModule(_object):
+    """
+    Represents an executable image and its associated object and symbol files.
+
+    The module is designed to be able to select a single slice of an
+    executable image as it would appear on disk and during program
+    execution.
+
+    You can retrieve SBModule from SBSymbolContext, which in turn is available
+    from SBFrame.
+
+    SBModule supports symbol iteration, for example,
+
+        for symbol in module:
+            name = symbol.GetName()
+            saddr = symbol.GetStartAddress()
+            eaddr = symbol.GetEndAddress()
+
+    and rich comparison methods which allow the API program to use,
+
+        if thisModule == thatModule:
+            print('This module is the same as that module')
+
+    to test module equality.  A module also contains object file sections, namely
+    SBSection.  SBModule supports section iteration through section_iter(), for
+    example,
+
+        print('Number of sections: %d' % module.GetNumSections())
+        for sec in module.section_iter():
+            print(sec)
+
+    And to iterate the symbols within a SBSection, use symbol_in_section_iter(),
+
+        # Iterates the text section and prints each symbols within each sub-section.
+        for subsec in text_sec:
+            print(INDENT + repr(subsec))
+            for sym in exe_module.symbol_in_section_iter(subsec):
+                print(INDENT2 + repr(sym))
+                print(INDENT2 + 'symbol type: %s' % symbol_type_to_str(sym.GetType()))
+
+    produces this following output:
+
+        [0x0000000100001780-0x0000000100001d5c) a.out.__TEXT.__text
+            id = {0x00000004}, name = 'mask_access(MaskAction, unsigned int)', range = [0x00000001000017c0-0x0000000100001870)
+            symbol type: code
+            id = {0x00000008}, name = 'thread_func(void*)', range = [0x0000000100001870-0x00000001000019b0)
+            symbol type: code
+            id = {0x0000000c}, name = 'main', range = [0x00000001000019b0-0x0000000100001d5c)
+            symbol type: code
+            id = {0x00000023}, name = 'start', address = 0x0000000100001780
+            symbol type: code
+        [0x0000000100001d5c-0x0000000100001da4) a.out.__TEXT.__stubs
+            id = {0x00000024}, name = '__stack_chk_fail', range = [0x0000000100001d5c-0x0000000100001d62)
+            symbol type: trampoline
+            id = {0x00000028}, name = 'exit', range = [0x0000000100001d62-0x0000000100001d68)
+            symbol type: trampoline
+            id = {0x00000029}, name = 'fflush', range = [0x0000000100001d68-0x0000000100001d6e)
+            symbol type: trampoline
+            id = {0x0000002a}, name = 'fgets', range = [0x0000000100001d6e-0x0000000100001d74)
+            symbol type: trampoline
+            id = {0x0000002b}, name = 'printf', range = [0x0000000100001d74-0x0000000100001d7a)
+            symbol type: trampoline
+            id = {0x0000002c}, name = 'pthread_create', range = [0x0000000100001d7a-0x0000000100001d80)
+            symbol type: trampoline
+            id = {0x0000002d}, name = 'pthread_join', range = [0x0000000100001d80-0x0000000100001d86)
+            symbol type: trampoline
+            id = {0x0000002e}, name = 'pthread_mutex_lock', range = [0x0000000100001d86-0x0000000100001d8c)
+            symbol type: trampoline
+            id = {0x0000002f}, name = 'pthread_mutex_unlock', range = [0x0000000100001d8c-0x0000000100001d92)
+            symbol type: trampoline
+            id = {0x00000030}, name = 'rand', range = [0x0000000100001d92-0x0000000100001d98)
+            symbol type: trampoline
+            id = {0x00000031}, name = 'strtoul', range = [0x0000000100001d98-0x0000000100001d9e)
+            symbol type: trampoline
+            id = {0x00000032}, name = 'usleep', range = [0x0000000100001d9e-0x0000000100001da4)
+            symbol type: trampoline
+        [0x0000000100001da4-0x0000000100001e2c) a.out.__TEXT.__stub_helper
+        [0x0000000100001e2c-0x0000000100001f10) a.out.__TEXT.__cstring
+        [0x0000000100001f10-0x0000000100001f68) a.out.__TEXT.__unwind_info
+        [0x0000000100001f68-0x0000000100001ff8) a.out.__TEXT.__eh_frame
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBModule, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBModule, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBModule self) -> SBModule
+        __init__(lldb::SBModule self, SBModule rhs) -> SBModule
+        __init__(lldb::SBModule self, SBModuleSpec module_spec) -> SBModule
+        __init__(lldb::SBModule self, SBProcess process, lldb::addr_t header_addr) -> SBModule
+        """
+        this = _lldb.new_SBModule(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBModule
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBModule self) -> bool"""
+        return _lldb.SBModule_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBModule___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def Clear(self):
+        """Clear(SBModule self)"""
+        return _lldb.SBModule_Clear(self)
+
+
+    def GetFileSpec(self):
+        """
+        GetFileSpec(SBModule self) -> SBFileSpec
+
+
+        Get const accessor for the module file specification.
+
+        This function returns the file for the module on the host system
+        that is running LLDB. This can differ from the path on the
+        platform since we might be doing remote debugging.
+
+        @return
+            A const reference to the file specification object.
+        """
+        return _lldb.SBModule_GetFileSpec(self)
+
+
+    def GetPlatformFileSpec(self):
+        """
+        GetPlatformFileSpec(SBModule self) -> SBFileSpec
+
+
+        Get accessor for the module platform file specification.
+
+        Platform file refers to the path of the module as it is known on
+        the remote system on which it is being debugged. For local
+        debugging this is always the same as Module::GetFileSpec(). But
+        remote debugging might mention a file '/usr/lib/liba.dylib'
+        which might be locally downloaded and cached. In this case the
+        platform file could be something like:
+        '/tmp/lldb/platform-cache/remote.host.computer/usr/lib/liba.dylib'
+        The file could also be cached in a local developer kit directory.
+
+        @return
+            A const reference to the file specification object.
+        """
+        return _lldb.SBModule_GetPlatformFileSpec(self)
+
+
+    def SetPlatformFileSpec(self, platform_file):
+        """SetPlatformFileSpec(SBModule self, SBFileSpec platform_file) -> bool"""
+        return _lldb.SBModule_SetPlatformFileSpec(self, platform_file)
+
+
+    def GetRemoteInstallFileSpec(self):
+        """GetRemoteInstallFileSpec(SBModule self) -> SBFileSpec"""
+        return _lldb.SBModule_GetRemoteInstallFileSpec(self)
+
+
+    def SetRemoteInstallFileSpec(self, file):
+        """SetRemoteInstallFileSpec(SBModule self, SBFileSpec file) -> bool"""
+        return _lldb.SBModule_SetRemoteInstallFileSpec(self, file)
+
+
+    def GetUUIDString(self):
+        """
+        GetUUIDString(SBModule self) -> char const *
+
+        Returns the UUID of the module as a Python string.
+        """
+        return _lldb.SBModule_GetUUIDString(self)
+
+
+    def __eq__(self, rhs):
+        """__eq__(SBModule self, SBModule rhs) -> bool"""
+        return _lldb.SBModule___eq__(self, rhs)
+
+
+    def __ne__(self, rhs):
+        """__ne__(SBModule self, SBModule rhs) -> bool"""
+        return _lldb.SBModule___ne__(self, rhs)
+
+
+    def FindSection(self, sect_name):
+        """FindSection(SBModule self, char const * sect_name) -> SBSection"""
+        return _lldb.SBModule_FindSection(self, sect_name)
+
+
+    def ResolveFileAddress(self, vm_addr):
+        """ResolveFileAddress(SBModule self, lldb::addr_t vm_addr) -> SBAddress"""
+        return _lldb.SBModule_ResolveFileAddress(self, vm_addr)
+
+
+    def ResolveSymbolContextForAddress(self, addr, resolve_scope):
+        """ResolveSymbolContextForAddress(SBModule self, SBAddress addr, uint32_t resolve_scope) -> SBSymbolContext"""
+        return _lldb.SBModule_ResolveSymbolContextForAddress(self, addr, resolve_scope)
+
+
+    def GetDescription(self, description):
+        """GetDescription(SBModule self, SBStream description) -> bool"""
+        return _lldb.SBModule_GetDescription(self, description)
+
+
+    def GetNumCompileUnits(self):
+        """GetNumCompileUnits(SBModule self) -> uint32_t"""
+        return _lldb.SBModule_GetNumCompileUnits(self)
+
+
+    def GetCompileUnitAtIndex(self, arg2):
+        """GetCompileUnitAtIndex(SBModule self, uint32_t arg2) -> SBCompileUnit"""
+        return _lldb.SBModule_GetCompileUnitAtIndex(self, arg2)
+
+
+    def FindCompileUnits(self, sb_file_spec):
+        """
+        FindCompileUnits(SBModule self, SBFileSpec sb_file_spec) -> SBSymbolContextList
+
+
+        Find compile units related to *this module and passed source
+        file.
+
+        @param[in] sb_file_spec
+            A lldb::SBFileSpec object that contains source file
+            specification.
+
+        @return
+            A lldb::SBSymbolContextList that gets filled in with all of
+            the symbol contexts for all the matches.
+        """
+        return _lldb.SBModule_FindCompileUnits(self, sb_file_spec)
+
+
+    def GetNumSymbols(self):
+        """GetNumSymbols(SBModule self) -> size_t"""
+        return _lldb.SBModule_GetNumSymbols(self)
+
+
+    def GetSymbolAtIndex(self, idx):
+        """GetSymbolAtIndex(SBModule self, size_t idx) -> SBSymbol"""
+        return _lldb.SBModule_GetSymbolAtIndex(self, idx)
+
+
+    def FindSymbol(self, *args):
+        """
+        FindSymbol(SBModule self, char const * name, lldb::SymbolType type) -> SBSymbol
+        FindSymbol(SBModule self, char const * name) -> SBSymbol
+        """
+        return _lldb.SBModule_FindSymbol(self, *args)
+
+
+    def FindSymbols(self, *args):
+        """
+        FindSymbols(SBModule self, char const * name, lldb::SymbolType type) -> SBSymbolContextList
+        FindSymbols(SBModule self, char const * name) -> SBSymbolContextList
+        """
+        return _lldb.SBModule_FindSymbols(self, *args)
+
+
+    def GetNumSections(self):
+        """GetNumSections(SBModule self) -> size_t"""
+        return _lldb.SBModule_GetNumSections(self)
+
+
+    def GetSectionAtIndex(self, idx):
+        """GetSectionAtIndex(SBModule self, size_t idx) -> SBSection"""
+        return _lldb.SBModule_GetSectionAtIndex(self, idx)
+
+
+    def FindFunctions(self, *args):
+        """
+        FindFunctions(SBModule self, char const * name, uint32_t name_type_mask) -> SBSymbolContextList
+        FindFunctions(SBModule self, char const * name) -> SBSymbolContextList
+
+
+        Find functions by name.
+
+        @param[in] name
+            The name of the function we are looking for.
+
+        @param[in] name_type_mask
+            A logical OR of one or more FunctionNameType enum bits that
+            indicate what kind of names should be used when doing the
+            lookup. Bits include fully qualified names, base names,
+            C++ methods, or ObjC selectors.
+            See FunctionNameType for more details.
+
+        @return
+            A symbol context list that gets filled in with all of the
+            matches.
+        """
+        return _lldb.SBModule_FindFunctions(self, *args)
+
+
+    def FindFirstType(self, name):
+        """FindFirstType(SBModule self, char const * name) -> SBType"""
+        return _lldb.SBModule_FindFirstType(self, name)
+
+
+    def FindTypes(self, type):
+        """FindTypes(SBModule self, char const * type) -> SBTypeList"""
+        return _lldb.SBModule_FindTypes(self, type)
+
+
+    def GetTypeByID(self, uid):
+        """GetTypeByID(SBModule self, lldb::user_id_t uid) -> SBType"""
+        return _lldb.SBModule_GetTypeByID(self, uid)
+
+
+    def GetBasicType(self, type):
+        """GetBasicType(SBModule self, lldb::BasicType type) -> SBType"""
+        return _lldb.SBModule_GetBasicType(self, type)
+
+
+    def GetTypes(self, *args):
+        """
+        GetTypes(SBModule self, uint32_t type_mask) -> SBTypeList
+        GetTypes(SBModule self) -> SBTypeList
+
+
+        Get all types matching type_mask from debug info in this
+        module.
+
+        @param[in] type_mask
+            A bitfield that consists of one or more bits logically OR'ed
+            together from the lldb::TypeClass enumeration. This allows
+            you to request only structure types, or only class, struct
+            and union types. Passing in lldb::eTypeClassAny will return
+            all types found in the debug information for this module.
+
+        @return
+            A list of types in this module that match type_mask
+        """
+        return _lldb.SBModule_GetTypes(self, *args)
+
+
+    def FindGlobalVariables(self, target, name, max_matches):
+        """
+        FindGlobalVariables(SBModule self, SBTarget target, char const * name, uint32_t max_matches) -> SBValueList
+
+
+        Find global and static variables by name.
+
+        @param[in] target
+            A valid SBTarget instance representing the debuggee.
+
+        @param[in] name
+            The name of the global or static variable we are looking
+            for.
+
+        @param[in] max_matches
+            Allow the number of matches to be limited to max_matches.
+
+        @return
+            A list of matched variables in an SBValueList.
+        """
+        return _lldb.SBModule_FindGlobalVariables(self, target, name, max_matches)
+
+
+    def FindFirstGlobalVariable(self, target, name):
+        """
+        FindFirstGlobalVariable(SBModule self, SBTarget target, char const * name) -> SBValue
+
+
+        Find the first global (or static) variable by name.
+
+        @param[in] target
+            A valid SBTarget instance representing the debuggee.
+
+        @param[in] name
+            The name of the global or static variable we are looking
+            for.
+
+        @return
+            An SBValue that gets filled in with the found variable (if any).
+        """
+        return _lldb.SBModule_FindFirstGlobalVariable(self, target, name)
+
+
+    def GetByteOrder(self):
+        """GetByteOrder(SBModule self) -> lldb::ByteOrder"""
+        return _lldb.SBModule_GetByteOrder(self)
+
+
+    def GetAddressByteSize(self):
+        """GetAddressByteSize(SBModule self) -> uint32_t"""
+        return _lldb.SBModule_GetAddressByteSize(self)
+
+
+    def GetTriple(self):
+        """GetTriple(SBModule self) -> char const *"""
+        return _lldb.SBModule_GetTriple(self)
+
+
+    def GetVersion(self):
+        """GetVersion(SBModule self) -> uint32_t"""
+        return _lldb.SBModule_GetVersion(self)
+
+
+    def GetSymbolFileSpec(self):
+        """GetSymbolFileSpec(SBModule self) -> SBFileSpec"""
+        return _lldb.SBModule_GetSymbolFileSpec(self)
+
+
+    def GetObjectFileHeaderAddress(self):
+        """GetObjectFileHeaderAddress(SBModule self) -> SBAddress"""
+        return _lldb.SBModule_GetObjectFileHeaderAddress(self)
+
+
+    def GetObjectFileEntryPointAddress(self):
+        """GetObjectFileEntryPointAddress(SBModule self) -> SBAddress"""
+        return _lldb.SBModule_GetObjectFileEntryPointAddress(self)
+
+
+    def __len__(self):
+        '''Return the number of symbols in a lldb.SBModule object.'''
+        return self.GetNumSymbols()
+
+    def __iter__(self):
+        '''Iterate over all symbols in a lldb.SBModule object.'''
+        return lldb_iter(self, 'GetNumSymbols', 'GetSymbolAtIndex')
+
+    def section_iter(self):
+        '''Iterate over all sections in a lldb.SBModule object.'''
+        return lldb_iter(self, 'GetNumSections', 'GetSectionAtIndex')
+
+    def compile_unit_iter(self):
+        '''Iterate over all compile units in a lldb.SBModule object.'''
+        return lldb_iter(self, 'GetNumCompileUnits', 'GetCompileUnitAtIndex')
+
+    def symbol_in_section_iter(self, section):
+        '''Given a module and its contained section, returns an iterator on the
+        symbols within the section.'''
+        for sym in self:
+            if in_range(sym, section):
+                yield sym
+
+    class symbols_access(object):
+        re_compile_type = type(re.compile('.'))
+        '''A helper object that will lazily hand out lldb.SBSymbol objects for a module when supplied an index, name, or regular expression.'''
+        def __init__(self, sbmodule):
+            self.sbmodule = sbmodule
+
+        def __len__(self):
+            if self.sbmodule:
+                return int(self.sbmodule.GetNumSymbols())
+            return 0
+
+        def __getitem__(self, key):
+            count = len(self)
+            if type(key) is int:
+                if key < count:
+                    return self.sbmodule.GetSymbolAtIndex(key)
+            elif type(key) is str:
+                matches = []
+                sc_list = self.sbmodule.FindSymbols(key)
+                for sc in sc_list:
+                    symbol = sc.symbol
+                    if symbol:
+                        matches.append(symbol)
+                return matches
+            elif isinstance(key, self.re_compile_type):
+                matches = []
+                for idx in range(count):
+                    symbol = self.sbmodule.GetSymbolAtIndex(idx)
+                    added = False
+                    name = symbol.name
+                    if name:
+                        re_match = key.search(name)
+                        if re_match:
+                            matches.append(symbol)
+                            added = True
+                    if not added:
+                        mangled = symbol.mangled
+                        if mangled:
+                            re_match = key.search(mangled)
+                            if re_match:
+                                matches.append(symbol)
+                return matches
+            else:
+                print("error: unsupported item type: %s" % type(key))
+            return None
+
+    def get_symbols_access_object(self):
+        '''An accessor function that returns a symbols_access() object which allows lazy symbol access from a lldb.SBModule object.'''
+        return self.symbols_access (self)
+
+    def get_compile_units_access_object (self):
+        '''An accessor function that returns a compile_units_access() object which allows lazy compile unit access from a lldb.SBModule object.'''
+        return self.compile_units_access (self)
+
+    def get_symbols_array(self):
+        '''An accessor function that returns a list() that contains all symbols in a lldb.SBModule object.'''
+        symbols = []
+        for idx in range(self.num_symbols):
+            symbols.append(self.GetSymbolAtIndex(idx))
+        return symbols
+
+    class sections_access(object):
+        re_compile_type = type(re.compile('.'))
+        '''A helper object that will lazily hand out lldb.SBSection objects for a module when supplied an index, name, or regular expression.'''
+        def __init__(self, sbmodule):
+            self.sbmodule = sbmodule
+
+        def __len__(self):
+            if self.sbmodule:
+                return int(self.sbmodule.GetNumSections())
+            return 0
+
+        def __getitem__(self, key):
+            count = len(self)
+            if type(key) is int:
+                if key < count:
+                    return self.sbmodule.GetSectionAtIndex(key)
+            elif type(key) is str:
+                for idx in range(count):
+                    section = self.sbmodule.GetSectionAtIndex(idx)
+                    if section.name == key:
+                        return section
+            elif isinstance(key, self.re_compile_type):
+                matches = []
+                for idx in range(count):
+                    section = self.sbmodule.GetSectionAtIndex(idx)
+                    name = section.name
+                    if name:
+                        re_match = key.search(name)
+                        if re_match:
+                            matches.append(section)
+                return matches
+            else:
+                print("error: unsupported item type: %s" % type(key))
+            return None
+
+    class compile_units_access(object):
+        re_compile_type = type(re.compile('.'))
+        '''A helper object that will lazily hand out lldb.SBCompileUnit objects for a module when supplied an index, full or partial path, or regular expression.'''
+        def __init__(self, sbmodule):
+            self.sbmodule = sbmodule
+
+        def __len__(self):
+            if self.sbmodule:
+                return int(self.sbmodule.GetNumCompileUnits())
+            return 0
+
+        def __getitem__(self, key):
+            count = len(self)
+            if type(key) is int:
+                if key < count:
+                    return self.sbmodule.GetCompileUnitAtIndex(key)
+            elif type(key) is str:
+                is_full_path = key[0] == '/'
+                for idx in range(count):
+                    comp_unit = self.sbmodule.GetCompileUnitAtIndex(idx)
+                    if is_full_path:
+                        if comp_unit.file.fullpath == key:
+                            return comp_unit
+                    else:
+                        if comp_unit.file.basename == key:
+                            return comp_unit
+            elif isinstance(key, self.re_compile_type):
+                matches = []
+                for idx in range(count):
+                    comp_unit = self.sbmodule.GetCompileUnitAtIndex(idx)
+                    fullpath = comp_unit.file.fullpath
+                    if fullpath:
+                        re_match = key.search(fullpath)
+                        if re_match:
+                            matches.append(comp_unit)
+                return matches
+            else:
+                print("error: unsupported item type: %s" % type(key))
+            return None
+
+    def get_sections_access_object(self):
+        '''An accessor function that returns a sections_access() object which allows lazy section array access.'''
+        return self.sections_access (self)
+
+    def get_sections_array(self):
+        '''An accessor function that returns an array object that contains all sections in this module object.'''
+        if not hasattr(self, 'sections_array'):
+            self.sections_array = []
+            for idx in range(self.num_sections):
+                self.sections_array.append(self.GetSectionAtIndex(idx))
+        return self.sections_array
+
+    def get_compile_units_array(self):
+        '''An accessor function that returns an array object that contains all compile_units in this module object.'''
+        if not hasattr(self, 'compile_units_array'):
+            self.compile_units_array = []
+            for idx in range(self.GetNumCompileUnits()):
+                self.compile_units_array.append(self.GetCompileUnitAtIndex(idx))
+        return self.compile_units_array
+
+    symbols = property(get_symbols_array, None, doc='''A read only property that returns a list() of lldb.SBSymbol objects contained in this module.''')
+    symbol = property(get_symbols_access_object, None, doc='''A read only property that can be used to access symbols by index ("symbol = module.symbol[0]"), name ("symbols = module.symbol['main']"), or using a regular expression ("symbols = module.symbol[re.compile(...)]"). The return value is a single lldb.SBSymbol object for array access, and a list() of lldb.SBSymbol objects for name and regular expression access''')
+    sections = property(get_sections_array, None, doc='''A read only property that returns a list() of lldb.SBSection objects contained in this module.''')
+    compile_units = property(get_compile_units_array, None, doc='''A read only property that returns a list() of lldb.SBCompileUnit objects contained in this module.''')
+    section = property(get_sections_access_object, None, doc='''A read only property that can be used to access symbols by index ("section = module.section[0]"), name ("sections = module.section[\'main\']"), or using a regular expression ("sections = module.section[re.compile(...)]"). The return value is a single lldb.SBSection object for array access, and a list() of lldb.SBSection objects for name and regular expression access''')
+    section = property(get_sections_access_object, None, doc='''A read only property that can be used to access compile units by index ("compile_unit = module.compile_unit[0]"), name ("compile_unit = module.compile_unit[\'main.cpp\']"), or using a regular expression ("compile_unit = module.compile_unit[re.compile(...)]"). The return value is a single lldb.SBCompileUnit object for array access or by full or partial path, and a list() of lldb.SBCompileUnit objects regular expressions.''')
+
+    def get_uuid(self):
+        return uuid.UUID (self.GetUUIDString())
+
+    uuid = property(get_uuid, None, doc='''A read only property that returns a standard python uuid.UUID object that represents the UUID of this module.''')
+    file = property(GetFileSpec, None, doc='''A read only property that returns an lldb object that represents the file (lldb.SBFileSpec) for this object file for this module as it is represented where it is being debugged.''')
+    platform_file = property(GetPlatformFileSpec, None, doc='''A read only property that returns an lldb object that represents the file (lldb.SBFileSpec) for this object file for this module as it is represented on the current host system.''')
+    byte_order = property(GetByteOrder, None, doc='''A read only property that returns an lldb enumeration value (lldb.eByteOrderLittle, lldb.eByteOrderBig, lldb.eByteOrderInvalid) that represents the byte order for this module.''')
+    addr_size = property(GetAddressByteSize, None, doc='''A read only property that returns the size in bytes of an address for this module.''')
+    triple = property(GetTriple, None, doc='''A read only property that returns the target triple (arch-vendor-os) for this module.''')
+    num_symbols = property(GetNumSymbols, None, doc='''A read only property that returns number of symbols in the module symbol table as an integer.''')
+    num_sections = property(GetNumSections, None, doc='''A read only property that returns number of sections in the module as an integer.''')
+
+
+
+    def __str__(self):
+        """__str__(SBModule self) -> PyObject *"""
+        return _lldb.SBModule___str__(self)
+
+
+    def __eq__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return False 
+
+        return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
+
+    def __ne__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return True 
+
+        return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
+
+SBModule_swigregister = _lldb.SBModule_swigregister
+SBModule_swigregister(SBModule)
+
+class SBModuleSpec(_object):
+    """Proxy of C++ lldb::SBModuleSpec class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBModuleSpec, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBModuleSpec, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBModuleSpec self) -> SBModuleSpec
+        __init__(lldb::SBModuleSpec self, SBModuleSpec rhs) -> SBModuleSpec
+        """
+        this = _lldb.new_SBModuleSpec(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBModuleSpec
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBModuleSpec self) -> bool"""
+        return _lldb.SBModuleSpec_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBModuleSpec___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def Clear(self):
+        """Clear(SBModuleSpec self)"""
+        return _lldb.SBModuleSpec_Clear(self)
+
+
+    def GetFileSpec(self):
+        """
+        GetFileSpec(SBModuleSpec self) -> SBFileSpec
+
+
+        Get const accessor for the module file.
+
+        This function returns the file for the module on the host system
+        that is running LLDB. This can differ from the path on the
+        platform since we might be doing remote debugging.
+
+        @return
+            A const reference to the file specification object.
+        """
+        return _lldb.SBModuleSpec_GetFileSpec(self)
+
+
+    def SetFileSpec(self, fspec):
+        """SetFileSpec(SBModuleSpec self, SBFileSpec fspec)"""
+        return _lldb.SBModuleSpec_SetFileSpec(self, fspec)
+
+
+    def GetPlatformFileSpec(self):
+        """
+        GetPlatformFileSpec(SBModuleSpec self) -> SBFileSpec
+
+
+        Get accessor for the module platform file.
+
+        Platform file refers to the path of the module as it is known on
+        the remote system on which it is being debugged. For local
+        debugging this is always the same as Module::GetFileSpec(). But
+        remote debugging might mention a file '/usr/lib/liba.dylib'
+        which might be locally downloaded and cached. In this case the
+        platform file could be something like:
+        '/tmp/lldb/platform-cache/remote.host.computer/usr/lib/liba.dylib'
+        The file could also be cached in a local developer kit directory.
+
+        @return
+            A const reference to the file specification object.
+        """
+        return _lldb.SBModuleSpec_GetPlatformFileSpec(self)
+
+
+    def SetPlatformFileSpec(self, fspec):
+        """SetPlatformFileSpec(SBModuleSpec self, SBFileSpec fspec)"""
+        return _lldb.SBModuleSpec_SetPlatformFileSpec(self, fspec)
+
+
+    def GetSymbolFileSpec(self):
+        """GetSymbolFileSpec(SBModuleSpec self) -> SBFileSpec"""
+        return _lldb.SBModuleSpec_GetSymbolFileSpec(self)
+
+
+    def SetSymbolFileSpec(self, fspec):
+        """SetSymbolFileSpec(SBModuleSpec self, SBFileSpec fspec)"""
+        return _lldb.SBModuleSpec_SetSymbolFileSpec(self, fspec)
+
+
+    def GetObjectName(self):
+        """GetObjectName(SBModuleSpec self) -> char const *"""
+        return _lldb.SBModuleSpec_GetObjectName(self)
+
+
+    def SetObjectName(self, name):
+        """SetObjectName(SBModuleSpec self, char const * name)"""
+        return _lldb.SBModuleSpec_SetObjectName(self, name)
+
+
+    def GetTriple(self):
+        """GetTriple(SBModuleSpec self) -> char const *"""
+        return _lldb.SBModuleSpec_GetTriple(self)
+
+
+    def SetTriple(self, triple):
+        """SetTriple(SBModuleSpec self, char const * triple)"""
+        return _lldb.SBModuleSpec_SetTriple(self, triple)
+
+
+    def GetUUIDBytes(self):
+        """GetUUIDBytes(SBModuleSpec self) -> uint8_t const *"""
+        return _lldb.SBModuleSpec_GetUUIDBytes(self)
+
+
+    def GetUUIDLength(self):
+        """GetUUIDLength(SBModuleSpec self) -> size_t"""
+        return _lldb.SBModuleSpec_GetUUIDLength(self)
+
+
+    def SetUUIDBytes(self, uuid, uuid_len):
+        """SetUUIDBytes(SBModuleSpec self, uint8_t const * uuid, size_t uuid_len) -> bool"""
+        return _lldb.SBModuleSpec_SetUUIDBytes(self, uuid, uuid_len)
+
+
+    def GetDescription(self, description):
+        """GetDescription(SBModuleSpec self, SBStream description) -> bool"""
+        return _lldb.SBModuleSpec_GetDescription(self, description)
+
+
+    def __str__(self):
+        """__str__(SBModuleSpec self) -> PyObject *"""
+        return _lldb.SBModuleSpec___str__(self)
+
+SBModuleSpec_swigregister = _lldb.SBModuleSpec_swigregister
+SBModuleSpec_swigregister(SBModuleSpec)
+
+class SBModuleSpecList(_object):
+    """Proxy of C++ lldb::SBModuleSpecList class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBModuleSpecList, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBModuleSpecList, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBModuleSpecList self) -> SBModuleSpecList
+        __init__(lldb::SBModuleSpecList self, SBModuleSpecList rhs) -> SBModuleSpecList
+        """
+        this = _lldb.new_SBModuleSpecList(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBModuleSpecList
+    __del__ = lambda self: None
+
+    def GetModuleSpecifications(path):
+        """GetModuleSpecifications(char const * path) -> SBModuleSpecList"""
+        return _lldb.SBModuleSpecList_GetModuleSpecifications(path)
+
+    GetModuleSpecifications = staticmethod(GetModuleSpecifications)
+
+    def Append(self, *args):
+        """
+        Append(SBModuleSpecList self, SBModuleSpec spec)
+        Append(SBModuleSpecList self, SBModuleSpecList spec_list)
+        """
+        return _lldb.SBModuleSpecList_Append(self, *args)
+
+
+    def FindFirstMatchingSpec(self, match_spec):
+        """FindFirstMatchingSpec(SBModuleSpecList self, SBModuleSpec match_spec) -> SBModuleSpec"""
+        return _lldb.SBModuleSpecList_FindFirstMatchingSpec(self, match_spec)
+
+
+    def FindMatchingSpecs(self, match_spec):
+        """FindMatchingSpecs(SBModuleSpecList self, SBModuleSpec match_spec) -> SBModuleSpecList"""
+        return _lldb.SBModuleSpecList_FindMatchingSpecs(self, match_spec)
+
+
+    def GetSize(self):
+        """GetSize(SBModuleSpecList self) -> size_t"""
+        return _lldb.SBModuleSpecList_GetSize(self)
+
+
+    def GetSpecAtIndex(self, i):
+        """GetSpecAtIndex(SBModuleSpecList self, size_t i) -> SBModuleSpec"""
+        return _lldb.SBModuleSpecList_GetSpecAtIndex(self, i)
+
+
+    def GetDescription(self, description):
+        """GetDescription(SBModuleSpecList self, SBStream description) -> bool"""
+        return _lldb.SBModuleSpecList_GetDescription(self, description)
+
+
+    def __str__(self):
+        """__str__(SBModuleSpecList self) -> PyObject *"""
+        return _lldb.SBModuleSpecList___str__(self)
+
+SBModuleSpecList_swigregister = _lldb.SBModuleSpecList_swigregister
+SBModuleSpecList_swigregister(SBModuleSpecList)
+
+def SBModuleSpecList_GetModuleSpecifications(path):
+    """SBModuleSpecList_GetModuleSpecifications(char const * path) -> SBModuleSpecList"""
+    return _lldb.SBModuleSpecList_GetModuleSpecifications(path)
+
+class SBPlatformConnectOptions(_object):
+    """Proxy of C++ lldb::SBPlatformConnectOptions class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBPlatformConnectOptions, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBPlatformConnectOptions, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBPlatformConnectOptions self, char const * url) -> SBPlatformConnectOptions
+        __init__(lldb::SBPlatformConnectOptions self, SBPlatformConnectOptions rhs) -> SBPlatformConnectOptions
+        """
+        this = _lldb.new_SBPlatformConnectOptions(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBPlatformConnectOptions
+    __del__ = lambda self: None
+
+    def GetURL(self):
+        """GetURL(SBPlatformConnectOptions self) -> char const *"""
+        return _lldb.SBPlatformConnectOptions_GetURL(self)
+
+
+    def SetURL(self, url):
+        """SetURL(SBPlatformConnectOptions self, char const * url)"""
+        return _lldb.SBPlatformConnectOptions_SetURL(self, url)
+
+
+    def GetRsyncEnabled(self):
+        """GetRsyncEnabled(SBPlatformConnectOptions self) -> bool"""
+        return _lldb.SBPlatformConnectOptions_GetRsyncEnabled(self)
+
+
+    def EnableRsync(self, options, remote_path_prefix, omit_remote_hostname):
+        """EnableRsync(SBPlatformConnectOptions self, char const * options, char const * remote_path_prefix, bool omit_remote_hostname)"""
+        return _lldb.SBPlatformConnectOptions_EnableRsync(self, options, remote_path_prefix, omit_remote_hostname)
+
+
+    def DisableRsync(self):
+        """DisableRsync(SBPlatformConnectOptions self)"""
+        return _lldb.SBPlatformConnectOptions_DisableRsync(self)
+
+
+    def GetLocalCacheDirectory(self):
+        """GetLocalCacheDirectory(SBPlatformConnectOptions self) -> char const *"""
+        return _lldb.SBPlatformConnectOptions_GetLocalCacheDirectory(self)
+
+
+    def SetLocalCacheDirectory(self, path):
+        """SetLocalCacheDirectory(SBPlatformConnectOptions self, char const * path)"""
+        return _lldb.SBPlatformConnectOptions_SetLocalCacheDirectory(self, path)
+
+SBPlatformConnectOptions_swigregister = _lldb.SBPlatformConnectOptions_swigregister
+SBPlatformConnectOptions_swigregister(SBPlatformConnectOptions)
+
+class SBPlatformShellCommand(_object):
+    """Proxy of C++ lldb::SBPlatformShellCommand class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBPlatformShellCommand, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBPlatformShellCommand, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBPlatformShellCommand self, char const * shell_command) -> SBPlatformShellCommand
+        __init__(lldb::SBPlatformShellCommand self, SBPlatformShellCommand rhs) -> SBPlatformShellCommand
+        """
+        this = _lldb.new_SBPlatformShellCommand(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBPlatformShellCommand
+    __del__ = lambda self: None
+
+    def Clear(self):
+        """Clear(SBPlatformShellCommand self)"""
+        return _lldb.SBPlatformShellCommand_Clear(self)
+
+
+    def GetCommand(self):
+        """GetCommand(SBPlatformShellCommand self) -> char const *"""
+        return _lldb.SBPlatformShellCommand_GetCommand(self)
+
+
+    def SetCommand(self, shell_command):
+        """SetCommand(SBPlatformShellCommand self, char const * shell_command)"""
+        return _lldb.SBPlatformShellCommand_SetCommand(self, shell_command)
+
+
+    def GetWorkingDirectory(self):
+        """GetWorkingDirectory(SBPlatformShellCommand self) -> char const *"""
+        return _lldb.SBPlatformShellCommand_GetWorkingDirectory(self)
+
+
+    def SetWorkingDirectory(self, path):
+        """SetWorkingDirectory(SBPlatformShellCommand self, char const * path)"""
+        return _lldb.SBPlatformShellCommand_SetWorkingDirectory(self, path)
+
+
+    def GetTimeoutSeconds(self):
+        """GetTimeoutSeconds(SBPlatformShellCommand self) -> uint32_t"""
+        return _lldb.SBPlatformShellCommand_GetTimeoutSeconds(self)
+
+
+    def SetTimeoutSeconds(self, sec):
+        """SetTimeoutSeconds(SBPlatformShellCommand self, uint32_t sec)"""
+        return _lldb.SBPlatformShellCommand_SetTimeoutSeconds(self, sec)
+
+
+    def GetSignal(self):
+        """GetSignal(SBPlatformShellCommand self) -> int"""
+        return _lldb.SBPlatformShellCommand_GetSignal(self)
+
+
+    def GetStatus(self):
+        """GetStatus(SBPlatformShellCommand self) -> int"""
+        return _lldb.SBPlatformShellCommand_GetStatus(self)
+
+
+    def GetOutput(self):
+        """GetOutput(SBPlatformShellCommand self) -> char const *"""
+        return _lldb.SBPlatformShellCommand_GetOutput(self)
+
+SBPlatformShellCommand_swigregister = _lldb.SBPlatformShellCommand_swigregister
+SBPlatformShellCommand_swigregister(SBPlatformShellCommand)
+
+class SBPlatform(_object):
+    """
+    A class that represents a platform that can represent the current host or a remote host debug platform.
+
+    The SBPlatform class represents the current host, or a remote host.
+    It can be connected to a remote platform in order to provide ways
+    to remotely launch and attach to processes, upload/download files,
+    create directories, run remote shell commands, find locally cached
+    versions of files from the remote system, and much more.
+
+    SBPlatform objects can be created and then used to connect to a remote
+    platform which allows the SBPlatform to be used to get a list of the
+    current processes on the remote host, attach to one of those processes,
+    install programs on the remote system, attach and launch processes,
+    and much more.
+
+    Every SBTarget has a corresponding SBPlatform. The platform can be
+    specified upon target creation, or the currently selected platform
+    will attempt to be used when creating the target automatically as long
+    as the currently selected platform matches the target architecture
+    and executable type. If the architecture or executable type do not match,
+    a suitable platform will be found automatically.
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBPlatform, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBPlatform, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBPlatform self) -> SBPlatform
+        __init__(lldb::SBPlatform self, char const * arg2) -> SBPlatform
+        """
+        this = _lldb.new_SBPlatform(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBPlatform
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBPlatform self) -> bool"""
+        return _lldb.SBPlatform_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBPlatform___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def Clear(self):
+        """Clear(SBPlatform self)"""
+        return _lldb.SBPlatform_Clear(self)
+
+
+    def GetWorkingDirectory(self):
+        """GetWorkingDirectory(SBPlatform self) -> char const *"""
+        return _lldb.SBPlatform_GetWorkingDirectory(self)
+
+
+    def SetWorkingDirectory(self, arg2):
+        """SetWorkingDirectory(SBPlatform self, char const * arg2) -> bool"""
+        return _lldb.SBPlatform_SetWorkingDirectory(self, arg2)
+
+
+    def GetName(self):
+        """GetName(SBPlatform self) -> char const *"""
+        return _lldb.SBPlatform_GetName(self)
+
+
+    def ConnectRemote(self, connect_options):
+        """ConnectRemote(SBPlatform self, SBPlatformConnectOptions connect_options) -> SBError"""
+        return _lldb.SBPlatform_ConnectRemote(self, connect_options)
+
+
+    def DisconnectRemote(self):
+        """DisconnectRemote(SBPlatform self)"""
+        return _lldb.SBPlatform_DisconnectRemote(self)
+
+
+    def IsConnected(self):
+        """IsConnected(SBPlatform self) -> bool"""
+        return _lldb.SBPlatform_IsConnected(self)
+
+
+    def GetTriple(self):
+        """GetTriple(SBPlatform self) -> char const *"""
+        return _lldb.SBPlatform_GetTriple(self)
+
+
+    def GetHostname(self):
+        """GetHostname(SBPlatform self) -> char const *"""
+        return _lldb.SBPlatform_GetHostname(self)
+
+
+    def GetOSBuild(self):
+        """GetOSBuild(SBPlatform self) -> char const *"""
+        return _lldb.SBPlatform_GetOSBuild(self)
+
+
+    def GetOSDescription(self):
+        """GetOSDescription(SBPlatform self) -> char const *"""
+        return _lldb.SBPlatform_GetOSDescription(self)
+
+
+    def GetOSMajorVersion(self):
+        """GetOSMajorVersion(SBPlatform self) -> uint32_t"""
+        return _lldb.SBPlatform_GetOSMajorVersion(self)
+
+
+    def GetOSMinorVersion(self):
+        """GetOSMinorVersion(SBPlatform self) -> uint32_t"""
+        return _lldb.SBPlatform_GetOSMinorVersion(self)
+
+
+    def GetOSUpdateVersion(self):
+        """GetOSUpdateVersion(SBPlatform self) -> uint32_t"""
+        return _lldb.SBPlatform_GetOSUpdateVersion(self)
+
+
+    def Get(self, src, dst):
+        """Get(SBPlatform self, SBFileSpec src, SBFileSpec dst) -> SBError"""
+        return _lldb.SBPlatform_Get(self, src, dst)
+
+
+    def Put(self, src, dst):
+        """Put(SBPlatform self, SBFileSpec src, SBFileSpec dst) -> SBError"""
+        return _lldb.SBPlatform_Put(self, src, dst)
+
+
+    def Install(self, src, dst):
+        """Install(SBPlatform self, SBFileSpec src, SBFileSpec dst) -> SBError"""
+        return _lldb.SBPlatform_Install(self, src, dst)
+
+
+    def Run(self, shell_command):
+        """Run(SBPlatform self, SBPlatformShellCommand shell_command) -> SBError"""
+        return _lldb.SBPlatform_Run(self, shell_command)
+
+
+    def Launch(self, launch_info):
+        """Launch(SBPlatform self, SBLaunchInfo launch_info) -> SBError"""
+        return _lldb.SBPlatform_Launch(self, launch_info)
+
+
+    def Kill(self, pid):
+        """Kill(SBPlatform self, lldb::pid_t const pid) -> SBError"""
+        return _lldb.SBPlatform_Kill(self, pid)
+
+
+    def MakeDirectory(self, *args):
+        """
+        MakeDirectory(SBPlatform self, char const * path, uint32_t file_permissions) -> SBError
+        MakeDirectory(SBPlatform self, char const * path) -> SBError
+        """
+        return _lldb.SBPlatform_MakeDirectory(self, *args)
+
+
+    def GetFilePermissions(self, path):
+        """GetFilePermissions(SBPlatform self, char const * path) -> uint32_t"""
+        return _lldb.SBPlatform_GetFilePermissions(self, path)
+
+
+    def SetFilePermissions(self, path, file_permissions):
+        """SetFilePermissions(SBPlatform self, char const * path, uint32_t file_permissions) -> SBError"""
+        return _lldb.SBPlatform_SetFilePermissions(self, path, file_permissions)
+
+
+    def GetUnixSignals(self):
+        """GetUnixSignals(SBPlatform self) -> SBUnixSignals"""
+        return _lldb.SBPlatform_GetUnixSignals(self)
+
+SBPlatform_swigregister = _lldb.SBPlatform_swigregister
+SBPlatform_swigregister(SBPlatform)
+
+class SBProcess(_object):
+    """
+    Represents the process associated with the target program.
+
+    SBProcess supports thread iteration. For example (from test/lldbutil.py),
+
+    # ==================================================
+    # Utility functions related to Threads and Processes
+    # ==================================================
+
+    def get_stopped_threads(process, reason):
+        '''Returns the thread(s) with the specified stop reason in a list.
+
+        The list can be empty if no such thread exists.
+        '''
+        threads = []
+        for t in process:
+            if t.GetStopReason() == reason:
+                threads.append(t)
+        return threads
+
+    ...
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBProcess, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBProcess, name)
+    __repr__ = _swig_repr
+    eBroadcastBitStateChanged = _lldb.SBProcess_eBroadcastBitStateChanged
+    eBroadcastBitInterrupt = _lldb.SBProcess_eBroadcastBitInterrupt
+    eBroadcastBitSTDOUT = _lldb.SBProcess_eBroadcastBitSTDOUT
+    eBroadcastBitSTDERR = _lldb.SBProcess_eBroadcastBitSTDERR
+    eBroadcastBitProfileData = _lldb.SBProcess_eBroadcastBitProfileData
+    eBroadcastBitStructuredData = _lldb.SBProcess_eBroadcastBitStructuredData
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBProcess self) -> SBProcess
+        __init__(lldb::SBProcess self, SBProcess rhs) -> SBProcess
+        """
+        this = _lldb.new_SBProcess(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBProcess
+    __del__ = lambda self: None
+
+    def GetBroadcasterClassName():
+        """GetBroadcasterClassName() -> char const *"""
+        return _lldb.SBProcess_GetBroadcasterClassName()
+
+    GetBroadcasterClassName = staticmethod(GetBroadcasterClassName)
+
+    def GetPluginName(self):
+        """GetPluginName(SBProcess self) -> char const *"""
+        return _lldb.SBProcess_GetPluginName(self)
+
+
+    def GetShortPluginName(self):
+        """GetShortPluginName(SBProcess self) -> char const *"""
+        return _lldb.SBProcess_GetShortPluginName(self)
+
+
+    def Clear(self):
+        """Clear(SBProcess self)"""
+        return _lldb.SBProcess_Clear(self)
+
+
+    def IsValid(self):
+        """IsValid(SBProcess self) -> bool"""
+        return _lldb.SBProcess_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBProcess___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetTarget(self):
+        """GetTarget(SBProcess self) -> SBTarget"""
+        return _lldb.SBProcess_GetTarget(self)
+
+
+    def GetByteOrder(self):
+        """GetByteOrder(SBProcess self) -> lldb::ByteOrder"""
+        return _lldb.SBProcess_GetByteOrder(self)
+
+
+    def PutSTDIN(self, src):
+        """
+
+        Writes data into the current process's stdin. API client specifies a Python
+        string as the only argument.
+        """
+        return _lldb.SBProcess_PutSTDIN(self, src)
+
+
+    def GetSTDOUT(self, dst):
+        """
+
+        Reads data from the current process's stdout stream. API client specifies
+        the size of the buffer to read data into. It returns the byte buffer in a
+        Python string.
+        """
+        return _lldb.SBProcess_GetSTDOUT(self, dst)
+
+
+    def GetSTDERR(self, dst):
+        """
+
+        Reads data from the current process's stderr stream. API client specifies
+        the size of the buffer to read data into. It returns the byte buffer in a
+        Python string.
+        """
+        return _lldb.SBProcess_GetSTDERR(self, dst)
+
+
+    def GetAsyncProfileData(self, dst):
+        """GetAsyncProfileData(SBProcess self, char * dst) -> size_t"""
+        return _lldb.SBProcess_GetAsyncProfileData(self, dst)
+
+
+    def ReportEventState(self, event, out):
+        """ReportEventState(SBProcess self, SBEvent event, FILE * out)"""
+        return _lldb.SBProcess_ReportEventState(self, event, out)
+
+
+    def AppendEventStateReport(self, event, result):
+        """AppendEventStateReport(SBProcess self, SBEvent event, SBCommandReturnObject result)"""
+        return _lldb.SBProcess_AppendEventStateReport(self, event, result)
+
+
+    def RemoteAttachToProcessWithID(self, pid, error):
+        """
+        RemoteAttachToProcessWithID(SBProcess self, lldb::pid_t pid, SBError error) -> bool
+
+
+        Remote connection related functions. These will fail if the
+        process is not in eStateConnected. They are intended for use
+        when connecting to an externally managed debugserver instance.
+        """
+        return _lldb.SBProcess_RemoteAttachToProcessWithID(self, pid, error)
+
+
+    def RemoteLaunch(self, argv, envp, stdin_path, stdout_path, stderr_path, working_directory, launch_flags, stop_at_entry, error):
+        """
+        RemoteLaunch(SBProcess self, char const ** argv, char const ** envp, char const * stdin_path, char const * stdout_path, char const * stderr_path, char const * working_directory, uint32_t launch_flags, bool stop_at_entry, SBError error) -> bool
+
+        See SBTarget.Launch for argument description and usage.
+        """
+        return _lldb.SBProcess_RemoteLaunch(self, argv, envp, stdin_path, stdout_path, stderr_path, working_directory, launch_flags, stop_at_entry, error)
+
+
+    def GetNumThreads(self):
+        """GetNumThreads(SBProcess self) -> uint32_t"""
+        return _lldb.SBProcess_GetNumThreads(self)
+
+
+    def GetThreadAtIndex(self, index):
+        """
+
+        Returns the INDEX'th thread from the list of current threads.  The index
+        of a thread is only valid for the current stop.  For a persistent thread
+        identifier use either the thread ID or the IndexID.  See help on SBThread
+        for more details.
+        """
+        return _lldb.SBProcess_GetThreadAtIndex(self, index)
+
+
+    def GetThreadByID(self, sb_thread_id):
+        """
+
+        Returns the thread with the given thread ID.
+        """
+        return _lldb.SBProcess_GetThreadByID(self, sb_thread_id)
+
+
+    def GetThreadByIndexID(self, index_id):
+        """
+
+        Returns the thread with the given thread IndexID.
+        """
+        return _lldb.SBProcess_GetThreadByIndexID(self, index_id)
+
+
+    def GetSelectedThread(self):
+        """
+
+        Returns the currently selected thread.
+        """
+        return _lldb.SBProcess_GetSelectedThread(self)
+
+
+    def CreateOSPluginThread(self, tid, context):
+        """
+
+        Lazily create a thread on demand through the current OperatingSystem plug-in, if the current OperatingSystem plug-in supports it.
+        """
+        return _lldb.SBProcess_CreateOSPluginThread(self, tid, context)
+
+
+    def SetSelectedThread(self, thread):
+        """SetSelectedThread(SBProcess self, SBThread thread) -> bool"""
+        return _lldb.SBProcess_SetSelectedThread(self, thread)
+
+
+    def SetSelectedThreadByID(self, tid):
+        """SetSelectedThreadByID(SBProcess self, lldb::tid_t tid) -> bool"""
+        return _lldb.SBProcess_SetSelectedThreadByID(self, tid)
+
+
+    def SetSelectedThreadByIndexID(self, index_id):
+        """SetSelectedThreadByIndexID(SBProcess self, uint32_t index_id) -> bool"""
+        return _lldb.SBProcess_SetSelectedThreadByIndexID(self, index_id)
+
+
+    def GetNumQueues(self):
+        """GetNumQueues(SBProcess self) -> uint32_t"""
+        return _lldb.SBProcess_GetNumQueues(self)
+
+
+    def GetQueueAtIndex(self, index):
+        """GetQueueAtIndex(SBProcess self, uint32_t index) -> SBQueue"""
+        return _lldb.SBProcess_GetQueueAtIndex(self, index)
+
+
+    def GetState(self):
+        """GetState(SBProcess self) -> lldb::StateType"""
+        return _lldb.SBProcess_GetState(self)
+
+
+    def GetExitStatus(self):
+        """GetExitStatus(SBProcess self) -> int"""
+        return _lldb.SBProcess_GetExitStatus(self)
+
+
+    def GetExitDescription(self):
+        """GetExitDescription(SBProcess self) -> char const *"""
+        return _lldb.SBProcess_GetExitDescription(self)
+
+
+    def GetProcessID(self):
+        """
+
+        Returns the process ID of the process.
+        """
+        return _lldb.SBProcess_GetProcessID(self)
+
+
+    def GetUniqueID(self):
+        """
+
+        Returns an integer ID that is guaranteed to be unique across all process instances. This is not the process ID, just a unique integer for comparison and caching purposes.
+        """
+        return _lldb.SBProcess_GetUniqueID(self)
+
+
+    def GetAddressByteSize(self):
+        """GetAddressByteSize(SBProcess self) -> uint32_t"""
+        return _lldb.SBProcess_GetAddressByteSize(self)
+
+
+    def Destroy(self):
+        """
+        Destroy(SBProcess self) -> SBError
+
+
+        Kills the process and shuts down all threads that were spawned to
+        track and monitor process.
+        """
+        return _lldb.SBProcess_Destroy(self)
+
+
+    def Continue(self):
+        """Continue(SBProcess self) -> SBError"""
+        return _lldb.SBProcess_Continue(self)
+
+
+    def Stop(self):
+        """Stop(SBProcess self) -> SBError"""
+        return _lldb.SBProcess_Stop(self)
+
+
+    def Kill(self):
+        """Kill(SBProcess self) -> SBError"""
+        return _lldb.SBProcess_Kill(self)
+
+
+    def Detach(self):
+        """Detach(SBProcess self) -> SBError"""
+        return _lldb.SBProcess_Detach(self)
+
+
+    def Signal(self, signal):
+        """
+        Signal(SBProcess self, int signal) -> SBError
+
+        Sends the process a unix signal.
+        """
+        return _lldb.SBProcess_Signal(self, signal)
+
+
+    def GetUnixSignals(self):
+        """GetUnixSignals(SBProcess self) -> SBUnixSignals"""
+        return _lldb.SBProcess_GetUnixSignals(self)
+
+
+    def GetStopID(self, include_expression_stops=False):
+        """
+        GetStopID(SBProcess self, bool include_expression_stops=False) -> uint32_t
+        GetStopID(SBProcess self) -> uint32_t
+
+
+        Returns a stop id that will increase every time the process executes.  If
+        include_expression_stops is true, then stops caused by expression evaluation
+        will cause the returned value to increase, otherwise the counter returned will
+        only increase when execution is continued explicitly by the user.  Note, the value
+        will always increase, but may increase by more than one per stop.
+        """
+        return _lldb.SBProcess_GetStopID(self, include_expression_stops)
+
+
+    def SendAsyncInterrupt(self):
+        """SendAsyncInterrupt(SBProcess self)"""
+        return _lldb.SBProcess_SendAsyncInterrupt(self)
+
+
+    def ReadMemory(self, addr, buf, error):
+        """
+
+        Reads memory from the current process's address space and removes any
+        traps that may have been inserted into the memory. It returns the byte
+        buffer in a Python string. Example:
+
+        # Read 4 bytes from address 'addr' and assume error.Success() is True.
+        content = process.ReadMemory(addr, 4, error)
+        new_bytes = bytearray(content)
+        """
+        return _lldb.SBProcess_ReadMemory(self, addr, buf, error)
+
+
+    def WriteMemory(self, addr, buf, error):
+        """
+
+        Writes memory to the current process's address space and maintains any
+        traps that might be present due to software breakpoints. Example:
+
+        # Create a Python string from the byte array.
+        new_value = str(bytes)
+        result = process.WriteMemory(addr, new_value, error)
+        if not error.Success() or result != len(bytes):
+            print('SBProcess.WriteMemory() failed!')
+        """
+        return _lldb.SBProcess_WriteMemory(self, addr, buf, error)
+
+
+    def ReadCStringFromMemory(self, addr, char_buf, error):
+        """
+
+        Reads a NULL terminated C string from the current process's address space.
+        It returns a python string of the exact length, or truncates the string if
+        the maximum character limit is reached. Example:
+
+        # Read a C string of at most 256 bytes from address '0x1000'
+        error = lldb.SBError()
+        cstring = process.ReadCStringFromMemory(0x1000, 256, error)
+        if error.Success():
+            print('cstring: ', cstring)
+        else
+            print('error: ', error)
+        """
+        return _lldb.SBProcess_ReadCStringFromMemory(self, addr, char_buf, error)
+
+
+    def ReadUnsignedFromMemory(self, addr, byte_size, error):
+        """
+
+        Reads an unsigned integer from memory given a byte size and an address.
+        Returns the unsigned integer that was read. Example:
+
+        # Read a 4 byte unsigned integer from address 0x1000
+        error = lldb.SBError()
+        uint = ReadUnsignedFromMemory(0x1000, 4, error)
+        if error.Success():
+            print('integer: %u' % uint)
+        else
+            print('error: ', error)
+        """
+        return _lldb.SBProcess_ReadUnsignedFromMemory(self, addr, byte_size, error)
+
+
+    def ReadPointerFromMemory(self, addr, error):
+        """
+
+        Reads a pointer from memory from an address and returns the value. Example:
+
+        # Read a pointer from address 0x1000
+        error = lldb.SBError()
+        ptr = ReadPointerFromMemory(0x1000, error)
+        if error.Success():
+            print('pointer: 0x%x' % ptr)
+        else
+            print('error: ', error)
+        """
+        return _lldb.SBProcess_ReadPointerFromMemory(self, addr, error)
+
+
+    def GetStateFromEvent(event):
+        """GetStateFromEvent(SBEvent event) -> lldb::StateType"""
+        return _lldb.SBProcess_GetStateFromEvent(event)
+
+    GetStateFromEvent = staticmethod(GetStateFromEvent)
+
+    def GetRestartedFromEvent(event):
+        """GetRestartedFromEvent(SBEvent event) -> bool"""
+        return _lldb.SBProcess_GetRestartedFromEvent(event)
+
+    GetRestartedFromEvent = staticmethod(GetRestartedFromEvent)
+
+    def GetNumRestartedReasonsFromEvent(event):
+        """GetNumRestartedReasonsFromEvent(SBEvent event) -> size_t"""
+        return _lldb.SBProcess_GetNumRestartedReasonsFromEvent(event)
+
+    GetNumRestartedReasonsFromEvent = staticmethod(GetNumRestartedReasonsFromEvent)
+
+    def GetRestartedReasonAtIndexFromEvent(event, idx):
+        """GetRestartedReasonAtIndexFromEvent(SBEvent event, size_t idx) -> char const *"""
+        return _lldb.SBProcess_GetRestartedReasonAtIndexFromEvent(event, idx)
+
+    GetRestartedReasonAtIndexFromEvent = staticmethod(GetRestartedReasonAtIndexFromEvent)
+
+    def GetProcessFromEvent(event):
+        """GetProcessFromEvent(SBEvent event) -> SBProcess"""
+        return _lldb.SBProcess_GetProcessFromEvent(event)
+
+    GetProcessFromEvent = staticmethod(GetProcessFromEvent)
+
+    def GetInterruptedFromEvent(event):
+        """GetInterruptedFromEvent(SBEvent event) -> bool"""
+        return _lldb.SBProcess_GetInterruptedFromEvent(event)
+
+    GetInterruptedFromEvent = staticmethod(GetInterruptedFromEvent)
+
+    def GetStructuredDataFromEvent(event):
+        """GetStructuredDataFromEvent(SBEvent event) -> SBStructuredData"""
+        return _lldb.SBProcess_GetStructuredDataFromEvent(event)
+
+    GetStructuredDataFromEvent = staticmethod(GetStructuredDataFromEvent)
+
+    def EventIsProcessEvent(event):
+        """EventIsProcessEvent(SBEvent event) -> bool"""
+        return _lldb.SBProcess_EventIsProcessEvent(event)
+
+    EventIsProcessEvent = staticmethod(EventIsProcessEvent)
+
+    def EventIsStructuredDataEvent(event):
+        """EventIsStructuredDataEvent(SBEvent event) -> bool"""
+        return _lldb.SBProcess_EventIsStructuredDataEvent(event)
+
+    EventIsStructuredDataEvent = staticmethod(EventIsStructuredDataEvent)
+
+    def GetBroadcaster(self):
+        """GetBroadcaster(SBProcess self) -> SBBroadcaster"""
+        return _lldb.SBProcess_GetBroadcaster(self)
+
+
+    def GetDescription(self, description):
+        """GetDescription(SBProcess self, SBStream description) -> bool"""
+        return _lldb.SBProcess_GetDescription(self, description)
+
+
+    def GetNumSupportedHardwareWatchpoints(self, error):
+        """GetNumSupportedHardwareWatchpoints(SBProcess self, SBError error) -> uint32_t"""
+        return _lldb.SBProcess_GetNumSupportedHardwareWatchpoints(self, error)
+
+
+    def LoadImage(self, image_spec, error):
+        """LoadImage(SBProcess self, SBFileSpec image_spec, SBError error) -> uint32_t"""
+        return _lldb.SBProcess_LoadImage(self, image_spec, error)
+
+
+    def LoadImageUsingPaths(self, image_spec, paths, loaded_path, error):
+        """
+
+        Load the library whose filename is given by image_spec looking in all the
+        paths supplied in the paths argument.  If successful, return a token that
+        can be passed to UnloadImage and fill loaded_path with the path that was
+        successfully loaded.  On failure, return
+        lldb.LLDB_INVALID_IMAGE_TOKEN.
+        """
+        return _lldb.SBProcess_LoadImageUsingPaths(self, image_spec, paths, loaded_path, error)
+
+
+    def UnloadImage(self, image_token):
+        """UnloadImage(SBProcess self, uint32_t image_token) -> SBError"""
+        return _lldb.SBProcess_UnloadImage(self, image_token)
+
+
+    def SendEventData(self, event_data):
+        """SendEventData(SBProcess self, char const * event_data) -> SBError"""
+        return _lldb.SBProcess_SendEventData(self, event_data)
+
+
+    def GetNumExtendedBacktraceTypes(self):
+        """
+
+        Return the number of different thread-origin extended backtraces
+        this process can support as a uint32_t.
+        When the process is stopped and you have an SBThread, lldb may be
+        able to show a backtrace of when that thread was originally created,
+        or the work item was enqueued to it (in the case of a libdispatch
+        queue).
+        """
+        return _lldb.SBProcess_GetNumExtendedBacktraceTypes(self)
+
+
+    def GetExtendedBacktraceTypeAtIndex(self, idx):
+        """
+
+        Takes an index argument, returns the name of one of the thread-origin
+        extended backtrace methods as a str.
+        """
+        return _lldb.SBProcess_GetExtendedBacktraceTypeAtIndex(self, idx)
+
+
+    def GetHistoryThreads(self, addr):
+        """GetHistoryThreads(SBProcess self, lldb::addr_t addr) -> SBThreadCollection"""
+        return _lldb.SBProcess_GetHistoryThreads(self, addr)
+
+
+    def IsInstrumentationRuntimePresent(self, type):
+        """IsInstrumentationRuntimePresent(SBProcess self, lldb::InstrumentationRuntimeType type) -> bool"""
+        return _lldb.SBProcess_IsInstrumentationRuntimePresent(self, type)
+
+
+    def SaveCore(self, file_name):
+        """SaveCore(SBProcess self, char const * file_name) -> SBError"""
+        return _lldb.SBProcess_SaveCore(self, file_name)
+
+
+    def StartTrace(self, options, error):
+        """StartTrace(SBProcess self, SBTraceOptions options, SBError error) -> SBTrace"""
+        return _lldb.SBProcess_StartTrace(self, options, error)
+
+
+    def GetMemoryRegionInfo(self, load_addr, region_info):
+        """GetMemoryRegionInfo(SBProcess self, lldb::addr_t load_addr, SBMemoryRegionInfo region_info) -> SBError"""
+        return _lldb.SBProcess_GetMemoryRegionInfo(self, load_addr, region_info)
+
+
+    def GetMemoryRegions(self):
+        """GetMemoryRegions(SBProcess self) -> SBMemoryRegionInfoList"""
+        return _lldb.SBProcess_GetMemoryRegions(self)
+
+
+    def GetProcessInfo(self):
+        """
+
+        Get information about the process.
+        Valid process info will only be returned when the process is alive,
+        use IsValid() to check if the info returned is valid.
+
+        process_info = process.GetProcessInfo()
+        if process_info.IsValid():
+            process_info.GetProcessID()
+        """
+        return _lldb.SBProcess_GetProcessInfo(self)
+
+
+    def __get_is_alive__(self):
+        '''Returns "True" if the process is currently alive, "False" otherwise'''
+        s = self.GetState()
+        if (s == eStateAttaching or
+            s == eStateLaunching or
+            s == eStateStopped or
+            s == eStateRunning or
+            s == eStateStepping or
+            s == eStateCrashed or
+            s == eStateSuspended):
+            return True
+        return False
+
+    def __get_is_running__(self):
+        '''Returns "True" if the process is currently running, "False" otherwise'''
+        state = self.GetState()
+        if state == eStateRunning or state == eStateStepping:
+            return True
+        return False
+
+    def __get_is_stopped__(self):
+        '''Returns "True" if the process is currently stopped, "False" otherwise'''
+        state = self.GetState()
+        if state == eStateStopped or state == eStateCrashed or state == eStateSuspended:
+            return True
+        return False
+
+    class threads_access(object):
+        '''A helper object that will lazily hand out thread for a process when supplied an index.'''
+        def __init__(self, sbprocess):
+            self.sbprocess = sbprocess
+
+        def __len__(self):
+            if self.sbprocess:
+                return int(self.sbprocess.GetNumThreads())
+            return 0
+
+        def __getitem__(self, key):
+            if type(key) is int and key < len(self):
+                return self.sbprocess.GetThreadAtIndex(key)
+            return None
+
+    def get_threads_access_object(self):
+        '''An accessor function that returns a modules_access() object which allows lazy thread access from a lldb.SBProcess object.'''
+        return self.threads_access (self)
+
+    def get_process_thread_list(self):
+        '''An accessor function that returns a list() that contains all threads in a lldb.SBProcess object.'''
+        threads = []
+        accessor = self.get_threads_access_object()
+        for idx in range(len(accessor)):
+            threads.append(accessor[idx])
+        return threads
+
+    def __iter__(self):
+        '''Iterate over all threads in a lldb.SBProcess object.'''
+        return lldb_iter(self, 'GetNumThreads', 'GetThreadAtIndex')
+
+    def __len__(self):
+        '''Return the number of threads in a lldb.SBProcess object.'''
+        return self.GetNumThreads()
+
+
+    threads = property(get_process_thread_list, None, doc='''A read only property that returns a list() of lldb.SBThread objects for this process.''')
+    thread = property(get_threads_access_object, None, doc='''A read only property that returns an object that can access threads by thread index (thread = lldb.process.thread[12]).''')
+    is_alive = property(__get_is_alive__, None, doc='''A read only property that returns a boolean value that indicates if this process is currently alive.''')
+    is_running = property(__get_is_running__, None, doc='''A read only property that returns a boolean value that indicates if this process is currently running.''')
+    is_stopped = property(__get_is_stopped__, None, doc='''A read only property that returns a boolean value that indicates if this process is currently stopped.''')
+    id = property(GetProcessID, None, doc='''A read only property that returns the process ID as an integer.''')
+    target = property(GetTarget, None, doc='''A read only property that an lldb object that represents the target (lldb.SBTarget) that owns this process.''')
+    num_threads = property(GetNumThreads, None, doc='''A read only property that returns the number of threads in this process as an integer.''')
+    selected_thread = property(GetSelectedThread, SetSelectedThread, doc='''A read/write property that gets/sets the currently selected thread in this process. The getter returns a lldb.SBThread object and the setter takes an lldb.SBThread object.''')
+    state = property(GetState, None, doc='''A read only property that returns an lldb enumeration value (see enumerations that start with "lldb.eState") that represents the current state of this process (running, stopped, exited, etc.).''')
+    exit_state = property(GetExitStatus, None, doc='''A read only property that returns an exit status as an integer of this process when the process state is lldb.eStateExited.''')
+    exit_description = property(GetExitDescription, None, doc='''A read only property that returns an exit description as a string of this process when the process state is lldb.eStateExited.''')
+    broadcaster = property(GetBroadcaster, None, doc='''A read only property that an lldb object that represents the broadcaster (lldb.SBBroadcaster) for this process.''')
+
+
+    def __str__(self):
+        """__str__(SBProcess self) -> PyObject *"""
+        return _lldb.SBProcess___str__(self)
+
+SBProcess_swigregister = _lldb.SBProcess_swigregister
+SBProcess_swigregister(SBProcess)
+
+def SBProcess_GetBroadcasterClassName():
+    """SBProcess_GetBroadcasterClassName() -> char const *"""
+    return _lldb.SBProcess_GetBroadcasterClassName()
+
+def SBProcess_GetStateFromEvent(event):
+    """SBProcess_GetStateFromEvent(SBEvent event) -> lldb::StateType"""
+    return _lldb.SBProcess_GetStateFromEvent(event)
+
+def SBProcess_GetRestartedFromEvent(event):
+    """SBProcess_GetRestartedFromEvent(SBEvent event) -> bool"""
+    return _lldb.SBProcess_GetRestartedFromEvent(event)
+
+def SBProcess_GetNumRestartedReasonsFromEvent(event):
+    """SBProcess_GetNumRestartedReasonsFromEvent(SBEvent event) -> size_t"""
+    return _lldb.SBProcess_GetNumRestartedReasonsFromEvent(event)
+
+def SBProcess_GetRestartedReasonAtIndexFromEvent(event, idx):
+    """SBProcess_GetRestartedReasonAtIndexFromEvent(SBEvent event, size_t idx) -> char const *"""
+    return _lldb.SBProcess_GetRestartedReasonAtIndexFromEvent(event, idx)
+
+def SBProcess_GetProcessFromEvent(event):
+    """SBProcess_GetProcessFromEvent(SBEvent event) -> SBProcess"""
+    return _lldb.SBProcess_GetProcessFromEvent(event)
+
+def SBProcess_GetInterruptedFromEvent(event):
+    """SBProcess_GetInterruptedFromEvent(SBEvent event) -> bool"""
+    return _lldb.SBProcess_GetInterruptedFromEvent(event)
+
+def SBProcess_GetStructuredDataFromEvent(event):
+    """SBProcess_GetStructuredDataFromEvent(SBEvent event) -> SBStructuredData"""
+    return _lldb.SBProcess_GetStructuredDataFromEvent(event)
+
+def SBProcess_EventIsProcessEvent(event):
+    """SBProcess_EventIsProcessEvent(SBEvent event) -> bool"""
+    return _lldb.SBProcess_EventIsProcessEvent(event)
+
+def SBProcess_EventIsStructuredDataEvent(event):
+    """SBProcess_EventIsStructuredDataEvent(SBEvent event) -> bool"""
+    return _lldb.SBProcess_EventIsStructuredDataEvent(event)
+
+class SBProcessInfo(_object):
+    """
+    Describes an existing process and any discoverable information that pertains to
+    that process.
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBProcessInfo, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBProcessInfo, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBProcessInfo self) -> SBProcessInfo
+        __init__(lldb::SBProcessInfo self, SBProcessInfo rhs) -> SBProcessInfo
+        """
+        this = _lldb.new_SBProcessInfo(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBProcessInfo
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBProcessInfo self) -> bool"""
+        return _lldb.SBProcessInfo_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBProcessInfo___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetName(self):
+        """GetName(SBProcessInfo self) -> char const *"""
+        return _lldb.SBProcessInfo_GetName(self)
+
+
+    def GetExecutableFile(self):
+        """GetExecutableFile(SBProcessInfo self) -> SBFileSpec"""
+        return _lldb.SBProcessInfo_GetExecutableFile(self)
+
+
+    def GetProcessID(self):
+        """GetProcessID(SBProcessInfo self) -> lldb::pid_t"""
+        return _lldb.SBProcessInfo_GetProcessID(self)
+
+
+    def GetUserID(self):
+        """GetUserID(SBProcessInfo self) -> uint32_t"""
+        return _lldb.SBProcessInfo_GetUserID(self)
+
+
+    def GetGroupID(self):
+        """GetGroupID(SBProcessInfo self) -> uint32_t"""
+        return _lldb.SBProcessInfo_GetGroupID(self)
+
+
+    def UserIDIsValid(self):
+        """UserIDIsValid(SBProcessInfo self) -> bool"""
+        return _lldb.SBProcessInfo_UserIDIsValid(self)
+
+
+    def GroupIDIsValid(self):
+        """GroupIDIsValid(SBProcessInfo self) -> bool"""
+        return _lldb.SBProcessInfo_GroupIDIsValid(self)
+
+
+    def GetEffectiveUserID(self):
+        """GetEffectiveUserID(SBProcessInfo self) -> uint32_t"""
+        return _lldb.SBProcessInfo_GetEffectiveUserID(self)
+
+
+    def GetEffectiveGroupID(self):
+        """GetEffectiveGroupID(SBProcessInfo self) -> uint32_t"""
+        return _lldb.SBProcessInfo_GetEffectiveGroupID(self)
+
+
+    def EffectiveUserIDIsValid(self):
+        """EffectiveUserIDIsValid(SBProcessInfo self) -> bool"""
+        return _lldb.SBProcessInfo_EffectiveUserIDIsValid(self)
+
+
+    def EffectiveGroupIDIsValid(self):
+        """EffectiveGroupIDIsValid(SBProcessInfo self) -> bool"""
+        return _lldb.SBProcessInfo_EffectiveGroupIDIsValid(self)
+
+
+    def GetParentProcessID(self):
+        """GetParentProcessID(SBProcessInfo self) -> lldb::pid_t"""
+        return _lldb.SBProcessInfo_GetParentProcessID(self)
+
+SBProcessInfo_swigregister = _lldb.SBProcessInfo_swigregister
+SBProcessInfo_swigregister(SBProcessInfo)
+
+class SBQueue(_object):
+    """Proxy of C++ lldb::SBQueue class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBQueue, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBQueue, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBQueue self) -> SBQueue
+        __init__(lldb::SBQueue self, lldb::QueueSP const & queue_sp) -> SBQueue
+        """
+        this = _lldb.new_SBQueue(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBQueue
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBQueue self) -> bool"""
+        return _lldb.SBQueue_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBQueue___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def Clear(self):
+        """Clear(SBQueue self)"""
+        return _lldb.SBQueue_Clear(self)
+
+
+    def GetProcess(self):
+        """GetProcess(SBQueue self) -> SBProcess"""
+        return _lldb.SBQueue_GetProcess(self)
+
+
+    def GetQueueID(self):
+        """
+
+        Returns an lldb::queue_id_t type unique identifier number for this
+        queue that will not be used by any other queue during this process'
+        execution.  These ID numbers often start at 1 with the first
+        system-created queues and increment from there.
+        """
+        return _lldb.SBQueue_GetQueueID(self)
+
+
+    def GetName(self):
+        """GetName(SBQueue self) -> char const *"""
+        return _lldb.SBQueue_GetName(self)
+
+
+    def GetKind(self):
+        """
+
+        Returns an lldb::QueueKind enumerated value (e.g. eQueueKindUnknown,
+        eQueueKindSerial, eQueueKindConcurrent) describing the type of this
+        queue.
+        """
+        return _lldb.SBQueue_GetKind(self)
+
+
+    def GetIndexID(self):
+        """GetIndexID(SBQueue self) -> uint32_t"""
+        return _lldb.SBQueue_GetIndexID(self)
+
+
+    def GetNumThreads(self):
+        """GetNumThreads(SBQueue self) -> uint32_t"""
+        return _lldb.SBQueue_GetNumThreads(self)
+
+
+    def GetThreadAtIndex(self, arg2):
+        """GetThreadAtIndex(SBQueue self, uint32_t arg2) -> SBThread"""
+        return _lldb.SBQueue_GetThreadAtIndex(self, arg2)
+
+
+    def GetNumPendingItems(self):
+        """GetNumPendingItems(SBQueue self) -> uint32_t"""
+        return _lldb.SBQueue_GetNumPendingItems(self)
+
+
+    def GetPendingItemAtIndex(self, arg2):
+        """GetPendingItemAtIndex(SBQueue self, uint32_t arg2) -> SBQueueItem"""
+        return _lldb.SBQueue_GetPendingItemAtIndex(self, arg2)
+
+
+    def GetNumRunningItems(self):
+        """GetNumRunningItems(SBQueue self) -> uint32_t"""
+        return _lldb.SBQueue_GetNumRunningItems(self)
+
+SBQueue_swigregister = _lldb.SBQueue_swigregister
+SBQueue_swigregister(SBQueue)
+
+class SBQueueItem(_object):
+    """Proxy of C++ lldb::SBQueueItem class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBQueueItem, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBQueueItem, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBQueueItem self) -> SBQueueItem
+        __init__(lldb::SBQueueItem self, lldb::QueueItemSP const & queue_item_sp) -> SBQueueItem
+        """
+        this = _lldb.new_SBQueueItem(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBQueueItem
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBQueueItem self) -> bool"""
+        return _lldb.SBQueueItem_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBQueueItem___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def Clear(self):
+        """Clear(SBQueueItem self)"""
+        return _lldb.SBQueueItem_Clear(self)
+
+
+    def GetKind(self):
+        """GetKind(SBQueueItem self) -> lldb::QueueItemKind"""
+        return _lldb.SBQueueItem_GetKind(self)
+
+
+    def SetKind(self, kind):
+        """SetKind(SBQueueItem self, lldb::QueueItemKind kind)"""
+        return _lldb.SBQueueItem_SetKind(self, kind)
+
+
+    def GetAddress(self):
+        """GetAddress(SBQueueItem self) -> SBAddress"""
+        return _lldb.SBQueueItem_GetAddress(self)
+
+
+    def SetAddress(self, addr):
+        """SetAddress(SBQueueItem self, SBAddress addr)"""
+        return _lldb.SBQueueItem_SetAddress(self, addr)
+
+
+    def SetQueueItem(self, queue_item_sp):
+        """SetQueueItem(SBQueueItem self, lldb::QueueItemSP const & queue_item_sp)"""
+        return _lldb.SBQueueItem_SetQueueItem(self, queue_item_sp)
+
+
+    def GetExtendedBacktraceThread(self, type):
+        """GetExtendedBacktraceThread(SBQueueItem self, char const * type) -> SBThread"""
+        return _lldb.SBQueueItem_GetExtendedBacktraceThread(self, type)
+
+SBQueueItem_swigregister = _lldb.SBQueueItem_swigregister
+SBQueueItem_swigregister(SBQueueItem)
+
+class SBSection(_object):
+    """
+    Represents an executable image section.
+
+    SBSection supports iteration through its subsection, represented as SBSection
+    as well.  For example,
+
+        for sec in exe_module:
+            if sec.GetName() == '__TEXT':
+                print sec
+                break
+        print INDENT + 'Number of subsections: %d' % sec.GetNumSubSections()
+        for subsec in sec:
+            print INDENT + repr(subsec)
+
+    produces:
+
+    [0x0000000100000000-0x0000000100002000) a.out.__TEXT
+        Number of subsections: 6
+        [0x0000000100001780-0x0000000100001d5c) a.out.__TEXT.__text
+        [0x0000000100001d5c-0x0000000100001da4) a.out.__TEXT.__stubs
+        [0x0000000100001da4-0x0000000100001e2c) a.out.__TEXT.__stub_helper
+        [0x0000000100001e2c-0x0000000100001f10) a.out.__TEXT.__cstring
+        [0x0000000100001f10-0x0000000100001f68) a.out.__TEXT.__unwind_info
+        [0x0000000100001f68-0x0000000100001ff8) a.out.__TEXT.__eh_frame
+
+    See also SBModule.
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBSection, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBSection, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBSection self) -> SBSection
+        __init__(lldb::SBSection self, SBSection rhs) -> SBSection
+        """
+        this = _lldb.new_SBSection(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBSection
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBSection self) -> bool"""
+        return _lldb.SBSection_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBSection___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetName(self):
+        """GetName(SBSection self) -> char const *"""
+        return _lldb.SBSection_GetName(self)
+
+
+    def GetParent(self):
+        """GetParent(SBSection self) -> SBSection"""
+        return _lldb.SBSection_GetParent(self)
+
+
+    def FindSubSection(self, sect_name):
+        """FindSubSection(SBSection self, char const * sect_name) -> SBSection"""
+        return _lldb.SBSection_FindSubSection(self, sect_name)
+
+
+    def GetNumSubSections(self):
+        """GetNumSubSections(SBSection self) -> size_t"""
+        return _lldb.SBSection_GetNumSubSections(self)
+
+
+    def GetSubSectionAtIndex(self, idx):
+        """GetSubSectionAtIndex(SBSection self, size_t idx) -> SBSection"""
+        return _lldb.SBSection_GetSubSectionAtIndex(self, idx)
+
+
+    def GetFileAddress(self):
+        """GetFileAddress(SBSection self) -> lldb::addr_t"""
+        return _lldb.SBSection_GetFileAddress(self)
+
+
+    def GetLoadAddress(self, target):
+        """GetLoadAddress(SBSection self, SBTarget target) -> lldb::addr_t"""
+        return _lldb.SBSection_GetLoadAddress(self, target)
+
+
+    def GetByteSize(self):
+        """GetByteSize(SBSection self) -> lldb::addr_t"""
+        return _lldb.SBSection_GetByteSize(self)
+
+
+    def GetFileOffset(self):
+        """GetFileOffset(SBSection self) -> uint64_t"""
+        return _lldb.SBSection_GetFileOffset(self)
+
+
+    def GetFileByteSize(self):
+        """GetFileByteSize(SBSection self) -> uint64_t"""
+        return _lldb.SBSection_GetFileByteSize(self)
+
+
+    def GetSectionData(self, *args):
+        """
+        GetSectionData(SBSection self) -> SBData
+        GetSectionData(SBSection self, uint64_t offset, uint64_t size) -> SBData
+        """
+        return _lldb.SBSection_GetSectionData(self, *args)
+
+
+    def GetSectionType(self):
+        """GetSectionType(SBSection self) -> lldb::SectionType"""
+        return _lldb.SBSection_GetSectionType(self)
+
+
+    def GetPermissions(self):
+        """GetPermissions(SBSection self) -> uint32_t"""
+        return _lldb.SBSection_GetPermissions(self)
+
+
+    def GetTargetByteSize(self):
+        """
+        GetTargetByteSize(SBSection self) -> uint32_t
+
+
+        Return the size of a target's byte represented by this section
+        in numbers of host bytes. Note that certain architectures have
+        varying minimum addressable unit (i.e. byte) size for their
+        CODE or DATA buses.
+
+        @return
+            The number of host (8-bit) bytes needed to hold a target byte
+        """
+        return _lldb.SBSection_GetTargetByteSize(self)
+
+
+    def GetDescription(self, description):
+        """GetDescription(SBSection self, SBStream description) -> bool"""
+        return _lldb.SBSection_GetDescription(self, description)
+
+
+    def __eq__(self, rhs):
+        """__eq__(SBSection self, SBSection rhs) -> bool"""
+        return _lldb.SBSection___eq__(self, rhs)
+
+
+    def __ne__(self, rhs):
+        """__ne__(SBSection self, SBSection rhs) -> bool"""
+        return _lldb.SBSection___ne__(self, rhs)
+
+
+    def __iter__(self):
+        '''Iterate over all subsections in a lldb.SBSection object.'''
+        return lldb_iter(self, 'GetNumSubSections', 'GetSubSectionAtIndex')
+
+    def __len__(self):
+        '''Return the number of subsections in a lldb.SBSection object.'''
+        return self.GetNumSubSections()
+
+    def get_addr(self):
+        return SBAddress(self, 0)
+
+    name = property(GetName, None, doc='''A read only property that returns the name of this section as a string.''')
+    addr = property(get_addr, None, doc='''A read only property that returns an lldb object that represents the start address (lldb.SBAddress) for this section.''')
+    file_addr = property(GetFileAddress, None, doc='''A read only property that returns an integer that represents the starting "file" address for this section, or the address of the section in the object file in which it is defined.''')
+    size = property(GetByteSize, None, doc='''A read only property that returns the size in bytes of this section as an integer.''')
+    file_offset = property(GetFileOffset, None, doc='''A read only property that returns the file offset in bytes of this section as an integer.''')
+    file_size = property(GetFileByteSize, None, doc='''A read only property that returns the file size in bytes of this section as an integer.''')
+    data = property(GetSectionData, None, doc='''A read only property that returns an lldb object that represents the bytes for this section (lldb.SBData) for this section.''')
+    type = property(GetSectionType, None, doc='''A read only property that returns an lldb enumeration value (see enumerations that start with "lldb.eSectionType") that represents the type of this section (code, data, etc.).''')
+    target_byte_size = property(GetTargetByteSize, None, doc='''A read only property that returns the size of a target byte represented by this section as a number of host bytes.''')
+
+
+    def __str__(self):
+        """__str__(SBSection self) -> PyObject *"""
+        return _lldb.SBSection___str__(self)
+
+
+    def __eq__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return False 
+
+        return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
+
+    def __ne__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return True 
+
+        return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
+
+SBSection_swigregister = _lldb.SBSection_swigregister
+SBSection_swigregister(SBSection)
+
+class SBSourceManager(_object):
+    """
+    Represents a central authority for displaying source code.
+
+    For example (from test/source-manager/TestSourceManager.py),
+
+            # Create the filespec for 'main.c'.
+            filespec = lldb.SBFileSpec('main.c', False)
+            source_mgr = self.dbg.GetSourceManager()
+            # Use a string stream as the destination.
+            stream = lldb.SBStream()
+            source_mgr.DisplaySourceLinesWithLineNumbers(filespec,
+                                                         self.line,
+                                                         2, # context before
+                                                         2, # context after
+                                                         '=>', # prefix for current line
+                                                         stream)
+
+            #    2
+            #    3    int main(int argc, char const *argv[]) {
+            # => 4        printf('Hello world.\n'); // Set break point at this line.
+            #    5        return 0;
+            #    6    }
+            self.expect(stream.GetData(), 'Source code displayed correctly',
+                        exe=False,
+                patterns = ['=> %d.*Hello world' % self.line])
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBSourceManager, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBSourceManager, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, rhs):
+        """__init__(lldb::SBSourceManager self, SBSourceManager rhs) -> SBSourceManager"""
+        this = _lldb.new_SBSourceManager(rhs)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBSourceManager
+    __del__ = lambda self: None
+
+    def DisplaySourceLinesWithLineNumbers(self, file, line, context_before, context_after, current_line_cstr, s):
+        """DisplaySourceLinesWithLineNumbers(SBSourceManager self, SBFileSpec file, uint32_t line, uint32_t context_before, uint32_t context_after, char const * current_line_cstr, SBStream s) -> size_t"""
+        return _lldb.SBSourceManager_DisplaySourceLinesWithLineNumbers(self, file, line, context_before, context_after, current_line_cstr, s)
+
+
+    def DisplaySourceLinesWithLineNumbersAndColumn(self, file, line, column, context_before, context_after, current_line_cstr, s):
+        """DisplaySourceLinesWithLineNumbersAndColumn(SBSourceManager self, SBFileSpec file, uint32_t line, uint32_t column, uint32_t context_before, uint32_t context_after, char const * current_line_cstr, SBStream s) -> size_t"""
+        return _lldb.SBSourceManager_DisplaySourceLinesWithLineNumbersAndColumn(self, file, line, column, context_before, context_after, current_line_cstr, s)
+
+SBSourceManager_swigregister = _lldb.SBSourceManager_swigregister
+SBSourceManager_swigregister(SBSourceManager)
+
+class SBStream(_object):
+    """
+    Represents a destination for streaming data output to. By default, a string
+    stream is created.
+
+    For example (from test/source-manager/TestSourceManager.py),
+
+            # Create the filespec for 'main.c'.
+            filespec = lldb.SBFileSpec('main.c', False)
+            source_mgr = self.dbg.GetSourceManager()
+            # Use a string stream as the destination.
+            stream = lldb.SBStream()
+            source_mgr.DisplaySourceLinesWithLineNumbers(filespec,
+                                                         self.line,
+                                                         2, # context before
+                                                         2, # context after
+                                                         '=>', # prefix for current line
+                                                         stream)
+
+            #    2
+            #    3    int main(int argc, char const *argv[]) {
+            # => 4        printf('Hello world.\n'); // Set break point at this line.
+            #    5        return 0;
+            #    6    }
+            self.expect(stream.GetData(), 'Source code displayed correctly',
+                        exe=False,
+                patterns = ['=> %d.*Hello world' % self.line])
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBStream, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBStream, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """__init__(lldb::SBStream self) -> SBStream"""
+        this = _lldb.new_SBStream()
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBStream
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBStream self) -> bool"""
+        return _lldb.SBStream_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBStream___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetData(self):
+        """
+        GetData(SBStream self) -> char const *
+
+
+        If this stream is not redirected to a file, it will maintain a local
+        cache for the stream data which can be accessed using this accessor.
+        """
+        return _lldb.SBStream_GetData(self)
+
+
+    def GetSize(self):
+        """
+        GetSize(SBStream self) -> size_t
+
+
+        If this stream is not redirected to a file, it will maintain a local
+        cache for the stream output whose length can be accessed using this
+        accessor.
+        """
+        return _lldb.SBStream_GetSize(self)
+
+
+    def Print(self, str):
+        """Print(SBStream self, char const * str)"""
+        return _lldb.SBStream_Print(self, str)
+
+
+    def RedirectToFile(self, path, append):
+        """RedirectToFile(SBStream self, char const * path, bool append)"""
+        return _lldb.SBStream_RedirectToFile(self, path, append)
+
+
+    def RedirectToFileHandle(self, fh, transfer_fh_ownership):
+        """RedirectToFileHandle(SBStream self, FILE * fh, bool transfer_fh_ownership)"""
+        return _lldb.SBStream_RedirectToFileHandle(self, fh, transfer_fh_ownership)
+
+
+    def RedirectToFileDescriptor(self, fd, transfer_fh_ownership):
+        """RedirectToFileDescriptor(SBStream self, int fd, bool transfer_fh_ownership)"""
+        return _lldb.SBStream_RedirectToFileDescriptor(self, fd, transfer_fh_ownership)
+
+
+    def Clear(self):
+        """
+        Clear(SBStream self)
+
+
+        If the stream is redirected to a file, forget about the file and if
+        ownership of the file was transferred to this object, close the file.
+        If the stream is backed by a local cache, clear this cache.
+        """
+        return _lldb.SBStream_Clear(self)
+
+
+    def write(self, str):
+        """write(SBStream self, char const * str)"""
+        return _lldb.SBStream_write(self, str)
+
+
+    def flush(self):
+        """flush(SBStream self)"""
+        return _lldb.SBStream_flush(self)
+
+SBStream_swigregister = _lldb.SBStream_swigregister
+SBStream_swigregister(SBStream)
+
+class SBStringList(_object):
+    """Proxy of C++ lldb::SBStringList class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBStringList, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBStringList, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBStringList self) -> SBStringList
+        __init__(lldb::SBStringList self, SBStringList rhs) -> SBStringList
+        """
+        this = _lldb.new_SBStringList(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBStringList
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBStringList self) -> bool"""
+        return _lldb.SBStringList_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBStringList___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def AppendString(self, str):
+        """AppendString(SBStringList self, char const * str)"""
+        return _lldb.SBStringList_AppendString(self, str)
+
+
+    def AppendList(self, *args):
+        """
+        AppendList(SBStringList self, char const ** strv, int strc)
+        AppendList(SBStringList self, SBStringList strings)
+        """
+        return _lldb.SBStringList_AppendList(self, *args)
+
+
+    def GetSize(self):
+        """GetSize(SBStringList self) -> uint32_t"""
+        return _lldb.SBStringList_GetSize(self)
+
+
+    def GetStringAtIndex(self, idx):
+        """GetStringAtIndex(SBStringList self, size_t idx) -> char const *"""
+        return _lldb.SBStringList_GetStringAtIndex(self, idx)
+
+
+    def Clear(self):
+        """Clear(SBStringList self)"""
+        return _lldb.SBStringList_Clear(self)
+
+
+    def __iter__(self):
+        '''Iterate over all strings in a lldb.SBStringList object.'''
+        return lldb_iter(self, 'GetSize', 'GetStringAtIndex')
+
+    def __len__(self):
+        '''Return the number of strings in a lldb.SBStringList object.'''
+        return self.GetSize()
+
+SBStringList_swigregister = _lldb.SBStringList_swigregister
+SBStringList_swigregister(SBStringList)
+
+class SBStructuredData(_object):
+    """
+    A class representing a StructuredData event.
+
+                  This class wraps the event type generated by StructuredData
+                  features.
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBStructuredData, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBStructuredData, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBStructuredData self) -> SBStructuredData
+        __init__(lldb::SBStructuredData self, SBStructuredData rhs) -> SBStructuredData
+        __init__(lldb::SBStructuredData self, lldb::EventSP const & event_sp) -> SBStructuredData
+        """
+        this = _lldb.new_SBStructuredData(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBStructuredData
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBStructuredData self) -> bool"""
+        return _lldb.SBStructuredData_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBStructuredData___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def Clear(self):
+        """Clear(SBStructuredData self)"""
+        return _lldb.SBStructuredData_Clear(self)
+
+
+    def GetType(self):
+        """GetType(SBStructuredData self) -> lldb::StructuredDataType"""
+        return _lldb.SBStructuredData_GetType(self)
+
+
+    def GetSize(self):
+        """GetSize(SBStructuredData self) -> size_t"""
+        return _lldb.SBStructuredData_GetSize(self)
+
+
+    def GetKeys(self, keys):
+        """GetKeys(SBStructuredData self, SBStringList keys) -> bool"""
+        return _lldb.SBStructuredData_GetKeys(self, keys)
+
+
+    def GetValueForKey(self, key):
+        """GetValueForKey(SBStructuredData self, char const * key) -> SBStructuredData"""
+        return _lldb.SBStructuredData_GetValueForKey(self, key)
+
+
+    def GetItemAtIndex(self, idx):
+        """GetItemAtIndex(SBStructuredData self, size_t idx) -> SBStructuredData"""
+        return _lldb.SBStructuredData_GetItemAtIndex(self, idx)
+
+
+    def GetIntegerValue(self, fail_value=0):
+        """
+        GetIntegerValue(SBStructuredData self, uint64_t fail_value=0) -> uint64_t
+        GetIntegerValue(SBStructuredData self) -> uint64_t
+        """
+        return _lldb.SBStructuredData_GetIntegerValue(self, fail_value)
+
+
+    def GetFloatValue(self, fail_value=0.0):
+        """
+        GetFloatValue(SBStructuredData self, double fail_value=0.0) -> double
+        GetFloatValue(SBStructuredData self) -> double
+        """
+        return _lldb.SBStructuredData_GetFloatValue(self, fail_value)
+
+
+    def GetBooleanValue(self, fail_value=False):
+        """
+        GetBooleanValue(SBStructuredData self, bool fail_value=False) -> bool
+        GetBooleanValue(SBStructuredData self) -> bool
+        """
+        return _lldb.SBStructuredData_GetBooleanValue(self, fail_value)
+
+
+    def GetStringValue(self, dst):
+        """GetStringValue(SBStructuredData self, char * dst) -> size_t"""
+        return _lldb.SBStructuredData_GetStringValue(self, dst)
+
+
+    def GetAsJSON(self, stream):
+        """GetAsJSON(SBStructuredData self, SBStream stream) -> SBError"""
+        return _lldb.SBStructuredData_GetAsJSON(self, stream)
+
+
+    def GetDescription(self, stream):
+        """GetDescription(SBStructuredData self, SBStream stream) -> SBError"""
+        return _lldb.SBStructuredData_GetDescription(self, stream)
+
+
+    def SetFromJSON(self, stream):
+        """SetFromJSON(SBStructuredData self, SBStream stream) -> SBError"""
+        return _lldb.SBStructuredData_SetFromJSON(self, stream)
+
+SBStructuredData_swigregister = _lldb.SBStructuredData_swigregister
+SBStructuredData_swigregister(SBStructuredData)
+
+class SBSymbol(_object):
+    """
+    Represents the symbol possibly associated with a stack frame.
+    SBModule contains SBSymbol(s). SBSymbol can also be retrieved from SBFrame.
+
+    See also SBModule and SBFrame.
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBSymbol, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBSymbol, name)
+    __repr__ = _swig_repr
+    __swig_destroy__ = _lldb.delete_SBSymbol
+    __del__ = lambda self: None
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBSymbol self) -> SBSymbol
+        __init__(lldb::SBSymbol self, SBSymbol rhs) -> SBSymbol
+        """
+        this = _lldb.new_SBSymbol(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+
+    def IsValid(self):
+        """IsValid(SBSymbol self) -> bool"""
+        return _lldb.SBSymbol_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBSymbol___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetName(self):
+        """GetName(SBSymbol self) -> char const *"""
+        return _lldb.SBSymbol_GetName(self)
+
+
+    def GetDisplayName(self):
+        """GetDisplayName(SBSymbol self) -> char const *"""
+        return _lldb.SBSymbol_GetDisplayName(self)
+
+
+    def GetMangledName(self):
+        """GetMangledName(SBSymbol self) -> char const *"""
+        return _lldb.SBSymbol_GetMangledName(self)
+
+
+    def GetInstructions(self, *args):
+        """
+        GetInstructions(SBSymbol self, SBTarget target) -> SBInstructionList
+        GetInstructions(SBSymbol self, SBTarget target, char const * flavor_string) -> SBInstructionList
+        """
+        return _lldb.SBSymbol_GetInstructions(self, *args)
+
+
+    def GetStartAddress(self):
+        """GetStartAddress(SBSymbol self) -> SBAddress"""
+        return _lldb.SBSymbol_GetStartAddress(self)
+
+
+    def GetEndAddress(self):
+        """GetEndAddress(SBSymbol self) -> SBAddress"""
+        return _lldb.SBSymbol_GetEndAddress(self)
+
+
+    def GetPrologueByteSize(self):
+        """GetPrologueByteSize(SBSymbol self) -> uint32_t"""
+        return _lldb.SBSymbol_GetPrologueByteSize(self)
+
+
+    def GetType(self):
+        """GetType(SBSymbol self) -> lldb::SymbolType"""
+        return _lldb.SBSymbol_GetType(self)
+
+
+    def GetDescription(self, description):
+        """GetDescription(SBSymbol self, SBStream description) -> bool"""
+        return _lldb.SBSymbol_GetDescription(self, description)
+
+
+    def IsExternal(self):
+        """IsExternal(SBSymbol self) -> bool"""
+        return _lldb.SBSymbol_IsExternal(self)
+
+
+    def IsSynthetic(self):
+        """IsSynthetic(SBSymbol self) -> bool"""
+        return _lldb.SBSymbol_IsSynthetic(self)
+
+
+    def __eq__(self, rhs):
+        """__eq__(SBSymbol self, SBSymbol rhs) -> bool"""
+        return _lldb.SBSymbol___eq__(self, rhs)
+
+
+    def __ne__(self, rhs):
+        """__ne__(SBSymbol self, SBSymbol rhs) -> bool"""
+        return _lldb.SBSymbol___ne__(self, rhs)
+
+
+    def get_instructions_from_current_target (self):
+        return self.GetInstructions (target)
+
+    name = property(GetName, None, doc='''A read only property that returns the name for this symbol as a string.''')
+    mangled = property(GetMangledName, None, doc='''A read only property that returns the mangled (linkage) name for this symbol as a string.''')
+    type = property(GetType, None, doc='''A read only property that returns an lldb enumeration value (see enumerations that start with "lldb.eSymbolType") that represents the type of this symbol.''')
+    addr = property(GetStartAddress, None, doc='''A read only property that returns an lldb object that represents the start address (lldb.SBAddress) for this symbol.''')
+    end_addr = property(GetEndAddress, None, doc='''A read only property that returns an lldb object that represents the end address (lldb.SBAddress) for this symbol.''')
+    prologue_size = property(GetPrologueByteSize, None, doc='''A read only property that returns the size in bytes of the prologue instructions as an unsigned integer.''')
+    instructions = property(get_instructions_from_current_target, None, doc='''A read only property that returns an lldb object that represents the instructions (lldb.SBInstructionList) for this symbol.''')
+    external = property(IsExternal, None, doc='''A read only property that returns a boolean value that indicates if this symbol is externally visiable (exported) from the module that contains it.''')
+    synthetic = property(IsSynthetic, None, doc='''A read only property that returns a boolean value that indicates if this symbol was synthetically created from information in module that contains it.''')
+
+
+    def __str__(self):
+        """__str__(SBSymbol self) -> PyObject *"""
+        return _lldb.SBSymbol___str__(self)
+
+
+    def __eq__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return False 
+
+        return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
+
+    def __ne__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return True 
+
+        return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
+
+SBSymbol_swigregister = _lldb.SBSymbol_swigregister
+SBSymbol_swigregister(SBSymbol)
+
+class SBSymbolContext(_object):
+    """
+    A context object that provides access to core debugger entities.
+
+    Many debugger functions require a context when doing lookups. This class
+    provides a common structure that can be used as the result of a query that
+    can contain a single result.
+
+    For example,
+
+            exe = os.path.join(os.getcwd(), 'a.out')
+
+            # Create a target for the debugger.
+            target = self.dbg.CreateTarget(exe)
+
+            # Now create a breakpoint on main.c by name 'c'.
+            breakpoint = target.BreakpointCreateByName('c', 'a.out')
+
+            # Now launch the process, and do not stop at entry point.
+            process = target.LaunchSimple(None, None, os.getcwd())
+
+            # The inferior should stop on 'c'.
+            from lldbutil import get_stopped_thread
+            thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint)
+            frame0 = thread.GetFrameAtIndex(0)
+
+            # Now get the SBSymbolContext from this frame.  We want everything. :-)
+            context = frame0.GetSymbolContext(lldb.eSymbolContextEverything)
+
+            # Get the module.
+            module = context.GetModule()
+            ...
+
+            # And the compile unit associated with the frame.
+            compileUnit = context.GetCompileUnit()
+            ...
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBSymbolContext, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBSymbolContext, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBSymbolContext self) -> SBSymbolContext
+        __init__(lldb::SBSymbolContext self, SBSymbolContext rhs) -> SBSymbolContext
+        """
+        this = _lldb.new_SBSymbolContext(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBSymbolContext
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBSymbolContext self) -> bool"""
+        return _lldb.SBSymbolContext_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBSymbolContext___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetModule(self):
+        """GetModule(SBSymbolContext self) -> SBModule"""
+        return _lldb.SBSymbolContext_GetModule(self)
+
+
+    def GetCompileUnit(self):
+        """GetCompileUnit(SBSymbolContext self) -> SBCompileUnit"""
+        return _lldb.SBSymbolContext_GetCompileUnit(self)
+
+
+    def GetFunction(self):
+        """GetFunction(SBSymbolContext self) -> SBFunction"""
+        return _lldb.SBSymbolContext_GetFunction(self)
+
+
+    def GetBlock(self):
+        """GetBlock(SBSymbolContext self) -> SBBlock"""
+        return _lldb.SBSymbolContext_GetBlock(self)
+
+
+    def GetLineEntry(self):
+        """GetLineEntry(SBSymbolContext self) -> SBLineEntry"""
+        return _lldb.SBSymbolContext_GetLineEntry(self)
+
+
+    def GetSymbol(self):
+        """GetSymbol(SBSymbolContext self) -> SBSymbol"""
+        return _lldb.SBSymbolContext_GetSymbol(self)
+
+
+    def SetModule(self, module):
+        """SetModule(SBSymbolContext self, SBModule module)"""
+        return _lldb.SBSymbolContext_SetModule(self, module)
+
+
+    def SetCompileUnit(self, compile_unit):
+        """SetCompileUnit(SBSymbolContext self, SBCompileUnit compile_unit)"""
+        return _lldb.SBSymbolContext_SetCompileUnit(self, compile_unit)
+
+
+    def SetFunction(self, function):
+        """SetFunction(SBSymbolContext self, SBFunction function)"""
+        return _lldb.SBSymbolContext_SetFunction(self, function)
+
+
+    def SetBlock(self, block):
+        """SetBlock(SBSymbolContext self, SBBlock block)"""
+        return _lldb.SBSymbolContext_SetBlock(self, block)
+
+
+    def SetLineEntry(self, line_entry):
+        """SetLineEntry(SBSymbolContext self, SBLineEntry line_entry)"""
+        return _lldb.SBSymbolContext_SetLineEntry(self, line_entry)
+
+
+    def SetSymbol(self, symbol):
+        """SetSymbol(SBSymbolContext self, SBSymbol symbol)"""
+        return _lldb.SBSymbolContext_SetSymbol(self, symbol)
+
+
+    def GetParentOfInlinedScope(self, curr_frame_pc, parent_frame_addr):
+        """GetParentOfInlinedScope(SBSymbolContext self, SBAddress curr_frame_pc, SBAddress parent_frame_addr) -> SBSymbolContext"""
+        return _lldb.SBSymbolContext_GetParentOfInlinedScope(self, curr_frame_pc, parent_frame_addr)
+
+
+    def GetDescription(self, description):
+        """GetDescription(SBSymbolContext self, SBStream description) -> bool"""
+        return _lldb.SBSymbolContext_GetDescription(self, description)
+
+
+    module = property(GetModule, SetModule, doc='''A read/write property that allows the getting/setting of the module (lldb.SBModule) in this symbol context.''')
+    compile_unit = property(GetCompileUnit, SetCompileUnit, doc='''A read/write property that allows the getting/setting of the compile unit (lldb.SBCompileUnit) in this symbol context.''')
+    function = property(GetFunction, SetFunction, doc='''A read/write property that allows the getting/setting of the function (lldb.SBFunction) in this symbol context.''')
+    block = property(GetBlock, SetBlock, doc='''A read/write property that allows the getting/setting of the block (lldb.SBBlock) in this symbol context.''')
+    symbol = property(GetSymbol, SetSymbol, doc='''A read/write property that allows the getting/setting of the symbol (lldb.SBSymbol) in this symbol context.''')
+    line_entry = property(GetLineEntry, SetLineEntry, doc='''A read/write property that allows the getting/setting of the line entry (lldb.SBLineEntry) in this symbol context.''')
+
+
+    def __str__(self):
+        """__str__(SBSymbolContext self) -> PyObject *"""
+        return _lldb.SBSymbolContext___str__(self)
+
+SBSymbolContext_swigregister = _lldb.SBSymbolContext_swigregister
+SBSymbolContext_swigregister(SBSymbolContext)
+
+class SBSymbolContextList(_object):
+    """
+    Represents a list of symbol context object. See also SBSymbolContext.
+
+    For example (from test/python_api/target/TestTargetAPI.py),
+
+        def find_functions(self, exe_name):
+            '''Exercise SBTaget.FindFunctions() API.'''
+            exe = os.path.join(os.getcwd(), exe_name)
+
+            # Create a target by the debugger.
+            target = self.dbg.CreateTarget(exe)
+            self.assertTrue(target, VALID_TARGET)
+
+            list = lldb.SBSymbolContextList()
+            num = target.FindFunctions('c', lldb.eFunctionNameTypeAuto, False, list)
+            self.assertTrue(num == 1 and list.GetSize() == 1)
+
+            for sc in list:
+                self.assertTrue(sc.GetModule().GetFileSpec().GetFilename() == exe_name)
+                self.assertTrue(sc.GetSymbol().GetName() == 'c')
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBSymbolContextList, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBSymbolContextList, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBSymbolContextList self) -> SBSymbolContextList
+        __init__(lldb::SBSymbolContextList self, SBSymbolContextList rhs) -> SBSymbolContextList
+        """
+        this = _lldb.new_SBSymbolContextList(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBSymbolContextList
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBSymbolContextList self) -> bool"""
+        return _lldb.SBSymbolContextList_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBSymbolContextList___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetSize(self):
+        """GetSize(SBSymbolContextList self) -> uint32_t"""
+        return _lldb.SBSymbolContextList_GetSize(self)
+
+
+    def GetContextAtIndex(self, idx):
+        """GetContextAtIndex(SBSymbolContextList self, uint32_t idx) -> SBSymbolContext"""
+        return _lldb.SBSymbolContextList_GetContextAtIndex(self, idx)
+
+
+    def Append(self, *args):
+        """
+        Append(SBSymbolContextList self, SBSymbolContext sc)
+        Append(SBSymbolContextList self, SBSymbolContextList sc_list)
+        """
+        return _lldb.SBSymbolContextList_Append(self, *args)
+
+
+    def GetDescription(self, description):
+        """GetDescription(SBSymbolContextList self, SBStream description) -> bool"""
+        return _lldb.SBSymbolContextList_GetDescription(self, description)
+
+
+    def Clear(self):
+        """Clear(SBSymbolContextList self)"""
+        return _lldb.SBSymbolContextList_Clear(self)
+
+
+    def __iter__(self):
+        '''Iterate over all symbol contexts in a lldb.SBSymbolContextList
+        object.'''
+        return lldb_iter(self, 'GetSize', 'GetContextAtIndex')
+
+    def __len__(self):
+        return int(self.GetSize())
+
+    def __getitem__(self, key):
+        count = len(self)
+        if type(key) is int:
+            if key < count:
+                return self.GetContextAtIndex(key)
+            else:
+                raise IndexError
+        raise TypeError
+
+    def get_module_array(self):
+        a = []
+        for i in range(len(self)):
+            obj = self.GetContextAtIndex(i).module
+            if obj:
+                a.append(obj)
+        return a
+
+    def get_compile_unit_array(self):
+        a = []
+        for i in range(len(self)):
+            obj = self.GetContextAtIndex(i).compile_unit
+            if obj:
+                a.append(obj)
+        return a
+    def get_function_array(self):
+        a = []
+        for i in range(len(self)):
+            obj = self.GetContextAtIndex(i).function
+            if obj:
+                a.append(obj)
+        return a
+    def get_block_array(self):
+        a = []
+        for i in range(len(self)):
+            obj = self.GetContextAtIndex(i).block
+            if obj:
+                a.append(obj)
+        return a
+    def get_symbol_array(self):
+        a = []
+        for i in range(len(self)):
+            obj = self.GetContextAtIndex(i).symbol
+            if obj:
+                a.append(obj)
+        return a
+    def get_line_entry_array(self):
+        a = []
+        for i in range(len(self)):
+            obj = self.GetContextAtIndex(i).line_entry
+            if obj:
+                a.append(obj)
+        return a
+
+    modules = property(get_module_array, None, doc='''Returns a list() of lldb.SBModule objects, one for each module in each SBSymbolContext object in this list.''')
+    compile_units = property(get_compile_unit_array, None, doc='''Returns a list() of lldb.SBCompileUnit objects, one for each compile unit in each SBSymbolContext object in this list.''')
+    functions = property(get_function_array, None, doc='''Returns a list() of lldb.SBFunction objects, one for each function in each SBSymbolContext object in this list.''')
+    blocks = property(get_block_array, None, doc='''Returns a list() of lldb.SBBlock objects, one for each block in each SBSymbolContext object in this list.''')
+    line_entries = property(get_line_entry_array, None, doc='''Returns a list() of lldb.SBLineEntry objects, one for each line entry in each SBSymbolContext object in this list.''')
+    symbols = property(get_symbol_array, None, doc='''Returns a list() of lldb.SBSymbol objects, one for each symbol in each SBSymbolContext object in this list.''')
+
+
+    def __str__(self):
+        """__str__(SBSymbolContextList self) -> PyObject *"""
+        return _lldb.SBSymbolContextList___str__(self)
+
+SBSymbolContextList_swigregister = _lldb.SBSymbolContextList_swigregister
+SBSymbolContextList_swigregister(SBSymbolContextList)
+
+class SBTarget(_object):
+    """
+    Represents the target program running under the debugger.
+
+    SBTarget supports module, breakpoint, and watchpoint iterations. For example,
+
+        for m in target.module_iter():
+            print m
+
+    produces:
+
+    (x86_64) /Volumes/data/lldb/svn/trunk/test/python_api/lldbutil/iter/a.out
+    (x86_64) /usr/lib/dyld
+    (x86_64) /usr/lib/libstdc++.6.dylib
+    (x86_64) /usr/lib/libSystem.B.dylib
+    (x86_64) /usr/lib/system/libmathCommon.A.dylib
+    (x86_64) /usr/lib/libSystem.B.dylib(__commpage)
+
+    and,
+
+        for b in target.breakpoint_iter():
+            print b
+
+    produces:
+
+    SBBreakpoint: id = 1, file ='main.cpp', line = 66, locations = 1
+    SBBreakpoint: id = 2, file ='main.cpp', line = 85, locations = 1
+
+    and,
+
+        for wp_loc in target.watchpoint_iter():
+            print wp_loc
+
+    produces:
+
+    Watchpoint 1: addr = 0x1034ca048 size = 4 state = enabled type = rw
+        declare @ '/Volumes/data/lldb/svn/trunk/test/python_api/watchpoint/main.c:12'
+        hw_index = 0  hit_count = 2     ignore_count = 0
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBTarget, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBTarget, name)
+    __repr__ = _swig_repr
+    eBroadcastBitBreakpointChanged = _lldb.SBTarget_eBroadcastBitBreakpointChanged
+    eBroadcastBitModulesLoaded = _lldb.SBTarget_eBroadcastBitModulesLoaded
+    eBroadcastBitModulesUnloaded = _lldb.SBTarget_eBroadcastBitModulesUnloaded
+    eBroadcastBitWatchpointChanged = _lldb.SBTarget_eBroadcastBitWatchpointChanged
+    eBroadcastBitSymbolsLoaded = _lldb.SBTarget_eBroadcastBitSymbolsLoaded
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBTarget self) -> SBTarget
+        __init__(lldb::SBTarget self, SBTarget rhs) -> SBTarget
+        """
+        this = _lldb.new_SBTarget(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBTarget
+    __del__ = lambda self: None
+
+    def GetBroadcasterClassName():
+        """GetBroadcasterClassName() -> char const *"""
+        return _lldb.SBTarget_GetBroadcasterClassName()
+
+    GetBroadcasterClassName = staticmethod(GetBroadcasterClassName)
+
+    def IsValid(self):
+        """IsValid(SBTarget self) -> bool"""
+        return _lldb.SBTarget_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBTarget___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def EventIsTargetEvent(event):
+        """EventIsTargetEvent(SBEvent event) -> bool"""
+        return _lldb.SBTarget_EventIsTargetEvent(event)
+
+    EventIsTargetEvent = staticmethod(EventIsTargetEvent)
+
+    def GetTargetFromEvent(event):
+        """GetTargetFromEvent(SBEvent event) -> SBTarget"""
+        return _lldb.SBTarget_GetTargetFromEvent(event)
+
+    GetTargetFromEvent = staticmethod(GetTargetFromEvent)
+
+    def GetNumModulesFromEvent(event):
+        """GetNumModulesFromEvent(SBEvent event) -> uint32_t"""
+        return _lldb.SBTarget_GetNumModulesFromEvent(event)
+
+    GetNumModulesFromEvent = staticmethod(GetNumModulesFromEvent)
+
+    def GetModuleAtIndexFromEvent(idx, event):
+        """GetModuleAtIndexFromEvent(uint32_t const idx, SBEvent event) -> SBModule"""
+        return _lldb.SBTarget_GetModuleAtIndexFromEvent(idx, event)
+
+    GetModuleAtIndexFromEvent = staticmethod(GetModuleAtIndexFromEvent)
+
+    def GetProcess(self):
+        """GetProcess(SBTarget self) -> SBProcess"""
+        return _lldb.SBTarget_GetProcess(self)
+
+
+    def GetPlatform(self):
+        """
+        GetPlatform(SBTarget self) -> SBPlatform
+
+
+        Return the platform object associated with the target.
+
+        After return, the platform object should be checked for
+        validity.
+
+        @return
+            A platform object.
+        """
+        return _lldb.SBTarget_GetPlatform(self)
+
+
+    def Install(self):
+        """
+        Install(SBTarget self) -> SBError
+
+
+        Install any binaries that need to be installed.
+
+        This function does nothing when debugging on the host system.
+        When connected to remote platforms, the target's main executable
+        and any modules that have their install path set will be
+        installed on the remote platform. If the main executable doesn't
+        have an install location set, it will be installed in the remote
+        platform's working directory.
+
+        @return
+            An error describing anything that went wrong during
+            installation.
+        """
+        return _lldb.SBTarget_Install(self)
+
+
+    def LaunchSimple(self, argv, envp, working_directory):
+        """
+        LaunchSimple(SBTarget self, char const ** argv, char const ** envp, char const * working_directory) -> SBProcess
+
+
+        Launch a new process with sensible defaults.
+
+        @param[in] argv
+            The argument array.
+
+        @param[in] envp
+            The environment array.
+
+        @param[in] working_directory
+            The working directory to have the child process run in
+
+        Default: listener
+            Set to the target's debugger (SBTarget::GetDebugger())
+
+        Default: launch_flags
+            Empty launch flags
+
+        Default: stdin_path
+        Default: stdout_path
+        Default: stderr_path
+            A pseudo terminal will be used.
+
+        @return
+             A process object for the newly created process.
+
+        For example,
+
+            process = target.LaunchSimple(['X', 'Y', 'Z'], None, os.getcwd())
+
+        launches a new process by passing 'X', 'Y', 'Z' as the args to the
+        executable.
+        """
+        return _lldb.SBTarget_LaunchSimple(self, argv, envp, working_directory)
+
+
+    def Launch(self, *args):
+        """
+        Launch(SBTarget self, SBListener listener, char const ** argv, char const ** envp, char const * stdin_path, char const * stdout_path, char const * stderr_path, char const * working_directory, uint32_t launch_flags, bool stop_at_entry, SBError error) -> SBProcess
+        Launch(SBTarget self, SBLaunchInfo launch_info, SBError error) -> SBProcess
+
+
+        Launch a new process.
+
+        Launch a new process by spawning a new process using the
+        target object's executable module's file as the file to launch.
+        Arguments are given in argv, and the environment variables
+        are in envp. Standard input and output files can be
+        optionally re-directed to stdin_path, stdout_path, and
+        stderr_path.
+
+        @param[in] listener
+            An optional listener that will receive all process events.
+            If listener is valid then listener will listen to all
+            process events. If not valid, then this target's debugger
+            (SBTarget::GetDebugger()) will listen to all process events.
+
+        @param[in] argv
+            The argument array.
+
+        @param[in] envp
+            The environment array.
+
+        @param[in] launch_flags
+            Flags to modify the launch (@see lldb::LaunchFlags)
+
+        @param[in] stdin_path
+            The path to use when re-directing the STDIN of the new
+            process. If all stdXX_path arguments are NULL, a pseudo
+            terminal will be used.
+
+        @param[in] stdout_path
+            The path to use when re-directing the STDOUT of the new
+            process. If all stdXX_path arguments are NULL, a pseudo
+            terminal will be used.
+
+        @param[in] stderr_path
+            The path to use when re-directing the STDERR of the new
+            process. If all stdXX_path arguments are NULL, a pseudo
+            terminal will be used.
+
+        @param[in] working_directory
+            The working directory to have the child process run in
+
+        @param[in] launch_flags
+            Some launch options specified by logical OR'ing
+            lldb::LaunchFlags enumeration values together.
+
+        @param[in] stop_at_entry
+            If false do not stop the inferior at the entry point.
+
+        @param[out]
+            An error object. Contains the reason if there is some failure.
+
+        @return
+             A process object for the newly created process.
+
+        For example,
+
+            process = target.Launch(self.dbg.GetListener(), None, None,
+                                    None, '/tmp/stdout.txt', None,
+                                    None, 0, False, error)
+
+        launches a new process by passing nothing for both the args and the envs
+        and redirect the standard output of the inferior to the /tmp/stdout.txt
+        file. It does not specify a working directory so that the debug server
+        will use its idea of what the current working directory is for the
+        inferior. Also, we ask the debugger not to stop the inferior at the
+        entry point. If no breakpoint is specified for the inferior, it should
+        run to completion if no user interaction is required.
+        """
+        return _lldb.SBTarget_Launch(self, *args)
+
+
+    def LoadCore(self, *args):
+        """
+        LoadCore(SBTarget self, char const * core_file) -> SBProcess
+        LoadCore(SBTarget self, char const * core_file, SBError error) -> SBProcess
+
+
+        Load a core file
+
+        @param[in] core_file
+            File path of the core dump.
+
+        @param[out] error
+            An error explaining what went wrong if the operation fails.
+            (Optional)
+
+        @return
+             A process object for the newly created core file.
+
+        For example,
+
+            process = target.LoadCore('./a.out.core')
+
+        loads a new core file and returns the process object.
+        """
+        return _lldb.SBTarget_LoadCore(self, *args)
+
+
+    def Attach(self, attach_info, error):
+        """Attach(SBTarget self, SBAttachInfo attach_info, SBError error) -> SBProcess"""
+        return _lldb.SBTarget_Attach(self, attach_info, error)
+
+
+    def AttachToProcessWithID(self, listener, pid, error):
+        """
+        AttachToProcessWithID(SBTarget self, SBListener listener, lldb::pid_t pid, SBError error) -> SBProcess
+
+
+        Attach to process with pid.
+
+        @param[in] listener
+            An optional listener that will receive all process events.
+            If listener is valid then listener will listen to all
+            process events. If not valid, then this target's debugger
+            (SBTarget::GetDebugger()) will listen to all process events.
+
+        @param[in] pid
+            The process ID to attach to.
+
+        @param[out]
+            An error explaining what went wrong if attach fails.
+
+        @return
+             A process object for the attached process.
+        """
+        return _lldb.SBTarget_AttachToProcessWithID(self, listener, pid, error)
+
+
+    def AttachToProcessWithName(self, listener, name, wait_for, error):
+        """
+        AttachToProcessWithName(SBTarget self, SBListener listener, char const * name, bool wait_for, SBError error) -> SBProcess
+
+
+        Attach to process with name.
+
+        @param[in] listener
+            An optional listener that will receive all process events.
+            If listener is valid then listener will listen to all
+            process events. If not valid, then this target's debugger
+            (SBTarget::GetDebugger()) will listen to all process events.
+
+        @param[in] name
+            Basename of process to attach to.
+
+        @param[in] wait_for
+            If true wait for a new instance of 'name' to be launched.
+
+        @param[out]
+            An error explaining what went wrong if attach fails.
+
+        @return
+             A process object for the attached process.
+        """
+        return _lldb.SBTarget_AttachToProcessWithName(self, listener, name, wait_for, error)
+
+
+    def ConnectRemote(self, listener, url, plugin_name, error):
+        """
+        ConnectRemote(SBTarget self, SBListener listener, char const * url, char const * plugin_name, SBError error) -> SBProcess
+
+
+        Connect to a remote debug server with url.
+
+        @param[in] listener
+            An optional listener that will receive all process events.
+            If listener is valid then listener will listen to all
+            process events. If not valid, then this target's debugger
+            (SBTarget::GetDebugger()) will listen to all process events.
+
+        @param[in] url
+            The url to connect to, e.g., 'connect://localhost:12345'.
+
+        @param[in] plugin_name
+            The plugin name to be used; can be NULL.
+
+        @param[out]
+            An error explaining what went wrong if the connect fails.
+
+        @return
+             A process object for the connected process.
+        """
+        return _lldb.SBTarget_ConnectRemote(self, listener, url, plugin_name, error)
+
+
+    def GetExecutable(self):
+        """GetExecutable(SBTarget self) -> SBFileSpec"""
+        return _lldb.SBTarget_GetExecutable(self)
+
+
+    def AppendImageSearchPath(self, arg2, to, error):
+        """
+        AppendImageSearchPath(SBTarget self, char const * arg2, char const * to, SBError error)
+
+
+        Append the path mapping (from -> to) to the target's paths mapping list.
+        """
+        return _lldb.SBTarget_AppendImageSearchPath(self, arg2, to, error)
+
+
+    def AddModule(self, *args):
+        """
+        AddModule(SBTarget self, SBModule module) -> bool
+        AddModule(SBTarget self, char const * path, char const * triple, char const * uuid) -> SBModule
+        AddModule(SBTarget self, char const * path, char const * triple, char const * uuid_cstr, char const * symfile) -> SBModule
+        AddModule(SBTarget self, SBModuleSpec module_spec) -> SBModule
+        """
+        return _lldb.SBTarget_AddModule(self, *args)
+
+
+    def GetNumModules(self):
+        """GetNumModules(SBTarget self) -> uint32_t"""
+        return _lldb.SBTarget_GetNumModules(self)
+
+
+    def GetModuleAtIndex(self, idx):
+        """GetModuleAtIndex(SBTarget self, uint32_t idx) -> SBModule"""
+        return _lldb.SBTarget_GetModuleAtIndex(self, idx)
+
+
+    def RemoveModule(self, module):
+        """RemoveModule(SBTarget self, SBModule module) -> bool"""
+        return _lldb.SBTarget_RemoveModule(self, module)
+
+
+    def GetDebugger(self):
+        """GetDebugger(SBTarget self) -> SBDebugger"""
+        return _lldb.SBTarget_GetDebugger(self)
+
+
+    def FindModule(self, file_spec):
+        """FindModule(SBTarget self, SBFileSpec file_spec) -> SBModule"""
+        return _lldb.SBTarget_FindModule(self, file_spec)
+
+
+    def FindCompileUnits(self, sb_file_spec):
+        """
+        FindCompileUnits(SBTarget self, SBFileSpec sb_file_spec) -> SBSymbolContextList
+
+
+        Find compile units related to *this target and passed source
+        file.
+
+        @param[in] sb_file_spec
+            A lldb::SBFileSpec object that contains source file
+            specification.
+
+        @return
+            A lldb::SBSymbolContextList that gets filled in with all of
+            the symbol contexts for all the matches.
+        """
+        return _lldb.SBTarget_FindCompileUnits(self, sb_file_spec)
+
+
+    def GetByteOrder(self):
+        """GetByteOrder(SBTarget self) -> lldb::ByteOrder"""
+        return _lldb.SBTarget_GetByteOrder(self)
+
+
+    def GetAddressByteSize(self):
+        """GetAddressByteSize(SBTarget self) -> uint32_t"""
+        return _lldb.SBTarget_GetAddressByteSize(self)
+
+
+    def GetTriple(self):
+        """GetTriple(SBTarget self) -> char const *"""
+        return _lldb.SBTarget_GetTriple(self)
+
+
+    def GetDataByteSize(self):
+        """
+        GetDataByteSize(SBTarget self) -> uint32_t
+
+
+        Architecture data byte width accessor
+
+        @return
+        The size in 8-bit (host) bytes of a minimum addressable
+        unit from the Architecture's data bus
+        """
+        return _lldb.SBTarget_GetDataByteSize(self)
+
+
+    def GetCodeByteSize(self):
+        """
+        GetCodeByteSize(SBTarget self) -> uint32_t
+
+
+        Architecture code byte width accessor
+
+        @return
+        The size in 8-bit (host) bytes of a minimum addressable
+        unit from the Architecture's code bus
+        """
+        return _lldb.SBTarget_GetCodeByteSize(self)
+
+
+    def SetSectionLoadAddress(self, section, section_base_addr):
+        """SetSectionLoadAddress(SBTarget self, SBSection section, lldb::addr_t section_base_addr) -> SBError"""
+        return _lldb.SBTarget_SetSectionLoadAddress(self, section, section_base_addr)
+
+
+    def ClearSectionLoadAddress(self, section):
+        """ClearSectionLoadAddress(SBTarget self, SBSection section) -> SBError"""
+        return _lldb.SBTarget_ClearSectionLoadAddress(self, section)
+
+
+    def SetModuleLoadAddress(self, module, sections_offset):
+        """SetModuleLoadAddress(SBTarget self, SBModule module, int64_t sections_offset) -> SBError"""
+        return _lldb.SBTarget_SetModuleLoadAddress(self, module, sections_offset)
+
+
+    def ClearModuleLoadAddress(self, module):
+        """ClearModuleLoadAddress(SBTarget self, SBModule module) -> SBError"""
+        return _lldb.SBTarget_ClearModuleLoadAddress(self, module)
+
+
+    def FindFunctions(self, *args):
+        """
+        FindFunctions(SBTarget self, char const * name, uint32_t name_type_mask) -> SBSymbolContextList
+        FindFunctions(SBTarget self, char const * name) -> SBSymbolContextList
+
+
+        Find functions by name.
+
+        @param[in] name
+            The name of the function we are looking for.
+
+        @param[in] name_type_mask
+            A logical OR of one or more FunctionNameType enum bits that
+            indicate what kind of names should be used when doing the
+            lookup. Bits include fully qualified names, base names,
+            C++ methods, or ObjC selectors.
+            See FunctionNameType for more details.
+
+        @return
+            A lldb::SBSymbolContextList that gets filled in with all of
+            the symbol contexts for all the matches.
+        """
+        return _lldb.SBTarget_FindFunctions(self, *args)
+
+
+    def FindFirstType(self, type):
+        """FindFirstType(SBTarget self, char const * type) -> SBType"""
+        return _lldb.SBTarget_FindFirstType(self, type)
+
+
+    def FindTypes(self, type):
+        """FindTypes(SBTarget self, char const * type) -> SBTypeList"""
+        return _lldb.SBTarget_FindTypes(self, type)
+
+
+    def GetBasicType(self, type):
+        """GetBasicType(SBTarget self, lldb::BasicType type) -> SBType"""
+        return _lldb.SBTarget_GetBasicType(self, type)
+
+
+    def GetSourceManager(self):
+        """GetSourceManager(SBTarget self) -> SBSourceManager"""
+        return _lldb.SBTarget_GetSourceManager(self)
+
+
+    def FindFirstGlobalVariable(self, name):
+        """
+        FindFirstGlobalVariable(SBTarget self, char const * name) -> SBValue
+
+
+        Find the first global (or static) variable by name.
+
+        @param[in] name
+            The name of the global or static variable we are looking
+            for.
+
+        @return
+            An SBValue that gets filled in with the found variable (if any).
+        """
+        return _lldb.SBTarget_FindFirstGlobalVariable(self, name)
+
+
+    def FindGlobalVariables(self, *args):
+        """
+        FindGlobalVariables(SBTarget self, char const * name, uint32_t max_matches) -> SBValueList
+        FindGlobalVariables(SBTarget self, char const * name, uint32_t max_matches, lldb::MatchType matchtype) -> SBValueList
+
+
+        Find global and static variables by name.
+
+        @param[in] name
+            The name of the global or static variable we are looking
+            for.
+
+        @param[in] max_matches
+            Allow the number of matches to be limited to max_matches.
+
+        @return
+            A list of matched variables in an SBValueList.
+        """
+        return _lldb.SBTarget_FindGlobalVariables(self, *args)
+
+
+    def FindGlobalFunctions(self, name, max_matches, matchtype):
+        """FindGlobalFunctions(SBTarget self, char const * name, uint32_t max_matches, lldb::MatchType matchtype) -> SBSymbolContextList"""
+        return _lldb.SBTarget_FindGlobalFunctions(self, name, max_matches, matchtype)
+
+
+    def Clear(self):
+        """Clear(SBTarget self)"""
+        return _lldb.SBTarget_Clear(self)
+
+
+    def ResolveFileAddress(self, file_addr):
+        """
+        ResolveFileAddress(SBTarget self, lldb::addr_t file_addr) -> SBAddress
+
+
+        Resolve a current file address into a section offset address.
+
+        @param[in] file_addr
+
+        @return
+            An SBAddress which will be valid if...
+        """
+        return _lldb.SBTarget_ResolveFileAddress(self, file_addr)
+
+
+    def ResolveLoadAddress(self, vm_addr):
+        """ResolveLoadAddress(SBTarget self, lldb::addr_t vm_addr) -> SBAddress"""
+        return _lldb.SBTarget_ResolveLoadAddress(self, vm_addr)
+
+
+    def ResolvePastLoadAddress(self, stop_id, vm_addr):
+        """ResolvePastLoadAddress(SBTarget self, uint32_t stop_id, lldb::addr_t vm_addr) -> SBAddress"""
+        return _lldb.SBTarget_ResolvePastLoadAddress(self, stop_id, vm_addr)
+
+
+    def ResolveSymbolContextForAddress(self, addr, resolve_scope):
+        """ResolveSymbolContextForAddress(SBTarget self, SBAddress addr, uint32_t resolve_scope) -> SBSymbolContext"""
+        return _lldb.SBTarget_ResolveSymbolContextForAddress(self, addr, resolve_scope)
+
+
+    def ReadMemory(self, addr, buf, error):
+        """
+        ReadMemory(SBTarget self, SBAddress addr, void * buf, SBError error) -> size_t
+
+
+        Read target memory. If a target process is running then memory
+        is read from here. Otherwise the memory is read from the object
+        files. For a target whose bytes are sized as a multiple of host
+        bytes, the data read back will preserve the target's byte order.
+
+        @param[in] addr
+            A target address to read from.
+
+        @param[out] buf
+            The buffer to read memory into.
+
+        @param[in] size
+            The maximum number of host bytes to read in the buffer passed
+            into this call
+
+        @param[out] error
+            Error information is written here if the memory read fails.
+
+        @return
+            The amount of data read in host bytes.
+        """
+        return _lldb.SBTarget_ReadMemory(self, addr, buf, error)
+
+
+    def BreakpointCreateByLocation(self, *args):
+        """
+        BreakpointCreateByLocation(SBTarget self, char const * file, uint32_t line) -> SBBreakpoint
+        BreakpointCreateByLocation(SBTarget self, SBFileSpec file_spec, uint32_t line) -> SBBreakpoint
+        BreakpointCreateByLocation(SBTarget self, SBFileSpec file_spec, uint32_t line, lldb::addr_t offset) -> SBBreakpoint
+        BreakpointCreateByLocation(SBTarget self, SBFileSpec file_spec, uint32_t line, lldb::addr_t offset, SBFileSpecList module_list) -> SBBreakpoint
+        BreakpointCreateByLocation(SBTarget self, SBFileSpec file_spec, uint32_t line, uint32_t column, lldb::addr_t offset, SBFileSpecList module_list) -> SBBreakpoint
+        """
+        return _lldb.SBTarget_BreakpointCreateByLocation(self, *args)
+
+
+    def BreakpointCreateByName(self, *args):
+        """
+        BreakpointCreateByName(SBTarget self, char const * symbol_name, char const * module_name=None) -> SBBreakpoint
+        BreakpointCreateByName(SBTarget self, char const * symbol_name) -> SBBreakpoint
+        BreakpointCreateByName(SBTarget self, char const * symbol_name, uint32_t func_name_type, SBFileSpecList module_list, SBFileSpecList comp_unit_list) -> SBBreakpoint
+        BreakpointCreateByName(SBTarget self, char const * symbol_name, uint32_t func_name_type, lldb::LanguageType symbol_language, SBFileSpecList module_list, SBFileSpecList comp_unit_list) -> SBBreakpoint
+        """
+        return _lldb.SBTarget_BreakpointCreateByName(self, *args)
+
+
+    def BreakpointCreateByNames(self, *args):
+        """
+        BreakpointCreateByNames(SBTarget self, char const ** symbol_name, uint32_t name_type_mask, SBFileSpecList module_list, SBFileSpecList comp_unit_list) -> SBBreakpoint
+        BreakpointCreateByNames(SBTarget self, char const ** symbol_name, uint32_t name_type_mask, lldb::LanguageType symbol_language, SBFileSpecList module_list, SBFileSpecList comp_unit_list) -> SBBreakpoint
+        BreakpointCreateByNames(SBTarget self, char const ** symbol_name, uint32_t name_type_mask, lldb::LanguageType symbol_language, lldb::addr_t offset, SBFileSpecList module_list, SBFileSpecList comp_unit_list) -> SBBreakpoint
+        """
+        return _lldb.SBTarget_BreakpointCreateByNames(self, *args)
+
+
+    def BreakpointCreateByRegex(self, *args):
+        """
+        BreakpointCreateByRegex(SBTarget self, char const * symbol_name_regex, char const * module_name=None) -> SBBreakpoint
+        BreakpointCreateByRegex(SBTarget self, char const * symbol_name_regex) -> SBBreakpoint
+        BreakpointCreateByRegex(SBTarget self, char const * symbol_name_regex, lldb::LanguageType symbol_language, SBFileSpecList module_list, SBFileSpecList comp_unit_list) -> SBBreakpoint
+        """
+        return _lldb.SBTarget_BreakpointCreateByRegex(self, *args)
+
+
+    def BreakpointCreateBySourceRegex(self, *args):
+        """
+        BreakpointCreateBySourceRegex(SBTarget self, char const * source_regex, SBFileSpec source_file, char const * module_name=None) -> SBBreakpoint
+        BreakpointCreateBySourceRegex(SBTarget self, char const * source_regex, SBFileSpec source_file) -> SBBreakpoint
+        BreakpointCreateBySourceRegex(SBTarget self, char const * source_regex, SBFileSpecList module_list, SBFileSpecList file_list) -> SBBreakpoint
+        BreakpointCreateBySourceRegex(SBTarget self, char const * source_regex, SBFileSpecList module_list, SBFileSpecList source_file, SBStringList func_names) -> SBBreakpoint
+        """
+        return _lldb.SBTarget_BreakpointCreateBySourceRegex(self, *args)
+
+
+    def BreakpointCreateForException(self, language, catch_bp, throw_bp):
+        """BreakpointCreateForException(SBTarget self, lldb::LanguageType language, bool catch_bp, bool throw_bp) -> SBBreakpoint"""
+        return _lldb.SBTarget_BreakpointCreateForException(self, language, catch_bp, throw_bp)
+
+
+    def BreakpointCreateByAddress(self, address):
+        """BreakpointCreateByAddress(SBTarget self, lldb::addr_t address) -> SBBreakpoint"""
+        return _lldb.SBTarget_BreakpointCreateByAddress(self, address)
+
+
+    def BreakpointCreateBySBAddress(self, sb_address):
+        """BreakpointCreateBySBAddress(SBTarget self, SBAddress sb_address) -> SBBreakpoint"""
+        return _lldb.SBTarget_BreakpointCreateBySBAddress(self, sb_address)
+
+
+    def BreakpointCreateFromScript(self, class_name, extra_args, module_list, file_list, request_hardware=False):
+        """
+        BreakpointCreateFromScript(SBTarget self, char const * class_name, SBStructuredData extra_args, SBFileSpecList module_list, SBFileSpecList file_list, bool request_hardware=False) -> SBBreakpoint
+        BreakpointCreateFromScript(SBTarget self, char const * class_name, SBStructuredData extra_args, SBFileSpecList module_list, SBFileSpecList file_list) -> SBBreakpoint
+
+
+        Create a breakpoint using a scripted resolver.
+
+        @param[in] class_name
+           This is the name of the class that implements a scripted resolver.
+           The class should have the following signature:
+           class Resolver:
+               def __init__(self, bkpt, extra_args):
+                   # bkpt - the breakpoint for which this is the resolver.  When
+                   # the resolver finds an interesting address, call AddLocation
+                   # on this breakpoint to add it.
+                   #
+                   # extra_args - an SBStructuredData that can be used to
+                   # parametrize this instance.  Same as the extra_args passed
+                   # to BreakpointCreateFromScript.
+
+               def __get_depth__ (self):
+                   # This is optional, but if defined, you should return the
+                   # depth at which you want the callback to be called.  The
+                   # available options are:
+                   #    lldb.eSearchDepthModule
+                   #    lldb.eSearchDepthCompUnit
+                   # The default if you don't implement this method is
+                   # eSearchDepthModule.
+
+               def __callback__(self, sym_ctx):
+                   # sym_ctx - an SBSymbolContext that is the cursor in the
+                   # search through the program to resolve breakpoints.
+                   # The sym_ctx will be filled out to the depth requested in
+                   # __get_depth__.
+                   # Look in this sym_ctx for new breakpoint locations,
+                   # and if found use bkpt.AddLocation to add them.
+                   # Note, you will only get called for modules/compile_units that
+                   # pass the SearchFilter provided by the module_list & file_list
+                   # passed into BreakpointCreateFromScript.
+
+               def get_short_help(self):
+                   # Optional, but if implemented return a short string that will
+                   # be printed at the beginning of the break list output for the
+                   # breakpoint.
+
+        @param[in] extra_args
+           This is an SBStructuredData object that will get passed to the
+           constructor of the class in class_name.  You can use this to
+           reuse the same class, parametrizing it with entries from this
+           dictionary.
+
+        @param module_list
+           If this is non-empty, this will be used as the module filter in the
+           SearchFilter created for this breakpoint.
+
+        @param file_list
+           If this is non-empty, this will be used as the comp unit filter in the
+           SearchFilter created for this breakpoint.
+
+        @return
+            An SBBreakpoint that will set locations based on the logic in the
+            resolver's search callback.
+        """
+        return _lldb.SBTarget_BreakpointCreateFromScript(self, class_name, extra_args, module_list, file_list, request_hardware)
+
+
+    def GetNumBreakpoints(self):
+        """GetNumBreakpoints(SBTarget self) -> uint32_t"""
+        return _lldb.SBTarget_GetNumBreakpoints(self)
+
+
+    def GetBreakpointAtIndex(self, idx):
+        """GetBreakpointAtIndex(SBTarget self, uint32_t idx) -> SBBreakpoint"""
+        return _lldb.SBTarget_GetBreakpointAtIndex(self, idx)
+
+
+    def BreakpointDelete(self, break_id):
+        """BreakpointDelete(SBTarget self, lldb::break_id_t break_id) -> bool"""
+        return _lldb.SBTarget_BreakpointDelete(self, break_id)
+
+
+    def FindBreakpointByID(self, break_id):
+        """FindBreakpointByID(SBTarget self, lldb::break_id_t break_id) -> SBBreakpoint"""
+        return _lldb.SBTarget_FindBreakpointByID(self, break_id)
+
+
+    def FindBreakpointsByName(self, name, bkpt_list):
+        """FindBreakpointsByName(SBTarget self, char const * name, SBBreakpointList bkpt_list) -> bool"""
+        return _lldb.SBTarget_FindBreakpointsByName(self, name, bkpt_list)
+
+
+    def DeleteBreakpointName(self, name):
+        """DeleteBreakpointName(SBTarget self, char const * name)"""
+        return _lldb.SBTarget_DeleteBreakpointName(self, name)
+
+
+    def GetBreakpointNames(self, names):
+        """GetBreakpointNames(SBTarget self, SBStringList names)"""
+        return _lldb.SBTarget_GetBreakpointNames(self, names)
+
+
+    def EnableAllBreakpoints(self):
+        """EnableAllBreakpoints(SBTarget self) -> bool"""
+        return _lldb.SBTarget_EnableAllBreakpoints(self)
+
+
+    def DisableAllBreakpoints(self):
+        """DisableAllBreakpoints(SBTarget self) -> bool"""
+        return _lldb.SBTarget_DisableAllBreakpoints(self)
+
+
+    def DeleteAllBreakpoints(self):
+        """DeleteAllBreakpoints(SBTarget self) -> bool"""
+        return _lldb.SBTarget_DeleteAllBreakpoints(self)
+
+
+    def BreakpointsCreateFromFile(self, *args):
+        """
+        BreakpointsCreateFromFile(SBTarget self, SBFileSpec source_file, SBBreakpointList bkpt_list) -> SBError
+        BreakpointsCreateFromFile(SBTarget self, SBFileSpec source_file, SBStringList matching_names, SBBreakpointList new_bps) -> SBError
+
+
+        Read breakpoints from source_file and return the newly created
+        breakpoints in bkpt_list.
+
+        @param[in] source_file
+           The file from which to read the breakpoints
+
+        @param[in] matching_names
+           Only read in breakpoints whose names match one of the names in this
+           list.
+
+        @param[out] bkpt_list
+           A list of the newly created breakpoints.
+
+        @return
+            An SBError detailing any errors in reading in the breakpoints.
+        """
+        return _lldb.SBTarget_BreakpointsCreateFromFile(self, *args)
+
+
+    def BreakpointsWriteToFile(self, *args):
+        """
+        BreakpointsWriteToFile(SBTarget self, SBFileSpec dest_file) -> SBError
+        BreakpointsWriteToFile(SBTarget self, SBFileSpec dest_file, SBBreakpointList bkpt_list, bool append=False) -> SBError
+        BreakpointsWriteToFile(SBTarget self, SBFileSpec dest_file, SBBreakpointList bkpt_list) -> SBError
+        """
+        return _lldb.SBTarget_BreakpointsWriteToFile(self, *args)
+
+
+    def GetNumWatchpoints(self):
+        """GetNumWatchpoints(SBTarget self) -> uint32_t"""
+        return _lldb.SBTarget_GetNumWatchpoints(self)
+
+
+    def GetWatchpointAtIndex(self, idx):
+        """GetWatchpointAtIndex(SBTarget self, uint32_t idx) -> SBWatchpoint"""
+        return _lldb.SBTarget_GetWatchpointAtIndex(self, idx)
+
+
+    def DeleteWatchpoint(self, watch_id):
+        """DeleteWatchpoint(SBTarget self, lldb::watch_id_t watch_id) -> bool"""
+        return _lldb.SBTarget_DeleteWatchpoint(self, watch_id)
+
+
+    def FindWatchpointByID(self, watch_id):
+        """FindWatchpointByID(SBTarget self, lldb::watch_id_t watch_id) -> SBWatchpoint"""
+        return _lldb.SBTarget_FindWatchpointByID(self, watch_id)
+
+
+    def EnableAllWatchpoints(self):
+        """EnableAllWatchpoints(SBTarget self) -> bool"""
+        return _lldb.SBTarget_EnableAllWatchpoints(self)
+
+
+    def DisableAllWatchpoints(self):
+        """DisableAllWatchpoints(SBTarget self) -> bool"""
+        return _lldb.SBTarget_DisableAllWatchpoints(self)
+
+
+    def DeleteAllWatchpoints(self):
+        """DeleteAllWatchpoints(SBTarget self) -> bool"""
+        return _lldb.SBTarget_DeleteAllWatchpoints(self)
+
+
+    def WatchAddress(self, addr, size, read, write, error):
+        """WatchAddress(SBTarget self, lldb::addr_t addr, size_t size, bool read, bool write, SBError error) -> SBWatchpoint"""
+        return _lldb.SBTarget_WatchAddress(self, addr, size, read, write, error)
+
+
+    def GetBroadcaster(self):
+        """GetBroadcaster(SBTarget self) -> SBBroadcaster"""
+        return _lldb.SBTarget_GetBroadcaster(self)
+
+
+    def CreateValueFromAddress(self, name, addr, type):
+        """
+        CreateValueFromAddress(SBTarget self, char const * name, SBAddress addr, SBType type) -> SBValue
+
+
+        Create an SBValue with the given name by treating the memory starting at addr as an entity of type.
+
+        @param[in] name
+            The name of the resultant SBValue
+
+        @param[in] addr
+            The address of the start of the memory region to be used.
+
+        @param[in] type
+            The type to use to interpret the memory starting at addr.
+
+        @return
+            An SBValue of the given type, may be invalid if there was an error reading
+            the underlying memory.
+        """
+        return _lldb.SBTarget_CreateValueFromAddress(self, name, addr, type)
+
+
+    def CreateValueFromData(self, name, data, type):
+        """CreateValueFromData(SBTarget self, char const * name, SBData data, SBType type) -> SBValue"""
+        return _lldb.SBTarget_CreateValueFromData(self, name, data, type)
+
+
+    def CreateValueFromExpression(self, name, expr):
+        """CreateValueFromExpression(SBTarget self, char const * name, char const * expr) -> SBValue"""
+        return _lldb.SBTarget_CreateValueFromExpression(self, name, expr)
+
+
+    def ReadInstructions(self, *args):
+        """
+        ReadInstructions(SBTarget self, SBAddress base_addr, uint32_t count) -> SBInstructionList
+        ReadInstructions(SBTarget self, SBAddress base_addr, uint32_t count, char const * flavor_string) -> SBInstructionList
+
+
+        Disassemble a specified number of instructions starting at an address.
+        Parameters:
+           base_addr       -- the address to start disassembly from
+           count           -- the number of instructions to disassemble
+           flavor_string   -- may be 'intel' or 'att' on x86 targets to specify that style of disassembly
+        Returns an SBInstructionList.
+        """
+        return _lldb.SBTarget_ReadInstructions(self, *args)
+
+
+    def GetInstructions(self, base_addr, buf):
+        """
+        GetInstructions(SBTarget self, SBAddress base_addr, void const * buf) -> SBInstructionList
+
+
+        Disassemble the bytes in a buffer and return them in an SBInstructionList.
+        Parameters:
+           base_addr -- used for symbolicating the offsets in the byte stream when disassembling
+           buf       -- bytes to be disassembled
+           size      -- (C++) size of the buffer
+        Returns an SBInstructionList.
+        """
+        return _lldb.SBTarget_GetInstructions(self, base_addr, buf)
+
+
+    def GetInstructionsWithFlavor(self, base_addr, flavor_string, buf):
+        """
+        GetInstructionsWithFlavor(SBTarget self, SBAddress base_addr, char const * flavor_string, void const * buf) -> SBInstructionList
+
+
+        Disassemble the bytes in a buffer and return them in an SBInstructionList, with a supplied flavor.
+        Parameters:
+           base_addr -- used for symbolicating the offsets in the byte stream when disassembling
+           flavor    -- may be 'intel' or 'att' on x86 targets to specify that style of disassembly
+           buf       -- bytes to be disassembled
+           size      -- (C++) size of the buffer
+        Returns an SBInstructionList.
+        """
+        return _lldb.SBTarget_GetInstructionsWithFlavor(self, base_addr, flavor_string, buf)
+
+
+    def FindSymbols(self, *args):
+        """
+        FindSymbols(SBTarget self, char const * name, lldb::SymbolType type) -> SBSymbolContextList
+        FindSymbols(SBTarget self, char const * name) -> SBSymbolContextList
+        """
+        return _lldb.SBTarget_FindSymbols(self, *args)
+
+
+    def GetDescription(self, description, description_level):
+        """GetDescription(SBTarget self, SBStream description, lldb::DescriptionLevel description_level) -> bool"""
+        return _lldb.SBTarget_GetDescription(self, description, description_level)
+
+
+    def GetStackRedZoneSize(self):
+        """GetStackRedZoneSize(SBTarget self) -> lldb::addr_t"""
+        return _lldb.SBTarget_GetStackRedZoneSize(self)
+
+
+    def GetLaunchInfo(self):
+        """GetLaunchInfo(SBTarget self) -> SBLaunchInfo"""
+        return _lldb.SBTarget_GetLaunchInfo(self)
+
+
+    def SetLaunchInfo(self, launch_info):
+        """SetLaunchInfo(SBTarget self, SBLaunchInfo launch_info)"""
+        return _lldb.SBTarget_SetLaunchInfo(self, launch_info)
+
+
+    def SetCollectingStats(self, v):
+        """SetCollectingStats(SBTarget self, bool v)"""
+        return _lldb.SBTarget_SetCollectingStats(self, v)
+
+
+    def GetCollectingStats(self):
+        """GetCollectingStats(SBTarget self) -> bool"""
+        return _lldb.SBTarget_GetCollectingStats(self)
+
+
+    def GetStatistics(self):
+        """GetStatistics(SBTarget self) -> SBStructuredData"""
+        return _lldb.SBTarget_GetStatistics(self)
+
+
+    def __eq__(self, rhs):
+        """__eq__(SBTarget self, SBTarget rhs) -> bool"""
+        return _lldb.SBTarget___eq__(self, rhs)
+
+
+    def __ne__(self, rhs):
+        """__ne__(SBTarget self, SBTarget rhs) -> bool"""
+        return _lldb.SBTarget___ne__(self, rhs)
+
+
+    def EvaluateExpression(self, *args):
+        """
+        EvaluateExpression(SBTarget self, char const * expr) -> SBValue
+        EvaluateExpression(SBTarget self, char const * expr, SBExpressionOptions options) -> SBValue
+        """
+        return _lldb.SBTarget_EvaluateExpression(self, *args)
+
+
+    class modules_access(object):
+        '''A helper object that will lazily hand out lldb.SBModule objects for a target when supplied an index, or by full or partial path.'''
+        def __init__(self, sbtarget):
+            self.sbtarget = sbtarget
+
+        def __len__(self):
+            if self.sbtarget:
+                return int(self.sbtarget.GetNumModules())
+            return 0
+
+        def __getitem__(self, key):
+            num_modules = self.sbtarget.GetNumModules()
+            if type(key) is int:
+                if key < num_modules:
+                    return self.sbtarget.GetModuleAtIndex(key)
+            elif type(key) is str:
+                if key.find('/') == -1:
+                    for idx in range(num_modules):
+                        module = self.sbtarget.GetModuleAtIndex(idx)
+                        if module.file.basename == key:
+                            return module
+                else:
+                    for idx in range(num_modules):
+                        module = self.sbtarget.GetModuleAtIndex(idx)
+                        if module.file.fullpath == key:
+                            return module
+    # See if the string is a UUID
+                try:
+                    the_uuid = uuid.UUID(key)
+                    if the_uuid:
+                        for idx in range(num_modules):
+                            module = self.sbtarget.GetModuleAtIndex(idx)
+                            if module.uuid == the_uuid:
+                                return module
+                except:
+                    return None
+            elif type(key) is uuid.UUID:
+                for idx in range(num_modules):
+                    module = self.sbtarget.GetModuleAtIndex(idx)
+                    if module.uuid == key:
+                        return module
+            elif type(key) is re.SRE_Pattern:
+                matching_modules = []
+                for idx in range(num_modules):
+                    module = self.sbtarget.GetModuleAtIndex(idx)
+                    re_match = key.search(module.path.fullpath)
+                    if re_match:
+                        matching_modules.append(module)
+                return matching_modules
+            else:
+                print("error: unsupported item type: %s" % type(key))
+            return None
+
+    def get_modules_access_object(self):
+        '''An accessor function that returns a modules_access() object which allows lazy module access from a lldb.SBTarget object.'''
+        return self.modules_access (self)
+
+    def get_modules_array(self):
+        '''An accessor function that returns a list() that contains all modules in a lldb.SBTarget object.'''
+        modules = []
+        for idx in range(self.GetNumModules()):
+            modules.append(self.GetModuleAtIndex(idx))
+        return modules
+
+    def module_iter(self):
+        '''Returns an iterator over all modules in a lldb.SBTarget
+        object.'''
+        return lldb_iter(self, 'GetNumModules', 'GetModuleAtIndex')
+
+    def breakpoint_iter(self):
+        '''Returns an iterator over all breakpoints in a lldb.SBTarget
+        object.'''
+        return lldb_iter(self, 'GetNumBreakpoints', 'GetBreakpointAtIndex')
+
+    def watchpoint_iter(self):
+        '''Returns an iterator over all watchpoints in a lldb.SBTarget
+        object.'''
+        return lldb_iter(self, 'GetNumWatchpoints', 'GetWatchpointAtIndex')
+
+    modules = property(get_modules_array, None, doc='''A read only property that returns a list() of lldb.SBModule objects contained in this target. This list is a list all modules that the target currently is tracking (the main executable and all dependent shared libraries).''')
+    module = property(get_modules_access_object, None, doc=r'''A read only property that returns an object that implements python operator overloading with the square brackets().\n    target.module[<int>] allows array access to any modules.\n    target.module[<str>] allows access to modules by basename, full path, or uuid string value.\n    target.module[uuid.UUID()] allows module access by UUID.\n    target.module[re] allows module access using a regular expression that matches the module full path.''')
+    process = property(GetProcess, None, doc='''A read only property that returns an lldb object that represents the process (lldb.SBProcess) that this target owns.''')
+    executable = property(GetExecutable, None, doc='''A read only property that returns an lldb object that represents the main executable module (lldb.SBModule) for this target.''')
+    debugger = property(GetDebugger, None, doc='''A read only property that returns an lldb object that represents the debugger (lldb.SBDebugger) that owns this target.''')
+    num_breakpoints = property(GetNumBreakpoints, None, doc='''A read only property that returns the number of breakpoints that this target has as an integer.''')
+    num_watchpoints = property(GetNumWatchpoints, None, doc='''A read only property that returns the number of watchpoints that this target has as an integer.''')
+    broadcaster = property(GetBroadcaster, None, doc='''A read only property that an lldb object that represents the broadcaster (lldb.SBBroadcaster) for this target.''')
+    byte_order = property(GetByteOrder, None, doc='''A read only property that returns an lldb enumeration value (lldb.eByteOrderLittle, lldb.eByteOrderBig, lldb.eByteOrderInvalid) that represents the byte order for this target.''')
+    addr_size = property(GetAddressByteSize, None, doc='''A read only property that returns the size in bytes of an address for this target.''')
+    triple = property(GetTriple, None, doc='''A read only property that returns the target triple (arch-vendor-os) for this target as a string.''')
+    data_byte_size = property(GetDataByteSize, None, doc='''A read only property that returns the size in host bytes of a byte in the data address space for this target.''')
+    code_byte_size = property(GetCodeByteSize, None, doc='''A read only property that returns the size in host bytes of a byte in the code address space for this target.''')
+    platform = property(GetPlatform, None, doc='''A read only property that returns the platform associated with with this target.''')
+
+
+    def __str__(self):
+        """__str__(SBTarget self) -> PyObject *"""
+        return _lldb.SBTarget___str__(self)
+
+
+    def __eq__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return False 
+
+        return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
+
+    def __ne__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return True 
+
+        return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
+
+SBTarget_swigregister = _lldb.SBTarget_swigregister
+SBTarget_swigregister(SBTarget)
+
+def SBTarget_GetBroadcasterClassName():
+    """SBTarget_GetBroadcasterClassName() -> char const *"""
+    return _lldb.SBTarget_GetBroadcasterClassName()
+
+def SBTarget_EventIsTargetEvent(event):
+    """SBTarget_EventIsTargetEvent(SBEvent event) -> bool"""
+    return _lldb.SBTarget_EventIsTargetEvent(event)
+
+def SBTarget_GetTargetFromEvent(event):
+    """SBTarget_GetTargetFromEvent(SBEvent event) -> SBTarget"""
+    return _lldb.SBTarget_GetTargetFromEvent(event)
+
+def SBTarget_GetNumModulesFromEvent(event):
+    """SBTarget_GetNumModulesFromEvent(SBEvent event) -> uint32_t"""
+    return _lldb.SBTarget_GetNumModulesFromEvent(event)
+
+def SBTarget_GetModuleAtIndexFromEvent(idx, event):
+    """SBTarget_GetModuleAtIndexFromEvent(uint32_t const idx, SBEvent event) -> SBModule"""
+    return _lldb.SBTarget_GetModuleAtIndexFromEvent(idx, event)
+
+class SBThread(_object):
+    """
+    Represents a thread of execution. SBProcess contains SBThread(s).
+
+    SBThreads can be referred to by their ID, which maps to the system specific thread
+    identifier, or by IndexID.  The ID may or may not be unique depending on whether the
+    system reuses its thread identifiers.  The IndexID is a monotonically increasing identifier
+    that will always uniquely reference a particular thread, and when that thread goes
+    away it will not be reused.
+
+    SBThread supports frame iteration. For example (from test/python_api/
+    lldbutil/iter/TestLLDBIterator.py),
+
+            from lldbutil import print_stacktrace
+            stopped_due_to_breakpoint = False
+            for thread in process:
+                if self.TraceOn():
+                    print_stacktrace(thread)
+                ID = thread.GetThreadID()
+                if thread.GetStopReason() == lldb.eStopReasonBreakpoint:
+                    stopped_due_to_breakpoint = True
+                for frame in thread:
+                    self.assertTrue(frame.GetThread().GetThreadID() == ID)
+                    if self.TraceOn():
+                        print frame
+
+            self.assertTrue(stopped_due_to_breakpoint)
+
+    See also SBProcess and SBFrame.
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBThread, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBThread, name)
+    __repr__ = _swig_repr
+    eBroadcastBitStackChanged = _lldb.SBThread_eBroadcastBitStackChanged
+    eBroadcastBitThreadSuspended = _lldb.SBThread_eBroadcastBitThreadSuspended
+    eBroadcastBitThreadResumed = _lldb.SBThread_eBroadcastBitThreadResumed
+    eBroadcastBitSelectedFrameChanged = _lldb.SBThread_eBroadcastBitSelectedFrameChanged
+    eBroadcastBitThreadSelected = _lldb.SBThread_eBroadcastBitThreadSelected
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBThread self) -> SBThread
+        __init__(lldb::SBThread self, SBThread thread) -> SBThread
+        """
+        this = _lldb.new_SBThread(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBThread
+    __del__ = lambda self: None
+
+    def GetBroadcasterClassName():
+        """GetBroadcasterClassName() -> char const *"""
+        return _lldb.SBThread_GetBroadcasterClassName()
+
+    GetBroadcasterClassName = staticmethod(GetBroadcasterClassName)
+
+    def EventIsThreadEvent(event):
+        """EventIsThreadEvent(SBEvent event) -> bool"""
+        return _lldb.SBThread_EventIsThreadEvent(event)
+
+    EventIsThreadEvent = staticmethod(EventIsThreadEvent)
+
+    def GetStackFrameFromEvent(event):
+        """GetStackFrameFromEvent(SBEvent event) -> SBFrame"""
+        return _lldb.SBThread_GetStackFrameFromEvent(event)
+
+    GetStackFrameFromEvent = staticmethod(GetStackFrameFromEvent)
+
+    def GetThreadFromEvent(event):
+        """GetThreadFromEvent(SBEvent event) -> SBThread"""
+        return _lldb.SBThread_GetThreadFromEvent(event)
+
+    GetThreadFromEvent = staticmethod(GetThreadFromEvent)
+
+    def IsValid(self):
+        """IsValid(SBThread self) -> bool"""
+        return _lldb.SBThread_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBThread___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def Clear(self):
+        """Clear(SBThread self)"""
+        return _lldb.SBThread_Clear(self)
+
+
+    def GetStopReason(self):
+        """GetStopReason(SBThread self) -> lldb::StopReason"""
+        return _lldb.SBThread_GetStopReason(self)
+
+
+    def GetStopReasonDataCount(self):
+        """
+        GetStopReasonDataCount(SBThread self) -> size_t
+
+
+        Get the number of words associated with the stop reason.
+        See also GetStopReasonDataAtIndex().
+        """
+        return _lldb.SBThread_GetStopReasonDataCount(self)
+
+
+    def GetStopReasonDataAtIndex(self, idx):
+        """
+        GetStopReasonDataAtIndex(SBThread self, uint32_t idx) -> uint64_t
+
+
+        Get information associated with a stop reason.
+
+        Breakpoint stop reasons will have data that consists of pairs of
+        breakpoint IDs followed by the breakpoint location IDs (they always come
+        in pairs).
+
+        Stop Reason              Count Data Type
+        ======================== ===== =========================================
+        eStopReasonNone          0
+        eStopReasonTrace         0
+        eStopReasonBreakpoint    N     duple: {breakpoint id, location id}
+        eStopReasonWatchpoint    1     watchpoint id
+        eStopReasonSignal        1     unix signal number
+        eStopReasonException     N     exception data
+        eStopReasonExec          0
+        eStopReasonPlanComplete  0
+        """
+        return _lldb.SBThread_GetStopReasonDataAtIndex(self, idx)
+
+
+    def GetStopReasonExtendedInfoAsJSON(self, stream):
+        """
+
+        Collects a thread's stop reason extended information dictionary and prints it
+        into the SBStream in a JSON format. The format of this JSON dictionary depends
+        on the stop reason and is currently used only for instrumentation plugins.
+        """
+        return _lldb.SBThread_GetStopReasonExtendedInfoAsJSON(self, stream)
+
+
+    def GetStopReasonExtendedBacktraces(self, type):
+        """
+
+        Returns a collection of historical stack traces that are significant to the
+        current stop reason. Used by ThreadSanitizer, where we provide various stack
+        traces that were involved in a data race or other type of detected issue.
+        """
+        return _lldb.SBThread_GetStopReasonExtendedBacktraces(self, type)
+
+
+    def GetStopDescription(self, dst):
+        """
+
+        Pass only an (int)length and expect to get a Python string describing the
+        stop reason.
+        """
+        return _lldb.SBThread_GetStopDescription(self, dst)
+
+
+    def GetStopReturnValue(self):
+        """GetStopReturnValue(SBThread self) -> SBValue"""
+        return _lldb.SBThread_GetStopReturnValue(self)
+
+
+    def GetThreadID(self):
+        """
+
+        Returns a unique thread identifier (type lldb::tid_t, typically a 64-bit type)
+        for the current SBThread that will remain constant throughout the thread's
+        lifetime in this process and will not be reused by another thread during this
+        process lifetime.  On Mac OS X systems, this is a system-wide unique thread
+        identifier; this identifier is also used by other tools like sample which helps
+        to associate data from those tools with lldb.  See related GetIndexID.
+        """
+        return _lldb.SBThread_GetThreadID(self)
+
+
+    def GetIndexID(self):
+        """
+
+        Return the index number for this SBThread.  The index number is the same thing
+        that a user gives as an argument to 'thread select' in the command line lldb.
+        These numbers start at 1 (for the first thread lldb sees in a debug session)
+        and increments up throughout the process lifetime.  An index number will not be
+        reused for a different thread later in a process - thread 1 will always be
+        associated with the same thread.  See related GetThreadID.
+        This method returns a uint32_t index number, takes no arguments.
+        """
+        return _lldb.SBThread_GetIndexID(self)
+
+
+    def GetName(self):
+        """GetName(SBThread self) -> char const *"""
+        return _lldb.SBThread_GetName(self)
+
+
+    def GetQueueName(self):
+        """
+
+        Return the queue name associated with this thread, if any, as a str.
+        For example, with a libdispatch (aka Grand Central Dispatch) queue.
+        """
+        return _lldb.SBThread_GetQueueName(self)
+
+
+    def GetQueueID(self):
+        """
+
+        Return the dispatch_queue_id for this thread, if any, as a lldb::queue_id_t.
+        For example, with a libdispatch (aka Grand Central Dispatch) queue.
+        """
+        return _lldb.SBThread_GetQueueID(self)
+
+
+    def GetInfoItemByPathAsString(self, path, strm):
+        """
+        GetInfoItemByPathAsString(SBThread self, char const * path, SBStream strm) -> bool
+
+
+        Takes a path string and a SBStream reference as parameters, returns a bool.
+        Collects the thread's 'info' dictionary from the remote system, uses the path
+        argument to descend into the dictionary to an item of interest, and prints
+        it into the SBStream in a natural format.  Return bool is to indicate if
+        anything was printed into the stream (true) or not (false).
+        """
+        return _lldb.SBThread_GetInfoItemByPathAsString(self, path, strm)
+
+
+    def GetQueue(self):
+        """
+
+        Return the SBQueue for this thread.  If this thread is not currently associated
+        with a libdispatch queue, the SBQueue object's IsValid() method will return false.
+        If this SBThread is actually a HistoryThread, we may be able to provide QueueID
+        and QueueName, but not provide an SBQueue.  Those individual attributes may have
+        been saved for the HistoryThread without enough information to reconstitute the
+        entire SBQueue at that time.
+        This method takes no arguments, returns an SBQueue.
+        """
+        return _lldb.SBThread_GetQueue(self)
+
+
+    def StepOver(self, *args):
+        """
+        StepOver(SBThread self, lldb::RunMode stop_other_threads)
+        StepOver(SBThread self)
+        Do a source level single step over in the currently selected thread.
+        """
+        return _lldb.SBThread_StepOver(self, *args)
+
+
+    def StepInto(self, *args):
+        """
+        StepInto(SBThread self, lldb::RunMode stop_other_threads)
+        StepInto(SBThread self)
+        StepInto(SBThread self, char const * target_name, lldb::RunMode stop_other_threads)
+        StepInto(SBThread self, char const * target_name)
+
+            Step the current thread from the current source line to the line given by end_line, stopping if
+            the thread steps into the function given by target_name.  If target_name is None, then stepping will stop
+            in any of the places we would normally stop.
+
+            Step the current thread from the current source line to the line given by end_line, stopping if
+            the thread steps into the function given by target_name.  If target_name is None, then stepping will stop
+            in any of the places we would normally stop.
+        """
+        return _lldb.SBThread_StepInto(self, *args)
+
+
+    def StepOut(self, *args):
+        """
+        StepOut(SBThread self)
+        Step out of the currently selected thread.
+        """
+        return _lldb.SBThread_StepOut(self, *args)
+
+
+    def StepOutOfFrame(self, *args):
+        """
+        StepOutOfFrame(SBThread self, SBFrame frame)
+        Step out of the specified frame.
+        """
+        return _lldb.SBThread_StepOutOfFrame(self, *args)
+
+
+    def StepInstruction(self, *args):
+        """
+        StepInstruction(SBThread self, bool step_over)
+        Do an instruction level single step in the currently selected thread.
+        """
+        return _lldb.SBThread_StepInstruction(self, *args)
+
+
+    def StepOverUntil(self, frame, file_spec, line):
+        """StepOverUntil(SBThread self, SBFrame frame, SBFileSpec file_spec, uint32_t line) -> SBError"""
+        return _lldb.SBThread_StepOverUntil(self, frame, file_spec, line)
+
+
+    def StepUsingScriptedThreadPlan(self, *args):
+        """
+        StepUsingScriptedThreadPlan(SBThread self, char const * script_class_name) -> SBError
+        StepUsingScriptedThreadPlan(SBThread self, char const * script_class_name, bool resume_immediately) -> SBError
+        """
+        return _lldb.SBThread_StepUsingScriptedThreadPlan(self, *args)
+
+
+    def JumpToLine(self, file_spec, line):
+        """JumpToLine(SBThread self, SBFileSpec file_spec, uint32_t line) -> SBError"""
+        return _lldb.SBThread_JumpToLine(self, file_spec, line)
+
+
+    def RunToAddress(self, *args):
+        """
+        RunToAddress(SBThread self, lldb::addr_t addr)
+        RunToAddress(SBThread self, lldb::addr_t addr, SBError error)
+        """
+        return _lldb.SBThread_RunToAddress(self, *args)
+
+
+    def ReturnFromFrame(self, frame, return_value):
+        """
+
+        Force a return from the frame passed in (and any frames younger than it)
+        without executing any more code in those frames.  If return_value contains
+        a valid SBValue, that will be set as the return value from frame.  Note, at
+        present only scalar return values are supported.
+        """
+        return _lldb.SBThread_ReturnFromFrame(self, frame, return_value)
+
+
+    def UnwindInnermostExpression(self):
+        """
+
+        Unwind the stack frames from the innermost expression evaluation.
+        This API is equivalent to 'thread return -x'.
+        """
+        return _lldb.SBThread_UnwindInnermostExpression(self)
+
+
+    def Suspend(self, *args):
+        """
+        Suspend(SBThread self) -> bool
+        Suspend(SBThread self, SBError error) -> bool
+
+
+        LLDB currently supports process centric debugging which means when any
+        thread in a process stops, all other threads are stopped. The Suspend()
+        call here tells our process to suspend a thread and not let it run when
+        the other threads in a process are allowed to run. So when
+        SBProcess::Continue() is called, any threads that aren't suspended will
+        be allowed to run. If any of the SBThread functions for stepping are
+        called (StepOver, StepInto, StepOut, StepInstruction, RunToAddres), the
+        thread will now be allowed to run and these functions will simply return.
+
+        Eventually we plan to add support for thread centric debugging where
+        each thread is controlled individually and each thread would broadcast
+        its state, but we haven't implemented this yet.
+
+        Likewise the SBThread::Resume() call will again allow the thread to run
+        when the process is continued.
+
+        Suspend() and Resume() functions are not currently reference counted, if
+        anyone has the need for them to be reference counted, please let us
+        know.
+        """
+        return _lldb.SBThread_Suspend(self, *args)
+
+
+    def Resume(self, *args):
+        """
+        Resume(SBThread self) -> bool
+        Resume(SBThread self, SBError error) -> bool
+        """
+        return _lldb.SBThread_Resume(self, *args)
+
+
+    def IsSuspended(self):
+        """IsSuspended(SBThread self) -> bool"""
+        return _lldb.SBThread_IsSuspended(self)
+
+
+    def IsStopped(self):
+        """IsStopped(SBThread self) -> bool"""
+        return _lldb.SBThread_IsStopped(self)
+
+
+    def GetNumFrames(self):
+        """GetNumFrames(SBThread self) -> uint32_t"""
+        return _lldb.SBThread_GetNumFrames(self)
+
+
+    def GetFrameAtIndex(self, idx):
+        """GetFrameAtIndex(SBThread self, uint32_t idx) -> SBFrame"""
+        return _lldb.SBThread_GetFrameAtIndex(self, idx)
+
+
+    def GetSelectedFrame(self):
+        """GetSelectedFrame(SBThread self) -> SBFrame"""
+        return _lldb.SBThread_GetSelectedFrame(self)
+
+
+    def SetSelectedFrame(self, frame_idx):
+        """SetSelectedFrame(SBThread self, uint32_t frame_idx) -> SBFrame"""
+        return _lldb.SBThread_SetSelectedFrame(self, frame_idx)
+
+
+    def GetProcess(self):
+        """GetProcess(SBThread self) -> SBProcess"""
+        return _lldb.SBThread_GetProcess(self)
+
+
+    def GetDescription(self, *args):
+        """
+        GetDescription(SBThread self, SBStream description) -> bool
+        GetDescription(SBThread self, SBStream description, bool stop_format) -> bool
+
+
+        Get the description strings for this thread that match what the
+        lldb driver will present, using the thread-format (stop_format==false)
+        or thread-stop-format (stop_format = true).
+        """
+        return _lldb.SBThread_GetDescription(self, *args)
+
+
+    def GetStatus(self, status):
+        """GetStatus(SBThread self, SBStream status) -> bool"""
+        return _lldb.SBThread_GetStatus(self, status)
+
+
+    def __eq__(self, rhs):
+        """__eq__(SBThread self, SBThread rhs) -> bool"""
+        return _lldb.SBThread___eq__(self, rhs)
+
+
+    def __ne__(self, rhs):
+        """__ne__(SBThread self, SBThread rhs) -> bool"""
+        return _lldb.SBThread___ne__(self, rhs)
+
+
+    def GetExtendedBacktraceThread(self, type):
+        """
+
+        Given an argument of str to specify the type of thread-origin extended
+        backtrace to retrieve, query whether the origin of this thread is
+        available.  An SBThread is retured; SBThread.IsValid will return true
+        if an extended backtrace was available.  The returned SBThread is not
+        a part of the SBProcess' thread list and it cannot be manipulated like
+        normal threads -- you cannot step or resume it, for instance -- it is
+        intended to used primarily for generating a backtrace.  You may request
+        the returned thread's own thread origin in turn.
+        """
+        return _lldb.SBThread_GetExtendedBacktraceThread(self, type)
+
+
+    def GetExtendedBacktraceOriginatingIndexID(self):
+        """
+
+        Takes no arguments, returns a uint32_t.
+        If this SBThread is an ExtendedBacktrace thread, get the IndexID of the
+        original thread that this ExtendedBacktrace thread represents, if
+        available.  The thread that was running this backtrace in the past may
+        not have been registered with lldb's thread index (if it was created,
+        did its work, and was destroyed without lldb ever stopping execution).
+        In that case, this ExtendedBacktrace thread's IndexID will be returned.
+        """
+        return _lldb.SBThread_GetExtendedBacktraceOriginatingIndexID(self)
+
+
+    def GetCurrentException(self):
+        """
+
+        Returns an SBValue object represeting the current exception for the thread,
+        if there is any. Currently, this works for Obj-C code and returns an SBValue
+        representing the NSException object at the throw site or that's currently
+        being processes.
+        """
+        return _lldb.SBThread_GetCurrentException(self)
+
+
+    def GetCurrentExceptionBacktrace(self):
+        """
+
+        Returns a historical (fake) SBThread representing the stack trace of an
+        exception, if there is one for the thread. Currently, this works for Obj-C
+        code, and can retrieve the throw-site backtrace of an NSException object
+        even when the program is no longer at the throw site.
+        """
+        return _lldb.SBThread_GetCurrentExceptionBacktrace(self)
+
+
+    def SafeToCallFunctions(self):
+        """
+
+        Takes no arguments, returns a bool.
+        lldb may be able to detect that function calls should not be executed
+        on a given thread at a particular point in time.  It is recommended that
+        this is checked before performing an inferior function call on a given
+        thread.
+        """
+        return _lldb.SBThread_SafeToCallFunctions(self)
+
+
+    def __iter__(self):
+        '''Iterate over all frames in a lldb.SBThread object.'''
+        return lldb_iter(self, 'GetNumFrames', 'GetFrameAtIndex')
+
+    def __len__(self):
+        '''Return the number of frames in a lldb.SBThread object.'''
+        return self.GetNumFrames()
+
+    class frames_access(object):
+        '''A helper object that will lazily hand out frames for a thread when supplied an index.'''
+        def __init__(self, sbthread):
+            self.sbthread = sbthread
+
+        def __len__(self):
+            if self.sbthread:
+                return int(self.sbthread.GetNumFrames())
+            return 0
+
+        def __getitem__(self, key):
+            if type(key) is int and key < self.sbthread.GetNumFrames():
+                return self.sbthread.GetFrameAtIndex(key)
+            return None
+
+    def get_frames_access_object(self):
+        '''An accessor function that returns a frames_access() object which allows lazy frame access from a lldb.SBThread object.'''
+        return self.frames_access (self)
+
+    def get_thread_frames(self):
+        '''An accessor function that returns a list() that contains all frames in a lldb.SBThread object.'''
+        frames = []
+        for frame in self:
+            frames.append(frame)
+        return frames
+
+    id = property(GetThreadID, None, doc='''A read only property that returns the thread ID as an integer.''')
+    idx = property(GetIndexID, None, doc='''A read only property that returns the thread index ID as an integer. Thread index ID values start at 1 and increment as threads come and go and can be used to uniquely identify threads.''')
+    return_value = property(GetStopReturnValue, None, doc='''A read only property that returns an lldb object that represents the return value from the last stop (lldb.SBValue) if we just stopped due to stepping out of a function.''')
+    process = property(GetProcess, None, doc='''A read only property that returns an lldb object that represents the process (lldb.SBProcess) that owns this thread.''')
+    num_frames = property(GetNumFrames, None, doc='''A read only property that returns the number of stack frames in this thread as an integer.''')
+    frames = property(get_thread_frames, None, doc='''A read only property that returns a list() of lldb.SBFrame objects for all frames in this thread.''')
+    frame = property(get_frames_access_object, None, doc='''A read only property that returns an object that can be used to access frames as an array ("frame_12 = lldb.thread.frame[12]").''')
+    name = property(GetName, None, doc='''A read only property that returns the name of this thread as a string.''')
+    queue = property(GetQueueName, None, doc='''A read only property that returns the dispatch queue name of this thread as a string.''')
+    queue_id = property(GetQueueID, None, doc='''A read only property that returns the dispatch queue id of this thread as an integer.''')
+    stop_reason = property(GetStopReason, None, doc='''A read only property that returns an lldb enumeration value (see enumerations that start with "lldb.eStopReason") that represents the reason this thread stopped.''')
+    is_suspended = property(IsSuspended, None, doc='''A read only property that returns a boolean value that indicates if this thread is suspended.''')
+    is_stopped = property(IsStopped, None, doc='''A read only property that returns a boolean value that indicates if this thread is stopped but not exited.''')
+
+
+    def __str__(self):
+        """__str__(SBThread self) -> PyObject *"""
+        return _lldb.SBThread___str__(self)
+
+
+    def __eq__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return False 
+
+        return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
+
+    def __ne__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return True 
+
+        return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
+
+SBThread_swigregister = _lldb.SBThread_swigregister
+SBThread_swigregister(SBThread)
+
+def SBThread_GetBroadcasterClassName():
+    """SBThread_GetBroadcasterClassName() -> char const *"""
+    return _lldb.SBThread_GetBroadcasterClassName()
+
+def SBThread_EventIsThreadEvent(event):
+    """SBThread_EventIsThreadEvent(SBEvent event) -> bool"""
+    return _lldb.SBThread_EventIsThreadEvent(event)
+
+def SBThread_GetStackFrameFromEvent(event):
+    """SBThread_GetStackFrameFromEvent(SBEvent event) -> SBFrame"""
+    return _lldb.SBThread_GetStackFrameFromEvent(event)
+
+def SBThread_GetThreadFromEvent(event):
+    """SBThread_GetThreadFromEvent(SBEvent event) -> SBThread"""
+    return _lldb.SBThread_GetThreadFromEvent(event)
+
+class SBThreadCollection(_object):
+    """Represents a collection of SBThread objects."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBThreadCollection, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBThreadCollection, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBThreadCollection self) -> SBThreadCollection
+        __init__(lldb::SBThreadCollection self, SBThreadCollection rhs) -> SBThreadCollection
+        """
+        this = _lldb.new_SBThreadCollection(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBThreadCollection
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBThreadCollection self) -> bool"""
+        return _lldb.SBThreadCollection_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBThreadCollection___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetSize(self):
+        """GetSize(SBThreadCollection self) -> size_t"""
+        return _lldb.SBThreadCollection_GetSize(self)
+
+
+    def GetThreadAtIndex(self, idx):
+        """GetThreadAtIndex(SBThreadCollection self, size_t idx) -> SBThread"""
+        return _lldb.SBThreadCollection_GetThreadAtIndex(self, idx)
+
+SBThreadCollection_swigregister = _lldb.SBThreadCollection_swigregister
+SBThreadCollection_swigregister(SBThreadCollection)
+
+class SBThreadPlan(_object):
+    """Proxy of C++ lldb::SBThreadPlan class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBThreadPlan, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBThreadPlan, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBThreadPlan self) -> SBThreadPlan
+        __init__(lldb::SBThreadPlan self, SBThreadPlan threadPlan) -> SBThreadPlan
+        __init__(lldb::SBThreadPlan self, lldb::ThreadPlanSP const & lldb_object_sp) -> SBThreadPlan
+        __init__(lldb::SBThreadPlan self, SBThread thread, char const * class_name) -> SBThreadPlan
+        """
+        this = _lldb.new_SBThreadPlan(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBThreadPlan
+    __del__ = lambda self: None
+
+    def __nonzero__(self):
+        return _lldb.SBThreadPlan___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def Clear(self):
+        """Clear(SBThreadPlan self)"""
+        return _lldb.SBThreadPlan_Clear(self)
+
+
+    def GetStopReason(self):
+        """GetStopReason(SBThreadPlan self) -> lldb::StopReason"""
+        return _lldb.SBThreadPlan_GetStopReason(self)
+
+
+    def GetStopReasonDataCount(self):
+        """
+        GetStopReasonDataCount(SBThreadPlan self) -> size_t
+
+
+        Get the number of words associated with the stop reason.
+        See also GetStopReasonDataAtIndex().
+        """
+        return _lldb.SBThreadPlan_GetStopReasonDataCount(self)
+
+
+    def GetStopReasonDataAtIndex(self, idx):
+        """
+        GetStopReasonDataAtIndex(SBThreadPlan self, uint32_t idx) -> uint64_t
+
+
+        Get information associated with a stop reason.
+
+        Breakpoint stop reasons will have data that consists of pairs of
+        breakpoint IDs followed by the breakpoint location IDs (they always come
+        in pairs).
+
+        Stop Reason              Count Data Type
+        ======================== ===== =========================================
+        eStopReasonNone          0
+        eStopReasonTrace         0
+        eStopReasonBreakpoint    N     duple: {breakpoint id, location id}
+        eStopReasonWatchpoint    1     watchpoint id
+        eStopReasonSignal        1     unix signal number
+        eStopReasonException     N     exception data
+        eStopReasonExec          0
+        eStopReasonPlanComplete  0
+        """
+        return _lldb.SBThreadPlan_GetStopReasonDataAtIndex(self, idx)
+
+
+    def GetThread(self):
+        """GetThread(SBThreadPlan self) -> SBThread"""
+        return _lldb.SBThreadPlan_GetThread(self)
+
+
+    def GetDescription(self, description):
+        """GetDescription(SBThreadPlan self, SBStream description) -> bool"""
+        return _lldb.SBThreadPlan_GetDescription(self, description)
+
+
+    def SetPlanComplete(self, success):
+        """SetPlanComplete(SBThreadPlan self, bool success)"""
+        return _lldb.SBThreadPlan_SetPlanComplete(self, success)
+
+
+    def IsPlanComplete(self):
+        """IsPlanComplete(SBThreadPlan self) -> bool"""
+        return _lldb.SBThreadPlan_IsPlanComplete(self)
+
+
+    def IsPlanStale(self):
+        """IsPlanStale(SBThreadPlan self) -> bool"""
+        return _lldb.SBThreadPlan_IsPlanStale(self)
+
+
+    def IsValid(self, *args):
+        """
+        IsValid(SBThreadPlan self) -> bool
+        IsValid(SBThreadPlan self) -> bool
+        """
+        return _lldb.SBThreadPlan_IsValid(self, *args)
+
+
+    def QueueThreadPlanForStepOverRange(self, start_address, range_size):
+        """QueueThreadPlanForStepOverRange(SBThreadPlan self, SBAddress start_address, lldb::addr_t range_size) -> SBThreadPlan"""
+        return _lldb.SBThreadPlan_QueueThreadPlanForStepOverRange(self, start_address, range_size)
+
+
+    def QueueThreadPlanForStepInRange(self, start_address, range_size):
+        """QueueThreadPlanForStepInRange(SBThreadPlan self, SBAddress start_address, lldb::addr_t range_size) -> SBThreadPlan"""
+        return _lldb.SBThreadPlan_QueueThreadPlanForStepInRange(self, start_address, range_size)
+
+
+    def QueueThreadPlanForStepOut(self, frame_idx_to_step_to, first_insn=False):
+        """
+        QueueThreadPlanForStepOut(SBThreadPlan self, uint32_t frame_idx_to_step_to, bool first_insn=False) -> SBThreadPlan
+        QueueThreadPlanForStepOut(SBThreadPlan self, uint32_t frame_idx_to_step_to) -> SBThreadPlan
+        """
+        return _lldb.SBThreadPlan_QueueThreadPlanForStepOut(self, frame_idx_to_step_to, first_insn)
+
+
+    def QueueThreadPlanForRunToAddress(self, address):
+        """QueueThreadPlanForRunToAddress(SBThreadPlan self, SBAddress address) -> SBThreadPlan"""
+        return _lldb.SBThreadPlan_QueueThreadPlanForRunToAddress(self, address)
+
+
+    def QueueThreadPlanForStepScripted(self, script_class_name):
+        """QueueThreadPlanForStepScripted(SBThreadPlan self, char const * script_class_name) -> SBThreadPlan"""
+        return _lldb.SBThreadPlan_QueueThreadPlanForStepScripted(self, script_class_name)
+
+SBThreadPlan_swigregister = _lldb.SBThreadPlan_swigregister
+SBThreadPlan_swigregister(SBThreadPlan)
+
+class SBTrace(_object):
+    """Proxy of C++ lldb::SBTrace class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBTrace, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBTrace, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """__init__(lldb::SBTrace self) -> SBTrace"""
+        this = _lldb.new_SBTrace()
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+
+    def GetTraceData(self, error, buf, offset, thread_id):
+        """GetTraceData(SBTrace self, SBError error, void * buf, size_t offset, lldb::tid_t thread_id) -> size_t"""
+        return _lldb.SBTrace_GetTraceData(self, error, buf, offset, thread_id)
+
+
+    def GetMetaData(self, error, buf, offset, thread_id):
+        """GetMetaData(SBTrace self, SBError error, void * buf, size_t offset, lldb::tid_t thread_id) -> size_t"""
+        return _lldb.SBTrace_GetMetaData(self, error, buf, offset, thread_id)
+
+
+    def StopTrace(self, error, thread_id):
+        """StopTrace(SBTrace self, SBError error, lldb::tid_t thread_id)"""
+        return _lldb.SBTrace_StopTrace(self, error, thread_id)
+
+
+    def GetTraceConfig(self, options, error):
+        """GetTraceConfig(SBTrace self, SBTraceOptions options, SBError error)"""
+        return _lldb.SBTrace_GetTraceConfig(self, options, error)
+
+
+    def GetTraceUID(self):
+        """GetTraceUID(SBTrace self) -> lldb::user_id_t"""
+        return _lldb.SBTrace_GetTraceUID(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBTrace___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def IsValid(self):
+        """IsValid(SBTrace self) -> bool"""
+        return _lldb.SBTrace_IsValid(self)
+
+    __swig_destroy__ = _lldb.delete_SBTrace
+    __del__ = lambda self: None
+SBTrace_swigregister = _lldb.SBTrace_swigregister
+SBTrace_swigregister(SBTrace)
+
+class SBTraceOptions(_object):
+    """Proxy of C++ lldb::SBTraceOptions class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBTraceOptions, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBTraceOptions, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """__init__(lldb::SBTraceOptions self) -> SBTraceOptions"""
+        this = _lldb.new_SBTraceOptions()
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+
+    def getType(self):
+        """getType(SBTraceOptions self) -> lldb::TraceType"""
+        return _lldb.SBTraceOptions_getType(self)
+
+
+    def getTraceBufferSize(self):
+        """getTraceBufferSize(SBTraceOptions self) -> uint64_t"""
+        return _lldb.SBTraceOptions_getTraceBufferSize(self)
+
+
+    def getTraceParams(self, error):
+        """getTraceParams(SBTraceOptions self, SBError error) -> SBStructuredData"""
+        return _lldb.SBTraceOptions_getTraceParams(self, error)
+
+
+    def getMetaDataBufferSize(self):
+        """getMetaDataBufferSize(SBTraceOptions self) -> uint64_t"""
+        return _lldb.SBTraceOptions_getMetaDataBufferSize(self)
+
+
+    def setTraceParams(self, params):
+        """setTraceParams(SBTraceOptions self, SBStructuredData params)"""
+        return _lldb.SBTraceOptions_setTraceParams(self, params)
+
+
+    def setType(self, type):
+        """setType(SBTraceOptions self, lldb::TraceType type)"""
+        return _lldb.SBTraceOptions_setType(self, type)
+
+
+    def setTraceBufferSize(self, size):
+        """setTraceBufferSize(SBTraceOptions self, uint64_t size)"""
+        return _lldb.SBTraceOptions_setTraceBufferSize(self, size)
+
+
+    def setMetaDataBufferSize(self, size):
+        """setMetaDataBufferSize(SBTraceOptions self, uint64_t size)"""
+        return _lldb.SBTraceOptions_setMetaDataBufferSize(self, size)
+
+
+    def setThreadID(self, thread_id):
+        """setThreadID(SBTraceOptions self, lldb::tid_t thread_id)"""
+        return _lldb.SBTraceOptions_setThreadID(self, thread_id)
+
+
+    def getThreadID(self):
+        """getThreadID(SBTraceOptions self) -> lldb::tid_t"""
+        return _lldb.SBTraceOptions_getThreadID(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBTraceOptions___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def IsValid(self):
+        """IsValid(SBTraceOptions self) -> bool"""
+        return _lldb.SBTraceOptions_IsValid(self)
+
+    __swig_destroy__ = _lldb.delete_SBTraceOptions
+    __del__ = lambda self: None
+SBTraceOptions_swigregister = _lldb.SBTraceOptions_swigregister
+SBTraceOptions_swigregister(SBTraceOptions)
+
+class SBTypeMember(_object):
+    """Represents a member of a type in lldb."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBTypeMember, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBTypeMember, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBTypeMember self) -> SBTypeMember
+        __init__(lldb::SBTypeMember self, SBTypeMember rhs) -> SBTypeMember
+        """
+        this = _lldb.new_SBTypeMember(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBTypeMember
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBTypeMember self) -> bool"""
+        return _lldb.SBTypeMember_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBTypeMember___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetName(self):
+        """GetName(SBTypeMember self) -> char const *"""
+        return _lldb.SBTypeMember_GetName(self)
+
+
+    def GetType(self):
+        """GetType(SBTypeMember self) -> SBType"""
+        return _lldb.SBTypeMember_GetType(self)
+
+
+    def GetOffsetInBytes(self):
+        """GetOffsetInBytes(SBTypeMember self) -> uint64_t"""
+        return _lldb.SBTypeMember_GetOffsetInBytes(self)
+
+
+    def GetOffsetInBits(self):
+        """GetOffsetInBits(SBTypeMember self) -> uint64_t"""
+        return _lldb.SBTypeMember_GetOffsetInBits(self)
+
+
+    def IsBitfield(self):
+        """IsBitfield(SBTypeMember self) -> bool"""
+        return _lldb.SBTypeMember_IsBitfield(self)
+
+
+    def GetBitfieldSizeInBits(self):
+        """GetBitfieldSizeInBits(SBTypeMember self) -> uint32_t"""
+        return _lldb.SBTypeMember_GetBitfieldSizeInBits(self)
+
+
+    name = property(GetName, None, doc='''A read only property that returns the name for this member as a string.''')
+    type = property(GetType, None, doc='''A read only property that returns an lldb object that represents the type (lldb.SBType) for this member.''')
+    byte_offset = property(GetOffsetInBytes, None, doc='''A read only property that returns offset in bytes for this member as an integer.''')
+    bit_offset = property(GetOffsetInBits, None, doc='''A read only property that returns offset in bits for this member as an integer.''')
+    is_bitfield = property(IsBitfield, None, doc='''A read only property that returns true if this member is a bitfield.''')
+    bitfield_bit_size = property(GetBitfieldSizeInBits, None, doc='''A read only property that returns the bitfield size in bits for this member as an integer, or zero if this member is not a bitfield.''')
+
+
+    def __str__(self):
+        """__str__(SBTypeMember self) -> PyObject *"""
+        return _lldb.SBTypeMember___str__(self)
+
+SBTypeMember_swigregister = _lldb.SBTypeMember_swigregister
+SBTypeMember_swigregister(SBTypeMember)
+
+class SBTypeMemberFunction(_object):
+    """Proxy of C++ lldb::SBTypeMemberFunction class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBTypeMemberFunction, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBTypeMemberFunction, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBTypeMemberFunction self) -> SBTypeMemberFunction
+        __init__(lldb::SBTypeMemberFunction self, SBTypeMemberFunction rhs) -> SBTypeMemberFunction
+        """
+        this = _lldb.new_SBTypeMemberFunction(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBTypeMemberFunction
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBTypeMemberFunction self) -> bool"""
+        return _lldb.SBTypeMemberFunction_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBTypeMemberFunction___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetName(self):
+        """GetName(SBTypeMemberFunction self) -> char const *"""
+        return _lldb.SBTypeMemberFunction_GetName(self)
+
+
+    def GetDemangledName(self):
+        """GetDemangledName(SBTypeMemberFunction self) -> char const *"""
+        return _lldb.SBTypeMemberFunction_GetDemangledName(self)
+
+
+    def GetMangledName(self):
+        """GetMangledName(SBTypeMemberFunction self) -> char const *"""
+        return _lldb.SBTypeMemberFunction_GetMangledName(self)
+
+
+    def GetType(self):
+        """GetType(SBTypeMemberFunction self) -> SBType"""
+        return _lldb.SBTypeMemberFunction_GetType(self)
+
+
+    def GetReturnType(self):
+        """GetReturnType(SBTypeMemberFunction self) -> SBType"""
+        return _lldb.SBTypeMemberFunction_GetReturnType(self)
+
+
+    def GetNumberOfArguments(self):
+        """GetNumberOfArguments(SBTypeMemberFunction self) -> uint32_t"""
+        return _lldb.SBTypeMemberFunction_GetNumberOfArguments(self)
+
+
+    def GetArgumentTypeAtIndex(self, arg2):
+        """GetArgumentTypeAtIndex(SBTypeMemberFunction self, uint32_t arg2) -> SBType"""
+        return _lldb.SBTypeMemberFunction_GetArgumentTypeAtIndex(self, arg2)
+
+
+    def GetKind(self):
+        """GetKind(SBTypeMemberFunction self) -> lldb::MemberFunctionKind"""
+        return _lldb.SBTypeMemberFunction_GetKind(self)
+
+
+    def GetDescription(self, description, description_level):
+        """GetDescription(SBTypeMemberFunction self, SBStream description, lldb::DescriptionLevel description_level) -> bool"""
+        return _lldb.SBTypeMemberFunction_GetDescription(self, description, description_level)
+
+
+    def __str__(self):
+        """__str__(SBTypeMemberFunction self) -> PyObject *"""
+        return _lldb.SBTypeMemberFunction___str__(self)
+
+SBTypeMemberFunction_swigregister = _lldb.SBTypeMemberFunction_swigregister
+SBTypeMemberFunction_swigregister(SBTypeMemberFunction)
+
+class SBType(_object):
+    """
+    Represents a data type in lldb.  The FindFirstType() method of SBTarget/SBModule
+    returns a SBType.
+
+    SBType supports the eq/ne operator. For example,
+
+    main.cpp:
+
+    class Task {
+    public:
+        int id;
+        Task *next;
+        Task(int i, Task *n):
+            id(i),
+            next(n)
+        {}
+    };
+
+    int main (int argc, char const *argv[])
+    {
+        Task *task_head = new Task(-1, NULL);
+        Task *task1 = new Task(1, NULL);
+        Task *task2 = new Task(2, NULL);
+        Task *task3 = new Task(3, NULL); // Orphaned.
+        Task *task4 = new Task(4, NULL);
+        Task *task5 = new Task(5, NULL);
+
+        task_head->next = task1;
+        task1->next = task2;
+        task2->next = task4;
+        task4->next = task5;
+
+        int total = 0;
+        Task *t = task_head;
+        while (t != NULL) {
+            if (t->id >= 0)
+                ++total;
+            t = t->next;
+        }
+        printf('We have a total number of %d tasks\n', total);
+
+        // This corresponds to an empty task list.
+        Task *empty_task_head = new Task(-1, NULL);
+
+        return 0; // Break at this line
+    }
+
+    find_type.py:
+
+            # Get the type 'Task'.
+            task_type = target.FindFirstType('Task')
+            self.assertTrue(task_type)
+
+            # Get the variable 'task_head'.
+            frame0.FindVariable('task_head')
+            task_head_type = task_head.GetType()
+            self.assertTrue(task_head_type.IsPointerType())
+
+            # task_head_type is 'Task *'.
+            task_pointer_type = task_type.GetPointerType()
+            self.assertTrue(task_head_type == task_pointer_type)
+
+            # Get the child mmember 'id' from 'task_head'.
+            id = task_head.GetChildMemberWithName('id')
+            id_type = id.GetType()
+
+            # SBType.GetBasicType() takes an enum 'BasicType' (lldb-enumerations.h).
+            int_type = id_type.GetBasicType(lldb.eBasicTypeInt)
+            # id_type and int_type should be the same type!
+            self.assertTrue(id_type == int_type)
+
+    ...
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBType, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBType, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBType self) -> SBType
+        __init__(lldb::SBType self, SBType rhs) -> SBType
+        """
+        this = _lldb.new_SBType(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBType
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBType self) -> bool"""
+        return _lldb.SBType_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBType___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetByteSize(self):
+        """GetByteSize(SBType self) -> uint64_t"""
+        return _lldb.SBType_GetByteSize(self)
+
+
+    def IsPointerType(self):
+        """IsPointerType(SBType self) -> bool"""
+        return _lldb.SBType_IsPointerType(self)
+
+
+    def IsReferenceType(self):
+        """IsReferenceType(SBType self) -> bool"""
+        return _lldb.SBType_IsReferenceType(self)
+
+
+    def IsFunctionType(self):
+        """IsFunctionType(SBType self) -> bool"""
+        return _lldb.SBType_IsFunctionType(self)
+
+
+    def IsPolymorphicClass(self):
+        """IsPolymorphicClass(SBType self) -> bool"""
+        return _lldb.SBType_IsPolymorphicClass(self)
+
+
+    def IsArrayType(self):
+        """IsArrayType(SBType self) -> bool"""
+        return _lldb.SBType_IsArrayType(self)
+
+
+    def IsVectorType(self):
+        """IsVectorType(SBType self) -> bool"""
+        return _lldb.SBType_IsVectorType(self)
+
+
+    def IsTypedefType(self):
+        """IsTypedefType(SBType self) -> bool"""
+        return _lldb.SBType_IsTypedefType(self)
+
+
+    def IsAnonymousType(self):
+        """IsAnonymousType(SBType self) -> bool"""
+        return _lldb.SBType_IsAnonymousType(self)
+
+
+    def GetPointerType(self):
+        """GetPointerType(SBType self) -> SBType"""
+        return _lldb.SBType_GetPointerType(self)
+
+
+    def GetPointeeType(self):
+        """GetPointeeType(SBType self) -> SBType"""
+        return _lldb.SBType_GetPointeeType(self)
+
+
+    def GetReferenceType(self):
+        """GetReferenceType(SBType self) -> SBType"""
+        return _lldb.SBType_GetReferenceType(self)
+
+
+    def GetTypedefedType(self):
+        """GetTypedefedType(SBType self) -> SBType"""
+        return _lldb.SBType_GetTypedefedType(self)
+
+
+    def GetDereferencedType(self):
+        """GetDereferencedType(SBType self) -> SBType"""
+        return _lldb.SBType_GetDereferencedType(self)
+
+
+    def GetUnqualifiedType(self):
+        """GetUnqualifiedType(SBType self) -> SBType"""
+        return _lldb.SBType_GetUnqualifiedType(self)
+
+
+    def GetCanonicalType(self):
+        """GetCanonicalType(SBType self) -> SBType"""
+        return _lldb.SBType_GetCanonicalType(self)
+
+
+    def GetArrayElementType(self):
+        """GetArrayElementType(SBType self) -> SBType"""
+        return _lldb.SBType_GetArrayElementType(self)
+
+
+    def GetArrayType(self, size):
+        """GetArrayType(SBType self, uint64_t size) -> SBType"""
+        return _lldb.SBType_GetArrayType(self, size)
+
+
+    def GetVectorElementType(self):
+        """GetVectorElementType(SBType self) -> SBType"""
+        return _lldb.SBType_GetVectorElementType(self)
+
+
+    def GetBasicType(self, *args):
+        """
+        GetBasicType(SBType self) -> lldb::BasicType
+        GetBasicType(SBType self, lldb::BasicType type) -> SBType
+        """
+        return _lldb.SBType_GetBasicType(self, *args)
+
+
+    def GetNumberOfFields(self):
+        """GetNumberOfFields(SBType self) -> uint32_t"""
+        return _lldb.SBType_GetNumberOfFields(self)
+
+
+    def GetNumberOfDirectBaseClasses(self):
+        """GetNumberOfDirectBaseClasses(SBType self) -> uint32_t"""
+        return _lldb.SBType_GetNumberOfDirectBaseClasses(self)
+
+
+    def GetNumberOfVirtualBaseClasses(self):
+        """GetNumberOfVirtualBaseClasses(SBType self) -> uint32_t"""
+        return _lldb.SBType_GetNumberOfVirtualBaseClasses(self)
+
+
+    def GetFieldAtIndex(self, idx):
+        """GetFieldAtIndex(SBType self, uint32_t idx) -> SBTypeMember"""
+        return _lldb.SBType_GetFieldAtIndex(self, idx)
+
+
+    def GetDirectBaseClassAtIndex(self, idx):
+        """GetDirectBaseClassAtIndex(SBType self, uint32_t idx) -> SBTypeMember"""
+        return _lldb.SBType_GetDirectBaseClassAtIndex(self, idx)
+
+
+    def GetVirtualBaseClassAtIndex(self, idx):
+        """GetVirtualBaseClassAtIndex(SBType self, uint32_t idx) -> SBTypeMember"""
+        return _lldb.SBType_GetVirtualBaseClassAtIndex(self, idx)
+
+
+    def GetEnumMembers(self):
+        """GetEnumMembers(SBType self) -> SBTypeEnumMemberList"""
+        return _lldb.SBType_GetEnumMembers(self)
+
+
+    def GetName(self):
+        """GetName(SBType self) -> char const *"""
+        return _lldb.SBType_GetName(self)
+
+
+    def GetDisplayTypeName(self):
+        """GetDisplayTypeName(SBType self) -> char const *"""
+        return _lldb.SBType_GetDisplayTypeName(self)
+
+
+    def GetTypeClass(self):
+        """GetTypeClass(SBType self) -> lldb::TypeClass"""
+        return _lldb.SBType_GetTypeClass(self)
+
+
+    def GetNumberOfTemplateArguments(self):
+        """GetNumberOfTemplateArguments(SBType self) -> uint32_t"""
+        return _lldb.SBType_GetNumberOfTemplateArguments(self)
+
+
+    def GetTemplateArgumentType(self, idx):
+        """GetTemplateArgumentType(SBType self, uint32_t idx) -> SBType"""
+        return _lldb.SBType_GetTemplateArgumentType(self, idx)
+
+
+    def GetTemplateArgumentKind(self, idx):
+        """GetTemplateArgumentKind(SBType self, uint32_t idx) -> lldb::TemplateArgumentKind"""
+        return _lldb.SBType_GetTemplateArgumentKind(self, idx)
+
+
+    def GetFunctionReturnType(self):
+        """GetFunctionReturnType(SBType self) -> SBType"""
+        return _lldb.SBType_GetFunctionReturnType(self)
+
+
+    def GetFunctionArgumentTypes(self):
+        """GetFunctionArgumentTypes(SBType self) -> SBTypeList"""
+        return _lldb.SBType_GetFunctionArgumentTypes(self)
+
+
+    def GetNumberOfMemberFunctions(self):
+        """GetNumberOfMemberFunctions(SBType self) -> uint32_t"""
+        return _lldb.SBType_GetNumberOfMemberFunctions(self)
+
+
+    def GetMemberFunctionAtIndex(self, idx):
+        """GetMemberFunctionAtIndex(SBType self, uint32_t idx) -> SBTypeMemberFunction"""
+        return _lldb.SBType_GetMemberFunctionAtIndex(self, idx)
+
+
+    def IsTypeComplete(self):
+        """IsTypeComplete(SBType self) -> bool"""
+        return _lldb.SBType_IsTypeComplete(self)
+
+
+    def GetTypeFlags(self):
+        """GetTypeFlags(SBType self) -> uint32_t"""
+        return _lldb.SBType_GetTypeFlags(self)
+
+
+    def __eq__(self, rhs):
+        """__eq__(SBType self, SBType rhs) -> bool"""
+        return _lldb.SBType___eq__(self, rhs)
+
+
+    def __ne__(self, rhs):
+        """__ne__(SBType self, SBType rhs) -> bool"""
+        return _lldb.SBType___ne__(self, rhs)
+
+
+    def template_arg_array(self):
+        num_args = self.num_template_args
+        if num_args:
+            template_args = []
+            for i in range(num_args):
+                template_args.append(self.GetTemplateArgumentType(i))
+            return template_args
+        return None
+
+    name = property(GetName, None, doc='''A read only property that returns the name for this type as a string.''')
+    size = property(GetByteSize, None, doc='''A read only property that returns size in bytes for this type as an integer.''')
+    is_pointer = property(IsPointerType, None, doc='''A read only property that returns a boolean value that indicates if this type is a pointer type.''')
+    is_reference = property(IsReferenceType, None, doc='''A read only property that returns a boolean value that indicates if this type is a reference type.''')
+    is_reference = property(IsReferenceType, None, doc='''A read only property that returns a boolean value that indicates if this type is a function type.''')
+    num_fields = property(GetNumberOfFields, None, doc='''A read only property that returns number of fields in this type as an integer.''')
+    num_bases = property(GetNumberOfDirectBaseClasses, None, doc='''A read only property that returns number of direct base classes in this type as an integer.''')
+    num_vbases = property(GetNumberOfVirtualBaseClasses, None, doc='''A read only property that returns number of virtual base classes in this type as an integer.''')
+    num_template_args = property(GetNumberOfTemplateArguments, None, doc='''A read only property that returns number of template arguments in this type as an integer.''')
+    template_args = property(template_arg_array, None, doc='''A read only property that returns a list() of lldb.SBType objects that represent all template arguments in this type.''')
+    type = property(GetTypeClass, None, doc='''A read only property that returns an lldb enumeration value (see enumerations that start with "lldb.eTypeClass") that represents a classification for this type.''')
+    is_complete = property(IsTypeComplete, None, doc='''A read only property that returns a boolean value that indicates if this type is a complete type (True) or a forward declaration (False).''')
+
+    def get_bases_array(self):
+        '''An accessor function that returns a list() that contains all direct base classes in a lldb.SBType object.'''
+        bases = []
+        for idx in range(self.GetNumberOfDirectBaseClasses()):
+            bases.append(self.GetDirectBaseClassAtIndex(idx))
+        return bases
+
+    def get_vbases_array(self):
+        '''An accessor function that returns a list() that contains all fields in a lldb.SBType object.'''
+        vbases = []
+        for idx in range(self.GetNumberOfVirtualBaseClasses()):
+            vbases.append(self.GetVirtualBaseClassAtIndex(idx))
+        return vbases
+
+    def get_fields_array(self):
+        '''An accessor function that returns a list() that contains all fields in a lldb.SBType object.'''
+        fields = []
+        for idx in range(self.GetNumberOfFields()):
+            fields.append(self.GetFieldAtIndex(idx))
+        return fields
+
+    def get_members_array(self):
+        '''An accessor function that returns a list() that contains all members (base classes and fields) in a lldb.SBType object in ascending bit offset order.'''
+        members = []
+        bases = self.get_bases_array()
+        fields = self.get_fields_array()
+        vbases = self.get_vbases_array()
+        for base in bases:
+            bit_offset = base.bit_offset
+            added = False
+            for idx, member in enumerate(members):
+                if member.bit_offset > bit_offset:
+                    members.insert(idx, base)
+                    added = True
+                    break
+            if not added:
+                members.append(base)
+        for vbase in vbases:
+            bit_offset = vbase.bit_offset
+            added = False
+            for idx, member in enumerate(members):
+                if member.bit_offset > bit_offset:
+                    members.insert(idx, vbase)
+                    added = True
+                    break
+            if not added:
+                members.append(vbase)
+        for field in fields:
+            bit_offset = field.bit_offset
+            added = False
+            for idx, member in enumerate(members):
+                if member.bit_offset > bit_offset:
+                    members.insert(idx, field)
+                    added = True
+                    break
+            if not added:
+                members.append(field)
+        return members
+
+    def get_enum_members_array(self):
+        '''An accessor function that returns a list() that contains all enum members in an lldb.SBType object.'''
+        enum_members_list = []
+        sb_enum_members = self.GetEnumMembers()
+        for idx in range(sb_enum_members.GetSize()):
+            enum_members_list.append(sb_enum_members.GetTypeEnumMemberAtIndex(idx))
+        return enum_members_list
+
+    bases = property(get_bases_array, None, doc='''A read only property that returns a list() of lldb.SBTypeMember objects that represent all of the direct base classes for this type.''')
+    vbases = property(get_vbases_array, None, doc='''A read only property that returns a list() of lldb.SBTypeMember objects that represent all of the virtual base classes for this type.''')
+    fields = property(get_fields_array, None, doc='''A read only property that returns a list() of lldb.SBTypeMember objects that represent all of the fields for this type.''')
+    members = property(get_members_array, None, doc='''A read only property that returns a list() of all lldb.SBTypeMember objects that represent all of the base classes, virtual base classes and fields for this type in ascending bit offset order.''')
+    enum_members = property(get_enum_members_array, None, doc='''A read only property that returns a list() of all lldb.SBTypeEnumMember objects that represent the enum members for this type.''')
+
+
+    def __str__(self):
+        """__str__(SBType self) -> PyObject *"""
+        return _lldb.SBType___str__(self)
+
+SBType_swigregister = _lldb.SBType_swigregister
+SBType_swigregister(SBType)
+
+class SBTypeList(_object):
+    """
+    Represents a list of SBTypes.  The FindTypes() method of SBTarget/SBModule
+    returns a SBTypeList.
+
+    SBTypeList supports SBType iteration. For example,
+
+    main.cpp:
+
+    class Task {
+    public:
+        int id;
+        Task *next;
+        Task(int i, Task *n):
+            id(i),
+            next(n)
+        {}
+    };
+
+    ...
+
+    find_type.py:
+
+            # Get the type 'Task'.
+            type_list = target.FindTypes('Task')
+            self.assertTrue(len(type_list) == 1)
+            # To illustrate the SBType iteration.
+            for type in type_list:
+                # do something with type
+
+    ...
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBTypeList, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBTypeList, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """__init__(lldb::SBTypeList self) -> SBTypeList"""
+        this = _lldb.new_SBTypeList()
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+
+    def IsValid(self):
+        """IsValid(SBTypeList self) -> bool"""
+        return _lldb.SBTypeList_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBTypeList___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def Append(self, type):
+        """Append(SBTypeList self, SBType type)"""
+        return _lldb.SBTypeList_Append(self, type)
+
+
+    def GetTypeAtIndex(self, index):
+        """GetTypeAtIndex(SBTypeList self, uint32_t index) -> SBType"""
+        return _lldb.SBTypeList_GetTypeAtIndex(self, index)
+
+
+    def GetSize(self):
+        """GetSize(SBTypeList self) -> uint32_t"""
+        return _lldb.SBTypeList_GetSize(self)
+
+    __swig_destroy__ = _lldb.delete_SBTypeList
+    __del__ = lambda self: None
+
+    def __iter__(self):
+        '''Iterate over all types in a lldb.SBTypeList object.'''
+        return lldb_iter(self, 'GetSize', 'GetTypeAtIndex')
+
+    def __len__(self):
+        '''Return the number of types in a lldb.SBTypeList object.'''
+        return self.GetSize()
+
+SBTypeList_swigregister = _lldb.SBTypeList_swigregister
+SBTypeList_swigregister(SBTypeList)
+
+class SBTypeCategory(_object):
+    """Represents a category that can contain formatters for types."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBTypeCategory, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBTypeCategory, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBTypeCategory self) -> SBTypeCategory
+        __init__(lldb::SBTypeCategory self, SBTypeCategory rhs) -> SBTypeCategory
+        """
+        this = _lldb.new_SBTypeCategory(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBTypeCategory
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBTypeCategory self) -> bool"""
+        return _lldb.SBTypeCategory_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBTypeCategory___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetEnabled(self):
+        """GetEnabled(SBTypeCategory self) -> bool"""
+        return _lldb.SBTypeCategory_GetEnabled(self)
+
+
+    def SetEnabled(self, arg2):
+        """SetEnabled(SBTypeCategory self, bool arg2)"""
+        return _lldb.SBTypeCategory_SetEnabled(self, arg2)
+
+
+    def GetName(self):
+        """GetName(SBTypeCategory self) -> char const *"""
+        return _lldb.SBTypeCategory_GetName(self)
+
+
+    def GetLanguageAtIndex(self, idx):
+        """GetLanguageAtIndex(SBTypeCategory self, uint32_t idx) -> lldb::LanguageType"""
+        return _lldb.SBTypeCategory_GetLanguageAtIndex(self, idx)
+
+
+    def GetNumLanguages(self):
+        """GetNumLanguages(SBTypeCategory self) -> uint32_t"""
+        return _lldb.SBTypeCategory_GetNumLanguages(self)
+
+
+    def AddLanguage(self, language):
+        """AddLanguage(SBTypeCategory self, lldb::LanguageType language)"""
+        return _lldb.SBTypeCategory_AddLanguage(self, language)
+
+
+    def GetDescription(self, description, description_level):
+        """GetDescription(SBTypeCategory self, SBStream description, lldb::DescriptionLevel description_level) -> bool"""
+        return _lldb.SBTypeCategory_GetDescription(self, description, description_level)
+
+
+    def GetNumFormats(self):
+        """GetNumFormats(SBTypeCategory self) -> uint32_t"""
+        return _lldb.SBTypeCategory_GetNumFormats(self)
+
+
+    def GetNumSummaries(self):
+        """GetNumSummaries(SBTypeCategory self) -> uint32_t"""
+        return _lldb.SBTypeCategory_GetNumSummaries(self)
+
+
+    def GetNumFilters(self):
+        """GetNumFilters(SBTypeCategory self) -> uint32_t"""
+        return _lldb.SBTypeCategory_GetNumFilters(self)
+
+
+    def GetNumSynthetics(self):
+        """GetNumSynthetics(SBTypeCategory self) -> uint32_t"""
+        return _lldb.SBTypeCategory_GetNumSynthetics(self)
+
+
+    def GetTypeNameSpecifierForFilterAtIndex(self, arg2):
+        """GetTypeNameSpecifierForFilterAtIndex(SBTypeCategory self, uint32_t arg2) -> SBTypeNameSpecifier"""
+        return _lldb.SBTypeCategory_GetTypeNameSpecifierForFilterAtIndex(self, arg2)
+
+
+    def GetTypeNameSpecifierForFormatAtIndex(self, arg2):
+        """GetTypeNameSpecifierForFormatAtIndex(SBTypeCategory self, uint32_t arg2) -> SBTypeNameSpecifier"""
+        return _lldb.SBTypeCategory_GetTypeNameSpecifierForFormatAtIndex(self, arg2)
+
+
+    def GetTypeNameSpecifierForSummaryAtIndex(self, arg2):
+        """GetTypeNameSpecifierForSummaryAtIndex(SBTypeCategory self, uint32_t arg2) -> SBTypeNameSpecifier"""
+        return _lldb.SBTypeCategory_GetTypeNameSpecifierForSummaryAtIndex(self, arg2)
+
+
+    def GetTypeNameSpecifierForSyntheticAtIndex(self, arg2):
+        """GetTypeNameSpecifierForSyntheticAtIndex(SBTypeCategory self, uint32_t arg2) -> SBTypeNameSpecifier"""
+        return _lldb.SBTypeCategory_GetTypeNameSpecifierForSyntheticAtIndex(self, arg2)
+
+
+    def GetFilterForType(self, arg2):
+        """GetFilterForType(SBTypeCategory self, SBTypeNameSpecifier arg2) -> SBTypeFilter"""
+        return _lldb.SBTypeCategory_GetFilterForType(self, arg2)
+
+
+    def GetFormatForType(self, arg2):
+        """GetFormatForType(SBTypeCategory self, SBTypeNameSpecifier arg2) -> SBTypeFormat"""
+        return _lldb.SBTypeCategory_GetFormatForType(self, arg2)
+
+
+    def GetSummaryForType(self, arg2):
+        """GetSummaryForType(SBTypeCategory self, SBTypeNameSpecifier arg2) -> SBTypeSummary"""
+        return _lldb.SBTypeCategory_GetSummaryForType(self, arg2)
+
+
+    def GetSyntheticForType(self, arg2):
+        """GetSyntheticForType(SBTypeCategory self, SBTypeNameSpecifier arg2) -> SBTypeSynthetic"""
+        return _lldb.SBTypeCategory_GetSyntheticForType(self, arg2)
+
+
+    def GetFilterAtIndex(self, arg2):
+        """GetFilterAtIndex(SBTypeCategory self, uint32_t arg2) -> SBTypeFilter"""
+        return _lldb.SBTypeCategory_GetFilterAtIndex(self, arg2)
+
+
+    def GetFormatAtIndex(self, arg2):
+        """GetFormatAtIndex(SBTypeCategory self, uint32_t arg2) -> SBTypeFormat"""
+        return _lldb.SBTypeCategory_GetFormatAtIndex(self, arg2)
+
+
+    def GetSummaryAtIndex(self, arg2):
+        """GetSummaryAtIndex(SBTypeCategory self, uint32_t arg2) -> SBTypeSummary"""
+        return _lldb.SBTypeCategory_GetSummaryAtIndex(self, arg2)
+
+
+    def GetSyntheticAtIndex(self, arg2):
+        """GetSyntheticAtIndex(SBTypeCategory self, uint32_t arg2) -> SBTypeSynthetic"""
+        return _lldb.SBTypeCategory_GetSyntheticAtIndex(self, arg2)
+
+
+    def AddTypeFormat(self, arg2, arg3):
+        """AddTypeFormat(SBTypeCategory self, SBTypeNameSpecifier arg2, SBTypeFormat arg3) -> bool"""
+        return _lldb.SBTypeCategory_AddTypeFormat(self, arg2, arg3)
+
+
+    def DeleteTypeFormat(self, arg2):
+        """DeleteTypeFormat(SBTypeCategory self, SBTypeNameSpecifier arg2) -> bool"""
+        return _lldb.SBTypeCategory_DeleteTypeFormat(self, arg2)
+
+
+    def AddTypeSummary(self, arg2, arg3):
+        """AddTypeSummary(SBTypeCategory self, SBTypeNameSpecifier arg2, SBTypeSummary arg3) -> bool"""
+        return _lldb.SBTypeCategory_AddTypeSummary(self, arg2, arg3)
+
+
+    def DeleteTypeSummary(self, arg2):
+        """DeleteTypeSummary(SBTypeCategory self, SBTypeNameSpecifier arg2) -> bool"""
+        return _lldb.SBTypeCategory_DeleteTypeSummary(self, arg2)
+
+
+    def AddTypeFilter(self, arg2, arg3):
+        """AddTypeFilter(SBTypeCategory self, SBTypeNameSpecifier arg2, SBTypeFilter arg3) -> bool"""
+        return _lldb.SBTypeCategory_AddTypeFilter(self, arg2, arg3)
+
+
+    def DeleteTypeFilter(self, arg2):
+        """DeleteTypeFilter(SBTypeCategory self, SBTypeNameSpecifier arg2) -> bool"""
+        return _lldb.SBTypeCategory_DeleteTypeFilter(self, arg2)
+
+
+    def AddTypeSynthetic(self, arg2, arg3):
+        """AddTypeSynthetic(SBTypeCategory self, SBTypeNameSpecifier arg2, SBTypeSynthetic arg3) -> bool"""
+        return _lldb.SBTypeCategory_AddTypeSynthetic(self, arg2, arg3)
+
+
+    def DeleteTypeSynthetic(self, arg2):
+        """DeleteTypeSynthetic(SBTypeCategory self, SBTypeNameSpecifier arg2) -> bool"""
+        return _lldb.SBTypeCategory_DeleteTypeSynthetic(self, arg2)
+
+
+
+    class formatters_access_class(object):
+        '''A helper object that will lazily hand out formatters for a specific category.'''
+        def __init__(self, sbcategory, get_count_function, get_at_index_function, get_by_name_function):
+            self.sbcategory = sbcategory
+            self.get_count_function = get_count_function
+            self.get_at_index_function = get_at_index_function
+            self.get_by_name_function = get_by_name_function
+            self.regex_type = type(re.compile('.'))
+
+
+        def __len__(self):
+            if self.sbcategory and self.get_count_function:
+                return int(self.get_count_function(self.sbcategory))
+            return 0
+
+        def __getitem__(self, key):
+            num_items = len(self)
+            if type(key) is int:
+                if key < num_items:
+                    return self.get_at_index_function(self.sbcategory,key)
+            elif type(key) is str:
+                return self.get_by_name_function(self.sbcategory,SBTypeNameSpecifier(key))
+            elif isinstance(key,self.regex_type):
+                return self.get_by_name_function(self.sbcategory,SBTypeNameSpecifier(key.pattern,True))
+            else:
+                print("error: unsupported item type: %s" % type(key))
+            return None
+
+    def get_formats_access_object(self):
+        '''An accessor function that returns an accessor object which allows lazy format access from a lldb.SBTypeCategory object.'''
+        return self.formatters_access_class (self,self.__class__.GetNumFormats,self.__class__.GetFormatAtIndex,self.__class__.GetFormatForType)
+
+    def get_formats_array(self):
+        '''An accessor function that returns a list() that contains all formats in a lldb.SBCategory object.'''
+        formats = []
+        for idx in range(self.GetNumFormats()):
+            formats.append(self.GetFormatAtIndex(idx))
+        return formats
+
+    def get_summaries_access_object(self):
+        '''An accessor function that returns an accessor object which allows lazy summary access from a lldb.SBTypeCategory object.'''
+        return self.formatters_access_class (self,self.__class__.GetNumSummaries,self.__class__.GetSummaryAtIndex,self.__class__.GetSummaryForType)
+
+    def get_summaries_array(self):
+        '''An accessor function that returns a list() that contains all summaries in a lldb.SBCategory object.'''
+        summaries = []
+        for idx in range(self.GetNumSummaries()):
+            summaries.append(self.GetSummaryAtIndex(idx))
+        return summaries
+
+    def get_synthetics_access_object(self):
+        '''An accessor function that returns an accessor object which allows lazy synthetic children provider access from a lldb.SBTypeCategory object.'''
+        return self.formatters_access_class (self,self.__class__.GetNumSynthetics,self.__class__.GetSyntheticAtIndex,self.__class__.GetSyntheticForType)
+
+    def get_synthetics_array(self):
+        '''An accessor function that returns a list() that contains all synthetic children providers in a lldb.SBCategory object.'''
+        synthetics = []
+        for idx in range(self.GetNumSynthetics()):
+            synthetics.append(self.GetSyntheticAtIndex(idx))
+        return synthetics
+
+    def get_filters_access_object(self):
+        '''An accessor function that returns an accessor object which allows lazy filter access from a lldb.SBTypeCategory object.'''
+        return self.formatters_access_class (self,self.__class__.GetNumFilters,self.__class__.GetFilterAtIndex,self.__class__.GetFilterForType)
+
+    def get_filters_array(self):
+        '''An accessor function that returns a list() that contains all filters in a lldb.SBCategory object.'''
+        filters = []
+        for idx in range(self.GetNumFilters()):
+            filters.append(self.GetFilterAtIndex(idx))
+        return filters
+
+    formats = property(get_formats_array, None, doc='''A read only property that returns a list() of lldb.SBTypeFormat objects contained in this category''')
+    format = property(get_formats_access_object, None, doc=r'''A read only property that returns an object that you can use to look for formats by index or type name.''')
+    summaries = property(get_summaries_array, None, doc='''A read only property that returns a list() of lldb.SBTypeSummary objects contained in this category''')
+    summary = property(get_summaries_access_object, None, doc=r'''A read only property that returns an object that you can use to look for summaries by index or type name or regular expression.''')
+    filters = property(get_filters_array, None, doc='''A read only property that returns a list() of lldb.SBTypeFilter objects contained in this category''')
+    filter = property(get_filters_access_object, None, doc=r'''A read only property that returns an object that you can use to look for filters by index or type name or regular expression.''')
+    synthetics = property(get_synthetics_array, None, doc='''A read only property that returns a list() of lldb.SBTypeSynthetic objects contained in this category''')
+    synthetic = property(get_synthetics_access_object, None, doc=r'''A read only property that returns an object that you can use to look for synthetic children provider by index or type name or regular expression.''')
+    num_formats = property(GetNumFormats, None)
+    num_summaries = property(GetNumSummaries, None)
+    num_filters = property(GetNumFilters, None)
+    num_synthetics = property(GetNumSynthetics, None)
+    name = property(GetName, None)
+    enabled = property(GetEnabled, SetEnabled)
+
+
+    def __str__(self):
+        """__str__(SBTypeCategory self) -> PyObject *"""
+        return _lldb.SBTypeCategory___str__(self)
+
+SBTypeCategory_swigregister = _lldb.SBTypeCategory_swigregister
+SBTypeCategory_swigregister(SBTypeCategory)
+
+class SBTypeEnumMember(_object):
+    """Represents a member of an enum in lldb."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBTypeEnumMember, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBTypeEnumMember, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBTypeEnumMember self) -> SBTypeEnumMember
+        __init__(lldb::SBTypeEnumMember self, SBTypeEnumMember rhs) -> SBTypeEnumMember
+        """
+        this = _lldb.new_SBTypeEnumMember(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBTypeEnumMember
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBTypeEnumMember self) -> bool"""
+        return _lldb.SBTypeEnumMember_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBTypeEnumMember___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetValueAsSigned(self):
+        """GetValueAsSigned(SBTypeEnumMember self) -> int64_t"""
+        return _lldb.SBTypeEnumMember_GetValueAsSigned(self)
+
+
+    def GetValueAsUnsigned(self):
+        """GetValueAsUnsigned(SBTypeEnumMember self) -> uint64_t"""
+        return _lldb.SBTypeEnumMember_GetValueAsUnsigned(self)
+
+
+    def GetName(self):
+        """GetName(SBTypeEnumMember self) -> char const *"""
+        return _lldb.SBTypeEnumMember_GetName(self)
+
+
+    def GetType(self):
+        """GetType(SBTypeEnumMember self) -> SBType"""
+        return _lldb.SBTypeEnumMember_GetType(self)
+
+
+    def GetDescription(self, description, description_level):
+        """GetDescription(SBTypeEnumMember self, SBStream description, lldb::DescriptionLevel description_level) -> bool"""
+        return _lldb.SBTypeEnumMember_GetDescription(self, description, description_level)
+
+
+    name = property(GetName, None, doc='''A read only property that returns the name for this enum member as a string.''')
+    type = property(GetType, None, doc='''A read only property that returns an lldb object that represents the type (lldb.SBType) for this enum member.''')
+    signed = property(GetValueAsSigned, None, doc='''A read only property that returns the value of this enum member as a signed integer.''')
+    unsigned = property(GetValueAsUnsigned, None, doc='''A read only property that returns the value of this enum member as a unsigned integer.''')
+
+
+    def __str__(self):
+        """__str__(SBTypeEnumMember self) -> PyObject *"""
+        return _lldb.SBTypeEnumMember___str__(self)
+
+SBTypeEnumMember_swigregister = _lldb.SBTypeEnumMember_swigregister
+SBTypeEnumMember_swigregister(SBTypeEnumMember)
+
+class SBTypeEnumMemberList(_object):
+    """Represents a list of SBTypeEnumMembers."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBTypeEnumMemberList, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBTypeEnumMemberList, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBTypeEnumMemberList self) -> SBTypeEnumMemberList
+        __init__(lldb::SBTypeEnumMemberList self, SBTypeEnumMemberList rhs) -> SBTypeEnumMemberList
+        """
+        this = _lldb.new_SBTypeEnumMemberList(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBTypeEnumMemberList
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBTypeEnumMemberList self) -> bool"""
+        return _lldb.SBTypeEnumMemberList_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBTypeEnumMemberList___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def Append(self, entry):
+        """Append(SBTypeEnumMemberList self, SBTypeEnumMember entry)"""
+        return _lldb.SBTypeEnumMemberList_Append(self, entry)
+
+
+    def GetTypeEnumMemberAtIndex(self, index):
+        """GetTypeEnumMemberAtIndex(SBTypeEnumMemberList self, uint32_t index) -> SBTypeEnumMember"""
+        return _lldb.SBTypeEnumMemberList_GetTypeEnumMemberAtIndex(self, index)
+
+
+    def GetSize(self):
+        """GetSize(SBTypeEnumMemberList self) -> uint32_t"""
+        return _lldb.SBTypeEnumMemberList_GetSize(self)
+
+SBTypeEnumMemberList_swigregister = _lldb.SBTypeEnumMemberList_swigregister
+SBTypeEnumMemberList_swigregister(SBTypeEnumMemberList)
+
+class SBTypeFilter(_object):
+    """Represents a filter that can be associated to one or more types."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBTypeFilter, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBTypeFilter, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBTypeFilter self) -> SBTypeFilter
+        __init__(lldb::SBTypeFilter self, uint32_t options) -> SBTypeFilter
+        __init__(lldb::SBTypeFilter self, SBTypeFilter rhs) -> SBTypeFilter
+        """
+        this = _lldb.new_SBTypeFilter(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBTypeFilter
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBTypeFilter self) -> bool"""
+        return _lldb.SBTypeFilter_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBTypeFilter___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def IsEqualTo(self, rhs):
+        """IsEqualTo(SBTypeFilter self, SBTypeFilter rhs) -> bool"""
+        return _lldb.SBTypeFilter_IsEqualTo(self, rhs)
+
+
+    def GetNumberOfExpressionPaths(self):
+        """GetNumberOfExpressionPaths(SBTypeFilter self) -> uint32_t"""
+        return _lldb.SBTypeFilter_GetNumberOfExpressionPaths(self)
+
+
+    def GetExpressionPathAtIndex(self, i):
+        """GetExpressionPathAtIndex(SBTypeFilter self, uint32_t i) -> char const *"""
+        return _lldb.SBTypeFilter_GetExpressionPathAtIndex(self, i)
+
+
+    def ReplaceExpressionPathAtIndex(self, i, item):
+        """ReplaceExpressionPathAtIndex(SBTypeFilter self, uint32_t i, char const * item) -> bool"""
+        return _lldb.SBTypeFilter_ReplaceExpressionPathAtIndex(self, i, item)
+
+
+    def AppendExpressionPath(self, item):
+        """AppendExpressionPath(SBTypeFilter self, char const * item)"""
+        return _lldb.SBTypeFilter_AppendExpressionPath(self, item)
+
+
+    def Clear(self):
+        """Clear(SBTypeFilter self)"""
+        return _lldb.SBTypeFilter_Clear(self)
+
+
+    def GetOptions(self):
+        """GetOptions(SBTypeFilter self) -> uint32_t"""
+        return _lldb.SBTypeFilter_GetOptions(self)
+
+
+    def SetOptions(self, arg2):
+        """SetOptions(SBTypeFilter self, uint32_t arg2)"""
+        return _lldb.SBTypeFilter_SetOptions(self, arg2)
+
+
+    def GetDescription(self, description, description_level):
+        """GetDescription(SBTypeFilter self, SBStream description, lldb::DescriptionLevel description_level) -> bool"""
+        return _lldb.SBTypeFilter_GetDescription(self, description, description_level)
+
+
+    def __eq__(self, rhs):
+        """__eq__(SBTypeFilter self, SBTypeFilter rhs) -> bool"""
+        return _lldb.SBTypeFilter___eq__(self, rhs)
+
+
+    def __ne__(self, rhs):
+        """__ne__(SBTypeFilter self, SBTypeFilter rhs) -> bool"""
+        return _lldb.SBTypeFilter___ne__(self, rhs)
+
+
+    options = property(GetOptions, SetOptions)
+    count = property(GetNumberOfExpressionPaths)
+
+
+    def __str__(self):
+        """__str__(SBTypeFilter self) -> PyObject *"""
+        return _lldb.SBTypeFilter___str__(self)
+
+
+    def __eq__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return False 
+
+        return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
+
+    def __ne__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return True 
+
+        return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
+
+SBTypeFilter_swigregister = _lldb.SBTypeFilter_swigregister
+SBTypeFilter_swigregister(SBTypeFilter)
+
+class SBTypeFormat(_object):
+    """Represents a format that can be associated to one or more types."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBTypeFormat, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBTypeFormat, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBTypeFormat self) -> SBTypeFormat
+        __init__(lldb::SBTypeFormat self, lldb::Format format, uint32_t options=0) -> SBTypeFormat
+        __init__(lldb::SBTypeFormat self, lldb::Format format) -> SBTypeFormat
+        __init__(lldb::SBTypeFormat self, char const * type, uint32_t options=0) -> SBTypeFormat
+        __init__(lldb::SBTypeFormat self, char const * type) -> SBTypeFormat
+        __init__(lldb::SBTypeFormat self, SBTypeFormat rhs) -> SBTypeFormat
+        """
+        this = _lldb.new_SBTypeFormat(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBTypeFormat
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBTypeFormat self) -> bool"""
+        return _lldb.SBTypeFormat_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBTypeFormat___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def IsEqualTo(self, rhs):
+        """IsEqualTo(SBTypeFormat self, SBTypeFormat rhs) -> bool"""
+        return _lldb.SBTypeFormat_IsEqualTo(self, rhs)
+
+
+    def GetFormat(self):
+        """GetFormat(SBTypeFormat self) -> lldb::Format"""
+        return _lldb.SBTypeFormat_GetFormat(self)
+
+
+    def GetTypeName(self):
+        """GetTypeName(SBTypeFormat self) -> char const *"""
+        return _lldb.SBTypeFormat_GetTypeName(self)
+
+
+    def GetOptions(self):
+        """GetOptions(SBTypeFormat self) -> uint32_t"""
+        return _lldb.SBTypeFormat_GetOptions(self)
+
+
+    def SetFormat(self, arg2):
+        """SetFormat(SBTypeFormat self, lldb::Format arg2)"""
+        return _lldb.SBTypeFormat_SetFormat(self, arg2)
+
+
+    def SetTypeName(self, arg2):
+        """SetTypeName(SBTypeFormat self, char const * arg2)"""
+        return _lldb.SBTypeFormat_SetTypeName(self, arg2)
+
+
+    def SetOptions(self, arg2):
+        """SetOptions(SBTypeFormat self, uint32_t arg2)"""
+        return _lldb.SBTypeFormat_SetOptions(self, arg2)
+
+
+    def GetDescription(self, description, description_level):
+        """GetDescription(SBTypeFormat self, SBStream description, lldb::DescriptionLevel description_level) -> bool"""
+        return _lldb.SBTypeFormat_GetDescription(self, description, description_level)
+
+
+    def __eq__(self, rhs):
+        """__eq__(SBTypeFormat self, SBTypeFormat rhs) -> bool"""
+        return _lldb.SBTypeFormat___eq__(self, rhs)
+
+
+    def __ne__(self, rhs):
+        """__ne__(SBTypeFormat self, SBTypeFormat rhs) -> bool"""
+        return _lldb.SBTypeFormat___ne__(self, rhs)
+
+
+    format = property(GetFormat, SetFormat)
+    options = property(GetOptions, SetOptions)
+
+
+    def __str__(self):
+        """__str__(SBTypeFormat self) -> PyObject *"""
+        return _lldb.SBTypeFormat___str__(self)
+
+SBTypeFormat_swigregister = _lldb.SBTypeFormat_swigregister
+SBTypeFormat_swigregister(SBTypeFormat)
+
+class SBTypeNameSpecifier(_object):
+    """Represents a general way to provide a type name to LLDB APIs."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBTypeNameSpecifier, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBTypeNameSpecifier, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBTypeNameSpecifier self) -> SBTypeNameSpecifier
+        __init__(lldb::SBTypeNameSpecifier self, char const * name, bool is_regex=False) -> SBTypeNameSpecifier
+        __init__(lldb::SBTypeNameSpecifier self, char const * name) -> SBTypeNameSpecifier
+        __init__(lldb::SBTypeNameSpecifier self, SBType type) -> SBTypeNameSpecifier
+        __init__(lldb::SBTypeNameSpecifier self, SBTypeNameSpecifier rhs) -> SBTypeNameSpecifier
+        """
+        this = _lldb.new_SBTypeNameSpecifier(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBTypeNameSpecifier
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBTypeNameSpecifier self) -> bool"""
+        return _lldb.SBTypeNameSpecifier_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBTypeNameSpecifier___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def IsEqualTo(self, rhs):
+        """IsEqualTo(SBTypeNameSpecifier self, SBTypeNameSpecifier rhs) -> bool"""
+        return _lldb.SBTypeNameSpecifier_IsEqualTo(self, rhs)
+
+
+    def GetName(self):
+        """GetName(SBTypeNameSpecifier self) -> char const *"""
+        return _lldb.SBTypeNameSpecifier_GetName(self)
+
+
+    def GetType(self):
+        """GetType(SBTypeNameSpecifier self) -> SBType"""
+        return _lldb.SBTypeNameSpecifier_GetType(self)
+
+
+    def IsRegex(self):
+        """IsRegex(SBTypeNameSpecifier self) -> bool"""
+        return _lldb.SBTypeNameSpecifier_IsRegex(self)
+
+
+    def GetDescription(self, description, description_level):
+        """GetDescription(SBTypeNameSpecifier self, SBStream description, lldb::DescriptionLevel description_level) -> bool"""
+        return _lldb.SBTypeNameSpecifier_GetDescription(self, description, description_level)
+
+
+    def __eq__(self, rhs):
+        """__eq__(SBTypeNameSpecifier self, SBTypeNameSpecifier rhs) -> bool"""
+        return _lldb.SBTypeNameSpecifier___eq__(self, rhs)
+
+
+    def __ne__(self, rhs):
+        """__ne__(SBTypeNameSpecifier self, SBTypeNameSpecifier rhs) -> bool"""
+        return _lldb.SBTypeNameSpecifier___ne__(self, rhs)
+
+
+    name = property(GetName)
+    is_regex = property(IsRegex)
+
+
+    def __str__(self):
+        """__str__(SBTypeNameSpecifier self) -> PyObject *"""
+        return _lldb.SBTypeNameSpecifier___str__(self)
+
+
+    def __eq__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return False 
+
+        return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
+
+    def __ne__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return True 
+
+        return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
+
+SBTypeNameSpecifier_swigregister = _lldb.SBTypeNameSpecifier_swigregister
+SBTypeNameSpecifier_swigregister(SBTypeNameSpecifier)
+
+class SBTypeSummaryOptions(_object):
+    """Proxy of C++ lldb::SBTypeSummaryOptions class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBTypeSummaryOptions, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBTypeSummaryOptions, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBTypeSummaryOptions self) -> SBTypeSummaryOptions
+        __init__(lldb::SBTypeSummaryOptions self, SBTypeSummaryOptions rhs) -> SBTypeSummaryOptions
+        """
+        this = _lldb.new_SBTypeSummaryOptions(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBTypeSummaryOptions
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBTypeSummaryOptions self) -> bool"""
+        return _lldb.SBTypeSummaryOptions_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBTypeSummaryOptions___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetLanguage(self):
+        """GetLanguage(SBTypeSummaryOptions self) -> lldb::LanguageType"""
+        return _lldb.SBTypeSummaryOptions_GetLanguage(self)
+
+
+    def GetCapping(self):
+        """GetCapping(SBTypeSummaryOptions self) -> lldb::TypeSummaryCapping"""
+        return _lldb.SBTypeSummaryOptions_GetCapping(self)
+
+
+    def SetLanguage(self, arg2):
+        """SetLanguage(SBTypeSummaryOptions self, lldb::LanguageType arg2)"""
+        return _lldb.SBTypeSummaryOptions_SetLanguage(self, arg2)
+
+
+    def SetCapping(self, arg2):
+        """SetCapping(SBTypeSummaryOptions self, lldb::TypeSummaryCapping arg2)"""
+        return _lldb.SBTypeSummaryOptions_SetCapping(self, arg2)
+
+SBTypeSummaryOptions_swigregister = _lldb.SBTypeSummaryOptions_swigregister
+SBTypeSummaryOptions_swigregister(SBTypeSummaryOptions)
+
+class SBTypeSummary(_object):
+    """Represents a summary that can be associated to one or more types."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBTypeSummary, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBTypeSummary, name)
+    __repr__ = _swig_repr
+
+    def CreateWithSummaryString(data, options=0):
+        """
+        CreateWithSummaryString(char const * data, uint32_t options=0) -> SBTypeSummary
+        CreateWithSummaryString(char const * data) -> SBTypeSummary
+        """
+        return _lldb.SBTypeSummary_CreateWithSummaryString(data, options)
+
+    CreateWithSummaryString = staticmethod(CreateWithSummaryString)
+
+    def CreateWithFunctionName(data, options=0):
+        """
+        CreateWithFunctionName(char const * data, uint32_t options=0) -> SBTypeSummary
+        CreateWithFunctionName(char const * data) -> SBTypeSummary
+        """
+        return _lldb.SBTypeSummary_CreateWithFunctionName(data, options)
+
+    CreateWithFunctionName = staticmethod(CreateWithFunctionName)
+
+    def CreateWithScriptCode(data, options=0):
+        """
+        CreateWithScriptCode(char const * data, uint32_t options=0) -> SBTypeSummary
+        CreateWithScriptCode(char const * data) -> SBTypeSummary
+        """
+        return _lldb.SBTypeSummary_CreateWithScriptCode(data, options)
+
+    CreateWithScriptCode = staticmethod(CreateWithScriptCode)
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBTypeSummary self) -> SBTypeSummary
+        __init__(lldb::SBTypeSummary self, SBTypeSummary rhs) -> SBTypeSummary
+        """
+        this = _lldb.new_SBTypeSummary(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBTypeSummary
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBTypeSummary self) -> bool"""
+        return _lldb.SBTypeSummary_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBTypeSummary___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def IsEqualTo(self, rhs):
+        """IsEqualTo(SBTypeSummary self, SBTypeSummary rhs) -> bool"""
+        return _lldb.SBTypeSummary_IsEqualTo(self, rhs)
+
+
+    def IsFunctionCode(self):
+        """IsFunctionCode(SBTypeSummary self) -> bool"""
+        return _lldb.SBTypeSummary_IsFunctionCode(self)
+
+
+    def IsFunctionName(self):
+        """IsFunctionName(SBTypeSummary self) -> bool"""
+        return _lldb.SBTypeSummary_IsFunctionName(self)
+
+
+    def IsSummaryString(self):
+        """IsSummaryString(SBTypeSummary self) -> bool"""
+        return _lldb.SBTypeSummary_IsSummaryString(self)
+
+
+    def GetData(self):
+        """GetData(SBTypeSummary self) -> char const *"""
+        return _lldb.SBTypeSummary_GetData(self)
+
+
+    def SetSummaryString(self, data):
+        """SetSummaryString(SBTypeSummary self, char const * data)"""
+        return _lldb.SBTypeSummary_SetSummaryString(self, data)
+
+
+    def SetFunctionName(self, data):
+        """SetFunctionName(SBTypeSummary self, char const * data)"""
+        return _lldb.SBTypeSummary_SetFunctionName(self, data)
+
+
+    def SetFunctionCode(self, data):
+        """SetFunctionCode(SBTypeSummary self, char const * data)"""
+        return _lldb.SBTypeSummary_SetFunctionCode(self, data)
+
+
+    def GetOptions(self):
+        """GetOptions(SBTypeSummary self) -> uint32_t"""
+        return _lldb.SBTypeSummary_GetOptions(self)
+
+
+    def SetOptions(self, arg2):
+        """SetOptions(SBTypeSummary self, uint32_t arg2)"""
+        return _lldb.SBTypeSummary_SetOptions(self, arg2)
+
+
+    def GetDescription(self, description, description_level):
+        """GetDescription(SBTypeSummary self, SBStream description, lldb::DescriptionLevel description_level) -> bool"""
+        return _lldb.SBTypeSummary_GetDescription(self, description, description_level)
+
+
+    def __eq__(self, rhs):
+        """__eq__(SBTypeSummary self, SBTypeSummary rhs) -> bool"""
+        return _lldb.SBTypeSummary___eq__(self, rhs)
+
+
+    def __ne__(self, rhs):
+        """__ne__(SBTypeSummary self, SBTypeSummary rhs) -> bool"""
+        return _lldb.SBTypeSummary___ne__(self, rhs)
+
+
+    options = property(GetOptions, SetOptions)
+    is_summary_string = property(IsSummaryString)
+    is_function_name = property(IsFunctionName)
+    is_function_name = property(IsFunctionCode)
+    summary_data = property(GetData)
+
+
+    def __str__(self):
+        """__str__(SBTypeSummary self) -> PyObject *"""
+        return _lldb.SBTypeSummary___str__(self)
+
+
+    def __eq__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return False 
+
+        return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
+
+    def __ne__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return True 
+
+        return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
+
+SBTypeSummary_swigregister = _lldb.SBTypeSummary_swigregister
+SBTypeSummary_swigregister(SBTypeSummary)
+
+def SBTypeSummary_CreateWithSummaryString(data, options=0):
+    """
+    CreateWithSummaryString(char const * data, uint32_t options=0) -> SBTypeSummary
+    SBTypeSummary_CreateWithSummaryString(char const * data) -> SBTypeSummary
+    """
+    return _lldb.SBTypeSummary_CreateWithSummaryString(data, options)
+
+def SBTypeSummary_CreateWithFunctionName(data, options=0):
+    """
+    CreateWithFunctionName(char const * data, uint32_t options=0) -> SBTypeSummary
+    SBTypeSummary_CreateWithFunctionName(char const * data) -> SBTypeSummary
+    """
+    return _lldb.SBTypeSummary_CreateWithFunctionName(data, options)
+
+def SBTypeSummary_CreateWithScriptCode(data, options=0):
+    """
+    CreateWithScriptCode(char const * data, uint32_t options=0) -> SBTypeSummary
+    SBTypeSummary_CreateWithScriptCode(char const * data) -> SBTypeSummary
+    """
+    return _lldb.SBTypeSummary_CreateWithScriptCode(data, options)
+
+class SBTypeSynthetic(_object):
+    """Represents a summary that can be associated to one or more types."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBTypeSynthetic, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBTypeSynthetic, name)
+    __repr__ = _swig_repr
+
+    def CreateWithClassName(data, options=0):
+        """
+        CreateWithClassName(char const * data, uint32_t options=0) -> SBTypeSynthetic
+        CreateWithClassName(char const * data) -> SBTypeSynthetic
+        """
+        return _lldb.SBTypeSynthetic_CreateWithClassName(data, options)
+
+    CreateWithClassName = staticmethod(CreateWithClassName)
+
+    def CreateWithScriptCode(data, options=0):
+        """
+        CreateWithScriptCode(char const * data, uint32_t options=0) -> SBTypeSynthetic
+        CreateWithScriptCode(char const * data) -> SBTypeSynthetic
+        """
+        return _lldb.SBTypeSynthetic_CreateWithScriptCode(data, options)
+
+    CreateWithScriptCode = staticmethod(CreateWithScriptCode)
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBTypeSynthetic self) -> SBTypeSynthetic
+        __init__(lldb::SBTypeSynthetic self, SBTypeSynthetic rhs) -> SBTypeSynthetic
+        """
+        this = _lldb.new_SBTypeSynthetic(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBTypeSynthetic
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBTypeSynthetic self) -> bool"""
+        return _lldb.SBTypeSynthetic_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBTypeSynthetic___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def IsEqualTo(self, rhs):
+        """IsEqualTo(SBTypeSynthetic self, SBTypeSynthetic rhs) -> bool"""
+        return _lldb.SBTypeSynthetic_IsEqualTo(self, rhs)
+
+
+    def IsClassCode(self):
+        """IsClassCode(SBTypeSynthetic self) -> bool"""
+        return _lldb.SBTypeSynthetic_IsClassCode(self)
+
+
+    def GetData(self):
+        """GetData(SBTypeSynthetic self) -> char const *"""
+        return _lldb.SBTypeSynthetic_GetData(self)
+
+
+    def SetClassName(self, data):
+        """SetClassName(SBTypeSynthetic self, char const * data)"""
+        return _lldb.SBTypeSynthetic_SetClassName(self, data)
+
+
+    def SetClassCode(self, data):
+        """SetClassCode(SBTypeSynthetic self, char const * data)"""
+        return _lldb.SBTypeSynthetic_SetClassCode(self, data)
+
+
+    def GetOptions(self):
+        """GetOptions(SBTypeSynthetic self) -> uint32_t"""
+        return _lldb.SBTypeSynthetic_GetOptions(self)
+
+
+    def SetOptions(self, arg2):
+        """SetOptions(SBTypeSynthetic self, uint32_t arg2)"""
+        return _lldb.SBTypeSynthetic_SetOptions(self, arg2)
+
+
+    def GetDescription(self, description, description_level):
+        """GetDescription(SBTypeSynthetic self, SBStream description, lldb::DescriptionLevel description_level) -> bool"""
+        return _lldb.SBTypeSynthetic_GetDescription(self, description, description_level)
+
+
+    def __eq__(self, rhs):
+        """__eq__(SBTypeSynthetic self, SBTypeSynthetic rhs) -> bool"""
+        return _lldb.SBTypeSynthetic___eq__(self, rhs)
+
+
+    def __ne__(self, rhs):
+        """__ne__(SBTypeSynthetic self, SBTypeSynthetic rhs) -> bool"""
+        return _lldb.SBTypeSynthetic___ne__(self, rhs)
+
+
+    options = property(GetOptions, SetOptions)
+    contains_code = property(IsClassCode, None)
+    synthetic_data = property(GetData, None)
+
+
+    def __str__(self):
+        """__str__(SBTypeSynthetic self) -> PyObject *"""
+        return _lldb.SBTypeSynthetic___str__(self)
+
+
+    def __eq__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return False 
+
+        return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
+
+    def __ne__(self, rhs):
+        if not isinstance(rhs, type(self)): 
+            return True 
+
+        return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
+
+SBTypeSynthetic_swigregister = _lldb.SBTypeSynthetic_swigregister
+SBTypeSynthetic_swigregister(SBTypeSynthetic)
+
+def SBTypeSynthetic_CreateWithClassName(data, options=0):
+    """
+    CreateWithClassName(char const * data, uint32_t options=0) -> SBTypeSynthetic
+    SBTypeSynthetic_CreateWithClassName(char const * data) -> SBTypeSynthetic
+    """
+    return _lldb.SBTypeSynthetic_CreateWithClassName(data, options)
+
+def SBTypeSynthetic_CreateWithScriptCode(data, options=0):
+    """
+    CreateWithScriptCode(char const * data, uint32_t options=0) -> SBTypeSynthetic
+    SBTypeSynthetic_CreateWithScriptCode(char const * data) -> SBTypeSynthetic
+    """
+    return _lldb.SBTypeSynthetic_CreateWithScriptCode(data, options)
+
+class SBValue(_object):
+    """
+    Represents the value of a variable, a register, or an expression.
+
+    SBValue supports iteration through its child, which in turn is represented
+    as an SBValue.  For example, we can get the general purpose registers of a
+    frame as an SBValue, and iterate through all the registers,
+
+        registerSet = frame.registers # Returns an SBValueList.
+        for regs in registerSet:
+            if 'general purpose registers' in regs.name.lower():
+                GPRs = regs
+                break
+
+        print('%s (number of children = %d):' % (GPRs.name, GPRs.num_children))
+        for reg in GPRs:
+            print('Name: ', reg.name, ' Value: ', reg.value)
+
+    produces the output:
+
+    General Purpose Registers (number of children = 21):
+    Name:  rax  Value:  0x0000000100000c5c
+    Name:  rbx  Value:  0x0000000000000000
+    Name:  rcx  Value:  0x00007fff5fbffec0
+    Name:  rdx  Value:  0x00007fff5fbffeb8
+    Name:  rdi  Value:  0x0000000000000001
+    Name:  rsi  Value:  0x00007fff5fbffea8
+    Name:  rbp  Value:  0x00007fff5fbffe80
+    Name:  rsp  Value:  0x00007fff5fbffe60
+    Name:  r8  Value:  0x0000000008668682
+    Name:  r9  Value:  0x0000000000000000
+    Name:  r10  Value:  0x0000000000001200
+    Name:  r11  Value:  0x0000000000000206
+    Name:  r12  Value:  0x0000000000000000
+    Name:  r13  Value:  0x0000000000000000
+    Name:  r14  Value:  0x0000000000000000
+    Name:  r15  Value:  0x0000000000000000
+    Name:  rip  Value:  0x0000000100000dae
+    Name:  rflags  Value:  0x0000000000000206
+    Name:  cs  Value:  0x0000000000000027
+    Name:  fs  Value:  0x0000000000000010
+    Name:  gs  Value:  0x0000000000000048
+
+    See also linked_list_iter() for another perspective on how to iterate through an
+    SBValue instance which interprets the value object as representing the head of a
+    linked list.
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBValue, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBValue, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBValue self) -> SBValue
+        __init__(lldb::SBValue self, SBValue rhs) -> SBValue
+        """
+        this = _lldb.new_SBValue(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBValue
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBValue self) -> bool"""
+        return _lldb.SBValue_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBValue___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def Clear(self):
+        """Clear(SBValue self)"""
+        return _lldb.SBValue_Clear(self)
+
+
+    def GetError(self):
+        """GetError(SBValue self) -> SBError"""
+        return _lldb.SBValue_GetError(self)
+
+
+    def GetID(self):
+        """GetID(SBValue self) -> lldb::user_id_t"""
+        return _lldb.SBValue_GetID(self)
+
+
+    def GetName(self):
+        """GetName(SBValue self) -> char const *"""
+        return _lldb.SBValue_GetName(self)
+
+
+    def GetTypeName(self):
+        """GetTypeName(SBValue self) -> char const *"""
+        return _lldb.SBValue_GetTypeName(self)
+
+
+    def GetDisplayTypeName(self):
+        """GetDisplayTypeName(SBValue self) -> char const *"""
+        return _lldb.SBValue_GetDisplayTypeName(self)
+
+
+    def GetByteSize(self):
+        """GetByteSize(SBValue self) -> size_t"""
+        return _lldb.SBValue_GetByteSize(self)
+
+
+    def IsInScope(self):
+        """IsInScope(SBValue self) -> bool"""
+        return _lldb.SBValue_IsInScope(self)
+
+
+    def GetFormat(self):
+        """GetFormat(SBValue self) -> lldb::Format"""
+        return _lldb.SBValue_GetFormat(self)
+
+
+    def SetFormat(self, format):
+        """SetFormat(SBValue self, lldb::Format format)"""
+        return _lldb.SBValue_SetFormat(self, format)
+
+
+    def GetValue(self):
+        """GetValue(SBValue self) -> char const *"""
+        return _lldb.SBValue_GetValue(self)
+
+
+    def GetValueAsSigned(self, *args):
+        """
+        GetValueAsSigned(SBValue self, SBError error, int64_t fail_value=0) -> int64_t
+        GetValueAsSigned(SBValue self, SBError error) -> int64_t
+        GetValueAsSigned(SBValue self, int64_t fail_value=0) -> int64_t
+        GetValueAsSigned(SBValue self) -> int64_t
+        """
+        return _lldb.SBValue_GetValueAsSigned(self, *args)
+
+
+    def GetValueAsUnsigned(self, *args):
+        """
+        GetValueAsUnsigned(SBValue self, SBError error, uint64_t fail_value=0) -> uint64_t
+        GetValueAsUnsigned(SBValue self, SBError error) -> uint64_t
+        GetValueAsUnsigned(SBValue self, uint64_t fail_value=0) -> uint64_t
+        GetValueAsUnsigned(SBValue self) -> uint64_t
+        """
+        return _lldb.SBValue_GetValueAsUnsigned(self, *args)
+
+
+    def GetValueType(self):
+        """GetValueType(SBValue self) -> lldb::ValueType"""
+        return _lldb.SBValue_GetValueType(self)
+
+
+    def GetValueDidChange(self):
+        """GetValueDidChange(SBValue self) -> bool"""
+        return _lldb.SBValue_GetValueDidChange(self)
+
+
+    def GetSummary(self, *args):
+        """
+        GetSummary(SBValue self) -> char const
+        GetSummary(SBValue self, SBStream stream, SBTypeSummaryOptions options) -> char const *
+        """
+        return _lldb.SBValue_GetSummary(self, *args)
+
+
+    def GetObjectDescription(self):
+        """GetObjectDescription(SBValue self) -> char const *"""
+        return _lldb.SBValue_GetObjectDescription(self)
+
+
+    def GetTypeValidatorResult(self):
+        """GetTypeValidatorResult(SBValue self) -> char const *"""
+        return _lldb.SBValue_GetTypeValidatorResult(self)
+
+
+    def GetDynamicValue(self, use_dynamic):
+        """GetDynamicValue(SBValue self, lldb::DynamicValueType use_dynamic) -> SBValue"""
+        return _lldb.SBValue_GetDynamicValue(self, use_dynamic)
+
+
+    def GetStaticValue(self):
+        """GetStaticValue(SBValue self) -> SBValue"""
+        return _lldb.SBValue_GetStaticValue(self)
+
+
+    def GetNonSyntheticValue(self):
+        """GetNonSyntheticValue(SBValue self) -> SBValue"""
+        return _lldb.SBValue_GetNonSyntheticValue(self)
+
+
+    def GetPreferDynamicValue(self):
+        """GetPreferDynamicValue(SBValue self) -> lldb::DynamicValueType"""
+        return _lldb.SBValue_GetPreferDynamicValue(self)
+
+
+    def SetPreferDynamicValue(self, use_dynamic):
+        """SetPreferDynamicValue(SBValue self, lldb::DynamicValueType use_dynamic)"""
+        return _lldb.SBValue_SetPreferDynamicValue(self, use_dynamic)
+
+
+    def GetPreferSyntheticValue(self):
+        """GetPreferSyntheticValue(SBValue self) -> bool"""
+        return _lldb.SBValue_GetPreferSyntheticValue(self)
+
+
+    def SetPreferSyntheticValue(self, use_synthetic):
+        """SetPreferSyntheticValue(SBValue self, bool use_synthetic)"""
+        return _lldb.SBValue_SetPreferSyntheticValue(self, use_synthetic)
+
+
+    def IsDynamic(self):
+        """IsDynamic(SBValue self) -> bool"""
+        return _lldb.SBValue_IsDynamic(self)
+
+
+    def IsSynthetic(self):
+        """IsSynthetic(SBValue self) -> bool"""
+        return _lldb.SBValue_IsSynthetic(self)
+
+
+    def IsSyntheticChildrenGenerated(self):
+        """IsSyntheticChildrenGenerated(SBValue self) -> bool"""
+        return _lldb.SBValue_IsSyntheticChildrenGenerated(self)
+
+
+    def SetSyntheticChildrenGenerated(self, arg2):
+        """SetSyntheticChildrenGenerated(SBValue self, bool arg2)"""
+        return _lldb.SBValue_SetSyntheticChildrenGenerated(self, arg2)
+
+
+    def GetLocation(self):
+        """GetLocation(SBValue self) -> char const *"""
+        return _lldb.SBValue_GetLocation(self)
+
+
+    def SetValueFromCString(self, *args):
+        """
+        SetValueFromCString(SBValue self, char const * value_str) -> bool
+        SetValueFromCString(SBValue self, char const * value_str, SBError error) -> bool
+        """
+        return _lldb.SBValue_SetValueFromCString(self, *args)
+
+
+    def GetTypeFormat(self):
+        """GetTypeFormat(SBValue self) -> SBTypeFormat"""
+        return _lldb.SBValue_GetTypeFormat(self)
+
+
+    def GetTypeSummary(self):
+        """GetTypeSummary(SBValue self) -> SBTypeSummary"""
+        return _lldb.SBValue_GetTypeSummary(self)
+
+
+    def GetTypeFilter(self):
+        """GetTypeFilter(SBValue self) -> SBTypeFilter"""
+        return _lldb.SBValue_GetTypeFilter(self)
+
+
+    def GetTypeSynthetic(self):
+        """GetTypeSynthetic(SBValue self) -> SBTypeSynthetic"""
+        return _lldb.SBValue_GetTypeSynthetic(self)
+
+
+    def GetChildAtIndex(self, *args):
+        """
+        GetChildAtIndex(SBValue self, uint32_t idx) -> SBValue
+        GetChildAtIndex(SBValue self, uint32_t idx, lldb::DynamicValueType use_dynamic, bool can_create_synthetic) -> SBValue
+
+
+        Get a child value by index from a value.
+
+        Structs, unions, classes, arrays and pointers have child
+        values that can be access by index.
+
+        Structs and unions access child members using a zero based index
+        for each child member. For
+
+        Classes reserve the first indexes for base classes that have
+        members (empty base classes are omitted), and all members of the
+        current class will then follow the base classes.
+
+        Pointers differ depending on what they point to. If the pointer
+        points to a simple type, the child at index zero
+        is the only child value available, unless synthetic_allowed
+        is true, in which case the pointer will be used as an array
+        and can create 'synthetic' child values using positive or
+        negative indexes. If the pointer points to an aggregate type
+        (an array, class, union, struct), then the pointee is
+        transparently skipped and any children are going to be the indexes
+        of the child values within the aggregate type. For example if
+        we have a 'Point' type and we have a SBValue that contains a
+        pointer to a 'Point' type, then the child at index zero will be
+        the 'x' member, and the child at index 1 will be the 'y' member
+        (the child at index zero won't be a 'Point' instance).
+
+        If you actually need an SBValue that represents the type pointed
+        to by a SBValue for which GetType().IsPointeeType() returns true,
+        regardless of the pointee type, you can do that with the SBValue.Dereference
+        method (or the equivalent deref property).
+
+        Arrays have a preset number of children that can be accessed by
+        index and will returns invalid child values for indexes that are
+        out of bounds unless the synthetic_allowed is true. In this
+        case the array can create 'synthetic' child values for indexes
+        that aren't in the array bounds using positive or negative
+        indexes.
+
+        @param[in] idx
+            The index of the child value to get
+
+        @param[in] use_dynamic
+            An enumeration that specifies whether to get dynamic values,
+            and also if the target can be run to figure out the dynamic
+            type of the child value.
+
+        @param[in] synthetic_allowed
+            If true, then allow child values to be created by index
+            for pointers and arrays for indexes that normally wouldn't
+            be allowed.
+
+        @return
+            A new SBValue object that represents the child member value.
+        """
+        return _lldb.SBValue_GetChildAtIndex(self, *args)
+
+
+    def CreateChildAtOffset(self, name, offset, type):
+        """CreateChildAtOffset(SBValue self, char const * name, uint32_t offset, SBType type) -> SBValue"""
+        return _lldb.SBValue_CreateChildAtOffset(self, name, offset, type)
+
+
+    def Cast(self, type):
+        """Cast(SBValue self, SBType type) -> SBValue"""
+        return _lldb.SBValue_Cast(self, type)
+
+
+    def CreateValueFromExpression(self, *args):
+        """
+        CreateValueFromExpression(SBValue self, char const * name, char const * expression) -> SBValue
+        CreateValueFromExpression(SBValue self, char const * name, char const * expression, SBExpressionOptions options) -> SBValue
+        """
+        return _lldb.SBValue_CreateValueFromExpression(self, *args)
+
+
+    def CreateValueFromAddress(self, name, address, type):
+        """CreateValueFromAddress(SBValue self, char const * name, lldb::addr_t address, SBType type) -> SBValue"""
+        return _lldb.SBValue_CreateValueFromAddress(self, name, address, type)
+
+
+    def CreateValueFromData(self, name, data, type):
+        """CreateValueFromData(SBValue self, char const * name, SBData data, SBType type) -> SBValue"""
+        return _lldb.SBValue_CreateValueFromData(self, name, data, type)
+
+
+    def GetType(self):
+        """GetType(SBValue self) -> SBType"""
+        return _lldb.SBValue_GetType(self)
+
+
+    def GetIndexOfChildWithName(self, name):
+        """
+        GetIndexOfChildWithName(SBValue self, char const * name) -> uint32_t
+
+
+        Returns the child member index.
+
+        Matches children of this object only and will match base classes and
+        member names if this is a clang typed object.
+
+        @param[in] name
+            The name of the child value to get
+
+        @return
+            An index to the child member value.
+        """
+        return _lldb.SBValue_GetIndexOfChildWithName(self, name)
+
+
+    def GetChildMemberWithName(self, *args):
+        """
+        GetChildMemberWithName(SBValue self, char const * name) -> SBValue
+        GetChildMemberWithName(SBValue self, char const * name, lldb::DynamicValueType use_dynamic) -> SBValue
+
+
+        Returns the child member value.
+
+        Matches child members of this object and child members of any base
+        classes.
+
+        @param[in] name
+            The name of the child value to get
+
+        @param[in] use_dynamic
+            An enumeration that specifies whether to get dynamic values,
+            and also if the target can be run to figure out the dynamic
+            type of the child value.
+
+        @return
+            A new SBValue object that represents the child member value.
+        """
+        return _lldb.SBValue_GetChildMemberWithName(self, *args)
+
+
+    def GetValueForExpressionPath(self, expr_path):
+        """
+        GetValueForExpressionPath(SBValue self, char const * expr_path) -> SBValue
+
+        Expands nested expressions like .a->b[0].c[1]->d.
+        """
+        return _lldb.SBValue_GetValueForExpressionPath(self, expr_path)
+
+
+    def GetDeclaration(self):
+        """GetDeclaration(SBValue self) -> SBDeclaration"""
+        return _lldb.SBValue_GetDeclaration(self)
+
+
+    def MightHaveChildren(self):
+        """MightHaveChildren(SBValue self) -> bool"""
+        return _lldb.SBValue_MightHaveChildren(self)
+
+
+    def IsRuntimeSupportValue(self):
+        """IsRuntimeSupportValue(SBValue self) -> bool"""
+        return _lldb.SBValue_IsRuntimeSupportValue(self)
+
+
+    def GetNumChildren(self, *args):
+        """
+        GetNumChildren(SBValue self) -> uint32_t
+        GetNumChildren(SBValue self, uint32_t max) -> uint32_t
+        """
+        return _lldb.SBValue_GetNumChildren(self, *args)
+
+
+    def GetOpaqueType(self):
+        """GetOpaqueType(SBValue self) -> void *"""
+        return _lldb.SBValue_GetOpaqueType(self)
+
+
+    def Dereference(self):
+        """Dereference(SBValue self) -> SBValue"""
+        return _lldb.SBValue_Dereference(self)
+
+
+    def AddressOf(self):
+        """AddressOf(SBValue self) -> SBValue"""
+        return _lldb.SBValue_AddressOf(self)
+
+
+    def TypeIsPointerType(self):
+        """TypeIsPointerType(SBValue self) -> bool"""
+        return _lldb.SBValue_TypeIsPointerType(self)
+
+
+    def GetTarget(self):
+        """GetTarget(SBValue self) -> SBTarget"""
+        return _lldb.SBValue_GetTarget(self)
+
+
+    def GetProcess(self):
+        """GetProcess(SBValue self) -> SBProcess"""
+        return _lldb.SBValue_GetProcess(self)
+
+
+    def GetThread(self):
+        """GetThread(SBValue self) -> SBThread"""
+        return _lldb.SBValue_GetThread(self)
+
+
+    def GetFrame(self):
+        """GetFrame(SBValue self) -> SBFrame"""
+        return _lldb.SBValue_GetFrame(self)
+
+
+    def Watch(self, resolve_location, read, write, error):
+        """
+        Watch(SBValue self, bool resolve_location, bool read, bool write, SBError error) -> SBWatchpoint
+
+
+        Find and watch a variable.
+        It returns an SBWatchpoint, which may be invalid.
+        """
+        return _lldb.SBValue_Watch(self, resolve_location, read, write, error)
+
+
+    def WatchPointee(self, resolve_location, read, write, error):
+        """
+        WatchPointee(SBValue self, bool resolve_location, bool read, bool write, SBError error) -> SBWatchpoint
+
+
+        Find and watch the location pointed to by a variable.
+        It returns an SBWatchpoint, which may be invalid.
+        """
+        return _lldb.SBValue_WatchPointee(self, resolve_location, read, write, error)
+
+
+    def GetDescription(self, description):
+        """GetDescription(SBValue self, SBStream description) -> bool"""
+        return _lldb.SBValue_GetDescription(self, description)
+
+
+    def GetPointeeData(self, item_idx=0, item_count=1):
+        """
+        GetPointeeData(SBValue self, uint32_t item_idx=0, uint32_t item_count=1) -> SBData
+        GetPointeeData(SBValue self, uint32_t item_idx=0) -> SBData
+        GetPointeeData(SBValue self) -> SBData
+
+
+        Get an SBData wrapping what this SBValue points to.
+
+        This method will dereference the current SBValue, if its
+        data type is a T* or T[], and extract item_count elements
+        of type T from it, copying their contents in an SBData.
+
+        @param[in] item_idx
+            The index of the first item to retrieve. For an array
+            this is equivalent to array[item_idx], for a pointer
+            to *(pointer + item_idx). In either case, the measurement
+            unit for item_idx is the sizeof(T) rather than the byte
+
+        @param[in] item_count
+            How many items should be copied into the output. By default
+            only one item is copied, but more can be asked for.
+
+        @return
+            An SBData with the contents of the copied items, on success.
+            An empty SBData otherwise.
+        """
+        return _lldb.SBValue_GetPointeeData(self, item_idx, item_count)
+
+
+    def GetData(self):
+        """
+        GetData(SBValue self) -> SBData
+
+
+        Get an SBData wrapping the contents of this SBValue.
+
+        This method will read the contents of this object in memory
+        and copy them into an SBData for future use.
+
+        @return
+            An SBData with the contents of this SBValue, on success.
+            An empty SBData otherwise.
+        """
+        return _lldb.SBValue_GetData(self)
+
+
+    def SetData(self, data, error):
+        """SetData(SBValue self, SBData data, SBError error) -> bool"""
+        return _lldb.SBValue_SetData(self, data, error)
+
+
+    def GetLoadAddress(self):
+        """GetLoadAddress(SBValue self) -> lldb::addr_t"""
+        return _lldb.SBValue_GetLoadAddress(self)
+
+
+    def GetAddress(self):
+        """GetAddress(SBValue self) -> SBAddress"""
+        return _lldb.SBValue_GetAddress(self)
+
+
+    def Persist(self):
+        """Persist(SBValue self) -> SBValue"""
+        return _lldb.SBValue_Persist(self)
+
+
+    def GetExpressionPath(self, *args):
+        """
+        GetExpressionPath(SBValue self, SBStream description) -> bool
+        GetExpressionPath(SBValue self, SBStream description, bool qualify_cxx_base_classes) -> bool
+
+        Returns an expression path for this value.
+        """
+        return _lldb.SBValue_GetExpressionPath(self, *args)
+
+
+    def EvaluateExpression(self, *args):
+        """
+        EvaluateExpression(SBValue self, char const * expr) -> SBValue
+        EvaluateExpression(SBValue self, char const * expr, SBExpressionOptions options) -> SBValue
+        EvaluateExpression(SBValue self, char const * expr, SBExpressionOptions options, char const * name) -> SBValue
+        """
+        return _lldb.SBValue_EvaluateExpression(self, *args)
+
+
+    def __get_dynamic__ (self):
+        '''Helper function for the "SBValue.dynamic" property.'''
+        return self.GetDynamicValue (eDynamicCanRunTarget)
+
+    class children_access(object):
+        '''A helper object that will lazily hand out thread for a process when supplied an index.'''
+
+        def __init__(self, sbvalue):
+            self.sbvalue = sbvalue
+
+        def __len__(self):
+            if self.sbvalue:
+                return int(self.sbvalue.GetNumChildren())
+            return 0
+
+        def __getitem__(self, key):
+            if type(key) is int and key < len(self):
+                return self.sbvalue.GetChildAtIndex(key)
+            return None
+
+    def get_child_access_object(self):
+        '''An accessor function that returns a children_access() object which allows lazy member variable access from a lldb.SBValue object.'''
+        return self.children_access (self)
+
+    def get_value_child_list(self):
+        '''An accessor function that returns a list() that contains all children in a lldb.SBValue object.'''
+        children = []
+        accessor = self.get_child_access_object()
+        for idx in range(len(accessor)):
+            children.append(accessor[idx])
+        return children
+
+    def __iter__(self):
+        '''Iterate over all child values of a lldb.SBValue object.'''
+        return lldb_iter(self, 'GetNumChildren', 'GetChildAtIndex')
+
+    def __len__(self):
+        '''Return the number of child values of a lldb.SBValue object.'''
+        return self.GetNumChildren()
+
+    children = property(get_value_child_list, None, doc='''A read only property that returns a list() of lldb.SBValue objects for the children of the value.''')
+    child = property(get_child_access_object, None, doc='''A read only property that returns an object that can access children of a variable by index (child_value = value.children[12]).''')
+    name = property(GetName, None, doc='''A read only property that returns the name of this value as a string.''')
+    type = property(GetType, None, doc='''A read only property that returns a lldb.SBType object that represents the type for this value.''')
+    size = property(GetByteSize, None, doc='''A read only property that returns the size in bytes of this value.''')
+    is_in_scope = property(IsInScope, None, doc='''A read only property that returns a boolean value that indicates whether this value is currently lexically in scope.''')
+    format = property(GetName, SetFormat, doc='''A read/write property that gets/sets the format used for lldb.SBValue().GetValue() for this value. See enumerations that start with "lldb.eFormat".''')
+    value = property(GetValue, SetValueFromCString, doc='''A read/write property that gets/sets value from a string.''')
+    value_type = property(GetValueType, None, doc='''A read only property that returns an lldb enumeration value (see enumerations that start with "lldb.eValueType") that represents the type of this value (local, argument, global, register, etc.).''')
+    changed = property(GetValueDidChange, None, doc='''A read only property that returns a boolean value that indicates if this value has changed since it was last updated.''')
+    data = property(GetData, None, doc='''A read only property that returns an lldb object (lldb.SBData) that represents the bytes that make up the value for this object.''')
+    load_addr = property(GetLoadAddress, None, doc='''A read only property that returns the load address of this value as an integer.''')
+    addr = property(GetAddress, None, doc='''A read only property that returns an lldb.SBAddress that represents the address of this value if it is in memory.''')
+    deref = property(Dereference, None, doc='''A read only property that returns an lldb.SBValue that is created by dereferencing this value.''')
+    address_of = property(AddressOf, None, doc='''A read only property that returns an lldb.SBValue that represents the address-of this value.''')
+    error = property(GetError, None, doc='''A read only property that returns the lldb.SBError that represents the error from the last time the variable value was calculated.''')
+    summary = property(GetSummary, None, doc='''A read only property that returns the summary for this value as a string''')
+    description = property(GetObjectDescription, None, doc='''A read only property that returns the language-specific description of this value as a string''')
+    dynamic = property(__get_dynamic__, None, doc='''A read only property that returns an lldb.SBValue that is created by finding the dynamic type of this value.''')
+    location = property(GetLocation, None, doc='''A read only property that returns the location of this value as a string.''')
+    target = property(GetTarget, None, doc='''A read only property that returns the lldb.SBTarget that this value is associated with.''')
+    process = property(GetProcess, None, doc='''A read only property that returns the lldb.SBProcess that this value is associated with, the returned value might be invalid and should be tested.''')
+    thread = property(GetThread, None, doc='''A read only property that returns the lldb.SBThread that this value is associated with, the returned value might be invalid and should be tested.''')
+    frame = property(GetFrame, None, doc='''A read only property that returns the lldb.SBFrame that this value is associated with, the returned value might be invalid and should be tested.''')
+    num_children = property(GetNumChildren, None, doc='''A read only property that returns the number of child lldb.SBValues that this value has.''')
+    unsigned = property(GetValueAsUnsigned, None, doc='''A read only property that returns the value of this SBValue as an usigned integer.''')
+    signed = property(GetValueAsSigned, None, doc='''A read only property that returns the value of this SBValue as a signed integer.''')
+
+    def get_expr_path(self):
+        s = SBStream()
+        self.GetExpressionPath (s)
+        return s.GetData()
+
+    path = property(get_expr_path, None, doc='''A read only property that returns the expression path that one can use to reach this value in an expression.''')
+
+    def synthetic_child_from_expression(self, name, expr, options=None):
+        if options is None: options = lldb.SBExpressionOptions()
+        child = self.CreateValueFromExpression(name, expr, options)
+        child.SetSyntheticChildrenGenerated(True)
+        return child
+
+    def synthetic_child_from_data(self, name, data, type):
+        child = self.CreateValueFromData(name, data, type)
+        child.SetSyntheticChildrenGenerated(True)
+        return child
+
+    def synthetic_child_from_address(self, name, addr, type):
+        child = self.CreateValueFromAddress(name, addr, type)
+        child.SetSyntheticChildrenGenerated(True)
+        return child
+
+    def __eol_test(val):
+        """Default function for end of list test takes an SBValue object.
+
+        Return True if val is invalid or it corresponds to a null pointer.
+        Otherwise, return False.
+        """
+        if not val or val.GetValueAsUnsigned() == 0:
+            return True
+        else:
+            return False
+
+    # ==================================================
+    # Iterator for lldb.SBValue treated as a linked list
+    # ==================================================
+    def linked_list_iter(self, next_item_name, end_of_list_test=__eol_test):
+        """Generator adaptor to support iteration for SBValue as a linked list.
+
+        linked_list_iter() is a special purpose iterator to treat the SBValue as
+        the head of a list data structure, where you specify the child member
+        name which points to the next item on the list and you specify the
+        end-of-list test function which takes an SBValue for an item and returns
+        True if EOL is reached and False if not.
+
+        linked_list_iter() also detects infinite loop and bails out early.
+
+        The end_of_list_test arg, if omitted, defaults to the __eol_test
+        function above.
+
+        For example,
+
+    # Get Frame #0.
+        ...
+
+    # Get variable 'task_head'.
+        task_head = frame0.FindVariable('task_head')
+        ...
+
+        for t in task_head.linked_list_iter('next'):
+            print t
+        """
+        if end_of_list_test(self):
+            return
+        item = self
+        visited = set()
+        try:
+            while not end_of_list_test(item) and not item.GetValueAsUnsigned() in visited:
+                visited.add(item.GetValueAsUnsigned())
+                yield item
+    # Prepare for the next iteration.
+                item = item.GetChildMemberWithName(next_item_name)
+        except:
+    # Exception occurred.  Stop the generator.
+            pass
+
+        return
+
+
+    def __str__(self):
+        """__str__(SBValue self) -> PyObject *"""
+        return _lldb.SBValue___str__(self)
+
+SBValue_swigregister = _lldb.SBValue_swigregister
+SBValue_swigregister(SBValue)
+
+class SBValueList(_object):
+    """
+    Represents a collection of SBValues.  Both SBFrame's GetVariables() and
+    GetRegisters() return a SBValueList.
+
+    SBValueList supports SBValue iteration. For example (from test/lldbutil.py),
+
+    def get_registers(frame, kind):
+        '''Returns the registers given the frame and the kind of registers desired.
+
+        Returns None if there's no such kind.
+        '''
+        registerSet = frame.GetRegisters() # Return type of SBValueList.
+        for value in registerSet:
+            if kind.lower() in value.GetName().lower():
+                return value
+
+        return None
+
+    def get_GPRs(frame):
+        '''Returns the general purpose registers of the frame as an SBValue.
+
+        The returned SBValue object is iterable.  An example:
+            ...
+            from lldbutil import get_GPRs
+            regs = get_GPRs(frame)
+            for reg in regs:
+                print('%s => %s' % (reg.GetName(), reg.GetValue()))
+            ...
+        '''
+        return get_registers(frame, 'general purpose')
+
+    def get_FPRs(frame):
+        '''Returns the floating point registers of the frame as an SBValue.
+
+        The returned SBValue object is iterable.  An example:
+            ...
+            from lldbutil import get_FPRs
+            regs = get_FPRs(frame)
+            for reg in regs:
+                print('%s => %s' % (reg.GetName(), reg.GetValue()))
+            ...
+        '''
+        return get_registers(frame, 'floating point')
+
+    def get_ESRs(frame):
+        '''Returns the exception state registers of the frame as an SBValue.
+
+        The returned SBValue object is iterable.  An example:
+            ...
+            from lldbutil import get_ESRs
+            regs = get_ESRs(frame)
+            for reg in regs:
+                print('%s => %s' % (reg.GetName(), reg.GetValue()))
+            ...
+        '''
+        return get_registers(frame, 'exception state')
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBValueList, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBValueList, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBValueList self) -> SBValueList
+        __init__(lldb::SBValueList self, SBValueList rhs) -> SBValueList
+        """
+        this = _lldb.new_SBValueList(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBValueList
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBValueList self) -> bool"""
+        return _lldb.SBValueList_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBValueList___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def Clear(self):
+        """Clear(SBValueList self)"""
+        return _lldb.SBValueList_Clear(self)
+
+
+    def Append(self, *args):
+        """
+        Append(SBValueList self, SBValue val_obj)
+        Append(SBValueList self, SBValueList value_list)
+        """
+        return _lldb.SBValueList_Append(self, *args)
+
+
+    def GetSize(self):
+        """GetSize(SBValueList self) -> uint32_t"""
+        return _lldb.SBValueList_GetSize(self)
+
+
+    def GetValueAtIndex(self, idx):
+        """GetValueAtIndex(SBValueList self, uint32_t idx) -> SBValue"""
+        return _lldb.SBValueList_GetValueAtIndex(self, idx)
+
+
+    def FindValueObjectByUID(self, uid):
+        """FindValueObjectByUID(SBValueList self, lldb::user_id_t uid) -> SBValue"""
+        return _lldb.SBValueList_FindValueObjectByUID(self, uid)
+
+
+    def GetFirstValueByName(self, name):
+        """GetFirstValueByName(SBValueList self, char const * name) -> SBValue"""
+        return _lldb.SBValueList_GetFirstValueByName(self, name)
+
+
+    def __iter__(self):
+        '''Iterate over all values in a lldb.SBValueList object.'''
+        return lldb_iter(self, 'GetSize', 'GetValueAtIndex')
+
+    def __len__(self):
+        return int(self.GetSize())
+
+    def __getitem__(self, key):
+        count = len(self)
+    #------------------------------------------------------------
+    # Access with "int" to get Nth item in the list
+    #------------------------------------------------------------
+        if type(key) is int:
+            if key < count:
+                return self.GetValueAtIndex(key)
+    #------------------------------------------------------------
+    # Access with "str" to get values by name
+    #------------------------------------------------------------
+        elif type(key) is str:
+            matches = []
+            for idx in range(count):
+                value = self.GetValueAtIndex(idx)
+                if value.name == key:
+                    matches.append(value)
+            return matches
+    #------------------------------------------------------------
+    # Match with regex
+    #------------------------------------------------------------
+        elif isinstance(key, type(re.compile('.'))):
+            matches = []
+            for idx in range(count):
+                value = self.GetValueAtIndex(idx)
+                re_match = key.search(value.name)
+                if re_match:
+                    matches.append(value)
+            return matches
+
+
+
+    def __str__(self):
+        """__str__(SBValueList self) -> PyObject *"""
+        return _lldb.SBValueList___str__(self)
+
+SBValueList_swigregister = _lldb.SBValueList_swigregister
+SBValueList_swigregister(SBValueList)
+
+class SBVariablesOptions(_object):
+    """Proxy of C++ lldb::SBVariablesOptions class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBVariablesOptions, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBVariablesOptions, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBVariablesOptions self) -> SBVariablesOptions
+        __init__(lldb::SBVariablesOptions self, SBVariablesOptions options) -> SBVariablesOptions
+        """
+        this = _lldb.new_SBVariablesOptions(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBVariablesOptions
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBVariablesOptions self) -> bool"""
+        return _lldb.SBVariablesOptions_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBVariablesOptions___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetIncludeArguments(self):
+        """GetIncludeArguments(SBVariablesOptions self) -> bool"""
+        return _lldb.SBVariablesOptions_GetIncludeArguments(self)
+
+
+    def SetIncludeArguments(self, arg2):
+        """SetIncludeArguments(SBVariablesOptions self, bool arg2)"""
+        return _lldb.SBVariablesOptions_SetIncludeArguments(self, arg2)
+
+
+    def GetIncludeRecognizedArguments(self, arg2):
+        """GetIncludeRecognizedArguments(SBVariablesOptions self, SBTarget arg2) -> bool"""
+        return _lldb.SBVariablesOptions_GetIncludeRecognizedArguments(self, arg2)
+
+
+    def SetIncludeRecognizedArguments(self, arg2):
+        """SetIncludeRecognizedArguments(SBVariablesOptions self, bool arg2)"""
+        return _lldb.SBVariablesOptions_SetIncludeRecognizedArguments(self, arg2)
+
+
+    def GetIncludeLocals(self):
+        """GetIncludeLocals(SBVariablesOptions self) -> bool"""
+        return _lldb.SBVariablesOptions_GetIncludeLocals(self)
+
+
+    def SetIncludeLocals(self, arg2):
+        """SetIncludeLocals(SBVariablesOptions self, bool arg2)"""
+        return _lldb.SBVariablesOptions_SetIncludeLocals(self, arg2)
+
+
+    def GetIncludeStatics(self):
+        """GetIncludeStatics(SBVariablesOptions self) -> bool"""
+        return _lldb.SBVariablesOptions_GetIncludeStatics(self)
+
+
+    def SetIncludeStatics(self, arg2):
+        """SetIncludeStatics(SBVariablesOptions self, bool arg2)"""
+        return _lldb.SBVariablesOptions_SetIncludeStatics(self, arg2)
+
+
+    def GetInScopeOnly(self):
+        """GetInScopeOnly(SBVariablesOptions self) -> bool"""
+        return _lldb.SBVariablesOptions_GetInScopeOnly(self)
+
+
+    def SetInScopeOnly(self, arg2):
+        """SetInScopeOnly(SBVariablesOptions self, bool arg2)"""
+        return _lldb.SBVariablesOptions_SetInScopeOnly(self, arg2)
+
+
+    def GetIncludeRuntimeSupportValues(self):
+        """GetIncludeRuntimeSupportValues(SBVariablesOptions self) -> bool"""
+        return _lldb.SBVariablesOptions_GetIncludeRuntimeSupportValues(self)
+
+
+    def SetIncludeRuntimeSupportValues(self, arg2):
+        """SetIncludeRuntimeSupportValues(SBVariablesOptions self, bool arg2)"""
+        return _lldb.SBVariablesOptions_SetIncludeRuntimeSupportValues(self, arg2)
+
+
+    def GetUseDynamic(self):
+        """GetUseDynamic(SBVariablesOptions self) -> lldb::DynamicValueType"""
+        return _lldb.SBVariablesOptions_GetUseDynamic(self)
+
+
+    def SetUseDynamic(self, arg2):
+        """SetUseDynamic(SBVariablesOptions self, lldb::DynamicValueType arg2)"""
+        return _lldb.SBVariablesOptions_SetUseDynamic(self, arg2)
+
+SBVariablesOptions_swigregister = _lldb.SBVariablesOptions_swigregister
+SBVariablesOptions_swigregister(SBVariablesOptions)
+
+class SBWatchpoint(_object):
+    """
+    Represents an instance of watchpoint for a specific target program.
+
+    A watchpoint is determined by the address and the byte size that resulted in
+    this particular instantiation.  Each watchpoint has its settable options.
+
+    See also SBTarget.watchpoint_iter() for example usage of iterating through the
+    watchpoints of the target.
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBWatchpoint, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBWatchpoint, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBWatchpoint self) -> SBWatchpoint
+        __init__(lldb::SBWatchpoint self, SBWatchpoint rhs) -> SBWatchpoint
+        """
+        this = _lldb.new_SBWatchpoint(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBWatchpoint
+    __del__ = lambda self: None
+
+    def IsValid(self):
+        """IsValid(SBWatchpoint self) -> bool"""
+        return _lldb.SBWatchpoint_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBWatchpoint___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def __eq__(self, rhs):
+        """__eq__(SBWatchpoint self, SBWatchpoint rhs) -> bool"""
+        return _lldb.SBWatchpoint___eq__(self, rhs)
+
+
+    def __ne__(self, rhs):
+        """__ne__(SBWatchpoint self, SBWatchpoint rhs) -> bool"""
+        return _lldb.SBWatchpoint___ne__(self, rhs)
+
+
+    def GetError(self):
+        """GetError(SBWatchpoint self) -> SBError"""
+        return _lldb.SBWatchpoint_GetError(self)
+
+
+    def GetID(self):
+        """GetID(SBWatchpoint self) -> lldb::watch_id_t"""
+        return _lldb.SBWatchpoint_GetID(self)
+
+
+    def GetHardwareIndex(self):
+        """
+        GetHardwareIndex(SBWatchpoint self) -> int32_t
+
+
+        With -1 representing an invalid hardware index.
+        """
+        return _lldb.SBWatchpoint_GetHardwareIndex(self)
+
+
+    def GetWatchAddress(self):
+        """GetWatchAddress(SBWatchpoint self) -> lldb::addr_t"""
+        return _lldb.SBWatchpoint_GetWatchAddress(self)
+
+
+    def GetWatchSize(self):
+        """GetWatchSize(SBWatchpoint self) -> size_t"""
+        return _lldb.SBWatchpoint_GetWatchSize(self)
+
+
+    def SetEnabled(self, enabled):
+        """SetEnabled(SBWatchpoint self, bool enabled)"""
+        return _lldb.SBWatchpoint_SetEnabled(self, enabled)
+
+
+    def IsEnabled(self):
+        """IsEnabled(SBWatchpoint self) -> bool"""
+        return _lldb.SBWatchpoint_IsEnabled(self)
+
+
+    def GetHitCount(self):
+        """GetHitCount(SBWatchpoint self) -> uint32_t"""
+        return _lldb.SBWatchpoint_GetHitCount(self)
+
+
+    def GetIgnoreCount(self):
+        """GetIgnoreCount(SBWatchpoint self) -> uint32_t"""
+        return _lldb.SBWatchpoint_GetIgnoreCount(self)
+
+
+    def SetIgnoreCount(self, n):
+        """SetIgnoreCount(SBWatchpoint self, uint32_t n)"""
+        return _lldb.SBWatchpoint_SetIgnoreCount(self, n)
+
+
+    def GetCondition(self):
+        """
+        GetCondition(SBWatchpoint self) -> char const *
+
+
+        Get the condition expression for the watchpoint.
+        """
+        return _lldb.SBWatchpoint_GetCondition(self)
+
+
+    def SetCondition(self, condition):
+        """
+        SetCondition(SBWatchpoint self, char const * condition)
+
+
+        The watchpoint stops only if the condition expression evaluates to true.
+        """
+        return _lldb.SBWatchpoint_SetCondition(self, condition)
+
+
+    def GetDescription(self, description, level):
+        """GetDescription(SBWatchpoint self, SBStream description, lldb::DescriptionLevel level) -> bool"""
+        return _lldb.SBWatchpoint_GetDescription(self, description, level)
+
+
+    def EventIsWatchpointEvent(event):
+        """EventIsWatchpointEvent(SBEvent event) -> bool"""
+        return _lldb.SBWatchpoint_EventIsWatchpointEvent(event)
+
+    EventIsWatchpointEvent = staticmethod(EventIsWatchpointEvent)
+
+    def GetWatchpointEventTypeFromEvent(event):
+        """GetWatchpointEventTypeFromEvent(SBEvent event) -> lldb::WatchpointEventType"""
+        return _lldb.SBWatchpoint_GetWatchpointEventTypeFromEvent(event)
+
+    GetWatchpointEventTypeFromEvent = staticmethod(GetWatchpointEventTypeFromEvent)
+
+    def GetWatchpointFromEvent(event):
+        """GetWatchpointFromEvent(SBEvent event) -> SBWatchpoint"""
+        return _lldb.SBWatchpoint_GetWatchpointFromEvent(event)
+
+    GetWatchpointFromEvent = staticmethod(GetWatchpointFromEvent)
+
+    def __str__(self):
+        """__str__(SBWatchpoint self) -> PyObject *"""
+        return _lldb.SBWatchpoint___str__(self)
+
+SBWatchpoint_swigregister = _lldb.SBWatchpoint_swigregister
+SBWatchpoint_swigregister(SBWatchpoint)
+
+def SBWatchpoint_EventIsWatchpointEvent(event):
+    """SBWatchpoint_EventIsWatchpointEvent(SBEvent event) -> bool"""
+    return _lldb.SBWatchpoint_EventIsWatchpointEvent(event)
+
+def SBWatchpoint_GetWatchpointEventTypeFromEvent(event):
+    """SBWatchpoint_GetWatchpointEventTypeFromEvent(SBEvent event) -> lldb::WatchpointEventType"""
+    return _lldb.SBWatchpoint_GetWatchpointEventTypeFromEvent(event)
+
+def SBWatchpoint_GetWatchpointFromEvent(event):
+    """SBWatchpoint_GetWatchpointFromEvent(SBEvent event) -> SBWatchpoint"""
+    return _lldb.SBWatchpoint_GetWatchpointFromEvent(event)
+
+class SBUnixSignals(_object):
+    """Allows you to manipulate LLDB's signal disposition"""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SBUnixSignals, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SBUnixSignals, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(lldb::SBUnixSignals self) -> SBUnixSignals
+        __init__(lldb::SBUnixSignals self, SBUnixSignals rhs) -> SBUnixSignals
+        """
+        this = _lldb.new_SBUnixSignals(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _lldb.delete_SBUnixSignals
+    __del__ = lambda self: None
+
+    def Clear(self):
+        """Clear(SBUnixSignals self)"""
+        return _lldb.SBUnixSignals_Clear(self)
+
+
+    def IsValid(self):
+        """IsValid(SBUnixSignals self) -> bool"""
+        return _lldb.SBUnixSignals_IsValid(self)
+
+
+    def __nonzero__(self):
+        return _lldb.SBUnixSignals___nonzero__(self)
+    __bool__ = __nonzero__
+
+
+
+    def GetSignalAsCString(self, signo):
+        """GetSignalAsCString(SBUnixSignals self, int32_t signo) -> char const *"""
+        return _lldb.SBUnixSignals_GetSignalAsCString(self, signo)
+
+
+    def GetSignalNumberFromName(self, name):
+        """GetSignalNumberFromName(SBUnixSignals self, char const * name) -> int32_t"""
+        return _lldb.SBUnixSignals_GetSignalNumberFromName(self, name)
+
+
+    def GetShouldSuppress(self, signo):
+        """GetShouldSuppress(SBUnixSignals self, int32_t signo) -> bool"""
+        return _lldb.SBUnixSignals_GetShouldSuppress(self, signo)
+
+
+    def SetShouldSuppress(self, signo, value):
+        """SetShouldSuppress(SBUnixSignals self, int32_t signo, bool value) -> bool"""
+        return _lldb.SBUnixSignals_SetShouldSuppress(self, signo, value)
+
+
+    def GetShouldStop(self, signo):
+        """GetShouldStop(SBUnixSignals self, int32_t signo) -> bool"""
+        return _lldb.SBUnixSignals_GetShouldStop(self, signo)
+
+
+    def SetShouldStop(self, signo, value):
+        """SetShouldStop(SBUnixSignals self, int32_t signo, bool value) -> bool"""
+        return _lldb.SBUnixSignals_SetShouldStop(self, signo, value)
+
+
+    def GetShouldNotify(self, signo):
+        """GetShouldNotify(SBUnixSignals self, int32_t signo) -> bool"""
+        return _lldb.SBUnixSignals_GetShouldNotify(self, signo)
+
+
+    def SetShouldNotify(self, signo, value):
+        """SetShouldNotify(SBUnixSignals self, int32_t signo, bool value) -> bool"""
+        return _lldb.SBUnixSignals_SetShouldNotify(self, signo, value)
+
+
+    def GetNumSignals(self):
+        """GetNumSignals(SBUnixSignals self) -> int32_t"""
+        return _lldb.SBUnixSignals_GetNumSignals(self)
+
+
+    def GetSignalAtIndex(self, index):
+        """GetSignalAtIndex(SBUnixSignals self, int32_t index) -> int32_t"""
+        return _lldb.SBUnixSignals_GetSignalAtIndex(self, index)
+
+
+    def get_unix_signals_list(self):
+        signals = []
+        for idx in range(0, self.GetNumSignals()):
+            signals.append(self.GetSignalAtIndex(sig))
+        return signals
+
+    threads = property(get_unix_signals_list, None, doc='''A read only property that returns a list() of valid signal numbers for this platform.''')
+
+SBUnixSignals_swigregister = _lldb.SBUnixSignals_swigregister
+SBUnixSignals_swigregister(SBUnixSignals)
+
+
+
+def command(command_name=None, doc=None):
+    import lldb
+    """A decorator function that registers an LLDB command line
+        command that is bound to the function it is attached to."""
+    def callable(function):
+        """Registers an lldb command for the decorated function."""
+        command = "command script add -f %s.%s %s" % (function.__module__, function.__name__, command_name or function.__name__)
+        lldb.debugger.HandleCommand(command)
+        if doc:
+            function.__doc__ = doc
+        return function
+
+    return callable
+
+class declaration(object):
+    '''A class that represents a source declaration location with file, line and column.'''
+    def __init__(self, file, line, col):
+        self.file = file
+        self.line = line
+        self.col = col
+
+class value_iter(object):
+    def __iter__(self):
+        return self
+
+    def next(self):
+        if self.index >= self.length:
+            raise StopIteration()
+        child_sbvalue = self.sbvalue.GetChildAtIndex(self.index)
+        self.index += 1
+        return value(child_sbvalue)
+
+    def __init__(self,value):
+        self.index = 0
+        self.sbvalue = value
+        if type(self.sbvalue) is value:
+            self.sbvalue = self.sbvalue.sbvalue
+        self.length = self.sbvalue.GetNumChildren()
+
+class value(object):
+    '''A class designed to wrap lldb.SBValue() objects so the resulting object
+    can be used as a variable would be in code. So if you have a Point structure
+    variable in your code in the current frame named "pt", you can initialize an instance
+    of this class with it:
+
+    pt = lldb.value(lldb.frame.FindVariable("pt"))
+    print pt
+    print pt.x
+    print pt.y
+
+    pt = lldb.value(lldb.frame.FindVariable("rectangle_array"))
+    print rectangle_array[12]
+    print rectangle_array[5].origin.x'''
+    def __init__(self, sbvalue):
+        self.sbvalue = sbvalue
+
+    def __nonzero__(self):
+        return self.sbvalue.__nonzero__()
+
+    def __str__(self):
+        return self.sbvalue.__str__()
+
+    def __getitem__(self, key):
+# Allow array access if this value has children...
+        if type(key) is value:
+            key = int(key)
+        if type(key) is int:
+            child_sbvalue = (self.sbvalue.GetValueForExpressionPath("[%i]" % key))
+            if child_sbvalue and child_sbvalue.IsValid():
+                return value(child_sbvalue)
+            raise IndexError("Index '%d' is out of range" % key)
+        raise TypeError("No array item of type %s" % str(type(key)))
+
+    def __iter__(self):
+        return value_iter(self.sbvalue)
+
+    def __getattr__(self, name):
+        child_sbvalue = self.sbvalue.GetChildMemberWithName (name)
+        if child_sbvalue and child_sbvalue.IsValid():
+            return value(child_sbvalue)
+        raise AttributeError("Attribute '%s' is not defined" % name)
+
+    def __add__(self, other):
+        return int(self) + int(other)
+
+    def __sub__(self, other):
+        return int(self) - int(other)
+
+    def __mul__(self, other):
+        return int(self) * int(other)
+
+    def __floordiv__(self, other):
+        return int(self) // int(other)
+
+    def __mod__(self, other):
+        return int(self) % int(other)
+
+    def __divmod__(self, other):
+        return int(self) % int(other)
+
+    def __pow__(self, other):
+        return int(self) ** int(other)
+
+    def __lshift__(self, other):
+        return int(self) << int(other)
+
+    def __rshift__(self, other):
+        return int(self) >> int(other)
+
+    def __and__(self, other):
+        return int(self) & int(other)
+
+    def __xor__(self, other):
+        return int(self) ^ int(other)
+
+    def __or__(self, other):
+        return int(self) | int(other)
+
+    def __div__(self, other):
+        return int(self) / int(other)
+
+    def __truediv__(self, other):
+        return int(self) / int(other)
+
+    def __iadd__(self, other):
+        result = self.__add__(other)
+        self.sbvalue.SetValueFromCString (str(result))
+        return result
+
+    def __isub__(self, other):
+        result = self.__sub__(other)
+        self.sbvalue.SetValueFromCString (str(result))
+        return result
+
+    def __imul__(self, other):
+        result = self.__mul__(other)
+        self.sbvalue.SetValueFromCString (str(result))
+        return result
+
+    def __idiv__(self, other):
+        result = self.__div__(other)
+        self.sbvalue.SetValueFromCString (str(result))
+        return result
+
+    def __itruediv__(self, other):
+        result = self.__truediv__(other)
+        self.sbvalue.SetValueFromCString (str(result))
+        return result
+
+    def __ifloordiv__(self, other):
+        result =  self.__floordiv__(self, other)
+        self.sbvalue.SetValueFromCString (str(result))
+        return result
+
+    def __imod__(self, other):
+        result =  self.__and__(self, other)
+        self.sbvalue.SetValueFromCString (str(result))
+        return result
+
+    def __ipow__(self, other):
+        result = self.__pow__(self, other)
+        self.sbvalue.SetValueFromCString (str(result))
+        return result
+
+    def __ipow__(self, other, modulo):
+        result = self.__pow__(self, other, modulo)
+        self.sbvalue.SetValueFromCString (str(result))
+        return result
+
+    def __ilshift__(self, other):
+        result = self.__lshift__(other)
+        self.sbvalue.SetValueFromCString (str(result))
+        return result
+
+    def __irshift__(self, other):
+        result =  self.__rshift__(other)
+        self.sbvalue.SetValueFromCString (str(result))
+        return result
+
+    def __iand__(self, other):
+        result =  self.__and__(self, other)
+        self.sbvalue.SetValueFromCString (str(result))
+        return result
+
+    def __ixor__(self, other):
+        result =  self.__xor__(self, other)
+        self.sbvalue.SetValueFromCString (str(result))
+        return result
+
+    def __ior__(self, other):
+        result =  self.__ior__(self, other)
+        self.sbvalue.SetValueFromCString (str(result))
+        return result
+
+    def __neg__(self):
+        return -int(self)
+
+    def __pos__(self):
+        return +int(self)
+
+    def __abs__(self):
+        return abs(int(self))
+
+    def __invert__(self):
+        return ~int(self)
+
+    def __complex__(self):
+        return complex (int(self))
+
+    def __int__(self):
+        is_num,is_sign = is_numeric_type(self.sbvalue.GetType().GetCanonicalType().GetBasicType())
+        if is_num and not is_sign: return self.sbvalue.GetValueAsUnsigned()
+        return self.sbvalue.GetValueAsSigned()
+
+    def __long__(self):
+        return self.__int__()
+
+    def __float__(self):
+        return float (self.sbvalue.GetValueAsSigned())
+
+    def __oct__(self):
+        return '0%o' % self.sbvalue.GetValueAsUnsigned()
+
+    def __hex__(self):
+        return '0x%x' % self.sbvalue.GetValueAsUnsigned()
+
+    def __len__(self):
+        return self.sbvalue.GetNumChildren()
+
+    def __eq__(self, other):
+        if type(other) is int:
+                return int(self) == other
+        elif type(other) is str:
+                return str(self) == other
+        elif type(other) is value:
+                self_err = SBError()
+                other_err = SBError()
+                self_val = self.sbvalue.GetValueAsUnsigned(self_err)
+                if self_err.fail:
+                        raise ValueError("unable to extract value of self")
+                other_val = other.sbvalue.GetValueAsUnsigned(other_err)
+                if other_err.fail:
+                        raise ValueError("unable to extract value of other")
+                return self_val == other_val
+        raise TypeError("Unknown type %s, No equality operation defined." % str(type(other)))
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+
+
+class SBSyntheticValueProvider(object):
+    def __init__(self,valobj):
+        pass
+
+    def num_children(self):
+        return 0
+
+    def get_child_index(self,name):
+        return None
+
+    def get_child_at_index(self,idx):
+        return None
+
+    def update(self):
+        pass
+
+    def has_children(self):
+        return False
+
+
+
+
+
+# given an lldb.SBBasicType it returns a tuple
+# (is_numeric, is_signed)
+# the value of is_signed is undefined if is_numeric == false
+def is_numeric_type(basic_type):
+    if basic_type == eBasicTypeInvalid: return (False,False)
+    if basic_type == eBasicTypeVoid: return (False,False)
+    if basic_type == eBasicTypeChar: return (True,False)
+    if basic_type == eBasicTypeSignedChar: return (True,True)
+    if basic_type == eBasicTypeUnsignedChar: return (True,False)
+    if basic_type == eBasicTypeWChar: return (True,False)
+    if basic_type == eBasicTypeSignedWChar: return (True,True)
+    if basic_type == eBasicTypeUnsignedWChar: return (True,False)
+    if basic_type == eBasicTypeChar16: return (True,False)
+    if basic_type == eBasicTypeChar32: return (True,False)
+    if basic_type == eBasicTypeShort: return (True,True)
+    if basic_type == eBasicTypeUnsignedShort: return (True,False)
+    if basic_type == eBasicTypeInt: return (True,True)
+    if basic_type == eBasicTypeUnsignedInt: return (True,False)
+    if basic_type == eBasicTypeLong: return (True,True)
+    if basic_type == eBasicTypeUnsignedLong: return (True,False)
+    if basic_type == eBasicTypeLongLong: return (True,True)
+    if basic_type == eBasicTypeUnsignedLongLong: return (True,False)
+    if basic_type == eBasicTypeInt128: return (True,True)
+    if basic_type == eBasicTypeUnsignedInt128: return (True,False)
+    if basic_type == eBasicTypeBool: return (False,False)
+    if basic_type == eBasicTypeHalf: return (True,True)
+    if basic_type == eBasicTypeFloat: return (True,True)
+    if basic_type == eBasicTypeDouble: return (True,True)
+    if basic_type == eBasicTypeLongDouble: return (True,True)
+    if basic_type == eBasicTypeFloatComplex: return (True,True)
+    if basic_type == eBasicTypeDoubleComplex: return (True,True)
+    if basic_type == eBasicTypeLongDoubleComplex: return (True,True)
+    if basic_type == eBasicTypeObjCID: return (False,False)
+    if basic_type == eBasicTypeObjCClass: return (False,False)
+    if basic_type == eBasicTypeObjCSel: return (False,False)
+    if basic_type == eBasicTypeNullPtr: return (False,False)
+#if basic_type == eBasicTypeOther:
+    return (False,False)
+
+
+
+debugger_unique_id = 0
+SBDebugger.Initialize()
+debugger = None
+target = SBTarget()
+process = SBProcess()
+thread = SBThread()
+frame = SBFrame()
+
+# This file is compatible with both classic and new-style classes.
+
+
diff --git a/linux-x64/clang/lib/python2.7/site-packages/lldb/_lldb.so b/linux-x64/clang/lib/python2.7/site-packages/lldb/_lldb.so
new file mode 120000
index 0000000..cc0b9a4
--- /dev/null
+++ b/linux-x64/clang/lib/python2.7/site-packages/lldb/_lldb.so
@@ -0,0 +1 @@
+../../../../lib64/liblldb.so
\ No newline at end of file
diff --git a/linux-x64/clang/lib/python2.7/site-packages/lldb/embedded_interpreter.py b/linux-x64/clang/lib/python2.7/site-packages/lldb/embedded_interpreter.py
new file mode 100644
index 0000000..8a1195d
--- /dev/null
+++ b/linux-x64/clang/lib/python2.7/site-packages/lldb/embedded_interpreter.py
@@ -0,0 +1,134 @@
+﻿import sys
+if sys.version_info[0] < 3:
+    import __builtin__ as builtins
+else:
+    import builtins
+import code
+import lldb
+import traceback
+
+try:
+    import readline
+    import rlcompleter
+except ImportError:
+    have_readline = False
+except AttributeError:
+    # This exception gets hit by the rlcompleter when Linux is using
+    # the readline suppression import.
+    have_readline = False
+else:
+    have_readline = True
+    if 'libedit' in readline.__doc__:
+        readline.parse_and_bind('bind ^I rl_complete')
+    else:
+        readline.parse_and_bind('tab: complete')
+
+g_builtin_override_called = False
+
+
+class LLDBQuitter(object):
+
+    def __init__(self, name):
+        self.name = name
+
+    def __repr__(self):
+        self()
+
+    def __call__(self, code=None):
+        global g_builtin_override_called
+        g_builtin_override_called = True
+        raise SystemExit(-1)
+
+
+def setquit():
+    '''Redefine builtin functions 'quit()' and 'exit()' to print a message and raise an EOFError exception.'''
+    # This function will be called prior to each interactive
+    # interpreter loop or each single line, so we set the global
+    # g_builtin_override_called to False so we know if a SystemExit
+    # is thrown, we can catch it and tell the difference between
+    # a call to "quit()" or "exit()" and something like
+    # "sys.exit(123)"
+    global g_builtin_override_called
+    g_builtin_override_called = False
+    builtins.quit = LLDBQuitter('quit')
+    builtins.exit = LLDBQuitter('exit')
+
+# When running one line, we might place the string to run in this string
+# in case it would be hard to correctly escape a string's contents
+
+g_run_one_line_str = None
+
+
+def get_terminal_size(fd):
+    try:
+        import fcntl
+        import termios
+        import struct
+        hw = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234'))
+    except:
+        hw = (0, 0)
+    return hw
+
+
+def readfunc_stdio(prompt):
+    sys.stdout.write(prompt)
+    sys.stdout.flush()
+    return sys.stdin.readline().rstrip()
+
+
+def run_python_interpreter(local_dict):
+    # Pass in the dictionary, for continuity from one session to the next.
+    setquit()
+    try:
+        fd = sys.stdin.fileno()
+        interacted = False
+        if get_terminal_size(fd)[1] == 0:
+            try:
+                import termios
+                old = termios.tcgetattr(fd)
+                if old[3] & termios.ECHO:
+                    # Need to turn off echoing and restore
+                    new = termios.tcgetattr(fd)
+                    new[3] = new[3] & ~termios.ECHO
+                    try:
+                        termios.tcsetattr(fd, termios.TCSADRAIN, new)
+                        interacted = True
+                        code.interact(
+                            banner="Python Interactive Interpreter. To exit, type 'quit()', 'exit()'.",
+                            readfunc=readfunc_stdio,
+                            local=local_dict)
+                    finally:
+                        termios.tcsetattr(fd, termios.TCSADRAIN, old)
+            except:
+                pass
+            # Don't need to turn off echoing
+            if not interacted:
+                code.interact(
+                    banner="Python Interactive Interpreter. To exit, type 'quit()', 'exit()' or Ctrl-D.",
+                    readfunc=readfunc_stdio,
+                    local=local_dict)
+        else:
+            # We have a real interactive terminal
+            code.interact(
+                banner="Python Interactive Interpreter. To exit, type 'quit()', 'exit()' or Ctrl-D.",
+                local=local_dict)
+    except SystemExit as e:
+        global g_builtin_override_called
+        if not g_builtin_override_called:
+            print('Script exited with %s' % (e))
+
+
+def run_one_line(local_dict, input_string):
+    global g_run_one_line_str
+    setquit()
+    try:
+        repl = code.InteractiveConsole(local_dict)
+        if input_string:
+            repl.runsource(input_string)
+        elif g_run_one_line_str:
+            repl.runsource(g_run_one_line_str)
+
+    except SystemExit as e:
+        global g_builtin_override_called
+        if not g_builtin_override_called:
+            print('Script exited with %s' % (e))
diff --git a/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/Logger.py b/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/Logger.py
new file mode 100644
index 0000000..e518b75
--- /dev/null
+++ b/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/Logger.py
@@ -0,0 +1,133 @@
+from __future__ import print_function
+import sys
+import os.path
+import inspect
+
+
+class NopLogger:
+
+    def __init__(self):
+        pass
+
+    def write(self, data):
+        pass
+
+    def flush(self):
+        pass
+
+    def close(self):
+        pass
+
+
+class StdoutLogger:
+
+    def __init__(self):
+        pass
+
+    def write(self, data):
+        print(data)
+
+    def flush(self):
+        pass
+
+    def close(self):
+        pass
+
+
+class FileLogger:
+
+    def __init__(self, name):
+        self.file = None
+        try:
+            name = os.path.abspath(name)
+            self.file = open(name, 'a')
+        except:
+            try:
+                self.file = open('formatters.log', 'a')
+            except:
+                pass
+
+    def write(self, data):
+        if self.file is not None:
+            print(data, file=self.file)
+        else:
+            print(data)
+
+    def flush(self):
+        if self.file is not None:
+            self.file.flush()
+
+    def close(self):
+        if self.file is not None:
+            self.file.close()
+            self.file = None
+
+# to enable logging:
+# define lldb.formatters.Logger._lldb_formatters_debug_level to any number greater than 0
+# if you define it to any value greater than 1, the log will be automatically flushed after each write (slower but should make sure most of the stuff makes it to the log even if we crash)
+# if you define it to any value greater than 2, the calling function's details will automatically be logged (even slower, but provides additional details)
+# if you need the log to go to a file instead of on screen, define
+# lldb.formatters.Logger._lldb_formatters_debug_filename to a valid
+# filename
+
+
+class Logger:
+
+    def __init__(self, autoflush=False, logcaller=False):
+        global _lldb_formatters_debug_level
+        global _lldb_formatters_debug_filename
+        self.autoflush = autoflush
+        want_log = False
+        try:
+            want_log = (_lldb_formatters_debug_level > 0)
+        except:
+            pass
+        if not (want_log):
+            self.impl = NopLogger()
+            return
+        want_file = False
+        try:
+            want_file = (_lldb_formatters_debug_filename is not None and _lldb_formatters_debug_filename !=
+                         '' and _lldb_formatters_debug_filename != 0)
+        except:
+            pass
+        if want_file:
+            self.impl = FileLogger(_lldb_formatters_debug_filename)
+        else:
+            self.impl = StdoutLogger()
+        try:
+            self.autoflush = (_lldb_formatters_debug_level > 1)
+        except:
+            self.autoflush = autoflush
+        want_caller_info = False
+        try:
+            want_caller_info = (_lldb_formatters_debug_level > 2)
+        except:
+            pass
+        if want_caller_info:
+            self._log_caller()
+
+    def _log_caller(self):
+        caller = inspect.stack()[2]
+        try:
+            if caller is not None and len(caller) > 3:
+                self.write('Logging from function ' + str(caller))
+            else:
+                self.write(
+                    'Caller info not available - Required caller logging not possible')
+        finally:
+            del caller  # needed per Python docs to avoid keeping objects alive longer than we care
+
+    def write(self, data):
+        self.impl.write(data)
+        if self.autoflush:
+            self.flush()
+
+    def __rshift__(self, data):
+        self.write(data)
+
+    def flush(self):
+        self.impl.flush()
+
+    def close(self):
+        self.impl.close()
diff --git a/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/__init__.py b/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/__init__.py
new file mode 100644
index 0000000..7aeb5df
--- /dev/null
+++ b/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/__init__.py
@@ -0,0 +1,3 @@
+__all__ = ["cache","synth","metrics","attrib_fromdict","Logger"]
+for x in __all__:
+	__import__('lldb.formatters.' + x)
\ No newline at end of file
diff --git a/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/attrib_fromdict.py b/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/attrib_fromdict.py
new file mode 100644
index 0000000..3b45973
--- /dev/null
+++ b/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/attrib_fromdict.py
@@ -0,0 +1,42 @@
+"""
+Objective-C runtime wrapper for use by LLDB Python formatters
+
+Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+See https://llvm.org/LICENSE.txt for license information.
+SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+"""
+
+
+class AttributesDictionary:
+
+    def __init__(self, allow_reset=True):
+        # need to do it this way to prevent endless recursion
+        self.__dict__['_dictionary'] = {}
+        self.__dict__['_allow_reset'] = allow_reset
+
+    def __getattr__(self, name):
+        if not self._check_exists(name):
+            return None
+        value = self._dictionary[name]
+        return value
+
+    def _set_impl(self, name, value):
+        self._dictionary[name] = value
+
+    def _check_exists(self, name):
+        return name in self._dictionary
+
+    def __setattr__(self, name, value):
+        if self._allow_reset:
+            self._set_impl(name, value)
+        else:
+            self.set_if_necessary(name, value)
+
+    def set_if_necessary(self, name, value):
+        if not self._check_exists(name):
+            self._set_impl(name, value)
+            return True
+        return False
+
+    def __len__(self):
+        return len(self._dictionary)
diff --git a/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/cache.py b/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/cache.py
new file mode 100644
index 0000000..13db3ad
--- /dev/null
+++ b/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/cache.py
@@ -0,0 +1,36 @@
+"""
+Objective-C runtime wrapper for use by LLDB Python formatters
+
+Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+See https://llvm.org/LICENSE.txt for license information.
+SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+"""
+import lldb.formatters.metrics
+
+
+class Cache:
+
+    def __init__(self):
+        self.data = {}
+        self.statistics = lldb.formatters.metrics.Metrics()
+        self.statistics.add_metric('hit')
+        self.statistics.add_metric('miss')
+
+    def look_for_key(self, key):
+        if key in self.data:
+            return True
+        return False
+
+    def add_item(self, key, value, ok_to_replace=True):
+        if not(ok_to_replace) and self.look_for_key(key):
+            return False
+        self.data[key] = value
+        return True
+
+    def get_value(self, key, default=None):
+        if self.look_for_key(key):
+            self.statistics.metric_hit('hit', key)
+            return self.data[key]
+        else:
+            self.statistics.metric_hit('miss', key)
+            return default
diff --git a/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/cpp/__init__.py b/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/cpp/__init__.py
new file mode 100644
index 0000000..84d7430
--- /dev/null
+++ b/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/cpp/__init__.py
@@ -0,0 +1,3 @@
+__all__ = ["gnu_libstdcpp","libcxx"]
+for x in __all__:
+	__import__('lldb.formatters.cpp.' + x)
\ No newline at end of file
diff --git a/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/cpp/gnu_libstdcpp.py b/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/cpp/gnu_libstdcpp.py
new file mode 100644
index 0000000..35f009e
--- /dev/null
+++ b/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/cpp/gnu_libstdcpp.py
@@ -0,0 +1,481 @@
+from __future__ import division
+import re
+import lldb.formatters.Logger
+
+# C++ STL formatters for LLDB
+# These formatters are based upon the version of the GNU libstdc++
+# as it ships with Mac OS X 10.6.8 thru 10.8.0
+# You are encouraged to look at the STL implementation for your platform
+# before relying on these formatters to do the right thing for your setup
+
+
+class StdListSynthProvider:
+
+    def __init__(self, valobj, dict):
+        logger = lldb.formatters.Logger.Logger()
+        self.valobj = valobj
+        self.count = None
+        logger >> "Providing synthetic children for a list named " + \
+            str(valobj.GetName())
+
+    def next_node(self, node):
+        logger = lldb.formatters.Logger.Logger()
+        return node.GetChildMemberWithName('_M_next')
+
+    def is_valid(self, node):
+        logger = lldb.formatters.Logger.Logger()
+        valid = self.value(self.next_node(node)) != self.node_address
+        if valid:
+            logger >> "%s is valid" % str(self.valobj.GetName())
+        else:
+            logger >> "synthetic value is not valid"
+        return valid
+
+    def value(self, node):
+        logger = lldb.formatters.Logger.Logger()
+        value = node.GetValueAsUnsigned()
+        logger >> "synthetic value for {}: {}".format(
+            str(self.valobj.GetName()), value)
+        return value
+
+    # Floyd's cycle-finding algorithm
+    # try to detect if this list has a loop
+    def has_loop(self):
+        global _list_uses_loop_detector
+        logger = lldb.formatters.Logger.Logger()
+        if not _list_uses_loop_detector:
+            logger >> "Asked not to use loop detection"
+            return False
+        slow = self.next
+        fast1 = self.next
+        fast2 = self.next
+        while self.is_valid(slow):
+            slow_value = self.value(slow)
+            fast1 = self.next_node(fast2)
+            fast2 = self.next_node(fast1)
+            if self.value(fast1) == slow_value or self.value(
+                    fast2) == slow_value:
+                return True
+            slow = self.next_node(slow)
+        return False
+
+    def num_children(self):
+        logger = lldb.formatters.Logger.Logger()
+        if self.count is None:
+            # libstdc++ 6.0.21 added dedicated count field.
+            count_child = self.node.GetChildMemberWithName('_M_data')
+            if count_child and count_child.IsValid():
+                self.count = count_child.GetValueAsUnsigned(0)
+            if self.count is None:
+                self.count = self.num_children_impl()
+        return self.count
+
+    def num_children_impl(self):
+        logger = lldb.formatters.Logger.Logger()
+        try:
+            next_val = self.next.GetValueAsUnsigned(0)
+            prev_val = self.prev.GetValueAsUnsigned(0)
+            # After a std::list has been initialized, both next and prev will
+            # be non-NULL
+            if next_val == 0 or prev_val == 0:
+                return 0
+            if next_val == self.node_address:
+                return 0
+            if next_val == prev_val:
+                return 1
+            if self.has_loop():
+                return 0
+            size = 2
+            current = self.next
+            while current.GetChildMemberWithName(
+                    '_M_next').GetValueAsUnsigned(0) != self.node_address:
+                size = size + 1
+                current = current.GetChildMemberWithName('_M_next')
+            return (size - 1)
+        except:
+            return 0
+
+    def get_child_index(self, name):
+        logger = lldb.formatters.Logger.Logger()
+        try:
+            return int(name.lstrip('[').rstrip(']'))
+        except:
+            return -1
+
+    def get_child_at_index(self, index):
+        logger = lldb.formatters.Logger.Logger()
+        logger >> "Fetching child " + str(index)
+        if index < 0:
+            return None
+        if index >= self.num_children():
+            return None
+        try:
+            offset = index
+            current = self.next
+            while offset > 0:
+                current = current.GetChildMemberWithName('_M_next')
+                offset = offset - 1
+            return current.CreateChildAtOffset(
+                '[' + str(index) + ']',
+                2 * current.GetType().GetByteSize(),
+                self.data_type)
+        except:
+            return None
+
+    def extract_type(self):
+        logger = lldb.formatters.Logger.Logger()
+        list_type = self.valobj.GetType().GetUnqualifiedType()
+        if list_type.IsReferenceType():
+            list_type = list_type.GetDereferencedType()
+        if list_type.GetNumberOfTemplateArguments() > 0:
+            data_type = list_type.GetTemplateArgumentType(0)
+        else:
+            data_type = None
+        return data_type
+
+    def update(self):
+        logger = lldb.formatters.Logger.Logger()
+        # preemptively setting this to None - we might end up changing our mind
+        # later
+        self.count = None
+        try:
+            impl = self.valobj.GetChildMemberWithName('_M_impl')
+            self.node = impl.GetChildMemberWithName('_M_node')
+            self.node_address = self.valobj.AddressOf().GetValueAsUnsigned(0)
+            self.next = self.node.GetChildMemberWithName('_M_next')
+            self.prev = self.node.GetChildMemberWithName('_M_prev')
+            self.data_type = self.extract_type()
+            self.data_size = self.data_type.GetByteSize()
+        except:
+            pass
+
+    def has_children(self):
+        return True
+
+
+class StdVectorSynthProvider:
+
+    class StdVectorImplementation(object):
+
+        def __init__(self, valobj):
+            self.valobj = valobj
+            self.count = None
+
+        def num_children(self):
+            if self.count is None:
+                self.count = self.num_children_impl()
+            return self.count
+
+        def num_children_impl(self):
+            try:
+                start_val = self.start.GetValueAsUnsigned(0)
+                finish_val = self.finish.GetValueAsUnsigned(0)
+                end_val = self.end.GetValueAsUnsigned(0)
+                # Before a vector has been constructed, it will contain bad values
+                # so we really need to be careful about the length we return since
+                # uninitialized data can cause us to return a huge number. We need
+                # to also check for any of the start, finish or end of storage values
+                # being zero (NULL). If any are, then this vector has not been
+                # initialized yet and we should return zero
+
+                # Make sure nothing is NULL
+                if start_val == 0 or finish_val == 0 or end_val == 0:
+                    return 0
+                # Make sure start is less than finish
+                if start_val >= finish_val:
+                    return 0
+                # Make sure finish is less than or equal to end of storage
+                if finish_val > end_val:
+                    return 0
+
+                # if we have a struct (or other data type that the compiler pads to native word size)
+                # this check might fail, unless the sizeof() we get is itself incremented to take the
+                # padding bytes into account - on current clang it looks like
+                # this is the case
+                num_children = (finish_val - start_val)
+                if (num_children % self.data_size) != 0:
+                    return 0
+                else:
+                    num_children = num_children // self.data_size
+                return num_children
+            except:
+                return 0
+
+        def get_child_at_index(self, index):
+            logger = lldb.formatters.Logger.Logger()
+            logger >> "Retrieving child " + str(index)
+            if index < 0:
+                return None
+            if index >= self.num_children():
+                return None
+            try:
+                offset = index * self.data_size
+                return self.start.CreateChildAtOffset(
+                    '[' + str(index) + ']', offset, self.data_type)
+            except:
+                return None
+
+        def update(self):
+            # preemptively setting this to None - we might end up changing our
+            # mind later
+            self.count = None
+            try:
+                impl = self.valobj.GetChildMemberWithName('_M_impl')
+                self.start = impl.GetChildMemberWithName('_M_start')
+                self.finish = impl.GetChildMemberWithName('_M_finish')
+                self.end = impl.GetChildMemberWithName('_M_end_of_storage')
+                self.data_type = self.start.GetType().GetPointeeType()
+                self.data_size = self.data_type.GetByteSize()
+                # if any of these objects is invalid, it means there is no
+                # point in trying to fetch anything
+                if self.start.IsValid() and self.finish.IsValid(
+                ) and self.end.IsValid() and self.data_type.IsValid():
+                    self.count = None
+                else:
+                    self.count = 0
+            except:
+                pass
+            return True
+
+    class StdVBoolImplementation(object):
+
+        def __init__(self, valobj, bool_type):
+            self.valobj = valobj
+            self.bool_type = bool_type
+            self.valid = False
+
+        def num_children(self):
+            if self.valid:
+                start = self.start_p.GetValueAsUnsigned(0)
+                finish = self.finish_p.GetValueAsUnsigned(0)
+                offset = self.offset.GetValueAsUnsigned(0)
+                if finish >= start:
+                    return (finish - start) * 8 + offset
+            return 0
+
+        def get_child_at_index(self, index):
+            if index >= self.num_children():
+                return None
+            element_type = self.start_p.GetType().GetPointeeType()
+            element_bits = 8 * element_type.GetByteSize()
+            element_offset = (index // element_bits) * \
+                element_type.GetByteSize()
+            bit_offset = index % element_bits
+            element = self.start_p.CreateChildAtOffset(
+                '[' + str(index) + ']', element_offset, element_type)
+            bit = element.GetValueAsUnsigned(0) & (1 << bit_offset)
+            if bit != 0:
+                value_expr = "(bool)true"
+            else:
+                value_expr = "(bool)false"
+            return self.valobj.CreateValueFromExpression(
+                "[%d]" % index, value_expr)
+
+        def update(self):
+            try:
+                m_impl = self.valobj.GetChildMemberWithName('_M_impl')
+                self.m_start = m_impl.GetChildMemberWithName('_M_start')
+                self.m_finish = m_impl.GetChildMemberWithName('_M_finish')
+                self.start_p = self.m_start.GetChildMemberWithName('_M_p')
+                self.finish_p = self.m_finish.GetChildMemberWithName('_M_p')
+                self.offset = self.m_finish.GetChildMemberWithName('_M_offset')
+                self.valid = True
+            except:
+                self.valid = False
+            return True
+
+    def __init__(self, valobj, dict):
+        logger = lldb.formatters.Logger.Logger()
+        first_template_arg_type = valobj.GetType().GetTemplateArgumentType(0)
+        if str(first_template_arg_type.GetName()) == "bool":
+            self.impl = self.StdVBoolImplementation(
+                valobj, first_template_arg_type)
+        else:
+            self.impl = self.StdVectorImplementation(valobj)
+        logger >> "Providing synthetic children for a vector named " + \
+            str(valobj.GetName())
+
+    def num_children(self):
+        return self.impl.num_children()
+
+    def get_child_index(self, name):
+        try:
+            return int(name.lstrip('[').rstrip(']'))
+        except:
+            return -1
+
+    def get_child_at_index(self, index):
+        return self.impl.get_child_at_index(index)
+
+    def update(self):
+        return self.impl.update()
+
+    def has_children(self):
+        return True
+
+
+class StdMapSynthProvider:
+
+    def __init__(self, valobj, dict):
+        logger = lldb.formatters.Logger.Logger()
+        self.valobj = valobj
+        self.count = None
+        logger >> "Providing synthetic children for a map named " + \
+            str(valobj.GetName())
+
+    # we need this function as a temporary workaround for rdar://problem/10801549
+    # which prevents us from extracting the std::pair<K,V> SBType out of the template
+    # arguments for _Rep_Type _M_t in the map itself - because we have to make up the
+    # typename and then find it, we may hit the situation were std::string has multiple
+    # names but only one is actually referenced in the debug information. hence, we need
+    # to replace the longer versions of std::string with the shorter one in order to be able
+    # to find the type name
+    def fixup_class_name(self, class_name):
+        logger = lldb.formatters.Logger.Logger()
+        if class_name == 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >':
+            return 'std::basic_string<char>', True
+        if class_name == 'basic_string<char, std::char_traits<char>, std::allocator<char> >':
+            return 'std::basic_string<char>', True
+        if class_name == 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >':
+            return 'std::basic_string<char>', True
+        if class_name == 'basic_string<char, std::char_traits<char>, std::allocator<char> >':
+            return 'std::basic_string<char>', True
+        return class_name, False
+
+    def update(self):
+        logger = lldb.formatters.Logger.Logger()
+        # preemptively setting this to None - we might end up changing our mind
+        # later
+        self.count = None
+        try:
+            # we will set this to True if we find out that discovering a node in the map takes more steps than the overall size of the RB tree
+            # if this gets set to True, then we will merrily return None for
+            # any child from that moment on
+            self.garbage = False
+            self.Mt = self.valobj.GetChildMemberWithName('_M_t')
+            self.Mimpl = self.Mt.GetChildMemberWithName('_M_impl')
+            self.Mheader = self.Mimpl.GetChildMemberWithName('_M_header')
+
+            map_type = self.valobj.GetType()
+            if map_type.IsReferenceType():
+                logger >> "Dereferencing type"
+                map_type = map_type.GetDereferencedType()
+
+            # Get the type of std::pair<key, value>. It is the first template
+            # argument type of the 4th template argument to std::map.
+            allocator_type = map_type.GetTemplateArgumentType(3)
+            self.data_type = allocator_type.GetTemplateArgumentType(0)
+            if not self.data_type:
+                # GCC does not emit DW_TAG_template_type_parameter for
+                # std::allocator<...>. For such a case, get the type of
+                # std::pair from a member of std::map.
+                rep_type = self.valobj.GetChildMemberWithName('_M_t').GetType()
+                self.data_type = rep_type.GetTypedefedType().GetTemplateArgumentType(1)
+
+            # from libstdc++ implementation of _M_root for rbtree
+            self.Mroot = self.Mheader.GetChildMemberWithName('_M_parent')
+            self.data_size = self.data_type.GetByteSize()
+            self.skip_size = self.Mheader.GetType().GetByteSize()
+        except:
+            pass
+
+    def num_children(self):
+        logger = lldb.formatters.Logger.Logger()
+        if self.count is None:
+            self.count = self.num_children_impl()
+        return self.count
+
+    def num_children_impl(self):
+        logger = lldb.formatters.Logger.Logger()
+        try:
+            root_ptr_val = self.node_ptr_value(self.Mroot)
+            if root_ptr_val == 0:
+                return 0
+            count = self.Mimpl.GetChildMemberWithName(
+                '_M_node_count').GetValueAsUnsigned(0)
+            logger >> "I have " + str(count) + " children available"
+            return count
+        except:
+            return 0
+
+    def get_child_index(self, name):
+        logger = lldb.formatters.Logger.Logger()
+        try:
+            return int(name.lstrip('[').rstrip(']'))
+        except:
+            return -1
+
+    def get_child_at_index(self, index):
+        logger = lldb.formatters.Logger.Logger()
+        logger >> "Being asked to fetch child[" + str(index) + "]"
+        if index < 0:
+            return None
+        if index >= self.num_children():
+            return None
+        if self.garbage:
+            logger >> "Returning None since we are a garbage tree"
+            return None
+        try:
+            offset = index
+            current = self.left(self.Mheader)
+            while offset > 0:
+                current = self.increment_node(current)
+                offset = offset - 1
+            # skip all the base stuff and get at the data
+            return current.CreateChildAtOffset(
+                '[' + str(index) + ']', self.skip_size, self.data_type)
+        except:
+            return None
+
+    # utility functions
+    def node_ptr_value(self, node):
+        logger = lldb.formatters.Logger.Logger()
+        return node.GetValueAsUnsigned(0)
+
+    def right(self, node):
+        logger = lldb.formatters.Logger.Logger()
+        return node.GetChildMemberWithName("_M_right")
+
+    def left(self, node):
+        logger = lldb.formatters.Logger.Logger()
+        return node.GetChildMemberWithName("_M_left")
+
+    def parent(self, node):
+        logger = lldb.formatters.Logger.Logger()
+        return node.GetChildMemberWithName("_M_parent")
+
+    # from libstdc++ implementation of iterator for rbtree
+    def increment_node(self, node):
+        logger = lldb.formatters.Logger.Logger()
+        max_steps = self.num_children()
+        if self.node_ptr_value(self.right(node)) != 0:
+            x = self.right(node)
+            max_steps -= 1
+            while self.node_ptr_value(self.left(x)) != 0:
+                x = self.left(x)
+                max_steps -= 1
+                logger >> str(max_steps) + " more to go before giving up"
+                if max_steps <= 0:
+                    self.garbage = True
+                    return None
+            return x
+        else:
+            x = node
+            y = self.parent(x)
+            max_steps -= 1
+            while(self.node_ptr_value(x) == self.node_ptr_value(self.right(y))):
+                x = y
+                y = self.parent(y)
+                max_steps -= 1
+                logger >> str(max_steps) + " more to go before giving up"
+                if max_steps <= 0:
+                    self.garbage = True
+                    return None
+            if self.node_ptr_value(self.right(x)) != self.node_ptr_value(y):
+                x = y
+            return x
+
+    def has_children(self):
+        return True
+
+_list_uses_loop_detector = True
diff --git a/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/cpp/libcxx.py b/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/cpp/libcxx.py
new file mode 100644
index 0000000..9759372
--- /dev/null
+++ b/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/cpp/libcxx.py
@@ -0,0 +1,876 @@
+import lldb
+import lldb.formatters.Logger
+
+# libcxx STL formatters for LLDB
+# These formatters are based upon the implementation of libc++ that
+# ships with current releases of OS X - They will not work for other implementations
+# of the standard C++ library - and they are bound to use the
+# libc++-specific namespace
+
+# the std::string summary is just an example for your convenience
+# the actual summary that LLDB uses is C++ code inside the debugger's own core
+
+# this could probably be made more efficient but since it only reads a handful of bytes at a time
+# we probably don't need to worry too much about this for the time being
+
+
+def make_string(F, L):
+    strval = ''
+    G = F.GetData().uint8
+    for X in range(L):
+        V = G[X]
+        if V == 0:
+            break
+        strval = strval + chr(V % 256)
+    return '"' + strval + '"'
+
+# if we ever care about big-endian, these two functions might need to change
+
+
+def is_short_string(value):
+    return True if (value & 1) == 0 else False
+
+
+def extract_short_size(value):
+    return ((value >> 1) % 256)
+
+# some of the members of libc++ std::string are anonymous or have internal names that convey
+# no external significance - we access them by index since this saves a name lookup that would add
+# no information for readers of the code, but when possible try to use
+# meaningful variable names
+
+
+def stdstring_SummaryProvider(valobj, dict):
+    logger = lldb.formatters.Logger.Logger()
+    r = valobj.GetChildAtIndex(0)
+    B = r.GetChildAtIndex(0)
+    first = B.GetChildAtIndex(0)
+    D = first.GetChildAtIndex(0)
+    l = D.GetChildAtIndex(0)
+    s = D.GetChildAtIndex(1)
+    D20 = s.GetChildAtIndex(0)
+    size_mode = D20.GetChildAtIndex(0).GetValueAsUnsigned(0)
+    if is_short_string(size_mode):
+        size = extract_short_size(size_mode)
+        return make_string(s.GetChildAtIndex(1), size)
+    else:
+        data_ptr = l.GetChildAtIndex(2)
+        size_vo = l.GetChildAtIndex(1)
+        # the NULL terminator must be accounted for
+        size = size_vo.GetValueAsUnsigned(0) + 1
+        if size <= 1 or size is None:  # should never be the case
+            return '""'
+        try:
+            data = data_ptr.GetPointeeData(0, size)
+        except:
+            return '""'
+        error = lldb.SBError()
+        strval = data.GetString(error, 0)
+        if error.Fail():
+            return '<error:' + error.GetCString() + '>'
+        else:
+            return '"' + strval + '"'
+
+
+class stdvector_SynthProvider:
+
+    def __init__(self, valobj, dict):
+        logger = lldb.formatters.Logger.Logger()
+        self.valobj = valobj
+
+    def num_children(self):
+        logger = lldb.formatters.Logger.Logger()
+        try:
+            start_val = self.start.GetValueAsUnsigned(0)
+            finish_val = self.finish.GetValueAsUnsigned(0)
+            # Before a vector has been constructed, it will contain bad values
+            # so we really need to be careful about the length we return since
+            # uninitialized data can cause us to return a huge number. We need
+            # to also check for any of the start, finish or end of storage values
+            # being zero (NULL). If any are, then this vector has not been
+            # initialized yet and we should return zero
+
+            # Make sure nothing is NULL
+            if start_val == 0 or finish_val == 0:
+                return 0
+            # Make sure start is less than finish
+            if start_val >= finish_val:
+                return 0
+
+            num_children = (finish_val - start_val)
+            if (num_children % self.data_size) != 0:
+                return 0
+            else:
+                num_children = num_children / self.data_size
+            return num_children
+        except:
+            return 0
+
+    def get_child_index(self, name):
+        logger = lldb.formatters.Logger.Logger()
+        try:
+            return int(name.lstrip('[').rstrip(']'))
+        except:
+            return -1
+
+    def get_child_at_index(self, index):
+        logger = lldb.formatters.Logger.Logger()
+        logger >> "Retrieving child " + str(index)
+        if index < 0:
+            return None
+        if index >= self.num_children():
+            return None
+        try:
+            offset = index * self.data_size
+            return self.start.CreateChildAtOffset(
+                '[' + str(index) + ']', offset, self.data_type)
+        except:
+            return None
+
+    def update(self):
+        logger = lldb.formatters.Logger.Logger()
+        try:
+            self.start = self.valobj.GetChildMemberWithName('__begin_')
+            self.finish = self.valobj.GetChildMemberWithName('__end_')
+            # the purpose of this field is unclear, but it is the only field whose type is clearly T* for a vector<T>
+            # if this ends up not being correct, we can use the APIs to get at
+            # template arguments
+            data_type_finder = self.valobj.GetChildMemberWithName(
+                '__end_cap_').GetChildMemberWithName('__first_')
+            self.data_type = data_type_finder.GetType().GetPointeeType()
+            self.data_size = self.data_type.GetByteSize()
+        except:
+            pass
+
+    def has_children(self):
+        return True
+
+# Just an example: the actual summary is produced by a summary string:
+# size=${svar%#}
+
+
+def stdvector_SummaryProvider(valobj, dict):
+    prov = stdvector_SynthProvider(valobj, None)
+    return 'size=' + str(prov.num_children())
+
+
+class stdlist_entry:
+
+    def __init__(self, entry):
+        logger = lldb.formatters.Logger.Logger()
+        self.entry = entry
+
+    def _next_impl(self):
+        logger = lldb.formatters.Logger.Logger()
+        return stdlist_entry(self.entry.GetChildMemberWithName('__next_'))
+
+    def _prev_impl(self):
+        logger = lldb.formatters.Logger.Logger()
+        return stdlist_entry(self.entry.GetChildMemberWithName('__prev_'))
+
+    def _value_impl(self):
+        logger = lldb.formatters.Logger.Logger()
+        return self.entry.GetValueAsUnsigned(0)
+
+    def _isnull_impl(self):
+        logger = lldb.formatters.Logger.Logger()
+        return self._value_impl() == 0
+
+    def _sbvalue_impl(self):
+        logger = lldb.formatters.Logger.Logger()
+        return self.entry
+
+    next = property(_next_impl, None)
+    value = property(_value_impl, None)
+    is_null = property(_isnull_impl, None)
+    sbvalue = property(_sbvalue_impl, None)
+
+
+class stdlist_iterator:
+
+    def increment_node(self, node):
+        logger = lldb.formatters.Logger.Logger()
+        if node.is_null:
+            return None
+        return node.next
+
+    def __init__(self, node):
+        logger = lldb.formatters.Logger.Logger()
+        # we convert the SBValue to an internal node object on entry
+        self.node = stdlist_entry(node)
+
+    def value(self):
+        logger = lldb.formatters.Logger.Logger()
+        return self.node.sbvalue  # and return the SBValue back on exit
+
+    def next(self):
+        logger = lldb.formatters.Logger.Logger()
+        node = self.increment_node(self.node)
+        if node is not None and node.sbvalue.IsValid() and not(node.is_null):
+            self.node = node
+            return self.value()
+        else:
+            return None
+
+    def advance(self, N):
+        logger = lldb.formatters.Logger.Logger()
+        if N < 0:
+            return None
+        if N == 0:
+            return self.value()
+        if N == 1:
+            return self.next()
+        while N > 0:
+            self.next()
+            N = N - 1
+        return self.value()
+
+
+class stdlist_SynthProvider:
+
+    def __init__(self, valobj, dict):
+        logger = lldb.formatters.Logger.Logger()
+        self.valobj = valobj
+        self.count = None
+
+    def next_node(self, node):
+        logger = lldb.formatters.Logger.Logger()
+        return node.GetChildMemberWithName('__next_')
+
+    def value(self, node):
+        logger = lldb.formatters.Logger.Logger()
+        return node.GetValueAsUnsigned()
+
+    # Floyd's cycle-finding algorithm
+    # try to detect if this list has a loop
+    def has_loop(self):
+        global _list_uses_loop_detector
+        logger = lldb.formatters.Logger.Logger()
+        if not _list_uses_loop_detector:
+            logger >> "Asked not to use loop detection"
+            return False
+        slow = stdlist_entry(self.head)
+        fast1 = stdlist_entry(self.head)
+        fast2 = stdlist_entry(self.head)
+        while slow.next.value != self.node_address:
+            slow_value = slow.value
+            fast1 = fast2.next
+            fast2 = fast1.next
+            if fast1.value == slow_value or fast2.value == slow_value:
+                return True
+            slow = slow.next
+        return False
+
+    def num_children(self):
+        global _list_capping_size
+        logger = lldb.formatters.Logger.Logger()
+        if self.count is None:
+            self.count = self.num_children_impl()
+            if self.count > _list_capping_size:
+                self.count = _list_capping_size
+        return self.count
+
+    def num_children_impl(self):
+        global _list_capping_size
+        logger = lldb.formatters.Logger.Logger()
+        try:
+            next_val = self.head.GetValueAsUnsigned(0)
+            prev_val = self.tail.GetValueAsUnsigned(0)
+            # After a std::list has been initialized, both next and prev will
+            # be non-NULL
+            if next_val == 0 or prev_val == 0:
+                return 0
+            if next_val == self.node_address:
+                return 0
+            if next_val == prev_val:
+                return 1
+            if self.has_loop():
+                return 0
+            size = 2
+            current = stdlist_entry(self.head)
+            while current.next.value != self.node_address:
+                size = size + 1
+                current = current.next
+                if size > _list_capping_size:
+                    return _list_capping_size
+            return (size - 1)
+        except:
+            return 0
+
+    def get_child_index(self, name):
+        logger = lldb.formatters.Logger.Logger()
+        try:
+            return int(name.lstrip('[').rstrip(']'))
+        except:
+            return -1
+
+    def get_child_at_index(self, index):
+        logger = lldb.formatters.Logger.Logger()
+        logger >> "Fetching child " + str(index)
+        if index < 0:
+            return None
+        if index >= self.num_children():
+            return None
+        try:
+            current = stdlist_iterator(self.head)
+            current = current.advance(index)
+            # we do not return __value_ because then all our children would be named __value_
+            # we need to make a copy of __value__ with the right name -
+            # unfortunate
+            obj = current.GetChildMemberWithName('__value_')
+            obj_data = obj.GetData()
+            return self.valobj.CreateValueFromData(
+                '[' + str(index) + ']', obj_data, self.data_type)
+        except:
+            return None
+
+    def extract_type(self):
+        logger = lldb.formatters.Logger.Logger()
+        list_type = self.valobj.GetType().GetUnqualifiedType()
+        if list_type.IsReferenceType():
+            list_type = list_type.GetDereferencedType()
+        if list_type.GetNumberOfTemplateArguments() > 0:
+            data_type = list_type.GetTemplateArgumentType(0)
+        else:
+            data_type = None
+        return data_type
+
+    def update(self):
+        logger = lldb.formatters.Logger.Logger()
+        self.count = None
+        try:
+            impl = self.valobj.GetChildMemberWithName('__end_')
+            self.node_address = self.valobj.AddressOf().GetValueAsUnsigned(0)
+            self.head = impl.GetChildMemberWithName('__next_')
+            self.tail = impl.GetChildMemberWithName('__prev_')
+            self.data_type = self.extract_type()
+            self.data_size = self.data_type.GetByteSize()
+        except:
+            pass
+
+    def has_children(self):
+        return True
+
+
+# Just an example: the actual summary is produced by a summary string:
+# size=${svar%#}
+def stdlist_SummaryProvider(valobj, dict):
+    prov = stdlist_SynthProvider(valobj, None)
+    return 'size=' + str(prov.num_children())
+
+# a tree node - this class makes the syntax in the actual iterator nicer
+# to read and maintain
+
+
+class stdmap_iterator_node:
+
+    def _left_impl(self):
+        logger = lldb.formatters.Logger.Logger()
+        return stdmap_iterator_node(
+            self.node.GetChildMemberWithName("__left_"))
+
+    def _right_impl(self):
+        logger = lldb.formatters.Logger.Logger()
+        return stdmap_iterator_node(
+            self.node.GetChildMemberWithName("__right_"))
+
+    def _parent_impl(self):
+        logger = lldb.formatters.Logger.Logger()
+        return stdmap_iterator_node(
+            self.node.GetChildMemberWithName("__parent_"))
+
+    def _value_impl(self):
+        logger = lldb.formatters.Logger.Logger()
+        return self.node.GetValueAsUnsigned(0)
+
+    def _sbvalue_impl(self):
+        logger = lldb.formatters.Logger.Logger()
+        return self.node
+
+    def _null_impl(self):
+        logger = lldb.formatters.Logger.Logger()
+        return self.value == 0
+
+    def __init__(self, node):
+        logger = lldb.formatters.Logger.Logger()
+        self.node = node
+
+    left = property(_left_impl, None)
+    right = property(_right_impl, None)
+    parent = property(_parent_impl, None)
+    value = property(_value_impl, None)
+    is_null = property(_null_impl, None)
+    sbvalue = property(_sbvalue_impl, None)
+
+# a Python implementation of the tree iterator used by libc++
+
+
+class stdmap_iterator:
+
+    def tree_min(self, x):
+        logger = lldb.formatters.Logger.Logger()
+        steps = 0
+        if x.is_null:
+            return None
+        while (not x.left.is_null):
+            x = x.left
+            steps += 1
+            if steps > self.max_count:
+                logger >> "Returning None - we overflowed"
+                return None
+        return x
+
+    def tree_max(self, x):
+        logger = lldb.formatters.Logger.Logger()
+        if x.is_null:
+            return None
+        while (not x.right.is_null):
+            x = x.right
+        return x
+
+    def tree_is_left_child(self, x):
+        logger = lldb.formatters.Logger.Logger()
+        if x.is_null:
+            return None
+        return True if x.value == x.parent.left.value else False
+
+    def increment_node(self, node):
+        logger = lldb.formatters.Logger.Logger()
+        if node.is_null:
+            return None
+        if not node.right.is_null:
+            return self.tree_min(node.right)
+        steps = 0
+        while (not self.tree_is_left_child(node)):
+            steps += 1
+            if steps > self.max_count:
+                logger >> "Returning None - we overflowed"
+                return None
+            node = node.parent
+        return node.parent
+
+    def __init__(self, node, max_count=0):
+        logger = lldb.formatters.Logger.Logger()
+        # we convert the SBValue to an internal node object on entry
+        self.node = stdmap_iterator_node(node)
+        self.max_count = max_count
+
+    def value(self):
+        logger = lldb.formatters.Logger.Logger()
+        return self.node.sbvalue  # and return the SBValue back on exit
+
+    def next(self):
+        logger = lldb.formatters.Logger.Logger()
+        node = self.increment_node(self.node)
+        if node is not None and node.sbvalue.IsValid() and not(node.is_null):
+            self.node = node
+            return self.value()
+        else:
+            return None
+
+    def advance(self, N):
+        logger = lldb.formatters.Logger.Logger()
+        if N < 0:
+            return None
+        if N == 0:
+            return self.value()
+        if N == 1:
+            return self.next()
+        while N > 0:
+            if self.next() is None:
+                return None
+            N = N - 1
+        return self.value()
+
+
+class stdmap_SynthProvider:
+
+    def __init__(self, valobj, dict):
+        logger = lldb.formatters.Logger.Logger()
+        self.valobj = valobj
+        self.pointer_size = self.valobj.GetProcess().GetAddressByteSize()
+        self.count = None
+
+    def update(self):
+        logger = lldb.formatters.Logger.Logger()
+        self.count = None
+        try:
+            # we will set this to True if we find out that discovering a node in the map takes more steps than the overall size of the RB tree
+            # if this gets set to True, then we will merrily return None for
+            # any child from that moment on
+            self.garbage = False
+            self.tree = self.valobj.GetChildMemberWithName('__tree_')
+            self.root_node = self.tree.GetChildMemberWithName('__begin_node_')
+            # this data is either lazily-calculated, or cannot be inferred at this moment
+            # we still need to mark it as None, meaning "please set me ASAP"
+            self.data_type = None
+            self.data_size = None
+            self.skip_size = None
+        except:
+            pass
+
+    def num_children(self):
+        global _map_capping_size
+        logger = lldb.formatters.Logger.Logger()
+        if self.count is None:
+            self.count = self.num_children_impl()
+            if self.count > _map_capping_size:
+                self.count = _map_capping_size
+        return self.count
+
+    def num_children_impl(self):
+        logger = lldb.formatters.Logger.Logger()
+        try:
+            return self.valobj.GetChildMemberWithName('__tree_').GetChildMemberWithName(
+                '__pair3_').GetChildMemberWithName('__first_').GetValueAsUnsigned()
+        except:
+            return 0
+
+    def has_children(self):
+        return True
+
+    def get_data_type(self):
+        logger = lldb.formatters.Logger.Logger()
+        if self.data_type is None or self.data_size is None:
+            if self.num_children() == 0:
+                return False
+            deref = self.root_node.Dereference()
+            if not(deref.IsValid()):
+                return False
+            value = deref.GetChildMemberWithName('__value_')
+            if not(value.IsValid()):
+                return False
+            self.data_type = value.GetType()
+            self.data_size = self.data_type.GetByteSize()
+            self.skip_size = None
+            return True
+        else:
+            return True
+
+    def get_value_offset(self, node):
+        logger = lldb.formatters.Logger.Logger()
+        if self.skip_size is None:
+            node_type = node.GetType()
+            fields_count = node_type.GetNumberOfFields()
+            for i in range(fields_count):
+                field = node_type.GetFieldAtIndex(i)
+                if field.GetName() == '__value_':
+                    self.skip_size = field.GetOffsetInBytes()
+                    break
+        return (self.skip_size is not None)
+
+    def get_child_index(self, name):
+        logger = lldb.formatters.Logger.Logger()
+        try:
+            return int(name.lstrip('[').rstrip(']'))
+        except:
+            return -1
+
+    def get_child_at_index(self, index):
+        logger = lldb.formatters.Logger.Logger()
+        logger >> "Retrieving child " + str(index)
+        if index < 0:
+            return None
+        if index >= self.num_children():
+            return None
+        if self.garbage:
+            logger >> "Returning None since this tree is garbage"
+            return None
+        try:
+            iterator = stdmap_iterator(
+                self.root_node, max_count=self.num_children())
+            # the debug info for libc++ std::map is such that __begin_node_ has a very nice and useful type
+            # out of which we can grab the information we need - every other node has a less informative
+            # type which omits all value information and only contains housekeeping information for the RB tree
+            # hence, we need to know if we are at a node != 0, so that we can
+            # still get at the data
+            need_to_skip = (index > 0)
+            current = iterator.advance(index)
+            if current is None:
+                logger >> "Tree is garbage - returning None"
+                self.garbage = True
+                return None
+            if self.get_data_type():
+                if not(need_to_skip):
+                    current = current.Dereference()
+                    obj = current.GetChildMemberWithName('__value_')
+                    obj_data = obj.GetData()
+                    # make sure we have a valid offset for the next items
+                    self.get_value_offset(current)
+                    # we do not return __value_ because then we would end up with a child named
+                    # __value_ instead of [0]
+                    return self.valobj.CreateValueFromData(
+                        '[' + str(index) + ']', obj_data, self.data_type)
+                else:
+                    # FIXME we need to have accessed item 0 before accessing
+                    # any other item!
+                    if self.skip_size is None:
+                        logger >> "You asked for item > 0 before asking for item == 0, I will fetch 0 now then retry"
+                        if self.get_child_at_index(0):
+                            return self.get_child_at_index(index)
+                        else:
+                            logger >> "item == 0 could not be found. sorry, nothing can be done here."
+                            return None
+                    return current.CreateChildAtOffset(
+                        '[' + str(index) + ']', self.skip_size, self.data_type)
+            else:
+                logger >> "Unable to infer data-type - returning None (should mark tree as garbage here?)"
+                return None
+        except Exception as err:
+            logger >> "Hit an exception: " + str(err)
+            return None
+
+# Just an example: the actual summary is produced by a summary string:
+# size=${svar%#}
+
+
+def stdmap_SummaryProvider(valobj, dict):
+    prov = stdmap_SynthProvider(valobj, None)
+    return 'size=' + str(prov.num_children())
+
+
+class stddeque_SynthProvider:
+
+    def __init__(self, valobj, d):
+        logger = lldb.formatters.Logger.Logger()
+        logger.write("init")
+        self.valobj = valobj
+        self.pointer_size = self.valobj.GetProcess().GetAddressByteSize()
+        self.count = None
+        try:
+            self.find_block_size()
+        except:
+            self.block_size = -1
+            self.element_size = -1
+        logger.write(
+            "block_size=%d, element_size=%d" %
+            (self.block_size, self.element_size))
+
+    def find_block_size(self):
+        # in order to use the deque we must have the block size, or else
+        # it's impossible to know what memory addresses are valid
+        self.element_type = self.valobj.GetType().GetTemplateArgumentType(0)
+        self.element_size = self.element_type.GetByteSize()
+        # The code says this, but there must be a better way:
+        # template <class _Tp, class _Allocator>
+        # class __deque_base {
+        #    static const difference_type __block_size = sizeof(value_type) < 256 ? 4096 / sizeof(value_type) : 16;
+        # }
+        if self.element_size < 256:
+            self.block_size = 4096 / self.element_size
+        else:
+            self.block_size = 16
+
+    def num_children(self):
+        global _deque_capping_size
+        logger = lldb.formatters.Logger.Logger()
+        if self.count is None:
+            return 0
+        return min(self.count, _deque_capping_size)
+
+    def has_children(self):
+        return True
+
+    def get_child_index(self, name):
+        logger = lldb.formatters.Logger.Logger()
+        try:
+            return int(name.lstrip('[').rstrip(']'))
+        except:
+            return -1
+
+    def get_child_at_index(self, index):
+        logger = lldb.formatters.Logger.Logger()
+        logger.write("Fetching child " + str(index))
+        if index < 0 or self.count is None:
+            return None
+        if index >= self.num_children():
+            return None
+        try:
+            i, j = divmod(self.start + index, self.block_size)
+            return self.first.CreateValueFromExpression(
+                '[' + str(index) + ']', '*(*(%s + %d) + %d)' %
+                (self.first.get_expr_path(), i, j))
+        except:
+            return None
+
+    def _get_value_of_compressed_pair(self, pair):
+        value = pair.GetChildMemberWithName("__value_")
+        if not value.IsValid():
+            # pre-r300140 member name
+            value = pair.GetChildMemberWithName("__first_")
+        return value.GetValueAsUnsigned(0)
+
+    def update(self):
+        logger = lldb.formatters.Logger.Logger()
+        try:
+            # A deque is effectively a two-dim array, with fixed width.
+            # 'map' contains pointers to the rows of this array. The
+            # full memory area allocated by the deque is delimited
+            # by 'first' and 'end_cap'. However, only a subset of this
+            # memory contains valid data since a deque may have some slack
+            # at the front and back in order to have O(1) insertion at
+            # both ends. The rows in active use are delimited by
+            # 'begin' and 'end'.
+            #
+            # To find the elements that are actually constructed, the 'start'
+            # variable tells which element in this NxM array is the 0th
+            # one, and the 'size' element gives the number of elements
+            # in the deque.
+            count = self._get_value_of_compressed_pair(
+                    self.valobj.GetChildMemberWithName('__size_'))
+            # give up now if we cant access memory reliably
+            if self.block_size < 0:
+                logger.write("block_size < 0")
+                return
+            map_ = self.valobj.GetChildMemberWithName('__map_')
+            start = self.valobj.GetChildMemberWithName(
+                '__start_').GetValueAsUnsigned(0)
+            first = map_.GetChildMemberWithName('__first_')
+            map_first = first.GetValueAsUnsigned(0)
+            map_begin = map_.GetChildMemberWithName(
+                '__begin_').GetValueAsUnsigned(0)
+            map_end = map_.GetChildMemberWithName(
+                '__end_').GetValueAsUnsigned(0)
+            map_endcap = self._get_value_of_compressed_pair(
+                    map_.GetChildMemberWithName( '__end_cap_'))
+            # check consistency
+            if not map_first <= map_begin <= map_end <= map_endcap:
+                logger.write("map pointers are not monotonic")
+                return
+            total_rows, junk = divmod(
+                map_endcap - map_first, self.pointer_size)
+            if junk:
+                logger.write("endcap-first doesnt align correctly")
+                return
+            active_rows, junk = divmod(map_end - map_begin, self.pointer_size)
+            if junk:
+                logger.write("end-begin doesnt align correctly")
+                return
+            start_row, junk = divmod(map_begin - map_first, self.pointer_size)
+            if junk:
+                logger.write("begin-first doesnt align correctly")
+                return
+            if not start_row * \
+                    self.block_size <= start < (start_row + 1) * self.block_size:
+                logger.write("0th element must be in the 'begin' row")
+                return
+            end_row = start_row + active_rows
+            if not count:
+                if active_rows:
+                    logger.write("empty deque but begin!=end")
+                    return
+            elif not (end_row - 1) * self.block_size <= start + count < end_row * self.block_size:
+                logger.write("nth element must be before the 'end' row")
+                return
+            logger.write(
+                "update success: count=%r, start=%r, first=%r" %
+                (count, start, first))
+            # if consistent, save all we really need:
+            self.count = count
+            self.start = start
+            self.first = first
+        except:
+            self.count = None
+            self.start = None
+            self.map_first = None
+            self.map_begin = None
+
+
+class stdsharedptr_SynthProvider:
+
+    def __init__(self, valobj, d):
+        logger = lldb.formatters.Logger.Logger()
+        logger.write("init")
+        self.valobj = valobj
+        #self.element_ptr_type = self.valobj.GetType().GetTemplateArgumentType(0).GetPointerType()
+        self.ptr = None
+        self.cntrl = None
+        process = valobj.GetProcess()
+        self.endianness = process.GetByteOrder()
+        self.pointer_size = process.GetAddressByteSize()
+        self.count_type = valobj.GetType().GetBasicType(lldb.eBasicTypeUnsignedLong)
+
+    def num_children(self):
+        return 1
+
+    def has_children(self):
+        return True
+
+    def get_child_index(self, name):
+        if name == "__ptr_":
+            return 0
+        if name == "count":
+            return 1
+        if name == "weak_count":
+            return 2
+        return -1
+
+    def get_child_at_index(self, index):
+        if index == 0:
+            return self.ptr
+        if index == 1:
+            if self.cntrl is None:
+                count = 0
+            else:
+                count = 1 + \
+                    self.cntrl.GetChildMemberWithName('__shared_owners_').GetValueAsSigned()
+            return self.valobj.CreateValueFromData(
+                "count", lldb.SBData.CreateDataFromUInt64Array(
+                    self.endianness, self.pointer_size, [count]), self.count_type)
+        if index == 2:
+            if self.cntrl is None:
+                count = 0
+            else:
+                count = 1 + \
+                    self.cntrl.GetChildMemberWithName('__shared_weak_owners_').GetValueAsSigned()
+            return self.valobj.CreateValueFromData(
+                "weak_count", lldb.SBData.CreateDataFromUInt64Array(
+                    self.endianness, self.pointer_size, [count]), self.count_type)
+        return None
+
+    def update(self):
+        logger = lldb.formatters.Logger.Logger()
+        self.ptr = self.valobj.GetChildMemberWithName(
+            '__ptr_')  # .Cast(self.element_ptr_type)
+        cntrl = self.valobj.GetChildMemberWithName('__cntrl_')
+        if cntrl.GetValueAsUnsigned(0):
+            self.cntrl = cntrl.Dereference()
+        else:
+            self.cntrl = None
+
+# we can use two different categories for old and new formatters - type names are different enough that we should make no confusion
+# talking with libc++ developer: "std::__1::class_name is set in stone
+# until we decide to change the ABI. That shouldn't happen within a 5 year
+# time frame"
+
+
+def __lldb_init_module(debugger, dict):
+    debugger.HandleCommand(
+        'type summary add -F libcxx.stdstring_SummaryProvider "std::__1::string" -w libcxx')
+    debugger.HandleCommand(
+        'type summary add -F libcxx.stdstring_SummaryProvider "std::__1::basic_string<char, class std::__1::char_traits<char>, class std::__1::allocator<char> >" -w libcxx')
+    debugger.HandleCommand(
+        'type synthetic add -l libcxx.stdvector_SynthProvider -x "^(std::__1::)vector<.+>$" -w libcxx')
+    debugger.HandleCommand(
+        'type summary add -F libcxx.stdvector_SummaryProvider -e -x "^(std::__1::)vector<.+>$" -w libcxx')
+    debugger.HandleCommand(
+        'type synthetic add -l libcxx.stdlist_SynthProvider -x "^(std::__1::)list<.+>$" -w libcxx')
+    debugger.HandleCommand(
+        'type summary add -F libcxx.stdlist_SummaryProvider -e -x "^(std::__1::)list<.+>$" -w libcxx')
+    debugger.HandleCommand(
+        'type synthetic add -l libcxx.stdmap_SynthProvider -x "^(std::__1::)map<.+> >$" -w libcxx')
+    debugger.HandleCommand(
+        'type summary add -F libcxx.stdmap_SummaryProvider -e -x "^(std::__1::)map<.+> >$" -w libcxx')
+    debugger.HandleCommand("type category enable libcxx")
+    debugger.HandleCommand(
+        'type synthetic add -l libcxx.stddeque_SynthProvider -x "^(std::__1::)deque<.+>$" -w libcxx')
+    debugger.HandleCommand(
+        'type synthetic add -l libcxx.stdsharedptr_SynthProvider -x "^(std::__1::)shared_ptr<.+>$" -w libcxx')
+    # turns out the structs look the same, so weak_ptr can be handled the same!
+    debugger.HandleCommand(
+        'type synthetic add -l libcxx.stdsharedptr_SynthProvider -x "^(std::__1::)weak_ptr<.+>$" -w libcxx')
+
+_map_capping_size = 255
+_list_capping_size = 255
+_list_uses_loop_detector = True
+_deque_capping_size = 255
diff --git a/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/metrics.py b/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/metrics.py
new file mode 100644
index 0000000..e7fe88e
--- /dev/null
+++ b/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/metrics.py
@@ -0,0 +1,112 @@
+"""
+Objective-C runtime wrapper for use by LLDB Python formatters
+
+Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+See https://llvm.org/LICENSE.txt for license information.
+SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+"""
+import lldb
+import time
+import datetime
+import inspect
+
+
+class TimeMetrics:
+
+    @staticmethod
+    def generate(label=None):
+        return TimeMetrics(label)
+
+    def __init__(self, lbl=None):
+        self.label = "" if lbl is None else lbl
+        pass
+
+    def __enter__(self):
+        caller = inspect.stack()[1]
+        self.function = str(caller)
+        self.enter_time = time.clock()
+
+    def __exit__(self, a, b, c):
+        self.exit_time = time.clock()
+        print("It took " + str(self.exit_time - self.enter_time) +
+              " time units to run through " + self.function + self.label)
+        return False
+
+
+class Counter:
+
+    def __init__(self):
+        self.count = 0
+        self.list = []
+
+    def update(self, name):
+        self.count = self.count + 1
+        # avoid getting the full dump of this ValueObject just to save its
+        # metrics
+        if isinstance(name, lldb.SBValue):
+            self.list.append(name.GetName())
+        else:
+            self.list.append(str(name))
+
+    def __str__(self):
+        return str(self.count) + " times, for items [" + str(self.list) + "]"
+
+
+class MetricsPrinter_Verbose:
+
+    def __init__(self, metrics):
+        self.metrics = metrics
+
+    def __str__(self):
+        string = ""
+        for key, value in self.metrics.metrics.items():
+            string = string + "metric " + str(key) + ": " + str(value) + "\n"
+        return string
+
+
+class MetricsPrinter_Compact:
+
+    def __init__(self, metrics):
+        self.metrics = metrics
+
+    def __str__(self):
+        string = ""
+        for key, value in self.metrics.metrics.items():
+            string = string + "metric " + \
+                str(key) + " was hit " + str(value.count) + " times\n"
+        return string
+
+
+class Metrics:
+
+    def __init__(self):
+        self.metrics = {}
+
+    def add_metric(self, name):
+        self.metrics[name] = Counter()
+
+    def metric_hit(self, metric, trigger):
+        self.metrics[metric].update(trigger)
+
+    def __getitem__(self, key):
+        return self.metrics[key]
+
+    def __getattr__(self, name):
+        if name == 'compact':
+            return MetricsPrinter_Compact(self)
+        if name == 'verbose':
+            return MetricsPrinter_Verbose(self)
+        raise AttributeError("%r object has no attribute %r" %
+                             (type(self).__name__, name))
+
+    def __str__(self):
+        return str(self.verbose)
+
+    def metric_success(self, metric):
+        total_count = 0
+        metric_count = self[metric].count
+        for key, value in self.metrics.items():
+            total_count = total_count + value.count
+        if total_count > 0:
+            return metric_count / float(total_count)
+        return 0
diff --git a/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/synth.py b/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/synth.py
new file mode 100644
index 0000000..02dcc4f
--- /dev/null
+++ b/linux-x64/clang/lib/python2.7/site-packages/lldb/formatters/synth.py
@@ -0,0 +1,63 @@
+import lldb
+
+
+class PythonObjectSyntheticChildProvider(object):
+
+    def __init__(self, value, internal_dict):
+        self.value = value
+        self.values = self.make_children()
+        self.built_values = {}
+        self.bo = self.value.target.byte_order
+        self.ps = self.value.target.addr_size
+
+    def make_children(self):
+        pass
+
+    def num_children(self):
+        return len(self.values)
+
+    def get_child_index(self, name):
+        i = 0
+        for N, value in self.values:
+            if N == name:
+                return i
+            i += 1
+        return None
+
+    def update(self):
+        pass
+
+    def has_children(self):
+        return len(self.values) > 0
+
+    def gen_child(self, name, value):
+        data = None
+        type = None
+        import six
+        if isinstance(value, six.integer_types):
+            data = lldb.SBData.CreateDataFromUInt64Array(
+                self.bo, self.ps, [value])
+            type = self.value.target.GetBasicType(lldb.eBasicTypeLong)
+        elif isinstance(value, float):
+            data = lldb.SBData.CreateDataFromDoubleArray(
+                self.bo, self.ps, [value])
+            type = self.value.target.GetBasicType(lldb.eBasicTypeDouble)
+        elif isinstance(value, str):
+            data = lldb.SBData.CreateDataFromCString(self.bo, self.ps, value)
+            type = self.value.target.GetBasicType(
+                lldb.eBasicTypeChar).GetArrayType(
+                len(value))
+        if (data is not None) and (type is not None):
+            return self.value.CreateValueFromData(name, data, type)
+        return None
+
+    def get_child_at_index(self, index):
+        if index in self.built_values:
+            return self.built_values[index]
+
+        bv = None
+
+        name, value = self.values[index]
+        bv = self.gen_child(name, value)
+        self.built_values[index] = bv
+        return bv
diff --git a/linux-x64/clang/lib/python2.7/site-packages/lldb/lldb-argdumper b/linux-x64/clang/lib/python2.7/site-packages/lldb/lldb-argdumper
new file mode 120000
index 0000000..feb02f3
--- /dev/null
+++ b/linux-x64/clang/lib/python2.7/site-packages/lldb/lldb-argdumper
@@ -0,0 +1 @@
+../../../../bin/lldb-argdumper
\ No newline at end of file
diff --git a/linux-x64/clang/lib/python2.7/site-packages/lldb/runtime/__init__.py b/linux-x64/clang/lib/python2.7/site-packages/lldb/runtime/__init__.py
new file mode 100644
index 0000000..205a5da
--- /dev/null
+++ b/linux-x64/clang/lib/python2.7/site-packages/lldb/runtime/__init__.py
@@ -0,0 +1,3 @@
+__all__ = []
+for x in __all__:
+	__import__('lldb.runtime.' + x)
\ No newline at end of file
diff --git a/linux-x64/clang/lib/python2.7/site-packages/lldb/utils/__init__.py b/linux-x64/clang/lib/python2.7/site-packages/lldb/utils/__init__.py
new file mode 100644
index 0000000..59db6c0
--- /dev/null
+++ b/linux-x64/clang/lib/python2.7/site-packages/lldb/utils/__init__.py
@@ -0,0 +1,3 @@
+__all__ = ["symbolication"]
+for x in __all__:
+	__import__('lldb.utils.' + x)
\ No newline at end of file
diff --git a/linux-x64/clang/lib/python2.7/site-packages/lldb/utils/symbolication.py b/linux-x64/clang/lib/python2.7/site-packages/lldb/utils/symbolication.py
new file mode 100644
index 0000000..dac9305
--- /dev/null
+++ b/linux-x64/clang/lib/python2.7/site-packages/lldb/utils/symbolication.py
@@ -0,0 +1,727 @@
+#!/usr/bin/python
+
+#----------------------------------------------------------------------
+# Be sure to add the python path that points to the LLDB shared library.
+#
+# To use this in the embedded python interpreter using "lldb":
+#
+#   cd /path/containing/crashlog.py
+#   lldb
+#   (lldb) script import crashlog
+#   "crashlog" command installed, type "crashlog --help" for detailed help
+#   (lldb) crashlog ~/Library/Logs/DiagnosticReports/a.crash
+#
+# The benefit of running the crashlog command inside lldb in the
+# embedded python interpreter is when the command completes, there
+# will be a target with all of the files loaded at the locations
+# described in the crash log. Only the files that have stack frames
+# in the backtrace will be loaded unless the "--load-all" option
+# has been specified. This allows users to explore the program in the
+# state it was in right at crash time.
+#
+# On MacOSX csh, tcsh:
+#   ( setenv PYTHONPATH /path/to/LLDB.framework/Resources/Python ; ./crashlog.py ~/Library/Logs/DiagnosticReports/a.crash )
+#
+# On MacOSX sh, bash:
+#   PYTHONPATH=/path/to/LLDB.framework/Resources/Python ./crashlog.py ~/Library/Logs/DiagnosticReports/a.crash
+#----------------------------------------------------------------------
+
+from __future__ import print_function
+import lldb
+import optparse
+import os
+import plistlib
+import re
+import shlex
+import sys
+import time
+import uuid
+
+
+class Address:
+    """Class that represents an address that will be symbolicated"""
+
+    def __init__(self, target, load_addr):
+        self.target = target
+        self.load_addr = load_addr  # The load address that this object represents
+        # the resolved lldb.SBAddress (if any), named so_addr for
+        # section/offset address
+        self.so_addr = None
+        self.sym_ctx = None  # The cached symbol context for this address
+        # Any original textual description of this address to be used as a
+        # backup in case symbolication fails
+        self.description = None
+        self.symbolication = None  # The cached symbolicated string that describes this address
+        self.inlined = False
+
+    def __str__(self):
+        s = "%#16.16x" % (self.load_addr)
+        if self.symbolication:
+            s += " %s" % (self.symbolication)
+        elif self.description:
+            s += " %s" % (self.description)
+        elif self.so_addr:
+            s += " %s" % (self.so_addr)
+        return s
+
+    def resolve_addr(self):
+        if self.so_addr is None:
+            self.so_addr = self.target.ResolveLoadAddress(self.load_addr)
+        return self.so_addr
+
+    def is_inlined(self):
+        return self.inlined
+
+    def get_symbol_context(self):
+        if self.sym_ctx is None:
+            sb_addr = self.resolve_addr()
+            if sb_addr:
+                self.sym_ctx = self.target.ResolveSymbolContextForAddress(
+                    sb_addr, lldb.eSymbolContextEverything)
+            else:
+                self.sym_ctx = lldb.SBSymbolContext()
+        return self.sym_ctx
+
+    def get_instructions(self):
+        sym_ctx = self.get_symbol_context()
+        if sym_ctx:
+            function = sym_ctx.GetFunction()
+            if function:
+                return function.GetInstructions(self.target)
+            return sym_ctx.GetSymbol().GetInstructions(self.target)
+        return None
+
+    def symbolicate(self, verbose=False):
+        if self.symbolication is None:
+            self.symbolication = ''
+            self.inlined = False
+            sym_ctx = self.get_symbol_context()
+            if sym_ctx:
+                module = sym_ctx.GetModule()
+                if module:
+                    # Print full source file path in verbose mode
+                    if verbose:
+                        self.symbolication += str(module.GetFileSpec()) + '`'
+                    else:
+                        self.symbolication += module.GetFileSpec().GetFilename() + '`'
+                    function_start_load_addr = -1
+                    function = sym_ctx.GetFunction()
+                    block = sym_ctx.GetBlock()
+                    line_entry = sym_ctx.GetLineEntry()
+                    symbol = sym_ctx.GetSymbol()
+                    inlined_block = block.GetContainingInlinedBlock()
+                    if function:
+                        self.symbolication += function.GetName()
+
+                        if inlined_block:
+                            self.inlined = True
+                            self.symbolication += ' [inlined] ' + \
+                                inlined_block.GetInlinedName()
+                            block_range_idx = inlined_block.GetRangeIndexForBlockAddress(
+                                self.so_addr)
+                            if block_range_idx < lldb.UINT32_MAX:
+                                block_range_start_addr = inlined_block.GetRangeStartAddress(
+                                    block_range_idx)
+                                function_start_load_addr = block_range_start_addr.GetLoadAddress(
+                                    self.target)
+                        if function_start_load_addr == -1:
+                            function_start_load_addr = function.GetStartAddress().GetLoadAddress(self.target)
+                    elif symbol:
+                        self.symbolication += symbol.GetName()
+                        function_start_load_addr = symbol.GetStartAddress().GetLoadAddress(self.target)
+                    else:
+                        self.symbolication = ''
+                        return False
+
+                    # Dump the offset from the current function or symbol if it
+                    # is non zero
+                    function_offset = self.load_addr - function_start_load_addr
+                    if function_offset > 0:
+                        self.symbolication += " + %u" % (function_offset)
+                    elif function_offset < 0:
+                        self.symbolication += " %i (invalid negative offset, file a bug) " % function_offset
+
+                    # Print out any line information if any is available
+                    if line_entry.GetFileSpec():
+                        # Print full source file path in verbose mode
+                        if verbose:
+                            self.symbolication += ' at %s' % line_entry.GetFileSpec()
+                        else:
+                            self.symbolication += ' at %s' % line_entry.GetFileSpec().GetFilename()
+                        self.symbolication += ':%u' % line_entry.GetLine()
+                        column = line_entry.GetColumn()
+                        if column > 0:
+                            self.symbolication += ':%u' % column
+                    return True
+        return False
+
+
+class Section:
+    """Class that represents an load address range"""
+    sect_info_regex = re.compile('(?P<name>[^=]+)=(?P<range>.*)')
+    addr_regex = re.compile('^\s*(?P<start>0x[0-9A-Fa-f]+)\s*$')
+    range_regex = re.compile(
+        '^\s*(?P<start>0x[0-9A-Fa-f]+)\s*(?P<op>[-+])\s*(?P<end>0x[0-9A-Fa-f]+)\s*$')
+
+    def __init__(self, start_addr=None, end_addr=None, name=None):
+        self.start_addr = start_addr
+        self.end_addr = end_addr
+        self.name = name
+
+    @classmethod
+    def InitWithSBTargetAndSBSection(cls, target, section):
+        sect_load_addr = section.GetLoadAddress(target)
+        if sect_load_addr != lldb.LLDB_INVALID_ADDRESS:
+            obj = cls(
+                sect_load_addr,
+                sect_load_addr +
+                section.size,
+                section.name)
+            return obj
+        else:
+            return None
+
+    def contains(self, addr):
+        return self.start_addr <= addr and addr < self.end_addr
+
+    def set_from_string(self, s):
+        match = self.sect_info_regex.match(s)
+        if match:
+            self.name = match.group('name')
+            range_str = match.group('range')
+            addr_match = self.addr_regex.match(range_str)
+            if addr_match:
+                self.start_addr = int(addr_match.group('start'), 16)
+                self.end_addr = None
+                return True
+
+            range_match = self.range_regex.match(range_str)
+            if range_match:
+                self.start_addr = int(range_match.group('start'), 16)
+                self.end_addr = int(range_match.group('end'), 16)
+                op = range_match.group('op')
+                if op == '+':
+                    self.end_addr += self.start_addr
+                return True
+        print('error: invalid section info string "%s"' % s)
+        print('Valid section info formats are:')
+        print('Format                Example                    Description')
+        print('--------------------- -----------------------------------------------')
+        print('<name>=<base>        __TEXT=0x123000             Section from base address only')
+        print('<name>=<base>-<end>  __TEXT=0x123000-0x124000    Section from base address and end address')
+        print('<name>=<base>+<size> __TEXT=0x123000+0x1000      Section from base address and size')
+        return False
+
+    def __str__(self):
+        if self.name:
+            if self.end_addr is not None:
+                if self.start_addr is not None:
+                    return "%s=[0x%16.16x - 0x%16.16x)" % (
+                        self.name, self.start_addr, self.end_addr)
+            else:
+                if self.start_addr is not None:
+                    return "%s=0x%16.16x" % (self.name, self.start_addr)
+            return self.name
+        return "<invalid>"
+
+
+class Image:
+    """A class that represents an executable image and any associated data"""
+
+    def __init__(self, path, uuid=None):
+        self.path = path
+        self.resolved_path = None
+        self.resolved = False
+        self.unavailable = False
+        self.uuid = uuid
+        self.section_infos = list()
+        self.identifier = None
+        self.version = None
+        self.arch = None
+        self.module = None
+        self.symfile = None
+        self.slide = None
+
+    @classmethod
+    def InitWithSBTargetAndSBModule(cls, target, module):
+        '''Initialize this Image object with a module from a target.'''
+        obj = cls(module.file.fullpath, module.uuid)
+        obj.resolved_path = module.platform_file.fullpath
+        obj.resolved = True
+        obj.arch = module.triple
+        for section in module.sections:
+            symb_section = Section.InitWithSBTargetAndSBSection(
+                target, section)
+            if symb_section:
+                obj.section_infos.append(symb_section)
+        obj.arch = module.triple
+        obj.module = module
+        obj.symfile = None
+        obj.slide = None
+        return obj
+
+    def dump(self, prefix):
+        print("%s%s" % (prefix, self))
+
+    def debug_dump(self):
+        print('path = "%s"' % (self.path))
+        print('resolved_path = "%s"' % (self.resolved_path))
+        print('resolved = %i' % (self.resolved))
+        print('unavailable = %i' % (self.unavailable))
+        print('uuid = %s' % (self.uuid))
+        print('section_infos = %s' % (self.section_infos))
+        print('identifier = "%s"' % (self.identifier))
+        print('version = %s' % (self.version))
+        print('arch = %s' % (self.arch))
+        print('module = %s' % (self.module))
+        print('symfile = "%s"' % (self.symfile))
+        print('slide = %i (0x%x)' % (self.slide, self.slide))
+
+    def __str__(self):
+        s = ''
+        if self.uuid:
+            s += "%s " % (self.get_uuid())
+        if self.arch:
+            s += "%s " % (self.arch)
+        if self.version:
+            s += "%s " % (self.version)
+        resolved_path = self.get_resolved_path()
+        if resolved_path:
+            s += "%s " % (resolved_path)
+        for section_info in self.section_infos:
+            s += ", %s" % (section_info)
+        if self.slide is not None:
+            s += ', slide = 0x%16.16x' % self.slide
+        return s
+
+    def add_section(self, section):
+        # print "added '%s' to '%s'" % (section, self.path)
+        self.section_infos.append(section)
+
+    def get_section_containing_load_addr(self, load_addr):
+        for section_info in self.section_infos:
+            if section_info.contains(load_addr):
+                return section_info
+        return None
+
+    def get_resolved_path(self):
+        if self.resolved_path:
+            return self.resolved_path
+        elif self.path:
+            return self.path
+        return None
+
+    def get_resolved_path_basename(self):
+        path = self.get_resolved_path()
+        if path:
+            return os.path.basename(path)
+        return None
+
+    def symfile_basename(self):
+        if self.symfile:
+            return os.path.basename(self.symfile)
+        return None
+
+    def has_section_load_info(self):
+        return self.section_infos or self.slide is not None
+
+    def load_module(self, target):
+        if self.unavailable:
+            return None  # We already warned that we couldn't find this module, so don't return an error string
+        # Load this module into "target" using the section infos to
+        # set the section load addresses
+        if self.has_section_load_info():
+            if target:
+                if self.module:
+                    if self.section_infos:
+                        num_sections_loaded = 0
+                        for section_info in self.section_infos:
+                            if section_info.name:
+                                section = self.module.FindSection(
+                                    section_info.name)
+                                if section:
+                                    error = target.SetSectionLoadAddress(
+                                        section, section_info.start_addr)
+                                    if error.Success():
+                                        num_sections_loaded += 1
+                                    else:
+                                        return 'error: %s' % error.GetCString()
+                                else:
+                                    return 'error: unable to find the section named "%s"' % section_info.name
+                            else:
+                                return 'error: unable to find "%s" section in "%s"' % (
+                                    range.name, self.get_resolved_path())
+                        if num_sections_loaded == 0:
+                            return 'error: no sections were successfully loaded'
+                    else:
+                        err = target.SetModuleLoadAddress(
+                            self.module, self.slide)
+                        if err.Fail():
+                            return err.GetCString()
+                    return None
+                else:
+                    return 'error: invalid module'
+            else:
+                return 'error: invalid target'
+        else:
+            return 'error: no section infos'
+
+    def add_module(self, target):
+        '''Add the Image described in this object to "target" and load the sections if "load" is True.'''
+        if target:
+            # Try and find using UUID only first so that paths need not match
+            # up
+            uuid_str = self.get_normalized_uuid_string()
+            if uuid_str:
+                self.module = target.AddModule(None, None, uuid_str)
+            if not self.module:
+                self.locate_module_and_debug_symbols()
+                if self.unavailable:
+                    return None
+                resolved_path = self.get_resolved_path()
+                self.module = target.AddModule(
+                    resolved_path, self.arch, uuid_str, self.symfile)
+            if not self.module:
+                return 'error: unable to get module for (%s) "%s"' % (
+                    self.arch, self.get_resolved_path())
+            if self.has_section_load_info():
+                return self.load_module(target)
+            else:
+                return None  # No sections, the module was added to the target, so success
+        else:
+            return 'error: invalid target'
+
+    def locate_module_and_debug_symbols(self):
+        # By default, just use the paths that were supplied in:
+        # self.path
+        # self.resolved_path
+        # self.module
+        # self.symfile
+        # Subclasses can inherit from this class and override this function
+        self.resolved = True
+        return True
+
+    def get_uuid(self):
+        if not self.uuid and self.module:
+            self.uuid = uuid.UUID(self.module.GetUUIDString())
+        return self.uuid
+
+    def get_normalized_uuid_string(self):
+        if self.uuid:
+            return str(self.uuid).upper()
+        return None
+
+    def create_target(self):
+        '''Create a target using the information in this Image object.'''
+        if self.unavailable:
+            return None
+
+        if self.locate_module_and_debug_symbols():
+            resolved_path = self.get_resolved_path()
+            path_spec = lldb.SBFileSpec(resolved_path)
+            #result.PutCString ('plist[%s] = %s' % (uuid, self.plist))
+            error = lldb.SBError()
+            target = lldb.debugger.CreateTarget(
+                resolved_path, self.arch, None, False, error)
+            if target:
+                self.module = target.FindModule(path_spec)
+                if self.has_section_load_info():
+                    err = self.load_module(target)
+                    if err:
+                        print('ERROR: ', err)
+                return target
+            else:
+                print('error: unable to create a valid target for (%s) "%s"' % (self.arch, self.path))
+        else:
+            print('error: unable to locate main executable (%s) "%s"' % (self.arch, self.path))
+        return None
+
+
+class Symbolicator:
+
+    def __init__(self):
+        """A class the represents the information needed to symbolicate addresses in a program"""
+        self.target = None
+        self.images = list()  # a list of images to be used when symbolicating
+        self.addr_mask = 0xffffffffffffffff
+
+    @classmethod
+    def InitWithSBTarget(cls, target):
+        obj = cls()
+        obj.target = target
+        obj.images = list()
+        triple = target.triple
+        if triple:
+            arch = triple.split('-')[0]
+            if "arm" in arch:
+                obj.addr_mask = 0xfffffffffffffffe
+
+        for module in target.modules:
+            image = Image.InitWithSBTargetAndSBModule(target, module)
+            obj.images.append(image)
+        return obj
+
+    def __str__(self):
+        s = "Symbolicator:\n"
+        if self.target:
+            s += "Target = '%s'\n" % (self.target)
+            s += "Target modules:\n"
+            for m in self.target.modules:
+                s += str(m) + "\n"
+        s += "Images:\n"
+        for image in self.images:
+            s += '    %s\n' % (image)
+        return s
+
+    def find_images_with_identifier(self, identifier):
+        images = list()
+        for image in self.images:
+            if image.identifier == identifier:
+                images.append(image)
+        if len(images) == 0:
+            regex_text = '^.*\.%s$' % (re.escape(identifier))
+            regex = re.compile(regex_text)
+            for image in self.images:
+                if regex.match(image.identifier):
+                    images.append(image)
+        return images
+
+    def find_image_containing_load_addr(self, load_addr):
+        for image in self.images:
+            if image.get_section_containing_load_addr(load_addr):
+                return image
+        return None
+
+    def create_target(self):
+        if self.target:
+            return self.target
+
+        if self.images:
+            for image in self.images:
+                self.target = image.create_target()
+                if self.target:
+                    if self.target.GetAddressByteSize() == 4:
+                        triple = self.target.triple
+                        if triple:
+                            arch = triple.split('-')[0]
+                            if "arm" in arch:
+                                self.addr_mask = 0xfffffffffffffffe
+                    return self.target
+        return None
+
+    def symbolicate(self, load_addr, verbose=False):
+        if not self.target:
+            self.create_target()
+        if self.target:
+            live_process = False
+            process = self.target.process
+            if process:
+                state = process.state
+                if state > lldb.eStateUnloaded and state < lldb.eStateDetached:
+                    live_process = True
+            # If we don't have a live process, we can attempt to find the image
+            # that a load address belongs to and lazily load its module in the
+            # target, but we shouldn't do any of this if we have a live process
+            if not live_process:
+                image = self.find_image_containing_load_addr(load_addr)
+                if image:
+                    image.add_module(self.target)
+            symbolicated_address = Address(self.target, load_addr)
+            if symbolicated_address.symbolicate(verbose):
+                if symbolicated_address.so_addr:
+                    symbolicated_addresses = list()
+                    symbolicated_addresses.append(symbolicated_address)
+                    # See if we were able to reconstruct anything?
+                    while True:
+                        inlined_parent_so_addr = lldb.SBAddress()
+                        inlined_parent_sym_ctx = symbolicated_address.sym_ctx.GetParentOfInlinedScope(
+                            symbolicated_address.so_addr, inlined_parent_so_addr)
+                        if not inlined_parent_sym_ctx:
+                            break
+                        if not inlined_parent_so_addr:
+                            break
+
+                        symbolicated_address = Address(
+                            self.target, inlined_parent_so_addr.GetLoadAddress(
+                                self.target))
+                        symbolicated_address.sym_ctx = inlined_parent_sym_ctx
+                        symbolicated_address.so_addr = inlined_parent_so_addr
+                        symbolicated_address.symbolicate(verbose)
+
+                        # push the new frame onto the new frame stack
+                        symbolicated_addresses.append(symbolicated_address)
+
+                    if symbolicated_addresses:
+                        return symbolicated_addresses
+        else:
+            print('error: no target in Symbolicator')
+        return None
+
+
+def disassemble_instructions(
+        target,
+        instructions,
+        pc,
+        insts_before_pc,
+        insts_after_pc,
+        non_zeroeth_frame):
+    lines = list()
+    pc_index = -1
+    comment_column = 50
+    for inst_idx, inst in enumerate(instructions):
+        inst_pc = inst.GetAddress().GetLoadAddress(target)
+        if pc == inst_pc:
+            pc_index = inst_idx
+        mnemonic = inst.GetMnemonic(target)
+        operands = inst.GetOperands(target)
+        comment = inst.GetComment(target)
+        #data = inst.GetData (target)
+        lines.append("%#16.16x: %8s %s" % (inst_pc, mnemonic, operands))
+        if comment:
+            line_len = len(lines[-1])
+            if line_len < comment_column:
+                lines[-1] += ' ' * (comment_column - line_len)
+                lines[-1] += "; %s" % comment
+
+    if pc_index >= 0:
+        # If we are disassembling the non-zeroeth frame, we need to backup the
+        # PC by 1
+        if non_zeroeth_frame and pc_index > 0:
+            pc_index = pc_index - 1
+        if insts_before_pc == -1:
+            start_idx = 0
+        else:
+            start_idx = pc_index - insts_before_pc
+        if start_idx < 0:
+            start_idx = 0
+        if insts_before_pc == -1:
+            end_idx = inst_idx
+        else:
+            end_idx = pc_index + insts_after_pc
+        if end_idx > inst_idx:
+            end_idx = inst_idx
+        for i in range(start_idx, end_idx + 1):
+            if i == pc_index:
+                print(' -> ', lines[i])
+            else:
+                print('    ', lines[i])
+
+
+def print_module_section_data(section):
+    print(section)
+    section_data = section.GetSectionData()
+    if section_data:
+        ostream = lldb.SBStream()
+        section_data.GetDescription(ostream, section.GetFileAddress())
+        print(ostream.GetData())
+
+
+def print_module_section(section, depth):
+    print(section)
+    if depth > 0:
+        num_sub_sections = section.GetNumSubSections()
+        for sect_idx in range(num_sub_sections):
+            print_module_section(
+                section.GetSubSectionAtIndex(sect_idx), depth - 1)
+
+
+def print_module_sections(module, depth):
+    for sect in module.section_iter():
+        print_module_section(sect, depth)
+
+
+def print_module_symbols(module):
+    for sym in module:
+        print(sym)
+
+
+def Symbolicate(command_args):
+
+    usage = "usage: %prog [options] <addr1> [addr2 ...]"
+    description = '''Symbolicate one or more addresses using LLDB's python scripting API..'''
+    parser = optparse.OptionParser(
+        description=description,
+        prog='crashlog.py',
+        usage=usage)
+    parser.add_option(
+        '-v',
+        '--verbose',
+        action='store_true',
+        dest='verbose',
+        help='display verbose debug info',
+        default=False)
+    parser.add_option(
+        '-p',
+        '--platform',
+        type='string',
+        metavar='platform',
+        dest='platform',
+        help='Specify the platform to use when creating the debug target. Valid values include "localhost", "darwin-kernel", "ios-simulator", "remote-freebsd", "remote-macosx", "remote-ios", "remote-linux".')
+    parser.add_option(
+        '-f',
+        '--file',
+        type='string',
+        metavar='file',
+        dest='file',
+        help='Specify a file to use when symbolicating')
+    parser.add_option(
+        '-a',
+        '--arch',
+        type='string',
+        metavar='arch',
+        dest='arch',
+        help='Specify a architecture to use when symbolicating')
+    parser.add_option(
+        '-s',
+        '--slide',
+        type='int',
+        metavar='slide',
+        dest='slide',
+        help='Specify the slide to use on the file specified with the --file option',
+        default=None)
+    parser.add_option(
+        '--section',
+        type='string',
+        action='append',
+        dest='section_strings',
+        help='specify <sect-name>=<start-addr> or <sect-name>=<start-addr>-<end-addr>')
+    try:
+        (options, args) = parser.parse_args(command_args)
+    except:
+        return
+    symbolicator = Symbolicator()
+    images = list()
+    if options.file:
+        image = Image(options.file)
+        image.arch = options.arch
+        # Add any sections that were specified with one or more --section
+        # options
+        if options.section_strings:
+            for section_str in options.section_strings:
+                section = Section()
+                if section.set_from_string(section_str):
+                    image.add_section(section)
+                else:
+                    sys.exit(1)
+        if options.slide is not None:
+            image.slide = options.slide
+        symbolicator.images.append(image)
+
+    target = symbolicator.create_target()
+    if options.verbose:
+        print(symbolicator)
+    if target:
+        for addr_str in args:
+            addr = int(addr_str, 0)
+            symbolicated_addrs = symbolicator.symbolicate(
+                addr, options.verbose)
+            for symbolicated_addr in symbolicated_addrs:
+                print(symbolicated_addr)
+            print()
+    else:
+        print('error: no target for %s' % (symbolicator))
+
+if __name__ == '__main__':
+    # Create a new debugger instance
+    lldb.debugger = lldb.SBDebugger.Create()
+    Symbolicate(sys.argv[1:])
diff --git a/linux-x64/clang/lib/python2.7/site-packages/six.py b/linux-x64/clang/lib/python2.7/site-packages/six.py
new file mode 100644
index 0000000..0df2e25
--- /dev/null
+++ b/linux-x64/clang/lib/python2.7/site-packages/six.py
@@ -0,0 +1,887 @@
+"""Utilities for writing code that runs on Python 2 and 3"""
+
+# Copyright (c) 2010-2015 Benjamin Peterson
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from __future__ import absolute_import
+
+import functools
+import itertools
+import operator
+import sys
+import types
+
+__author__ = "Benjamin Peterson <benjamin@python.org>"
+__version__ = "1.10.0"
+
+
+# Useful for very coarse version differentiation.
+PY2 = sys.version_info[0] == 2
+PY3 = sys.version_info[0] == 3
+PY34 = sys.version_info[0:2] >= (3, 4)
+
+if PY3:
+    string_types = str,
+    integer_types = int,
+    class_types = type,
+    text_type = str
+    binary_type = bytes
+
+    MAXSIZE = sys.maxsize
+else:
+    string_types = basestring,
+    integer_types = (int, long)
+    class_types = (type, types.ClassType)
+    text_type = unicode
+    binary_type = str
+
+    if sys.platform.startswith("java"):
+        # Jython always uses 32 bits.
+        MAXSIZE = int((1 << 31) - 1)
+    else:
+        # It's possible to have sizeof(long) != sizeof(Py_ssize_t).
+        class X(object):
+
+            def __len__(self):
+                return 1 << 31
+        try:
+            len(X())
+        except OverflowError:
+            # 32-bit
+            MAXSIZE = int((1 << 31) - 1)
+        else:
+            # 64-bit
+            MAXSIZE = int((1 << 63) - 1)
+        del X
+
+
+def _add_doc(func, doc):
+    """Add documentation to a function."""
+    func.__doc__ = doc
+
+
+def _import_module(name):
+    """Import module, returning the module after the last dot."""
+    __import__(name)
+    return sys.modules[name]
+
+
+class _LazyDescr(object):
+
+    def __init__(self, name):
+        self.name = name
+
+    def __get__(self, obj, tp):
+        result = self._resolve()
+        setattr(obj, self.name, result)  # Invokes __set__.
+        try:
+            # This is a bit ugly, but it avoids running this again by
+            # removing this descriptor.
+            delattr(obj.__class__, self.name)
+        except AttributeError:
+            pass
+        return result
+
+
+class MovedModule(_LazyDescr):
+
+    def __init__(self, name, old, new=None):
+        super(MovedModule, self).__init__(name)
+        if PY3:
+            if new is None:
+                new = name
+            self.mod = new
+        else:
+            self.mod = old
+
+    def _resolve(self):
+        return _import_module(self.mod)
+
+    def __getattr__(self, attr):
+        _module = self._resolve()
+        value = getattr(_module, attr)
+        setattr(self, attr, value)
+        return value
+
+
+class _LazyModule(types.ModuleType):
+
+    def __init__(self, name):
+        super(_LazyModule, self).__init__(name)
+        self.__doc__ = self.__class__.__doc__
+
+    def __dir__(self):
+        attrs = ["__doc__", "__name__"]
+        attrs += [attr.name for attr in self._moved_attributes]
+        return attrs
+
+    # Subclasses should override this
+    _moved_attributes = []
+
+
+class MovedAttribute(_LazyDescr):
+
+    def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
+        super(MovedAttribute, self).__init__(name)
+        if PY3:
+            if new_mod is None:
+                new_mod = name
+            self.mod = new_mod
+            if new_attr is None:
+                if old_attr is None:
+                    new_attr = name
+                else:
+                    new_attr = old_attr
+            self.attr = new_attr
+        else:
+            self.mod = old_mod
+            if old_attr is None:
+                old_attr = name
+            self.attr = old_attr
+
+    def _resolve(self):
+        module = _import_module(self.mod)
+        return getattr(module, self.attr)
+
+
+class _SixMetaPathImporter(object):
+
+    """
+    A meta path importer to import six.moves and its submodules.
+
+    This class implements a PEP302 finder and loader. It should be compatible
+    with Python 2.5 and all existing versions of Python3
+    """
+
+    def __init__(self, six_module_name):
+        self.name = six_module_name
+        self.known_modules = {}
+
+    def _add_module(self, mod, *fullnames):
+        for fullname in fullnames:
+            self.known_modules[self.name + "." + fullname] = mod
+
+    def _get_module(self, fullname):
+        return self.known_modules[self.name + "." + fullname]
+
+    def find_module(self, fullname, path=None):
+        if fullname in self.known_modules:
+            return self
+        return None
+
+    def __get_module(self, fullname):
+        try:
+            return self.known_modules[fullname]
+        except KeyError:
+            raise ImportError("This loader does not know module " + fullname)
+
+    def load_module(self, fullname):
+        try:
+            # in case of a reload
+            return sys.modules[fullname]
+        except KeyError:
+            pass
+        mod = self.__get_module(fullname)
+        if isinstance(mod, MovedModule):
+            mod = mod._resolve()
+        else:
+            mod.__loader__ = self
+        sys.modules[fullname] = mod
+        return mod
+
+    def is_package(self, fullname):
+        """
+        Return true, if the named module is a package.
+
+        We need this method to get correct spec objects with
+        Python 3.4 (see PEP451)
+        """
+        return hasattr(self.__get_module(fullname), "__path__")
+
+    def get_code(self, fullname):
+        """Return None
+
+        Required, if is_package is implemented"""
+        self.__get_module(fullname)  # eventually raises ImportError
+        return None
+    get_source = get_code  # same as get_code
+
+_importer = _SixMetaPathImporter(__name__)
+
+
+class _MovedItems(_LazyModule):
+
+    """Lazy loading of moved objects"""
+    __path__ = []  # mark as package
+
+
+_moved_attributes = [
+    MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"),
+    MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
+    MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"),
+    MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
+    MovedAttribute("intern", "__builtin__", "sys"),
+    MovedAttribute("map", "itertools", "builtins", "imap", "map"),
+    MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"),
+    MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"),
+    MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
+    MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"),
+    MovedAttribute("reduce", "__builtin__", "functools"),
+    MovedAttribute("shlex_quote", "pipes", "shlex", "quote"),
+    MovedAttribute("StringIO", "StringIO", "io"),
+    MovedAttribute("UserDict", "UserDict", "collections"),
+    MovedAttribute("UserList", "UserList", "collections"),
+    MovedAttribute("UserString", "UserString", "collections"),
+    MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
+    MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
+    MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"),
+    MovedModule("builtins", "__builtin__"),
+    MovedModule("configparser", "ConfigParser"),
+    MovedModule("copyreg", "copy_reg"),
+    MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
+    MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"),
+    MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
+    MovedModule("http_cookies", "Cookie", "http.cookies"),
+    MovedModule("html_entities", "htmlentitydefs", "html.entities"),
+    MovedModule("html_parser", "HTMLParser", "html.parser"),
+    MovedModule("http_client", "httplib", "http.client"),
+    MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
+    MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"),
+    MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
+    MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
+    MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
+    MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
+    MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
+    MovedModule("cPickle", "cPickle", "pickle"),
+    MovedModule("queue", "Queue"),
+    MovedModule("reprlib", "repr"),
+    MovedModule("socketserver", "SocketServer"),
+    MovedModule("_thread", "thread", "_thread"),
+    MovedModule("tkinter", "Tkinter"),
+    MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
+    MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
+    MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
+    MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
+    MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
+    MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"),
+    MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
+    MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
+    MovedModule("tkinter_colorchooser", "tkColorChooser",
+                "tkinter.colorchooser"),
+    MovedModule("tkinter_commondialog", "tkCommonDialog",
+                "tkinter.commondialog"),
+    MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
+    MovedModule("tkinter_font", "tkFont", "tkinter.font"),
+    MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
+    MovedModule("tkinter_tksimpledialog", "tkSimpleDialog",
+                "tkinter.simpledialog"),
+    MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"),
+    MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"),
+    MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"),
+    MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
+    MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"),
+    MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"),
+]
+# Add windows specific modules.
+if sys.platform == "win32":
+    _moved_attributes += [
+        MovedModule("winreg", "_winreg"),
+    ]
+
+for attr in _moved_attributes:
+    setattr(_MovedItems, attr.name, attr)
+    if isinstance(attr, MovedModule):
+        _importer._add_module(attr, "moves." + attr.name)
+del attr
+
+_MovedItems._moved_attributes = _moved_attributes
+
+moves = _MovedItems(__name__ + ".moves")
+_importer._add_module(moves, "moves")
+
+
+class Module_six_moves_urllib_parse(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_parse"""
+
+
+_urllib_parse_moved_attributes = [
+    MovedAttribute("ParseResult", "urlparse", "urllib.parse"),
+    MovedAttribute("SplitResult", "urlparse", "urllib.parse"),
+    MovedAttribute("parse_qs", "urlparse", "urllib.parse"),
+    MovedAttribute("parse_qsl", "urlparse", "urllib.parse"),
+    MovedAttribute("urldefrag", "urlparse", "urllib.parse"),
+    MovedAttribute("urljoin", "urlparse", "urllib.parse"),
+    MovedAttribute("urlparse", "urlparse", "urllib.parse"),
+    MovedAttribute("urlsplit", "urlparse", "urllib.parse"),
+    MovedAttribute("urlunparse", "urlparse", "urllib.parse"),
+    MovedAttribute("urlunsplit", "urlparse", "urllib.parse"),
+    MovedAttribute("quote", "urllib", "urllib.parse"),
+    MovedAttribute("quote_plus", "urllib", "urllib.parse"),
+    MovedAttribute("unquote", "urllib", "urllib.parse"),
+    MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
+    MovedAttribute("urlencode", "urllib", "urllib.parse"),
+    MovedAttribute("splitquery", "urllib", "urllib.parse"),
+    MovedAttribute("splittag", "urllib", "urllib.parse"),
+    MovedAttribute("splituser", "urllib", "urllib.parse"),
+    MovedAttribute("uses_fragment", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_netloc", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_params", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_query", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_relative", "urlparse", "urllib.parse"),
+]
+for attr in _urllib_parse_moved_attributes:
+    setattr(Module_six_moves_urllib_parse, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes
+
+_importer._add_module(
+    Module_six_moves_urllib_parse(
+        __name__ +
+        ".moves.urllib_parse"),
+    "moves.urllib_parse",
+    "moves.urllib.parse")
+
+
+class Module_six_moves_urllib_error(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_error"""
+
+
+_urllib_error_moved_attributes = [
+    MovedAttribute("URLError", "urllib2", "urllib.error"),
+    MovedAttribute("HTTPError", "urllib2", "urllib.error"),
+    MovedAttribute("ContentTooShortError", "urllib", "urllib.error"),
+]
+for attr in _urllib_error_moved_attributes:
+    setattr(Module_six_moves_urllib_error, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes
+
+_importer._add_module(
+    Module_six_moves_urllib_error(
+        __name__ +
+        ".moves.urllib.error"),
+    "moves.urllib_error",
+    "moves.urllib.error")
+
+
+class Module_six_moves_urllib_request(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_request"""
+
+
+_urllib_request_moved_attributes = [
+    MovedAttribute("urlopen", "urllib2", "urllib.request"),
+    MovedAttribute("install_opener", "urllib2", "urllib.request"),
+    MovedAttribute("build_opener", "urllib2", "urllib.request"),
+    MovedAttribute("pathname2url", "urllib", "urllib.request"),
+    MovedAttribute("url2pathname", "urllib", "urllib.request"),
+    MovedAttribute("getproxies", "urllib", "urllib.request"),
+    MovedAttribute("Request", "urllib2", "urllib.request"),
+    MovedAttribute("OpenerDirector", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyHandler", "urllib2", "urllib.request"),
+    MovedAttribute("BaseHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"),
+    MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"),
+    MovedAttribute("FileHandler", "urllib2", "urllib.request"),
+    MovedAttribute("FTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("UnknownHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
+    MovedAttribute("urlretrieve", "urllib", "urllib.request"),
+    MovedAttribute("urlcleanup", "urllib", "urllib.request"),
+    MovedAttribute("URLopener", "urllib", "urllib.request"),
+    MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
+    MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
+]
+for attr in _urllib_request_moved_attributes:
+    setattr(Module_six_moves_urllib_request, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes
+
+_importer._add_module(
+    Module_six_moves_urllib_request(
+        __name__ +
+        ".moves.urllib.request"),
+    "moves.urllib_request",
+    "moves.urllib.request")
+
+
+class Module_six_moves_urllib_response(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_response"""
+
+
+_urllib_response_moved_attributes = [
+    MovedAttribute("addbase", "urllib", "urllib.response"),
+    MovedAttribute("addclosehook", "urllib", "urllib.response"),
+    MovedAttribute("addinfo", "urllib", "urllib.response"),
+    MovedAttribute("addinfourl", "urllib", "urllib.response"),
+]
+for attr in _urllib_response_moved_attributes:
+    setattr(Module_six_moves_urllib_response, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes
+
+_importer._add_module(
+    Module_six_moves_urllib_response(
+        __name__ +
+        ".moves.urllib.response"),
+    "moves.urllib_response",
+    "moves.urllib.response")
+
+
+class Module_six_moves_urllib_robotparser(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_robotparser"""
+
+
+_urllib_robotparser_moved_attributes = [
+    MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"),
+]
+for attr in _urllib_robotparser_moved_attributes:
+    setattr(Module_six_moves_urllib_robotparser, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes
+
+_importer._add_module(
+    Module_six_moves_urllib_robotparser(
+        __name__ + ".moves.urllib.robotparser"),
+    "moves.urllib_robotparser",
+    "moves.urllib.robotparser")
+
+
+class Module_six_moves_urllib(types.ModuleType):
+
+    """Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
+    __path__ = []  # mark as package
+    parse = _importer._get_module("moves.urllib_parse")
+    error = _importer._get_module("moves.urllib_error")
+    request = _importer._get_module("moves.urllib_request")
+    response = _importer._get_module("moves.urllib_response")
+    robotparser = _importer._get_module("moves.urllib_robotparser")
+
+    def __dir__(self):
+        return ['parse', 'error', 'request', 'response', 'robotparser']
+
+_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"),
+                      "moves.urllib")
+
+
+def add_move(move):
+    """Add an item to six.moves."""
+    setattr(_MovedItems, move.name, move)
+
+
+def remove_move(name):
+    """Remove item from six.moves."""
+    try:
+        delattr(_MovedItems, name)
+    except AttributeError:
+        try:
+            del moves.__dict__[name]
+        except KeyError:
+            raise AttributeError("no such move, %r" % (name,))
+
+
+if PY3:
+    _meth_func = "__func__"
+    _meth_self = "__self__"
+
+    _func_closure = "__closure__"
+    _func_code = "__code__"
+    _func_defaults = "__defaults__"
+    _func_globals = "__globals__"
+else:
+    _meth_func = "im_func"
+    _meth_self = "im_self"
+
+    _func_closure = "func_closure"
+    _func_code = "func_code"
+    _func_defaults = "func_defaults"
+    _func_globals = "func_globals"
+
+
+try:
+    advance_iterator = next
+except NameError:
+    def advance_iterator(it):
+        return it.next()
+next = advance_iterator
+
+
+try:
+    callable = callable
+except NameError:
+    def callable(obj):
+        return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
+
+
+if PY3:
+    def get_unbound_function(unbound):
+        return unbound
+
+    create_bound_method = types.MethodType
+
+    def create_unbound_method(func, cls):
+        return func
+
+    Iterator = object
+else:
+    def get_unbound_function(unbound):
+        return unbound.im_func
+
+    def create_bound_method(func, obj):
+        return types.MethodType(func, obj, obj.__class__)
+
+    def create_unbound_method(func, cls):
+        return types.MethodType(func, None, cls)
+
+    class Iterator(object):
+
+        def next(self):
+            return type(self).__next__(self)
+
+    callable = callable
+_add_doc(get_unbound_function,
+         """Get the function out of a possibly unbound function""")
+
+
+get_method_function = operator.attrgetter(_meth_func)
+get_method_self = operator.attrgetter(_meth_self)
+get_function_closure = operator.attrgetter(_func_closure)
+get_function_code = operator.attrgetter(_func_code)
+get_function_defaults = operator.attrgetter(_func_defaults)
+get_function_globals = operator.attrgetter(_func_globals)
+
+
+if PY3:
+    def iterkeys(d, **kw):
+        return iter(d.keys(**kw))
+
+    def itervalues(d, **kw):
+        return iter(d.values(**kw))
+
+    def iteritems(d, **kw):
+        return iter(d.items(**kw))
+
+    def iterlists(d, **kw):
+        return iter(d.lists(**kw))
+
+    viewkeys = operator.methodcaller("keys")
+
+    viewvalues = operator.methodcaller("values")
+
+    viewitems = operator.methodcaller("items")
+else:
+    def iterkeys(d, **kw):
+        return d.iterkeys(**kw)
+
+    def itervalues(d, **kw):
+        return d.itervalues(**kw)
+
+    def iteritems(d, **kw):
+        return d.iteritems(**kw)
+
+    def iterlists(d, **kw):
+        return d.iterlists(**kw)
+
+    viewkeys = operator.methodcaller("viewkeys")
+
+    viewvalues = operator.methodcaller("viewvalues")
+
+    viewitems = operator.methodcaller("viewitems")
+
+_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.")
+_add_doc(itervalues, "Return an iterator over the values of a dictionary.")
+_add_doc(iteritems,
+         "Return an iterator over the (key, value) pairs of a dictionary.")
+_add_doc(iterlists,
+         "Return an iterator over the (key, [values]) pairs of a dictionary.")
+
+
+if PY3:
+    def b(s):
+        return s.encode("latin-1")
+
+    def u(s):
+        return s
+    unichr = chr
+    import struct
+    int2byte = struct.Struct(">B").pack
+    del struct
+    byte2int = operator.itemgetter(0)
+    indexbytes = operator.getitem
+    iterbytes = iter
+    import io
+    StringIO = io.StringIO
+    BytesIO = io.BytesIO
+    _assertCountEqual = "assertCountEqual"
+    if sys.version_info[1] <= 1:
+        _assertRaisesRegex = "assertRaisesRegexp"
+        _assertRegex = "assertRegexpMatches"
+    else:
+        _assertRaisesRegex = "assertRaisesRegex"
+        _assertRegex = "assertRegex"
+else:
+    def b(s):
+        return s
+    # Workaround for standalone backslash
+
+    def u(s):
+        return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape")
+    unichr = unichr
+    int2byte = chr
+
+    def byte2int(bs):
+        return ord(bs[0])
+
+    def indexbytes(buf, i):
+        return ord(buf[i])
+    iterbytes = functools.partial(itertools.imap, ord)
+    import StringIO
+    StringIO = BytesIO = StringIO.StringIO
+    _assertCountEqual = "assertItemsEqual"
+    _assertRaisesRegex = "assertRaisesRegexp"
+    _assertRegex = "assertRegexpMatches"
+_add_doc(b, """Byte literal""")
+_add_doc(u, """Text literal""")
+
+
+def assertCountEqual(self, *args, **kwargs):
+    return getattr(self, _assertCountEqual)(*args, **kwargs)
+
+
+def assertRaisesRegex(self, *args, **kwargs):
+    return getattr(self, _assertRaisesRegex)(*args, **kwargs)
+
+
+def assertRegex(self, *args, **kwargs):
+    return getattr(self, _assertRegex)(*args, **kwargs)
+
+
+if PY3:
+    exec_ = getattr(moves.builtins, "exec")
+
+    def reraise(tp, value, tb=None):
+        if value is None:
+            value = tp()
+        if value.__traceback__ is not tb:
+            raise value.with_traceback(tb)
+        raise value
+
+else:
+    def exec_(_code_, _globs_=None, _locs_=None):
+        """Execute code in a namespace."""
+        if _globs_ is None:
+            frame = sys._getframe(1)
+            _globs_ = frame.f_globals
+            if _locs_ is None:
+                _locs_ = frame.f_locals
+            del frame
+        elif _locs_ is None:
+            _locs_ = _globs_
+        exec("""exec _code_ in _globs_, _locs_""")
+
+    exec_("""def reraise(tp, value, tb=None):
+    raise tp, value, tb
+""")
+
+
+if sys.version_info[:2] == (3, 2):
+    exec_("""def raise_from(value, from_value):
+    if from_value is None:
+        raise value
+    raise value from from_value
+""")
+elif sys.version_info[:2] > (3, 2):
+    exec_("""def raise_from(value, from_value):
+    raise value from from_value
+""")
+else:
+    def raise_from(value, from_value):
+        raise value
+
+
+print_ = getattr(moves.builtins, "print", None)
+if print_ is None:
+    def print_(*args, **kwargs):
+        """The new-style print function for Python 2.4 and 2.5."""
+        fp = kwargs.pop("file", sys.stdout)
+        if fp is None:
+            return
+
+        def write(data):
+            if not isinstance(data, basestring):
+                data = str(data)
+            # If the file has an encoding, encode unicode with it.
+            if (isinstance(fp, file) and
+                    isinstance(data, unicode) and
+                    fp.encoding is not None):
+                errors = getattr(fp, "errors", None)
+                if errors is None:
+                    errors = "strict"
+                data = data.encode(fp.encoding, errors)
+            fp.write(data)
+        want_unicode = False
+        sep = kwargs.pop("sep", None)
+        if sep is not None:
+            if isinstance(sep, unicode):
+                want_unicode = True
+            elif not isinstance(sep, str):
+                raise TypeError("sep must be None or a string")
+        end = kwargs.pop("end", None)
+        if end is not None:
+            if isinstance(end, unicode):
+                want_unicode = True
+            elif not isinstance(end, str):
+                raise TypeError("end must be None or a string")
+        if kwargs:
+            raise TypeError("invalid keyword arguments to print()")
+        if not want_unicode:
+            for arg in args:
+                if isinstance(arg, unicode):
+                    want_unicode = True
+                    break
+        if want_unicode:
+            newline = unicode("\n")
+            space = unicode(" ")
+        else:
+            newline = "\n"
+            space = " "
+        if sep is None:
+            sep = space
+        if end is None:
+            end = newline
+        for i, arg in enumerate(args):
+            if i:
+                write(sep)
+            write(arg)
+        write(end)
+if sys.version_info[:2] < (3, 3):
+    _print = print_
+
+    def print_(*args, **kwargs):
+        fp = kwargs.get("file", sys.stdout)
+        flush = kwargs.pop("flush", False)
+        _print(*args, **kwargs)
+        if flush and fp is not None:
+            fp.flush()
+
+_add_doc(reraise, """Reraise an exception.""")
+
+if sys.version_info[0:2] < (3, 4):
+    def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
+              updated=functools.WRAPPER_UPDATES):
+        def wrapper(f):
+            f = functools.wraps(wrapped, assigned, updated)(f)
+            f.__wrapped__ = wrapped
+            return f
+        return wrapper
+else:
+    wraps = functools.wraps
+
+
+def with_metaclass(meta, *bases):
+    """Create a base class with a metaclass."""
+    # This requires a bit of explanation: the basic idea is to make a dummy
+    # metaclass for one level of class instantiation that replaces itself with
+    # the actual metaclass.
+    class metaclass(meta):
+
+        def __new__(cls, name, this_bases, d):
+            return meta(name, bases, d)
+    return type.__new__(metaclass, 'temporary_class', (), {})
+
+
+def add_metaclass(metaclass):
+    """Class decorator for creating a class with a metaclass."""
+    def wrapper(cls):
+        orig_vars = cls.__dict__.copy()
+        slots = orig_vars.get('__slots__')
+        if slots is not None:
+            if isinstance(slots, str):
+                slots = [slots]
+            for slots_var in slots:
+                orig_vars.pop(slots_var)
+        orig_vars.pop('__dict__', None)
+        orig_vars.pop('__weakref__', None)
+        return metaclass(cls.__name__, cls.__bases__, orig_vars)
+    return wrapper
+
+
+def python_2_unicode_compatible(klass):
+    """
+    A decorator that defines __unicode__ and __str__ methods under Python 2.
+    Under Python 3 it does nothing.
+
+    To support Python 2 and 3 with a single code base, define a __str__ method
+    returning text and apply this decorator to the class.
+    """
+    if PY2:
+        if '__str__' not in klass.__dict__:
+            raise ValueError("@python_2_unicode_compatible cannot be applied "
+                             "to %s because it doesn't define __str__()." %
+                             klass.__name__)
+        klass.__unicode__ = klass.__str__
+        klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
+    return klass
+
+
+# Complete the moves implementation.
+# This code is at the end of this module to speed up module loading.
+# Turn this module into a package.
+__path__ = []  # required for PEP 302 and PEP 451
+__package__ = __name__  # see PEP 366 @ReservedAssignment
+if globals().get("__spec__") is not None:
+    __spec__.submodule_search_locations = []  # PEP 451 @UndefinedVariable
+# Remove other six meta path importers, since they cause problems. This can
+# happen if six is removed from sys.modules and then reloaded. (Setuptools does
+# this for some reason.)
+if sys.meta_path:
+    for i, importer in enumerate(sys.meta_path):
+        # Here's some real nastiness: Another "instance" of the six module might
+        # be floating around. Therefore, we can't use isinstance() to check for
+        # the six meta path importer, since the other six instance will have
+        # inserted an importer with different class.
+        if (type(importer).__name__ == "_SixMetaPathImporter" and
+                importer.name == __name__):
+            del sys.meta_path[i]
+            break
+    del i, importer
+# Finally, add the importer to the meta path import hook.
+sys.meta_path.append(_importer)
