X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gold%2Fcompressed_output.h;h=b5fdbeb7f6f986c34346159323a80592a5842106;hb=6f9b84910f8cabf565598f499258bbea51cc06d4;hp=589dacc372dcb94e49520bda358ed7db79895ff8;hpb=9a0910c33e1a6962d475ee0a994fd1f5e446a888;p=deliverable%2Fbinutils-gdb.git diff --git a/gold/compressed_output.h b/gold/compressed_output.h index 589dacc372..b5fdbeb7f6 100644 --- a/gold/compressed_output.h +++ b/gold/compressed_output.h @@ -1,6 +1,6 @@ // compressed_output.h -- compressed output sections for gold -*- C++ -*- -// Copyright 2007 Free Software Foundation, Inc. +// Copyright (C) 2007-2015 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -29,106 +29,55 @@ #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. +// 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 objects_; - char* data_; - std::string new_section_name_; -}; +extern bool +decompress_input_section(const unsigned char*, unsigned long, unsigned char*, + unsigned long); -// 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 -class Output_compressed_string : public Output_merge_string +class Output_compressed_section : public Output_section { 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_; } + 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_; };