summaryrefslogtreecommitdiff
path: root/gold/compressed_output.h
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@google.com>2007-12-01 06:34:12 +0000
committerIan Lance Taylor <iant@google.com>2007-12-01 06:34:12 +0000
commit96803768f1845a2c5af362ea2dc6b39a147d3930 (patch)
tree1ff1ce0a11218dd449f822cfc42c17626627491b /gold/compressed_output.h
parentf80c84b330870d86697702c95506f127264fac3a (diff)
downloadbinutils-gdb-96803768f1845a2c5af362ea2dc6b39a147d3930.tar.gz
Compress all debug sections.
Diffstat (limited to 'gold/compressed_output.h')
-rw-r--r--gold/compressed_output.h93
1 files changed, 15 insertions, 78 deletions
diff --git a/gold/compressed_output.h b/gold/compressed_output.h
index 589dacc372d..d9bb0c4c460 100644
--- a/gold/compressed_output.h
+++ b/gold/compressed_output.h
@@ -29,106 +29,43 @@
#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.
+// 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.
-class Output_compressed_section_data : public Output_section_data
+class Output_compressed_section : public Output_section
{
public:
- Output_compressed_section_data(uint64_t addralign,
- const General_options& options)
- : Output_section_data(addralign), options_(options), data_(NULL)
- { }
+ 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.
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:
- 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_;
+ // The options--this includes the compression type.
+ const General_options* options_;
+ // The compressed data.
char* data_;
- std::string new_section_name_;
-};
-
-// This is a special case for when the output section is a string
-// section and does not have any relocations to apply to it.
-
-template<typename Char_type>
-class Output_compressed_string : public Output_merge_string<Char_type>
-{
- 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_; }
-
- protected:
- // Add an input section.
- bool
- do_add_input_section(Relobj* object, unsigned int shndx);
-
- // Set the final data size. Also compresses the buffer.
- 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.
- 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 new section name if we do compress.
std::string new_section_name_;
};