refactor usage of compressed_debug_section_type

bfd/ChangeLog:

	* bfd-in.h (bfd_hash_set_default_size): Add COMPRESS_UNKNOWN
	  enum value.
	(struct compressed_type_tuple): New.
	* bfd-in2.h (bfd_hash_set_default_size): Regenerate.
	(struct compressed_type_tuple): Likewise.
	* libbfd.c (ARRAY_SIZE): New macro.
	(bfd_get_compression_algorithm): New function.
	(bfd_get_compression_algorithm_name): Likewise.

gas/ChangeLog:

	* as.c: Do not special-case, use the new functions.

ld/ChangeLog:

	* emultempl/elf.em: Do not special-case, use the new functions.
	* lexsup.c (elf_static_list_options): Likewise.
This commit is contained in:
Martin Liska 2022-10-03 09:11:00 +02:00
parent c6422d7be7
commit 857bddbe73
6 changed files with 88 additions and 52 deletions

View File

@ -335,15 +335,23 @@ extern void bfd_hash_traverse
this size. */
extern unsigned long bfd_hash_set_default_size (unsigned long);
/* Types of compressed DWARF debug sections. We currently support
zlib. */
/* Types of compressed DWARF debug sections. */
enum compressed_debug_section_type
{
COMPRESS_DEBUG_NONE = 0,
COMPRESS_DEBUG = 1 << 0,
COMPRESS_DEBUG_GNU_ZLIB = COMPRESS_DEBUG | 1 << 1,
COMPRESS_DEBUG_GABI_ZLIB = COMPRESS_DEBUG | 1 << 2,
COMPRESS_DEBUG_ZSTD = COMPRESS_DEBUG | 1 << 3
COMPRESS_DEBUG_ZSTD = COMPRESS_DEBUG | 1 << 3,
COMPRESS_UNKNOWN = 1 << 4
};
/* Tuple for compressed_debug_section_type and their name. */
struct compressed_type_tuple
{
enum compressed_debug_section_type type;
const char *name;
};
/* This structure is used to keep track of stabs in sections
@ -456,6 +464,12 @@ extern void bfd_free_window
(bfd_window *);
extern bool bfd_get_file_window
(bfd *, file_ptr, bfd_size_type, bfd_window *, bool);
extern enum compressed_debug_section_type bfd_get_compression_algorithm
(const char *);
extern const char *bfd_get_compression_algorithm_name
(enum compressed_debug_section_type);
/* Externally visible ELF routines. */

View File

@ -342,15 +342,23 @@ extern void bfd_hash_traverse
this size. */
extern unsigned long bfd_hash_set_default_size (unsigned long);
/* Types of compressed DWARF debug sections. We currently support
zlib. */
/* Types of compressed DWARF debug sections. */
enum compressed_debug_section_type
{
COMPRESS_DEBUG_NONE = 0,
COMPRESS_DEBUG = 1 << 0,
COMPRESS_DEBUG_GNU_ZLIB = COMPRESS_DEBUG | 1 << 1,
COMPRESS_DEBUG_GABI_ZLIB = COMPRESS_DEBUG | 1 << 2,
COMPRESS_DEBUG_ZSTD = COMPRESS_DEBUG | 1 << 3
COMPRESS_DEBUG_ZSTD = COMPRESS_DEBUG | 1 << 3,
COMPRESS_UNKNOWN = 1 << 4
};
/* Tuple for compressed_debug_section_type and their name. */
struct compressed_type_tuple
{
enum compressed_debug_section_type type;
const char *name;
};
/* This structure is used to keep track of stabs in sections
@ -463,6 +471,12 @@ extern void bfd_free_window
(bfd_window *);
extern bool bfd_get_file_window
(bfd *, file_ptr, bfd_size_type, bfd_window *, bool);
extern enum compressed_debug_section_type bfd_get_compression_algorithm
(const char *);
extern const char *bfd_get_compression_algorithm_name
(enum compressed_debug_section_type);
/* Externally visible ELF routines. */

View File

@ -1244,3 +1244,39 @@ _bfd_generic_init_private_section_data (bfd *ibfd ATTRIBUTE_UNUSED,
{
return true;
}
/* Display texts for type of compressed DWARF debug sections. */
static const struct compressed_type_tuple compressed_debug_section_names[] =
{
{ COMPRESS_DEBUG_NONE, "none" },
{ COMPRESS_DEBUG, "zlib" },
{ COMPRESS_DEBUG_GNU_ZLIB, "zlib-gnu" },
{ COMPRESS_DEBUG_GABI_ZLIB, "zlib-gabi" },
{ COMPRESS_DEBUG_ZSTD, "zstd" },
};
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
#endif
/* Return compressed_debug_section_type from a string representation. */
enum compressed_debug_section_type
bfd_get_compression_algorithm (const char *name)
{
for (unsigned i = 0; i < ARRAY_SIZE (compressed_debug_section_names); ++i)
if (strcasecmp (compressed_debug_section_names[i].name, name) == 0)
return compressed_debug_section_names[i].type;
return COMPRESS_UNKNOWN;
}
/* Return compression algorithm name based on the type. */
const char *
bfd_get_compression_algorithm_name (enum compressed_debug_section_type type)
{
for (unsigned i = 0; i < ARRAY_SIZE (compressed_debug_section_names); ++i)
if (type == compressed_debug_section_names[i].type)
return compressed_debug_section_names[i].name;
return NULL;
}

View File

@ -250,21 +250,16 @@ Options:\n\
fprintf (stream, _("\
--alternate initially turn on alternate macro syntax\n"));
#ifdef DEFAULT_FLAG_COMPRESS_DEBUG
fprintf (stream, _("\
--compress-debug-sections[={none|zlib|zlib-gnu|zlib-gabi|zstd}]\n\
compress DWARF debug sections using zlib [default]\n"));
compress DWARF debug sections\n")),
fprintf (stream, _("\
Default: %s\n"),
bfd_get_compression_algorithm_name (flag_compress_debug));
fprintf (stream, _("\
--nocompress-debug-sections\n\
don't compress DWARF debug sections\n"));
#else
fprintf (stream, _("\
--compress-debug-sections[={none|zlib|zlib-gnu|zlib-gabi|zstd}]\n\
compress DWARF debug sections using zlib\n"));
fprintf (stream, _("\
--nocompress-debug-sections\n\
don't compress DWARF debug sections [default]\n"));
#endif
fprintf (stream, _("\
-D produce assembler debugging messages\n"));
fprintf (stream, _("\
@ -741,24 +736,13 @@ This program has absolutely no warranty.\n"));
if (optarg)
{
#if defined OBJ_ELF || defined OBJ_MAYBE_ELF
if (strcasecmp (optarg, "none") == 0)
flag_compress_debug = COMPRESS_DEBUG_NONE;
else if (strcasecmp (optarg, "zlib") == 0)
flag_compress_debug = COMPRESS_DEBUG_GABI_ZLIB;
else if (strcasecmp (optarg, "zlib-gnu") == 0)
flag_compress_debug = COMPRESS_DEBUG_GNU_ZLIB;
else if (strcasecmp (optarg, "zlib-gabi") == 0)
flag_compress_debug = COMPRESS_DEBUG_GABI_ZLIB;
else if (strcasecmp (optarg, "zstd") == 0)
{
#ifdef HAVE_ZSTD
flag_compress_debug = COMPRESS_DEBUG_ZSTD;
#else
flag_compress_debug = bfd_get_compression_algorithm (optarg);
#ifndef HAVE_ZSTD
if (flag_compress_debug == COMPRESS_DEBUG_ZSTD)
as_fatal (_ ("--compress-debug-sections=zstd: gas is not "
"built with zstd support"));
#endif
}
else
if (flag_compress_debug == COMPRESS_UNKNOWN)
as_fatal (_("Invalid --compress-debug-sections option: `%s'"),
optarg);
#else

View File

@ -660,24 +660,16 @@ gld${EMULATION_NAME}_handle_option (int optc)
break;
case OPTION_COMPRESS_DEBUG:
if (strcasecmp (optarg, "none") == 0)
link_info.compress_debug = COMPRESS_DEBUG_NONE;
else if (strcasecmp (optarg, "zlib") == 0)
link_info.compress_debug = COMPRESS_DEBUG_GABI_ZLIB;
else if (strcasecmp (optarg, "zlib-gnu") == 0)
link_info.compress_debug = COMPRESS_DEBUG_GNU_ZLIB;
else if (strcasecmp (optarg, "zlib-gabi") == 0)
link_info.compress_debug = COMPRESS_DEBUG_GABI_ZLIB;
else if (strcasecmp (optarg, "zstd") == 0)
link_info.compress_debug = bfd_get_compression_algorithm (optarg);
if (strcasecmp (optarg, "zstd") == 0)
{
#ifdef HAVE_ZSTD
link_info.compress_debug = COMPRESS_DEBUG_ZSTD;
#else
einfo (_ ("%F%P: --compress-debug-sections=zstd: ld is not built "
"with zstd support\n"));
#ifndef HAVE_ZSTD
if (link_info.compress_debug == COMPRESS_DEBUG_ZSTD)
einfo (_ ("%F%P: --compress-debug-sections=zstd: ld is not built "
"with zstd support\n"));
#endif
}
else
if (link_info.compress_debug == COMPRESS_UNKNOWN)
einfo (_("%F%P: invalid --compress-debug-sections option: \`%s'\n"),
optarg);
break;

View File

@ -2148,13 +2148,9 @@ elf_static_list_options (FILE *file)
fprintf (file, _("\
--compress-debug-sections=[none|zlib|zlib-gnu|zlib-gabi|zstd]\n\
Compress DWARF debug sections\n"));
#ifdef DEFAULT_FLAG_COMPRESS_DEBUG
fprintf (file, _("\
Default: zlib-gabi\n"));
#else
fprintf (file, _("\
Default: none\n"));
#endif
Default: %s\n"),
bfd_get_compression_algorithm_name (link_info.compress_debug));
fprintf (file, _("\
-z common-page-size=SIZE Set common page size to SIZE\n"));
fprintf (file, _("\