aboutsummaryrefslogtreecommitdiff
path: root/bfd/compress.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2022-12-07 09:28:18 +1030
committerAlan Modra <amodra@gmail.com>2022-12-07 13:15:29 +1030
commitc3620d6d5639ab7a0b483030350e8f2929212ea7 (patch)
tree802bc807b5e2feb2f5f55ab54c8479cdd7c14529 /bfd/compress.c
parent9db0f1ae844614673957e48257aba137e3c41133 (diff)
downloadgdb-c3620d6d5639ab7a0b483030350e8f2929212ea7.zip
gdb-c3620d6d5639ab7a0b483030350e8f2929212ea7.tar.gz
gdb-c3620d6d5639ab7a0b483030350e8f2929212ea7.tar.bz2
Compression tidy and fixes
Tidies: - Move stuff from bfd-in.h and libbfd.c to compress.c - Delete COMPRESS_DEBUG from enum compressed_debug_section_type - Move compress_debug field out of link_info to ld_config. Fixes: - Correct test in bfd_convert_section_setup to use obfd flags, not ibfd. - Apply bfd_applicable_file_flags to compression bfd flags added by gas and ld to the output bfd. bfd/ * bfd-in.h (enum compressed_debug_section_type), (struct compressed_type_tuple), (bfd_get_compression_algorithm), (bfd_get_compression_algorithm_name), * libbfd.c (compressed_debug_section_names), (bfd_get_compression_algorithm), (bfd_get_compression_algorithm_name): Move.. * compress.c: ..to here, deleting COMPRESS_DEBUG from enum compressed_debug_section_type. (bfd_convert_section_setup): Test obfd flags not ibfd for compression flags. * elf.c (elf_fake_sections): Replace link_info->compress_debug test with abfd->flags test. * bfd-in2.h: Regenerate. binutils/ * objcopy.c (copy_file): Tidy setting of bfd compress flags. Expand comment. gas/ * write.c (compress_debug): Test bfd compress flags rather than flag_compress_debug. (write_object_file): Apply bfd_applicable_file_flags to compress debug flags added to output bfd. include/ * bfdlink.h (struct bfd_link_info): Delete compress_debug. ld/ * ld.h (ld_config_type): Add compress_debug. * emultempl/elf.em: Replace references to link_info.compress_debug with config.compress_debug. * lexsup.c (elf_static_list_options): Likewise. * ldmain.c (main): Likewise. Apply bfd_applicable_file_flags to compress debug flags added to output bfd.
Diffstat (limited to 'bfd/compress.c')
-rw-r--r--bfd/compress.c69
1 files changed, 68 insertions, 1 deletions
diff --git a/bfd/compress.c b/bfd/compress.c
index 5ea7cd9..2943492 100644
--- a/bfd/compress.c
+++ b/bfd/compress.c
@@ -27,11 +27,30 @@
#include "elf-bfd.h"
#include "libbfd.h"
#include "safe-ctype.h"
+#include "libiberty.h"
#define MAX_COMPRESSION_HEADER_SIZE 24
/*
CODE_FRAGMENT
+.{* Types of compressed DWARF debug sections. *}
+.enum compressed_debug_section_type
+.{
+. COMPRESS_DEBUG_NONE = 0,
+. COMPRESS_DEBUG_GNU_ZLIB = 1 << 1,
+. COMPRESS_DEBUG_GABI_ZLIB = 1 << 2,
+. COMPRESS_DEBUG_ZSTD = 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;
+.};
+.
+.{* Compression header ch_type values. *}
.enum compression_type
.{
. ch_none = 0,
@@ -66,6 +85,54 @@ CODE_FRAGMENT
.
*/
+/* 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_GABI_ZLIB, "zlib" },
+ { COMPRESS_DEBUG_GNU_ZLIB, "zlib-gnu" },
+ { COMPRESS_DEBUG_GABI_ZLIB, "zlib-gabi" },
+ { COMPRESS_DEBUG_ZSTD, "zstd" },
+};
+
+/*
+FUNCTION
+ bfd_get_compression_algorithm
+SYNOPSIS
+ enum compressed_debug_section_type
+ bfd_get_compression_algorithm (const char *name);
+DESCRIPTION
+ 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;
+}
+
+/*
+FUNCTION
+ bfd_get_compression_algorithm_name
+SYNOPSIS
+ const char *bfd_get_compression_algorithm_name
+ (enum compressed_debug_section_type type);
+DESCRIPTION
+ 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;
+}
+
/*
FUNCTION
bfd_update_compression_header
@@ -249,7 +316,7 @@ bfd_convert_section_setup (bfd *ibfd, asection *isec, bfd *obfd,
{
const char *name = *new_name;
- if ((ibfd->flags & (BFD_DECOMPRESS | BFD_COMPRESS_GABI)) != 0)
+ if ((obfd->flags & (BFD_DECOMPRESS | BFD_COMPRESS_GABI)) != 0)
{
/* When we decompress or compress with SHF_COMPRESSED,
convert section name from .zdebug_* to .debug_*. */