OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-binutils/] [binutils-2.19.1/] [gold/] [options.h] - Blame information for rev 7

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 6 jlechner
// 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
// General_options (from Command_line::options())
24
//   All the options (a.k.a. command-line flags)
25
// Input_argument (from Command_line::inputs())
26
//   The list of input files, including -l options.
27
// Command_line
28
//   Everything we get from the command line -- the General_options
29
//   plus the Input_arguments.
30
//
31
// There are also some smaller classes, such as
32
// Position_dependent_options which hold a subset of General_options
33
// that change as options are parsed (as opposed to the usual behavior
34
// of the last instance of that option specified on the commandline wins).
35
 
36
#ifndef GOLD_OPTIONS_H
37
#define GOLD_OPTIONS_H
38
 
39
#include <cstdlib>
40
#include <cstring>
41
#include <list>
42
#include <string>
43
#include <vector>
44
 
45
#include "elfcpp.h"
46
#include "script.h"
47
 
48
namespace gold
49
{
50
 
51
class Command_line;
52
class General_options;
53
class Search_directory;
54
class Input_file_group;
55
class Position_dependent_options;
56
class Target;
57
 
58
// The nested namespace is to contain all the global variables and
59
// structs that need to be defined in the .h file, but do not need to
60
// be used outside this class.
61
namespace options
62
{
63
typedef std::vector<Search_directory> Dir_list;
64
typedef Unordered_set<std::string> String_set;
65
 
66
// These routines convert from a string option to various types.
67
// Each gives a fatal error if it cannot parse the argument.
68
 
69
extern void
70
parse_bool(const char* option_name, const char* arg, bool* retval);
71
 
72
extern void
73
parse_uint(const char* option_name, const char* arg, int* retval);
74
 
75
extern void
76
parse_uint64(const char* option_name, const char* arg, uint64_t* retval);
77
 
78
extern void
79
parse_double(const char* option_name, const char* arg, double* retval);
80
 
81
extern void
82
parse_string(const char* option_name, const char* arg, const char** retval);
83
 
84
extern void
85
parse_optional_string(const char* option_name, const char* arg,
86
                      const char** retval);
87
 
88
extern void
89
parse_dirlist(const char* option_name, const char* arg, Dir_list* retval);
90
 
91
extern void
92
parse_set(const char* option_name, const char* arg, String_set* retval);
93
 
94
extern void
95
parse_choices(const char* option_name, const char* arg, const char** retval,
96
              const char* choices[], int num_choices);
97
 
98
struct Struct_var;
99
 
100
// Most options have both a shortname (one letter) and a longname.
101
// This enum controls how many dashes are expected for longname access
102
// -- shortnames always use one dash.  Most longnames will accept
103
// either one dash or two; the only difference between ONE_DASH and
104
// TWO_DASHES is how we print the option in --help.  However, some
105
// longnames require two dashes, and some require only one.  The
106
// special value DASH_Z means that the option is preceded by "-z".
107
enum Dashes
108
{
109
  ONE_DASH, TWO_DASHES, EXACTLY_ONE_DASH, EXACTLY_TWO_DASHES, DASH_Z
110
};
111
 
112
// LONGNAME is the long-name of the option with dashes converted to
113
//    underscores, or else the short-name if the option has no long-name.
114
//    It is never the empty string.
115
// DASHES is an instance of the Dashes enum: ONE_DASH, TWO_DASHES, etc.
116
// SHORTNAME is the short-name of the option, as a char, or '\0' if the
117
//    option has no short-name.  If the option has no long-name, you
118
//    should specify the short-name in *both* VARNAME and here.
119
// DEFAULT_VALUE is the value of the option if not specified on the
120
//    commandline, as a string.
121
// HELPSTRING is the descriptive text used with the option via --help
122
// HELPARG is how you define the argument to the option.
123
//    --help output is "-shortname HELPARG, --longname HELPARG: HELPSTRING"
124
//    HELPARG should be NULL iff the option is a bool and takes no arg.
125
// OPTIONAL_ARG is true if this option takes an optional argument.  An
126
//    optional argument must be specifid as --OPTION=VALUE, not
127
//    --OPTION VALUE.
128
// READER provides parse_to_value, which is a function that will convert
129
//    a char* argument into the proper type and store it in some variable.
130
// A One_option struct initializes itself with the global list of options
131
// at constructor time, so be careful making one of these.
132
struct One_option
133
{
134
  std::string longname;
135
  Dashes dashes;
136
  char shortname;
137
  const char* default_value;
138
  const char* helpstring;
139
  const char* helparg;
140
  bool optional_arg;
141
  Struct_var* reader;
142
 
143
  One_option(const char* ln, Dashes d, char sn, const char* dv,
144
             const char* hs, const char* ha, bool oa, Struct_var* r)
145
    : longname(ln), dashes(d), shortname(sn), default_value(dv ? dv : ""),
146
      helpstring(hs), helparg(ha), optional_arg(oa), reader(r)
147
  {
148
    // In longname, we convert all underscores to dashes, since GNU
149
    // style uses dashes in option names.  longname is likely to have
150
    // underscores in it because it's also used to declare a C++
151
    // function.
152
    const char* pos = strchr(this->longname.c_str(), '_');
153
    for (; pos; pos = strchr(pos, '_'))
154
      this->longname[pos - this->longname.c_str()] = '-';
155
 
156
    // We only register ourselves if our helpstring is not NULL.  This
157
    // is to support the "no-VAR" boolean variables, which we
158
    // conditionally turn on by defining "no-VAR" help text.
159
    if (this->helpstring)
160
      this->register_option();
161
  }
162
 
163
  // This option takes an argument iff helparg is not NULL.
164
  bool
165
  takes_argument() const
166
  { return this->helparg != NULL; }
167
 
168
  // Whether the argument is optional.
169
  bool
170
  takes_optional_argument() const
171
  { return this->optional_arg; }
172
 
173
  // Register this option with the global list of options.
174
  void
175
  register_option();
176
 
177
  // Print this option to stdout (used with --help).
178
  void
179
  print() const;
180
};
181
 
182
// All options have a Struct_##varname that inherits from this and
183
// actually implements parse_to_value for that option.
184
struct Struct_var
185
{
186
  // OPTION: the name of the option as specified on the commandline,
187
  //    including leading dashes, and any text following the option:
188
  //    "-O", "--defsym=mysym=0x1000", etc.
189
  // ARG: the arg associated with this option, or NULL if the option
190
  //    takes no argument: "2", "mysym=0x1000", etc.
191
  // CMDLINE: the global Command_line object.  Used by DEFINE_special.
192
  // OPTIONS: the global General_options object.  Used by DEFINE_special.
193
  virtual void
194
  parse_to_value(const char* option, const char* arg,
195
                 Command_line* cmdline, General_options* options) = 0;
196
  virtual
197
  ~Struct_var()  // To make gcc happy.
198
  { }
199
};
200
 
201
// This is for "special" options that aren't of any predefined type.
202
struct Struct_special : public Struct_var
203
{
204
  // If you change this, change the parse-fn in DEFINE_special as well.
205
  typedef void (General_options::*Parse_function)(const char*, const char*,
206
                                                  Command_line*);
207
  Struct_special(const char* varname, Dashes dashes, char shortname,
208
                 Parse_function parse_function,
209
                 const char* helpstring, const char* helparg)
210
    : option(varname, dashes, shortname, "", helpstring, helparg, false, this),
211
      parse(parse_function)
212
  { }
213
 
214
  void parse_to_value(const char* option, const char* arg,
215
                      Command_line* cmdline, General_options* options)
216
  { (options->*(this->parse))(option, arg, cmdline); }
217
 
218
  One_option option;
219
  Parse_function parse;
220
};
221
 
222
}  // End namespace options.
223
 
224
 
225
// These are helper macros use by DEFINE_uint64/etc below.
226
// This macro is used inside the General_options_ class, so defines
227
// var() and set_var() as General_options methods.  Arguments as are
228
// for the constructor for One_option.  param_type__ is the same as
229
// type__ for built-in types, and "const type__ &" otherwise.
230
#define DEFINE_var(varname__, dashes__, shortname__, default_value__,        \
231
                   default_value_as_string__, helpstring__, helparg__,       \
232
                   optional_arg__, type__, param_type__, parse_fn__)         \
233
 public:                                                                     \
234
  param_type__                                                               \
235
  varname__() const                                                          \
236
  { return this->varname__##_.value; }                                       \
237
                                                                             \
238
  bool                                                                       \
239
  user_set_##varname__() const                                               \
240
  { return this->varname__##_.user_set_via_option; }                         \
241
                                                                             \
242
  void                                                                       \
243
  set_user_set_##varname__()                                                 \
244
  { this->varname__##_.user_set_via_option = true; }                         \
245
                                                                             \
246
 private:                                                                    \
247
  struct Struct_##varname__ : public options::Struct_var                     \
248
  {                                                                          \
249
    Struct_##varname__()                                                     \
250
      : option(#varname__, dashes__, shortname__, default_value_as_string__, \
251
               helpstring__, helparg__, optional_arg__, this),               \
252
        user_set_via_option(false), value(default_value__)                   \
253
    { }                                                                      \
254
                                                                             \
255
    void                                                                     \
256
    parse_to_value(const char* option_name, const char* arg,                 \
257
                   Command_line*, General_options*)                          \
258
    {                                                                        \
259
      parse_fn__(option_name, arg, &this->value);                            \
260
      this->user_set_via_option = true;                                      \
261
    }                                                                        \
262
                                                                             \
263
    options::One_option option;                                              \
264
    bool user_set_via_option;                                                \
265
    type__ value;                                                            \
266
  };                                                                         \
267
  Struct_##varname__ varname__##_;                                           \
268
  void                                                                       \
269
  set_##varname__(param_type__ value)                                        \
270
  { this->varname__##_.value = value; }
271
 
272
// These macros allow for easy addition of a new commandline option.
273
 
274
// If no_helpstring__ is not NULL, then in addition to creating
275
// VARNAME, we also create an option called no-VARNAME (or, for a -z
276
// option, noVARNAME).
277
#define DEFINE_bool(varname__, dashes__, shortname__, default_value__,   \
278
                    helpstring__, no_helpstring__)                       \
279
  DEFINE_var(varname__, dashes__, shortname__, default_value__,          \
280
             default_value__ ? "true" : "false", helpstring__, NULL,     \
281
             false, bool, bool, options::parse_bool)                     \
282
  struct Struct_no_##varname__ : public options::Struct_var              \
283
  {                                                                      \
284
    Struct_no_##varname__() : option((dashes__ == options::DASH_Z        \
285
                                      ? "no" #varname__                  \
286
                                      : "no-" #varname__),               \
287
                                     dashes__, '\0',                     \
288
                                     default_value__ ? "false" : "true", \
289
                                     no_helpstring__, NULL, false, this) \
290
    { }                                                                  \
291
                                                                         \
292
    void                                                                 \
293
    parse_to_value(const char*, const char*,                             \
294
                   Command_line*, General_options* options)              \
295
    { options->set_##varname__(false); }                                 \
296
                                                                         \
297
    options::One_option option;                                          \
298
  };                                                                     \
299
  Struct_no_##varname__ no_##varname__##_initializer_
300
 
301
#define DEFINE_enable(varname__, dashes__, shortname__, default_value__, \
302
                      helpstring__, no_helpstring__)                     \
303
  DEFINE_var(enable_##varname__, dashes__, shortname__, default_value__, \
304
             default_value__ ? "true" : "false", helpstring__, NULL,     \
305
             false, bool, bool, options::parse_bool)                     \
306
  struct Struct_disable_##varname__ : public options::Struct_var         \
307
  {                                                                      \
308
    Struct_disable_##varname__() : option("disable-" #varname__,         \
309
                                     dashes__, '\0',                     \
310
                                     default_value__ ? "false" : "true", \
311
                                     no_helpstring__, NULL, false, this) \
312
    { }                                                                  \
313
                                                                         \
314
    void                                                                 \
315
    parse_to_value(const char*, const char*,                             \
316
                   Command_line*, General_options* options)              \
317
    { options->set_enable_##varname__(false); }                          \
318
                                                                         \
319
    options::One_option option;                                          \
320
  };                                                                     \
321
  Struct_disable_##varname__ disable_##varname__##_initializer_
322
 
323
#define DEFINE_uint(varname__, dashes__, shortname__, default_value__,  \
324
                   helpstring__, helparg__)                             \
325
  DEFINE_var(varname__, dashes__, shortname__, default_value__,         \
326
             #default_value__, helpstring__, helparg__, false,          \
327
             int, int, options::parse_uint)
328
 
329
#define DEFINE_uint64(varname__, dashes__, shortname__, default_value__, \
330
                      helpstring__, helparg__)                           \
331
  DEFINE_var(varname__, dashes__, shortname__, default_value__,          \
332
             #default_value__, helpstring__, helparg__, false,           \
333
             uint64_t, uint64_t, options::parse_uint64)
334
 
335
#define DEFINE_double(varname__, dashes__, shortname__, default_value__, \
336
                      helpstring__, helparg__)                           \
337
  DEFINE_var(varname__, dashes__, shortname__, default_value__,          \
338
             #default_value__, helpstring__, helparg__, false,           \
339
             double, double, options::parse_double)
340
 
341
#define DEFINE_string(varname__, dashes__, shortname__, default_value__, \
342
                      helpstring__, helparg__)                           \
343
  DEFINE_var(varname__, dashes__, shortname__, default_value__,          \
344
             default_value__, helpstring__, helparg__, false,            \
345
             const char*, const char*, options::parse_string)
346
 
347
// This is like DEFINE_string, but we convert each occurrence to a
348
// Search_directory and store it in a vector.  Thus we also have the
349
// add_to_VARNAME() method, to append to the vector.
350
#define DEFINE_dirlist(varname__, dashes__, shortname__,                  \
351
                           helpstring__, helparg__)                       \
352
  DEFINE_var(varname__, dashes__, shortname__, ,                          \
353
             "", helpstring__, helparg__, false, options::Dir_list,       \
354
             const options::Dir_list&, options::parse_dirlist)            \
355
  void                                                                    \
356
  add_to_##varname__(const char* new_value)                               \
357
  { options::parse_dirlist(NULL, new_value, &this->varname__##_.value); } \
358
  void                                                                    \
359
  add_search_directory_to_##varname__(const Search_directory& dir)        \
360
  { this->varname__##_.value.push_back(dir); }
361
 
362
// This is like DEFINE_string, but we store a set of strings.
363
#define DEFINE_set(varname__, dashes__, shortname__,                      \
364
                   helpstring__, helparg__)                               \
365
  DEFINE_var(varname__, dashes__, shortname__, ,                          \
366
             "", helpstring__, helparg__, false, options::String_set,     \
367
             const options::String_set&, options::parse_set)              \
368
 public:                                                                  \
369
  bool                                                                    \
370
  any_##varname__() const                                                 \
371
  { return !this->varname__##_.value.empty(); }                           \
372
                                                                          \
373
  bool                                                                    \
374
  is_##varname__(const char* symbol) const                                \
375
  {                                                                       \
376
    return (!this->varname__##_.value.empty()                             \
377
            && (this->varname__##_.value.find(std::string(symbol))        \
378
                != this->varname__##_.value.end()));                      \
379
  }                                                                       \
380
                                                                          \
381
  options::String_set::const_iterator                                     \
382
  varname__##_begin() const                                               \
383
  { return this->varname__##_.value.begin(); }                            \
384
                                                                          \
385
  options::String_set::const_iterator                                     \
386
  varname__##_end() const                                                 \
387
  { return this->varname__##_.value.end(); }
388
 
389
// When you have a list of possible values (expressed as string)
390
// After helparg__ should come an initializer list, like
391
//   {"foo", "bar", "baz"}
392
#define DEFINE_enum(varname__, dashes__, shortname__, default_value__,   \
393
                    helpstring__, helparg__, ...)                        \
394
  DEFINE_var(varname__, dashes__, shortname__, default_value__,          \
395
             default_value__, helpstring__, helparg__, false,            \
396
             const char*, const char*, parse_choices_##varname__)        \
397
 private:                                                                \
398
  static void parse_choices_##varname__(const char* option_name,         \
399
                                        const char* arg,                 \
400
                                        const char** retval) {           \
401
    const char* choices[] = __VA_ARGS__;                                 \
402
    options::parse_choices(option_name, arg, retval,                     \
403
                           choices, sizeof(choices) / sizeof(*choices)); \
404
  }
405
 
406
// This is like DEFINE_bool, but VARNAME is the name of a different
407
// option.  This option becomes an alias for that one.  INVERT is true
408
// if this option is an inversion of the other one.
409
#define DEFINE_bool_alias(option__, varname__, dashes__, shortname__,   \
410
                          helpstring__, no_helpstring__, invert__)      \
411
 private:                                                               \
412
  struct Struct_##option__ : public options::Struct_var                 \
413
  {                                                                     \
414
    Struct_##option__()                                                 \
415
      : option(#option__, dashes__, shortname__, "", helpstring__,      \
416
               NULL, false, this)                                       \
417
    { }                                                                 \
418
                                                                        \
419
    void                                                                \
420
    parse_to_value(const char*, const char*,                            \
421
                   Command_line*, General_options* options)             \
422
    {                                                                   \
423
      options->set_##varname__(!invert__);                              \
424
      options->set_user_set_##varname__();                              \
425
    }                                                                   \
426
                                                                        \
427
    options::One_option option;                                         \
428
  };                                                                    \
429
  Struct_##option__ option__##_;                                        \
430
                                                                        \
431
  struct Struct_no_##option__ : public options::Struct_var              \
432
  {                                                                     \
433
    Struct_no_##option__()                                              \
434
      : option((dashes__ == options::DASH_Z                             \
435
                ? "no" #option__                                        \
436
                : "no-" #option__),                                     \
437
               dashes__, '\0', "", no_helpstring__,                     \
438
               NULL, false, this)                                       \
439
    { }                                                                 \
440
                                                                        \
441
    void                                                                \
442
    parse_to_value(const char*, const char*,                            \
443
                   Command_line*, General_options* options)             \
444
    {                                                                   \
445
      options->set_##varname__(invert__);                               \
446
      options->set_user_set_##varname__();                              \
447
    }                                                                   \
448
                                                                        \
449
    options::One_option option;                                         \
450
  };                                                                    \
451
  Struct_no_##option__ no_##option__##_initializer_
452
 
453
// This is used for non-standard flags.  It defines no functions; it
454
// just calls General_options::parse_VARNAME whenever the flag is
455
// seen.  We declare parse_VARNAME as a static member of
456
// General_options; you are responsible for defining it there.
457
// helparg__ should be NULL iff this special-option is a boolean.
458
#define DEFINE_special(varname__, dashes__, shortname__,                \
459
                       helpstring__, helparg__)                         \
460
 private:                                                               \
461
  void parse_##varname__(const char* option, const char* arg,           \
462
                         Command_line* inputs);                         \
463
  struct Struct_##varname__ : public options::Struct_special            \
464
  {                                                                     \
465
    Struct_##varname__()                                                \
466
      : options::Struct_special(#varname__, dashes__, shortname__,      \
467
                                &General_options::parse_##varname__,    \
468
                                helpstring__, helparg__)                \
469
    { }                                                                 \
470
  };                                                                    \
471
  Struct_##varname__ varname__##_initializer_
472
 
473
// An option that takes an optional string argument.  If the option is
474
// used with no argument, the value will be the default, and
475
// user_set_via_option will be true.
476
#define DEFINE_optional_string(varname__, dashes__, shortname__,        \
477
                               default_value__,                         \
478
                               helpstring__, helparg__)                 \
479
  DEFINE_var(varname__, dashes__, shortname__, default_value__,         \
480
             default_value__, helpstring__, helparg__, true,            \
481
             const char*, const char*, options::parse_optional_string)
482
 
483
// A directory to search.  For each directory we record whether it is
484
// in the sysroot.  We need to know this so that, if a linker script
485
// is found within the sysroot, we will apply the sysroot to any files
486
// named by that script.
487
 
488
class Search_directory
489
{
490
 public:
491
  // We need a default constructor because we put this in a
492
  // std::vector.
493
  Search_directory()
494
    : name_(NULL), put_in_sysroot_(false), is_in_sysroot_(false)
495
  { }
496
 
497
  // This is the usual constructor.
498
  Search_directory(const char* name, bool put_in_sysroot)
499
    : name_(name), put_in_sysroot_(put_in_sysroot), is_in_sysroot_(false)
500
  {
501
    if (this->name_.empty())
502
      this->name_ = ".";
503
  }
504
 
505
  // This is called if we have a sysroot.  The sysroot is prefixed to
506
  // any entries for which put_in_sysroot_ is true.  is_in_sysroot_ is
507
  // set to true for any enries which are in the sysroot (this will
508
  // naturally include any entries for which put_in_sysroot_ is true).
509
  // SYSROOT is the sysroot, CANONICAL_SYSROOT is the result of
510
  // passing SYSROOT to lrealpath.
511
  void
512
  add_sysroot(const char* sysroot, const char* canonical_sysroot);
513
 
514
  // Get the directory name.
515
  const std::string&
516
  name() const
517
  { return this->name_; }
518
 
519
  // Return whether this directory is in the sysroot.
520
  bool
521
  is_in_sysroot() const
522
  { return this->is_in_sysroot_; }
523
 
524
 private:
525
  std::string name_;
526
  bool put_in_sysroot_;
527
  bool is_in_sysroot_;
528
};
529
 
530
class General_options
531
{
532
 private:
533
  // NOTE: For every option that you add here, also consider if you
534
  // should add it to Position_dependent_options.
535
  DEFINE_special(help, options::TWO_DASHES, '\0',
536
                 N_("Report usage information"), NULL);
537
  DEFINE_special(version, options::TWO_DASHES, 'v',
538
                 N_("Report version information"), NULL);
539
  DEFINE_special(V, options::EXACTLY_ONE_DASH, '\0',
540
                 N_("Report version and target information"), NULL);
541
 
542
  // These options are sorted approximately so that for each letter in
543
  // the alphabet, we show the option whose shortname is that letter
544
  // (if any) and then every longname that starts with that letter (in
545
  // alphabetical order).  For both, lowercase sorts before uppercase.
546
  // The -z options come last.
547
 
548
  DEFINE_bool(allow_shlib_undefined, options::TWO_DASHES, '\0', false,
549
              N_("Allow unresolved references in shared libraries"),
550
              N_("Do not allow unresolved references in shared libraries"));
551
 
552
  DEFINE_bool(as_needed, options::TWO_DASHES, '\0', false,
553
              N_("Only set DT_NEEDED for dynamic libs if used"),
554
              N_("Always DT_NEEDED for dynamic libs"));
555
 
556
  // This should really be an "enum", but it's too easy for folks to
557
  // forget to update the list as they add new targets.  So we just
558
  // accept any string.  We'll fail later (when the string is parsed),
559
  // if the target isn't actually supported.
560
  DEFINE_string(format, options::TWO_DASHES, 'b', "elf",
561
                N_("Set input format"), ("[elf,binary]"));
562
 
563
  DEFINE_bool(Bdynamic, options::ONE_DASH, '\0', true,
564
              N_("-l searches for shared libraries"), NULL);
565
  DEFINE_bool_alias(Bstatic, Bdynamic, options::ONE_DASH, '\0',
566
                    N_("-l does not search for shared libraries"), NULL,
567
                    true);
568
 
569
  DEFINE_bool(Bsymbolic, options::ONE_DASH, '\0', false,
570
              N_("Bind defined symbols locally"), NULL);
571
 
572
  DEFINE_bool(Bsymbolic_functions, options::ONE_DASH, '\0', false,
573
              N_("Bind defined function symbols locally"), NULL);
574
 
575
  DEFINE_optional_string(build_id, options::TWO_DASHES, '\0', "sha1",
576
                         N_("Generate build ID note"),
577
                         N_("[=STYLE]"));
578
 
579
  DEFINE_bool(check_sections, options::TWO_DASHES, '\0', true,
580
              N_("Check segment addresses for overlaps (default)"),
581
              N_("Do not check segment addresses for overlaps"));
582
 
583
#ifdef HAVE_ZLIB_H
584
  DEFINE_enum(compress_debug_sections, options::TWO_DASHES, '\0', "none",
585
              N_("Compress .debug_* sections in the output file"),
586
              ("[none,zlib]"),
587
              {"none", "zlib"});
588
#else
589
  DEFINE_enum(compress_debug_sections, options::TWO_DASHES, '\0', "none",
590
              N_("Compress .debug_* sections in the output file"),
591
              N_("[none]"),
592
              {"none"});
593
#endif
594
 
595
  DEFINE_bool(define_common, options::TWO_DASHES, 'd', false,
596
              N_("Define common symbols"),
597
              N_("Do not define common symbols"));
598
  DEFINE_bool(dc, options::ONE_DASH, '\0', false,
599
              N_("Alias for -d"), NULL);
600
  DEFINE_bool(dp, options::ONE_DASH, '\0', false,
601
              N_("Alias for -d"), NULL);
602
 
603
  DEFINE_string(debug, options::TWO_DASHES, '\0', "",
604
                N_("Turn on debugging"),
605
                N_("[all,files,script,task][,...]"));
606
 
607
  DEFINE_special(defsym, options::TWO_DASHES, '\0',
608
                 N_("Define a symbol"), N_("SYMBOL=EXPRESSION"));
609
 
610
  DEFINE_optional_string(demangle, options::TWO_DASHES, '\0', NULL,
611
                         N_("Demangle C++ symbols in log messages"),
612
                         N_("[=STYLE]"));
613
 
614
  DEFINE_bool(no_demangle, options::TWO_DASHES, '\0', false,
615
              N_("Do not demangle C++ symbols in log messages"),
616
              NULL);
617
 
618
  DEFINE_bool(detect_odr_violations, options::TWO_DASHES, '\0', false,
619
              N_("Try to detect violations of the One Definition Rule"),
620
              NULL);
621
 
622
  DEFINE_string(entry, options::TWO_DASHES, 'e', NULL,
623
                N_("Set program start address"), N_("ADDRESS"));
624
 
625
  DEFINE_bool(export_dynamic, options::TWO_DASHES, 'E', false,
626
              N_("Export all dynamic symbols"), NULL);
627
 
628
  DEFINE_bool(eh_frame_hdr, options::TWO_DASHES, '\0', false,
629
              N_("Create exception frame header"), NULL);
630
 
631
  DEFINE_bool(fatal_warnings, options::TWO_DASHES, '\0', false,
632
              N_("Treat warnings as errors"),
633
              N_("Do not treat warnings as errors"));
634
 
635
  DEFINE_string(soname, options::ONE_DASH, 'h', NULL,
636
                N_("Set shared library name"), N_("FILENAME"));
637
 
638
  DEFINE_double(hash_bucket_empty_fraction, options::TWO_DASHES, '\0', 0.0,
639
                N_("Min fraction of empty buckets in dynamic hash"),
640
                N_("FRACTION"));
641
 
642
  DEFINE_enum(hash_style, options::TWO_DASHES, '\0', "sysv",
643
              N_("Dynamic hash style"), N_("[sysv,gnu,both]"),
644
              {"sysv", "gnu", "both"});
645
 
646
  DEFINE_string(dynamic_linker, options::TWO_DASHES, 'I', NULL,
647
                N_("Set dynamic linker path"), N_("PROGRAM"));
648
 
649
  DEFINE_special(just_symbols, options::TWO_DASHES, '\0',
650
                 N_("Read only symbol values from FILE"), N_("FILE"));
651
 
652
  DEFINE_special(library, options::TWO_DASHES, 'l',
653
                 N_("Search for library LIBNAME"), N_("LIBNAME"));
654
 
655
  DEFINE_dirlist(library_path, options::TWO_DASHES, 'L',
656
                 N_("Add directory to search path"), N_("DIR"));
657
 
658
  DEFINE_string(m, options::EXACTLY_ONE_DASH, 'm', "",
659
                N_("Ignored for compatibility"), N_("EMULATION"));
660
 
661
  DEFINE_bool(print_map, options::TWO_DASHES, 'M', false,
662
              N_("Write map file on standard output"), NULL);
663
  DEFINE_string(Map, options::ONE_DASH, '\0', NULL, N_("Write map file"),
664
                N_("MAPFILENAME"));
665
 
666
  DEFINE_bool(nmagic, options::TWO_DASHES, 'n', false,
667
              N_("Do not page align data"), NULL);
668
  DEFINE_bool(omagic, options::EXACTLY_TWO_DASHES, 'N', false,
669
              N_("Do not page align data, do not make text readonly"),
670
              N_("Page align data, make text readonly"));
671
 
672
  DEFINE_enable(new_dtags, options::EXACTLY_TWO_DASHES, '\0', false,
673
                N_("Enable use of DT_RUNPATH and DT_FLAGS"),
674
                N_("Disable use of DT_RUNPATH and DT_FLAGS"));
675
 
676
  DEFINE_bool(noinhibit_exec, options::TWO_DASHES, '\0', false,
677
              N_("Create an output file even if errors occur"), NULL);
678
 
679
  DEFINE_bool_alias(no_undefined, defs, options::TWO_DASHES, '\0',
680
                    N_("Report undefined symbols (even with --shared)"),
681
                    NULL, false);
682
 
683
  DEFINE_string(output, options::TWO_DASHES, 'o', "a.out",
684
                N_("Set output file name"), N_("FILE"));
685
 
686
  DEFINE_uint(optimize, options::EXACTLY_ONE_DASH, 'O', 0,
687
              N_("Optimize output file size"), N_("LEVEL"));
688
 
689
  DEFINE_string(oformat, options::EXACTLY_TWO_DASHES, '\0', "elf",
690
                N_("Set output format"), N_("[binary]"));
691
 
692
  DEFINE_bool(preread_archive_symbols, options::TWO_DASHES, '\0', false,
693
              N_("Preread archive symbols when multi-threaded"), NULL);
694
  DEFINE_string(print_symbol_counts, options::TWO_DASHES, '\0', NULL,
695
                N_("Print symbols defined and used for each input"),
696
                N_("FILENAME"));
697
 
698
  DEFINE_bool(Qy, options::EXACTLY_ONE_DASH, '\0', false,
699
              N_("Ignored for SVR4 compatibility"), NULL);
700
 
701
  DEFINE_bool(emit_relocs, options::TWO_DASHES, 'q', false,
702
              N_("Generate relocations in output"), NULL);
703
 
704
  DEFINE_bool(relocatable, options::EXACTLY_ONE_DASH, 'r', false,
705
              N_("Generate relocatable output"), NULL);
706
 
707
  DEFINE_bool(relax, options::TWO_DASHES, '\0', false,
708
              N_("Relax branches on certain targets"), NULL);
709
 
710
  // -R really means -rpath, but can mean --just-symbols for
711
  // compatibility with GNU ld.  -rpath is always -rpath, so we list
712
  // it separately.
713
  DEFINE_special(R, options::EXACTLY_ONE_DASH, 'R',
714
                 N_("Add DIR to runtime search path"), N_("DIR"));
715
 
716
  DEFINE_dirlist(rpath, options::ONE_DASH, '\0',
717
                 N_("Add DIR to runtime search path"), N_("DIR"));
718
 
719
  DEFINE_dirlist(rpath_link, options::TWO_DASHES, '\0',
720
                 N_("Add DIR to link time shared library search path"),
721
                 N_("DIR"));
722
 
723
  DEFINE_bool(strip_all, options::TWO_DASHES, 's', false,
724
              N_("Strip all symbols"), NULL);
725
  DEFINE_bool(strip_debug, options::TWO_DASHES, 'S', false,
726
              N_("Strip debugging information"), NULL);
727
  DEFINE_bool(strip_debug_non_line, options::TWO_DASHES, '\0', false,
728
              N_("Emit only debug line number information"), NULL);
729
  DEFINE_bool(strip_debug_gdb, options::TWO_DASHES, '\0', false,
730
              N_("Strip debug symbols that are unused by gdb "
731
                 "(at least versions <= 6.7)"), NULL);
732
 
733
  DEFINE_bool(shared, options::ONE_DASH, '\0', false,
734
              N_("Generate shared library"), NULL);
735
 
736
  // This is not actually special in any way, but I need to give it
737
  // a non-standard accessor-function name because 'static' is a keyword.
738
  DEFINE_special(static, options::ONE_DASH, '\0',
739
                 N_("Do not link against shared libraries"), NULL);
740
 
741
  DEFINE_bool(stats, options::TWO_DASHES, '\0', false,
742
              N_("Print resource usage statistics"), NULL);
743
 
744
  DEFINE_string(sysroot, options::TWO_DASHES, '\0', "",
745
                N_("Set target system root directory"), N_("DIR"));
746
 
747
  DEFINE_bool(trace, options::TWO_DASHES, 't', false,
748
              N_("Print the name of each input file"), NULL);
749
 
750
  DEFINE_special(script, options::TWO_DASHES, 'T',
751
                 N_("Read linker script"), N_("FILE"));
752
 
753
  DEFINE_bool(threads, options::TWO_DASHES, '\0', false,
754
              N_("Run the linker multi-threaded"),
755
              N_("Do not run the linker multi-threaded"));
756
  DEFINE_uint(thread_count, options::TWO_DASHES, '\0', 0,
757
              N_("Number of threads to use"), N_("COUNT"));
758
  DEFINE_uint(thread_count_initial, options::TWO_DASHES, '\0', 0,
759
              N_("Number of threads to use in initial pass"), N_("COUNT"));
760
  DEFINE_uint(thread_count_middle, options::TWO_DASHES, '\0', 0,
761
              N_("Number of threads to use in middle pass"), N_("COUNT"));
762
  DEFINE_uint(thread_count_final, options::TWO_DASHES, '\0', 0,
763
              N_("Number of threads to use in final pass"), N_("COUNT"));
764
 
765
  DEFINE_uint64(Tbss, options::ONE_DASH, '\0', -1U,
766
                N_("Set the address of the bss segment"), N_("ADDRESS"));
767
  DEFINE_uint64(Tdata, options::ONE_DASH, '\0', -1U,
768
                N_("Set the address of the data segment"), N_("ADDRESS"));
769
  DEFINE_uint64(Ttext, options::ONE_DASH, '\0', -1U,
770
                N_("Set the address of the text segment"), N_("ADDRESS"));
771
 
772
  DEFINE_set(undefined, options::TWO_DASHES, 'u',
773
             N_("Create undefined reference to SYMBOL"), N_("SYMBOL"));
774
 
775
  DEFINE_bool(verbose, options::TWO_DASHES, '\0', false,
776
              N_("Synonym for --debug=files"), NULL);
777
 
778
  DEFINE_special(version_script, options::TWO_DASHES, '\0',
779
                 N_("Read version script"), N_("FILE"));
780
 
781
  DEFINE_bool(whole_archive, options::TWO_DASHES, '\0', false,
782
              N_("Include all archive contents"),
783
              N_("Include only needed archive contents"));
784
 
785
  DEFINE_set(wrap, options::TWO_DASHES, '\0',
786
             N_("Use wrapper functions for SYMBOL"), N_("SYMBOL"));
787
 
788
  DEFINE_set(trace_symbol, options::TWO_DASHES, 'y',
789
             N_("Trace references to symbol"), N_("SYMBOL"));
790
 
791
  DEFINE_string(Y, options::EXACTLY_ONE_DASH, 'Y', "",
792
                N_("Default search path for Solaris compatibility"),
793
                N_("PATH"));
794
 
795
  DEFINE_special(start_group, options::TWO_DASHES, '(',
796
                 N_("Start a library search group"), NULL);
797
  DEFINE_special(end_group, options::TWO_DASHES, ')',
798
                 N_("End a library search group"), NULL);
799
 
800
  // The -z options.
801
 
802
  DEFINE_bool(combreloc, options::DASH_Z, '\0', true,
803
              N_("Sort dynamic relocs"),
804
              N_("Do not sort dynamic relocs"));
805
  DEFINE_uint64(common_page_size, options::DASH_Z, '\0', 0,
806
                N_("Set common page size to SIZE"), N_("SIZE"));
807
  DEFINE_bool(defs, options::DASH_Z, '\0', false,
808
              N_("Report undefined symbols (even with --shared)"),
809
              NULL);
810
  DEFINE_bool(execstack, options::DASH_Z, '\0', false,
811
              N_("Mark output as requiring executable stack"), NULL);
812
  DEFINE_uint64(max_page_size, options::DASH_Z, '\0', 0,
813
                N_("Set maximum page size to SIZE"), N_("SIZE"));
814
  DEFINE_bool(noexecstack, options::DASH_Z, '\0', false,
815
              N_("Mark output as not requiring executable stack"), NULL);
816
  DEFINE_bool(initfirst, options::DASH_Z, '\0', false,
817
              N_("Mark DSO to be initialized first at runtime"),
818
              NULL);
819
  DEFINE_bool(interpose, options::DASH_Z, '\0', false,
820
              N_("Mark object to interpose all DSOs but executable"),
821
              NULL);
822
  DEFINE_bool(loadfltr, options::DASH_Z, '\0', false,
823
              N_("Mark object requiring immediate process"),
824
              NULL);
825
  DEFINE_bool(nodefaultlib, options::DASH_Z, '\0', false,
826
              N_("Mark object not to use default search paths"),
827
              NULL);
828
  DEFINE_bool(nodelete, options::DASH_Z, '\0', false,
829
              N_("Mark DSO non-deletable at runtime"),
830
              NULL);
831
  DEFINE_bool(nodlopen, options::DASH_Z, '\0', false,
832
              N_("Mark DSO not available to dlopen"),
833
              NULL);
834
  DEFINE_bool(nodump, options::DASH_Z, '\0', false,
835
              N_("Mark DSO not available to dldump"),
836
              NULL);
837
  DEFINE_bool(relro, options::DASH_Z, '\0', false,
838
              N_("Where possible mark variables read-only after relocation"),
839
              N_("Don't mark variables read-only after relocation"));
840
 
841
 public:
842
  typedef options::Dir_list Dir_list;
843
 
844
  General_options();
845
 
846
  // Does post-processing on flags, making sure they all have
847
  // non-conflicting values.  Also converts some flags from their
848
  // "standard" types (string, etc), to another type (enum, DirList),
849
  // which can be accessed via a separate method.  Dies if it notices
850
  // any problems.
851
  void finalize();
852
 
853
  // The macro defines output() (based on --output), but that's a
854
  // generic name.  Provide this alternative name, which is clearer.
855
  const char*
856
  output_file_name() const
857
  { return this->output(); }
858
 
859
  // This is not defined via a flag, but combines flags to say whether
860
  // the output is position-independent or not.
861
  bool
862
  output_is_position_independent() const
863
  { return this->shared(); }
864
 
865
  // This would normally be static(), and defined automatically, but
866
  // since static is a keyword, we need to come up with our own name.
867
  bool
868
  is_static() const
869
  { return static_; }
870
 
871
  // In addition to getting the input and output formats as a string
872
  // (via format() and oformat()), we also give access as an enum.
873
  enum Object_format
874
  {
875
    // Ordinary ELF.
876
    OBJECT_FORMAT_ELF,
877
    // Straight binary format.
878
    OBJECT_FORMAT_BINARY
879
  };
880
 
881
  // Note: these functions are not very fast.
882
  Object_format format_enum() const;
883
  Object_format oformat_enum() const;
884
 
885
  // These are the best way to get access to the execstack state,
886
  // not execstack() and noexecstack() which are hard to use properly.
887
  bool
888
  is_execstack_set() const
889
  { return this->execstack_status_ != EXECSTACK_FROM_INPUT; }
890
 
891
  bool
892
  is_stack_executable() const
893
  { return this->execstack_status_ == EXECSTACK_YES; }
894
 
895
  // The --demangle option takes an optional string, and there is also
896
  // a --no-demangle option.  This is the best way to decide whether
897
  // to demangle or not.
898
  bool
899
  do_demangle() const
900
  { return this->do_demangle_; }
901
 
902
 private:
903
  // Don't copy this structure.
904
  General_options(const General_options&);
905
  General_options& operator=(const General_options&);
906
 
907
  // Whether to mark the stack as executable.
908
  enum Execstack
909
  {
910
    // Not set on command line.
911
    EXECSTACK_FROM_INPUT,
912
    // Mark the stack as executable (-z execstack).
913
    EXECSTACK_YES,
914
    // Mark the stack as not executable (-z noexecstack).
915
    EXECSTACK_NO
916
  };
917
 
918
  void
919
  set_execstack_status(Execstack value)
920
  { this->execstack_status_ = value; }
921
 
922
  void
923
  set_do_demangle(bool value)
924
  { this->do_demangle_ = value; }
925
 
926
  void
927
  set_static(bool value)
928
  { static_ = value; }
929
 
930
  // These are called by finalize() to set up the search-path correctly.
931
  void
932
  add_to_library_path_with_sysroot(const char* arg)
933
  { this->add_search_directory_to_library_path(Search_directory(arg, true)); }
934
 
935
  // Apply any sysroot to the directory lists.
936
  void
937
  add_sysroot();
938
 
939
  // Whether to mark the stack as executable.
940
  Execstack execstack_status_;
941
  // Whether to do a static link.
942
  bool static_;
943
  // Whether to do demangling.
944
  bool do_demangle_;
945
};
946
 
947
// The position-dependent options.  We use this to store the state of
948
// the commandline at a particular point in parsing for later
949
// reference.  For instance, if we see "ld --whole-archive foo.a
950
// --no-whole-archive," we want to store the whole-archive option with
951
// foo.a, so when the time comes to parse foo.a we know we should do
952
// it in whole-archive mode.  We could store all of General_options,
953
// but that's big, so we just pick the subset of flags that actually
954
// change in a position-dependent way.
955
 
956
#define DEFINE_posdep(varname__, type__)        \
957
 public:                                        \
958
  type__                                        \
959
  varname__() const                             \
960
  { return this->varname__##_; }                \
961
                                                \
962
  void                                          \
963
  set_##varname__(type__ value)                 \
964
  { this->varname__##_ = value; }               \
965
 private:                                       \
966
  type__ varname__##_
967
 
968
class Position_dependent_options
969
{
970
 public:
971
  Position_dependent_options(const General_options& options
972
                             = Position_dependent_options::default_options_)
973
  { copy_from_options(options); }
974
 
975
  void copy_from_options(const General_options& options)
976
  {
977
    this->set_as_needed(options.as_needed());
978
    this->set_Bdynamic(options.Bdynamic());
979
    this->set_format_enum(options.format_enum());
980
    this->set_whole_archive(options.whole_archive());
981
  }
982
 
983
  DEFINE_posdep(as_needed, bool);
984
  DEFINE_posdep(Bdynamic, bool);
985
  DEFINE_posdep(format_enum, General_options::Object_format);
986
  DEFINE_posdep(whole_archive, bool);
987
 
988
 private:
989
  // This is a General_options with everything set to its default
990
  // value.  A Position_dependent_options created with no argument
991
  // will take its values from here.
992
  static General_options default_options_;
993
};
994
 
995
 
996
// A single file or library argument from the command line.
997
 
998
class Input_file_argument
999
{
1000
 public:
1001
  // name: file name or library name
1002
  // is_lib: true if name is a library name: that is, emits the leading
1003
  //         "lib" and trailing ".so"/".a" from the name
1004
  // extra_search_path: an extra directory to look for the file, prior
1005
  //         to checking the normal library search path.  If this is "",
1006
  //         then no extra directory is added.
1007
  // just_symbols: whether this file only defines symbols.
1008
  // options: The position dependent options at this point in the
1009
  //         command line, such as --whole-archive.
1010
  Input_file_argument()
1011
    : name_(), is_lib_(false), extra_search_path_(""), just_symbols_(false),
1012
      options_()
1013
  { }
1014
 
1015
  Input_file_argument(const char* name, bool is_lib,
1016
                      const char* extra_search_path,
1017
                      bool just_symbols,
1018
                      const Position_dependent_options& options)
1019
    : name_(name), is_lib_(is_lib), extra_search_path_(extra_search_path),
1020
      just_symbols_(just_symbols), options_(options)
1021
  { }
1022
 
1023
  // You can also pass in a General_options instance instead of a
1024
  // Position_dependent_options.  In that case, we extract the
1025
  // position-independent vars from the General_options and only store
1026
  // those.
1027
  Input_file_argument(const char* name, bool is_lib,
1028
                      const char* extra_search_path,
1029
                      bool just_symbols,
1030
                      const General_options& options)
1031
    : name_(name), is_lib_(is_lib), extra_search_path_(extra_search_path),
1032
      just_symbols_(just_symbols), options_(options)
1033
  { }
1034
 
1035
  const char*
1036
  name() const
1037
  { return this->name_.c_str(); }
1038
 
1039
  const Position_dependent_options&
1040
  options() const
1041
  { return this->options_; }
1042
 
1043
  bool
1044
  is_lib() const
1045
  { return this->is_lib_; }
1046
 
1047
  const char*
1048
  extra_search_path() const
1049
  {
1050
    return (this->extra_search_path_.empty()
1051
            ? NULL
1052
            : this->extra_search_path_.c_str());
1053
  }
1054
 
1055
  // Return whether we should only read symbols from this file.
1056
  bool
1057
  just_symbols() const
1058
  { return this->just_symbols_; }
1059
 
1060
  // Return whether this file may require a search using the -L
1061
  // options.
1062
  bool
1063
  may_need_search() const
1064
  { return this->is_lib_ || !this->extra_search_path_.empty(); }
1065
 
1066
 private:
1067
  // We use std::string, not const char*, here for convenience when
1068
  // using script files, so that we do not have to preserve the string
1069
  // in that case.
1070
  std::string name_;
1071
  bool is_lib_;
1072
  std::string extra_search_path_;
1073
  bool just_symbols_;
1074
  Position_dependent_options options_;
1075
};
1076
 
1077
// A file or library, or a group, from the command line.
1078
 
1079
class Input_argument
1080
{
1081
 public:
1082
  // Create a file or library argument.
1083
  explicit Input_argument(Input_file_argument file)
1084
    : is_file_(true), file_(file), group_(NULL)
1085
  { }
1086
 
1087
  // Create a group argument.
1088
  explicit Input_argument(Input_file_group* group)
1089
    : is_file_(false), group_(group)
1090
  { }
1091
 
1092
  // Return whether this is a file.
1093
  bool
1094
  is_file() const
1095
  { return this->is_file_; }
1096
 
1097
  // Return whether this is a group.
1098
  bool
1099
  is_group() const
1100
  { return !this->is_file_; }
1101
 
1102
  // Return the information about the file.
1103
  const Input_file_argument&
1104
  file() const
1105
  {
1106
    gold_assert(this->is_file_);
1107
    return this->file_;
1108
  }
1109
 
1110
  // Return the information about the group.
1111
  const Input_file_group*
1112
  group() const
1113
  {
1114
    gold_assert(!this->is_file_);
1115
    return this->group_;
1116
  }
1117
 
1118
  Input_file_group*
1119
  group()
1120
  {
1121
    gold_assert(!this->is_file_);
1122
    return this->group_;
1123
  }
1124
 
1125
 private:
1126
  bool is_file_;
1127
  Input_file_argument file_;
1128
  Input_file_group* group_;
1129
};
1130
 
1131
// A group from the command line.  This is a set of arguments within
1132
// --start-group ... --end-group.
1133
 
1134
class Input_file_group
1135
{
1136
 public:
1137
  typedef std::vector<Input_argument> Files;
1138
  typedef Files::const_iterator const_iterator;
1139
 
1140
  Input_file_group()
1141
    : files_()
1142
  { }
1143
 
1144
  // Add a file to the end of the group.
1145
  void
1146
  add_file(const Input_file_argument& arg)
1147
  { this->files_.push_back(Input_argument(arg)); }
1148
 
1149
  // Iterators to iterate over the group contents.
1150
 
1151
  const_iterator
1152
  begin() const
1153
  { return this->files_.begin(); }
1154
 
1155
  const_iterator
1156
  end() const
1157
  { return this->files_.end(); }
1158
 
1159
 private:
1160
  Files files_;
1161
};
1162
 
1163
// A list of files from the command line or a script.
1164
 
1165
class Input_arguments
1166
{
1167
 public:
1168
  typedef std::vector<Input_argument> Input_argument_list;
1169
  typedef Input_argument_list::const_iterator const_iterator;
1170
 
1171
  Input_arguments()
1172
    : input_argument_list_(), in_group_(false)
1173
  { }
1174
 
1175
  // Add a file.
1176
  void
1177
  add_file(const Input_file_argument& arg);
1178
 
1179
  // Start a group (the --start-group option).
1180
  void
1181
  start_group();
1182
 
1183
  // End a group (the --end-group option).
1184
  void
1185
  end_group();
1186
 
1187
  // Return whether we are currently in a group.
1188
  bool
1189
  in_group() const
1190
  { return this->in_group_; }
1191
 
1192
  // The number of entries in the list.
1193
  int
1194
  size() const
1195
  { return this->input_argument_list_.size(); }
1196
 
1197
  // Iterators to iterate over the list of input files.
1198
 
1199
  const_iterator
1200
  begin() const
1201
  { return this->input_argument_list_.begin(); }
1202
 
1203
  const_iterator
1204
  end() const
1205
  { return this->input_argument_list_.end(); }
1206
 
1207
  // Return whether the list is empty.
1208
  bool
1209
  empty() const
1210
  { return this->input_argument_list_.empty(); }
1211
 
1212
 private:
1213
  Input_argument_list input_argument_list_;
1214
  bool in_group_;
1215
};
1216
 
1217
 
1218
// All the information read from the command line.  These are held in
1219
// three separate structs: one to hold the options (--foo), one to
1220
// hold the filenames listed on the commandline, and one to hold
1221
// linker script information.  This third is not a subset of the other
1222
// two because linker scripts can be specified either as options (via
1223
// -T) or as a file.
1224
 
1225
class Command_line
1226
{
1227
 public:
1228
  typedef Input_arguments::const_iterator const_iterator;
1229
 
1230
  Command_line();
1231
 
1232
  // Process the command line options.  This will exit with an
1233
  // appropriate error message if an unrecognized option is seen.
1234
  void
1235
  process(int argc, const char** argv);
1236
 
1237
  // Process one command-line option.  This takes the index of argv to
1238
  // process, and returns the index for the next option.  no_more_options
1239
  // is set to true if argv[i] is "--".
1240
  int
1241
  process_one_option(int argc, const char** argv, int i,
1242
                     bool* no_more_options);
1243
 
1244
  // Get the general options.
1245
  const General_options&
1246
  options() const
1247
  { return this->options_; }
1248
 
1249
  // Get the position dependent options.
1250
  const Position_dependent_options&
1251
  position_dependent_options() const
1252
  { return this->position_options_; }
1253
 
1254
  // Get the linker-script options.
1255
  Script_options&
1256
  script_options()
1257
  { return this->script_options_; }
1258
 
1259
  // Get the version-script options: a convenience routine.
1260
  const Version_script_info&
1261
  version_script() const
1262
  { return *this->script_options_.version_script_info(); }
1263
 
1264
  // Get the input files.
1265
  Input_arguments&
1266
  inputs()
1267
  { return this->inputs_; }
1268
 
1269
  // The number of input files.
1270
  int
1271
  number_of_input_files() const
1272
  { return this->inputs_.size(); }
1273
 
1274
  // Iterators to iterate over the list of input files.
1275
 
1276
  const_iterator
1277
  begin() const
1278
  { return this->inputs_.begin(); }
1279
 
1280
  const_iterator
1281
  end() const
1282
  { return this->inputs_.end(); }
1283
 
1284
 private:
1285
  Command_line(const Command_line&);
1286
  Command_line& operator=(const Command_line&);
1287
 
1288
  General_options options_;
1289
  Position_dependent_options position_options_;
1290
  Script_options script_options_;
1291
  Input_arguments inputs_;
1292
};
1293
 
1294
} // End namespace gold.
1295
 
1296
#endif // !defined(GOLD_OPTIONS_H)

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.