Commit Graph

255 Commits

Author SHA1 Message Date
Omar Sandoval
ea121af2ad Add Linux kernel helpers
Beyond providing the raw interface for accessing objects, drgn should
provide helpers for inspecting programs. This introduces the first set
of helpers for the Linux kernel. In the future, it would be cool to have
helpers for common libraries like libstd++.
2018-05-28 00:08:03 -07:00
Omar Sandoval
32974c3c98 Fix some minor style problems 2018-05-27 22:44:05 -07:00
Omar Sandoval
a7448f4ce6 program: fix mypy errors about builtins._ 2018-05-26 23:43:55 -07:00
Omar Sandoval
5701689436 program: add ProgramObject.read_once() 2018-05-26 23:01:09 -07:00
Omar Sandoval
cc5fb61295 program: add Program.null()
Shorthand for Program.object(type, value=0).
2018-05-26 22:49:32 -07:00
Omar Sandoval
52052959ae program: only convert errors from CompoundType.member() to AttributeError
Errors reading memory, for example, should stay as ValueError. Maybe
these should have more specific exception types in the future.
2018-05-26 22:44:25 -07:00
Omar Sandoval
906f16832f program: make ProgramObject() address optional
This way, rvalues can be more conveniently created with
prog.object(type, value=x).
2018-05-26 17:48:52 -07:00
Omar Sandoval
2ee6662639 program: handle pointers to typedefs of struct/union types
ProgramObject.__dir__(), member_(), and container_of_() all check that
the relevant type is a struct or union, but they all need to allow
typedefs of structs or unions, as well.
2018-05-25 22:32:03 -07:00
Omar Sandoval
9c94b82c6c program: make CompoundType.member() public
ProgramObject.member_() calls typeof() and offsetof(), which we can get
at the same time. While we're here, catch AttributeError instead of
doing the isinstance() check, which is slightly more efficient.
2018-05-25 22:17:54 -07:00
Omar Sandoval
6b178c5108 program: only check struct or union in ProgramObject.member_()
We're currently also doing this check in __getattr__(), which is
unnecessary overhead in the common case. We can just check the exception
in the error case.
2018-05-25 21:56:24 -07:00
Omar Sandoval
95c0682718 corereader: implement type reads in C
Now that read_memory() was converted to C, IntType.read() and friends
are a bottleneck. Convert them to C methods of CoreReader.
2018-05-25 00:41:12 -07:00
Omar Sandoval
95bde56cb7 Implement core dump reading in C
read_memory() is one of the hottest functions in profiles of tight loops
over lists of items, and it can be done much more efficiently in C.
2018-05-24 17:55:47 -07:00
Omar Sandoval
2fa4150581 type: add Type.is_pointer() and call isinstance() less 2018-05-19 00:09:15 -07:00
Omar Sandoval
15849f5795 type: make operand_type() a method of Type
This gets rid of the huge isinstance() chain in
TypeIndex.operand_type().
2018-05-18 23:51:20 -07:00
Omar Sandoval
2c0b63eda3 type: cache CompoundType._member()
Parsing the member designator and walking the members is relatively
expensive and can be in the hot path when iterating over lots of
objects.
2018-05-18 23:18:40 -07:00
Omar Sandoval
0089014fed cli: add Type to displayhook 2018-05-14 20:43:16 -07:00
Omar Sandoval
e7a2ba32e8 program: show dereferenced value for ProgramObject.str()
I always forget to dereference pointers, which gets annoying.
2018-05-14 20:36:19 -07:00
Omar Sandoval
54f5124be8 type: format char arrays as strings
For, e.g., comm in struct task_struct, a string is much nicer to look
at.
2018-05-14 20:35:21 -07:00
Omar Sandoval
7088aac53f cli: add display hook that calls str() for ProgramObjects
Having to do print(...) all of the time at the CLI is tiresome.
2018-05-14 20:33:12 -07:00
Omar Sandoval
de5bb2c887 program: fix typo in docstring 2018-05-14 00:16:45 -07:00
Omar Sandoval
6d980a95a7 Add better rlcompleter
The standard library rlcompleter doesn't support expressions involving
an item lookup (e.g., x[0] or x['foo']). This is a pain for the drgn
CLI, because it's common to use prog['variable'] and want to
autocomplete it. Instead of using the standard library rlcompleter,
implement our own, cleaned up version of it with the ability to handle
expressions containing [key]. rlcompleter already allows for arbitrary
__getattr__() calls, and __getitem__() isn't any different.
2018-05-13 23:51:42 -07:00
Omar Sandoval
467fc66ef3 type: fix member designator exceptions 2018-05-13 01:13:38 -07:00
Omar Sandoval
e327aef860 program: fix ProgramObject.__round__() with ndigits is not None
In this case, we must return a ProgramObject.
2018-05-13 00:47:44 -07:00
Omar Sandoval
1916528f5d type: make offsetof() and typeof() accept arbitrary member designators
Instead of only accepting an identifier.
2018-05-13 00:42:50 -07:00
Omar Sandoval
8f46673649 Add member designator parser
A member designator is the second argument to the C offsetof() macro.
2018-05-13 00:41:20 -07:00
Omar Sandoval
b43e2094ff typename: split lexer out into a separate module
It will be used for parsing member designators next.
2018-05-13 00:40:28 -07:00
Omar Sandoval
3d5af98a90 type/typename: fix anonymous and incomplete type annotations 2018-05-12 15:43:58 -07:00
Omar Sandoval
90ca412a33 typeindex: fix mypy errors in drgn.program 2018-05-12 15:34:00 -07:00
Omar Sandoval
10cf1097b5 program: fix mypy errors regarding array rvalues
We don't support array rvalues, so just add some asserts.
2018-05-12 12:02:50 -07:00
Omar Sandoval
6e208005a2 typeindex: fix some more mypy errors 2018-05-12 11:51:20 -07:00
Omar Sandoval
f299bea98a type/typeindex: implement saner typing for EnumType
This is a big change that makes EnumType have a compatible integer type
member instead of copying the fields, which ends up touching a lot of
stuff but also fixing a bunch of static typing errors.
2018-05-11 23:57:52 -07:00
Omar Sandoval
333b782172 dwarf: fix some type errors
Not real bugs.
2018-05-11 22:33:09 -07:00
Omar Sandoval
80df521452 type: handle some type errors caused by optional members
I don't know why mypy suddenly started warning about these where it
didn't before, but they're real bugs.
2018-05-09 02:11:39 -07:00
Omar Sandoval
07bcded124 typename: fix some harmless type errors
These aren't actual bugs, but silence mypy anyways.
2018-05-09 01:55:42 -07:00
Omar Sandoval
0a089e6ac9 cli: add history and tab completion
rlcompleter won't complete getitem or any function calls, so that can be
improved upon, but this is already much better than nothing.
2018-05-09 01:52:21 -07:00
Omar Sandoval
35271231fe program: swap ProgramObject arguments
type, address, value makes more sense and looks more like C.
2018-05-07 22:48:00 -07:00
Omar Sandoval
15ea6e8d97 program: implement ProgramObject binary operators 2018-05-07 18:48:10 -07:00
Omar Sandoval
9560b913f3 typeindex: change Type.unqualified() to TypeIndex.operand_type()
Converting an lvalue to an operand has to do a little bit more than
remove qualifiers:

- Convert array types to pointer types
- Convert function types to pointer types
2018-05-06 21:29:59 -07:00
Omar Sandoval
987f9be6db type: add Type.is_arithmetic() and Type.is_integer()
This will be used for ProgramObject operators as a shortcut for
isinstance(type.real_type(), (ArithmeticType, BitFieldType).
2018-05-06 00:28:07 -07:00
Omar Sandoval
da83e0adb3 program: add ProgramObject tests 2018-05-03 23:26:43 -07:00
Omar Sandoval
bad1ab23b0 typeindex: add TypeIndex.array()
Similar to TypeIndex.pointer(), just constructs an array type.
2018-05-03 23:21:53 -07:00
Omar Sandoval
b921d884df program: add ProgramObject.address_of_()
Basically the "&" operator in C.
2018-05-03 23:21:23 -07:00
Omar Sandoval
38262f8d53 typeindex: add TypeIndex.pointer() 2018-05-03 22:34:35 -07:00
Omar Sandoval
18e5e8f9bf typeindex: move easy types into base TypeIndex class
Some types don't actually have to go through find_dwarf_type(), so they
can be handled in the common code. This allows us to add a MockTypeIndex
to the tests.
2018-05-03 20:38:00 -07:00
Omar Sandoval
9f325f5fdc typeindex: fix some type errors in literal_type() 2018-05-02 23:38:55 -07:00
Omar Sandoval
3cc11f3f5e typeindex: rename usual_arithmetic_conversions() to common_real_type()
It doesn't actually do the conversion, it just finds the common type.
While we're here, don't make the types unqualied; the caller should do
that.
2018-05-02 23:36:39 -07:00
Omar Sandoval
928048be97 tests: use mocked TypeIndex for type conversion tests
Instead of a real DwarfTypeIndex.
2018-05-02 23:19:05 -07:00
Omar Sandoval
4891a6341f typeindex: add method for getting type of literal
This will be used for ProgramObject operators where one operand is not a
ProgramObject.
2018-05-02 22:56:16 -07:00
Omar Sandoval
b060c9dcf7 typeindex: make sure we can find base types
The compiler might call a base type by any variation of its name (e.g.,
long or long int). Make sure we find it no matter what it chose.
2018-05-02 22:41:26 -07:00
Omar Sandoval
d7236962db type: fix BoolType.__repr__()
It shouldn't include self.signed.
2018-05-02 01:20:30 -07:00