Skip to content
  1. Mar 31, 2011
    • Jim Ingham's avatar
      Convert ValueObject to explicitly maintain the Execution Context in which they... · 6035b67d
      Jim Ingham authored
      Convert ValueObject to explicitly maintain the Execution Context in which they were created, and then use that when they update themselves.  That means all the ValueObject evaluate me type functions that used to require a Frame object now do not.  I didn't remove the SBValue API's that take this now useless frame, but I added ones that don't require the frame, and marked the SBFrame taking ones as deprecated.
      
      llvm-svn: 128593
      6035b67d
  2. Mar 26, 2011
    • Greg Clayton's avatar
      Added the ability to get the min and max instruction byte size for · 357132eb
      Greg Clayton authored
      an architecture into ArchSpec:
      
      uint32_t
      ArchSpec::GetMinimumOpcodeByteSize() const;
      
      uint32_t
      ArchSpec::GetMaximumOpcodeByteSize() const;
      
      Added an AddressClass to the Instruction class in Disassembler.h.
      This allows decoded instructions to know know if they are code,
      code with alternate ISA (thumb), or even data which can be mixed
      into code. The instruction does have an address, but it is a good
      idea to cache this value so we don't have to look it up more than 
      once.
      
      Fixed an issue in Opcode::SetOpcodeBytes() where the length wasn't
      getting set.
      
      Changed:
      
      	bool
      	SymbolContextList::AppendIfUnique (const SymbolContext& sc);
      
      To:
      	bool
      	SymbolContextList::AppendIfUnique (const SymbolContext& sc, 
      									   bool merge_symbol_into_function);
      
      This function was typically being used when looking up functions
      and symbols. Now if you lookup a function, then find the symbol,
      they can be merged into the same symbol context and not cause
      multiple symbol contexts to appear in a symbol context list that
      describes the same function.
      
      Fixed the SymbolContext not equal operator which was causing mixed
      mode disassembly to not work ("disassembler --mixed --name main").
      
      Modified the disassembler classes to know about the fact we know,
      for a given architecture, what the min and max opcode byte sizes
      are. The InstructionList class was modified to return the max
      opcode byte size for all of the instructions in its list.
      These two fixes means when disassemble a list of instructions and dump 
      them and show the opcode bytes, we can format the output more 
      intelligently when showing opcode bytes. This affects any architectures
      that have varying opcode byte sizes (x86_64 and i386). Knowing the max
      opcode byte size also helps us to be able to disassemble N instructions
      without having to re-read data if we didn't read enough bytes.
      
      Added the ability to set the architecture for the disassemble command.
      This means you can easily cross disassemble data for any supported 
      architecture. I also added the ability to specify "thumb" as an 
      architecture so that we can force disassembly into thumb mode when
      needed. In GDB this was done using a hack of specifying an odd
      address when disassembling. I don't want to repeat this hack in LLDB,
      so the auto detection between ARM and thumb is failing, just specify
      thumb when disassembling:
      
      (lldb) disassemble --arch thumb --name main
      
      You can also have data in say an x86_64 file executable and disassemble
      data as any other supported architecture:
      % lldb a.out
      Current executable set to 'a.out' (x86_64).
      (lldb) b main
      (lldb) run
      (lldb) disassemble --arch thumb --count 2 --start-address 0x0000000100001080 --bytes
      0x100001080:  0xb580 push   {r7, lr}
      0x100001082:  0xaf00 add    r7, sp, #0
      
      Fixed Target::ReadMemory(...) to be able to deal with Address argument object
      that isn't section offset. When an address object was supplied that was
      out on the heap or stack, target read memory would fail. Disassembly uses
      Target::ReadMemory(...), and the example above where we disassembler thumb
      opcodes in an x86 binary was failing do to this bug.
      
      llvm-svn: 128347
      357132eb
  3. Mar 25, 2011
    • Greg Clayton's avatar
      Cleaned up the Disassembler code a bit more. You can now request a disassembler · 1080edbc
      Greg Clayton authored
      plugin by name on the command line for when there is more than one disassembler
      plugin.
      
      Taught the Opcode class to dump itself so that "disassembler -b" will dump
      the bytes correctly for each opcode type. Modified all places that were passing
      the opcode bytes buffer in so that the bytes could be displayed to just pass
      in a bool that indicates if we should dump the opcode bytes since the opcode
      now lives inside llvm_private::Instruction.
      
      llvm-svn: 128290
      1080edbc
  4. Mar 24, 2011
  5. Mar 22, 2011
  6. Mar 20, 2011
    • Greg Clayton's avatar
      Split all of the core of LLDB.framework/lldb.so into a · 7a5388bf
      Greg Clayton authored
      static archive that can be linked against. LLDB.framework/lldb.so
      exports a very controlled API. Splitting the API into a static
      library allows other tools (debugserver for now) to use the power
      of the LLDB debugger core, yet not export it as its API is not
      portable or maintainable. The Host layer and many of the other
      internal only APIs can now be statically linked against.
      
      Now LLDB.framework/lldb.so links against "liblldb-core.a" instead
      of compiling the .o files only for the shared library. This fix
      is only for compiling with Xcode as the Makefile based build already
      does this.
      
      The Xcode projecdt compiler has been changed to LLVM. Anyone using
      Xcode 3 will need to manually change the compiler back to GCC 4.2,
      or update to Xcode 4.
      
      llvm-svn: 127963
      7a5388bf
  7. Mar 17, 2011
  8. Mar 15, 2011
  9. Mar 04, 2011
  10. Feb 23, 2011
    • Greg Clayton's avatar
      Abtracted all mach-o and ELF out of ArchSpec. This patch is a modified form · 64195a2c
      Greg Clayton authored
      of Stephen Wilson's idea (thanks for the input Stephen!). What I ended up
      doing was:
      - Got rid of ArchSpec::CPU (which was a generic CPU enumeration that mimics
        the contents of llvm::Triple::ArchType). We now rely upon the llvm::Triple 
        to give us the machine type from llvm::Triple::ArchType.
      - There is a new ArchSpec::Core definition which further qualifies the CPU
        core we are dealing with into a single enumeration. If you need support for
        a new Core and want to debug it in LLDB, it must be added to this list. In
        the future we can allow for dynamic core registration, but for now it is
        hard coded.
      - The ArchSpec can now be initialized with a llvm::Triple or with a C string
        that represents the triple (it can just be an arch still like "i386").
      - The ArchSpec can still initialize itself with a architecture type -- mach-o
        with cpu type and subtype, or ELF with e_machine + e_flags -- and this will
        then get translated into the internal llvm::Triple::ArchSpec + ArchSpec::Core.
        The mach-o cpu type and subtype can be accessed using the getter functions:
        
        uint32_t
        ArchSpec::GetMachOCPUType () const;
      
        uint32_t
        ArchSpec::GetMachOCPUSubType () const;
        
        But these functions are just converting out internal llvm::Triple::ArchSpec 
        + ArchSpec::Core back into mach-o. Same goes for ELF.
      
      All code has been updated to deal with the changes.
      
      This should abstract us until later when the llvm::TargetSpec stuff gets
      finalized and we can then adopt it.
      
      llvm-svn: 126278
      64195a2c
  11. Feb 22, 2011
  12. Feb 17, 2011
  13. Feb 15, 2011
  14. Feb 10, 2011
    • Sean Callanan's avatar
      Fixes for two bugs: · 229ce2d5
      Sean Callanan authored
      - Objective-C constant strings were being
        NULL-terminated erroneously.
      
      - Empty Objective-C constant strings were not
        being generated correctly.
      
      Also added the template for a test of these
      fixes.
      
      llvm-svn: 125314
      229ce2d5
  15. Feb 05, 2011
  16. Feb 02, 2011
    • Sean Callanan's avatar
      Added a new class, ASTDumper, that provides verbose · 0917d6e5
      Sean Callanan authored
      diagnostics of Clang AST classes for the purpose of
      debugging the types LLDB produces for DWARF objects.
      
      The ASTDumper is currently only used in log output
      if you enable verbose mode in the expression log:
      
      log enable -v lldb expr
      
      Its output then appears in the log for external
      variables used by the expr command.
      
      llvm-svn: 124703
      0917d6e5
  17. Feb 01, 2011
  18. Jan 27, 2011
    • Greg Clayton's avatar
      Changed the SymbolFile::FindFunction() function calls to only return · 931180e6
      Greg Clayton authored
      lldb_private::Function objects. Previously the SymbolFileSymtab subclass
      would return lldb_private::Symbol objects when it was asked to find functions.
      
      The Module::FindFunctions (...) now take a boolean "bool include_symbols" so
      that the module can track down functions and symbols, yet functions are found
      by the SymbolFile plug-ins (through the SymbolVendor class), and symbols are
      gotten through the ObjectFile plug-ins.
      
      Fixed and issue where the DWARF parser might run into incomplete class member
      function defintions which would make clang mad when we tried to make certain
      member functions with invalid number of parameters (such as an operator=
      operator that had no parameters). Now we just avoid and don't complete these
      incomplete functions.
      
      llvm-svn: 124359
      931180e6
    • Sean Callanan's avatar
      Updated Clang to a version that supports propagating · 78e3760f
      Sean Callanan authored
      the "virtual" flag when importing a C++ function
      declaration.  Made changes to LLDB to support other
      changes in Clang.
      
      llvm-svn: 124355
      78e3760f
    • Sean Callanan's avatar
      Added error reporting to IRForTarget so that the · 3989fb92
      Sean Callanan authored
      user doesn't have to enable logging to see where
      something went wrong.
      
      llvm-svn: 124342
      3989fb92
  19. Jan 26, 2011
  20. Jan 24, 2011
    • Sean Callanan's avatar
      Fixed a bug in the expression code which caused · 9d2127ad
      Sean Callanan authored
      it to interpret a "this" variable that was merely
      a pointer -- that is, not a class pointer -- as
      meaning that the current context was inside a C++
      method.  This bug would prevent expressions from
      evaluating correctly in regular C code if there
      was a pointer variable named "this" in scope.
      
      llvm-svn: 124117
      9d2127ad
  21. Jan 23, 2011
  22. Jan 22, 2011
  23. Jan 21, 2011
  24. Jan 20, 2011
  25. Jan 19, 2011
  26. Jan 18, 2011
  27. Jan 17, 2011
    • Greg Clayton's avatar
      A few of the issue I have been trying to track down and fix have been due to · 6beaaa68
      Greg Clayton authored
      the way LLDB lazily gets complete definitions for types within the debug info.
      When we run across a class/struct/union definition in the DWARF, we will only
      parse the full definition if we need to. This works fine for top level types
      that are assigned directly to variables and arguments, but when we have a 
      variable with a class, lets say "A" for this example, that has a member:
      "B *m_b". Initially we don't need to hunt down a definition for this class
      unless we are ever asked to do something with it ("expr m_b->getDecl()" for
      example). With my previous approach to lazy type completion, we would be able
      to take a "A *a" and get a complete type for it, but we wouldn't be able to
      then do an "a->m_b->getDecl()" unless we always expanded all types within a
      class prior to handing out the type. Expanding everything is very costly and
      it would be great if there were a better way.
      
      A few months ago I worked with the llvm/clang folks to have the 
      ExternalASTSource class be able to complete classes if there weren't completed
      yet:
      
      class ExternalASTSource {
      ....
      
          virtual void
          CompleteType (clang::TagDecl *Tag);
          
          virtual void 
          CompleteType (clang::ObjCInterfaceDecl *Class);
      };
      
      This was great, because we can now have the class that is producing the AST
      (SymbolFileDWARF and SymbolFileDWARFDebugMap) sign up as external AST sources
      and the object that creates the forward declaration types can now also
      complete them anywhere within the clang type system.
      
      This patch makes a few major changes:
      - lldb_private::Module classes now own the AST context. Previously the TypeList
        objects did.
      - The DWARF parsers now sign up as an external AST sources so they can complete
        types.
      - All of the pure clang type system wrapper code we have in LLDB (ClangASTContext,
        ClangASTType, and more) can now be iterating through children of any type,
        and if a class/union/struct type (clang::RecordType or ObjC interface) 
        is found that is incomplete, we can ask the AST to get the definition. 
      - The SymbolFileDWARFDebugMap class now will create and use a single AST that
        all child SymbolFileDWARF classes will share (much like what happens when
        we have a complete linked DWARF for an executable).
        
      We will need to modify some of the ClangUserExpression code to take more 
      advantage of this completion ability in the near future. Meanwhile we should
      be better off now that we can be accessing any children of variables through
      pointers and always be able to resolve the clang type if needed.
      
      llvm-svn: 123613
      6beaaa68
  28. Jan 15, 2011
  29. Jan 13, 2011
    • Sean Callanan's avatar
      Fixed handling of explicitly-declared persistent · e1175b7c
      Sean Callanan authored
      variables.
      
      llvm-svn: 123398
      e1175b7c
    • Sean Callanan's avatar
      Implemented a major overhaul of the way variables are handled · 92adcac9
      Sean Callanan authored
      by LLDB.  Instead of being materialized into the input structure
      passed to the expression, variables are left in place and pointers
      to them are materialzied into the structure.  Variables not resident
      in memory (notably, registers) get temporary memory regions allocated
      for them.
      
      Persistent variables are the most complex part of this, because they
      are made in various ways and there are different expectations about
      their lifetime.  Persistent variables now have flags indicating their
      status and what the expectations for longevity are.  They can be
      marked as residing in target memory permanently -- this is the
      default for result variables from expressions entered on the command
      line and for explicitly declared persistent variables (but more on
      that below).  Other result variables have their memory freed.
      
      Some major improvements resulting from this include being able to
      properly take the address of variables, better and cleaner support
      for functions that return references, and cleaner C++ support in
      general.  One problem that remains is the problem of explicitly
      declared persistent variables; I have not yet implemented the code
      that makes references to them into indirect references, so currently
      materialization and dematerialization of these variables is broken.
      
      llvm-svn: 123371
      92adcac9
  30. Jan 09, 2011
    • Greg Clayton's avatar
      Put more smarts into the RegisterContext base class. Now the base class has · 3e06bd90
      Greg Clayton authored
      a method:
      
          void RegisterContext::InvalidateIfNeeded (bool force);
      
      Each time this function is called, when "force" is false, it will only call
      the pure virtual "virtual void RegisterContext::InvalideAllRegisters()" if
      the register context's stop ID doesn't match that of the process. When the
      stop ID doesn't match, or "force" is true, the base class will clear its
      cached registers and the RegisterContext will update its stop ID to match
      that of the process. This helps make it easier to correctly flush the register
      context (possibly from multiple locations depending on when and where new
      registers are availabe) without inadvertently clearing the register cache 
      when it doesn't need to be.
      
      Modified the ProcessGDBRemote plug-in to be much more efficient when it comes
      to:
      - caching the expedited registers in the stop reply packets (we were ignoring
        these before and it was causing us to read at least three registers every
        time we stopped that were already supplied in the stop reply packet).
      - When a thread has no stop reason, don't keep asking for the thread stopped
        info. Prior to this fix we would continually send a qThreadStopInfo packet
        over and over when any thread stop info was requested. We now note the stop
        ID that the stop info was requested for and avoid multiple requests.
      
      Cleaned up some of the expression code to not look for ClangExpressionVariable
      objects up by name since they are now shared pointers and we can just look for
      the exact pointer match and avoid possible errors.
      
      Fixed an bug in the ValueObject code that would cause children to not be 
      displayed.
      
      llvm-svn: 123127
      3e06bd90
  31. Jan 06, 2011
    • Greg Clayton's avatar
      Fixed issues with RegisterContext classes and the subclasses. There was · 5ccbd294
      Greg Clayton authored
      an issue with the way the UnwindLLDB was handing out RegisterContexts: it
      was making shared pointers to register contexts and then handing out just
      the pointers (which would get put into shared pointers in the thread and
      stack frame classes) and cause double free issues. MallocScribble helped to
      find these issues after I did some other cleanup. To help avoid any
      RegisterContext issue in the future, all code that deals with them now
      returns shared pointers to the register contexts so we don't end up with
      multiple deletions. Also now that the RegisterContext class doesn't require
      a stack frame, we patched a memory leak where a StackFrame object was being
      created and leaked.
      
      Made the RegisterContext class not have a pointer to a StackFrame object as
      one register context class can be used for N inlined stack frames so there is
      not a 1 - 1 mapping. Updates the ExecutionContextScope part of the 
      RegisterContext class to never return a stack frame to indicate this when it
      is asked to recreate the execution context. Now register contexts point to the
      concrete frame using a concrete frame index. Concrete frames are all of the
      frames that are actually formed on the stack of a thread. These concrete frames
      can be turned into one or more user visible frames due to inlining. Each 
      inlined stack frame has the exact same register context (shared via shared
      pointers) as any parent inlined stack frames all the way up to the concrete 
      frame itself.
      
      So now the stack frames and the register contexts should behave much better.
      
      llvm-svn: 122976
      5ccbd294
  32. Jan 04, 2011
  33. Dec 20, 2010
  34. Dec 17, 2010
    • Greg Clayton's avatar
      Added access to set the current stack frame within a thread so any command · f028a1fb
      Greg Clayton authored
      line commands can use the current thread/frame.
      
      Fixed an issue with expressions that get sandboxed in an objective C method
      where unichar wasn't being passed down.
      
      Added a "static size_t Scalar::GetMaxByteSize();" function in case we need
      to know the max supported by size of something within a Scalar object.
      
      llvm-svn: 122027
      f028a1fb
Loading