| // parameters.h -- general parameters for a link using gold -*- C++ -*- |
| |
| // Copyright 2006, 2007 Free Software Foundation, Inc. |
| // Written by Ian Lance Taylor <iant@google.com>. |
| |
| // This file is part of gold. |
| |
| // This program is free software; you can redistribute it and/or modify |
| // it under the terms of the GNU General Public License as published by |
| // the Free Software Foundation; either version 3 of the License, or |
| // (at your option) any later version. |
| |
| // This program is distributed in the hope that it will be useful, |
| // but WITHOUT ANY WARRANTY; without even the implied warranty of |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| // GNU General Public License for more details. |
| |
| // You should have received a copy of the GNU General Public License |
| // along with this program; if not, write to the Free Software |
| // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
| // MA 02110-1301, USA. |
| |
| #ifndef GOLD_PARAMETERS_H |
| #define GOLD_PARAMETERS_H |
| |
| namespace gold |
| { |
| |
| class General_options; |
| class Errors; |
| |
| // Here we define the Parameters class which simply holds simple |
| // general parameters which apply to the entire link. We use a global |
| // variable for this. This is in contrast to the General_options |
| // class, which holds the complete state of position independent |
| // command line options. The hope is that Parameters will stay fairly |
| // simple, so that if this turns into a library it will be clear how |
| // these parameters should be set. |
| |
| class Parameters |
| { |
| public: |
| Parameters(Errors*); |
| |
| // Return the error object. |
| Errors* |
| errors() const |
| { return this->errors_; } |
| |
| // Whether the options are valid. This should not normally be |
| // called, but it is needed by gold_exit. |
| bool |
| options_valid() const |
| { return this->options_valid_; } |
| |
| // Whether to use threads. |
| bool |
| threads() const |
| { |
| gold_assert(this->options_valid_); |
| return this->threads_; |
| } |
| |
| // Return the output file name. |
| const char* |
| output_file_name() const |
| { |
| gold_assert(this->options_valid_); |
| return this->output_file_name_; |
| } |
| |
| // Whether we are generating a regular executable. |
| bool |
| output_is_executable() const |
| { |
| gold_assert(this->output_file_type_ != OUTPUT_INVALID); |
| return this->output_file_type_ == OUTPUT_EXECUTABLE; |
| } |
| |
| // Whether we are generating a shared library. |
| bool |
| output_is_shared() const |
| { |
| gold_assert(this->output_file_type_ != OUTPUT_INVALID); |
| return this->output_file_type_ == OUTPUT_SHARED; |
| } |
| |
| // Whether we are generating an object file. |
| bool |
| output_is_object() const |
| { |
| gold_assert(this->output_file_type_ != OUTPUT_INVALID); |
| return this->output_file_type_ == OUTPUT_OBJECT; |
| } |
| |
| // Whether we are generating position-independent output. |
| // This is the case when generating either a shared library |
| // or a regular executable with the --pic-executable option. |
| // FIXME: support --pic-executable |
| bool |
| output_is_position_independent() const |
| { return output_is_shared(); } |
| |
| // The target system root directory. This is NULL if there isn't |
| // one. |
| const std::string& |
| sysroot() const |
| { |
| gold_assert(this->options_valid_); |
| return this->sysroot_; |
| } |
| |
| // Whether to strip all symbols. |
| bool |
| strip_all() const |
| { |
| gold_assert(this->strip_ != STRIP_INVALID); |
| return this->strip_ == STRIP_ALL; |
| } |
| |
| // Whether to strip debugging information. |
| bool |
| strip_debug() const |
| { |
| gold_assert(this->strip_ != STRIP_INVALID); |
| return this->strip_ == STRIP_ALL || this->strip_ == STRIP_DEBUG; |
| } |
| |
| // Whether to strip debugging information that's not used by gdb. |
| bool |
| strip_debug_gdb() const |
| { |
| gold_assert(this->strip_ != STRIP_INVALID); |
| return this->strip_debug() || this->strip_ == STRIP_DEBUG_UNUSED_BY_GDB; |
| } |
| |
| // Whether to permit unresolved references from shared libraries. |
| bool |
| allow_shlib_undefined() const |
| { |
| gold_assert(this->options_valid_); |
| return this->allow_shlib_undefined_; |
| } |
| |
| // Whether we are doing a symbolic link, in which all defined |
| // symbols are bound locally. |
| bool |
| symbolic() const |
| { |
| gold_assert(this->options_valid_); |
| return this->symbolic_; |
| } |
| |
| // Whether we should demangle C++ symbols in our log messages. |
| bool |
| demangle() const |
| { return this->demangle_; } |
| |
| // Whether we should try to detect violations of the One Definition Rule. |
| bool |
| detect_odr_violations() const |
| { |
| gold_assert(this->options_valid_); |
| return this->detect_odr_violations_; |
| } |
| |
| // The general linker optimization level. |
| int |
| optimization_level() const |
| { |
| gold_assert(this->options_valid_); |
| return this->optimization_level_; |
| } |
| |
| // Whether the -E/--export-dynamic flag is set. |
| bool |
| export_dynamic() const |
| { |
| gold_assert(this->options_valid_); |
| return this->export_dynamic_; |
| } |
| |
| // Return the debug flags. These are the flags for which we should |
| // report internal debugging information. |
| unsigned int |
| debug() const |
| { |
| gold_assert(this->options_valid_); |
| return this->debug_; |
| } |
| |
| // Whether we are doing a static link--a link in which none of the |
| // input files are shared libraries. This is only known after we |
| // have seen all the input files. |
| bool |
| doing_static_link() const |
| { |
| gold_assert(this->is_doing_static_link_valid_); |
| return this->doing_static_link_; |
| } |
| |
| // The size of the output file we are generating. This should |
| // return 32 or 64. |
| int |
| get_size() const |
| { |
| gold_assert(this->is_size_and_endian_valid_); |
| return this->size_; |
| } |
| |
| // Whether the output is big endian. |
| bool |
| is_big_endian() const |
| { |
| gold_assert(this->is_size_and_endian_valid_); |
| return this->is_big_endian_; |
| } |
| |
| // Set values recorded from options. |
| void |
| set_from_options(const General_options*); |
| |
| // Set whether we are doing a static link. |
| void |
| set_doing_static_link(bool doing_static_link); |
| |
| // Set the size and endianness. |
| void |
| set_size_and_endianness(int size, bool is_big_endian); |
| |
| private: |
| // The types of output files. |
| enum Output_file_type |
| { |
| // Uninitialized. |
| OUTPUT_INVALID, |
| // Generating executable. |
| OUTPUT_EXECUTABLE, |
| // Generating shared library. |
| OUTPUT_SHARED, |
| // Generating object file. |
| OUTPUT_OBJECT |
| }; |
| |
| // Which symbols to strip. |
| enum Strip |
| { |
| // Uninitialize. |
| STRIP_INVALID, |
| // Don't strip any symbols. |
| STRIP_NONE, |
| // Strip all symbols. |
| STRIP_ALL, |
| // Strip debugging information. |
| STRIP_DEBUG, |
| // Strip debugging information that's not used by gdb (at least <= 6.7) |
| STRIP_DEBUG_UNUSED_BY_GDB |
| }; |
| |
| // A pointer to the error handling object. |
| Errors* errors_; |
| |
| // Whether the fields set from the options are valid. |
| bool options_valid_; |
| // Whether to use threads. |
| bool threads_; |
| // The output file name. |
| const char* output_file_name_; |
| // The type of the output file. |
| Output_file_type output_file_type_; |
| // The target system root directory. |
| std::string sysroot_; |
| // Which symbols to strip. |
| Strip strip_; |
| // Whether to allow undefined references from shared libraries. |
| bool allow_shlib_undefined_; |
| // Whether we are doing a symbolic link. |
| bool symbolic_; |
| // Whether we should demangle C++ symbols in our log messages. |
| bool demangle_; |
| // Whether we try to detect One Definition Rule violations. |
| bool detect_odr_violations_; |
| // The optimization level. |
| int optimization_level_; |
| // Whether the -E/--export-dynamic flag is set. |
| bool export_dynamic_; |
| // The debug flags. |
| unsigned int debug_; |
| |
| // Whether the doing_static_link_ field is valid. |
| bool is_doing_static_link_valid_; |
| // Whether we are doing a static link. |
| bool doing_static_link_; |
| // Whether the size_ and is_big_endian_ fields are valid. |
| bool is_size_and_endian_valid_; |
| // The size of the output file--32 or 64. |
| int size_; |
| // Whether the output file is big endian. |
| bool is_big_endian_; |
| }; |
| |
| // This is a global variable. |
| extern const Parameters* parameters; |
| |
| // Initialize the global variable. |
| extern void initialize_parameters(Errors*); |
| |
| // Set the options. |
| extern void set_parameters_from_options(const General_options*); |
| |
| // Set the size and endianness of the global parameters variable. |
| extern void set_parameters_size_and_endianness(int size, bool is_big_endian); |
| |
| // Set whether we are doing a static link. |
| extern void set_parameters_doing_static_link(bool doing_static_link); |
| |
| // Return whether we are doing a particular debugging type. The |
| // argument is one of the flags from debug.h. |
| |
| inline bool |
| is_debugging_enabled(unsigned int type) |
| { return (parameters->debug() & type) != 0; } |
| |
| } // End namespace gold. |
| |
| #endif // !defined(GOLD_PARAMETERS_H) |