Add licensing text to every source file.
[external/binutils.git] / gold / options.cc
1 // options.c -- handle command line options for gold
2
3 // Copyright 2006, 2007 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 #include <iostream>
24
25 #include "gold.h"
26 #include "options.h"
27
28 namespace gold
29 {
30
31 // The information we keep for a single command line option.
32
33 struct options::One_option
34 {
35   // The single character option name, or '\0' if this is only a long
36   // option.
37   char short_option;
38
39   // The long option name, or NULL if this is only a short option.
40   const char* long_option;
41
42   // Description of the option for --help output, or NULL if there is none.
43   const char* doc;
44
45   // How to print the option name in --help output, or NULL to use the
46   // default.
47   const char* help_output;
48
49   // Long option dash control.  This is ignored if long_option is
50   // NULL.
51   enum
52     {
53       // Long option normally takes one dash; two dashes are also
54       // accepted.
55       ONE_DASH,
56       // Long option normally takes two dashes; one dash is also
57       // accepted.
58       TWO_DASHES,
59       // Long option always takes two dashes.
60       EXACTLY_TWO_DASHES
61     } dash;
62
63   // Function for special handling, or NULL.  Returns the number of
64   // arguments to skip.  This will normally be at least 1, but it may
65   // be 0 if this function changes *argv.  ARG points to the location
66   // in *ARGV where the option starts, which may be helpful for a
67   // short option.
68   int (*special)(int argc, char** argv, char *arg, Command_line*);
69
70   // If this is a position independent option which does not take an
71   // argument, this is the member function to call to record it.
72   void (General_options::*general_noarg)();
73
74   // If this is a position independent function which takes an
75   // argument, this is the member function to call to record it.
76   void (General_options::*general_arg)(const char*);
77
78   // If this is a position dependent option which does not take an
79   // argument, this is the member function to call to record it.
80   void (Position_dependent_options::*dependent_noarg)();
81
82   // If this is a position dependent option which takes an argument,
83   // this is the member function to record it.
84   void (Position_dependent_options::*dependent_arg)(const char*);
85
86   // Return whether this option takes an argument.
87   bool
88   takes_argument() const
89   { return this->general_arg != NULL || this->dependent_arg != NULL; }
90 };
91
92 class options::Command_line_options
93 {
94  public:
95   static const One_option options[];
96   static const int options_size;
97 };
98
99 } // End namespace gold.
100
101 namespace
102 {
103
104 // Handle the special -l option, which adds an input file.
105
106 int
107 library(int argc, char** argv, char* arg, gold::Command_line* cmdline)
108 {
109   return cmdline->process_l_option(argc, argv, arg);
110 }
111
112 // Handle the special --start-group option.
113
114 int
115 start_group(int, char**, char* arg, gold::Command_line* cmdline)
116 {
117   cmdline->start_group(arg);
118   return 1;
119 }
120
121 // Handle the special --end-group option.
122
123 int
124 end_group(int, char**, char* arg, gold::Command_line* cmdline)
125 {
126   cmdline->end_group(arg);
127   return 1;
128 }
129
130 // Report usage information for ld --help, and exit.
131
132 int
133 help(int, char**, char*, gold::Command_line*)
134 {
135   printf(_("Usage: %s [options] file...\nOptions:\n"), gold::program_name);
136
137   const int options_size = gold::options::Command_line_options::options_size;
138   const gold::options::One_option* options =
139     gold::options::Command_line_options::options;
140   for (int i = 0; i < options_size; ++i)
141     {
142       if (options[i].doc == NULL)
143         continue;
144
145       printf("  ");
146       int len = 2;
147       bool comma = false;
148
149       int j = i;
150       do
151         {
152           if (options[j].help_output != NULL)
153             {
154               if (comma)
155                 {
156                   printf(", ");
157                   len += 2;
158                 }
159               printf(options[j].help_output);
160               len += std::strlen(options[i].help_output);
161               comma = true;
162             }
163           else
164             {
165               if (options[j].short_option != '\0')
166                 {
167                   if (comma)
168                     {
169                       printf(", ");
170                       len += 2;
171                     }
172                   printf("-%c", options[j].short_option);
173                   len += 2;
174                   comma = true;
175                 }
176
177               if (options[j].long_option != NULL)
178                 {
179                   if (comma)
180                     {
181                       printf(", ");
182                       len += 2;
183                     }
184                   if (options[j].dash == gold::options::One_option::ONE_DASH)
185                     {
186                       printf("-");
187                       ++len;
188                     }
189                   else
190                     {
191                       printf("--");
192                       len += 2;
193                     }
194                   printf("%s", options[j].long_option);
195                   len += std::strlen(options[j].long_option);
196                   comma = true;
197                 }
198             }
199           ++j;
200         }
201       while (j < options_size && options[j].doc == NULL);
202
203       if (len >= 30)
204         {
205           printf("\n");
206           len = 0;
207         }
208       for (; len < 30; ++len)
209         std::putchar(' ');
210
211       std::puts(options[i].doc);
212     }
213
214   gold::gold_exit(true);
215
216   return 0;
217 }
218
219 } // End anonymous namespace.
220
221 namespace gold
222 {
223
224 // Helper macros used to specify the options.  We could also do this
225 // using constructors, but then g++ would generate code to initialize
226 // the array.  We want the array to be initialized statically so that
227 // we get better startup time.
228
229 #define GENERAL_NOARG(short_option, long_option, doc, help, dash, func) \
230   { short_option, long_option, doc, help, options::One_option::dash, \
231       NULL, func, NULL, NULL, NULL }
232 #define GENERAL_ARG(short_option, long_option, doc, help, dash, func)   \
233   { short_option, long_option, doc, help, options::One_option::dash, \
234       NULL, NULL, func, NULL, NULL }
235 #define POSDEP_NOARG(short_option, long_option, doc, help, dash, func)  \
236   { short_option, long_option, doc, help, options::One_option::dash, \
237       NULL,  NULL, NULL, func, NULL }
238 #define POSDEP_ARG(short_option, long_option, doc, help, dash, func)    \
239   { short_option, long_option, doc, help, options::One_option::dash, \
240       NULL, NULL, NULL, NULL, func }
241 #define SPECIAL(short_option, long_option, doc, help, dash, func)       \
242   { short_option, long_option, doc, help, options::One_option::dash, \
243       func, NULL, NULL, NULL, NULL }
244
245 // Here is the actual list of options which we accept.
246
247 const options::One_option
248 options::Command_line_options::options[] =
249 {
250   SPECIAL('l', "library", N_("Search for library LIBNAME"),
251           N_("-lLIBNAME, --library LIBNAME"), TWO_DASHES,
252           &library),
253   SPECIAL('(', "start-group", N_("Start a library search group"), NULL,
254           TWO_DASHES, &start_group),
255   SPECIAL(')', "end-group", N_("End a library search group"), NULL,
256           TWO_DASHES, &end_group),
257   GENERAL_NOARG('E', "export-dynamic", N_("Export all dynamic symbols"),
258                 NULL, TWO_DASHES, &General_options::set_export_dynamic),
259   GENERAL_ARG('I', "dynamic-linker", N_("Set dynamic linker path"),
260               N_("-I PROGRAM, --dynamic-linker PROGRAM"), TWO_DASHES,
261               &General_options::set_dynamic_linker),
262   GENERAL_ARG('L', "library-path", N_("Add directory to search path"),
263               N_("-L DIR, --library-path DIR"), TWO_DASHES,
264               &General_options::add_to_search_path),
265   GENERAL_ARG('m', NULL, N_("Ignored for compatibility"), NULL, ONE_DASH,
266               &General_options::ignore),
267   GENERAL_ARG('O', NULL, N_("Optimize output file size"),
268               N_("-O level"), ONE_DASH,
269               &General_options::set_optimization_level),
270   GENERAL_ARG('o', "output", N_("Set output file name"),
271               N_("-o FILE, --output FILE"), TWO_DASHES,
272               &General_options::set_output_file_name),
273   GENERAL_NOARG('r', NULL, N_("Generate relocatable output"), NULL,
274                 ONE_DASH, &General_options::set_relocatable),
275   GENERAL_ARG('R', "rpath", N_("Add DIR to runtime search path"),
276               N_("-R DIR, -rpath DIR"), ONE_DASH,
277               &General_options::add_to_rpath),
278   GENERAL_NOARG('\0', "eh-frame-hdr", N_("Create exception frame header"),
279                 NULL, TWO_DASHES, &General_options::set_create_eh_frame_hdr),
280   GENERAL_ARG('\0', "rpath-link",
281               N_("Add DIR to link time shared library search path"),
282               N_("--rpath-link DIR"), TWO_DASHES,
283               &General_options::add_to_rpath_link),
284   GENERAL_NOARG('\0', "shared", N_("Generate shared library"),
285                 NULL, ONE_DASH, &General_options::set_shared),
286   GENERAL_NOARG('\0', "static", N_("Do not link against shared libraries"),
287                 NULL, ONE_DASH, &General_options::set_static),
288   POSDEP_NOARG('\0', "as-needed",
289                N_("Only set DT_NEEDED for dynamic libs if used"),
290                NULL, TWO_DASHES, &Position_dependent_options::set_as_needed),
291   POSDEP_NOARG('\0', "no-as-needed",
292                N_("Always DT_NEEDED for dynamic libs (default)"),
293                NULL, TWO_DASHES, &Position_dependent_options::clear_as_needed),
294   POSDEP_NOARG('\0', "whole-archive",
295                N_("Include all archive contents"),
296                NULL, TWO_DASHES,
297                &Position_dependent_options::set_whole_archive),
298   POSDEP_NOARG('\0', "no-whole-archive",
299                N_("Include only needed archive contents"),
300                NULL, TWO_DASHES,
301                &Position_dependent_options::clear_whole_archive),
302   SPECIAL('\0', "help", N_("Report usage information"), NULL,
303           TWO_DASHES, &help)
304 };
305
306 const int options::Command_line_options::options_size =
307   sizeof (options) / sizeof (options[0]);
308
309 // The default values for the general options.
310
311 General_options::General_options()
312   : export_dynamic_(false),
313     dynamic_linker_(NULL),
314     search_path_(),
315     optimization_level_(0),
316     output_file_name_("a.out"),
317     is_relocatable_(false),
318     create_eh_frame_hdr_(false),
319     rpath_(),
320     rpath_link_(),
321     is_shared_(false),
322     is_static_(false)
323 {
324 }
325
326 // The default values for the position dependent options.
327
328 Position_dependent_options::Position_dependent_options()
329   : do_static_search_(false),
330     as_needed_(false),
331     include_whole_archive_(false)
332 {
333 }
334
335 // Input_arguments methods.
336
337 // Add a file to the list.
338
339 void
340 Input_arguments::add_file(const Input_file_argument& file)
341 {
342   if (!this->in_group_)
343     this->input_argument_list_.push_back(Input_argument(file));
344   else
345     {
346       gold_assert(!this->input_argument_list_.empty());
347       gold_assert(this->input_argument_list_.back().is_group());
348       this->input_argument_list_.back().group()->add_file(file);
349     }
350 }
351
352 // Start a group.
353
354 void
355 Input_arguments::start_group()
356 {
357   gold_assert(!this->in_group_);
358   Input_file_group* group = new Input_file_group();
359   this->input_argument_list_.push_back(Input_argument(group));
360   this->in_group_ = true;
361 }
362
363 // End a group.
364
365 void
366 Input_arguments::end_group()
367 {
368   gold_assert(this->in_group_);
369   this->in_group_ = false;
370 }
371
372 // Command_line options.
373
374 Command_line::Command_line()
375   : options_(), position_options_(), inputs_()
376 {
377 }
378
379 // Process the command line options.
380
381 void
382 Command_line::process(int argc, char** argv)
383 {
384   const int options_size = options::Command_line_options::options_size;
385   const options::One_option* options =
386     options::Command_line_options::options;
387   bool no_more_options = false;
388   int i = 0;
389   while (i < argc)
390     {
391       if (argv[i][0] != '-' || no_more_options)
392         {
393           this->add_file(argv[i], false);
394           ++i;
395           continue;
396         }
397
398       // Option starting with '-'.
399       int dashes = 1;
400       if (argv[i][1] == '-')
401         {
402           dashes = 2;
403           if (argv[i][2] == '\0')
404             {
405               no_more_options = true;
406               continue;
407             }
408         }
409
410       // Look for a long option match.
411       char* opt = argv[i] + dashes;
412       char first = opt[0];
413       int skiparg = 0;
414       char* arg = strchr(opt, '=');
415       if (arg != NULL)
416         *arg = '\0';
417       else if (i + 1 < argc)
418         {
419           arg = argv[i + 1];
420           skiparg = 1;
421         }
422
423       int j;
424       for (j = 0; j < options_size; ++j)
425         {
426           if (options[j].long_option != NULL
427               && (dashes == 2
428                   || (options[j].dash
429                       != options::One_option::EXACTLY_TWO_DASHES))
430               && first == options[j].long_option[0]
431               && strcmp(opt, options[j].long_option) == 0)
432             {
433               if (options[j].special)
434                 i += options[j].special(argc - 1, argv + i, opt, this);
435               else
436                 {
437                   if (!options[j].takes_argument())
438                     {
439                       arg = NULL;
440                       skiparg = 0;
441                     }
442                   else
443                     {
444                       if (arg == NULL)
445                         this->usage(_("missing argument"), argv[i]);
446                     }
447                   this->apply_option(options[j], arg);
448                   i += skiparg + 1;
449                 }
450               break;
451             }
452         }
453       if (j < options_size)
454         continue;
455
456       // If we saw two dashes, we need to see a long option.
457       if (dashes == 2)
458         this->usage(_("unknown option"), argv[i]);
459
460       // Look for a short option match.  There may be more than one
461       // short option in a given argument.
462       bool done = false;
463       char* s = argv[i] + 1;
464       ++i;
465       while (*s != '\0' && !done)
466         {
467           char opt = *s;
468           int j;
469           for (j = 0; j < options_size; ++j)
470             {
471               if (options[j].short_option == opt)
472                 {
473                   if (options[j].special)
474                     {
475                       // Undo the argument skip done above.
476                       --i;
477                       i += options[j].special(argc - i, argv + i, s, this);
478                       done = true;
479                     }
480                   else
481                     {
482                       arg = NULL;
483                       if (options[j].takes_argument())
484                         {
485                           if (s[1] != '\0')
486                             {
487                               arg = s + 1;
488                               done = true;
489                             }
490                           else if (i < argc)
491                             {
492                               arg = argv[i];
493                               ++i;
494                             }
495                           else
496                             this->usage(_("missing argument"), opt);
497                         }
498                       this->apply_option(options[j], arg);
499                     }
500                   break;
501                 }
502             }
503
504           if (j >= options_size)
505             this->usage(_("unknown option"), *s);
506
507           ++s;
508         }
509     }
510
511   if (this->inputs_.in_group())
512     {
513       fprintf(stderr, _("%s: missing group end"), program_name);
514       this->usage();
515     }
516
517   // FIXME: We should only do this when configured in native mode.
518   this->options_.add_to_search_path("/lib");
519   this->options_.add_to_search_path("/usr/lib");
520 }
521
522 // Apply a command line option.
523
524 void
525 Command_line::apply_option(const options::One_option& opt,
526                            const char* arg)
527 {
528   if (arg == NULL)
529     {
530       if (opt.general_noarg)
531         (this->options_.*(opt.general_noarg))();
532       else if (opt.dependent_noarg)
533         (this->position_options_.*(opt.dependent_noarg))();
534       else
535         gold_unreachable();
536     }
537   else
538     {
539       if (opt.general_arg)
540         (this->options_.*(opt.general_arg))(arg);
541       else if (opt.dependent_arg)
542         (this->position_options_.*(opt.dependent_arg))(arg);
543       else
544         gold_unreachable();
545     }
546 }
547
548 // Add an input file or library.
549
550 void
551 Command_line::add_file(const char* name, bool is_lib)
552 {
553   Input_file_argument file(name, is_lib, this->position_options_);
554   this->inputs_.add_file(file);
555 }
556
557 // Handle the -l option, which requires special treatment.
558
559 int
560 Command_line::process_l_option(int argc, char** argv, char* arg)
561 {
562   int ret;
563   const char* libname;
564   if (arg[1] != '\0')
565     {
566       ret = 1;
567       libname = arg + 1;
568     }
569   else if (argc > 1)
570     {
571       ret = 2;
572       libname = argv[argc + 1];
573     }
574   else
575     this->usage(_("missing argument"), arg);
576
577   this->add_file(libname, true);
578
579   return ret;
580 }
581
582 // Handle the --start-group option.
583
584 void
585 Command_line::start_group(const char* arg)
586 {
587   if (this->inputs_.in_group())
588     this->usage(_("may not nest groups"), arg);
589   this->inputs_.start_group();
590 }
591
592 // Handle the --end-group option.
593
594 void
595 Command_line::end_group(const char* arg)
596 {
597   if (!this->inputs_.in_group())
598     this->usage(_("group end without group start"), arg);
599   this->inputs_.end_group();
600 }
601
602 // Report a usage error.  */
603
604 void
605 Command_line::usage()
606 {
607   fprintf(stderr,
608           _("%s: use the --help option for usage information\n"),
609           program_name);
610   gold_exit(false);
611 }
612
613 void
614 Command_line::usage(const char* msg, const char *opt)
615 {
616   fprintf(stderr,
617           _("%s: %s: %s\n"),
618           program_name, opt, msg);
619   this->usage();
620 }
621
622 void
623 Command_line::usage(const char* msg, char opt)
624 {
625   fprintf(stderr,
626           _("%s: -%c: %s\n"),
627           program_name, opt, msg);
628   this->usage();
629 }
630
631 } // End namespace gold.