2013-04-29 Alexander Ivchenko <alexander.ivchenko@intel.com>
[deliverable/binutils-gdb.git] / gold / merge.cc
index dde43e9b124d1cc2566031adefab687f86144ad5..6480bd933117fd690a52298133be1c292914737e 100644 (file)
@@ -540,25 +540,43 @@ Output_merge_string<Char_type>::do_add_input_section(Relobj* object,
   this->merged_strings_lists_.push_back(merged_strings_list);
   Merged_strings& merged_strings = merged_strings_list->merged_strings;
 
-  // Count the number of strings in the section and size the list.
+  // Count the number of non-null strings in the section and size the list.
   size_t count = 0;
-  for (const Char_type* pt = p; pt < pend0; pt += string_length(pt) + 1)
-    ++count;
+  for (const Char_type* pt = p, len = string_length(pt);
+       pt < pend0;
+       pt += len + 1)
+    if (len != 0)
+      ++count;
   if (pend0 < pend)
     ++count;
   merged_strings.reserve(count + 1);
 
   // The index I is in bytes, not characters.
   section_size_type i = 0;
+
+  // We assume here that the beginning of the section is correctly
+  // aligned, so each string within the section must retain the same
+  // modulo.
+  uintptr_t init_align_modulo = (reinterpret_cast<uintptr_t>(pdata)
+                                & (this->addralign() - 1));
+  bool has_misaligned_strings = false;
+
   while (p < pend0)
     {
       size_t len = string_length(p);
 
-      Stringpool::Key key;
-      this->stringpool_.add_with_length(p, len, true, &key);
+      if (len != 0)
+       {
+         // Within merge input section each string must be aligned.
+         if ((reinterpret_cast<uintptr_t>(p) & (this->addralign() - 1))
+             != init_align_modulo)
+           has_misaligned_strings = true;
 
-      merged_strings.push_back(Merged_string(i, key));
+         Stringpool::Key key;
+         this->stringpool_.add_with_length(p, len, true, &key);
 
+         merged_strings.push_back(Merged_string(i, key));
+       }
       p += len + 1;
       i += (len + 1) * sizeof(Char_type);
     }
@@ -581,6 +599,12 @@ Output_merge_string<Char_type>::do_add_input_section(Relobj* object,
   this->input_count_ += count;
   this->input_size_ += len;
 
+  if (has_misaligned_strings)
+    gold_warning(_("%s: section %s contains incorrectly aligned strings;"
+                  " the alignment of those strings won't be preserved"),
+                object->name().c_str(),
+                object->section_name(shndx).c_str());
+
   // For script processing, we keep the input sections.
   if (this->keeps_input_sections())
     record_input_section(object, shndx);
This page took 0.026803 seconds and 4 git commands to generate.