Re: [PATCH] pahole: Implement cu_exclude_lang flag

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

 



Em Thu, Apr 21, 2022 at 11:47:15AM -0300, Martin Reboredo escreveu:
> 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.

Sorry, when I saw this patch I already had committed a similar one, can
you please take a look?

Its in the "next" branch at:

https://git.kernel.org/pub/scm/devel/pahole/pahole.git/commit/?h=next

- Arnaldo
 
> 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

-- 

- Arnaldo



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

  Powered by Linux