X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gold%2Fparameters.h;h=da35d8473dfcbdc9a3368a28c5131e165305f5fd;hb=f5a0f5b503c43ed3e146bc0d3eca37784892b47e;hp=3b10228706fa03cd6589cc621a2f242bacd9dd7d;hpb=8851eccaec28f25f56fab5ba5d8ae44f71729975;p=binutils-gdb.git diff --git a/gold/parameters.h b/gold/parameters.h index 3b10228706f..da35d8473df 100644 --- a/gold/parameters.h +++ b/gold/parameters.h @@ -1,6 +1,6 @@ // parameters.h -- general parameters for a link using gold -*- C++ -*- -// Copyright 2006, 2007 Free Software Foundation, Inc. +// Copyright (C) 2006-2022 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -28,7 +28,11 @@ namespace gold class General_options; class Errors; +class Timer; class Target; +template +class Sized_target; +class Set_parameters_target_once; // Here we define the Parameters class which simply holds simple // general parameters which apply to the entire link. We use a global @@ -47,21 +51,20 @@ class Target; class Parameters { public: - Parameters() - : errors_(NULL), options_(NULL), target_(NULL), - doing_static_link_valid_(false), doing_static_link_(false), - debug_(0) - { } + Parameters(); // These should be called as soon as they are known. void set_errors(Errors* errors); + void + set_timer(Timer* timer); + void set_options(const General_options* options); void - set_target(const Target* target); + set_target(Target* target); void set_doing_static_link(bool doing_static_link); @@ -71,6 +74,11 @@ class Parameters errors() const { return this->errors_; } + // Return the timer object. + Timer* + timer() const + { return this->timer_; } + // Whether the options are valid. This should not normally be // called, but it is needed by gold_exit. bool @@ -98,10 +106,23 @@ class Parameters return *this->target_; } - // When we don't have an output file to associate a target, make a - // default one, with guesses about size and endianness. - const Target& - default_target() const; + // The Sized_target of the output file. The caller must request the + // right size and endianness. + template + Sized_target* + sized_target() const + { + gold_assert(this->target_valid()); + return static_cast*>(this->target_); + } + + // Clear the target, for testing. + void + clear_target(); + + // Return true if TARGET is compatible with the current target. + bool + is_compatible_target(const Target*) const; bool doing_static_link() const @@ -116,10 +137,16 @@ class Parameters int debug() const { - gold_assert(this->options_valid()); + // This can be called before the options are set up. + if (!this->options_valid()) + return 0; return debug_; } + // Return the name of the entry symbol. + const char* + entry() const; + // A convenience routine for combining size and endianness. It also // checks the HAVE_TARGET_FOO configure options and dies if the // current target's size/endianness is not supported according to @@ -130,14 +157,46 @@ class Parameters Target_size_endianness size_and_endianness() const; + // Set the incremental linking mode to INCREMENTAL_FULL. Used when + // the linker determines that an incremental update is not possible. + // Returns false if the incremental mode was INCREMENTAL_UPDATE, + // indicating that the linker should exit if an update is not possible. + bool + set_incremental_full(); + + // Return true if we need to prepare incremental linking information. + bool + incremental() const; + + // Return true if we are doing a full incremental link. + bool + incremental_full() const; + + // Return true if we are doing an incremental update. + bool + incremental_update() const; private: + void + set_target_once(Target*); + + void + check_target_endianness(); + + void + check_rodata_segment(); + + friend class Set_parameters_target_once; + Errors* errors_; + Timer* timer_; const General_options* options_; - const Target* target_; + Target* target_; bool doing_static_link_valid_; bool doing_static_link_; int debug_; + int incremental_mode_; + Set_parameters_target_once* set_parameters_target_once_; }; // This is a global variable. @@ -149,15 +208,32 @@ extern const Parameters* parameters; extern void set_parameters_errors(Errors* errors); +extern void +set_parameters_timer(Timer* timer); + extern void set_parameters_options(const General_options* options); extern void -set_parameters_target(const Target* target); +set_parameters_target(Target* target); extern void set_parameters_doing_static_link(bool doing_static_link); - + +extern bool +set_parameters_incremental_full(); + +// Ensure that the target to be valid by using the default target if +// necessary. + +extern void +parameters_force_valid_target(); + +// Clear the current target, for testing. + +extern void +parameters_clear_target(); + // Return whether we are doing a particular debugging type. The // argument is one of the flags from debug.h.