From 0e8799277927082e381d875694ee72030e703d89 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 20 Mar 2009 23:37:51 +0000 Subject: [PATCH] include/elf: * common.h (SHT_GNU_INCREMENTAL_INPUTS): Define. elfcpp: * elfcpp.h (SHT_GNU_INCREMENTAL_INPUTS): Define. gold: * incremental.cc: New file. * Makefile.am (CCFILES): Add incremental.cc. * Makefile.in: Rebuild. --- elfcpp/ChangeLog | 4 ++ elfcpp/elfcpp.h | 6 +- gold/ChangeLog | 6 ++ gold/Makefile.am | 1 + gold/Makefile.in | 17 +++-- gold/incremental.cc | 145 ++++++++++++++++++++++++++++++++++++++++++ include/elf/ChangeLog | 4 ++ include/elf/common.h | 1 + 8 files changed, 175 insertions(+), 9 deletions(-) create mode 100644 gold/incremental.cc diff --git a/elfcpp/ChangeLog b/elfcpp/ChangeLog index 5674d1573b..9f048dda52 100644 --- a/elfcpp/ChangeLog +++ b/elfcpp/ChangeLog @@ -1,3 +1,7 @@ +2009-03-20 Mikolaj Zalewski + + * elfcpp.h (SHT_GNU_INCREMENTAL_INPUTS): Define. + 2009-03-01 Ian Lance Taylor * elfcpp_swap.h: #include "config.h". Only #include diff --git a/elfcpp/elfcpp.h b/elfcpp/elfcpp.h index 46306e7858..a3786de8fe 100644 --- a/elfcpp/elfcpp.h +++ b/elfcpp/elfcpp.h @@ -4,7 +4,7 @@ // Written by Ian Lance Taylor . // This file is part of elfcpp. - + // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public License // as published by the Free Software Foundation; either version 2, or @@ -351,6 +351,8 @@ enum SHT SHT_LOUSER = 0x80000000, SHT_HIUSER = 0xffffffff, // The remaining values are not in the standard. + // Incremental build data. + SHT_GNU_INCREMENTAL_INPUTS = 0x6fff4700, // Object attributes. SHT_GNU_ATTRIBUTES = 0x6ffffff5, // GNU style dynamic hash table. @@ -934,7 +936,7 @@ class Ehdr_write void put_e_type(Elf_Half v) { this->p_->e_type = Convert<16, big_endian>::convert_host(v); } - + void put_e_machine(Elf_Half v) { this->p_->e_machine = Convert<16, big_endian>::convert_host(v); } diff --git a/gold/ChangeLog b/gold/ChangeLog index a736dcbb68..1297e19e02 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,9 @@ +2009-03-20 Mikolaj Zalewski + + * incremental.cc: New file. + * Makefile.am (CCFILES): Add incremental.cc. + * Makefile.in: Rebuild. + 2009-03-19 Paul Pluzhnikov * layout.cc (Layout::output_section_name): Preserve names diff --git a/gold/Makefile.am b/gold/Makefile.am index aab1528807..36c88e79f4 100644 --- a/gold/Makefile.am +++ b/gold/Makefile.am @@ -51,6 +51,7 @@ CCFILES = \ gc.cc \ gold.cc \ gold-threads.cc \ + incremental.cc \ layout.cc \ mapfile.cc \ merge.cc \ diff --git a/gold/Makefile.in b/gold/Makefile.in index cb49fef2a7..76632dafe1 100644 --- a/gold/Makefile.in +++ b/gold/Makefile.in @@ -80,13 +80,14 @@ am__objects_1 = archive.$(OBJEXT) binary.$(OBJEXT) common.$(OBJEXT) \ dirsearch.$(OBJEXT) dynobj.$(OBJEXT) dwarf_reader.$(OBJEXT) \ ehframe.$(OBJEXT) errors.$(OBJEXT) expression.$(OBJEXT) \ fileread.$(OBJEXT) gc.$(OBJEXT) gold.$(OBJEXT) \ - gold-threads.$(OBJEXT) layout.$(OBJEXT) mapfile.$(OBJEXT) \ - merge.$(OBJEXT) object.$(OBJEXT) options.$(OBJEXT) \ - output.$(OBJEXT) parameters.$(OBJEXT) plugin.$(OBJEXT) \ - readsyms.$(OBJEXT) reduced_debug_output.$(OBJEXT) \ - reloc.$(OBJEXT) resolve.$(OBJEXT) script-sections.$(OBJEXT) \ - script.$(OBJEXT) stringpool.$(OBJEXT) symtab.$(OBJEXT) \ - target-select.$(OBJEXT) version.$(OBJEXT) workqueue.$(OBJEXT) \ + gold-threads.$(OBJEXT) incremental.$(OBJEXT) layout.$(OBJEXT) \ + mapfile.$(OBJEXT) merge.$(OBJEXT) object.$(OBJEXT) \ + options.$(OBJEXT) output.$(OBJEXT) parameters.$(OBJEXT) \ + plugin.$(OBJEXT) readsyms.$(OBJEXT) \ + reduced_debug_output.$(OBJEXT) reloc.$(OBJEXT) \ + resolve.$(OBJEXT) script-sections.$(OBJEXT) script.$(OBJEXT) \ + stringpool.$(OBJEXT) symtab.$(OBJEXT) target-select.$(OBJEXT) \ + version.$(OBJEXT) workqueue.$(OBJEXT) \ workqueue-threads.$(OBJEXT) am__objects_2 = am__objects_3 = yyscript.$(OBJEXT) @@ -333,6 +334,7 @@ CCFILES = \ gc.cc \ gold.cc \ gold-threads.cc \ + incremental.cc \ layout.cc \ mapfile.cc \ merge.cc \ @@ -553,6 +555,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gold-threads.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gold.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/i386.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/incremental.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/layout.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mapfile.Po@am__quote@ diff --git a/gold/incremental.cc b/gold/incremental.cc new file mode 100644 index 0000000000..665822df5e --- /dev/null +++ b/gold/incremental.cc @@ -0,0 +1,145 @@ +// inremental.cc -- incremental linking support for gold + +// Copyright 2009 Free Software Foundation, Inc. +// Written by Mikolaj Zalewski . + +// This file is part of gold. + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +// MA 02110-1301, USA. + +#include "gold.h" +#include "elfcpp.h" + +using elfcpp::Convert; + +namespace gold { + +// Version information. Will change frequently during the development, later +// we could think about backward (and forward?) compatibility. +const int INCREMENTAL_LINK_VERSION = 1; + +namespace internal { + +// Header of the .gnu_incremental_input section. +struct Incremental_input_header_data +{ + // Incremental linker version. + elfcpp::Elf_Word version; + + // Numer of input files in the link. + elfcpp::Elf_Word input_file_count; + + // Offset of command line options in .gnu_incremental_strtab. + elfcpp::Elf_Word command_line_offset; + + // Padding. + elfcpp::Elf_Word reserved; +}; + +// Data stored in .gnu_incremental_input after the header for each of the +// Incremental_input_header_data::input_file_count input entries. +struct Incremental_input_entry_data +{ + // Offset of file name in .gnu_incremental_strtab section. + elfcpp::Elf_Word filename_offset; + + // Offset of data in .gnu_incremental_input. + elfcpp::Elf_Word data_offset; + + // Timestamp (in seconds). + elfcpp::Elf_Xword timestamp_sec; + + // Nano-second part of timestamp (if supported). + elfcpp::Elf_Word timestamp_usec; + + // Type of the input entry. + elfcpp::Elf_Half input_type; + + // Padding. + elfcpp::Elf_Half reserved; +}; + +} + +// Accessors. + +// See internal::Incremental_input_header for fields descriptions. +template +class Incremental_input_header_write +{ + public: + Incremental_input_header_write(unsigned char *p) + : p_(reinterpret_cast(p)) + { } + + void + put_version(elfcpp::Elf_Word v) + { this->p_->version = Convert<32, big_endian>::convert_host(v); } + + void + input_file_count(elfcpp::Elf_Word v) + { this->p_->input_file_count = Convert<32, big_endian>::convert_host(v); } + + void + command_line_offset(elfcpp::Elf_Word v) + { this->p_->command_line_offset = Convert<32, big_endian>::convert_host(v); } + + void + reserved(elfcpp::Elf_Word v) + { this->p_->reserved = Convert<32, big_endian>::convert_host(v); } + + private: + internal::Incremental_input_header_data* p_; +}; + +// See internal::Incremental_input_entry for fields descriptions. +template +class Incremental_input_entry_write +{ + public: + Incremental_input_entry_write(unsigned char *p) + : p_(reinterpret_cast(p)) + { } + + void + put_filename_offset(elfcpp::Elf_Word v) + { this->p_->filename_offset = Convert<32, big_endian>::convert_host(v); } + + void + put_data_offset(elfcpp::Elf_Word v) + { this->p_->data_offset = Convert<32, big_endian>::convert_host(v); } + + void + put_timestamp_sec(elfcpp::Elf_Word v) + { this->p_->timestamp_sec = Convert<32, big_endian>::convert_host(v); } + + void + put_timestamp_usec(elfcpp::Elf_Word v) + { this->p_->timestamp_usec = Convert<32, big_endian>::convert_host(v); } + + void + put_input_type(elfcpp::Elf_Word v) + { this->p_->input_type = Convert<32, big_endian>::convert_host(v); } + + void + put_reserved(elfcpp::Elf_Word v) + { this->p_->reserved = Convert<32, big_endian>::convert_host(v); } + + private: + internal::Incremental_input_entry_data* p_; +}; + +} // End namespace gold. diff --git a/include/elf/ChangeLog b/include/elf/ChangeLog index 2fb5c5ef85..e69d325176 100644 --- a/include/elf/ChangeLog +++ b/include/elf/ChangeLog @@ -1,3 +1,7 @@ +2009-03-20 Mikolaj Zalewski + + * common.h (SHT_GNU_INCREMENTAL_INPUTS): Define. + 2009-03-14 Mark Kettenis * common.h (NT_OPENBSD_PROCINFO, NT_OPENBSD_AUXV) diff --git a/include/elf/common.h b/include/elf/common.h index 57c055b856..75a6232919 100644 --- a/include/elf/common.h +++ b/include/elf/common.h @@ -397,6 +397,7 @@ #define SHT_LOOS 0x60000000 /* First of OS specific semantics */ #define SHT_HIOS 0x6fffffff /* Last of OS specific semantics */ +#define SHT_GNU_INCREMENTAL_INPUTS 0x6fff4700 /* incremental build data */ #define SHT_GNU_ATTRIBUTES 0x6ffffff5 /* Object attributes */ #define SHT_GNU_HASH 0x6ffffff6 /* GNU style symbol hash table */ #define SHT_GNU_LIBLIST 0x6ffffff7 /* List of prelink dependencies */