Fix bug with grouping sections.
authorCary Coutant <ccoutant@gmail.com>
Thu, 23 Jun 2016 16:45:25 +0000 (09:45 -0700)
committerCary Coutant <ccoutant@gmail.com>
Thu, 23 Jun 2016 16:45:25 +0000 (09:45 -0700)
The fix for PR 15370 did not correctly check all patterns in a group,
but instead threw all unassigned sections into the group. This patch
fixes that.

2016-06-23  Cary Coutant  <ccoutant@gmail.com>
    Igor Kudrin  <ikudrin@accesssoftek.com>

gold/
PR gold/15370
* script-sections.cc
(Output_section_element_input::set_section_addresses): Keep bin_count
separate from input_pattern_count.
* testsuite/script_test_12.t: Add another section .x4.
* testsuite/script_test_12i.t: Likewise.
* testsuite/script_test_12a.c: Likewise.
* testsuite/script_test_12b.c: Likewise.

gold/ChangeLog
gold/script-sections.cc
gold/testsuite/script_test_12.t
gold/testsuite/script_test_12a.c
gold/testsuite/script_test_12b.c
gold/testsuite/script_test_12i.t

index 012b682019a8a1113056d38d80334be84072188a..0bf521ddde9ff77d9d906a433f730d1b042424a5 100644 (file)
@@ -1,3 +1,15 @@
+2016-06-23  Cary Coutant  <ccoutant@gmail.com>
+           Igor Kudrin  <ikudrin@accesssoftek.com>
+
+       PR gold/15370
+       * script-sections.cc
+       (Output_section_element_input::set_section_addresses): Keep bin_count
+       separate from input_pattern_count.
+       * testsuite/script_test_12.t: Add another section .x4.
+       * testsuite/script_test_12i.t: Likewise.
+       * testsuite/script_test_12a.c: Likewise.
+       * testsuite/script_test_12b.c: Likewise.
+
 2016-06-23  Igor Kudrin  <ikudrin@accesssoftek.com>
 
        * gold-threads.cc (impl_threads::Lock_impl_threads): Fix typos.
index c42827f4f094f3ea2f6b6b94a1b264a40aa97439..ef8295331518413eecd0ce6dbda1fc0fd006acda 100644 (file)
@@ -1595,6 +1595,7 @@ Output_section_element_input::set_section_addresses(
 
   typedef std::vector<std::vector<Input_section_info> > Matching_sections;
   size_t input_pattern_count = this->input_section_patterns_.size();
+  size_t bin_count = 1;
   bool any_patterns_with_sort = false;
   for (size_t i = 0; i < input_pattern_count; ++i)
     {
@@ -1602,9 +1603,9 @@ Output_section_element_input::set_section_addresses(
       if (isp.sort != SORT_WILDCARD_NONE)
        any_patterns_with_sort = true;
     }
-  if (input_pattern_count == 0 || !any_patterns_with_sort)
-    input_pattern_count = 1;
-  Matching_sections matching_sections(input_pattern_count);
+  if (any_patterns_with_sort)
+    bin_count = input_pattern_count;
+  Matching_sections matching_sections(bin_count);
 
   // Look through the list of sections for this output section.  Add
   // each one which matches to one of the elements of
@@ -1661,11 +1662,11 @@ Output_section_element_input::set_section_addresses(
                break;
            }
 
-         if (i >= this->input_section_patterns_.size())
+         if (i >= input_pattern_count)
            ++p;
          else
            {
-             if (!any_patterns_with_sort)
+             if (i >= bin_count)
                i = 0;
              matching_sections[i].push_back(isi);
              p = input_sections->erase(p);
@@ -1679,7 +1680,7 @@ Output_section_element_input::set_section_addresses(
   // output section.
 
   uint64_t dot = *dot_value;
-  for (size_t i = 0; i < input_pattern_count; ++i)
+  for (size_t i = 0; i < bin_count; ++i)
     {
       if (matching_sections[i].empty())
        continue;
index d434f20e93e780acc79b102477bd6336fbaab6d3..4579c58d92ba09d22015810e854504ddd9cb5f51 100644 (file)
@@ -57,6 +57,7 @@ SECTIONS
     test_array_start = .;
     *(.x1 .x2 .x3);
     test_array_end = .;
+    *(.x4);
     }
   .bss : { *(.bss) }
 
index 0eed0c2714d136efd84d368586cae0136c0d9dba..ed1be683b5031dcd3ac119a677f6507ce11ac142 100644 (file)
@@ -73,3 +73,4 @@ main(void)
 int a1[] __attribute((section(".x1"))) = { 0x01, 0x02, 0x03, 0x04 };
 int a2[] __attribute((section(".x2"))) = { 0x11, 0x12, 0x13, 0x14};
 int a3[] __attribute((section(".x3"))) = { 0x21, 0x22, 0x23, 0x24 };
+int a4[] __attribute((section(".x4"))) = { 0xff, 0xff, 0xff, 0xff };
index a69866eae980a30c83ff4f6d2fe67b51ee1b4caa..e31f73d666f767b1ad306f4591f04304805e4641 100644 (file)
@@ -1,3 +1,4 @@
 int b1[] __attribute((section(".x1"))) = { 0x85, 0x86, 0x87, 0x88 };
 int b2[] __attribute((section(".x2"))) = { 0x95, 0x96, 0x97, 0x98 };
 int b3[] __attribute((section(".x3"))) = { 0xa5, 0xa6, 0xa7, 0xa8 };
+int b4[] __attribute((section(".x4"))) = { 0xff, 0xff, 0xff, 0xff };
index 8d6183a998823c9c8c43e6d4b38de06ff13f25bd..af19cd6e161cf8bd6c7c372ac144b77f0b2f12a1 100644 (file)
@@ -57,6 +57,7 @@ SECTIONS
     test_array_start = .;
     *(.x1) *(.x2) *(.x3)
     test_array_end = .;
+    *(.x4);
     }
   .bss : { *(.bss) }