gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gold / common.cc
index d5046e507aa1cb0b2b40e3645cda93d986d12733..b1348ecfbc7f3396a77451a28af1d8192fdc0779 100644 (file)
@@ -1,6 +1,6 @@
 // common.cc -- handle common symbols for gold
 
-// Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+// Copyright (C) 2006-2020 Free Software Foundation, Inc.
 // Written by Ian Lance Taylor <iant@google.com>.
 
 // This file is part of gold.
@@ -88,16 +88,7 @@ bool
 Sort_commons<size>::operator()(const Symbol* pa, const Symbol* pb) const
 {
   if (pa == NULL)
-    {
-      if (pb == NULL)
-       {
-         // Stabilize sort.  The order really doesn't matter, because
-         // these entries will be discarded, but we want to return
-         // the same result every time we compare pa and pb.
-         return pa < pb;
-       }
-      return false;
-    }
+    return false;
   if (pb == NULL)
     return true;
 
@@ -231,9 +222,6 @@ Symbol_table::do_allocate_commons_list(
     Mapfile* mapfile,
     Sort_commons_order sort_order)
 {
-  typedef typename Sized_symbol<size>::Value_type Value_type;
-  typedef typename Sized_symbol<size>::Size_type Size_type;
-
   // We've kept a list of all the common symbols.  But the symbol may
   // have been resolved to a defined symbol by now.  And it may be a
   // forwarder.  First remove all non-common symbols.
@@ -295,12 +283,23 @@ Symbol_table::do_allocate_commons_list(
       gold_unreachable();
     }
 
-  Output_data_space *poc = new Output_data_space(addralign, ds_name);
-  Output_section *os = layout->add_output_section_data(name,
-                                                      elfcpp::SHT_NOBITS,
-                                                      flags, poc,
-                                                      ORDER_INVALID,
-                                                      false);
+  Output_data_space* poc;
+  Output_section* os;
+
+  if (!parameters->incremental_update())
+    {
+      poc = new Output_data_space(addralign, ds_name);
+      os = layout->add_output_section_data(name, elfcpp::SHT_NOBITS, flags,
+                                          poc, ORDER_INVALID, false);
+    }
+  else
+    {
+      // When doing an incremental update, we need to allocate each common
+      // directly from the output section's free list.
+      poc = NULL;
+      os = layout->find_output_section(name);
+    }
+
   if (os != NULL)
     {
       if (commons_section_type == COMMONS_SMALL)
@@ -338,12 +337,26 @@ Symbol_table::do_allocate_commons_list(
       if (mapfile != NULL)
        mapfile->report_allocate_common(sym, ssym->symsize());
 
-      off = align_address(off, ssym->value());
-      ssym->allocate_common(poc, off);
-      off += ssym->symsize();
+      if (poc != NULL)
+       {
+         off = align_address(off, ssym->value());
+         ssym->allocate_common(poc, off);
+         off += ssym->symsize();
+       }
+      else
+       {
+         // For an incremental update, allocate from the free list.
+         off = os->allocate(ssym->symsize(), ssym->value());
+         if (off == -1)
+           gold_fallback(_("out of patch space in section %s; "
+                           "relink with --incremental-full"),
+                         os->name());
+         ssym->allocate_common(os, off);
+       }
     }
 
-  poc->set_current_data_size(off);
+  if (poc != NULL)
+    poc->set_current_data_size(off);
 
   commons->clear();
 }
This page took 0.025385 seconds and 4 git commands to generate.