xref: /dflybsd-src/contrib/binutils-2.34/gold/readsyms.h (revision b52ef7118d1621abed722c5bbbd542210290ecef)
1*fae548d3Szrj // readsyms.h -- read input file symbols for gold   -*- C++ -*-
2*fae548d3Szrj 
3*fae548d3Szrj // Copyright (C) 2006-2020 Free Software Foundation, Inc.
4*fae548d3Szrj // Written by Ian Lance Taylor <iant@google.com>.
5*fae548d3Szrj 
6*fae548d3Szrj // This file is part of gold.
7*fae548d3Szrj 
8*fae548d3Szrj // This program is free software; you can redistribute it and/or modify
9*fae548d3Szrj // it under the terms of the GNU General Public License as published by
10*fae548d3Szrj // the Free Software Foundation; either version 3 of the License, or
11*fae548d3Szrj // (at your option) any later version.
12*fae548d3Szrj 
13*fae548d3Szrj // This program is distributed in the hope that it will be useful,
14*fae548d3Szrj // but WITHOUT ANY WARRANTY; without even the implied warranty of
15*fae548d3Szrj // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16*fae548d3Szrj // GNU General Public License for more details.
17*fae548d3Szrj 
18*fae548d3Szrj // You should have received a copy of the GNU General Public License
19*fae548d3Szrj // along with this program; if not, write to the Free Software
20*fae548d3Szrj // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21*fae548d3Szrj // MA 02110-1301, USA.
22*fae548d3Szrj 
23*fae548d3Szrj #ifndef GOLD_READSYMS_H
24*fae548d3Szrj #define GOLD_READSYMS_H
25*fae548d3Szrj 
26*fae548d3Szrj #include <vector>
27*fae548d3Szrj 
28*fae548d3Szrj #include "workqueue.h"
29*fae548d3Szrj #include "object.h"
30*fae548d3Szrj #include "incremental.h"
31*fae548d3Szrj 
32*fae548d3Szrj namespace gold
33*fae548d3Szrj {
34*fae548d3Szrj 
35*fae548d3Szrj class Input_objects;
36*fae548d3Szrj class Symbol_table;
37*fae548d3Szrj class Input_group;
38*fae548d3Szrj class Archive;
39*fae548d3Szrj class Finish_group;
40*fae548d3Szrj 
41*fae548d3Szrj // This Task is responsible for reading the symbols from an input
42*fae548d3Szrj // file.  This also includes reading the relocations so that we can
43*fae548d3Szrj // check for any that require a PLT and/or a GOT.  After the data has
44*fae548d3Szrj // been read, this queues up another task to actually add the symbols
45*fae548d3Szrj // to the symbol table.  The tasks are separated because the file
46*fae548d3Szrj // reading can occur in parallel but adding the symbols must be done
47*fae548d3Szrj // in the order of the input files.
48*fae548d3Szrj 
49*fae548d3Szrj class Read_symbols : public Task
50*fae548d3Szrj {
51*fae548d3Szrj  public:
52*fae548d3Szrj   // DIRPATH is the list of directories to search for libraries.
53*fae548d3Szrj   // INPUT is the file to read.  INPUT_GROUP is not NULL if we are in
54*fae548d3Szrj   // the middle of an input group.  THIS_BLOCKER is used to prevent
55*fae548d3Szrj   // the associated Add_symbols task from running before the previous
56*fae548d3Szrj   // one has completed; it will be NULL for the first task.
57*fae548d3Szrj   // NEXT_BLOCKER is used to block the next input file from adding
58*fae548d3Szrj   // symbols.
Read_symbols(Input_objects * input_objects,Symbol_table * symtab,Layout * layout,Dirsearch * dirpath,int dirindex,Mapfile * mapfile,const Input_argument * input_argument,Input_group * input_group,Archive_member * member,Task_token * this_blocker,Task_token * next_blocker)59*fae548d3Szrj   Read_symbols(Input_objects* input_objects, Symbol_table* symtab,
60*fae548d3Szrj 	       Layout* layout, Dirsearch* dirpath, int dirindex,
61*fae548d3Szrj 	       Mapfile* mapfile, const Input_argument* input_argument,
62*fae548d3Szrj 	       Input_group* input_group, Archive_member* member,
63*fae548d3Szrj                Task_token* this_blocker, Task_token* next_blocker)
64*fae548d3Szrj     : input_objects_(input_objects), symtab_(symtab), layout_(layout),
65*fae548d3Szrj       dirpath_(dirpath), dirindex_(dirindex), mapfile_(mapfile),
66*fae548d3Szrj       input_argument_(input_argument), input_group_(input_group),
67*fae548d3Szrj       member_(member), this_blocker_(this_blocker),
68*fae548d3Szrj       next_blocker_(next_blocker)
69*fae548d3Szrj   { }
70*fae548d3Szrj 
71*fae548d3Szrj   ~Read_symbols();
72*fae548d3Szrj 
73*fae548d3Szrj   // If appropriate, issue a warning about skipping an incompatible
74*fae548d3Szrj   // object.
75*fae548d3Szrj   static void
76*fae548d3Szrj   incompatible_warning(const Input_argument*, const Input_file*);
77*fae548d3Szrj 
78*fae548d3Szrj   // Requeue a Read_symbols task to search for the next object with
79*fae548d3Szrj   // the same name.
80*fae548d3Szrj   static void
81*fae548d3Szrj   requeue(Workqueue*, Input_objects*, Symbol_table*, Layout*, Dirsearch*,
82*fae548d3Szrj 	  int dirindex, Mapfile*, const Input_argument*, Input_group*,
83*fae548d3Szrj 	  Task_token* next_blocker);
84*fae548d3Szrj 
85*fae548d3Szrj   // The standard Task methods.
86*fae548d3Szrj 
87*fae548d3Szrj   Task_token*
88*fae548d3Szrj   is_runnable();
89*fae548d3Szrj 
90*fae548d3Szrj   void
91*fae548d3Szrj   locks(Task_locker*);
92*fae548d3Szrj 
93*fae548d3Szrj   void
94*fae548d3Szrj   run(Workqueue*);
95*fae548d3Szrj 
96*fae548d3Szrj   std::string
97*fae548d3Szrj   get_name() const;
98*fae548d3Szrj 
99*fae548d3Szrj  private:
100*fae548d3Szrj   // Handle an archive group.
101*fae548d3Szrj   void
102*fae548d3Szrj   do_group(Workqueue*);
103*fae548d3Szrj 
104*fae548d3Szrj   // Handle --start-lib ... --end-lib
105*fae548d3Szrj   bool
106*fae548d3Szrj   do_lib_group(Workqueue*);
107*fae548d3Szrj 
108*fae548d3Szrj   // Handle --whole-archive --start-lib ... --end-lib --no-whole-archive
109*fae548d3Szrj   bool
110*fae548d3Szrj   do_whole_lib_group(Workqueue*);
111*fae548d3Szrj 
112*fae548d3Szrj   // Open and identify the file.
113*fae548d3Szrj   bool
114*fae548d3Szrj   do_read_symbols(Workqueue*);
115*fae548d3Szrj 
116*fae548d3Szrj   Input_objects* input_objects_;
117*fae548d3Szrj   Symbol_table* symtab_;
118*fae548d3Szrj   Layout* layout_;
119*fae548d3Szrj   Dirsearch* dirpath_;
120*fae548d3Szrj   int dirindex_;
121*fae548d3Szrj   Mapfile* mapfile_;
122*fae548d3Szrj   const Input_argument* input_argument_;
123*fae548d3Szrj   Input_group* input_group_;
124*fae548d3Szrj   Archive_member* member_;
125*fae548d3Szrj   Task_token* this_blocker_;
126*fae548d3Szrj   Task_token* next_blocker_;
127*fae548d3Szrj };
128*fae548d3Szrj 
129*fae548d3Szrj // This Task handles adding the symbols to the symbol table.  These
130*fae548d3Szrj // tasks must be run in the same order as the arguments appear on the
131*fae548d3Szrj // command line.
132*fae548d3Szrj 
133*fae548d3Szrj class Add_symbols : public Task
134*fae548d3Szrj {
135*fae548d3Szrj  public:
136*fae548d3Szrj   // THIS_BLOCKER is used to prevent this task from running before the
137*fae548d3Szrj   // one for the previous input file.  NEXT_BLOCKER is used to prevent
138*fae548d3Szrj   // the next task from running.
Add_symbols(Input_objects * input_objects,Symbol_table * symtab,Layout * layout,Dirsearch *,int,Mapfile *,const Input_argument * input_argument,Object * object,Incremental_library * library,Read_symbols_data * sd,Task_token * this_blocker,Task_token * next_blocker)139*fae548d3Szrj   Add_symbols(Input_objects* input_objects, Symbol_table* symtab,
140*fae548d3Szrj 	      Layout* layout, Dirsearch* /*dirpath*/, int /*dirindex*/,
141*fae548d3Szrj 	      Mapfile* /*mapfile*/, const Input_argument* input_argument,
142*fae548d3Szrj 	      Object* object, Incremental_library* library,
143*fae548d3Szrj 	      Read_symbols_data* sd, Task_token* this_blocker,
144*fae548d3Szrj 	      Task_token* next_blocker)
145*fae548d3Szrj     : input_objects_(input_objects), symtab_(symtab), layout_(layout),
146*fae548d3Szrj       input_argument_(input_argument), object_(object), library_(library),
147*fae548d3Szrj       sd_(sd), this_blocker_(this_blocker), next_blocker_(next_blocker)
148*fae548d3Szrj   { }
149*fae548d3Szrj 
150*fae548d3Szrj   ~Add_symbols();
151*fae548d3Szrj 
152*fae548d3Szrj   // The standard Task methods.
153*fae548d3Szrj 
154*fae548d3Szrj   Task_token*
155*fae548d3Szrj   is_runnable();
156*fae548d3Szrj 
157*fae548d3Szrj   void
158*fae548d3Szrj   locks(Task_locker*);
159*fae548d3Szrj 
160*fae548d3Szrj   void
161*fae548d3Szrj   run(Workqueue*);
162*fae548d3Szrj 
163*fae548d3Szrj   std::string
get_name()164*fae548d3Szrj   get_name() const
165*fae548d3Szrj   { return "Add_symbols " + this->object_->name(); }
166*fae548d3Szrj 
167*fae548d3Szrj private:
168*fae548d3Szrj   Input_objects* input_objects_;
169*fae548d3Szrj   Symbol_table* symtab_;
170*fae548d3Szrj   Layout* layout_;
171*fae548d3Szrj   const Input_argument* input_argument_;
172*fae548d3Szrj   Object* object_;
173*fae548d3Szrj   Incremental_library* library_;
174*fae548d3Szrj   Read_symbols_data* sd_;
175*fae548d3Szrj   Task_token* this_blocker_;
176*fae548d3Szrj   Task_token* next_blocker_;
177*fae548d3Szrj };
178*fae548d3Szrj 
179*fae548d3Szrj // This Task is responsible for reading the symbols from an archive
180*fae548d3Szrj // member that has changed since the last incremental link.
181*fae548d3Szrj 
182*fae548d3Szrj class Read_member : public Task
183*fae548d3Szrj {
184*fae548d3Szrj  public:
185*fae548d3Szrj   // INPUT is the file to read.  INPUT_GROUP is not NULL if we are in
186*fae548d3Szrj   // the middle of an input group.  THIS_BLOCKER is used to prevent
187*fae548d3Szrj   // the associated Add_symbols task from running before the previous
188*fae548d3Szrj   // one has completed; it will be NULL for the first task.
189*fae548d3Szrj   // NEXT_BLOCKER is used to block the next input file from adding
190*fae548d3Szrj   // symbols.
Read_member(Input_objects *,Symbol_table *,Layout *,Mapfile *,const Incremental_binary::Input_reader * input_reader,Task_token * this_blocker,Task_token * next_blocker)191*fae548d3Szrj   Read_member(Input_objects* /*input_objects*/, Symbol_table* /*symtab*/,
192*fae548d3Szrj 	      Layout* /*layout*/, Mapfile* /*mapfile*/,
193*fae548d3Szrj 	      const Incremental_binary::Input_reader* input_reader,
194*fae548d3Szrj               Task_token* this_blocker, Task_token* next_blocker)
195*fae548d3Szrj     : input_reader_(input_reader),
196*fae548d3Szrj       this_blocker_(this_blocker), next_blocker_(next_blocker)
197*fae548d3Szrj   { }
198*fae548d3Szrj 
199*fae548d3Szrj   ~Read_member();
200*fae548d3Szrj 
201*fae548d3Szrj   // The standard Task methods.
202*fae548d3Szrj 
203*fae548d3Szrj   Task_token*
204*fae548d3Szrj   is_runnable();
205*fae548d3Szrj 
206*fae548d3Szrj   void
207*fae548d3Szrj   locks(Task_locker*);
208*fae548d3Szrj 
209*fae548d3Szrj   void
210*fae548d3Szrj   run(Workqueue*);
211*fae548d3Szrj 
212*fae548d3Szrj   std::string
get_name()213*fae548d3Szrj   get_name() const
214*fae548d3Szrj   {
215*fae548d3Szrj     return (std::string("Read_member ") + this->input_reader_->filename());
216*fae548d3Szrj   }
217*fae548d3Szrj 
218*fae548d3Szrj  private:
219*fae548d3Szrj   const Incremental_binary::Input_reader* input_reader_;
220*fae548d3Szrj   Task_token* this_blocker_;
221*fae548d3Szrj   Task_token* next_blocker_;
222*fae548d3Szrj };
223*fae548d3Szrj 
224*fae548d3Szrj // This Task is responsible for processing an input script file that has
225*fae548d3Szrj // not changed since the last incremental link.
226*fae548d3Szrj 
227*fae548d3Szrj class Check_script : public Task
228*fae548d3Szrj {
229*fae548d3Szrj  public:
Check_script(Layout * layout,Incremental_binary * ibase,unsigned int input_file_index,const Incremental_binary::Input_reader * input_reader,Task_token * this_blocker,Task_token * next_blocker)230*fae548d3Szrj   Check_script(Layout* layout, Incremental_binary* ibase,
231*fae548d3Szrj 	       unsigned int input_file_index,
232*fae548d3Szrj 	       const Incremental_binary::Input_reader* input_reader,
233*fae548d3Szrj 	       Task_token* this_blocker, Task_token* next_blocker)
234*fae548d3Szrj     : layout_(layout), ibase_(ibase), input_file_index_(input_file_index),
235*fae548d3Szrj       input_reader_(input_reader), this_blocker_(this_blocker),
236*fae548d3Szrj       next_blocker_(next_blocker)
237*fae548d3Szrj   {
238*fae548d3Szrj     this->filename_ = std::string(this->input_reader_->filename());
239*fae548d3Szrj   }
240*fae548d3Szrj 
241*fae548d3Szrj   ~Check_script();
242*fae548d3Szrj 
243*fae548d3Szrj   // The standard Task methods.
244*fae548d3Szrj 
245*fae548d3Szrj   Task_token*
246*fae548d3Szrj   is_runnable();
247*fae548d3Szrj 
248*fae548d3Szrj   void
249*fae548d3Szrj   locks(Task_locker*);
250*fae548d3Szrj 
251*fae548d3Szrj   void
252*fae548d3Szrj   run(Workqueue*);
253*fae548d3Szrj 
254*fae548d3Szrj   std::string
get_name()255*fae548d3Szrj   get_name() const
256*fae548d3Szrj   {
257*fae548d3Szrj     return (std::string("Check_script ") + this->input_reader_->filename());
258*fae548d3Szrj   }
259*fae548d3Szrj 
260*fae548d3Szrj  private:
261*fae548d3Szrj   std::string filename_;
262*fae548d3Szrj   Layout* layout_;
263*fae548d3Szrj   Incremental_binary* ibase_;
264*fae548d3Szrj   unsigned int input_file_index_;
265*fae548d3Szrj   const Incremental_binary::Input_reader* input_reader_;
266*fae548d3Szrj   Task_token* this_blocker_;
267*fae548d3Szrj   Task_token* next_blocker_;
268*fae548d3Szrj };
269*fae548d3Szrj 
270*fae548d3Szrj // This Task is responsible for processing an archive library that has
271*fae548d3Szrj // not changed since the last incremental link.
272*fae548d3Szrj 
273*fae548d3Szrj class Check_library : public Task
274*fae548d3Szrj {
275*fae548d3Szrj  public:
Check_library(Symbol_table *,Layout * layout,Incremental_binary * ibase,unsigned int input_file_index,const Incremental_binary::Input_reader * input_reader,Task_token * this_blocker,Task_token * next_blocker)276*fae548d3Szrj   Check_library(Symbol_table* /*symtab*/, Layout* layout,
277*fae548d3Szrj 		Incremental_binary* ibase,
278*fae548d3Szrj 		unsigned int input_file_index,
279*fae548d3Szrj 		const Incremental_binary::Input_reader* input_reader,
280*fae548d3Szrj 		Task_token* this_blocker, Task_token* next_blocker)
281*fae548d3Szrj     : layout_(layout), ibase_(ibase),
282*fae548d3Szrj       input_file_index_(input_file_index), input_reader_(input_reader),
283*fae548d3Szrj       this_blocker_(this_blocker), next_blocker_(next_blocker)
284*fae548d3Szrj   { }
285*fae548d3Szrj 
286*fae548d3Szrj   ~Check_library();
287*fae548d3Szrj 
288*fae548d3Szrj   // The standard Task methods.
289*fae548d3Szrj 
290*fae548d3Szrj   Task_token*
291*fae548d3Szrj   is_runnable();
292*fae548d3Szrj 
293*fae548d3Szrj   void
294*fae548d3Szrj   locks(Task_locker*);
295*fae548d3Szrj 
296*fae548d3Szrj   void
297*fae548d3Szrj   run(Workqueue*);
298*fae548d3Szrj 
299*fae548d3Szrj   std::string
get_name()300*fae548d3Szrj   get_name() const
301*fae548d3Szrj   {
302*fae548d3Szrj     return (std::string("Check_library ") + this->input_reader_->filename());
303*fae548d3Szrj   }
304*fae548d3Szrj 
305*fae548d3Szrj  private:
306*fae548d3Szrj   Layout* layout_;
307*fae548d3Szrj   Incremental_binary* ibase_;
308*fae548d3Szrj   unsigned int input_file_index_;
309*fae548d3Szrj   const Incremental_binary::Input_reader* input_reader_;
310*fae548d3Szrj   Task_token* this_blocker_;
311*fae548d3Szrj   Task_token* next_blocker_;
312*fae548d3Szrj };
313*fae548d3Szrj 
314*fae548d3Szrj // This class is used to track the archives in a group.
315*fae548d3Szrj 
316*fae548d3Szrj class Input_group
317*fae548d3Szrj {
318*fae548d3Szrj  public:
319*fae548d3Szrj   typedef std::vector<Archive*> Archives;
320*fae548d3Szrj   typedef Archives::const_iterator const_iterator;
321*fae548d3Szrj 
Input_group()322*fae548d3Szrj   Input_group()
323*fae548d3Szrj     : archives_()
324*fae548d3Szrj   { }
325*fae548d3Szrj 
326*fae548d3Szrj   ~Input_group();
327*fae548d3Szrj 
328*fae548d3Szrj   // Add an archive to the group.
329*fae548d3Szrj   void
add_archive(Archive * arch)330*fae548d3Szrj   add_archive(Archive* arch)
331*fae548d3Szrj   { this->archives_.push_back(arch); }
332*fae548d3Szrj 
333*fae548d3Szrj   // Loop over the archives in the group.
334*fae548d3Szrj 
335*fae548d3Szrj   const_iterator
begin()336*fae548d3Szrj   begin() const
337*fae548d3Szrj   { return this->archives_.begin(); }
338*fae548d3Szrj 
339*fae548d3Szrj   const_iterator
end()340*fae548d3Szrj   end() const
341*fae548d3Szrj   { return this->archives_.end(); }
342*fae548d3Szrj 
343*fae548d3Szrj  private:
344*fae548d3Szrj   Archives archives_;
345*fae548d3Szrj };
346*fae548d3Szrj 
347*fae548d3Szrj // This class starts the handling of a group.  It exists only to pick
348*fae548d3Szrj // up the number of undefined symbols at that point, so that we only
349*fae548d3Szrj // run back through the group if we saw a new undefined symbol.
350*fae548d3Szrj 
351*fae548d3Szrj class Start_group : public Task
352*fae548d3Szrj {
353*fae548d3Szrj  public:
Start_group(Symbol_table * symtab,Finish_group * finish_group,Task_token * this_blocker,Task_token * next_blocker)354*fae548d3Szrj   Start_group(Symbol_table* symtab, Finish_group* finish_group,
355*fae548d3Szrj 	      Task_token* this_blocker, Task_token* next_blocker)
356*fae548d3Szrj     : symtab_(symtab), finish_group_(finish_group),
357*fae548d3Szrj       this_blocker_(this_blocker), next_blocker_(next_blocker)
358*fae548d3Szrj   { }
359*fae548d3Szrj 
360*fae548d3Szrj   ~Start_group();
361*fae548d3Szrj 
362*fae548d3Szrj   // The standard Task methods.
363*fae548d3Szrj 
364*fae548d3Szrj   Task_token*
365*fae548d3Szrj   is_runnable();
366*fae548d3Szrj 
367*fae548d3Szrj   void
368*fae548d3Szrj   locks(Task_locker*);
369*fae548d3Szrj 
370*fae548d3Szrj   void
371*fae548d3Szrj   run(Workqueue*);
372*fae548d3Szrj 
373*fae548d3Szrj   std::string
get_name()374*fae548d3Szrj   get_name() const
375*fae548d3Szrj   { return "Start_group"; }
376*fae548d3Szrj 
377*fae548d3Szrj  private:
378*fae548d3Szrj   Symbol_table* symtab_;
379*fae548d3Szrj   Finish_group* finish_group_;
380*fae548d3Szrj   Task_token* this_blocker_;
381*fae548d3Szrj   Task_token* next_blocker_;
382*fae548d3Szrj };
383*fae548d3Szrj 
384*fae548d3Szrj // This class is used to finish up handling a group.  It is just a
385*fae548d3Szrj // closure.
386*fae548d3Szrj 
387*fae548d3Szrj class Finish_group : public Task
388*fae548d3Szrj {
389*fae548d3Szrj  public:
Finish_group(Input_objects * input_objects,Symbol_table * symtab,Layout * layout,Mapfile * mapfile,Input_group * input_group,Task_token * next_blocker)390*fae548d3Szrj   Finish_group(Input_objects* input_objects, Symbol_table* symtab,
391*fae548d3Szrj 	       Layout* layout, Mapfile* mapfile, Input_group* input_group,
392*fae548d3Szrj 	       Task_token* next_blocker)
393*fae548d3Szrj     : input_objects_(input_objects), symtab_(symtab),
394*fae548d3Szrj       layout_(layout), mapfile_(mapfile), input_group_(input_group),
395*fae548d3Szrj       saw_undefined_(0), this_blocker_(NULL), next_blocker_(next_blocker)
396*fae548d3Szrj   { }
397*fae548d3Szrj 
398*fae548d3Szrj   ~Finish_group();
399*fae548d3Szrj 
400*fae548d3Szrj   // Set the number of undefined symbols when we start processing the
401*fae548d3Szrj   // group.  This is called by the Start_group task.
402*fae548d3Szrj   void
set_saw_undefined(size_t saw_undefined)403*fae548d3Szrj   set_saw_undefined(size_t saw_undefined)
404*fae548d3Szrj   { this->saw_undefined_ = saw_undefined; }
405*fae548d3Szrj 
406*fae548d3Szrj   // Set the blocker to use for this task.
407*fae548d3Szrj   void
set_blocker(Task_token * this_blocker)408*fae548d3Szrj   set_blocker(Task_token* this_blocker)
409*fae548d3Szrj   {
410*fae548d3Szrj     gold_assert(this->this_blocker_ == NULL);
411*fae548d3Szrj     this->this_blocker_ = this_blocker;
412*fae548d3Szrj   }
413*fae548d3Szrj 
414*fae548d3Szrj   // The standard Task methods.
415*fae548d3Szrj 
416*fae548d3Szrj   Task_token*
417*fae548d3Szrj   is_runnable();
418*fae548d3Szrj 
419*fae548d3Szrj   void
420*fae548d3Szrj   locks(Task_locker*);
421*fae548d3Szrj 
422*fae548d3Szrj   void
423*fae548d3Szrj   run(Workqueue*);
424*fae548d3Szrj 
425*fae548d3Szrj   std::string
get_name()426*fae548d3Szrj   get_name() const
427*fae548d3Szrj   { return "Finish_group"; }
428*fae548d3Szrj 
429*fae548d3Szrj  private:
430*fae548d3Szrj   Input_objects* input_objects_;
431*fae548d3Szrj   Symbol_table* symtab_;
432*fae548d3Szrj   Layout* layout_;
433*fae548d3Szrj   Mapfile* mapfile_;
434*fae548d3Szrj   Input_group* input_group_;
435*fae548d3Szrj   size_t saw_undefined_;
436*fae548d3Szrj   Task_token* this_blocker_;
437*fae548d3Szrj   Task_token* next_blocker_;
438*fae548d3Szrj };
439*fae548d3Szrj 
440*fae548d3Szrj // This class is used to read a file which was not recognized as an
441*fae548d3Szrj // object or archive.  It tries to read it as a linker script, using
442*fae548d3Szrj // the tokens to serialize with the calls to Add_symbols.
443*fae548d3Szrj 
444*fae548d3Szrj class Read_script : public Task
445*fae548d3Szrj {
446*fae548d3Szrj  public:
Read_script(Symbol_table * symtab,Layout * layout,Dirsearch * dirpath,int dirindex,Input_objects * input_objects,Mapfile * mapfile,Input_group * input_group,const Input_argument * input_argument,Input_file * input_file,Task_token * this_blocker,Task_token * next_blocker)447*fae548d3Szrj   Read_script(Symbol_table* symtab, Layout* layout, Dirsearch* dirpath,
448*fae548d3Szrj 	      int dirindex, Input_objects* input_objects, Mapfile* mapfile,
449*fae548d3Szrj 	      Input_group* input_group, const Input_argument* input_argument,
450*fae548d3Szrj 	      Input_file* input_file, Task_token* this_blocker,
451*fae548d3Szrj 	      Task_token* next_blocker)
452*fae548d3Szrj     : symtab_(symtab), layout_(layout), dirpath_(dirpath), dirindex_(dirindex),
453*fae548d3Szrj       input_objects_(input_objects), mapfile_(mapfile),
454*fae548d3Szrj       input_group_(input_group), input_argument_(input_argument),
455*fae548d3Szrj       input_file_(input_file), this_blocker_(this_blocker),
456*fae548d3Szrj       next_blocker_(next_blocker)
457*fae548d3Szrj   { }
458*fae548d3Szrj 
459*fae548d3Szrj   ~Read_script();
460*fae548d3Szrj 
461*fae548d3Szrj   // The standard Task methods.
462*fae548d3Szrj 
463*fae548d3Szrj   Task_token*
464*fae548d3Szrj   is_runnable();
465*fae548d3Szrj 
466*fae548d3Szrj   void
467*fae548d3Szrj   locks(Task_locker*);
468*fae548d3Szrj 
469*fae548d3Szrj   void
470*fae548d3Szrj   run(Workqueue*);
471*fae548d3Szrj 
472*fae548d3Szrj   std::string
473*fae548d3Szrj   get_name() const;
474*fae548d3Szrj 
475*fae548d3Szrj  private:
476*fae548d3Szrj   Symbol_table* symtab_;
477*fae548d3Szrj   Layout* layout_;
478*fae548d3Szrj   Dirsearch* dirpath_;
479*fae548d3Szrj   int dirindex_;
480*fae548d3Szrj   Input_objects* input_objects_;
481*fae548d3Szrj   Mapfile* mapfile_;
482*fae548d3Szrj   Input_group* input_group_;
483*fae548d3Szrj   const Input_argument* input_argument_;
484*fae548d3Szrj   Input_file* input_file_;
485*fae548d3Szrj   Task_token* this_blocker_;
486*fae548d3Szrj   Task_token* next_blocker_;
487*fae548d3Szrj };
488*fae548d3Szrj 
489*fae548d3Szrj } // end namespace gold
490*fae548d3Szrj 
491*fae548d3Szrj #endif // !defined(GOLD_READSYMS_H)
492