// compressed_output.h -- compressed output sections for gold -*- C++ -*-
-// Copyright 2007 Free Software Foundation, Inc.
+// Copyright (C) 2007-2014 Free Software Foundation, Inc.
// 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);
-// 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_;
};