[PATCH] pahole: Implement cu_exclude_lang flag

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

 



Exclude compilation units that have the language id equal to the one
from the --cu_exclude_lang=LANG flag.

Required by Rust Linux builds due to failing BTF checks product of
things like rustc's struct reordering.

Signed-off-by: Martin Reboredo <yakoyoku@xxxxxxxxx>
Tested-by: Martin Reboredo <yakoyoku@xxxxxxxxx>
---
 dwarves.h | 18 ++++++++++++++++++
 pahole.c  | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 66 insertions(+)

diff --git a/dwarves.h b/dwarves.h
index 456b037..9d57a4f 100644
--- a/dwarves.h
+++ b/dwarves.h
@@ -204,6 +204,24 @@ enum dwarf_languages {
     LANG_ObjC_plus_plus	= 0x11,	/* Objective-C++ */
     LANG_UPC		= 0x12,	/* Unified Parallel C */
     LANG_D		= 0x13,	/* D */
+    LANG_Python	= 0x14,	/* Python */
+    LANG_OpenCL	= 0x15,	/* OpenCL */
+    LANG_Go	= 0x16,	/* Go */
+    LANG_Modula3	= 0x17,	/* Modula-3 */
+    LANG_Haskell	= 0x18,	/* Haskell */
+    LANG_C_plus_plus_03	= 0x19, /* ISO C++:2003 */
+    LANG_C_plus_plus_11	= 0x1a, /* ISO C++:2011 */
+    LANG_OCaml	= 0x1b,	/* OCaml */
+    LANG_Rust	= 0x1c,	/* Rust */
+    LANG_C11	= 0x1d,	/* ISO C:2011 */
+    LANG_Swift	= 0x1e,	/* Swift */
+    LANG_Julia	= 0x1f,	/* Julia */
+    LANG_Dylan	= 0x20,	/* Dylan */
+    LANG_C_plus_plus_14	= 0x21, /* ISO C++:2014 */
+    LANG_Fortran03	= 0x22,	/* ISO/IEC 1539-1:2004 */
+    LANG_Fortran08	= 0x23,	/* ISO/IEC 1539-1:2010 */
+    LANG_RenderScript	= 0x24, /* RenderScript Kernal Language */
+    LANG_BLISS	= 0x25,	/* BLISS */
 };
 
 /** struct debug_fmt_ops - specific to the underlying debug file format
diff --git a/pahole.c b/pahole.c
index a909b22..1c961fb 100644
--- a/pahole.c
+++ b/pahole.c
@@ -57,6 +57,8 @@ static size_t class__include_prefix_len;
 static char *cu__exclude_prefix;
 static size_t cu__exclude_prefix_len;
 
+static uint32_t cu__exclude_lang;
+
 static char *decl_exclude_prefix;
 static size_t decl_exclude_prefix_len;
 
@@ -615,6 +617,10 @@ static struct cu *cu__filter(struct cu *cu)
 		     cu__exclude_prefix_len) == 0))
 		return NULL;
 
+  if (cu__exclude_lang != 0 &&
+	    cu__exclude_lang == cu->language)
+		return NULL;
+
 	return cu;
 }
 
@@ -988,6 +994,39 @@ static void cu__account_nr_methods(struct cu *cu)
 	}
 }
 
+static const struct {
+  const char *name;
+  uint32_t id;
+} language_table[] = {
+	{ "C", LANG_C },
+	{ "C89", LANG_C89 },
+	{ "C99", LANG_C99 },
+	{ "C11", LANG_C11 },
+	{ "C++", LANG_C_plus_plus },
+	{ "C++03", LANG_C_plus_plus_03 },
+	{ "C++11", LANG_C_plus_plus_11 },
+	{ "C++14", LANG_C_plus_plus_14 },
+	{ "Fortran77", LANG_Fortran77 },
+	{ "Fortran90", LANG_Fortran90 },
+	{ "Fortran95", LANG_Fortran95 },
+	{ "Fortran03", LANG_Fortran03 },
+	{ "Fortran08", LANG_Fortran08 },
+	{ "Go", LANG_Go },
+	{ "Haskell", LANG_Haskell },
+	{ "Rust", LANG_Rust },
+	{ NULL, 0 },
+};
+
+static uint32_t language_id(const char *lang) {
+	for (int l = 0; language_table[l].name; l++) {
+		if (strcmp(lang, language_table[l].name) == 0) {
+			return language_table[l].id;
+		}
+	}
+
+	return 0;
+}
+
 static char tab[128];
 
 static void print_structs_with_pointer_to(struct cu *cu, uint32_t type)
@@ -1137,6 +1176,7 @@ ARGP_PROGRAM_VERSION_HOOK_DEF = dwarves_print_version;
 #define ARGP_skip_missing          332
 #define ARGP_skip_encoding_btf_type_tag 333
 #define ARGP_compile		   334
+#define ARGP_exclude_lang	   335
 
 static const struct argp_option pahole__options[] = {
 	{
@@ -1512,6 +1552,12 @@ static const struct argp_option pahole__options[] = {
 		.key  = ARGP_devel_stats,
 		.doc  = "Print internal data structures stats",
 	},
+	{
+		.name = "cu_exclude_lang",
+		.key  = ARGP_exclude_lang,
+		.arg  = "LANG",
+		.doc  = "exclude LANGuage compilation units",
+	},
 	{
 		.name = "skip_encoding_btf_decl_tag",
 		.key  = ARGP_skip_encoding_btf_decl_tag,
@@ -1681,6 +1727,8 @@ static error_t pahole__options_parser(int key, char *arg,
 		conf_load.hashtable_bits = atoi(arg);	break;
 	case ARGP_devel_stats:
 		conf_load.ptr_table_stats = true;	break;
+	case ARGP_exclude_lang:
+		cu__exclude_lang = language_id(arg);	break;
 	case ARGP_skip_encoding_btf_decl_tag:
 		conf_load.skip_encoding_btf_decl_tag = true;	break;
 	case ARGP_skip_missing:
-- 
2.36.0




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

  Powered by Linux