Skip to content
  1. Feb 08, 2012
    • Johnny Chen's avatar
      Refine the 'watchpoint set' command to now require either the '-v' option (for... · 34ddc8db
      Johnny Chen authored
      Refine the 'watchpoint set' command to now require either the '-v' option (for watching of a variable) or
      the '-e' option (for watching of an address) to be present.
      
      Update some existing test cases with the required option and add some more test cases.
      
      Since the '-v' option takes <variable-name> and the '-e' option takes <expr> as the command arg,
      the existing infrastructure for generating the option usage can produce confusing help message,
      like:
      
        watchpoint set -e [-w <watch-type>] [-x <byte-size>] <variable-name | expr>
        watchpoint set -v [-w <watch-type>] [-x <byte-size>] <variable-name | expr>
      
      The solution adopted is to provide an extra member field to the struct CommandArgumentData called
      (uint32_t)arg_opt_set_association, whose purpose is to link this particular argument data with some
      option set(s).  Also modify the signature of CommandObject::GetFormattedCommandArguments() to:
      
        GetFormattedCommandArguments (Stream &str, uint32_t opt_set_mask = LLDB_OPT_SET_ALL)
      
      it now takes an additional opt_set_mask which can be used to generate a filtered formatted command
      args for help message.
      
      Options::GenerateOptionUsage() impl is modified to call the GetFormattedCommandArguments() appropriately.
      So that the help message now looks like:
      
        watchpoint set -e [-w <watch-type>] [-x <byte-size>] <expr>
        watchpoint set -v [-w <watch-type>] [-x <byte-size>] <variable-name>
      
      rdar://problem/10703256
      
      llvm-svn: 150032
      34ddc8db
  2. Feb 07, 2012
  3. Feb 06, 2012
    • Johnny Chen's avatar
      Add help string for 'frame variable' to link to 'watchpoint set' which allows... · fe3bdad3
      Johnny Chen authored
      Add help string for 'frame variable' to link to 'watchpoint set' which allows for using an expression to specify the address to watch for.
      
      rdar://problem/10703290
      
      llvm-svn: 149917
      fe3bdad3
    • Sean Callanan's avatar
      I left some stray debugging messages in the source · 7e2863b4
      Sean Callanan authored
      code.  Removing these.
      
      llvm-svn: 149903
      7e2863b4
    • Greg Clayton's avatar
      Almost have templatized functions working (templatized classes are already · 3c2e3ae4
      Greg Clayton authored
      working, but not functions). I need to check on a few things to make sure 
      I am registering everything correctly in the right order and in the right
      contexts.
      
      llvm-svn: 149858
      3c2e3ae4
    • Greg Clayton's avatar
      Removed all of the "#ifndef SWIG" from the SB header files since we are using · 5569e64e
      Greg Clayton authored
      interface (.i) files for each class.
      
      Changed the FindFunction class from:
      
      uint32_t
      SBTarget::FindFunctions (const char *name, 
                               uint32_t name_type_mask, 
                               bool append, 
                               lldb::SBSymbolContextList& sc_list)
      
      uint32_t
      SBModule::FindFunctions (const char *name, 
                               uint32_t name_type_mask, 
                               bool append, 
                               lldb::SBSymbolContextList& sc_list)
      
      To:
      
      lldb::SBSymbolContextList
      SBTarget::FindFunctions (const char *name, 
                               uint32_t name_type_mask = lldb::eFunctionNameTypeAny);
      
      lldb::SBSymbolContextList
      SBModule::FindFunctions (const char *name,
                               uint32_t name_type_mask = lldb::eFunctionNameTypeAny);
      
      This makes the API easier to use from python. Also added the ability to
      append a SBSymbolContext or a SBSymbolContextList to a SBSymbolContextList.
      
      Exposed properties for lldb.SBSymbolContextList in python:
      
      lldb.SBSymbolContextList.modules => list() or all lldb.SBModule objects in the list
      lldb.SBSymbolContextList.compile_units => list() or all lldb.SBCompileUnits objects in the list
      lldb.SBSymbolContextList.functions => list() or all lldb.SBFunction objects in the list
      lldb.SBSymbolContextList.blocks => list() or all lldb.SBBlock objects in the list
      lldb.SBSymbolContextList.line_entries => list() or all lldb.SBLineEntry objects in the list
      lldb.SBSymbolContextList.symbols => list() or all lldb.SBSymbol objects in the list
      
      This allows a call to the SBTarget::FindFunctions(...) and SBModule::FindFunctions(...)
      and then the result can be used to extract the desired information:
      
      sc_list = lldb.target.FindFunctions("erase")
      
      for function in sc_list.functions:
          print function
      for symbol in sc_list.symbols:
          print symbol
      
      Exposed properties for the lldb.SBSymbolContext objects in python:
      
      lldb.SBSymbolContext.module => lldb.SBModule
      lldb.SBSymbolContext.compile_unit => lldb.SBCompileUnit
      lldb.SBSymbolContext.function => lldb.SBFunction
      lldb.SBSymbolContext.block => lldb.SBBlock
      lldb.SBSymbolContext.line_entry => lldb.SBLineEntry
      lldb.SBSymbolContext.symbol => lldb.SBSymbol
      
      
      Exposed properties for the lldb.SBBlock objects in python:
      
      lldb.SBBlock.parent => lldb.SBBlock for the parent block that contains
      lldb.SBBlock.sibling => lldb.SBBlock for the sibling block to the current block
      lldb.SBBlock.first_child => lldb.SBBlock for the first child block to the current block
      lldb.SBBlock.call_site => for inline functions, return a lldb.declaration object that gives the call site file, line and column
      lldb.SBBlock.name => for inline functions this is the name of the inline function that this block represents
      lldb.SBBlock.inlined_block => returns the inlined function block that contains this block (might return itself if the current block is an inlined block)
      lldb.SBBlock.range[int] => access the address ranges for a block by index, a list() with start and end address is returned
      lldb.SBBlock.ranges => an array or all address ranges for this block
      lldb.SBBlock.num_ranges => the number of address ranges for this blcok
      
      SBFunction objects can now get the SBType and the SBBlock that represents the
      top scope of the function.
      
      SBBlock objects can now get the variable list from the current block. The value
      list returned allows varaibles to be viewed prior with no process if code
      wants to check the variables in a function. There are two ways to get a variable
      list from a SBBlock:
      
      lldb::SBValueList
      SBBlock::GetVariables (lldb::SBFrame& frame,
                             bool arguments,
                             bool locals,
                             bool statics,
                             lldb::DynamicValueType use_dynamic);
      
      lldb::SBValueList
      SBBlock::GetVariables (lldb::SBTarget& target,
                             bool arguments,
                             bool locals,
                             bool statics);
      
      When a SBFrame is used, the values returned will be locked down to the frame
      and the values will be evaluated in the context of that frame.
      
      When a SBTarget is used, global an static variables can be viewed without a
      running process.
      
      llvm-svn: 149853
      5569e64e
  4. Feb 05, 2012
    • Greg Clayton's avatar
      Made a fix that would affect anything in the anonymous namespace when looking · 3b775bff
      Greg Clayton authored
      for types and comparing decl context matches.
      
      llvm-svn: 149812
      3b775bff
    • Greg Clayton's avatar
      Added some extra comments for the declaration context comparison function · 80c26308
      Greg Clayton authored
      in the DWARF plug-in.
      
      llvm-svn: 149811
      80c26308
    • Greg Clayton's avatar
      <rdar://problem/10560053> · c9660546
      Greg Clayton authored
      Fixed "target modules list" (aliased to "image list") to output more information
      by default. Modified the "target modules list" to have a few new options:
      
      "--header" or "-h" => show the image header address
      "--offset" or "-o" => show the image header address offset from the address in the file (the slide applied to the shared library)
      
      Removed the "--symfile-basename" or "-S" option, and repurposed it to 
      "--symfile-unique" "-S" which will show the symbol file if it differs from
      the executable file.
      
      ObjectFile's can now be loaded from memory for cases where we don't have the
      files cached locally in an SDK or net mounted root. ObjectFileMachO can now
      read mach files from memory.
      
      Moved the section data reading code into the ObjectFile so that the object
      file can get the section data from Process memory if the file is only in
      memory.
      
      lldb_private::Module can now load its object file in a target with a rigid 
      slide (very common operation for most dynamic linkers) by using:
      
      bool 
      Module::SetLoadAddress (Target &target, lldb::addr_t offset, bool &changed)
      
      lldb::SBModule() now has a new constructor in the public interface:
      
      SBModule::SBModule (lldb::SBProcess &process, lldb::addr_t header_addr);
      
      This will find an appropriate ObjectFile plug-in to load an image from memory
      where the object file header is at "header_addr".
      
      llvm-svn: 149804
      c9660546
  5. Feb 04, 2012
    • Sean Callanan's avatar
      I have brought LLDB up-to-date with top of tree · 5b26f27f
      Sean Callanan authored
      LLVM/Clang.  This brings in several fixes, including:
      
      - Improvements in the Just-In-Time compiler's
        allocation of memory: the JIT now allocates
        memory in chunks of sections, improving its
        ability to generate relocations.  I have
        revamped the RecordingMemoryManager to reflect
        these changes, as well as to get the memory
        allocation and data copying out fo the
        ClangExpressionParser code.  Jim Grosbach wrote
        the updates to the JIT on the LLVM side.
      
      - A new ExternalASTSource interface to allow LLDB to
        report accurate structure layout information to
        Clang.  Previously we could only report the sizes
        of fields, not their offsets.  This meant that if
        data structures included field alignment
        directives, we could not communicate the necessary
        alignment to Clang and accesses to the data would
        fail.  Now we can (and I have update the relevant
        test case).  Thanks to Doug Gregor for implementing
        the Clang side of this fix.
      
      - The way Objective-C interfaces are completed by
        Clang has been made consistent with RecordDecls;
        with help from Doug Gregor and Greg Clayton I have
        ensured that this still works.
      
      - I have eliminated all local LLVM and Clang patches,
        committing the ones that are still relevant to LLVM
        and Clang as needed.
      
      I have tested the changes extensively locally, but
      please let me know if they cause any trouble for you.
      
      llvm-svn: 149775
      5b26f27f
    • Greg Clayton's avatar
      Allow a SBAddress to be created from a SBSection and an offset. · 819134a7
      Greg Clayton authored
      Changed the lldb.SBModule.section[<str>] property to return a single section.
      
      Added a lldb.SBSection.addr property which returns an lldb.SBAddress object.
      
      llvm-svn: 149755
      819134a7
    • Greg Clayton's avatar
      Convert all python objects in our API to use overload the __str__ method · 81e871ed
      Greg Clayton authored
      instead of the __repr__. __repr__ is a function that should return an
      expression that can be used to recreate an python object and we were using
      it to just return a human readable string.
      
      Fixed a crasher when using the new implementation of SBValue::Cast(SBType).
      
      Thread hardened lldb::SBValue and lldb::SBWatchpoint and did other general
      improvements to the API.
      
      Fixed a crasher in lldb::SBValue::GetChildMemberWithName() where we didn't
      correctly handle not having a target.
      
      llvm-svn: 149743
      81e871ed
  6. Feb 03, 2012
    • Greg Clayton's avatar
      Expose more convenience functionality in the python classes. · 7edbdfc9
      Greg Clayton authored
      lldb.SBValueList now exposes the len() method and also allows item access:
      
      lldb.SBValueList[<int>] - where <int> is an integer index into the list, returns a single lldb.SBValue which might be empty if the index is out of range
      lldb.SBValueList[<str>] - where <str> is the name to look for, returns a list() of lldb.SBValue objects with any matching values (the list might be empty if nothing matches)
      lldb.SBValueList[<re>]  - where <re> is a compiles regular expression, returns a list of lldb.SBValue objects for containing any matches or a empty list if nothing matches
      
      lldb.SBFrame now exposes:
      
      lldb.SBFrame.variables => SBValueList of all variables that are in scope
      lldb.SBFrame.vars => see lldb.SBFrame.variables
      lldb.SBFrame.locals => SBValueList of all variables that are locals in the current frame
      lldb.SBFrame.arguments => SBValueList of all variables that are arguments in the current frame
      lldb.SBFrame.args => see lldb.SBFrame.arguments
      lldb.SBFrame.statics => SBValueList of all static variables
      lldb.SBFrame.registers => SBValueList of all registers for the current frame
      lldb.SBFrame.regs => see lldb.SBFrame.registers
      
      Combine any of the above properties with the new lldb.SBValueList functionality
      and now you can do:
      
      y = lldb.frame.vars['rect.origin.y']
      
      or
      
      vars = lldb.frame.vars
      for i in range len(vars):
        print vars[i]
      
      Also expose "lldb.SBFrame.var(<str>)" where <str> can be en expression path
      for any variable or child within the variable. This makes it easier to get a
      value from the current frame like "rect.origin.y". The resulting value is also
      not a constant result as expressions will return, but a live value that will
      continue to track the current value for the variable expression path.
      
      lldb.SBValue now exposes:
      
      lldb.SBValue.unsigned => unsigned integer for the value
      lldb.SBValue.signed => a signed integer for the value
      
      llvm-svn: 149684
      7edbdfc9
    • Greg Clayton's avatar
      Fixed casting in the lldb::SBValue::Cast(SBType) function. · 9a142cf8
      Greg Clayton authored
      llvm-svn: 149673
      9a142cf8
    • Enrico Granata's avatar
      Adding support for an "equivalents map". This can be useful when compilers... · 1d261d1c
      Enrico Granata authored
      Adding support for an "equivalents map". This can be useful when compilers emit multiple, different names for the same actual type. In such scenarios, one of the type names can actually be found during a type lookup, while the others are just aliases. This can cause issues when trying to work with these aliased names and being unable to resolve them to an actual type (e.g. getting an SBType for the aliased name).
      Currently, no code is using this feature, since we can hopefully rely on the new template support in SBType to get the same stuff done, but the support is there just in case it turns out to be useful for some future need.
      
      llvm-svn: 149661
      1d261d1c
    • Greg Clayton's avatar
      Added support to SBType for getting template arguments from a SBType: · 402230e6
      Greg Clayton authored
      uint32_t
      SBType::GetNumberOfTemplateArguments ();
      
      lldb::SBType
      SBType::GetTemplateArgumentType (uint32_t idx);
      
      lldb::TemplateArgumentKind
      SBType::GetTemplateArgumentKind (uint32_t idx);
      
      Some lldb::TemplateArgumentKind values don't have a corresponding SBType
      that will be returned from SBType::GetTemplateArgumentType(). This will
      help our data formatters do their job by being able to find out the
      type of template params and do smart things with those.
      
      llvm-svn: 149658
      402230e6
    • Enrico Granata's avatar
      Added a new --omit-names (-O, uppercase letter o) option to "type summary add". · a6a60d0d
      Enrico Granata authored
      When used in conjunction with --inline-children, this option will cause the names of the values to be omitted from the output. This can be beneficial in cases such as vFloat, where it will compact the representation from
      ([0]=1,[1]=2,[2]=3,[3]=4) to (1, 2, 3, 4).
      Added a test case to check that the new option works correctly.
      Also took some time to revisit SummaryFormat and related classes and tweak them for added readability and maintainability.
      Finally, added a new class name to which the std::string summary should be applied.
      
      llvm-svn: 149644
      a6a60d0d
  7. Feb 02, 2012
  8. Feb 01, 2012
    • Johnny Chen's avatar
      Add const-ness to BreakpointLocation::IsEnabled(). · fdad6794
      Johnny Chen authored
      llvm-svn: 149523
      fdad6794
    • Greg Clayton's avatar
      Added many more python convenience accessors: · 6b2bd939
      Greg Clayton authored
      You can now access a frame in a thread using:
      
      lldb.SBThread.frame[int] -> lldb.SBFrame object for a frame in a thread
      
      Where "int" is an integer index. You can also access a list object with all of
      the frames using:
      
      lldb.SBThread.frames => list() of lldb.SBFrame objects
      
      All SB objects that give out SBAddress objects have properties named "addr"
      
      lldb.SBInstructionList now has the following convenience accessors for len() and
      instruction access using an index:
      
      insts = lldb.frame.function.instructions
      for idx in range(len(insts)):
          print insts[idx]
          
      Instruction lists can also lookup an isntruction using a lldb.SBAddress as the key:
      
      pc_inst = lldb.frame.function.instructions[lldb.frame.addr]
      
      lldb.SBProcess now exposes:
      
      lldb.SBProcess.is_alive => BOOL Check if a process is exists and is alive
      lldb.SBProcess.is_running => BOOL check if a process is running (or stepping):
      lldb.SBProcess.is_running => BOOL check if a process is currently stopped or crashed:
      lldb.SBProcess.thread[int] => lldb.SBThreads for a given "int" zero based index
      lldb.SBProcess.threads => list() containing all lldb.SBThread objects in a process
      
      SBInstruction now exposes:
      lldb.SBInstruction.mnemonic => python string for instruction mnemonic
      lldb.SBInstruction.operands => python string for instruction operands
      lldb.SBInstruction.command => python string for instruction comment
      
      SBModule now exposes:
      
      lldb.SBModule.uuid => uuid.UUID(), an UUID object from the "uuid" python module
      lldb.SBModule.symbol[int] => lldb.Symbol, lookup symbol by zero based index
      lldb.SBModule.symbol[str] => list() of lldb.Symbol objects that match "str"
      lldb.SBModule.symbol[re] => list() of lldb.Symbol objecxts that match the regex
      lldb.SBModule.symbols => list() of all symbols in a module
      
        
      SBAddress objects can now access the current load address with the "lldb.SBAddress.load_addr"
      property. The current "lldb.target" will be used to try and resolve the load address.
      
      Load addresses can also be set using this accessor:
      
      addr = lldb.SBAddress()
      addd.load_addr = 0x123023
      
      Then you can check the section and offset to see if the address got resolved.
      
      SBTarget now exposes:
      
      lldb.SBTarget.module[int] => lldb.SBModule from zero based module index
      lldb.SBTarget.module[str] => lldb.SBModule by basename or fullpath or uuid string
      lldb.SBTarget.module[uuid.UUID()] => lldb.SBModule whose UUID matches
      lldb.SBTarget.module[re] => list() of lldb.SBModule objects that match the regex
      lldb.SBTarget.modules => list() of all lldb.SBModule objects in the target
      
      SBSymbol now exposes:
      
      lldb.SBSymbol.name => python string for demangled symbol name
      lldb.SBSymbol.mangled => python string for mangled symbol name or None if there is none
      lldb.SBSymbol.type => lldb.eSymbolType enum value
      lldb.SBSymbol.addr => SBAddress object that represents the start address for this symbol (if there is one)
      lldb.SBSymbol.end_addr => SBAddress for the end address of the symbol  (if there is one)
      lldb.SBSymbol.prologue_size => pythin int containing The size of the prologue in bytes
      lldb.SBSymbol.instructions => SBInstructionList containing all instructions for this symbol
      
      SBFunction now also has these new properties in addition to what is already has:
      lldb.SBFunction.addr => SBAddress object that represents the start address for this function
      lldb.SBFunction.end_addr => SBAddress for the end address of the function
      lldb.SBFunction.instructions => SBInstructionList containing all instructions for this function
      
      SBFrame now exposes the SBAddress for the frame:
      lldb.SBFrame.addr => SBAddress which is the section offset address for the current frame PC
      
      These are all in addition to what was already added. Documentation and website
      updates coming soon.
      
      llvm-svn: 149489
      6b2bd939
    • Johnny Chen's avatar
      lldb should warn when dSYM does not match the binary. · fdc80a5c
      Johnny Chen authored
      o Symbols.cpp:
      
        Emit a warning message when dSYM does not match the binary.
      
      o warnings/uuid:
      
        Added regression test case.
      
      o lldbtest.py:
      
        Modified to allow test case writer to demand that the build command does not begin
        with a clean first; required to make TestUUIDMismatchWanring.py work.
      
      rdar://problem/10515708
      
      llvm-svn: 149465
      fdc80a5c
    • Greg Clayton's avatar
      Added a new class to the lldb python module: · 05e8d194
      Greg Clayton authored
      lldb.value()
      
      It it designed to be given a lldb.SBValue object and it allows natural
      use of a variable value:
      
          pt = lldb.value(lldb.frame.FindVariable("pt"))
          print pt
          print pt.x
          print pt.y
      
          pt = lldb.frame.FindVariable("rectangle_array")
          print rectangle_array[12]
          print rectangle_array[5].origin.x
      
      Note that array access works just fine and works on arrays or pointers:
      
      pt = lldb.frame.FindVariable("point_ptr")
      print point_ptr[5].y
      
      Also note that pointer child accesses are done using a "." instead of "->":
      
      print point_ptr.x
      
      llvm-svn: 149464
      05e8d194
    • Greg Clayton's avatar
      Added fuzz testing for when we call API calls with an invalid object. · fbf1b641
      Greg Clayton authored
      We previously weren't catching that SBValue::Cast(...) would crash
      if we had an invalid (empty) SBValue object.
      
      Cleaned up the SBType API a bit.
      
      llvm-svn: 149447
      fbf1b641
    • Jim Ingham's avatar
      Threads now store their "temporary" resume state, so we know whether they were... · 92087d86
      Jim Ingham authored
      Threads now store their "temporary" resume state, so we know whether they were suspended in the most
      recent step, and if they weren't allowed to run, don't ask questions about their state unless explicitly
      requested to do so.
      
      llvm-svn: 149443
      92087d86
  9. Jan 31, 2012
  10. Jan 30, 2012
    • Johnny Chen's avatar
      Reverted 149277 changeset. It was coded that way for a reason. · 50df1f96
      Johnny Chen authored
      llvm-svn: 149292
      50df1f96
    • Johnny Chen's avatar
      Add "watch set" command as a more general interface in conjunction with "frame var -w". · dedb67ab
      Johnny Chen authored
      Also add test cases for watching a variable as well as a location expressed as an expression.
      
      o TestMyFirstWatchpoint.py:
      
        Modified to test "watchpoint set -w write global".
      
      o TestWatchLocationWithWatchSet.py:
      
        Added to test "watchpoint set -w write -x 1 g_char_ptr + 7" where a contrived example program
        with several threads is supposed to only access the array index within the range [0..6], but
        there's some misbehaving thread writing past the range.
      
      rdar://problem/10701761
      
      llvm-svn: 149280
      dedb67ab
    • Johnny Chen's avatar
      Make BreakpointLocation::IsEnabled() consistent with the... · a5822c05
      Johnny Chen authored
      Make BreakpointLocation::IsEnabled() consistent with the BreakpointLocation::SetEnabled() implementation.
      
      llvm-svn: 149277
      a5822c05
    • Greg Clayton's avatar
      lldb::SBTarget and lldb::SBProcess are now thread hardened. They both still · acdbe816
      Greg Clayton authored
      contain shared pointers to the lldb_private::Target and lldb_private::Process
      objects respectively as we won't want the target or process just going away.
      
      Also cleaned up the lldb::SBModule to remove dangerous pointer accessors.
      
      For any code the public API files, we should always be grabbing shared 
      pointers to any objects for the current class, and any other classes prior
      to running code with them.
      
      llvm-svn: 149238
      acdbe816
    • Greg Clayton's avatar
      SBFrame is now threadsafe using some extra tricks. One issue is that stack · b9556acc
      Greg Clayton authored
      frames might go away (the object itself, not the actual logical frame) when
      we are single stepping due to the way we currently sometimes end up flushing
      frames when stepping in/out/over. They later will come back to life 
      represented by another object yet they have the same StackID. Now when you get
      a lldb::SBFrame object, it will track the frame it is initialized with until 
      the thread goes away or the StackID no longer exists in the stack for the 
      thread it was created on. It uses a weak_ptr to both the frame and thread and
      also stores the StackID. These three items allow us to determine when the
      stack frame object has gone away (the weak_ptr will be NULL) and allows us to
      find the correct frame again. In our test suite we had such cases where we
      were just getting lucky when something like this happened:
      
      1 - stop at breakpoint
      2 - get first frame in thread where we stopped
      3 - run an expression that causes the program to JIT and run code
      4 - run more expressions on the frame from step 2 which was very very luckily
          still around inside a shared pointer, yet, not part of the current 
          thread (a new stack frame object had appeared with the same stack ID and
          depth). 
          
      We now avoid all such issues and properly keep up to date, or we start 
      returning errors when the frame doesn't exist and always responds with
      invalid answers.
      
      Also fixed the UserSettingsController  (not going to rewrite this just yet)
      so that it doesn't crash on shutdown. Using weak_ptr's came in real handy to
      track when the master controller has already gone away and this allowed me to
      pull out the previous NotifyOwnerIsShuttingDown() patch as it is no longer 
      needed.
      
      llvm-svn: 149231
      b9556acc
    • Greg Clayton's avatar
      Removed the "lldb-forward-rtti.h" header file as it was designed to contain · 17a6ad05
      Greg Clayton authored
      all RTTI types, and since we don't use RTTI anymore since clang and llvm don't
      we don't really need this header file. All shared pointer definitions have
      been moved into "lldb-forward.h".
      
      Defined std::tr1::weak_ptr definitions for all of the types that inherit from
      enable_shared_from_this() in "lldb-forward.h" in preparation for thread
      hardening our public API.
      
      The first in the thread hardening check-ins. First we start with SBThread.
      We have issues in our lldb::SB API right now where if you have one object
      that is being used by two threads we have a race condition. Consider the
      following code:
      
       1    int
       2    SBThread::SomeFunction()
       3    {
       4        int result = -1;
       5        if (m_opaque_sp)
       6        {
       7            result = m_opaque_sp->DoSomething();
       8        }
       9        return result;
      10    }
      
      And now this happens:
      
      Thread 1 enters any SBThread function and checks its m_opaque_sp and is about
      to execute the code on line 7 but hasn't yet
      Thread 2 gets to run and class sb_thread.Clear() which calls m_opaque_sp.clear()
      and clears the contents of the shared pointer member
      Thread 1 now crashes when it resumes.
      
      The solution is to use std::tr1::weak_ptr. Now the SBThread class contains a
      lldb::ThreadWP (weak pointer to our lldb_private::Thread class) and this 
      function would look like:
      
       1    int
       2    SBThread::SomeFunction()
       3    {
       4        int result = -1;
       5        ThreadSP thread_sp(m_opaque_wp.lock());
       6        if (thread_sp)
       7        {
       8            result = m_opaque_sp->DoSomething();
       9        }
      10        return result;
      11    }
      
      Now we have a solid thread safe API where we get a local copy of our thread
      shared pointer from our weak_ptr and then we are guaranteed it can't go away
      during our function.
      
      So lldb::SBThread has been thread hardened, more checkins to follow shortly.
      
      llvm-svn: 149218
      17a6ad05
  11. Jan 29, 2012
    • Greg Clayton's avatar
      Switching back to using std::tr1::shared_ptr. We originally switched away · e1cd1be6
      Greg Clayton authored
      due to RTTI worries since llvm and clang don't use RTTI, but I was able to 
      switch back with no issues as far as I can tell. Once the RTTI issue wasn't
      an issue, we were looking for a way to properly track weak pointers to objects
      to solve some of the threading issues we have been running into which naturally
      led us back to std::tr1::weak_ptr. We also wanted the ability to make a shared 
      pointer from just a pointer, which is also easily solved using the 
      std::tr1::enable_shared_from_this class. 
      
      The main reason for this move back is so we can start properly having weak
      references to objects. Currently a lldb_private::Thread class has a refrence
      to its parent lldb_private::Process. This doesn't work well when we now hand
      out a SBThread object that contains a shared pointer to a lldb_private::Thread
      as this SBThread can be held onto by external clients and if they end up
      using one of these objects we can easily crash.
      
      So the next task is to start adopting std::tr1::weak_ptr where ever it makes
      sense which we can do with lldb_private::Debugger, lldb_private::Target,
      lldb_private::Process, lldb_private::Thread, lldb_private::StackFrame, and
      many more objects now that they are no longer using intrusive ref counted
      pointer objects (you can't do std::tr1::weak_ptr functionality with intrusive
      pointers).
      
      llvm-svn: 149207
      e1cd1be6
Loading