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