Re: pahole BRAIN FART ALERT on F12

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Em Mon, Nov 23, 2009 at 05:56:15PM -0500, Mike Snitzer escreveu:
> On Mon, Nov 23 2009 at  5:49pm -0500,
> Arnaldo de Melo <acme@xxxxxxxxxx> wrote:
> > Em Mon, Nov 23, 2009 at 05:17:03PM -0500, Mike Snitzer escreveu:
> > > Unfortunately, when I run pahole against lvm2 I'm getting many BRAIN
> > > FART ALERTs on F12 x86_64 (dwarves-1.7-5.x86_64).  I had a look at your
> > > OLS 2007 "7 dwarves" paper and figured I'd try your minimalist
> > > swiss_cheese example, this is what I get:
> > > $ pahole swiss_cheese
> > > struct cheese {
> > >         char                       name[17];             /*     0    17 */
> > >         short int                  age;                  /*     0     2 */
> > >         char                       type;                 /*     0     1 */
<SNIP>
> > >         /* BRAIN FART ALERT! 48 != 17 + 0(holes), diff = 31 */
> > > };
> > You should, I think this is related to some recent elfutils changes that
> > Mark Wieelard warned me about it but I hadn't time yet to act upon, will
> > do so tomorrow, thanks for the report!
 
> BTW, I did try the latest git version from:
> git://git.kernel.org/pub/scm/linux/kernel/git/acme/pahole.git
> It didn't work either.

Can you try with the attached patch applied against the git repo
version?

Best Regards,

- Arnaldo
diff --git a/dwarf_loader.c b/dwarf_loader.c
index 44605a8..3b58ecb 100644
--- a/dwarf_loader.c
+++ b/dwarf_loader.c
@@ -242,9 +242,23 @@ static Dwarf_Off attr_offset(Dwarf_Die *die, const uint32_t name)
 	Dwarf_Attribute attr;
 	Dwarf_Block block;
 
-	if (dwarf_attr(die, name, &attr) != NULL &&
-	    dwarf_formblock(&attr, &block) == 0)
-		return dwarf_expr(block.data, block.length);
+	if (dwarf_attr(die, name, &attr) == NULL)
+		return 0;
+
+	switch (dwarf_whatform(&attr)) {
+	case DW_FORM_data1:
+	case DW_FORM_data2:
+	case DW_FORM_sdata:
+	case DW_FORM_udata: {
+		Dwarf_Word value;
+		if (dwarf_formudata(&attr, &value) == 0)
+			return value;
+		break;
+	}
+	default:
+		if (dwarf_formblock(&attr, &block) == 0)
+			return dwarf_expr(block.data, block.length);
+	}
 
 	return 0;
 }

[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux