Skip to content
  1. Jul 29, 2011
  2. Jul 28, 2011
  3. Jul 27, 2011
  4. Jul 26, 2011
  5. Jul 25, 2011
    • Johnny Chen's avatar
      Add a stronger assert for the test to ensure that the visited items from iterating through · ca24cfa4
      Johnny Chen authored
      the SBValue.linked_list_iter() API is equal to [1, 2, 4, 5].
      
      llvm-svn: 135944
      ca24cfa4
    • Johnny Chen's avatar
      Provide an add-on API to SBValue class by post-processing to provide a way · 48225053
      Johnny Chen authored
      to iterate through an SBValue instance by treating it as the head of a linked
      list.  API program must provide two args to the linked_list_iter() method:
      the first being the child member name which points to the next item on the list
      and the second being a Python function which an SBValue (for the next item) and
      returns True if end of list is reached, otherwise it returns False.
      
      For example, suppose we have the following sample program.
      
      #include <stdio.h>
      
      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; // Break at this line
          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);
          return 0;
      }
      
      The test program produces the following output while exercising the linked_list_iter() SBVAlue API:
      
      task_head:
      	TypeName      -> Task *
      	ByteSize      -> 8
      	NumChildren   -> 2
      	Value         -> 0x0000000106400380
      	ValueType     -> local_variable
      	Summary       -> None
      	IsPointerType -> True
      	Location      -> 0x00007fff65f06e60
      (Task *) next = 0x0000000106400390
        (int) id = 1
        (Task *) next = 0x00000001064003a0
      
      (Task *) next = 0x00000001064003a0
        (int) id = 2
        (Task *) next = 0x00000001064003c0
      
      (Task *) next = 0x00000001064003c0
        (int) id = 4
        (Task *) next = 0x00000001064003d0
      
      (Task *) next = 0x00000001064003d0
        (int) id = 5
        (Task *) next = 0x0000000000000000
      
      llvm-svn: 135938
      48225053
    • Enrico Granata's avatar
      new flag -P to type synth add lets you type a Python class interactively · c53114e3
      Enrico Granata authored
      added a final newline to fooSynthProvider.py
      new option to automatically save user input in InputReaderEZ
      checking for NULL pointers in several new places
      
      llvm-svn: 135916
      c53114e3
  6. Jul 24, 2011
    • Enrico Granata's avatar
      Python synthetic children: · a37a065c
      Enrico Granata authored
       - you can now define a Python class as a synthetic children producer for a type
         the class must adhere to this "interface":
              def __init__(self, valobj, dict):
           	def get_child_at_index(self, index):
           	def get_child_index(self, name):
         then using type synth add -l className typeName
         (e.g. type synth add -l fooSynthProvider foo)
         (This is still WIP with lots to be added)
         A small test case is available also as reference
      
      llvm-svn: 135865
      a37a065c
  7. Jul 23, 2011
    • Johnny Chen's avatar
      Add an additional formatter class RecursiveDecentFormatter which prints the · 36d7d916
      Johnny Chen authored
      value and the decendents.  For an example,
      
      rdf = lldbutil.RecursiveDecentFormatter(indent_child=2)
      print rdf.format(g_table)
      
      produces:
      
      (const char **[2]) g_table = 0x00000001055a80f0 (location)
        (const char **) [0] = 0x00000001055a8080
          (const char *) *[0] = "Sunday"
        (const char **) [1] = 0x00000001055a80c0
          (const char *) *[1] = "Monday"
      
      llvm-svn: 135815
      36d7d916
  8. Jul 22, 2011
    • Johnny Chen's avatar
      Add new API for SBAddress to the fuzz test: · 08c09100
      Johnny Chen authored
      SetLoadAddress (lldb::addr_t load_addr, 
                     	lldb::SBTarget &target);
      
      llvm-svn: 135793
      08c09100
    • Enrico Granata's avatar
      some editing of data visualization error messages to make them more meaningful · e992a089
      Enrico Granata authored
      debugging printfs() for data visualization turned into a meaningful log:
       - introduced a new log category `types' in channel `lldb'
      
      llvm-svn: 135773
      e992a089
    • Greg Clayton's avatar
      Make the SBAddress class easier to use when using the public · 00e6fbfe
      Greg Clayton authored
      API. 
      
      SBTarget changes include changing:
      
      bool
      SBTarget::ResolveLoadAddress (lldb::addr_t vm_addr, 
                                    lldb::SBAddress& addr);
      
      to be:
      
      lldb::SBAddress
      SBTarget::ResolveLoadAddress (lldb::addr_t vm_addr);
      
      SBAddress can how contruct itself using a load address and a target 
      which can be used to resolve the address:
      
      SBAddress (lldb::addr_t load_addr, lldb::SBTarget &target);
      
      This will actually just call the new SetLoadAddress accessor:
      
      void
      SetLoadAddress (lldb::addr_t load_addr, 
                      lldb::SBTarget &target);
      
      This function will always succeed in making a SBAddress object
      that can be used in API calls (even if "target" isn't valid).
      If "target" is valid and there are sections currently loaded,
      then it will resolve the address to a section offset address if
      it can. Else an address with a NULL section and an offset that is
      the "load_addr" that was passed in. We do this because a load address
      might be from the heap or stack.
      
      llvm-svn: 135770
      00e6fbfe
    • Johnny Chen's avatar
      Fix comment. · efee1cdc
      Johnny Chen authored
      llvm-svn: 135737
      efee1cdc
    • Johnny Chen's avatar
      Add BasicFormatter and ChildVisitingFormatter utility classes to the lldbutil.py module · 989b7efd
      Johnny Chen authored
      which provide some convenient ways to print an SBValue object.  Use that in TestValueAPI.py
      to print the 'days_of_week' char* array variable.
      
      For an example:
      
      cvf = lldbutil.ChildVisitingFormatter(indent=2)
      print cvf.format(days_of_week)
      
      produces:
      
      (const char *[7]) days_of_week = 0x00000001026a5060 (location)
        (const char *) [0] = "Sunday"
        (const char *) [1] = "Monday"
        (const char *) [2] = "Tuesday"
        (const char *) [3] = "Wednesday"
        (const char *) [4] = "Thursday"
        (const char *) [5] = "Friday"
        (const char *) [6] = "Saturday"
      
      llvm-svn: 135736
      989b7efd
    • Enrico Granata's avatar
      when typing a summary string you can use the %S symbol to explicitly indicate... · d55546b2
      Enrico Granata authored
      when typing a summary string you can use the %S symbol to explicitly indicate that you want the summary to be used to print the target object
       (e.g. ${var%S}). this might already be the default if your variable is of an aggregate type
      new feature: synthetic filters. you can restrict the number of children for your variables to only a meaningful subset
       - the restricted list of children obeys the typical rules (e.g. summaries prevail over children)
       - one-line summaries show only the filtered (synthetic) children, if you type an expanded summary string, or you use Python scripts, all the real children are accessible
       - to provide a synthetic children list use the "type synth add" command, as in:
         type synth add foo_type --child varA --child varB[0] --child varC->packet->flags[1-4]
         (you can use ., ->, single-item array operator [N] and bitfield operator [N-M]; array slice access is not supported, giving simplified names to expression paths is not supported)
       - a new -S option to frame variable and target variable lets you override synthetic children and instead show real ones
      
      llvm-svn: 135731
      d55546b2
    • Johnny Chen's avatar
      6cbb8d68
  9. Jul 21, 2011
  10. Jul 20, 2011
  11. Jul 19, 2011
    • Enrico Granata's avatar
      The implementation of categories is now synchronization safe · 20edcdbe
      Enrico Granata authored
      Code cleanup:
       - The Format Manager implementation is now split between two files: FormatClasses.{h|cpp} where the
         actual formatter classes (ValueFormat, SummaryFormat, ...) are implemented and
         FormatManager.{h|cpp} where the infrastructure classes (FormatNavigator, FormatManager, ...)
         are contained. The wrapper code always remains in Debugger.{h|cpp}
       - Several leftover fields, methods and comments from previous design choices have been removed
      type category subcommands (enable, disable, delete) now can take a list of category names as input
       - for type category enable, saying "enable A B C" is the same as saying
          enable C
          enable B
          enable A
         (the ordering is relevant in enabling categories, and it is expected that a user typing
          enable A B C wants to look into category A, then into B, then into C and not the other
          way round)
       - for the other two commands, the order is not really relevant (however, the same inverted ordering
         is used for consistency)
      
      llvm-svn: 135494
      20edcdbe
    • Enrico Granata's avatar
      Fixed a bug where deleting a regex summary would not immediately reflect in the variables display · 1490c6fd
      Enrico Granata authored
      The "systemwide summaries" feature has been removed and replaced with a more general and
      powerful mechanism.
      Categories:
       - summaries can now be grouped into buckets, called "categories" (it is expected that categories
         correspond to libraries and/or runtime environments)
       - to add a summary to a category, you can use the -w option to type summary add and give
         a category name (e.g. type summary add -f "foo" foo_t -w foo_category)
       - categories are by default disabled, which means LLDB will not look into them for summaries,
         to enable a category use "type category enable". once a category is enabled, LLDB will
         look into that category for summaries. the rules are quite trivial: every enabled category
         is searched for an exact match. if an exact match is nowhere to be found, any match is
         searched for in every enabled category (whether it involves cascading, going to base classes,
         ...). categories are searched into the order in which they were enabled (the most recently
         enabled category first, then the second most and so on..)
       - by default, most commands that deal with summaries, use a category named "default" if no
         explicit -w parameter is given (the observable behavior of LLDB should not change when
         categories are not explicitly used)
       - the systemwide summaries are now part of a "system" category
      
      llvm-svn: 135463
      1490c6fd
  12. Jul 16, 2011
    • Enrico Granata's avatar
      Some descriptive text for the Python script feature: · 0c5ef693
      Enrico Granata authored
       - help type summary add now gives some hints on how to use it
      frame variable and target variable now have a --no-summary-depth (-Y) option:
       - simply using -Y without an argument will skip one level of summaries, i.e.
         your aggregate types will expand their children and display no summary, even
         if they have one. children will behave normally
       - using -Y<int>, as in -Y4, -Y7, ..., will skip as many levels of summaries as
         given by the <int> parameter (obviously, -Y and -Y1 are the same thing). children
         beneath the given depth level will behave normally
       -Y0 is the same as omitting the --no-summary-depth parameter entirely
       This option replaces the defined-but-unimplemented --no-summary
      
      llvm-svn: 135336
      0c5ef693
    • Enrico Granata's avatar
      System-wide summaries: · 9dd75c88
      Enrico Granata authored
       - Summaries for char*, const char* and char[] are loaded at startup as
         system-wide summaries. This means you cannot delete them unless you use
         the -a option to type summary delete/clear
       - You can add your own system-wide summaries by using the -w option to type
         summary add
      Several code improvements for the Python summaries feature
      
      llvm-svn: 135326
      9dd75c88
    • Johnny Chen's avatar
      Add TestValueAPI.py to exercise the newly added/modified SBValue APIs: · 5819ab49
      Johnny Chen authored
      o GetChildAtIndex, and
      o GetValueForExpressionPath
      
      llvm-svn: 135315
      5819ab49
  13. Jul 15, 2011
    • Greg Clayton's avatar
      Added the ability to get synthetic child values from SBValue objects that · f6602482
      Greg Clayton authored
      represent pointers and arrays by adding an extra parameter to the 
      
      SBValue
      SBValue::GetChildAtIndex (uint32_t idx, 
                               DynamicValueType use_dynamic, 
                               bool can_create_synthetic);
      
      The new "can_create_synthetic" will allow you to create child values that
      aren't actually a part of the original type. So if you code like:
      
      int *foo_ptr = ...
      
      And you have a SBValue that contains the value for "foo_ptr":
      
      SBValue foo_value = ...
      
      You can now get the "foo_ptr[12]" item by doing this:
      
      v = foo_value.GetChiltAtIndex (12, lldb.eNoDynamicValues, True);
      
      Normall the "foo_value" would only have one child value (an integer), but
      we can create "synthetic" child values by treating the pointer as an array.
      
      Likewise if you have code like:
      
      int array[2];
      
      array_value = ....
      
      v = array_value.GetChiltAtIndex (0);     // Success, v will be valid
      v = array_value.GetChiltAtIndex (1);     // Success, v will be valid
      v = array_value.GetChiltAtIndex (2);     // Fail, v won't be valid, "2" is not a valid zero based index in "array"
      
      But if you use the ability to create synthetic children:
      
      v = array_value.GetChiltAtIndex (0, lldb.eNoDynamicValues, True);     // Success, v will be valid
      v = array_value.GetChiltAtIndex (1, lldb.eNoDynamicValues, True);     // Success, v will be valid
      v = array_value.GetChiltAtIndex (2, lldb.eNoDynamicValues, True);     // Success, v will be valid
      
      llvm-svn: 135292
      f6602482
    • Enrico Granata's avatar
      Python summary strings: · f2bbf717
      Enrico Granata authored
       - you can use a Python script to write a summary string for data-types, in one of
         three ways:
          -P option and typing the script a line at a time
          -s option and passing a one-line Python script
          -F option and passing the name of a Python function
         these options all work for the "type summary add" command
         your Python code (if provided through -P or -s) is wrapped in a function
         that accepts two parameters: valobj (a ValueObject) and dict (an LLDB
         internal dictionary object). if you use -F and give a function name,
         you're expected to define the function on your own and with the right
         prototype. your function, however defined, must return a Python string
       - test case for the Python summary feature
       - a few quirks:
        Python summaries cannot have names, and cannot use regex as type names
        both issues will be fixed ASAP
      major redesign of type summary code:
       - type summary working with strings and type summary working with Python code
         are two classes, with a common base class SummaryFormat
       - SummaryFormat classes now are able to actively format objects rather than
         just aggregating data
       - cleaner code to print descriptions for summaries
      the public API now exports a method to easily navigate a ValueObject hierarchy
      New InputReaderEZ and PriorityPointerPair classes
      Several minor fixes and improvements
      
      llvm-svn: 135238
      f2bbf717
    • Johnny Chen's avatar
      Minor change of variable name, from m to b (for breakpoint). · b3f07c19
      Johnny Chen authored
      llvm-svn: 135214
      b3f07c19
    • Johnny Chen's avatar
      Fixed a crasher where entering 'help disasm' on the command line would crash lldb. · 331eff39
      Johnny Chen authored
      The reasom of the crash is because of a missing entry in the argument table corresponding to eArgTypeUnsignedInteger.
      Add such entry and modify the call site of the crash to go through a fail-fast API to retrieve the argument table.
      
      Add a regression test to TestHelp.py.
      
      llvm-svn: 135206
      331eff39
  14. Jul 14, 2011
  15. Jul 13, 2011
Loading