From 96803768f1845a2c5af362ea2dc6b39a147d3930 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sat, 1 Dec 2007 06:34:12 +0000 Subject: Compress all debug sections. --- gold/compressed_output.h | 93 ++++++++---------------------------------------- 1 file changed, 15 insertions(+), 78 deletions(-) (limited to 'gold/compressed_output.h') diff --git a/gold/compressed_output.h b/gold/compressed_output.h index 589dacc..d9bb0c4 100644 --- a/gold/compressed_output.h +++ b/gold/compressed_output.h @@ -29,106 +29,43 @@ #define GOLD_COMPRESSED_OUTPUT_H #include -#include #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 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 -class Output_compressed_string : public Output_merge_string -{ - public: - Output_compressed_string(uint64_t addralign, - const General_options& options) - : Output_merge_string(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_; }; -- cgit v1.1