summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gold/options.cc18
-rw-r--r--gold/options.h15
2 files changed, 32 insertions, 1 deletions
diff --git a/gold/options.cc b/gold/options.cc
index b27afe8f7e..916ccf4d18 100644
--- a/gold/options.cc
+++ b/gold/options.cc
@@ -172,6 +172,17 @@ parse_uint64(const char* option_name, const char* arg, uint64_t *retval)
}
void
+parse_double(const char* option_name, const char* arg, double* retval)
+{
+ char* endptr;
+ *retval = strtod(arg, &endptr);
+ 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')
@@ -661,6 +672,13 @@ General_options::finalize()
&& (this->shared() || this->relocatable()))
gold_fatal(_("binary output format not compatible with -shared or -r"));
+ if (this->user_set_hash_bucket_empty_fraction()
+ && (this->hash_bucket_empty_fraction() < 0.0
+ || this->hash_bucket_empty_fraction() >= 1.0))
+ gold_fatal(_("--hash-bucket-empty-fraction value %g out of range "
+ "[0.0, 1.0)"),
+ this->hash_bucket_empty_fraction());
+
// FIXME: we can/should be doing a lot more sanity checking here.
}
diff --git a/gold/options.h b/gold/options.h
index 4fe73abd89..1dff71fe9a 100644
--- a/gold/options.h
+++ b/gold/options.h
@@ -71,7 +71,10 @@ extern void
parse_uint(const char* option_name, const char* arg, int* retval);
extern 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);
+
+extern void
+parse_double(const char* option_name, const char* arg, double* retval);
extern void
parse_string(const char* option_name, const char* arg, const char** retval);
@@ -281,6 +284,12 @@ struct Struct_special : public Struct_var
#default_value__, helpstring__, helparg__, \
uint64_t, uint64_t, options::parse_uint64)
+#define DEFINE_double(varname__, dashes__, shortname__, default_value__, \
+ helpstring__, helparg__) \
+ DEFINE_var(varname__, dashes__, shortname__, default_value__, \
+ #default_value__, helpstring__, helparg__, \
+ double, double, options::parse_double)
+
#define DEFINE_string(varname__, dashes__, shortname__, default_value__, \
helpstring__, helparg__) \
DEFINE_var(varname__, dashes__, shortname__, default_value__, \
@@ -466,6 +475,10 @@ class General_options
DEFINE_string(soname, options::ONE_DASH, 'h', NULL,
N_("Set shared library name"), N_("FILENAME"));
+ DEFINE_double(hash_bucket_empty_fraction, options::TWO_DASHES, '\0', 0.0,
+ N_("Min fraction of empty buckets in dynamic hash"),
+ N_("FRACTION"));
+
DEFINE_enum(hash_style, options::TWO_DASHES, '\0', "sysv",
N_("Dynamic hash style"), N_("[sysv,gnu,both]"),
{"sysv", "gnu", "both"});
OpenPOWER on IntegriCloud