Skip to content
  1. Sep 18, 2012
  2. Feb 18, 2012
    • Greg Clayton's avatar
      The second part in thread hardening the internals of LLDB where we make · d9e416c0
      Greg Clayton authored
      the lldb_private::StackFrame objects hold onto a weak pointer to the thread
      object. The lldb_private::StackFrame objects the the most volatile objects
      we have as when we are doing single stepping, frames can often get lost or
      thrown away, only to be re-created as another object that still refers to the
      same frame. We have another bug tracking that. But we need to be able to 
      have frames no longer be able to get the thread when they are not part of
      a thread anymore, and this is the first step (this fix makes that possible
      but doesn't implement it yet).
      
      Also changed lldb_private::ExecutionContextScope to return shared pointers to
      all objects in the execution context to further thread harden the internals.
      
      llvm-svn: 150871
      d9e416c0
  3. Jun 04, 2011
  4. May 15, 2011
    • Greg Clayton's avatar
      Added generic register numbers for simple ABI argument registers and defined · 9a8fa916
      Greg Clayton authored
      the appropriate registers for arm and x86_64. The register names for the
      arguments that are the size of a pointer or less are all named "arg1", "arg2",
      etc. This allows you to read these registers by name:
      
      (lldb) register read arg1 arg2 arg3
      ...
      
      You can also now specify you want to see alternate register names when executing
      the read register command:
      
      (lldb) register read --alternate
      (lldb) register read -A
      
      llvm-svn: 131376
      9a8fa916
  5. May 11, 2011
    • Greg Clayton's avatar
      Moved all code from ArchDefaultUnwindPlan and ArchVolatileRegs into their · 31f1d2f5
      Greg Clayton authored
      respective ABI plugins as they were plug-ins that supplied ABI specfic info.
      
      Also hookep up the UnwindAssemblyInstEmulation so that it can generate the
      unwind plans for ARM.
      
      Changed the way ABI plug-ins are handed out when you get an instance from
      the plug-in manager. They used to return pointers that would be mananged
      individually by each client that requested them, but now they are handed out
      as shared pointers since there is no state in the ABI objects, they can be
      shared.
      
      llvm-svn: 131193
      31f1d2f5
  6. May 09, 2011
    • Greg Clayton's avatar
      While implementing unwind information using UnwindAssemblyInstEmulation I ran · 7349bd90
      Greg Clayton authored
      into some cleanup I have been wanting to do when reading/writing registers.
      Previously all RegisterContext subclasses would need to implement:
      
      virtual bool
      ReadRegisterBytes (uint32_t reg, DataExtractor &data);
      
      virtual bool
      WriteRegisterBytes (uint32_t reg, DataExtractor &data, uint32_t data_offset = 0);
      
      There is now a new class specifically designed to hold register values: 
              lldb_private::RegisterValue
              
      The new register context calls that subclasses must implement are:
      
      virtual bool
      ReadRegister (const RegisterInfo *reg_info, RegisterValue &reg_value) = 0;
      
      virtual bool
      WriteRegister (const RegisterInfo *reg_info, const RegisterValue &reg_value) = 0;
      
      The RegisterValue class must be big enough to handle any register value. The
      class contains an enumeration for the value type, and then a union for the 
      data value. Any integer/float values are stored directly in an appropriate
      host integer/float. Anything bigger is stored in a byte buffer that has a length
      and byte order. The RegisterValue class also knows how to copy register value
      bytes into in a buffer with a specified byte order which can be used to write
      the register value down into memory, and this does the right thing when not
      all bytes from the register values are needed (getting a uint8 from a uint32
      register value..). 
      
      All RegiterContext and other sources have been switched over to using the new
      regiter value class.
      
      llvm-svn: 131096
      7349bd90
  7. May 03, 2011
    • Caroline Tice's avatar
      · 4a3533ba
      Caroline Tice authored
      Remove type cast that was causing compiler warning.
      
      llvm-svn: 130790
      4a3533ba
  8. Apr 30, 2011
  9. Apr 27, 2011
    • Greg Clayton's avatar
      Got the EmulateInstruction CFI code a lot closer to producing CFI data. · 79ea878b
      Greg Clayton authored
      Switch the EmulateInstruction to use the standard RegisterInfo structure
      that is defined in the lldb private types intead of passing the reg kind and
      reg num everywhere. EmulateInstruction subclasses also need to provide
      RegisterInfo structs given a reg kind and reg num. This eliminates the need
      for the GetRegisterName() virtual function and allows more complete information
      to be passed around in the read/write register callbacks. Subclasses should
      always provide RegiterInfo structs with the generic register info filled in as
      well as at least one kind of register number in the RegisterInfo.kinds[] array.
      
      llvm-svn: 130256
      79ea878b
  10. Apr 26, 2011
    • Greg Clayton's avatar
      Changed the emulate instruction function to take emulate options which · 2ed751bd
      Greg Clayton authored
      are defined as enumerations. Current bits include:
      
              eEmulateInstructionOptionAutoAdvancePC
              eEmulateInstructionOptionIgnoreConditions
      
      Modified the EmulateInstruction class to have a few more pure virtuals that
      can help clients understand how many instructions the emulator can handle:
      
              virtual bool
              SupportsEmulatingIntructionsOfType (InstructionType inst_type) = 0;
      
      
      Where instruction types are defined as:
      
      //------------------------------------------------------------------
      /// Instruction types
      //------------------------------------------------------------------    
      typedef enum InstructionType
      {
          eInstructionTypeAny,                // Support for any instructions at all (at least one)
          eInstructionTypePrologueEpilogue,   // All prologue and epilogue instructons that push and pop register values and modify sp/fp
          eInstructionTypePCModifying,        // Any instruction that modifies the program counter/instruction pointer
          eInstructionTypeAll                 // All instructions of any kind
      
      }  InstructionType;
      
      
      This allows use to tell what an emulator can do and also allows us to request
      these abilities when we are finding the plug-in interface.
      
      Added the ability for an EmulateInstruction class to get the register names
      for any registers that are part of the emulation. This helps with being able
      to dump and log effectively.
      
      The UnwindAssembly class now stores the architecture it was created with in
      case it is needed later in the unwinding process.
      
      Added a function that can tell us DWARF register names for ARM that goes
      along with the source/Utility/ARM_DWARF_Registers.h file: 
      
              source/Utility/ARM_DWARF_Registers.c
              
      Took some of plug-ins out of the lldb_private namespace.
      
      llvm-svn: 130189
      2ed751bd
  11. Apr 11, 2011
  12. Apr 09, 2011
    • Caroline Tice's avatar
      · 25d61ac2
      Caroline Tice authored
      Fix various things in the instruction emulation code:
      
          - Add ability to control whether or not the emulator advances the
          PC register (in the emulation state), if the instruction itself
          does not change the pc value..
      
          - Fix a few typos in asm description strings.
      
          - Fix bug in the carry flag calculation.
      
      llvm-svn: 129168
      25d61ac2
  13. Apr 08, 2011
    • Greg Clayton's avatar
      Modified the ArchSpec to take an optional "Platform *" when setting the triple. · eb0103f2
      Greg Clayton authored
      This allows you to have a platform selected, then specify a triple using
      "i386" and have the remaining triple items (vendor, os, and environment) set
      automatically.
      
      Many interpreter commands take the "--arch" option to specify an architecture
      triple, so now the command options needed to be able to get to the current
      platform, so the Options class now take a reference to the interpreter on
      construction.
      
      Modified the build LLVM building in the Xcode project to use the new
      Xcode project level user definitions:
      
      LLVM_BUILD_DIR - a path to the llvm build directory
      LLVM_SOURCE_DIR - a path to the llvm sources for the llvm that will be used to build lldb
      LLVM_CONFIGURATION - the configuration that lldb is built for (Release, 
      Release+Asserts, Debug, Debug+Asserts).
      
      I also changed the LLVM build to not check if "lldb/llvm" is a symlink and
      then assume it is a real llvm build directory versus the unzipped llvm.zip
      package, so now you can actually have a "lldb/llvm" directory in your lldb
      sources.
      
      llvm-svn: 129112
      eb0103f2
  14. Apr 07, 2011
    • Caroline Tice's avatar
      · c1bcafd8
      Caroline Tice authored
      Translate dwarf register numbers to internal register numbers
      before trying to look them up in register contexts, in the 
      emulation callback functions that read & write the frame registers.
      
      llvm-svn: 129037
      c1bcafd8
  15. Apr 05, 2011
    • Caroline Tice's avatar
      · 3d50b2f7
      Caroline Tice authored
      Convert "process" read/write callback functions to "frame" read/write callback functions.
      
      llvm-svn: 128917
      3d50b2f7
    • Caroline Tice's avatar
      · ad379efc
      Caroline Tice authored
      Add the rest of the mechanisms to make ARM instruction emulation usable/possible.
      
      llvm-svn: 128907
      ad379efc
  16. Mar 25, 2011
    • Greg Clayton's avatar
      Made the lldb_private::Opcode struct into a real boy... I mean class. · 0ae96273
      Greg Clayton authored
      Modified the Disassembler::Instruction base class to contain an Opcode 
      instance so that we can know the bytes for an instruction without needing
      to keep the data around.
      
      Modified the DisassemblerLLVM's instruction class to correctly extract the
      opcode bytes if all goes well.
      
      llvm-svn: 128248
      0ae96273
  17. Mar 24, 2011
  18. Feb 15, 2011
  19. Feb 05, 2011
  20. Feb 04, 2011
  21. Feb 02, 2011
    • Greg Clayton's avatar
      Modified the PluginManager to be ready for loading plug-ins from a system · 4272cc7d
      Greg Clayton authored
      LLDB plugin directory and a user LLDB plugin directory. We currently still
      need to work out at what layer the plug-ins will be, but at least we are 
      prepared for plug-ins. Plug-ins will attempt to be loaded from the 
      "/Developer/Library/PrivateFrameworks/LLDB.framework/Resources/Plugins" 
      folder, and from the "~/Library/Application Support/LLDB/Plugins" folder on
      MacOSX. Each plugin will be scanned for:
      
      extern "C" bool LLDBPluginInitialize(void);
      extern "C" void LLDBPluginTerminate(void);
      
      If at least LLDBPluginInitialize is found, the plug-in will be loaded. The
      LLDBPluginInitialize function returns a bool that indicates if the plug-in
      should stay loaded or not (plug-ins might check the current OS, current
      hardware, or anything else and determine they don't want to run on the current
      host). The plug-in is uniqued by path and added to a static loaded plug-in
      map. The plug-in scanning happens during "lldb_private::Initialize()" which
      calls to the PluginManager::Initialize() function. Likewise with termination
      lldb_private::Terminate() calls PluginManager::Terminate(). The paths for the
      plug-in directories is fetched through new Host calls:
      
          bool Host::GetLLDBPath (ePathTypeLLDBSystemPlugins, dir_spec);
          bool Host::GetLLDBPath (ePathTypeLLDBUserPlugins, dir_spec);
      
      This way linux and other systems can define their own appropriate locations
      for plug-ins to be loaded.
      
      To allow dynamic shared library loading, the Host layer has also been modified
      to include shared library open, close and get symbol:
      
          static void *
          Host::DynamicLibraryOpen (const FileSpec &file_spec, 
                                    Error &error);
      
          static Error
          Host::DynamicLibraryClose (void *dynamic_library_handle);
      
          static void *
          Host::DynamicLibraryGetSymbol (void *dynamic_library_handle, 
                                        const char *symbol_name, 
                                        Error &error);
      
      lldb_private::FileSpec also has been modified to support directory enumeration
      in an attempt to abstract the directory enumeration into one spot in the code.
      The directory enumertion function is static and takes a callback:
      
      
          typedef enum EnumerateDirectoryResult
          {
              eEnumerateDirectoryResultNext,  // Enumerate next entry in the current directory
              eEnumerateDirectoryResultEnter, // Recurse into the current entry if it is a directory or symlink, or next if not
              eEnumerateDirectoryResultExit,  // Exit from the current directory at the current level.
              eEnumerateDirectoryResultQuit   // Stop directory enumerations at any level
          };
      
          typedef FileSpec::EnumerateDirectoryResult (*EnumerateDirectoryCallbackType) (void *baton,
                                                                                        FileSpec::FileType file_type,
                                                                                        const FileSpec &spec);
      
          static FileSpec::EnumerateDirectoryResult
          FileSpec::EnumerateDirectory (const char *dir_path,
                                        bool find_directories,
                                        bool find_files,
                                        bool find_other,
                                        EnumerateDirectoryCallbackType callback,
                                        void *callback_baton);
      
      This allow clients to specify the directory to search, and specifies if only
      files, directories or other (pipe, symlink, fifo, etc) files will cause the
      callback to be called. The callback also gets to return with the action that
      should be performed after this directory entry. eEnumerateDirectoryResultNext
      specifies to continue enumerating through a directory with the next entry.
      eEnumerateDirectoryResultEnter specifies to recurse down into a directory
      entry, or if the file is not a directory or symlink/alias to a directory, then
      just iterate to the next entry. eEnumerateDirectoryResultExit specifies to 
      exit the current directory and skip any entries that might be remaining, yet
      continue enumerating to the next entry in the parent directory. And finally
      eEnumerateDirectoryResultQuit means to abort all directory enumerations at 
      all levels.
      
      Modified the Declaration class to not include column information currently
      since we don't have any compilers that currently support column based 
      declaration information. Columns support can be re-enabled with the
      additions of a #define.
      
      Added the ability to find an EmulateInstruction plug-in given a target triple
      and optional plug-in name in the plug-in manager.
      
      Fixed a few cases where opendir/readdir was being used, but yet not closedir
      was being used. Soon these will be deprecated in favor of the new directory
      enumeration call that was added to the FileSpec class.
      
      llvm-svn: 124716
      4272cc7d
  22. Feb 01, 2011
  23. Jan 21, 2011
    • Greg Clayton's avatar
      Added the start of opcode emulation for ARM instructions. This class is designed · 6da4ca83
      Greg Clayton authored
      to be fed 4 callbacks: read/write memory, and read/write registers. After this,
      you can tell the object to read an instruction. This will cause the class to read
      the PC, and read and instruction. Then you can emulate the instruction by calling
      EvaluateInstruction. This will cause the class to figure out exactly what an opcode
      does, and call the read/write mem/regs functions with actual values which allows one
      to emulate an instruction without running a process, or it allows one to watch the
      context information (the memory write is a pushing register 3 onto the stack at offset
      12) so it can be used for generating call frame information. This way, in the future,
      we will have one class that can be used to emulate instructions and generate our
      unwind info from assembly.
      
      llvm-svn: 123998
      6da4ca83
Loading