// options.c -- handle command line options for gold
-// Copyright 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.
// This file is part of gold.
{
// This flag is TRUE if we should register the command-line options as they
-// are constructed. It is set after contruction of the options within
+// are constructed. It is set after construction of the options within
// class Position_dependent_options.
static bool ready_to_register = false;
// These are set up at the same time -- the variables that accept one
// dash, two, or require -z. A single variable may be in more than
-// one of thes data structures.
+// one of these data structures.
typedef Unordered_map<std::string, One_option*> Option_map;
static Option_map* long_options = NULL;
static One_option* short_options[128];
printf(" %s", *p);
printf("\n");
+ printf(_("%s: supported emulations:"), gold::program_name);
+ supported_names.clear();
+ gold::supported_emulation_names(&supported_names);
+ for (std::vector<const char*>::const_iterator p = supported_names.begin();
+ p != supported_names.end();
+ ++p)
+ printf(" %s", *p);
+ printf("\n");
+
// REPORT_BUGS_TO is defined in bfd/bfdver.h.
const char* report = REPORT_BUGS_TO;
if (*report != '\0')
}
void
-parse_uint64(const char* option_name, const char* arg, uint64_t *retval)
+parse_uint64(const char* option_name, const char* arg, uint64_t* retval)
{
char* endptr;
*retval = strtoull(arg, &endptr, 0);
}
void
+parse_percent(const char* option_name, const char* arg, double* retval)
+{
+ char* endptr;
+ *retval = strtod(arg, &endptr) / 100.0;
+ if (*endptr != '\0')
+ gold_fatal(_("%s: invalid option value "
+ "(expected a floating point number): %s"),
+ option_name, arg);
+}
+
+void
parse_string(const char* option_name, const char* arg, const char** retval)
{
if (*arg == '\0')
{
gold::print_version(true);
this->printed_version_ = true;
+
printf(_(" Supported targets:\n"));
std::vector<const char*> supported_names;
gold::supported_target_names(&supported_names);
p != supported_names.end();
++p)
printf(" %s\n", *p);
+
+ printf(_(" Supported emulations:\n"));
+ supported_names.clear();
+ gold::supported_emulation_names(&supported_names);
+ for (std::vector<const char*>::const_iterator p = supported_names.begin();
+ p != supported_names.end();
+ ++p)
+ printf(" %s\n", *p);
}
void
}
void
+General_options::parse_incremental(const char*, const char*,
+ Command_line*)
+{
+ this->incremental_mode_ = INCREMENTAL_AUTO;
+}
+
+void
+General_options::parse_no_incremental(const char*, const char*,
+ Command_line*)
+{
+ this->incremental_mode_ = INCREMENTAL_OFF;
+}
+
+void
+General_options::parse_incremental_full(const char*, const char*,
+ Command_line*)
+{
+ this->incremental_mode_ = INCREMENTAL_FULL;
+}
+
+void
+General_options::parse_incremental_update(const char*, const char*,
+ Command_line*)
+{
+ this->incremental_mode_ = INCREMENTAL_UPDATE;
+}
+
+void
General_options::parse_incremental_changed(const char*, const char*,
Command_line*)
{
}
void
+General_options::parse_incremental_startup_unchanged(const char*, const char*,
+ Command_line*)
+{
+ this->implicit_incremental_ = true;
+ this->incremental_startup_disposition_ = INCREMENTAL_UNCHANGED;
+}
+
+void
General_options::parse_library(const char*, const char* arg,
Command_line* cmdline)
{
Input_file_argument::Input_file_type type;
- const char *name;
+ const char* name;
if (arg[0] == ':')
{
type = Input_file_argument::INPUT_FILE_TYPE_SEARCHED_FILE;
}
// The function add_excluded_libs() in ld/ldlang.c of GNU ld breaks up a list
-// of names seperated by commas or colons and puts them in a linked list.
+// of names separated by commas or colons and puts them in a linked list.
// We implement the same parsing of names here but store names in an unordered
// map to speed up searching of names.
General_options::parse_exclude_libs(const char*, const char* arg,
Command_line*)
{
- const char *p = arg;
+ const char* p = arg;
while (*p != '\0')
{
// wild-card and matches any given name.
bool
-General_options::check_excluded_libs (const std::string &name) const
+General_options::check_excluded_libs(const std::string &name) const
{
Unordered_set<std::string>::const_iterator p;
return true;
// First strip off any directories in name.
- const char *basename = lbasename(name.c_str());
+ const char* basename = lbasename(name.c_str());
// Try finding an exact match.
p = excluded_libs_.find(std::string(basename));
this->fix_v4bx_ = FIX_V4BX_INTERWORKING;
}
+void
+General_options::parse_EB(const char*, const char*, Command_line*)
+{
+ this->endianness_ = ENDIANNESS_BIG;
+}
+
+void
+General_options::parse_EL(const char*, const char*, Command_line*)
+{
+ this->endianness_ = ENDIANNESS_LITTLE;
+}
+
} // End namespace gold.
namespace
}
void
-usage(const char* msg, const char *opt)
+usage(const char* msg, const char* opt)
{
fprintf(stderr,
_("%s: %s: %s\n"),
do_demangle_(false),
plugins_(NULL),
dynamic_list_(),
- incremental_disposition_(INCREMENTAL_CHECK),
+ incremental_mode_(INCREMENTAL_OFF),
+ incremental_disposition_(INCREMENTAL_STARTUP),
+ incremental_startup_disposition_(INCREMENTAL_CHECK),
implicit_incremental_(false),
excluded_libs_(),
symbols_to_retain_(),
section_starts_(),
- fix_v4bx_(FIX_V4BX_NONE)
+ fix_v4bx_(FIX_V4BX_NONE),
+ endianness_(ENDIANNESS_NOT_SET)
{
// Turn off option registration once construction is complete.
gold::options::ready_to_register = false;
}
while (next_pos != std::string::npos);
}
- else
+ else if (!this->nostdlib())
{
// Even if they don't specify it, we add -L /lib and -L /usr/lib.
// FIXME: We should only do this when configured in native mode.
if (this->pie() && this->relocatable())
gold_fatal(_("-pie and -r are incompatible"));
+ if (!this->shared())
+ {
+ if (this->filter() != NULL)
+ gold_fatal(_("-F/--filter may not used without -shared"));
+ if (this->any_auxiliary())
+ gold_fatal(_("-f/--auxiliary may not be used without -shared"));
+ }
+
// TODO: implement support for -retain-symbols-file with -r, if needed.
if (this->relocatable() && this->retain_symbols_file())
gold_fatal(_("-retain-symbols-file does not yet work with -r"));
"[0.0, 1.0)"),
this->hash_bucket_empty_fraction());
- if (this->implicit_incremental_ && !this->incremental())
+ if (this->implicit_incremental_ && this->incremental_mode_ == INCREMENTAL_OFF)
gold_fatal(_("Options --incremental-changed, --incremental-unchanged, "
"--incremental-unknown require the use of --incremental"));
// Add a file to the list.
-void
-Input_arguments::add_file(const Input_file_argument& file)
+Input_argument&
+Input_arguments::add_file(Input_file_argument& file)
{
+ file.set_arg_serial(++this->file_count_);
if (this->in_group_)
{
gold_assert(!this->input_argument_list_.empty());
gold_assert(this->input_argument_list_.back().is_group());
- this->input_argument_list_.back().group()->add_file(file);
+ return this->input_argument_list_.back().group()->add_file(file);
}
- else if (this->in_lib_)
+ if (this->in_lib_)
{
gold_assert(!this->input_argument_list_.empty());
gold_assert(this->input_argument_list_.back().is_lib());
- this->input_argument_list_.back().lib()->add_file(file);
+ return this->input_argument_list_.back().lib()->add_file(file);
}
- else
- this->input_argument_list_.push_back(Input_argument(file));
+ this->input_argument_list_.push_back(Input_argument(file));
+ return this->input_argument_list_.back();
}
// Start a group.