// options.h -- handle command line options for gold -*- C++ -*-
-// Copyright 2006, 2007, 2008 Free Software Foundation, Inc.
+// Copyright 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.
// This file is part of gold.
class Input_file_group;
class Position_dependent_options;
class Target;
+class Plugin_manager;
+
+// Incremental build action for a specific file, as selected by the user.
+
+enum Incremental_disposition
+{
+ // Determine the status from the timestamp (default).
+ INCREMENTAL_CHECK,
+ // Assume the file changed from the previous build.
+ INCREMENTAL_CHANGED,
+ // Assume the file didn't change from the previous build.
+ INCREMENTAL_UNCHANGED
+};
// The nested namespace is to contain all the global variables and
// structs that need to be defined in the .h file, but do not need to
is_in_sysroot() const
{ return this->is_in_sysroot_; }
+ // Return whether this is considered a system directory.
+ bool
+ is_system_directory() const
+ { return this->put_in_sysroot_ || this->is_in_sysroot_; }
+
private:
+ // The directory name.
std::string name_;
+ // True if the sysroot should be added as a prefix for this
+ // directory (if there is a sysroot). This is true for system
+ // directories that we search by default.
bool put_in_sysroot_;
+ // True if this directory is in the sysroot (if there is a sysroot).
+ // This is true if there is a sysroot and either 1) put_in_sysroot_
+ // is true, or 2) the directory happens to be in the sysroot based
+ // on a pathname comparison.
bool is_in_sysroot_;
};
N_("Try to detect violations of the One Definition Rule"),
NULL);
+ DEFINE_bool(dynamic_list_data, options::TWO_DASHES, '\0', false,
+ N_("Add data symbols to dynamic symbols"), NULL);
+
+ DEFINE_bool(dynamic_list_cpp_new, options::TWO_DASHES, '\0', false,
+ N_("Add C++ operator new/delete to dynamic symbols"), NULL);
+
+ DEFINE_bool(dynamic_list_cpp_typeinfo, options::TWO_DASHES, '\0', false,
+ N_("Add C++ typeinfo to dynamic symbols"), NULL);
+
+ DEFINE_special(dynamic_list, options::TWO_DASHES, '\0',
+ N_("Read a list of dynamic symbols"), N_("FILE"));
+
DEFINE_string(entry, options::TWO_DASHES, 'e', NULL,
N_("Set program start address"), N_("ADDRESS"));
DEFINE_bool(export_dynamic, options::TWO_DASHES, 'E', false,
- N_("Export all dynamic symbols"), NULL);
+ N_("Export all dynamic symbols"),
+ N_("Do not export all dynamic symbols (default)"));
DEFINE_bool(eh_frame_hdr, options::TWO_DASHES, '\0', false,
N_("Create exception frame header"), NULL);
DEFINE_string(dynamic_linker, options::TWO_DASHES, 'I', NULL,
N_("Set dynamic linker path"), N_("PROGRAM"));
+ DEFINE_bool(incremental, options::TWO_DASHES, '\0', false,
+ N_("Work in progress; do not use"),
+ N_("Do a full build"));
+
+ DEFINE_special(incremental_changed, options::TWO_DASHES, '\0',
+ N_("Assume files changed"), NULL);
+
+ DEFINE_special(incremental_unchanged, options::TWO_DASHES, '\0',
+ N_("Assume files didn't change"), NULL);
+
+ DEFINE_special(incremental_unknown, options::TWO_DASHES, '\0',
+ N_("Use timestamps to check files (default)"), NULL);
+
DEFINE_special(just_symbols, options::TWO_DASHES, '\0',
N_("Read only symbol values from FILE"), N_("FILE"));
DEFINE_string(oformat, options::EXACTLY_TWO_DASHES, '\0', "elf",
N_("Set output format"), N_("[binary]"));
+#ifdef ENABLE_PLUGINS
+ DEFINE_special(plugin, options::TWO_DASHES, '\0',
+ N_("Load a plugin library"), N_("PLUGIN"));
+ DEFINE_special(plugin_opt, options::TWO_DASHES, '\0',
+ N_("Pass an option to the plugin"), N_("OPTION"));
+#endif
+
DEFINE_bool(preread_archive_symbols, options::TWO_DASHES, '\0', false,
N_("Preread archive symbols when multi-threaded"), NULL);
+
DEFINE_string(print_symbol_counts, options::TWO_DASHES, '\0', NULL,
N_("Print symbols defined and used for each input"),
N_("FILENAME"));
DEFINE_bool(strip_debug_gdb, options::TWO_DASHES, '\0', false,
N_("Strip debug symbols that are unused by gdb "
"(at least versions <= 6.7)"), NULL);
+ DEFINE_bool(strip_lto_sections, options::TWO_DASHES, '\0', true,
+ N_("Strip LTO intermediate code sections"), NULL);
+
+ DEFINE_bool(no_keep_memory, options::TWO_DASHES, 's', false,
+ N_("Use less memory and more disk I/O (included only for compatibility with GNU ld)"), NULL);
DEFINE_bool(shared, options::ONE_DASH, '\0', false,
N_("Generate shared library"), NULL);
+ DEFINE_bool(Bshareable, options::ONE_DASH, '\0', false,
+ N_("Generate shared library"), NULL);
+
// This is not actually special in any way, but I need to give it
// a non-standard accessor-function name because 'static' is a keyword.
DEFINE_special(static, options::ONE_DASH, '\0',
N_("Do not link against shared libraries"), NULL);
+ DEFINE_bool(gc_sections, options::TWO_DASHES, '\0', false,
+ N_("Remove unused sections"),
+ N_("Don't remove unused sections (default)"));
+
+ DEFINE_bool(print_gc_sections, options::TWO_DASHES, '\0', false,
+ N_("List removed unused sections on stderr"),
+ N_("Do not list removed unused sections"));
+
DEFINE_bool(stats, options::TWO_DASHES, '\0', false,
N_("Print resource usage statistics"), NULL);
DEFINE_special(version_script, options::TWO_DASHES, '\0',
N_("Read version script"), N_("FILE"));
+ DEFINE_bool(warn_search_mismatch, options::TWO_DASHES, '\0', true,
+ N_("Warn when skipping an incompatible library"),
+ N_("Don't warn when skipping an incompatible library"));
+
DEFINE_bool(whole_archive, options::TWO_DASHES, '\0', false,
N_("Include all archive contents"),
N_("Include only needed archive contents"));
Object_format format_enum() const;
Object_format oformat_enum() const;
+ // Return whether FILENAME is in a system directory.
+ bool
+ is_in_system_directory(const std::string& name) const;
+
// These are the best way to get access to the execstack state,
// not execstack() and noexecstack() which are hard to use properly.
bool
do_demangle() const
{ return this->do_demangle_; }
+ // Returns TRUE if any plugin libraries have been loaded.
+ bool
+ has_plugins() const
+ { return this->plugins_ != NULL; }
+
+ // Return a pointer to the plugin manager.
+ Plugin_manager*
+ plugins() const
+ { return this->plugins_; }
+
+ // True iff SYMBOL was found in the file specified by dynamic-list.
+ bool
+ in_dynamic_list(const char* symbol) const
+ { return this->dynamic_list_.version_script_info()->symbol_is_local(symbol); }
+
+ // The disposition given by the --incremental-changed,
+ // --incremental-unchanged or --incremental-unknown option. The
+ // value may change as we proceed parsing the command line flags.
+ Incremental_disposition
+ incremental_disposition() const
+ { return this->incremental_disposition_; }
+
private:
// Don't copy this structure.
General_options(const General_options&);
void
add_sysroot();
+ // Add a plugin and its arguments to the list of plugins.
+ void
+ add_plugin(const char *filename);
+
+ // Add a plugin option.
+ void
+ add_plugin_option(const char* opt);
+
// Whether to mark the stack as executable.
Execstack execstack_status_;
// Whether to do a static link.
bool static_;
// Whether to do demangling.
bool do_demangle_;
+ // List of plugin libraries.
+ Plugin_manager* plugins_;
+ // The parsed output of --dynamic-list files. For convenience in
+ // script.cc, we store this as a Script_options object, even though
+ // we only use a single Version_tree from it.
+ Script_options dynamic_list_;
+ // The disposition given by the --incremental-changed,
+ // --incremental-unchanged or --incremental-unknown option. The
+ // value may change as we proceed parsing the command line flags.
+ Incremental_disposition incremental_disposition_;
+ // Wheater we have seen one of the options that require incremental
+ // build (--incremental-changed, --incremental-unchanged or
+ // --incremental-unknown)
+ bool implicit_incremental_;
};
// The position-dependent options. We use this to store the state of
this->set_Bdynamic(options.Bdynamic());
this->set_format_enum(options.format_enum());
this->set_whole_archive(options.whole_archive());
+ this->set_incremental_disposition(options.incremental_disposition());
}
DEFINE_posdep(as_needed, bool);
DEFINE_posdep(Bdynamic, bool);
DEFINE_posdep(format_enum, General_options::Object_format);
DEFINE_posdep(whole_archive, bool);
+ DEFINE_posdep(incremental_disposition, Incremental_disposition);
private:
// This is a General_options with everything set to its default