gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gold / script.h
index fc83905f0908d4ddab734de38f75d249cc6cbd1a..81e45a2df20df2c30f1837537b9d2790dfeb2738 100644 (file)
@@ -1,6 +1,6 @@
 // script.h -- handle linker scripts for gold   -*- C++ -*-
 
-// Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+// Copyright (C) 2006-2020 Free Software Foundation, Inc.
 // Written by Ian Lance Taylor <iant@google.com>.
 
 // This file is part of gold.
@@ -34,6 +34,7 @@
 #include <string>
 #include <vector>
 
+#include "elfcpp.h"
 #include "script-sections.h"
 
 namespace gold
@@ -90,20 +91,29 @@ class Expression
   // the section address.  If RESULT_ALIGNMENT is not NULL, this sets
   // *RESULT_ALIGNMENT to the alignment of the value of that alignment
   // is larger than *RESULT_ALIGNMENT; this will only be non-zero if
-  // this is an ALIGN expression.
+  // this is an ALIGN expression.  If IS_SECTION_DOT_ASSIGMENT is true,
+  // we are evaluating an assignment to dot within an output section,
+  // and an absolute value should be interpreted as an offset within
+  // the section.
   uint64_t
   eval_with_dot(const Symbol_table*, const Layout*, bool check_assertions,
                uint64_t dot_value, Output_section* dot_section,
-               Output_section** result_section, uint64_t* result_alignment);
+               Output_section** result_section, uint64_t* result_alignment,
+               bool is_section_dot_assignment);
 
   // Return the value of an expression which may or may not be
   // permitted to refer to the dot symbol, depending on
-  // is_dot_available.
+  // is_dot_available.  If IS_SECTION_DOT_ASSIGMENT is true,
+  // we are evaluating an assignment to dot within an output section,
+  // and an absolute value should be interpreted as an offset within
+  // the section.
   uint64_t
   eval_maybe_dot(const Symbol_table*, const Layout*, bool check_assertions,
                 bool is_dot_available, uint64_t dot_value,
                 Output_section* dot_section,
-                Output_section** result_section, uint64_t* result_alignment);
+                Output_section** result_section, uint64_t* result_alignment,
+                elfcpp::STT* type, elfcpp::STV* vis, unsigned char* nonvis,
+                bool is_section_dot_assignment, bool* is_valid_pointer);
 
   // Print the expression to the FILE.  This is for debugging.
   virtual void
@@ -119,13 +129,17 @@ class Expression
   virtual uint64_t
   value(const Expression_eval_info*) = 0;
 
+  // Sets all symbols used in expressions as seen in a real ELF object.
+  virtual void
+  set_expr_sym_in_real_elf(Symbol_table*) const
+  { return; }
+
  private:
   // May not be copied.
   Expression(const Expression&);
   Expression& operator=(const Expression&);
 };
 
-
 // Version_script_info stores information parsed from the version
 // script, either provided by --version-script or as part of a linker
 // script.  A single Version_script_info object per target is owned by
@@ -334,17 +348,25 @@ class Symbol_assignment
   void
   finalize(Symbol_table*, const Layout*);
 
+  bool
+  is_defsym() const
+  { return is_defsym_; }
+
+  Expression *
+  value() const
+  { return val_; }
+
   // Finalize the symbol value when it can refer to the dot symbol.
   void
   finalize_with_dot(Symbol_table*, const Layout*, uint64_t dot_value,
                    Output_section* dot_section);
 
-  // Set the symbol value, but only if the value is absolute.  This is
-  // used while processing a SECTIONS clause.  We assume that dot is
-  // an absolute value here.  We do not check assertions.
+  // Set the symbol value, but only if the value is absolute or relative to
+  // DOT_SECTION.  This is used while processing a SECTIONS clause.
+  // We assume that dot is an absolute value here.  We do not check assertions.
   void
   set_if_absolute(Symbol_table*, const Layout*, bool is_dot_available,
-                 uint64_t dot_value);
+                 uint64_t dot_value, Output_section* dot_section);
 
   const std::string&
   name() const
@@ -444,6 +466,13 @@ class Script_options
   bool
   define_symbol(const char* definition);
 
+  // Populates the set with symbol names used in LHS of defsym.
+  void
+  find_defsym_defs(Unordered_set<std::string>&);
+
+  // Set symbols used in defsym expressions as seen in a real ELF object.
+  void set_defsym_uses_in_real_elf(Symbol_table*) const;
+
   // Create sections required by any linker scripts.
   void
   create_script_sections(Layout*);
@@ -528,7 +557,7 @@ class Script_options
   // SECTIONS clause.
   typedef std::vector<Symbol_assignment*> Symbol_assignments;
 
-  // We keep a list of all assertions whcih occur outside of a
+  // We keep a list of all assertions which occur outside of a
   // SECTIONS clause.
   typedef std::vector<Script_assertion*> Assertions;
 
@@ -548,31 +577,6 @@ class Script_options
   Script_sections script_sections_;
 };
 
-// Information about a script input that will persist during the whole linker
-// run. Needed only during an incremental build to retrieve the input files
-// added by this script.
-
-class Script_info
-{
- public:
-  Script_info()
-    : incremental_script_entry_(NULL)
-  { }
-
-  // Store a pointer to the incremental information for this script.
-  void
-  set_incremental_info(Incremental_script_entry* entry)
-  { this->incremental_script_entry_ = entry; }
-
-  // Return the pointer to the incremental information for this script.
-  Incremental_script_entry*
-  incremental_info() const
-  { return this->incremental_script_entry_; }
-
- private:
-  Incremental_script_entry* incremental_script_entry_;
-};
-
 // FILE was found as an argument on the command line, but was not
 // recognized as an ELF file.  Try to read it as a script.  Return
 // true if the file was handled.  This has to handle /usr/lib/libc.so
This page took 0.024822 seconds and 4 git commands to generate.