Dwarves Archive on lore.kernel.org
 help / color / Atom feed
* pahole --contains explained
       [not found]     ` <1215158052.16861.43.camel-udH60D+1cVSKf2Id4j40wZWRH6rljmCt@public.gmane.org>
@ 2008-07-04 20:00       ` Arnaldo Carvalho de Melo
  0 siblings, 0 replies; only message in thread
From: Arnaldo Carvalho de Melo @ 2008-07-04 20:00 UTC (permalink / raw)
  To: Dennis Lubert; +Cc: dwarves-u79uwXL29TY76Z2rM5mHXA

Em Fri, Jul 04, 2008 at 09:54:12AM +0200, Dennis Lubert escreveu:
> Am Donnerstag, den 03.07.2008, 14:08 -0300 schrieb Arnaldo Carvalho de Melo:
> > > - There could be some glob or regexp style substring match for types.
> > > >From the --help I thought that -i was for this, but I could not get it
> > > to match even on substrings... Am I maybe doing something wrong?

> > Regexps not supported yet, just prefixes:

> > [acme@doppio pahole]$ pahole --sizes --separator=, build/pahole | grep arg
> > argp_child,32,1
> > argp,56,0
> > argp_state,96,1
> > argp_option,48,2
> > [acme@doppio pahole]$ pahole --sizes --separator=, --exclude arg build/pahole | grep arg
> > [acme@doppio pahole]$

> Ah ok, just overlooked -y/-x ... but then I am a bit confused on what -i
> means. Giving it parts of the class, prefixes or even the whole name
> leads to no result here... 

-i == --contains

[acme@doppio pahole]$ pahole -i tag build/pahole 
parameter
ftype
lexblock
class_member
array_type
base_type
namespace
[acme@doppio pahole]$

Now lets look at some of these classes:

[acme@doppio pahole]$ pahole -C ftype build/pahole 
struct ftype {
	struct tag       tag;            /*     0    64 */

	/* --- cacheline 1 boundary (64 bytes) --- */

	struct list_head parms;          /*    64    16 */
	uint16_t         nr_parms;       /*    80     2 */
	uint8_t          unspec_parms;   /*    82     1 */

	/* size: 88, cachelines: 2, members: 4 */
	/* padding: 5 */
	/* last cacheline: 24 bytes */
};

[acme@doppio pahole]$ pahole -C class_member build/pahole
struct class_member {
	struct tag       tag;            /*     0    64 */

	/* --- cacheline 1 boundary (64 bytes) --- */

	char *           name;           /*    64     8 */
	uint32_t         offset;         /*    72     4 */
	uint8_t          bit_offset;     /*    76     1 */
	uint8_t          bit_size;       /*    77     1 */
	uint8_t          bit_hole;       /*    78     1 */
	uint8_t          bitfield_end:1; /*    79: 7  1 */
	uint8_t          visited:1;      /*    79: 6  1 */
	uint8_t          accessibility:2;/*    79: 4  1 */
	uint8_t          virtuality:2;   /*    79: 2  1 */

	/* XXX 2 bits hole, try to pack */

	uint16_t         hole;           /*    80     2 */

	/* size: 88, cachelines: 2, members: 11 */
	/* bit holes: 1, sum bit holes: 2 bits */
	/* padding: 6 */
	/* last cacheline: 24 bytes */
};

[acme@doppio pahole]$ pahole -C parameter build/pahole
struct parameter {
	struct tag       tag;            /*     0    64 */

	/* --- cacheline 1 boundary (64 bytes) --- */

	char *           name;           /*    64     8 */
	Dwarf_Off        abstract_origin;/*    72     8 */

	/* size: 80, cachelines: 2, members: 3 */
	/* last cacheline: 16 bytes */
};

See? All of these classes (structs) contains the specified class
(struct) "tag".

And if you specify --recursive together with -i/--contains you'll get
something more interesting:

[acme@doppio pahole]$ pahole --recursive --contains tag build/pahole 
parameter
ftype
  function
lexblock
  function
class_member
array_type
base_type
namespace
  type
    class
[acme@doppio pahole]$

See? 'class' is-a 'type' is-a 'namespace' is-a 'tag'.

To see it more clearly use --expand_types:

[acme@doppio pahole]$ pahole -C class --expand_types build/pahole
struct class {
	struct type {
		struct namespace {
			struct tag {
				struct list_head {
					struct list_head * next;                         /*     0     8 */
					struct list_head * prev;                         /*     8     8 */
				} node; /*     0    16 */
				struct list_head {
					struct list_head * next;                         /*    16     8 */
					struct list_head * prev;                         /*    24     8 */
				} hash_node; /*    16    16 */
				/* typedef Dwarf_Off -> GElf_Off -> Elf64_Off -> uint64_t */ long unsigned int type; /*    32     8 */
				/* typedef Dwarf_Off -> GElf_Off -> Elf64_Off -> uint64_t */ long unsigned int id; /*    40     8 */
				const char  * decl_file;                                 /*    48     8 */
				/* typedef uint16_t */ short unsigned int decl_line;     /*    56     2 */
				/* typedef uint16_t */ short unsigned int tag;           /*    58     2 */
				/* typedef uint16_t */ short unsigned int refcnt;        /*    60     2 */
				/* typedef uint16_t */ short unsigned int recursivity_level; /*    62     2 */
				/* --- cacheline 1 boundary (64 bytes) --- */
			} tag; /*     0    64 */
			/* --- cacheline 1 boundary (64 bytes) --- */
			const char  * name;                                              /*    64     8 */
			struct list_head {
				struct list_head * next;                                 /*    72     8 */
				struct list_head * prev;                                 /*    80     8 */
			} tags; /*    72    16 */
			/* typedef uint16_t */ short unsigned int nr_tags;               /*    88     2 */
		} namespace; /*     0    96 */

		/* XXX last struct has 6 bytes of padding */

		/* --- cacheline 1 boundary (64 bytes) was 32 bytes ago --- */
		struct list_head {
			struct list_head * next;                                         /*    96     8 */
			struct list_head * prev;                                         /*   104     8 */
		} node; /*    96    16 */
		/* typedef Dwarf_Off -> GElf_Off -> Elf64_Off -> uint64_t */ long unsigned int  specification; /*   112     8 */
		/* typedef size_t */ long unsigned int  size;                            /*   120     8 */
		/* --- cacheline 2 boundary (128 bytes) --- */
		/* typedef size_t */ long unsigned int  size_diff;                       /*   128     8 */
		/* typedef uint16_t */ short unsigned int nr_members;                    /*   136     2 */
		/* typedef uint8_t */ unsigned char      declaration;                    /*   138     1 */
		/* typedef uint8_t */ unsigned char      definition_emitted:1;           /*   139: 7  1 */
		/* typedef uint8_t */ unsigned char      fwd_decl_emitted:1;             /*   139: 6  1 */
		/* typedef uint8_t */ unsigned char      resized:1;                      /*   139: 5  1 */
	} type; /*     0   144 */

	/* XXX last struct has 4 bytes of padding */

	/* --- cacheline 2 boundary (128 bytes) was 16 bytes ago --- */
	struct list_head {
		struct list_head * next;                                                 /*   144     8 */
		struct list_head * prev;                                                 /*   152     8 */
	} vtable; /*   144    16 */
	/* typedef uint16_t */ short unsigned int         nr_vtable_entries;             /*   160     2 */
	/* typedef uint8_t */ unsigned char              nr_holes;                       /*   162     1 */
	/* typedef uint8_t */ unsigned char              nr_bit_holes;                   /*   163     1 */
	/* typedef uint16_t */ short unsigned int         padding;                       /*   164     2 */
	/* typedef uint8_t */ unsigned char              bit_padding;                    /*   166     1 */

	/* XXX 1 byte hole, try to pack */

	void *                     priv;                                                 /*   168     8 */

	/* size: 176, cachelines: 3, members: 8 */
	/* sum members: 175, holes: 1, sum holes: 1 */
	/* paddings: 1, sum paddings: 4 */
	/* last cacheline: 48 bytes */
};

Try --expand_pointers at home, say on struct task_struct on the Linux
kernel 8-)

For the lazy ones:

[acme@doppio pahole]$ pahole -C task_struct --expand_types --expand_pointers vmlinux >

http://oops.ghostprotocols.net/dwarves/pahole/vmlinux-expand_pointers-task_struct.txt
http://vger.kernel.org/~acme/vmlinux-expand_pointers-task_struct.txt

- Arnaldo
--
To unsubscribe from this list: send the line "unsubscribe dwarves" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, back to index

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <1215098881.16861.29.camel@edge.interactivedata.com>
     [not found] ` <20080703170834.GA13056@ghostprotocols.net>
     [not found]   ` <1215158052.16861.43.camel@edge.interactivedata.com>
     [not found]     ` <1215158052.16861.43.camel-udH60D+1cVSKf2Id4j40wZWRH6rljmCt@public.gmane.org>
2008-07-04 20:00       ` pahole --contains explained Arnaldo Carvalho de Melo

Dwarves Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/dwarves/0 dwarves/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 dwarves dwarves/ https://lore.kernel.org/dwarves \
		dwarves@vger.kernel.org
	public-inbox-index dwarves

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.dwarves


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git