PR 10450
authorIan Lance Taylor <ian@airs.com>
Wed, 30 Dec 2009 04:00:21 +0000 (04:00 +0000)
committerIan Lance Taylor <ian@airs.com>
Wed, 30 Dec 2009 04:00:21 +0000 (04:00 +0000)
* output.h (class Output_section): Add is_entsize_zero_ field.
* output.cc (Output_section::Output_section): Initialize
is_entsize_zero_.
(Output_section::set_entsize): If two different entsizes are
requested, force it to zero.
(Output_section::add_input_section): Set flags for .debug_str
before updating section flags.  Set entsize.
(Output_section::update_flags_for_input_section): Set SHF_MERGE
and SHF_STRING if all input sections have those flags.

gold/ChangeLog
gold/output.cc
gold/output.h

index 0af6d8f24f70f3a747bb6abf3484e6a06a75fb40..5bf395e16ad479ca32ad27baefae11ef04be0a25 100644 (file)
@@ -1,7 +1,21 @@
+2009-12-29  Ian Lance Taylor  <iant@google.com>
+
+       PR 10450
+       * output.h (class Output_section): Add is_entsize_zero_ field.
+       * output.cc (Output_section::Output_section): Initialize
+       is_entsize_zero_.
+       (Output_section::set_entsize): If two different entsizes are
+       requested, force it to zero.
+       (Output_section::add_input_section): Set flags for .debug_str
+       before updating section flags.  Set entsize.
+       (Output_section::update_flags_for_input_section): Set SHF_MERGE
+       and SHF_STRING if all input sections have those flags.
+
 2009-12-29   Rafael Espindola  <espindola@google.com>
 
        * main.cc (main): Fix the sys time reporting.
-       * workqueue.cc (Workqueue::find_and_run_task): Fix the sys time reporting.
+       * workqueue.cc (Workqueue::find_and_run_task): Fix the sys time
+       reporting.
 
 2009-12-29  Sriraman Tallam  <tmsriram@google.com>
 
index 440d4f2b579842e7f65e4c08dd586e953673c2af..d75b45bfd22cd167ce677f589e7a4c208710beb2 100644 (file)
@@ -1800,6 +1800,7 @@ Output_section::Output_section(const char* name, elfcpp::Elf_Word type,
     is_interp_(false),
     is_dynamic_linker_section_(false),
     generate_code_fills_at_write_(false),
+    is_entsize_zero_(false),
     tls_offset_(0),
     checkpoint_(NULL),
     merge_section_map_(),
@@ -1824,10 +1825,15 @@ Output_section::~Output_section()
 void
 Output_section::set_entsize(uint64_t v)
 {
-  if (this->entsize_ == 0)
+  if (this->is_entsize_zero_)
+    ;
+  else if (this->entsize_ == 0)
     this->entsize_ = v;
-  else
-    gold_assert(this->entsize_ == v);
+  else if (this->entsize_ != v)
+    {
+      this->entsize_ = 0;
+      this->is_entsize_zero_ = 1;
+    }
 }
 
 // Add the input section SHNDX, with header SHDR, named SECNAME, in
@@ -1863,8 +1869,6 @@ Output_section::add_input_section(Sized_relobj<size, big_endian>* object,
     this->addralign_ = addralign;
 
   typename elfcpp::Elf_types<size>::Elf_WXword sh_flags = shdr.get_sh_flags();
-  this->update_flags_for_input_section(sh_flags);
-
   uint64_t entsize = shdr.get_sh_entsize();
 
   // .debug_str is a mergeable string section, but is not always so
@@ -1875,6 +1879,9 @@ Output_section::add_input_section(Sized_relobj<size, big_endian>* object,
       entsize = 1;
     }
 
+  this->update_flags_for_input_section(sh_flags);
+  this->set_entsize(entsize);
+
   // If this is a SHF_MERGE section, we pass all the input sections to
   // a Output_data_merge.  We don't try to handle relocations for such
   // a section.  We don't try to handle empty merge sections--they
@@ -2199,6 +2206,22 @@ Output_section::update_flags_for_input_section(elfcpp::Elf_Xword flags)
                   & (elfcpp::SHF_WRITE
                      | elfcpp::SHF_ALLOC
                      | elfcpp::SHF_EXECINSTR));
+
+  if ((flags & elfcpp::SHF_MERGE) == 0)
+    this->flags_ &=~ elfcpp::SHF_MERGE;
+  else
+    {
+      if (this->current_data_size_for_child() == 0)
+       this->flags_ |= elfcpp::SHF_MERGE;
+    }
+
+  if ((flags & elfcpp::SHF_STRINGS) == 0)
+    this->flags_ &=~ elfcpp::SHF_STRINGS;
+  else
+    {
+      if (this->current_data_size_for_child() == 0)
+       this->flags_ |= elfcpp::SHF_STRINGS;
+    }
 }
 
 // Find the merge section into which an input section with index SHNDX in
index 3b060c8658457ccd228490fd9e588675128ed1ca..55e278bbf24100a931fd467967d86f5ea1f08418 100644 (file)
@@ -3352,6 +3352,8 @@ class Output_section : public Output_data
   bool is_dynamic_linker_section_ : 1;
   // Whether code-fills are generated at write.
   bool generate_code_fills_at_write_ : 1;
+  // Whether the entry size field should be zero.
+  bool is_entsize_zero_ : 1;
   // For SHT_TLS sections, the offset of this section relative to the base
   // of the TLS segment.
   uint64_t tls_offset_;