+2017-11-28  Cary Coutant  <ccoutant@gmail.com>
+
+       * object.h (class Sized_relobj_file): Remove discarded_eh_frame_shndx_.
+       * object.cc (Sized_relobj_file::Sized_relobj_file): Likewise.
+       (Sized_relobj_file::layout_eh_frame_section): Likewise.
+       (Sized_relobj_file::do_count_local_symbols): Check for optimized
+       .eh_frame section by other means.
+       (Sized_relobj_file::compute_final_local_value_internal): Likewise.
+
 2017-11-28  H.J. Lu  <hongjiu.lu@intel.com>
 
        * testsuite/pr22266_a.c: Add a newline at end of file.
 
     local_plt_offsets_(),
     kept_comdat_sections_(),
     has_eh_frame_(false),
-    discarded_eh_frame_shndx_(-1U),
     is_deferred_layout_(false),
     deferred_layout_(),
     deferred_layout_relocs_(),
                                               &offset);
   this->output_sections()[shndx] = os;
   if (os == NULL || offset == -1)
-    {
-      // An object can contain at most one section holding exception
-      // frame information.
-      gold_assert(this->discarded_eh_frame_shndx_ == -1U);
-      this->discarded_eh_frame_shndx_ = shndx;
-      this->section_offsets()[shndx] = invalid_address;
-    }
+    this->section_offsets()[shndx] = invalid_address;
   else
     this->section_offsets()[shndx] = convert_types<Address, off_t>(offset);
 
       // Decide whether this symbol should go into the output file.
 
       if (is_ordinary
-         && ((shndx < shnum && out_sections[shndx] == NULL)
-             || shndx == this->discarded_eh_frame_shndx_))
+         && shndx < shnum
+         && (out_sections[shndx] == NULL
+             || (out_sections[shndx]->order() == ORDER_EHFRAME
+                 && out_section_offsets[shndx] == invalid_address)))
        {
+         // This is either a discarded section or an optimized .eh_frame
+         // section.
          lv.set_no_output_symtab_entry();
          gold_assert(!lv.needs_output_dynsym_entry());
          continue;
 
          // This is a SHF_MERGE section or one which otherwise
          // requires special handling.
-         if (shndx == this->discarded_eh_frame_shndx_)
+         if (os->order() == ORDER_EHFRAME)
            {
-             // This local symbol belongs to a discarded .eh_frame
-             // section.  Just treat it like the case in which
+             // This local symbol belongs to a discarded or optimized
+             // .eh_frame section.  Just treat it like the case in which
              // os == NULL above.
              gold_assert(this->has_eh_frame_);
              return This::CFLV_DISCARDED;
 
   Kept_comdat_section_table kept_comdat_sections_;
   // Whether this object has a GNU style .eh_frame section.
   bool has_eh_frame_;
-  // If this object has a GNU style .eh_frame section that is discarded in
-  // output, record the index here.  Otherwise it is -1U.
-  unsigned int discarded_eh_frame_shndx_;
   // True if the layout of this object was deferred, waiting for plugin
   // replacement files.
   bool is_deferred_layout_;