gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gold / script-sections.cc
index 90ec8d4a504d873e10b9165ea3f5c104d57981f9..68387dbe9636d0a003fd83a2459c3414e47dab67 100644 (file)
@@ -1,6 +1,6 @@
 // script-sections.cc -- linker script SECTIONS for gold
 
-// Copyright (C) 2008-2016 Free Software Foundation, Inc.
+// Copyright (C) 2008-2020 Free Software Foundation, Inc.
 // Written by Ian Lance Taylor <iant@google.com>.
 
 // This file is part of gold.
@@ -632,7 +632,7 @@ class Sections_element
   // Output_section_definition.
   virtual const char*
   output_section_name(const char*, const char*, Output_section***,
-                     Script_sections::Section_type*, bool*)
+                     Script_sections::Section_type*, bool*, bool)
   { return NULL; }
 
   // Initialize OSP with an output section.
@@ -2003,7 +2003,7 @@ class Output_section_definition : public Sections_element
   const char*
   output_section_name(const char* file_name, const char* section_name,
                      Output_section***, Script_sections::Section_type*,
-                     bool*);
+                     bool*, bool);
 
   // Initialize OSP with an output section.
   void
@@ -2289,11 +2289,12 @@ Output_section_definition::output_section_name(
     const char* section_name,
     Output_section*** slot,
     Script_sections::Section_type* psection_type,
-    bool* keep)
+    bool* keep,
+    bool match_input_spec)
 {
-  // If the input section is linker-created, just look for a match
+  // If the section is a linker-created output section, just look for a match
   // on the output section name.
-  if (file_name == NULL && this->name_ != "/DISCARD/")
+  if (!match_input_spec && this->name_ != "/DISCARD/")
     {
       if (this->name_ != section_name)
        return NULL;
@@ -3568,7 +3569,8 @@ Script_sections::output_section_name(
     const char* section_name,
     Output_section*** output_section_slot,
     Script_sections::Section_type* psection_type,
-    bool* keep)
+    bool* keep,
+    bool is_input_section)
 {
   for (Sections_elements::const_iterator p = this->sections_elements_->begin();
        p != this->sections_elements_->end();
@@ -3576,7 +3578,8 @@ Script_sections::output_section_name(
     {
       const char* ret = (*p)->output_section_name(file_name, section_name,
                                                  output_section_slot,
-                                                 psection_type, keep);
+                                                 psection_type, keep,
+                                                 is_input_section);
 
       if (ret != NULL)
        {
@@ -3592,13 +3595,37 @@ Script_sections::output_section_name(
        }
     }
 
-  // If we couldn't find a mapping for the name, the output section
-  // gets the name of the input section.
-
+  // We have an orphan section.
   *output_section_slot = NULL;
   *psection_type = Script_sections::ST_NONE;
   *keep = false;
 
+  General_options::Orphan_handling orphan_handling =
+      parameters->options().orphan_handling_enum();
+  if (orphan_handling == General_options::ORPHAN_DISCARD)
+    return NULL;
+  if (orphan_handling == General_options::ORPHAN_ERROR)
+    {
+      if (file_name == NULL)
+       gold_error(_("unplaced orphan section '%s'"), section_name);
+      else
+       gold_error(_("unplaced orphan section '%s' from '%s'"),
+                  section_name, file_name);
+      return NULL;
+    }
+  if (orphan_handling == General_options::ORPHAN_WARN)
+    {
+      if (file_name == NULL)
+       gold_warning(_("orphan section '%s' is being placed in section '%s'"),
+                    section_name, section_name);
+      else
+       gold_warning(_("orphan section '%s' from '%s' is being placed "
+                      "in section '%s'"),
+                    section_name, file_name, section_name);
+    }
+
+  // If we couldn't find a mapping for the name, the output section
+  // gets the name of the input section.
   return section_name;
 }
 
This page took 0.024041 seconds and 4 git commands to generate.