Commit Graph

272 Commits

Author SHA1 Message Date
Omar Sandoval
b848134c49 Add (partial) support for function types
The only part not implemented is function type name parsing.
2018-04-08 23:04:08 -07:00
Omar Sandoval
d41137d6e2 type: format empty struct without newline
This shows up in, e.g., Linux's struct lock_class_key if compiled
without lockdep.
2018-04-07 15:36:46 -07:00
Omar Sandoval
76cba644a8 Reorganize packaging 2018-04-07 10:42:48 -07:00
Omar Sandoval
a655325b4c coredump: add Coredump.object() instead of exposing CoredumpObject constructor 2018-04-06 22:48:18 -07:00
Omar Sandoval
422c39823f type: allow reading incomplete array types
Just return a zero-length array.
2018-04-06 00:27:17 -07:00
Omar Sandoval
c6c7c080ce type: handle typedef bitfields 2018-04-06 00:24:48 -07:00
Omar Sandoval
a63fbdb975 coredump: raise better errors from CoredumpObject.__getattr__() 2018-04-06 00:22:31 -07:00
Omar Sandoval
e6a1ece77f type: don't eagerly repr compound types
Something like struct list_head will trivially get into an infinite
recursion.
2018-04-06 00:04:50 -07:00
Omar Sandoval
87d9058ba3 Add type annotations everywhere 2018-04-05 23:40:28 -07:00
Omar Sandoval
2bd81fd5fc coredump: push ELF/DWARF-specific logic out of Coredump
Instead, take callbacks for looking up variables and reading memory.
While we're at it, get rid of TypeFactory and instead implement its
methods as functions taking a DwarfIndex.
2018-04-05 00:52:00 -07:00
Omar Sandoval
f4e62cfc1b cli: include CoredumpObject in globals
For constructing objects from computed addresses. This is required for,
e.g., Linux kernel percpu allocations.
2018-04-05 00:25:52 -07:00
Omar Sandoval
3f6130a9b3 coredump: document Coredump and CoredumpObject 2018-04-05 00:22:56 -07:00
Omar Sandoval
65a8060a15 dwarfindex: fix heap overflow when reading abbreviation table
We might need to reallocate the array to make room for the null
terminator and tag/children byte.
2018-04-03 00:15:43 -07:00
Omar Sandoval
2d7a052356 dwarfindex: remove dependency on dwarf.h 2018-04-03 00:03:31 -07:00
Omar Sandoval
26f26f0e91 dwarfindex: parallelize relocations
The tricky part here is that we don't have a single flat array of
relocations, so we have to map a single iterator variable to iterate
over files and sections.
2018-04-02 23:37:35 -07:00
Omar Sandoval
96c35e0f68 dwarfindex: use OpenMP to parallelize CU indexing
A couple of tricky things to handle:

- The DIE hash needs to be thread-safe. This implements a lock-free
  algorithm.
- We need to make sure exceptions are only raised with the GIL held.
  This adds some hacky macro magic to avoid adding a bunch of
  easy-to-forget boilerplate everywhere.
- We need to make sure the main thread reraises any exceptions thrown by
  the worker threads.
2018-04-02 00:33:23 -07:00
Omar Sandoval
fdd9604db5 dwarfindex: use global CU array instead of per-file
This will make it easier to parallelize indexing CUs.
2018-04-01 13:33:51 -07:00
Omar Sandoval
90fbec02fc dwarfindex: delete unused read_sleb128() and read_strlen() 2018-03-31 15:58:26 -07:00
Omar Sandoval
1ea45146be dwarfindex: split up strp command based on is_64_bit 2018-03-31 15:47:11 -07:00
Omar Sandoval
f8a0e8ced3 dwarfindex: store abbreviation tag and children in same byte 2018-03-31 15:37:44 -07:00
Omar Sandoval
2c5c8c005a dwarfindex: parse abbreviation table separately from compilation unit
We don't need the abbreviation table until we are actually indexing the
CU, and we don't need it afterwards, so parse it in index_cu() and free
it before returning.
2018-03-31 15:29:30 -07:00
Omar Sandoval
a1026d2a1f dwarfindex: make index_die() iterative instead of recursive
This avoids the function call overhead.
2018-03-30 00:27:38 -07:00
Omar Sandoval
500917469d dwarfindex: convert abbreviation table to commands
We don't need the actual abbreviation table; we just need to know how
much to skip and where the attributes we care about are.
2018-03-27 22:08:19 -07:00
Omar Sandoval
7599691dd1 dwarfindex: don't check that strp is null-terminated
If we make sure .debug_str is null-terminated, we just need to make sure
strp is not out of bounds.
2018-03-27 21:38:58 -07:00
Omar Sandoval
b45e930336 dwarf: rewrite drgn.dwarf in pure Python
Now that DwarfIndex is in C, the rest can be simpler Python rather than
Cython.
2018-03-26 01:51:20 -07:00
Omar Sandoval
a4dc1fb75f dwarf: get rid of DWARF cdef enums
Just use the the Python enum classes since the performance critical path
is in C now.
2018-03-25 14:39:37 -07:00
Omar Sandoval
142e2ae45d dwarf: rename CompilationUnitHeader to CompilationUnit 2018-03-25 14:38:23 -07:00
Omar Sandoval
acbf14d10c dwarf: rewrite DwarfIndex in pure C
Most of drgn.dwarf is not performance-sensitive, and the part that is
(DwarfIndex) can use some extra tuning which is easier to do in C rather
than Cython.
2018-03-25 02:10:15 -07:00
Omar Sandoval
9a689c6e71 readwrite: pass char * and size instead of Py_buffer
Also remove the unused arange and line number program parsing rather
than refactoring it.
2018-03-15 00:49:12 -07:00
Omar Sandoval
b7b8661408 elf: microoptimize apply_relocations()
We can do 1/3 of the bounds checks if we loop over relocation structures
rather than reading individual fields. This makes reading sections with
relocations about 10% faster.
2018-03-13 20:26:48 -07:00
Omar Sandoval
e63128502b elf: don't do unnecessary copy of section before applying relocations
This makes reading sections with relocations about 4% faster.
2018-03-13 19:36:28 -07:00
Omar Sandoval
7ebda948c6 dwarf: fix undefined signed integer overflow in LEB128
And add back the old lldwarf LEB128 tests.
2018-03-13 01:38:52 -07:00
Omar Sandoval
0ecef8d655 Move CLIs out of drgn module 2018-03-13 00:45:22 -07:00
Omar Sandoval
c81b7729c3 Compile Cython with language level 3 2018-03-13 00:20:24 -07:00
Omar Sandoval
97d578aa61 cli: introduce debugging REPL
Move the existing CLI to a separate drgntool CLI and make the drgn CLI
the main debugger tool.
2018-03-12 21:10:34 -07:00
Omar Sandoval
dad1c62fc9 dwarf: microoptimize DwarfIndex
A handful of optimizations that make indexing many CUs about 3% faster.
2018-03-11 01:47:13 -08:00
Omar Sandoval
de6c7ee2c6 elf: don't construct a python object for & 0xffffffff
I'm not sure why Cython was treating the integer literal as a Python
object, but this fixes it and saves about 75% of time running
relocations.
2018-03-11 00:06:05 -08:00
Omar Sandoval
c6c0494e5b readwrite: return int instead of object
This shaves off about 8% of time in parsing relocations and DWARF since
we don't have to refcount None.
2018-03-10 12:40:15 -08:00
Omar Sandoval
a7309d2a15 elf: support debug sections with relocations 2018-03-09 17:41:54 -08:00
Omar Sandoval
238ce0f3dc elf: handle compressed sections 2018-03-08 23:43:03 -08:00
Omar Sandoval
dac4f9156a elf: clean up ElfFile API
Use functions instead of properties to make it clear that they're not
free, and make it possible to construct a DwarfFile directly from an
ElfFile.
2018-03-08 23:31:02 -08:00
Omar Sandoval
2efa9343fb dwarf: add Die.size()
Instead of having to do die.find_constant(DW_AT.byte_size).
2018-03-08 21:30:05 -08:00
Omar Sandoval
35e6750f5a dwarf: read() instead of using mmap()
This removes the need to clean anything up, avoids the issue of the file
changing from under us after we've indexed it, and simplifies offset
handling in a few places.
2018-03-08 21:10:32 -08:00
Omar Sandoval
792a2d22af coredump: support reading strings 2018-03-07 21:30:26 -08:00
Omar Sandoval
aa4d5852b3 type: fix handling of arrays with zero-length elements
Encountered in s_writers_key in struct file_system_type.
2018-03-07 21:20:38 -08:00
Omar Sandoval
c625845a62 coredump: add containerof() to CoredumpObject 2018-03-07 21:07:19 -08:00
Omar Sandoval
16b3e672e1 coredump: use Type.format() for CoredumpObject.__str__() 2018-03-07 02:07:11 -08:00
Omar Sandoval
7d21255007 type: add format() to type classes
For formatting read values nicely in C syntax.
2018-03-07 02:04:09 -08:00
Omar Sandoval
4f7e35181e coredump: add support for casting types 2018-03-07 00:31:14 -08:00
Omar Sandoval
adeeca927b type: add TypeFactory.from_type_name() 2018-03-07 00:31:00 -08:00