* incremental.cc (Sized_incremental_binary::setup_readers): Allocate
[external/binutils.git] / gold / incremental.h
1 // inremental.h -- incremental linking support for gold   -*- C++ -*-
2
3 // Copyright 2009, 2010 Free Software Foundation, Inc.
4 // Written by Mikolaj Zalewski <mikolajz@google.com>.
5
6 // This file is part of gold.
7
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 3 of the License, or
11 // (at your option) any later version.
12
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the Free Software
20 // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 // MA 02110-1301, USA.
22
23 #ifndef GOLD_INCREMENTAL_H
24 #define GOLD_INCREMENTAL_H
25
26 #include <map>
27 #include <vector>
28
29 #include "elfcpp_file.h"
30 #include "stringpool.h"
31 #include "workqueue.h"
32 #include "fileread.h"
33 #include "output.h"
34 #include "archive.h"
35
36 namespace gold
37 {
38
39 class Input_argument;
40 class Incremental_inputs_checker;
41 class Incremental_script_entry;
42 class Incremental_object_entry;
43 class Incremental_archive_entry;
44 class Incremental_inputs;
45 class Incremental_binary;
46 class Incremental_library;
47 class Object;
48 class Script_info;
49
50 // Incremental input type as stored in .gnu_incremental_inputs.
51
52 enum Incremental_input_type
53 {
54   INCREMENTAL_INPUT_OBJECT = 1,
55   INCREMENTAL_INPUT_ARCHIVE_MEMBER = 2,
56   INCREMENTAL_INPUT_ARCHIVE = 3,
57   INCREMENTAL_INPUT_SHARED_LIBRARY = 4,
58   INCREMENTAL_INPUT_SCRIPT = 5
59 };
60
61 // Incremental input file flags.
62 // The input file type is stored in the lower eight bits.
63
64 enum Incremental_input_flags
65 {
66   INCREMENTAL_INPUT_IN_SYSTEM_DIR = 0x0800
67 };
68
69 // Create an Incremental_binary object for FILE. Returns NULL is this is not
70 // possible, e.g. FILE is not an ELF file or has an unsupported target.
71
72 Incremental_binary*
73 open_incremental_binary(Output_file* file);
74
75 // Base class for recording each input file.
76
77 class Incremental_input_entry
78 {
79  public:
80   Incremental_input_entry(Stringpool::Key filename_key, unsigned int arg_serial,
81                           Timespec mtime)
82     : filename_key_(filename_key), offset_(0), info_offset_(0),
83       arg_serial_(arg_serial), mtime_(mtime), is_in_system_directory_(false)
84   { }
85
86   virtual
87   ~Incremental_input_entry()
88   { }
89
90   // Return the type of input file.
91   Incremental_input_type
92   type() const
93   { return this->do_type(); }
94
95   // Set the section offset of this input file entry.
96   void
97   set_offset(unsigned int offset)
98   { this->offset_ = offset; }
99
100   // Set the section offset of the supplemental information for this entry.
101   void
102   set_info_offset(unsigned int info_offset)
103   { this->info_offset_ = info_offset; }
104
105   // Get the section offset of this input file entry.
106   unsigned int
107   get_offset() const
108   { return this->offset_; }
109
110   // Get the section offset of the supplemental information for this entry.
111   unsigned int
112   get_info_offset() const
113   { return this->info_offset_; }
114
115   // Get the stringpool key for the input filename.
116   Stringpool::Key
117   get_filename_key() const
118   { return this->filename_key_; }
119
120   // Get the serial number of the input file.
121   unsigned int
122   arg_serial() const
123   { return this->arg_serial_; }
124
125   // Get the modification time of the input file.
126   const Timespec&
127   get_mtime() const
128   { return this->mtime_; }
129
130   // Record that the file was found in a system directory.
131   void
132   set_is_in_system_directory()
133   { this->is_in_system_directory_ = true; }
134
135   // Return TRUE if the file was found in a system directory.
136   bool
137   is_in_system_directory() const
138   { return this->is_in_system_directory_; }
139
140   // Return a pointer to the derived Incremental_script_entry object.
141   // Return NULL for input entries that are not script files.
142   Incremental_script_entry*
143   script_entry()
144   { return this->do_script_entry(); }
145
146   // Return a pointer to the derived Incremental_object_entry object.
147   // Return NULL for input entries that are not object files.
148   Incremental_object_entry*
149   object_entry()
150   { return this->do_object_entry(); }
151
152   // Return a pointer to the derived Incremental_archive_entry object.
153   // Return NULL for input entries that are not archive files.
154   Incremental_archive_entry*
155   archive_entry()
156   { return this->do_archive_entry(); }
157
158  protected:
159   // Return the type of input file.
160   virtual Incremental_input_type
161   do_type() const = 0;
162
163   // Return a pointer to the derived Incremental_script_entry object.
164   // Return NULL for input entries that are not script files.
165   virtual Incremental_script_entry*
166   do_script_entry()
167   { return NULL; }
168
169   // Return a pointer to the derived Incremental_object_entry object.
170   // Return NULL for input entries that are not object files.
171   virtual Incremental_object_entry*
172   do_object_entry()
173   { return NULL; }
174
175   // Return a pointer to the derived Incremental_archive_entry object.
176   // Return NULL for input entries that are not archive files.
177   virtual Incremental_archive_entry*
178   do_archive_entry()
179   { return NULL; }
180
181  private:
182   // Key of the filename string in the section stringtable.
183   Stringpool::Key filename_key_;
184
185   // Offset of the entry in the output section.
186   unsigned int offset_;
187
188   // Offset of the extra information in the output section.
189   unsigned int info_offset_;
190
191   // Serial number of the file in the argument list.
192   unsigned int arg_serial_;
193
194   // Last modification time of the file.
195   Timespec mtime_;
196
197   // TRUE if the file was found in a system directory.
198   bool is_in_system_directory_;
199 };
200
201 // Information about a script input that will persist during the whole linker
202 // run.  Needed only during an incremental build to retrieve the input files
203 // added by this script.
204
205 class Script_info
206 {
207  public:
208   Script_info(const std::string& filename)
209     : filename_(filename), incremental_script_entry_(NULL)
210   { }
211
212   // Store a pointer to the incremental information for this script.
213   void
214   set_incremental_info(Incremental_script_entry* entry)
215   { this->incremental_script_entry_ = entry; }
216
217   // Return the filename.
218   const std::string&
219   filename() const
220   { return this->filename_; }
221
222   // Return the pointer to the incremental information for this script.
223   Incremental_script_entry*
224   incremental_info() const
225   { return this->incremental_script_entry_; }
226
227  private:
228   const std::string filename_;
229   Incremental_script_entry* incremental_script_entry_;
230 };
231
232 // Class for recording input scripts.
233
234 class Incremental_script_entry : public Incremental_input_entry
235 {
236  public:
237   Incremental_script_entry(Stringpool::Key filename_key,
238                            unsigned int arg_serial, Script_info* script,
239                            Timespec mtime)
240     : Incremental_input_entry(filename_key, arg_serial, mtime),
241       script_(script), objects_()
242   { }
243
244   // Add a member object to the archive.
245   void
246   add_object(Incremental_input_entry* obj_entry)
247   {
248     this->objects_.push_back(obj_entry);
249   }
250
251   // Return the number of objects included by this script.
252   unsigned int
253   get_object_count()
254   { return this->objects_.size(); }
255
256   // Return the Nth object.
257   Incremental_input_entry*
258   get_object(unsigned int n)
259   {
260     gold_assert(n < this->objects_.size());
261     return this->objects_[n];
262   }
263
264  protected:
265   virtual Incremental_input_type
266   do_type() const
267   { return INCREMENTAL_INPUT_SCRIPT; }
268
269   // Return a pointer to the derived Incremental_script_entry object.
270   virtual Incremental_script_entry*
271   do_script_entry()
272   { return this; }
273
274  private:
275   // Information about the script file.
276   Script_info* script_;
277   // Objects that have been included by this script.
278   std::vector<Incremental_input_entry*> objects_;
279 };
280
281 // Class for recording input object files.
282
283 class Incremental_object_entry : public Incremental_input_entry
284 {
285  public:
286   Incremental_object_entry(Stringpool::Key filename_key, Object* obj,
287                            unsigned int arg_serial, Timespec mtime)
288     : Incremental_input_entry(filename_key, arg_serial, mtime), obj_(obj),
289       is_member_(false), sections_()
290   {
291     if (!obj_->is_dynamic())
292       this->sections_.reserve(obj->shnum());
293   }
294
295   // Get the object.
296   Object*
297   object() const
298   { return this->obj_; }
299
300   // Record that this object is an archive member.
301   void
302   set_is_member()
303   { this->is_member_ = true; }
304
305   // Return true if this object is an archive member.
306   bool
307   is_member() const
308   { return this->is_member_; }
309
310   // Add an input section.
311   void
312   add_input_section(unsigned int shndx, Stringpool::Key name_key, off_t sh_size)
313   { this->sections_.push_back(Input_section(shndx, name_key, sh_size)); }
314
315   // Return the number of input sections in this object.
316   unsigned int
317   get_input_section_count() const
318   { return this->sections_.size(); }
319
320   // Return the input section index for the Nth input section.
321   Stringpool::Key
322   get_input_section_index(unsigned int n) const
323   { return this->sections_[n].shndx_; }
324
325   // Return the stringpool key of the Nth input section.
326   Stringpool::Key
327   get_input_section_name_key(unsigned int n) const
328   { return this->sections_[n].name_key_; }
329
330   // Return the size of the Nth input section.
331   off_t
332   get_input_section_size(unsigned int n) const
333   { return this->sections_[n].sh_size_; }
334
335  protected:
336   virtual Incremental_input_type
337   do_type() const
338   {
339     return (this->is_member_
340             ? INCREMENTAL_INPUT_ARCHIVE_MEMBER
341             : (this->obj_->is_dynamic()
342                ? INCREMENTAL_INPUT_SHARED_LIBRARY
343                : INCREMENTAL_INPUT_OBJECT));
344   }
345
346   // Return a pointer to the derived Incremental_object_entry object.
347   virtual Incremental_object_entry*
348   do_object_entry()
349   { return this; }
350
351  private:
352   // The object file itself.
353   Object* obj_;
354
355   // Whether this object is an archive member.
356   bool is_member_;
357
358   // Input sections.
359   struct Input_section
360   {
361     Input_section(unsigned int shndx, Stringpool::Key name_key, off_t sh_size)
362       : shndx_(shndx), name_key_(name_key), sh_size_(sh_size)
363     { }
364     unsigned int shndx_;
365     Stringpool::Key name_key_;
366     off_t sh_size_;
367   };
368   std::vector<Input_section> sections_;
369 };
370
371 // Class for recording archive library input files.
372
373 class Incremental_archive_entry : public Incremental_input_entry
374 {
375  public:
376   Incremental_archive_entry(Stringpool::Key filename_key,
377                             unsigned int arg_serial, Timespec mtime)
378     : Incremental_input_entry(filename_key, arg_serial, mtime), members_(),
379       unused_syms_()
380   { }
381
382   // Add a member object to the archive.
383   void
384   add_object(Incremental_object_entry* obj_entry)
385   {
386     this->members_.push_back(obj_entry);
387     obj_entry->set_is_member();
388   }
389
390   // Add an unused global symbol to the archive.
391   void
392   add_unused_global_symbol(Stringpool::Key symbol_key)
393   { this->unused_syms_.push_back(symbol_key); }
394
395   // Return the number of member objects included in the link.
396   unsigned int
397   get_member_count()
398   { return this->members_.size(); }
399
400   // Return the Nth member object.
401   Incremental_object_entry*
402   get_member(unsigned int n)
403   { return this->members_[n]; }
404
405   // Return the number of unused global symbols in this archive.
406   unsigned int
407   get_unused_global_symbol_count()
408   { return this->unused_syms_.size(); }
409
410   // Return the Nth unused global symbol.
411   Stringpool::Key
412   get_unused_global_symbol(unsigned int n)
413   { return this->unused_syms_[n]; }
414
415  protected:
416   virtual Incremental_input_type
417   do_type() const
418   { return INCREMENTAL_INPUT_ARCHIVE; }
419
420   // Return a pointer to the derived Incremental_archive_entry object.
421   virtual Incremental_archive_entry*
422   do_archive_entry()
423   { return this; }
424
425  private:
426   // Members of the archive that have been included in the link.
427   std::vector<Incremental_object_entry*> members_;
428
429   // Unused global symbols from this archive.
430   std::vector<Stringpool::Key> unused_syms_;
431 };
432
433 // This class contains the information needed during an incremental
434 // build about the inputs necessary to build the .gnu_incremental_inputs.
435
436 class Incremental_inputs
437 {
438  public:
439   typedef std::vector<Incremental_input_entry*> Input_list;
440
441   Incremental_inputs()
442     : inputs_(), command_line_(), command_line_key_(0),
443       strtab_(new Stringpool()), current_object_(NULL),
444       current_object_entry_(NULL), inputs_section_(NULL),
445       symtab_section_(NULL), relocs_section_(NULL),
446       reloc_count_(0)
447   { }
448
449   ~Incremental_inputs() { delete this->strtab_; }
450
451   // Record the command line.
452   void
453   report_command_line(int argc, const char* const* argv);
454
455   // Record the initial info for archive file ARCHIVE.
456   void
457   report_archive_begin(Library_base* arch, unsigned int arg_serial,
458                        Script_info* script_info);
459
460   // Record the final info for archive file ARCHIVE.
461   void
462   report_archive_end(Library_base* arch);
463
464   // Record the info for object file OBJ.  If ARCH is not NULL,
465   // attach the object file to the archive.
466   void
467   report_object(Object* obj, unsigned int arg_serial, Library_base* arch,
468                 Script_info* script_info);
469
470   // Record an input section belonging to object file OBJ.
471   void
472   report_input_section(Object* obj, unsigned int shndx, const char* name,
473                        off_t sh_size);
474
475   // Record the info for input script SCRIPT.
476   void
477   report_script(Script_info* script, unsigned int arg_serial,
478                 Timespec mtime);
479
480   // Return the running count of incremental relocations.
481   unsigned int
482   get_reloc_count() const
483   { return this->reloc_count_; }
484
485   // Update the running count of incremental relocations.
486   void
487   set_reloc_count(unsigned int count)
488   { this->reloc_count_ = count; }
489
490   // Prepare for layout.  Called from Layout::finalize.
491   void
492   finalize();
493
494   // Create the .gnu_incremental_inputs and related sections.
495   void
496   create_data_sections(Symbol_table* symtab);
497
498   // Return the .gnu_incremental_inputs section.
499   Output_section_data*
500   inputs_section() const
501   { return this->inputs_section_; }
502
503   // Return the .gnu_incremental_symtab section.
504   Output_data_space*
505   symtab_section() const
506   { return this->symtab_section_; }
507
508   // Return the .gnu_incremental_relocs section.
509   Output_data_space*
510   relocs_section() const
511   { return this->relocs_section_; }
512
513   // Return the .gnu_incremental_got_plt section.
514   Output_data_space*
515   got_plt_section() const
516   { return this->got_plt_section_; }
517
518   // Return the .gnu_incremental_strtab stringpool.
519   Stringpool*
520   get_stringpool() const
521   { return this->strtab_; }
522
523   // Return the canonical form of the command line, as will be stored in
524   // .gnu_incremental_strtab.
525   const std::string&
526   command_line() const
527   { return this->command_line_; }
528
529   // Return the stringpool key of the command line.
530   Stringpool::Key
531   command_line_key() const
532   { return this->command_line_key_; }
533
534   // Return the number of input files.
535   int
536   input_file_count() const
537   { return this->inputs_.size(); }
538
539   // Return the input files.
540   const Input_list&
541   input_files() const
542   { return this->inputs_; }
543
544   // Return the sh_entsize value for the .gnu_incremental_relocs section.
545   unsigned int
546   relocs_entsize() const;
547
548  private:
549   // The list of input files.
550   Input_list inputs_;
551
552   // Canonical form of the command line, as will be stored in
553   // .gnu_incremental_strtab.
554   std::string command_line_;
555
556   // The key of the command line string in the string pool.
557   Stringpool::Key command_line_key_;
558
559   // The .gnu_incremental_strtab string pool associated with the
560   // .gnu_incremental_inputs.
561   Stringpool* strtab_;
562
563   // Keep track of the object currently being processed.
564   Object* current_object_;
565   Incremental_object_entry* current_object_entry_;
566
567   // The .gnu_incremental_inputs section.
568   Output_section_data* inputs_section_;
569
570   // The .gnu_incremental_symtab section.
571   Output_data_space* symtab_section_;
572
573   // The .gnu_incremental_relocs section.
574   Output_data_space* relocs_section_;
575
576   // The .gnu_incremental_got_plt section.
577   Output_data_space* got_plt_section_;
578
579   // Total count of incremental relocations.  Updated during Scan_relocs
580   // phase at the completion of each object file.
581   unsigned int reloc_count_;
582 };
583
584 // Reader class for global symbol info from an object file entry in
585 // the .gnu_incremental_inputs section.
586
587 template<bool big_endian>
588 class Incremental_global_symbol_reader
589 {
590  private:
591   typedef elfcpp::Swap<32, big_endian> Swap32;
592
593  public:
594   Incremental_global_symbol_reader(const unsigned char* p)
595     : p_(p)
596   { }
597
598   unsigned int
599   output_symndx() const
600   { return Swap32::readval(this->p_); }
601
602   unsigned int
603   shndx() const
604   { return Swap32::readval(this->p_ + 4); }
605
606   unsigned int
607   next_offset() const
608   { return Swap32::readval(this->p_ + 8); }
609
610   unsigned int
611   reloc_count() const
612   { return Swap32::readval(this->p_ + 12); }
613
614   unsigned int
615   reloc_offset() const
616   { return Swap32::readval(this->p_ + 16); }
617
618  private:
619   // Base address of the symbol entry.
620   const unsigned char* p_;
621 };
622
623 // Reader class for .gnu_incremental_inputs section.
624
625 template<int size, bool big_endian>
626 class Incremental_inputs_reader
627 {
628  private:
629   typedef elfcpp::Swap<size, big_endian> Swap;
630   typedef elfcpp::Swap<16, big_endian> Swap16;
631   typedef elfcpp::Swap<32, big_endian> Swap32;
632   typedef elfcpp::Swap<64, big_endian> Swap64;
633
634  public:
635   Incremental_inputs_reader()
636     : p_(NULL), strtab_(NULL, 0), input_file_count_(0)
637   { }
638
639   Incremental_inputs_reader(const unsigned char* p,
640                             const elfcpp::Elf_strtab& strtab)
641     : p_(p), strtab_(strtab)
642   { this->input_file_count_ = Swap32::readval(this->p_ + 4); }
643
644   // Return the version number.
645   unsigned int
646   version() const
647   { return Swap32::readval(this->p_); }
648
649   // Return the count of input file entries.
650   unsigned int
651   input_file_count() const
652   { return this->input_file_count_; }
653
654   // Return the command line.
655   const char*
656   command_line() const
657   {
658     unsigned int offset = Swap32::readval(this->p_ + 8);
659     return this->get_string(offset);
660   }
661
662   // Reader class for an input file entry and its supplemental info.
663   class Incremental_input_entry_reader
664   {
665    public:
666     Incremental_input_entry_reader(const Incremental_inputs_reader* inputs,
667                                    unsigned int offset)
668       : inputs_(inputs), offset_(offset)
669     {
670       this->info_offset_ = Swap32::readval(inputs->p_ + offset + 4);
671       this->flags_ = Swap16::readval(this->inputs_->p_ + offset + 20);
672     }
673
674     // Return the filename.
675     const char*
676     filename() const
677     {
678       unsigned int offset = Swap32::readval(this->inputs_->p_ + this->offset_);
679       return this->inputs_->get_string(offset);
680     }
681
682     // Return the argument serial number.
683     unsigned int
684     arg_serial() const
685     {
686       return Swap16::readval(this->inputs_->p_ + this->offset_ + 22);
687     }
688
689     // Return the timestamp.
690     Timespec
691     get_mtime() const
692     {
693       Timespec t;
694       const unsigned char* p = this->inputs_->p_ + this->offset_ + 8;
695       t.seconds = Swap64::readval(p);
696       t.nanoseconds = Swap32::readval(p+8);
697       return t;
698     }
699
700     // Return the type of input file.
701     Incremental_input_type
702     type() const
703     { return static_cast<Incremental_input_type>(this->flags_ & 0xff); }
704
705     // Return TRUE if the file was found in a system directory.
706     bool
707     is_in_system_directory() const
708     { return (this->flags_ & INCREMENTAL_INPUT_IN_SYSTEM_DIR) != 0; }
709
710     // Return the input section count -- for objects only.
711     unsigned int
712     get_input_section_count() const
713     {
714       gold_assert(this->type() == INCREMENTAL_INPUT_OBJECT
715                   || this->type() == INCREMENTAL_INPUT_ARCHIVE_MEMBER);
716       return Swap32::readval(this->inputs_->p_ + this->info_offset_);
717     }
718
719     // Return the offset of the supplemental info for symbol SYMNDX --
720     // for objects only.
721     unsigned int
722     get_symbol_offset(unsigned int symndx) const
723     {
724       gold_assert(this->type() == INCREMENTAL_INPUT_OBJECT
725                   || this->type() == INCREMENTAL_INPUT_ARCHIVE_MEMBER);
726
727       unsigned int section_count = this->get_input_section_count();
728       return (this->info_offset_ + 8
729               + section_count * input_section_entry_size
730               + symndx * 20);
731     }
732
733     // Return the global symbol count -- for objects & shared libraries only.
734     unsigned int
735     get_global_symbol_count() const
736     {
737       switch (this->type())
738         {
739         case INCREMENTAL_INPUT_OBJECT:
740         case INCREMENTAL_INPUT_ARCHIVE_MEMBER:
741           return Swap32::readval(this->inputs_->p_ + this->info_offset_ + 4);
742         case INCREMENTAL_INPUT_SHARED_LIBRARY:
743           return Swap32::readval(this->inputs_->p_ + this->info_offset_);
744         default:
745           gold_unreachable();
746         }
747     }
748
749     // Return the object count -- for scripts only.
750     unsigned int
751     get_object_count() const
752     {
753       gold_assert(this->type() == INCREMENTAL_INPUT_SCRIPT);
754       return Swap32::readval(this->inputs_->p_ + this->info_offset_);
755     }
756
757     // Return the input file offset for object N -- for scripts only.
758     unsigned int
759     get_object_offset(unsigned int n) const
760     {
761       gold_assert(this->type() == INCREMENTAL_INPUT_SCRIPT);
762       return Swap32::readval(this->inputs_->p_ + this->info_offset_
763                              + 4 + n * 4);
764     }
765
766     // Return the member count -- for archives only.
767     unsigned int
768     get_member_count() const
769     {
770       gold_assert(this->type() == INCREMENTAL_INPUT_ARCHIVE);
771       return Swap32::readval(this->inputs_->p_ + this->info_offset_);
772     }
773
774     // Return the unused symbol count -- for archives only.
775     unsigned int
776     get_unused_symbol_count() const
777     {
778       gold_assert(this->type() == INCREMENTAL_INPUT_ARCHIVE);
779       return Swap32::readval(this->inputs_->p_ + this->info_offset_ + 4);
780     }
781
782     // Return the input file offset for archive member N -- for archives only.
783     unsigned int
784     get_member_offset(unsigned int n) const
785     {
786       gold_assert(this->type() == INCREMENTAL_INPUT_ARCHIVE);
787       return Swap32::readval(this->inputs_->p_ + this->info_offset_
788                              + 8 + n * 4);
789     }
790
791     // Return the Nth unused global symbol -- for archives only.
792     const char*
793     get_unused_symbol(unsigned int n) const
794     {
795       gold_assert(this->type() == INCREMENTAL_INPUT_ARCHIVE);
796       unsigned int member_count = this->get_member_count();
797       unsigned int offset = Swap32::readval(this->inputs_->p_
798                                             + this->info_offset_ + 8
799                                             + member_count * 4
800                                             + n * 4);
801       return this->inputs_->get_string(offset);
802     }
803
804     // Information about an input section.
805     struct Input_section_info
806     {
807       const char* name;
808       unsigned int output_shndx;
809       off_t sh_offset;
810       off_t sh_size;
811     };
812
813     // Return info about the Nth input section -- for objects only.
814     Input_section_info
815     get_input_section(unsigned int n) const
816     {
817       Input_section_info info;
818       const unsigned char* p = (this->inputs_->p_
819                                 + this->info_offset_ + 8
820                                 + n * input_section_entry_size);
821       unsigned int name_offset = Swap32::readval(p);
822       info.name = this->inputs_->get_string(name_offset);
823       info.output_shndx = Swap32::readval(p + 4);
824       info.sh_offset = Swap::readval(p + 8);
825       info.sh_size = Swap::readval(p + 8 + size / 8);
826       return info;
827     }
828
829     // Return info about the Nth global symbol -- for objects only.
830     Incremental_global_symbol_reader<big_endian>
831     get_global_symbol_reader(unsigned int n) const
832     {
833       gold_assert(this->type() == INCREMENTAL_INPUT_OBJECT
834                   || this->type() == INCREMENTAL_INPUT_ARCHIVE_MEMBER);
835       unsigned int section_count = this->get_input_section_count();
836       const unsigned char* p = (this->inputs_->p_
837                                 + this->info_offset_ + 8
838                                 + section_count * input_section_entry_size
839                                 + n * 20);
840       return Incremental_global_symbol_reader<big_endian>(p);
841     }
842
843     // Return the output symbol index for the Nth global symbol -- for shared
844     // libraries only.  Sets *IS_DEF to TRUE if the symbol is defined in this
845     // input file.
846     unsigned int
847     get_output_symbol_index(unsigned int n, bool* is_def)
848     {
849       gold_assert(this->type() == INCREMENTAL_INPUT_SHARED_LIBRARY);
850       const unsigned char* p = (this->inputs_->p_
851                                 + this->info_offset_ + 4
852                                 + n * 4);
853       unsigned int output_symndx = Swap32::readval(p);
854       *is_def = (output_symndx & (1U << 31)) != 0;
855       return output_symndx & ((1U << 31) - 1);
856     }
857
858    private:
859     // Size of an input section entry.
860     static const unsigned int input_section_entry_size = 8 + 2 * size / 8;
861     // The reader instance for the containing section.
862     const Incremental_inputs_reader* inputs_;
863     // The flags, including the type of input file.
864     unsigned int flags_;
865     // Section offset to the input file entry.
866     unsigned int offset_;
867     // Section offset to the supplemental info for the input file.
868     unsigned int info_offset_;
869   };
870
871   // Return the offset of an input file entry given its index N.
872   unsigned int
873   input_file_offset(unsigned int n) const
874   {
875     gold_assert(n < this->input_file_count_);
876     return 16 + n * 24;
877   }
878
879   // Return the index of an input file entry given its OFFSET.
880   unsigned int
881   input_file_index(unsigned int offset) const
882   {
883     int n = (offset - 16) / 24;
884     gold_assert(input_file_offset(n) == offset);
885     return n;
886   }
887
888   // Return a reader for the Nth input file entry.
889   Incremental_input_entry_reader
890   input_file(unsigned int n) const
891   { return Incremental_input_entry_reader(this, this->input_file_offset(n)); }
892
893   // Return a reader for the input file entry at OFFSET.
894   Incremental_input_entry_reader
895   input_file_at_offset(unsigned int offset) const
896   {
897     gold_assert(offset < 16 + this->input_file_count_ * 24);
898     return Incremental_input_entry_reader(this, offset);
899   }
900
901   // Return a reader for the global symbol info at OFFSET.
902   Incremental_global_symbol_reader<big_endian>
903   global_symbol_reader_at_offset(unsigned int offset) const
904   {
905     const unsigned char* p = this->p_ + offset;
906     return Incremental_global_symbol_reader<big_endian>(p);
907   }
908
909  private:
910   // Lookup a string in the ELF string table.
911   const char* get_string(unsigned int offset) const
912   {
913     const char* s;
914     if (this->strtab_.get_c_string(offset, &s))
915       return s;
916     return NULL;
917   }
918
919   // Base address of the .gnu_incremental_inputs section.
920   const unsigned char* p_;
921   // The associated ELF string table.
922   elfcpp::Elf_strtab strtab_;
923   // The number of input file entries in this section.
924   unsigned int input_file_count_;
925 };
926
927 // Reader class for the .gnu_incremental_symtab section.
928
929 template<bool big_endian>
930 class Incremental_symtab_reader
931 {
932  public:
933   Incremental_symtab_reader()
934     : p_(NULL), len_(0)
935   { }
936
937   Incremental_symtab_reader(const unsigned char* p, off_t len)
938     : p_(p), len_(len)
939   { }
940
941   // Return the count of symbols in this section.
942   unsigned int
943   symbol_count() const
944   { return static_cast<unsigned int>(this->len_ / 4); }
945
946   // Return the list head for symbol table entry N.
947   unsigned int
948   get_list_head(unsigned int n) const
949   { return elfcpp::Swap<32, big_endian>::readval(this->p_ + 4 * n); }
950
951  private:
952   // Base address of the .gnu_incremental_relocs section.
953   const unsigned char* p_;
954   // Size of the section.
955   off_t len_;
956 };
957
958 // Reader class for the .gnu_incremental_relocs section.
959
960 template<int size, bool big_endian>
961 class Incremental_relocs_reader
962 {
963  private:
964   // Size of each field.
965   static const unsigned int field_size = size / 8;
966
967  public:
968   typedef typename elfcpp::Elf_types<size>::Elf_Addr Address;
969   typedef typename elfcpp::Elf_types<size>::Elf_Swxword Addend;
970
971   // Size of each entry.
972   static const unsigned int reloc_size = 8 + 2 * field_size;
973
974   Incremental_relocs_reader()
975     : p_(NULL), len_(0)
976   { }
977
978   Incremental_relocs_reader(const unsigned char* p, off_t len)
979     : p_(p), len_(len)
980   { }
981
982   // Return the count of relocations in this section.
983   unsigned int
984   reloc_count() const
985   { return static_cast<unsigned int>(this->len_ / reloc_size); }
986
987   // Return the relocation type for relocation entry at offset OFF.
988   unsigned int
989   get_r_type(unsigned int off) const
990   { return elfcpp::Swap<32, big_endian>::readval(this->p_ + off); }
991
992   // Return the output section index for relocation entry at offset OFF.
993   unsigned int
994   get_r_shndx(unsigned int off) const
995   { return elfcpp::Swap<32, big_endian>::readval(this->p_ + off + 4); }
996
997   // Return the output section offset for relocation entry at offset OFF.
998   Address
999   get_r_offset(unsigned int off) const
1000   { return elfcpp::Swap<size, big_endian>::readval(this->p_ + off + 8); }
1001
1002   // Return the addend for relocation entry at offset OFF.
1003   Addend
1004   get_r_addend(unsigned int off) const
1005   {
1006     return elfcpp::Swap<size, big_endian>::readval(this->p_ + off + 8
1007                                                    + this->field_size);
1008   }
1009
1010   // Return a pointer to the relocation entry at offset OFF.
1011   const unsigned char*
1012   data(unsigned int off) const
1013   { return this->p_ + off; }
1014
1015  private:
1016   // Base address of the .gnu_incremental_relocs section.
1017   const unsigned char* p_;
1018   // Size of the section.
1019   off_t len_;
1020 };
1021
1022 // Reader class for the .gnu_incremental_got_plt section.
1023
1024 template<bool big_endian>
1025 class Incremental_got_plt_reader
1026 {
1027  public:
1028   Incremental_got_plt_reader()
1029     : p_(NULL), got_count_(0), got_desc_p_(NULL), plt_desc_p_(NULL)
1030   { }
1031
1032   Incremental_got_plt_reader(const unsigned char* p) : p_(p)
1033   {
1034     this->got_count_ = elfcpp::Swap<32, big_endian>::readval(p);
1035     this->got_desc_p_ = p + 8 + ((this->got_count_ + 3) & ~3);
1036     this->plt_desc_p_ = this->got_desc_p_ + this->got_count_ * 4;
1037   }
1038
1039   // Return the GOT entry count.
1040   unsigned int
1041   get_got_entry_count() const
1042   {
1043     return this->got_count_;
1044   }
1045
1046   // Return the PLT entry count.
1047   unsigned int
1048   get_plt_entry_count() const
1049   {
1050     return elfcpp::Swap<32, big_endian>::readval(this->p_ + 4);
1051   }
1052
1053   // Return the GOT type for GOT entry N.
1054   unsigned int
1055   get_got_type(unsigned int n)
1056   {
1057     return this->p_[8 + n];
1058   }
1059
1060   // Return the GOT descriptor for GOT entry N.
1061   unsigned int
1062   get_got_desc(unsigned int n)
1063   {
1064     return elfcpp::Swap<32, big_endian>::readval(this->got_desc_p_ + n * 4);
1065   }
1066
1067   // Return the PLT descriptor for PLT entry N.
1068   unsigned int
1069   get_plt_desc(unsigned int n)
1070   {
1071     return elfcpp::Swap<32, big_endian>::readval(this->plt_desc_p_ + n * 4);
1072   }
1073
1074  private:
1075   // Base address of the .gnu_incremental_got_plt section.
1076   const unsigned char* p_;
1077   // GOT entry count.
1078   unsigned int got_count_;
1079   // Base address of the GOT descriptor array.
1080   const unsigned char* got_desc_p_;
1081   // Base address of the PLT descriptor array.
1082   const unsigned char* plt_desc_p_;
1083 };
1084
1085 // An object representing the ELF file we edit during an incremental build.
1086 // Similar to Object or Dynobj, but operates on Output_file and contains
1087 // methods to support incremental updating. This is the abstract parent class
1088 // implemented in Sized_incremental_binary<size, big_endian> for a specific
1089 // endianness and size.
1090
1091 class Incremental_binary
1092 {
1093  public:
1094   Incremental_binary(Output_file* output, Target* target)
1095     : input_args_map_(), library_map_(), script_map_(),
1096       output_(output), target_(target)
1097   { }
1098
1099   virtual
1100   ~Incremental_binary()
1101   { }
1102
1103   // Check the .gnu_incremental_inputs section to see whether an incremental
1104   // build is possible.
1105   bool
1106   check_inputs(const Command_line& cmdline,
1107                Incremental_inputs* incremental_inputs)
1108   { return this->do_check_inputs(cmdline, incremental_inputs); }
1109
1110   // Report an error.
1111   void
1112   error(const char* format, ...) const ATTRIBUTE_PRINTF_2;
1113
1114   // Proxy class for a sized Incremental_input_entry_reader.
1115
1116   class Input_reader
1117   {
1118    public:
1119     Input_reader()
1120     { }
1121
1122     virtual
1123     ~Input_reader()
1124     { }
1125
1126     const char*
1127     filename() const
1128     { return this->do_filename(); }
1129
1130     Timespec
1131     get_mtime() const
1132     { return this->do_get_mtime(); }
1133
1134     Incremental_input_type
1135     type() const
1136     { return this->do_type(); }
1137
1138     unsigned int
1139     arg_serial() const
1140     { return this->do_arg_serial(); }
1141
1142     unsigned int
1143     get_unused_symbol_count() const
1144     { return this->do_get_unused_symbol_count(); }
1145
1146     const char*
1147     get_unused_symbol(unsigned int n) const
1148     { return this->do_get_unused_symbol(n); }
1149
1150    protected:
1151     virtual const char*
1152     do_filename() const = 0;
1153
1154     virtual Timespec
1155     do_get_mtime() const = 0;
1156
1157     virtual Incremental_input_type
1158     do_type() const = 0;
1159
1160     virtual unsigned int
1161     do_arg_serial() const = 0;
1162
1163     virtual unsigned int
1164     do_get_unused_symbol_count() const = 0;
1165
1166     virtual const char*
1167     do_get_unused_symbol(unsigned int n) const = 0;
1168   };
1169
1170   // Return the number of input files.
1171   unsigned int
1172   input_file_count() const
1173   { return this->do_input_file_count(); }
1174
1175   // Return an Input_reader for input file N.
1176   const Input_reader*
1177   get_input_reader(unsigned int n) const
1178   { return this->do_get_input_reader(n); }
1179
1180   // Return TRUE if the input file N has changed since the last link.
1181   bool
1182   file_has_changed(unsigned int n) const
1183   { return this->do_file_has_changed(n); }
1184
1185   // Return the Input_argument for input file N.  Returns NULL if
1186   // the Input_argument is not available.
1187   const Input_argument*
1188   get_input_argument(unsigned int n) const
1189   {
1190     const Input_reader* input_file = this->do_get_input_reader(n);
1191     unsigned int arg_serial = input_file->arg_serial();
1192     if (arg_serial == 0 || arg_serial > this->input_args_map_.size())
1193       return NULL;
1194     return this->input_args_map_[arg_serial - 1];
1195   }
1196
1197   // Return an Incremental_library for the given input file.
1198   Incremental_library*
1199   get_library(unsigned int n)
1200   { return this->library_map_[n]; }
1201
1202   // Return a Script_info for the given input file.
1203   Script_info*
1204   get_script_info(unsigned int n)
1205   { return this->script_map_[n]; }
1206
1207   // Initialize the layout of the output file based on the existing
1208   // output file.
1209   void
1210   init_layout(Layout* layout)
1211   { this->do_init_layout(layout); }
1212
1213   // Mark regions of the input file that must be kept unchanged.
1214   void
1215   reserve_layout(unsigned int input_file_index)
1216   { this->do_reserve_layout(input_file_index); }
1217
1218   // Apply incremental relocations for symbols whose values have changed.
1219   void
1220   apply_incremental_relocs(const Symbol_table* symtab, Layout* layout,
1221                            Output_file* of)
1222   { this->do_apply_incremental_relocs(symtab, layout, of); }
1223
1224   // Functions and types for the elfcpp::Elf_file interface.  This
1225   // permit us to use Incremental_binary as the File template parameter for
1226   // elfcpp::Elf_file.
1227
1228   // The View class is returned by view.  It must support a single
1229   // method, data().  This is trivial, because Output_file::get_output_view
1230   // does what we need.
1231   class View
1232   {
1233    public:
1234     View(const unsigned char* p)
1235       : p_(p)
1236     { }
1237
1238     const unsigned char*
1239     data() const
1240     { return this->p_; }
1241
1242    private:
1243     const unsigned char* p_;
1244   };
1245
1246   // Return a View.
1247   View
1248   view(off_t file_offset, section_size_type data_size)
1249   { return View(this->output_->get_input_view(file_offset, data_size)); }
1250
1251   // A location in the file.
1252   struct Location
1253   {
1254     off_t file_offset;
1255     off_t data_size;
1256
1257     Location(off_t fo, section_size_type ds)
1258       : file_offset(fo), data_size(ds)
1259     { }
1260
1261     Location()
1262       : file_offset(0), data_size(0)
1263     { }
1264   };
1265
1266   // Get a View given a Location.
1267   View
1268   view(Location loc)
1269   { return View(this->view(loc.file_offset, loc.data_size)); }
1270
1271   // Return the Output_file.
1272   Output_file*
1273   output_file()
1274   { return this->output_; }
1275
1276  protected:
1277   // Check the .gnu_incremental_inputs section to see whether an incremental
1278   // build is possible.
1279   virtual bool
1280   do_check_inputs(const Command_line& cmdline,
1281                   Incremental_inputs* incremental_inputs) = 0;
1282
1283   // Return TRUE if input file N has changed since the last incremental link.
1284   virtual bool
1285   do_file_has_changed(unsigned int n) const = 0;
1286
1287   // Initialize the layout of the output file based on the existing
1288   // output file.
1289   virtual void
1290   do_init_layout(Layout* layout) = 0;
1291
1292   // Mark regions of the input file that must be kept unchanged.
1293   virtual void
1294   do_reserve_layout(unsigned int input_file_index) = 0;
1295
1296   // Apply incremental relocations for symbols whose values have changed.
1297   virtual void
1298   do_apply_incremental_relocs(const Symbol_table*, Layout*, Output_file*) = 0;
1299
1300   virtual unsigned int
1301   do_input_file_count() const = 0;
1302
1303   virtual const Input_reader*
1304   do_get_input_reader(unsigned int) const = 0;
1305
1306   // Map from input file index to Input_argument.
1307   std::vector<const Input_argument*> input_args_map_;
1308   // Map from an input file index to an Incremental_library.
1309   std::vector<Incremental_library*> library_map_;
1310   // Map from an input file index to a Script_info.
1311   std::vector<Script_info*> script_map_;
1312
1313  private:
1314   // Edited output file object.
1315   Output_file* output_;
1316   // Target of the output file.
1317   Target* target_;
1318 };
1319
1320 template<int size, bool big_endian>
1321 class Sized_incremental_binary : public Incremental_binary
1322 {
1323  public:
1324   Sized_incremental_binary(Output_file* output,
1325                            const elfcpp::Ehdr<size, big_endian>& ehdr,
1326                            Target* target)
1327     : Incremental_binary(output, target), elf_file_(this, ehdr),
1328       section_map_(), symbol_map_(), has_incremental_info_(false),
1329       inputs_reader_(), symtab_reader_(), relocs_reader_(), got_plt_reader_(),
1330       input_entry_readers_()
1331   { this->setup_readers(); }
1332
1333   // Returns TRUE if the file contains incremental info.
1334   bool
1335   has_incremental_info() const
1336   { return this->has_incremental_info_; }
1337
1338   // Return the Output_section for section index SHNDX.
1339   Output_section*
1340   output_section(unsigned int shndx)
1341   { return this->section_map_[shndx]; }
1342
1343   // Map a symbol table entry from the input file to the output symbol table.
1344   // SYMNDX is relative to the first forced-local or global symbol in the
1345   // input file symbol table.
1346   void
1347   add_global_symbol(unsigned int symndx, Symbol* gsym)
1348   { this->symbol_map_[symndx] = gsym; }
1349
1350   // Map a symbol table entry from the input file to the output symbol table.
1351   // SYMNDX is relative to the first forced-local or global symbol in the
1352   // input file symbol table.
1353   Symbol*
1354   global_symbol(unsigned int symndx) const
1355   { return this->symbol_map_[symndx]; }
1356
1357   // Readers for the incremental info sections.
1358
1359   const Incremental_inputs_reader<size, big_endian>&
1360   inputs_reader() const
1361   { return this->inputs_reader_; }
1362
1363   const Incremental_symtab_reader<big_endian>&
1364   symtab_reader() const
1365   { return this->symtab_reader_; }
1366
1367   const Incremental_relocs_reader<size, big_endian>&
1368   relocs_reader() const
1369   { return this->relocs_reader_; }
1370
1371   const Incremental_got_plt_reader<big_endian>&
1372   got_plt_reader() const
1373   { return this->got_plt_reader_; }
1374
1375   void
1376   get_symtab_view(View* symtab_view, unsigned int* sym_count,
1377                   elfcpp::Elf_strtab* strtab);
1378
1379  protected:
1380   typedef Incremental_inputs_reader<size, big_endian> Inputs_reader;
1381   typedef typename Inputs_reader::Incremental_input_entry_reader
1382       Input_entry_reader;
1383
1384   virtual bool
1385   do_check_inputs(const Command_line& cmdline,
1386                   Incremental_inputs* incremental_inputs);
1387
1388   // Return TRUE if input file N has changed since the last incremental link.
1389   virtual bool
1390   do_file_has_changed(unsigned int n) const;
1391
1392   // Initialize the layout of the output file based on the existing
1393   // output file.
1394   virtual void
1395   do_init_layout(Layout* layout);
1396
1397   // Mark regions of the input file that must be kept unchanged.
1398   virtual void
1399   do_reserve_layout(unsigned int input_file_index);
1400
1401   // Apply incremental relocations for symbols whose values have changed.
1402   virtual void
1403   do_apply_incremental_relocs(const Symbol_table* symtab, Layout* layout,
1404                               Output_file* of);
1405
1406   // Proxy class for a sized Incremental_input_entry_reader.
1407
1408   class Sized_input_reader : public Input_reader
1409   {
1410    public:
1411     Sized_input_reader(Input_entry_reader r)
1412       : Input_reader(), reader_(r)
1413     { }
1414
1415     virtual
1416     ~Sized_input_reader()
1417     { }
1418
1419    private:
1420     const char*
1421     do_filename() const
1422     { return this->reader_.filename(); }
1423
1424     Timespec
1425     do_get_mtime() const
1426     { return this->reader_.get_mtime(); }
1427
1428     Incremental_input_type
1429     do_type() const
1430     { return this->reader_.type(); }
1431
1432     unsigned int
1433     do_arg_serial() const
1434     { return this->reader_.arg_serial(); }
1435
1436     unsigned int
1437     do_get_unused_symbol_count() const
1438     { return this->reader_.get_unused_symbol_count(); }
1439
1440     const char*
1441     do_get_unused_symbol(unsigned int n) const
1442     { return this->reader_.get_unused_symbol(n); }
1443
1444     Input_entry_reader reader_;
1445   };
1446
1447   virtual unsigned int
1448   do_input_file_count() const
1449   { return this->inputs_reader_.input_file_count(); }
1450
1451   virtual const Input_reader*
1452   do_get_input_reader(unsigned int n) const
1453   {
1454     gold_assert(n < this->input_entry_readers_.size());
1455     return &this->input_entry_readers_[n];
1456   }
1457
1458  private:
1459   bool
1460   find_incremental_inputs_sections(unsigned int* p_inputs_shndx,
1461                                    unsigned int* p_symtab_shndx,
1462                                    unsigned int* p_relocs_shndx,
1463                                    unsigned int* p_got_plt_shndx,
1464                                    unsigned int* p_strtab_shndx);
1465
1466   void
1467   setup_readers();
1468
1469   // Output as an ELF file.
1470   elfcpp::Elf_file<size, big_endian, Incremental_binary> elf_file_;
1471
1472   // Map section index to an Output_section in the updated layout.
1473   std::vector<Output_section*> section_map_;
1474
1475   // Map global symbols from the input file to the symbol table.
1476   std::vector<Symbol*> symbol_map_;
1477
1478   // Readers for the incremental info sections.
1479   bool has_incremental_info_;
1480   Incremental_inputs_reader<size, big_endian> inputs_reader_;
1481   Incremental_symtab_reader<big_endian> symtab_reader_;
1482   Incremental_relocs_reader<size, big_endian> relocs_reader_;
1483   Incremental_got_plt_reader<big_endian> got_plt_reader_;
1484   std::vector<Sized_input_reader> input_entry_readers_;
1485 };
1486
1487 // An incremental Relobj.  This class represents a relocatable object
1488 // that has not changed since the last incremental link, and whose contents
1489 // can be used directly from the base file.
1490
1491 template<int size, bool big_endian>
1492 class Sized_incr_relobj : public Sized_relobj_base<size, big_endian>
1493 {
1494  public:
1495   typedef typename elfcpp::Elf_types<size>::Elf_Addr Address;
1496   typedef typename Sized_relobj_base<size, big_endian>::Symbols Symbols;
1497
1498   static const Address invalid_address = static_cast<Address>(0) - 1;
1499
1500   Sized_incr_relobj(const std::string& name,
1501                     Sized_incremental_binary<size, big_endian>* ibase,
1502                     unsigned int input_file_index);
1503
1504   // Checks if the offset of input section SHNDX within its output
1505   // section is invalid.
1506   bool
1507   is_output_section_offset_invalid(unsigned int shndx) const
1508   { return this->section_offsets_[shndx] == invalid_address; }
1509
1510   // Get the offset of input section SHNDX within its output section.
1511   // This is -1 if the input section requires a special mapping, such
1512   // as a merge section.  The output section can be found in the
1513   // output_sections_ field of the parent class Incrobj.
1514   uint64_t
1515   do_output_section_offset(unsigned int shndx) const
1516   {
1517     gold_assert(shndx < this->section_offsets_.size());
1518     Address off = this->section_offsets_[shndx];
1519     if (off == invalid_address)
1520       return -1ULL;
1521     return off;
1522   }
1523
1524  private:
1525   typedef typename Sized_relobj_base<size, big_endian>::Output_sections
1526       Output_sections;
1527   typedef Incremental_inputs_reader<size, big_endian> Inputs_reader;
1528   typedef typename Inputs_reader::Incremental_input_entry_reader
1529       Input_entry_reader;
1530
1531   // Return TRUE if this is an incremental (unchanged) input file.
1532   bool
1533   do_is_incremental() const
1534   { return true; }
1535
1536   // Return the last modified time of the file.
1537   Timespec
1538   do_get_mtime()
1539   { return this->input_reader_.get_mtime(); }
1540
1541   // Read the symbols.
1542   void
1543   do_read_symbols(Read_symbols_data*);
1544
1545   // Lay out the input sections.
1546   void
1547   do_layout(Symbol_table*, Layout*, Read_symbols_data*);
1548
1549   // Layout sections whose layout was deferred while waiting for
1550   // input files from a plugin.
1551   void
1552   do_layout_deferred_sections(Layout*);
1553
1554   // Add the symbols to the symbol table.
1555   void
1556   do_add_symbols(Symbol_table*, Read_symbols_data*, Layout*);
1557
1558   Archive::Should_include
1559   do_should_include_member(Symbol_table* symtab, Layout*, Read_symbols_data*,
1560                            std::string* why);
1561
1562   // Iterate over global symbols, calling a visitor class V for each.
1563   void
1564   do_for_all_global_symbols(Read_symbols_data* sd,
1565                             Library_base::Symbol_visitor_base* v);
1566
1567   // Iterate over local symbols, calling a visitor class V for each GOT offset
1568   // associated with a local symbol.
1569   void
1570   do_for_all_local_got_entries(Got_offset_list::Visitor* v) const;
1571
1572   // Get the size of a section.
1573   uint64_t
1574   do_section_size(unsigned int shndx);
1575
1576   // Get the name of a section.
1577   std::string
1578   do_section_name(unsigned int shndx);
1579
1580   // Return a view of the contents of a section.
1581   Object::Location
1582   do_section_contents(unsigned int shndx);
1583
1584   // Return section flags.
1585   uint64_t
1586   do_section_flags(unsigned int shndx);
1587
1588   // Return section entsize.
1589   uint64_t
1590   do_section_entsize(unsigned int shndx);
1591
1592   // Return section address.
1593   uint64_t
1594   do_section_address(unsigned int shndx);
1595
1596   // Return section type.
1597   unsigned int
1598   do_section_type(unsigned int shndx);
1599
1600   // Return the section link field.
1601   unsigned int
1602   do_section_link(unsigned int shndx);
1603
1604   // Return the section link field.
1605   unsigned int
1606   do_section_info(unsigned int shndx);
1607
1608   // Return the section alignment.
1609   uint64_t
1610   do_section_addralign(unsigned int shndx);
1611
1612   // Return the Xindex structure to use.
1613   Xindex*
1614   do_initialize_xindex();
1615
1616   // Get symbol counts.
1617   void
1618   do_get_global_symbol_counts(const Symbol_table*, size_t*, size_t*) const;
1619
1620   // Get global symbols.
1621   const Symbols*
1622   do_get_global_symbols() const
1623   { return &this->symbols_; }
1624
1625   // Return the number of local symbols.
1626   unsigned int
1627   do_local_symbol_count() const
1628   { return 0; }
1629
1630   // Read the relocs.
1631   void
1632   do_read_relocs(Read_relocs_data*);
1633
1634   // Process the relocs to find list of referenced sections. Used only
1635   // during garbage collection.
1636   void
1637   do_gc_process_relocs(Symbol_table*, Layout*, Read_relocs_data*);
1638
1639   // Scan the relocs and adjust the symbol table.
1640   void
1641   do_scan_relocs(Symbol_table*, Layout*, Read_relocs_data*);
1642
1643   // Count the local symbols.
1644   void
1645   do_count_local_symbols(Stringpool_template<char>*,
1646                          Stringpool_template<char>*);
1647
1648   // Finalize the local symbols.
1649   unsigned int
1650   do_finalize_local_symbols(unsigned int, off_t, Symbol_table*);
1651
1652   // Set the offset where local dynamic symbol information will be stored.
1653   unsigned int
1654   do_set_local_dynsym_indexes(unsigned int);
1655
1656   // Set the offset where local dynamic symbol information will be stored.
1657   unsigned int
1658   do_set_local_dynsym_offset(off_t);
1659
1660   // Relocate the input sections and write out the local symbols.
1661   void
1662   do_relocate(const Symbol_table* symtab, const Layout*, Output_file* of);
1663
1664   // Set the offset of a section.
1665   void
1666   do_set_section_offset(unsigned int shndx, uint64_t off);
1667
1668   // The Incremental_binary base file.
1669   Sized_incremental_binary<size, big_endian>* ibase_;
1670   // The index of the object in the input file list.
1671   unsigned int input_file_index_;
1672   // The reader for the input file.
1673   Input_entry_reader input_reader_;
1674   // The entries in the symbol table for the external symbols.
1675   Symbols symbols_;
1676   // For each input section, the offset of the input section in its
1677   // output section.  This is INVALID_ADDRESS if the input section requires a
1678   // special mapping.
1679   std::vector<Address> section_offsets_;
1680   // The offset of the first incremental relocation for this object.
1681   unsigned int incr_reloc_offset_;
1682   // The number of incremental relocations for this object.
1683   unsigned int incr_reloc_count_;
1684   // The index of the first incremental relocation for this object in the
1685   // updated output file.
1686   unsigned int incr_reloc_output_index_;
1687   // A copy of the incremental relocations from this object.
1688   unsigned char* incr_relocs_;
1689 };
1690
1691 // An incremental Dynobj.  This class represents a shared object that has
1692 // not changed since the last incremental link, and whose contents can be
1693 // used directly from the base file.
1694
1695 template<int size, bool big_endian>
1696 class Sized_incr_dynobj : public Dynobj
1697 {
1698  public:
1699   typedef typename elfcpp::Elf_types<size>::Elf_Addr Address;
1700
1701   static const Address invalid_address = static_cast<Address>(0) - 1;
1702
1703   Sized_incr_dynobj(const std::string& name,
1704                     Sized_incremental_binary<size, big_endian>* ibase,
1705                     unsigned int input_file_index);
1706
1707  private:
1708   typedef Incremental_inputs_reader<size, big_endian> Inputs_reader;
1709   typedef typename Inputs_reader::Incremental_input_entry_reader
1710       Input_entry_reader;
1711
1712   // Return TRUE if this is an incremental (unchanged) input file.
1713   bool
1714   do_is_incremental() const
1715   { return true; }
1716
1717   // Return the last modified time of the file.
1718   Timespec
1719   do_get_mtime()
1720   { return this->input_reader_.get_mtime(); }
1721
1722   // Read the symbols.
1723   void
1724   do_read_symbols(Read_symbols_data*);
1725
1726   // Lay out the input sections.
1727   void
1728   do_layout(Symbol_table*, Layout*, Read_symbols_data*);
1729
1730   // Add the symbols to the symbol table.
1731   void
1732   do_add_symbols(Symbol_table*, Read_symbols_data*, Layout*);
1733
1734   Archive::Should_include
1735   do_should_include_member(Symbol_table* symtab, Layout*, Read_symbols_data*,
1736                            std::string* why);
1737
1738   // Iterate over global symbols, calling a visitor class V for each.
1739   void
1740   do_for_all_global_symbols(Read_symbols_data* sd,
1741                             Library_base::Symbol_visitor_base* v);
1742
1743   // Iterate over local symbols, calling a visitor class V for each GOT offset
1744   // associated with a local symbol.
1745   void
1746   do_for_all_local_got_entries(Got_offset_list::Visitor* v) const;
1747
1748   // Get the size of a section.
1749   uint64_t
1750   do_section_size(unsigned int shndx);
1751
1752   // Get the name of a section.
1753   std::string
1754   do_section_name(unsigned int shndx);
1755
1756   // Return a view of the contents of a section.
1757   Object::Location
1758   do_section_contents(unsigned int shndx);
1759
1760   // Return section flags.
1761   uint64_t
1762   do_section_flags(unsigned int shndx);
1763
1764   // Return section entsize.
1765   uint64_t
1766   do_section_entsize(unsigned int shndx);
1767
1768   // Return section address.
1769   uint64_t
1770   do_section_address(unsigned int shndx);
1771
1772   // Return section type.
1773   unsigned int
1774   do_section_type(unsigned int shndx);
1775
1776   // Return the section link field.
1777   unsigned int
1778   do_section_link(unsigned int shndx);
1779
1780   // Return the section link field.
1781   unsigned int
1782   do_section_info(unsigned int shndx);
1783
1784   // Return the section alignment.
1785   uint64_t
1786   do_section_addralign(unsigned int shndx);
1787
1788   // Return the Xindex structure to use.
1789   Xindex*
1790   do_initialize_xindex();
1791
1792   // Get symbol counts.
1793   void
1794   do_get_global_symbol_counts(const Symbol_table*, size_t*, size_t*) const;
1795
1796   // Get global symbols.
1797   const Symbols*
1798   do_get_global_symbols() const
1799   { return &this->symbols_; }
1800
1801   // The Incremental_binary base file.
1802   Sized_incremental_binary<size, big_endian>* ibase_;
1803   // The index of the object in the input file list.
1804   unsigned int input_file_index_;
1805   // The reader for the input file.
1806   Input_entry_reader input_reader_;
1807   // The entries in the symbol table for the external symbols.
1808   Symbols symbols_;
1809 };
1810
1811 // Allocate an incremental object of the appropriate size and endianness.
1812 extern Object*
1813 make_sized_incremental_object(
1814     Incremental_binary* base,
1815     unsigned int input_file_index,
1816     Incremental_input_type input_type,
1817     const Incremental_binary::Input_reader* input_reader);
1818
1819 // This class represents an Archive library (or --start-lib/--end-lib group)
1820 // that has not changed since the last incremental link.  Its contents come
1821 // from the incremental inputs entry in the base file.
1822
1823 class Incremental_library : public Library_base
1824 {
1825  public:
1826   Incremental_library(const char* filename, unsigned int input_file_index,
1827                       const Incremental_binary::Input_reader* input_reader)
1828     : Library_base(NULL), filename_(filename),
1829       input_file_index_(input_file_index), input_reader_(input_reader),
1830       unused_symbols_(), is_reported_(false)
1831   { }
1832
1833   // Return the input file index.
1834   unsigned int
1835   input_file_index() const
1836   { return this->input_file_index_; }
1837
1838   // Return the serial number of the input file.
1839   unsigned int
1840   arg_serial() const
1841   { return this->input_reader_->arg_serial(); }
1842
1843   // Copy the unused symbols from the incremental input info.
1844   // We need to do this because we may be overwriting the incremental
1845   // input info in the base file before we write the new incremental
1846   // info.
1847   void
1848   copy_unused_symbols();
1849
1850   // Return FALSE on the first call to indicate that the library needs
1851   // to be recorded; return TRUE subsequently.
1852   bool
1853   is_reported()
1854   {
1855     bool was_reported = this->is_reported_;
1856     is_reported_ = true;
1857     return was_reported;
1858   }
1859
1860  private:
1861   typedef std::vector<std::string> Symbol_list;
1862
1863   // The file name.
1864   const std::string&
1865   do_filename() const
1866   { return this->filename_; }
1867
1868   // Return the modification time of the archive file.
1869   Timespec
1870   do_get_mtime()
1871   { return this->input_reader_->get_mtime(); }
1872
1873   // Iterator for unused global symbols in the library.
1874   void
1875   do_for_all_unused_symbols(Symbol_visitor_base* v) const;
1876
1877   // The name of the library.
1878   std::string filename_;
1879   // The input file index of this library.
1880   unsigned int input_file_index_;
1881   // A reader for the incremental input information.
1882   const Incremental_binary::Input_reader* input_reader_;
1883   // List of unused symbols defined in this library.
1884   Symbol_list unused_symbols_;
1885   // TRUE when this library has been reported to the new incremental info.
1886   bool is_reported_;
1887 };
1888
1889 } // End namespace gold.
1890
1891 #endif // !defined(GOLD_INCREMENTAL_H)