gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gold / compressed_output.h
index 589dacc372dcb94e49520bda358ed7db79895ff8..3d640a3bd072f7c320ba3d5d559522c46411ac2a 100644 (file)
@@ -1,6 +1,6 @@
 // compressed_output.h -- compressed output sections for gold  -*- C++ -*-
 
-// Copyright 2007 Free Software Foundation, Inc.
+// Copyright (C) 2007-2020 Free Software Foundation, Inc.
 // Written by Ian Lance Taylor <iant@google.com>.
 
 // This file is part of gold.
 #define GOLD_COMPRESSED_OUTPUT_H
 
 #include <string>
-#include <vector>
 
 #include "output.h"
-#include "merge.h"
 
 namespace gold
 {
 
 class General_options;
 
-// This is used for compressing a section before emitting it in the
-// output file.  This only works for unloaded sections, since it
-// assumes the final section contents are available at
-// set_final_data_size() time.  For loaded sections (those that end up
-// in segments), this is not true; relocations are applied after
-// set_final_data_size() is called.  However, for unloaded sections,
-// we can -- and do -- postpone calling finalize_data_size() until
-// after relocations are applies.
+// Read the compression header of a compressed debug section and return
+// the uncompressed size.
 
-class Output_compressed_section_data : public Output_section_data
-{
- public:
-  Output_compressed_section_data(uint64_t addralign,
-                                 const General_options& options)
-    : Output_section_data(addralign), options_(options), data_(NULL)
-  { }
-
- protected:
-  // Add an input section.
-  bool
-  do_add_input_section(Relobj* object, unsigned int shndx);
-
-  // Set the final data size.
-  void
-  set_final_data_size();
-
-  // Change the name of the output section to reflect it's compressed.
-  const char*
-  do_modified_output_section_name(const char* name);
+extern uint64_t
+get_uncompressed_size(const unsigned char*, section_size_type);
 
-  // Write the data to the file.
-  void
-  do_write(Output_file*);
+// Decompress a compressed debug section directly into the output file.
 
- private:
-  struct Object_entry
-  {
-    Relobj* object;
-    unsigned int shndx;
-    const unsigned char* contents;
-    off_t length;
-
-    Object_entry(Relobj* o, unsigned int s)
-      : object(o), shndx(s), contents(NULL), length(0)
-    { }
-  };
-
-  const General_options& options_;
-  std::vector<Object_entry> objects_;
-  char* data_;
-  std::string new_section_name_;
-};
+extern bool
+decompress_input_section(const unsigned char*, unsigned long, unsigned char*,
+                        unsigned long, int, bool, elfcpp::Elf_Xword);
 
-// This is a special case for when the output section is a string
-// section and does not have any relocations to apply to it.
+// This is used for a section whose data should be compressed.  It is
+// a regular Output_section which computes its contents into a buffer
+// and then postprocesses it.
 
-template<typename Char_type>
-class Output_compressed_string : public Output_merge_string<Char_type>
+class Output_compressed_section : public Output_section
 {
  public:
-  Output_compressed_string(uint64_t addralign,
-                           const General_options& options)
-    : Output_merge_string<Char_type>(addralign),
-      options_(options), compressed_data_(NULL)
-  { }
-
-  ~Output_compressed_string()
-  { delete[] compressed_data_; }
+  Output_compressed_section(const General_options* options,
+                           const char* name, elfcpp::Elf_Word flags,
+                           elfcpp::Elf_Xword type)
+    : Output_section(name, flags, type),
+      options_(options)
+  { this->set_requires_postprocessing(); }
 
  protected:
-  // Add an input section.
-  bool
-  do_add_input_section(Relobj* object, unsigned int shndx);
-
-  // Set the final data size.  Also compresses the buffer.
+  // Set the final data size.
   void
   set_final_data_size();
 
-  // Change the name of the output section to reflect it's compressed.
-  const char*
-  do_modified_output_section_name(const char* name);
-
-  // Write the data to the file.
+  // Write out the compressed contents.
   void
   do_write(Output_file*);
 
  private:
-  const General_options& options_;
-  char* compressed_data_;
-  // This is just a buffer to store the section name in "permanent" storage.
+  // The options--this includes the compression type.
+  const General_options* options_;
+  // The compressed data.
+  unsigned char* data_;
+  // The new section name if we do compress.
   std::string new_section_name_;
 };
 
This page took 0.024321 seconds and 4 git commands to generate.