OSDN Git Service

From Craig Silverstein: implement -z max-page-size and -z
[pf3gnuchains/pf3gnuchains3x.git] / gold / options.h
1 // options.h -- handle command line options for gold  -*- C++ -*-
2
3 // Copyright 2006, 2007, 2008 Free Software Foundation, Inc.
4 // Written by Ian Lance Taylor <iant@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 // Command_line
24 //   Holds everything we get from the command line.
25 // General_options (from Command_line::options())
26 //   Options which are not position dependent.
27 // Input_argument (from Command_line::inputs())
28 //   The list of input files, including -l options.
29 // Position_dependent_options (from Input_argument::options())
30 //   Position dependent options which apply to this argument.
31
32 #ifndef GOLD_OPTIONS_H
33 #define GOLD_OPTIONS_H
34
35 #include <cstdlib>
36 #include <list>
37 #include <string>
38 #include <vector>
39
40 #include "elfcpp.h"
41 #include "script.h"
42
43 namespace gold
44 {
45
46 class Command_line;
47 class Input_file_group;
48 class Position_dependent_options;
49 class Target;
50
51 namespace options
52 {
53
54 class Command_line_options;
55 struct One_option;
56 struct One_z_option;
57 struct One_debug_option;
58
59 } // End namespace gold::options.
60
61 // A directory to search.  For each directory we record whether it is
62 // in the sysroot.  We need to know this so that, if a linker script
63 // is found within the sysroot, we will apply the sysroot to any files
64 // named by that script.
65
66 class Search_directory
67 {
68  public:
69   // We need a default constructor because we put this in a
70   // std::vector.
71   Search_directory()
72     : name_(NULL), put_in_sysroot_(false), is_in_sysroot_(false)
73   { }
74
75   // This is the usual constructor.
76   Search_directory(const char* name, bool put_in_sysroot)
77     : name_(name), put_in_sysroot_(put_in_sysroot), is_in_sysroot_(false)
78   {
79     if (this->name_.empty())
80       this->name_ = ".";
81   }
82
83   // This is called if we have a sysroot.  The sysroot is prefixed to
84   // any entries for which put_in_sysroot_ is true.  is_in_sysroot_ is
85   // set to true for any enries which are in the sysroot (this will
86   // naturally include any entries for which put_in_sysroot_ is true).
87   // SYSROOT is the sysroot, CANONICAL_SYSROOT is the result of
88   // passing SYSROOT to lrealpath.
89   void
90   add_sysroot(const char* sysroot, const char* canonical_sysroot);
91
92   // Get the directory name.
93   const std::string&
94   name() const
95   { return this->name_; }
96
97   // Return whether this directory is in the sysroot.
98   bool
99   is_in_sysroot() const
100   { return this->is_in_sysroot_; }
101
102  private:
103   std::string name_;
104   bool put_in_sysroot_;
105   bool is_in_sysroot_;
106 };
107
108 // The position independent options which apply to the whole link.
109 // There are a lot of them.
110
111 class General_options
112 {
113  public:
114   enum Object_format
115   {
116     // Ordinary ELF.
117     OBJECT_FORMAT_ELF,
118     // Straight binary format.
119     OBJECT_FORMAT_BINARY
120   };
121
122   General_options(Script_options*);
123
124   // -e: set entry address.
125   const char*
126   entry() const
127   { return this->script_options_->entry(); }
128
129   // -E: export dynamic symbols.
130   bool
131   export_dynamic() const
132   { return this->export_dynamic_; }
133
134   // -h: shared library name.
135   const char*
136   soname() const
137   { return this->soname_; }
138
139   // -I: dynamic linker name.
140   const char*
141   dynamic_linker() const
142   { return this->dynamic_linker_; }
143
144   // -L: Library search path.
145   typedef std::vector<Search_directory> Dir_list;
146
147   const Dir_list&
148   search_path() const
149   { return this->search_path_; }
150
151   // -O: optimization level (0: don't try to optimize output size).
152   int
153   optimize() const
154   { return this->optimization_level_; }
155
156   // -o: Output file name.
157   const char*
158   output_file_name() const
159   { return this->output_file_name_; }
160
161   // --oformat: Output format.
162   Object_format
163   oformat() const
164   { return this->oformat_; }
165
166   // Return the default target.
167   Target*
168   default_target() const;
169
170   // -r: Whether we are doing a relocatable link.
171   bool
172   relocatable() const
173   { return this->is_relocatable_; }
174
175   // -s: Strip all symbols.
176   bool
177   strip_all() const
178   { return this->strip_ == STRIP_ALL; }
179
180   // -S: Strip debugging information.
181   bool
182   strip_debug() const
183   { return this->strip_ == STRIP_ALL || this->strip_ == STRIP_DEBUG; }
184
185   // --strip-debug-gdb: strip only debugging information that's not
186   // used by gdb (at least, for gdb versions <= 6.7).
187   bool
188   strip_debug_gdb() const
189   { return this->strip_debug() || this->strip_ == STRIP_DEBUG_UNUSED_BY_GDB; }
190
191   // --allow-shlib-undefined: do not warn about unresolved symbols in
192   // --shared libraries.
193   bool
194   allow_shlib_undefined() const
195   { return this->allow_shlib_undefined_; }
196
197   // -Bsymbolic: bind defined symbols locally.
198   bool
199   Bsymbolic() const
200   { return this->symbolic_; }
201
202   // --compress-debug-sections: compress .debug_* sections in the
203   // output file using the given compression method.  This is useful
204   // when the tools (such as gdb) support compressed sections.
205   bool
206   compress_debug_sections() const
207   { return this->compress_debug_sections_ != NO_COMPRESSION; }
208
209   bool
210   zlib_compress_debug_sections() const
211   { return this->compress_debug_sections_ == ZLIB_COMPRESSION; }
212
213   // --demangle: demangle C++ symbols in our log messages.
214   bool
215   demangle() const
216   { return this->demangle_; }
217
218   // --detect-odr-violations: Whether to search for One Defn Rule violations.
219   bool
220   detect_odr_violations() const
221   { return this->detect_odr_violations_; }
222
223   // --eh-frame-hdr: Whether to generate an exception frame header.
224   bool
225   eh_frame_hdr() const
226   { return this->create_eh_frame_hdr_; }
227
228   // --rpath: The runtime search path.
229   const Dir_list&
230   rpath() const
231   { return this->rpath_; }
232
233   // --rpath-link: The link time search patch for shared libraries.
234   const Dir_list&
235   rpath_link() const
236   { return this->rpath_link_; }
237
238   // --shared: Whether generating a shared object.
239   bool
240   shared() const
241   { return this->is_shared_; }
242
243   // --static: Whether doing a static link.
244   bool
245   is_static() const
246   { return this->is_static_; }
247
248   // --stats: Print resource usage statistics.
249   bool
250   print_stats() const
251   { return this->print_stats_; }
252
253   // --sysroot: The system root of a cross-linker.
254   const std::string&
255   sysroot() const
256   { return this->sysroot_; }
257
258   // --version-script: The version script to apply if --shared is true.
259   const Version_script_info&
260   version_script() const
261   { return *this->script_options_->version_script_info(); }
262
263   // -Tbss: The address of the BSS segment
264   uint64_t
265   Tbss() const
266   { return this->bss_segment_address_; }
267
268   // Whether -Tbss was used.
269   bool
270   user_set_Tbss() const
271   { return this->bss_segment_address_ != -1U; }
272
273   // -Tdata: The address of the data segment
274   uint64_t
275   Tdata() const
276   { return this->data_segment_address_; }
277
278   // Whether -Tdata was used.
279   bool
280   user_set_Tdata() const
281   { return this->data_segment_address_ != -1U; }
282
283   // -Ttext: The address of the .text section
284   uint64_t
285   Ttext() const
286   { return this->text_segment_address_; }
287
288   // Whether -Ttext was used.
289   bool
290   user_set_Ttext() const
291   { return this->text_segment_address_ != -1U; }
292
293   // --threads: Whether to use threads.
294   bool
295   threads() const
296   { return this->threads_; }
297
298   // --thread-count-initial: Threads to use in initial pass.
299   int
300   thread_count_initial() const
301   { return this->thread_count_initial_; }
302
303   // --thread-count-middle: Threads to use in middle pass.
304   int
305   thread_count_middle() const
306   { return this->thread_count_middle_; }
307
308   // --thread-count-final: Threads to use in final pass.
309   int
310   thread_count_final() const
311   { return this->thread_count_final_; }
312
313   // -z execstack, -z noexecstack
314   bool
315   is_execstack_set() const
316   { return this->execstack_ != EXECSTACK_FROM_INPUT; }
317
318   bool
319   is_stack_executable() const
320   { return this->execstack_ == EXECSTACK_YES; }
321
322   // -z max-page-size
323   uint64_t
324   max_page_size() const
325   { return this->max_page_size_; }
326
327   // -z common-page-size
328   uint64_t
329   common_page_size() const
330   { return this->common_page_size_; }
331
332   // --debug
333   unsigned int
334   debug() const
335   { return this->debug_; }
336
337   // Return the options which may be set from a linker script.
338   Script_options*
339   script_options()
340   { return this->script_options_; }
341
342   const Script_options*
343   script_options() const
344   { return this->script_options_; }
345
346  private:
347   // Don't copy this structure.
348   General_options(const General_options&);
349   General_options& operator=(const General_options&);
350
351   friend class Command_line;
352   friend class options::Command_line_options;
353
354   // Which symbols to strip.
355   enum Strip
356   {
357     // Don't strip any symbols.
358     STRIP_NONE,
359     // Strip all symbols.
360     STRIP_ALL,
361     // Strip debugging information.
362     STRIP_DEBUG,
363     // Strip debugging information that's not used by gdb (at least <= 6.7)
364     STRIP_DEBUG_UNUSED_BY_GDB
365   };
366
367   // Whether to mark the stack as executable.
368   enum Execstack
369   {
370     // Not set on command line.
371     EXECSTACK_FROM_INPUT,
372     // Mark the stack as executable.
373     EXECSTACK_YES,
374     // Mark the stack as not executable.
375     EXECSTACK_NO
376   };
377
378   // What compression method to use
379   enum CompressionMethod
380   {
381     NO_COMPRESSION,
382     ZLIB_COMPRESSION,
383   };
384
385   void
386   set_entry(const char* arg)
387   { this->script_options_->set_entry(arg, strlen(arg)); }
388
389   void
390   set_export_dynamic(bool value)
391   { this->export_dynamic_ = value; }
392
393   void
394   set_soname(const char* arg)
395   { this->soname_ = arg; }
396
397   void
398   set_dynamic_linker(const char* arg)
399   { this->dynamic_linker_ = arg; }
400
401   void
402   add_to_search_path(const char* arg)
403   { this->search_path_.push_back(Search_directory(arg, false)); }
404
405   void
406   add_to_search_path_with_sysroot(const char* arg)
407   { this->search_path_.push_back(Search_directory(arg, true)); }
408
409   void
410   set_optimize(const char* arg)
411   {
412     char* endptr;
413     this->optimization_level_ = strtol(arg, &endptr, 0);
414     if (*endptr != '\0' || this->optimization_level_ < 0)
415       gold_fatal(_("invalid optimization level: %s"), arg);
416   }
417
418   void
419   set_output(const char* arg)
420   { this->output_file_name_ = arg; }
421
422   void
423   set_oformat(const char*);
424
425   void
426   set_relocatable(bool value)
427   { this->is_relocatable_ = value; }
428
429   void
430   set_strip_all(bool)
431   { this->strip_ = STRIP_ALL; }
432
433   // Note: normalize_options() depends on the fact that this turns off
434   // STRIP_ALL if it were already set.
435   void
436   set_strip_debug(bool)
437   { this->strip_ = STRIP_DEBUG; }
438
439   void
440   set_strip_debug_gdb(bool)
441   { this->strip_ = STRIP_DEBUG_UNUSED_BY_GDB; }
442
443   void
444   set_allow_shlib_undefined(bool value)
445   { this->allow_shlib_undefined_ = value; }
446
447   void
448   set_no_allow_shlib_undefined(bool value)
449   { this->set_allow_shlib_undefined(!value); }
450
451   void
452   set_Bsymbolic(bool value)
453   { this->symbolic_ = value; }
454
455   void set_compress_debug_sections(const char* arg)
456   {
457     if (strcmp(arg, "none") == 0)
458       this->compress_debug_sections_ = NO_COMPRESSION;
459 #ifdef HAVE_ZLIB_H
460     else if (strcmp(arg, "zlib") == 0)
461       this->compress_debug_sections_ = ZLIB_COMPRESSION;
462 #endif
463     else
464       gold_fatal(_("unsupported argument to --compress-debug-sections: %s"),
465                  arg);
466   }
467
468   void
469   add_to_defsym(const char* arg);
470
471   void
472   set_demangle(bool value)
473   { this->demangle_ = value; }
474
475   void
476   set_no_demangle(bool value)
477   { this->set_demangle(!value); }
478
479   void
480   set_detect_odr_violations(bool value)
481   { this->detect_odr_violations_ = value; }
482
483   void
484   set_eh_frame_hdr(bool value)
485   { this->create_eh_frame_hdr_ = value; }
486
487   void
488   add_to_rpath(const char* arg)
489   { this->rpath_.push_back(Search_directory(arg, false)); }
490
491   void
492   add_to_rpath_link(const char* arg)
493   { this->rpath_link_.push_back(Search_directory(arg, false)); }
494
495   void
496   set_shared(bool value)
497   { this->is_shared_ = value; }
498
499   void
500   set_static(bool value)
501   { this->is_static_ = value; }
502
503   void
504   set_stats(bool value)
505   { this->print_stats_ = value; }
506
507   void
508   set_sysroot(const char* arg)
509   { this->sysroot_ = arg; }
510
511   void
512   set_segment_address(const char* name, const char* arg, uint64_t* val)
513   {
514     char* endptr;
515     *val = strtoull(arg, &endptr, 0);
516     if (*endptr != '\0' || *val == -1U)
517       gold_fatal(_("invalid argument to %s: %s"), name, arg);
518   }
519
520   void
521   set_Tbss(const char* arg)
522   { this->set_segment_address("-Tbss", arg, &this->bss_segment_address_); }
523
524   void
525   set_Tdata(const char* arg)
526   { this->set_segment_address("-Tdata", arg, &this->data_segment_address_); }
527
528   void
529   set_Ttext(const char* arg)
530   { this->set_segment_address("-Ttext", arg, &this->text_segment_address_); }
531
532   int
533   parse_thread_count(const char* arg)
534   {
535     char* endptr;
536     const int count = strtol(arg, &endptr, 0);
537     if (*endptr != '\0' || count < 0)
538       gold_fatal(_("invalid thread count: %s"), arg);
539     return count;
540   }
541
542   void
543   set_threads(bool value)
544   {
545 #ifndef ENABLE_THREADS
546     if (value)
547       gold_fatal(_("--threads not supported"));
548 #endif
549     this->threads_ = value;
550   }
551
552   void
553   set_no_threads(bool value)
554   { this->set_threads(!value); }
555
556   void
557   set_thread_count(const char* arg)
558   {
559     int count = this->parse_thread_count(arg);
560     this->thread_count_initial_ = count;
561     this->thread_count_middle_ = count;
562     this->thread_count_final_ = count;
563   }
564
565   void
566   set_thread_count_initial(const char* arg)
567   { this->thread_count_initial_ = this->parse_thread_count(arg); }
568
569   void
570   set_thread_count_middle(const char* arg)
571   { this->thread_count_middle_ = this->parse_thread_count(arg); }
572
573   void
574   set_thread_count_final(const char* arg)
575   { this->thread_count_final_ = this->parse_thread_count(arg); }
576
577   void
578   ignore(const char*)
579   { }
580
581   void
582   set_execstack(bool)
583   { this->execstack_ = EXECSTACK_YES; }
584
585   void
586   set_noexecstack(bool)
587   { this->execstack_ = EXECSTACK_NO; }
588
589   void
590   set_max_page_size(const char* arg)
591   {
592     char* endptr;
593     this->max_page_size_ = strtoull(arg, &endptr, 0);
594     if (*endptr != '\0' || this->max_page_size_ == 0)
595       gold_fatal(_("invalid max-page-size: %s"), arg);
596   }
597
598   void
599   set_common_page_size(const char* arg)
600   {
601     char* endptr;
602     this->common_page_size_ = strtoull(arg, &endptr, 0);
603     if (*endptr != '\0' || this->common_page_size_ == 0)
604       gold_fatal(_("invalid common-page-size: %s"), arg);
605   }
606
607   void
608   set_debug(unsigned int flags)
609   { this->debug_ = flags; }
610
611   // Handle the -z option.
612   void
613   handle_z_option(const char*);
614
615   // Handle the --debug option.
616   void
617   handle_debug_option(const char*);
618
619   // Apply any sysroot to the directory lists.
620   void
621   add_sysroot();
622
623   bool export_dynamic_;
624   const char* soname_;
625   const char* dynamic_linker_;
626   Dir_list search_path_;
627   int optimization_level_;
628   const char* output_file_name_;
629   Object_format oformat_;
630   const char* oformat_string_;
631   bool is_relocatable_;
632   Strip strip_;
633   bool allow_shlib_undefined_;
634   bool symbolic_;
635   CompressionMethod compress_debug_sections_;
636   bool demangle_;
637   bool detect_odr_violations_;
638   bool create_eh_frame_hdr_;
639   Dir_list rpath_;
640   Dir_list rpath_link_;
641   bool is_shared_;
642   bool is_static_;
643   bool print_stats_;
644   std::string sysroot_;
645   uint64_t bss_segment_address_;
646   uint64_t data_segment_address_;
647   uint64_t text_segment_address_;
648   bool threads_;
649   int thread_count_initial_;
650   int thread_count_middle_;
651   int thread_count_final_;
652   Execstack execstack_;
653   uint64_t max_page_size_;
654   uint64_t common_page_size_;
655   unsigned int debug_;
656   // Some options can also be set from linker scripts.  Those are
657   // stored here.
658   Script_options* script_options_;
659 };
660
661 // The current state of the position dependent options.
662
663 class Position_dependent_options
664 {
665  public:
666   typedef General_options::Object_format Object_format;
667
668   Position_dependent_options();
669
670   // -Bdynamic/-Bstatic: Whether we are searching for a static archive
671   // -rather than a shared object.
672   bool
673   Bstatic() const
674   { return this->do_static_search_; }
675
676   // --as-needed: Whether to add a DT_NEEDED argument only if the
677   // dynamic object is used.
678   bool
679   as_needed() const
680   { return this->as_needed_; }
681
682   // --whole-archive: Whether to include the entire contents of an
683   // --archive.
684   bool
685   whole_archive() const
686   { return this->include_whole_archive_; }
687
688   // --format: The format of the input file.
689   Object_format
690   format() const
691   { return this->input_format_; }
692
693   void
694   set_Bstatic(bool value)
695   { this->do_static_search_ = value; }
696
697   void
698   set_Bdynamic(bool value)
699   { this->set_Bstatic(!value); }
700
701   void
702   set_as_needed(bool value)
703   { this->as_needed_ = value; }
704
705   void
706   set_no_as_needed(bool value)
707   { this->set_as_needed(!value); }
708
709   void
710   set_whole_archive(bool value)
711   { this->include_whole_archive_ = value; }
712
713   void
714   set_no_whole_archive(bool value)
715   { this->set_whole_archive(!value); }
716
717   void
718   set_format(const char*);
719
720  private:
721   bool do_static_search_;
722   bool as_needed_;
723   bool include_whole_archive_;
724   Object_format input_format_;
725 };
726
727 // A single file or library argument from the command line.
728
729 class Input_file_argument
730 {
731  public:
732   // name: file name or library name
733   // is_lib: true if name is a library name: that is, emits the leading
734   //         "lib" and trailing ".so"/".a" from the name
735   // extra_search_path: an extra directory to look for the file, prior
736   //         to checking the normal library search path.  If this is "",
737   //         then no extra directory is added.
738   // just_symbols: whether this file only defines symbols.
739   // options: The position dependent options at this point in the
740   //         command line, such as --whole-archive.
741   Input_file_argument()
742     : name_(), is_lib_(false), extra_search_path_(""), just_symbols_(false),
743       options_()
744   { }
745
746   Input_file_argument(const char* name, bool is_lib,
747                       const char* extra_search_path,
748                       bool just_symbols,
749                       const Position_dependent_options& options)
750     : name_(name), is_lib_(is_lib), extra_search_path_(extra_search_path),
751       just_symbols_(just_symbols), options_(options)
752   { }
753
754   const char*
755   name() const
756   { return this->name_.c_str(); }
757
758   const Position_dependent_options&
759   options() const
760   { return this->options_; }
761
762   bool
763   is_lib() const
764   { return this->is_lib_; }
765
766   const char*
767   extra_search_path() const
768   {
769     return (this->extra_search_path_.empty()
770             ? NULL
771             : this->extra_search_path_.c_str());
772   }
773
774   // Return whether we should only read symbols from this file.
775   bool
776   just_symbols() const
777   { return this->just_symbols_; }
778
779   // Return whether this file may require a search using the -L
780   // options.
781   bool
782   may_need_search() const
783   { return this->is_lib_ || !this->extra_search_path_.empty(); }
784
785  private:
786   // We use std::string, not const char*, here for convenience when
787   // using script files, so that we do not have to preserve the string
788   // in that case.
789   std::string name_;
790   bool is_lib_;
791   std::string extra_search_path_;
792   bool just_symbols_;
793   Position_dependent_options options_;
794 };
795
796 // A file or library, or a group, from the command line.
797
798 class Input_argument
799 {
800  public:
801   // Create a file or library argument.
802   explicit Input_argument(Input_file_argument file)
803     : is_file_(true), file_(file), group_(NULL)
804   { }
805
806   // Create a group argument.
807   explicit Input_argument(Input_file_group* group)
808     : is_file_(false), group_(group)
809   { }
810
811   // Return whether this is a file.
812   bool
813   is_file() const
814   { return this->is_file_; }
815
816   // Return whether this is a group.
817   bool
818   is_group() const
819   { return !this->is_file_; }
820
821   // Return the information about the file.
822   const Input_file_argument&
823   file() const
824   {
825     gold_assert(this->is_file_);
826     return this->file_;
827   }
828
829   // Return the information about the group.
830   const Input_file_group*
831   group() const
832   {
833     gold_assert(!this->is_file_);
834     return this->group_;
835   }
836
837   Input_file_group*
838   group()
839   {
840     gold_assert(!this->is_file_);
841     return this->group_;
842   }
843
844  private:
845   bool is_file_;
846   Input_file_argument file_;
847   Input_file_group* group_;
848 };
849
850 // A group from the command line.  This is a set of arguments within
851 // --start-group ... --end-group.
852
853 class Input_file_group
854 {
855  public:
856   typedef std::vector<Input_argument> Files;
857   typedef Files::const_iterator const_iterator;
858
859   Input_file_group()
860     : files_()
861   { }
862
863   // Add a file to the end of the group.
864   void
865   add_file(const Input_file_argument& arg)
866   { this->files_.push_back(Input_argument(arg)); }
867
868   // Iterators to iterate over the group contents.
869
870   const_iterator
871   begin() const
872   { return this->files_.begin(); }
873
874   const_iterator
875   end() const
876   { return this->files_.end(); }
877
878  private:
879   Files files_;
880 };
881
882 // A list of files from the command line or a script.
883
884 class Input_arguments
885 {
886  public:
887   typedef std::vector<Input_argument> Input_argument_list;
888   typedef Input_argument_list::const_iterator const_iterator;
889
890   Input_arguments()
891     : input_argument_list_(), in_group_(false)
892   { }
893
894   // Add a file.
895   void
896   add_file(const Input_file_argument& arg);
897
898   // Start a group (the --start-group option).
899   void
900   start_group();
901
902   // End a group (the --end-group option).
903   void
904   end_group();
905
906   // Return whether we are currently in a group.
907   bool
908   in_group() const
909   { return this->in_group_; }
910
911   // The number of entries in the list.
912   int
913   size() const
914   { return this->input_argument_list_.size(); }
915
916   // Iterators to iterate over the list of input files.
917
918   const_iterator
919   begin() const
920   { return this->input_argument_list_.begin(); }
921
922   const_iterator
923   end() const
924   { return this->input_argument_list_.end(); }
925
926   // Return whether the list is empty.
927   bool
928   empty() const
929   { return this->input_argument_list_.empty(); }
930
931  private:
932   Input_argument_list input_argument_list_;
933   bool in_group_;
934 };
935
936 // All the information read from the command line.
937
938 class Command_line
939 {
940  public:
941   typedef Input_arguments::const_iterator const_iterator;
942
943   Command_line(Script_options*);
944
945   // Process the command line options.  This will exit with an
946   // appropriate error message if an unrecognized option is seen.
947   void
948   process(int argc, char** argv);
949
950   // Process one command-line option.  This takes the index of argv to
951   // process, and returns the index for the next option.
952   int
953   process_one_option(int argc, char** argv, int i, bool* no_more_options);
954
955   // Handle a -l option.
956   int
957   process_l_option(int, char**, char*, bool);
958
959   // Handle a -R option when it means --rpath.
960   void
961   add_to_rpath(const char* arg)
962   { this->options_.add_to_rpath(arg); }
963
964   // Add a file for which we just read the symbols.
965   void
966   add_just_symbols_file(const char* arg)
967   {
968     this->inputs_.add_file(Input_file_argument(arg, false, "", true,
969                                                this->position_options_));
970   }
971
972   // Handle a --start-group option.
973   void
974   start_group(const char* arg);
975
976   // Handle a --end-group option.
977   void
978   end_group(const char* arg);
979
980   // Get an option argument--a helper function for special processing.
981   const char*
982   get_special_argument(const char* longname, int argc, char** argv,
983                        const char* arg, bool long_option,
984                        int *pret);
985
986   // Get the general options.
987   const General_options&
988   options() const
989   { return this->options_; }
990
991   // Get the position dependent options.
992   const Position_dependent_options&
993   position_dependent_options() const
994   { return this->position_options_; }
995
996   // Get the options which may be set from a linker script.
997   Script_options*
998   script_options()
999   { return this->options_.script_options(); }
1000
1001   const Script_options*
1002   script_options() const
1003   { return this->options_.script_options(); }
1004
1005   // The number of input files.
1006   int
1007   number_of_input_files() const
1008   { return this->inputs_.size(); }
1009
1010   // Iterators to iterate over the list of input files.
1011
1012   const_iterator
1013   begin() const
1014   { return this->inputs_.begin(); }
1015
1016   const_iterator
1017   end() const
1018   { return this->inputs_.end(); }
1019
1020  private:
1021   Command_line(const Command_line&);
1022   Command_line& operator=(const Command_line&);
1023
1024   // Report usage error.
1025   void
1026   usage() ATTRIBUTE_NORETURN;
1027   void
1028   usage(const char* msg, const char* opt) ATTRIBUTE_NORETURN;
1029   void
1030   usage(const char* msg, char opt) ATTRIBUTE_NORETURN;
1031
1032   // Apply a command line option.
1033   void
1034   apply_option(const gold::options::One_option&, const char*);
1035
1036   // Add a file.
1037   void
1038   add_file(const char* name, bool is_lib);
1039
1040   // Examine the result of processing the command-line, and verify
1041   // the flags do not contradict each other or are otherwise illegal.
1042   void
1043   normalize_options();
1044
1045   General_options options_;
1046   Position_dependent_options position_options_;
1047   Input_arguments inputs_;
1048 };
1049
1050 } // End namespace gold.
1051
1052 #endif // !defined(GOLD_OPTIONS_H)