Fix internal error in gold when -Map and --compress-debug-sections are used
authorCary Coutant <ccoutant@google.com>
Tue, 16 Dec 2014 22:57:17 +0000 (14:57 -0800)
committerCary Coutant <ccoutant@google.com>
Tue, 16 Dec 2014 22:58:15 +0000 (14:58 -0800)
together.

gold/
* mapfile.cc (Mapfile::print_input_section): Print uncompressed sizes.
(Mapfile::print_output_data): Use current_data_size() to avoid
assert for sections requiring postprocessing; if address is not valid,
print 0.
(Mapfile::print_output_section): Use current_data_size(); print note
that addresses and sizes are before compression.

gold/ChangeLog
gold/mapfile.cc

index 8f56043..9edf043 100644 (file)
@@ -1,3 +1,12 @@
+2014-12-16  Cary Coutant  <ccoutant@google.com>
+
+       * mapfile.cc (Mapfile::print_input_section): Print uncompressed sizes.
+       (Mapfile::print_output_data): Use current_data_size() to avoid
+       assert for sections requiring postprocessing; if address is not valid,
+       print 0.
+       (Mapfile::print_output_section): Use current_data_size(); print note
+       that addresses and sizes are before compression.
+
 2014-12-14  H.J. Lu  <hongjiu.lu@intel.com>
 
        * aarch64.cc (AArch64_relocate_functions::maybe_apply_stub):
index dc995e9..c6d7ed2 100644 (file)
@@ -258,8 +258,11 @@ Mapfile::print_input_section(Relobj* relobj, unsigned int shndx)
     }
 
   char sizebuf[50];
+  section_size_type size;
+  if (!relobj->section_is_compressed(shndx, &size))
+    size = relobj->section_size(shndx);
   snprintf(sizebuf, sizeof sizebuf, "0x%llx",
-          static_cast<unsigned long long>(relobj->section_size(shndx)));
+          static_cast<unsigned long long>(size));
 
   fprintf(this->map_file_, "0x%0*llx %10s %s\n",
          parameters->target().get_size() / 4,
@@ -328,11 +331,13 @@ Mapfile::print_output_data(const Output_data* od, const char* name)
 
   char sizebuf[50];
   snprintf(sizebuf, sizeof sizebuf, "0x%llx",
-          static_cast<unsigned long long>(od->data_size()));
+          static_cast<unsigned long long>(od->current_data_size()));
 
   fprintf(this->map_file_, "0x%0*llx %10s\n",
          parameters->target().get_size() / 4,
-         static_cast<unsigned long long>(od->address()),
+         (od->is_address_valid()
+          ? static_cast<unsigned long long>(od->address())
+          : 0),
          sizebuf);
 }
 
@@ -387,7 +392,7 @@ Mapfile::print_output_section(const Output_section* os)
 
   char sizebuf[50];
   snprintf(sizebuf, sizeof sizebuf, "0x%llx",
-          static_cast<unsigned long long>(os->data_size()));
+          static_cast<unsigned long long>(os->current_data_size()));
 
   fprintf(this->map_file_, "0x%0*llx %10s",
          parameters->target().get_size() / 4,
@@ -398,6 +403,9 @@ Mapfile::print_output_section(const Output_section* os)
            parameters->target().get_size() / 4,
            static_cast<unsigned long long>(os->load_address()));
 
+  if (os->requires_postprocessing())
+    fprintf(this->map_file_, " (before compression)");
+
   putc('\n', this->map_file_);
 }