* layout.cc (Free_list::allocate): Provide guarantee of minimum

remaining hole size when allocating.
	(Layout::make_output_section): Set fill methods for debug sections.
	* layout.h (Free_list::Free_list_node): Move from private to
	public.
	(Free_list::set_min_hole_size): New function.
	(Free_list::begin, Free_list::end): New functions.
	(Free_list::min_hole_): New data member.
	* output.cc: Include dwarf.h.
	(Output_fill_debug_info::do_minimum_hole_size): New function.
	(Output_fill_debug_info::do_write): New function.
	(Output_fill_debug_line::do_minimum_hole_size): New function.
	(Output_fill_debug_line::do_write): New function.
	(Output_section::Output_section): Initialize new data member.
	(Output_section::set_final_data_size): Ensure patch space is larger
	than minimum hole size.
	(Output_section::do_write): Fill holes in debug sections.
	* output.h (Output_fill): New class.
	(Output_fill_debug_info): New class.
	(Output_fill_debug_line): New class.
	(Output_section::set_free_space_fill): New function.
	(Output_section::free_space_fill_): New data member.
	* testsuite/Makefile.am (incremental_test_3): Add
	--incremental-patch option.
	(incremental_test_4): Likewise.
	(incremental_test_5): Likewise.
	(incremental_test_6): Likewise.
	(incremental_copy_test): Likewise.
	(incremental_common_test_1): Likewise.
	* testsuite/Makefile.in: Regenerate.
This commit is contained in:
Cary Coutant 2011-08-27 01:28:18 +00:00
parent 53c8030fec
commit 8ea8cd50dd
7 changed files with 382 additions and 38 deletions

View File

@ -1,3 +1,36 @@
2011-08-26 Cary Coutant <ccoutant@google.com>
* layout.cc (Free_list::allocate): Provide guarantee of minimum
remaining hole size when allocating.
(Layout::make_output_section): Set fill methods for debug sections.
* layout.h (Free_list::Free_list_node): Move from private to
public.
(Free_list::set_min_hole_size): New function.
(Free_list::begin, Free_list::end): New functions.
(Free_list::min_hole_): New data member.
* output.cc: Include dwarf.h.
(Output_fill_debug_info::do_minimum_hole_size): New function.
(Output_fill_debug_info::do_write): New function.
(Output_fill_debug_line::do_minimum_hole_size): New function.
(Output_fill_debug_line::do_write): New function.
(Output_section::Output_section): Initialize new data member.
(Output_section::set_final_data_size): Ensure patch space is larger
than minimum hole size.
(Output_section::do_write): Fill holes in debug sections.
* output.h (Output_fill): New class.
(Output_fill_debug_info): New class.
(Output_fill_debug_line): New class.
(Output_section::set_free_space_fill): New function.
(Output_section::free_space_fill_): New data member.
* testsuite/Makefile.am (incremental_test_3): Add
--incremental-patch option.
(incremental_test_4): Likewise.
(incremental_test_5): Likewise.
(incremental_test_6): Likewise.
(incremental_copy_test): Likewise.
(incremental_common_test_1): Likewise.
* testsuite/Makefile.in: Regenerate.
2011-08-26 Nick Clifton <nickc@redhat.com>
* po/es.po: Updated Spanish translation.

View File

@ -162,6 +162,11 @@ Free_list::allocate(off_t len, uint64_t align, off_t minoff)
++Free_list::num_allocates;
// We usually want to drop free chunks smaller than 4 bytes.
// If we need to guarantee a minimum hole size, though, we need
// to keep track of all free chunks.
const int fuzz = this->min_hole_ > 0 ? 0 : 3;
for (Iterator p = this->list_.begin(); p != this->list_.end(); ++p)
{
++Free_list::num_allocate_visits;
@ -173,13 +178,13 @@ Free_list::allocate(off_t len, uint64_t align, off_t minoff)
this->length_ = end;
p->end_ = end;
}
if (end <= p->end_)
if (end == p->end_ || (end <= p->end_ - this->min_hole_))
{
if (p->start_ + 3 >= start && p->end_ <= end + 3)
if (p->start_ + fuzz >= start && p->end_ <= end + fuzz)
this->list_.erase(p);
else if (p->start_ + 3 >= start)
else if (p->start_ + fuzz >= start)
p->start_ = end;
else if (p->end_ <= end + 3)
else if (p->end_ <= end + fuzz)
p->end_ = start;
else
{
@ -1440,7 +1445,20 @@ Layout::make_output_section(const char* name, elfcpp::Elf_Word type,
&& strcmp(name, ".ctors") != 0
&& strcmp(name, ".dtors") != 0
&& strcmp(name, ".jcr") != 0)
os->set_is_patch_space_allowed();
{
os->set_is_patch_space_allowed();
// Certain sections require "holes" to be filled with
// specific fill patterns. These fill patterns may have
// a minimum size, so we must prevent allocations from the
// free list that leave a hole smaller than the minimum.
if (strcmp(name, ".debug_info") == 0)
os->set_free_space_fill(new Output_fill_debug_info(false));
else if (strcmp(name, ".debug_types") == 0)
os->set_free_space_fill(new Output_fill_debug_info(true));
else if (strcmp(name, ".debug_line") == 0)
os->set_free_space_fill(new Output_fill_debug_line());
}
// If we have already attached the sections to segments, then we
// need to attach this one now. This happens for sections created

View File

@ -71,26 +71,6 @@ is_compressed_debug_section(const char* secname);
class Free_list
{
public:
Free_list()
: list_(), last_remove_(list_.begin()), extend_(false), length_(0)
{ }
void
init(off_t len, bool extend);
void
remove(off_t start, off_t end);
off_t
allocate(off_t len, uint64_t align, off_t minoff);
void
dump();
static void
print_stats();
private:
struct Free_list_node
{
Free_list_node(off_t start, off_t end)
@ -99,6 +79,52 @@ class Free_list
off_t start_;
off_t end_;
};
typedef std::list<Free_list_node>::const_iterator Const_iterator;
Free_list()
: list_(), last_remove_(list_.begin()), extend_(false), length_(0),
min_hole_(0)
{ }
// Initialize the free list for a section of length LEN.
// If EXTEND is true, free space may be allocated past the end.
void
init(off_t len, bool extend);
// Set the minimum hole size that is allowed when allocating
// from the free list.
void
set_min_hole_size(off_t min_hole)
{ this->min_hole_ = min_hole; }
// Remove a chunk from the free list.
void
remove(off_t start, off_t end);
// Allocate a chunk of space from the free list of length LEN,
// with alignment ALIGN, and minimum offset MINOFF.
off_t
allocate(off_t len, uint64_t align, off_t minoff);
// Return an iterator for the beginning of the free list.
Const_iterator
begin() const
{ return this->list_.begin(); }
// Return an iterator for the end of the free list.
Const_iterator
end() const
{ return this->list_.end(); }
// Dump the free list (for debugging).
void
dump();
// Print usage statistics.
static void
print_stats();
private:
typedef std::list<Free_list_node>::iterator Iterator;
// The free list.
@ -113,6 +139,10 @@ class Free_list
// The total length of the section, segment, or file.
off_t length_;
// The minimum hole size allowed. When allocating from the free list,
// we must not leave a hole smaller than this.
off_t min_hole_;
// Statistics:
// The total number of free lists used.
static unsigned int num_lists;

View File

@ -36,6 +36,7 @@
#include "libiberty.h"
#include "dwarf.h"
#include "parameters.h"
#include "object.h"
#include "symtab.h"
@ -1926,6 +1927,140 @@ Output_symtab_xindex::endian_do_write(unsigned char* const oview)
}
}
// Output_fill_debug_info methods.
// Return the minimum size needed for a dummy compilation unit header.
size_t
Output_fill_debug_info::do_minimum_hole_size() const
{
// Compile unit header fields: unit_length, version, debug_abbrev_offset,
// address_size.
const size_t len = 4 + 2 + 4 + 1;
// For type units, add type_signature, type_offset.
if (this->is_debug_types_)
return len + 8 + 4;
return len;
}
// Write a dummy compilation unit header to fill a hole in the
// .debug_info or .debug_types section.
void
Output_fill_debug_info::do_write(Output_file* of, off_t off, size_t len) const
{
gold_debug(DEBUG_INCREMENTAL, "fill_debug_info(%08lx, %08lx)", off, len);
gold_assert(len >= this->do_minimum_hole_size());
unsigned char* const oview = of->get_output_view(off, len);
unsigned char* pov = oview;
// Write header fields: unit_length, version, debug_abbrev_offset,
// address_size.
if (this->is_big_endian())
{
elfcpp::Swap<32, true>::writeval(pov, len - 4);
elfcpp::Swap<16, true>::writeval(pov + 4, this->version);
elfcpp::Swap<32, true>::writeval(pov + 6, 0);
}
else
{
elfcpp::Swap<32, false>::writeval(pov, len - 4);
elfcpp::Swap<16, false>::writeval(pov + 4, this->version);
elfcpp::Swap<32, false>::writeval(pov + 6, 0);
}
pov += 4 + 2 + 4;
*pov++ = 4;
// For type units, the additional header fields -- type_signature,
// type_offset -- can be filled with zeroes.
// Fill the remainder of the free space with zeroes. The first
// zero should tell the consumer there are no DIEs to read in this
// compilation unit.
if (pov < oview + len)
memset(pov, 0, oview + len - pov);
of->write_output_view(off, len, oview);
}
// Output_fill_debug_line methods.
// Return the minimum size needed for a dummy line number program header.
size_t
Output_fill_debug_line::do_minimum_hole_size() const
{
// Line number program header fields: unit_length, version, header_length,
// minimum_instruction_length, default_is_stmt, line_base, line_range,
// opcode_base, standard_opcode_lengths[], include_directories, filenames.
const size_t len = 4 + 2 + 4 + this->header_length;
return len;
}
// Write a dummy line number program header to fill a hole in the
// .debug_line section.
void
Output_fill_debug_line::do_write(Output_file* of, off_t off, size_t len) const
{
gold_debug(DEBUG_INCREMENTAL, "fill_debug_line(%08lx, %08lx)", off, len);
gold_assert(len >= this->do_minimum_hole_size());
unsigned char* const oview = of->get_output_view(off, len);
unsigned char* pov = oview;
// Write header fields: unit_length, version, header_length,
// minimum_instruction_length, default_is_stmt, line_base, line_range,
// opcode_base, standard_opcode_lengths[], include_directories, filenames.
// We set the header_length field to cover the entire hole, so the
// line number program is empty.
if (this->is_big_endian())
{
elfcpp::Swap<32, true>::writeval(pov, len - 4);
elfcpp::Swap<16, true>::writeval(pov + 4, this->version);
elfcpp::Swap<32, true>::writeval(pov + 6, len - (4 + 2 + 4));
}
else
{
elfcpp::Swap<32, false>::writeval(pov, len - 4);
elfcpp::Swap<16, false>::writeval(pov + 4, this->version);
elfcpp::Swap<32, false>::writeval(pov + 6, len - (4 + 2 + 4));
}
pov += 4 + 2 + 4;
*pov++ = 1; // minimum_instruction_length
*pov++ = 0; // default_is_stmt
*pov++ = 0; // line_base
*pov++ = 5; // line_range
*pov++ = 13; // opcode_base
*pov++ = 0; // standard_opcode_lengths[1]
*pov++ = 1; // standard_opcode_lengths[2]
*pov++ = 1; // standard_opcode_lengths[3]
*pov++ = 1; // standard_opcode_lengths[4]
*pov++ = 1; // standard_opcode_lengths[5]
*pov++ = 0; // standard_opcode_lengths[6]
*pov++ = 0; // standard_opcode_lengths[7]
*pov++ = 0; // standard_opcode_lengths[8]
*pov++ = 1; // standard_opcode_lengths[9]
*pov++ = 0; // standard_opcode_lengths[10]
*pov++ = 0; // standard_opcode_lengths[11]
*pov++ = 1; // standard_opcode_lengths[12]
*pov++ = 0; // include_directories (empty)
*pov++ = 0; // filenames (empty)
// Some consumers don't check the header_length field, and simply
// start reading the line number program immediately following the
// header. For those consumers, we fill the remainder of the free
// space with DW_LNS_set_basic_block opcodes. These are effectively
// no-ops: the resulting line table program will not create any rows.
if (pov < oview + len)
memset(pov, elfcpp::DW_LNS_set_basic_block, oview + len - pov);
of->write_output_view(off, len, oview);
}
// Output_section::Input_section methods.
// Return the current data size. For an input section we store the size here.
@ -2158,6 +2293,7 @@ Output_section::Output_section(const char* name, elfcpp::Elf_Word type,
checkpoint_(NULL),
lookup_maps_(new Output_section_lookup_maps),
free_list_(),
free_space_fill_(NULL),
patch_space_(0)
{
// An unallocated section has no address. Forcing this means that
@ -2981,7 +3117,10 @@ Output_section::set_final_data_size()
if (this->is_patch_space_allowed_ && parameters->incremental_full())
{
double pct = parameters->options().incremental_patch();
off_t extra = static_cast<off_t>(data_size * pct);
size_t extra = static_cast<size_t>(data_size * pct);
if (this->free_space_fill_ != NULL
&& this->free_space_fill_->minimum_hole_size() > extra)
extra = this->free_space_fill_->minimum_hole_size();
off_t new_size = align_address(data_size + extra, this->addralign());
this->patch_space_ = new_size - data_size;
gold_debug(DEBUG_INCREMENTAL,
@ -3515,6 +3654,26 @@ Output_section::do_write(Output_file* of)
p->write(of);
off = aligned_off + p->data_size();
}
// For incremental links, fill in unused chunks in debug sections
// with dummy compilation unit headers.
if (this->free_space_fill_ != NULL)
{
for (Free_list::Const_iterator p = this->free_list_.begin();
p != this->free_list_.end();
++p)
{
off_t off = p->start_;
size_t len = p->end_ - off;
this->free_space_fill_->write(of, this->offset() + off, len);
}
if (this->patch_space_ > 0)
{
off_t off = this->current_data_size_for_child() - this->patch_space_;
this->free_space_fill_->write(of, this->offset() + off,
this->patch_space_);
}
}
}
// If a section requires postprocessing, create the buffer to use.

View File

@ -2615,6 +2615,99 @@ class Output_section_lookup_maps
Relaxed_input_sections_by_id relaxed_input_sections_by_id_;
};
// This abstract base class defines the interface for the
// types of methods used to fill free space left in an output
// section during an incremental link. These methods are used
// to insert dummy compilation units into debug info so that
// debug info consumers can scan the debug info serially.
class Output_fill
{
public:
Output_fill()
: is_big_endian_(parameters->target().is_big_endian())
{ }
// Return the smallest size chunk of free space that can be
// filled with a dummy compilation unit.
size_t
minimum_hole_size() const
{ return this->do_minimum_hole_size(); }
// Write a fill pattern of length LEN at offset OFF in the file.
void
write(Output_file* of, off_t off, size_t len) const
{ this->do_write(of, off, len); }
protected:
virtual size_t
do_minimum_hole_size() const = 0;
virtual void
do_write(Output_file* of, off_t off, size_t len) const = 0;
bool
is_big_endian() const
{ return this->is_big_endian_; }
private:
bool is_big_endian_;
};
// Fill method that introduces a dummy compilation unit in
// a .debug_info or .debug_types section.
class Output_fill_debug_info : public Output_fill
{
public:
Output_fill_debug_info(bool is_debug_types)
: is_debug_types_(is_debug_types)
{ }
protected:
virtual size_t
do_minimum_hole_size() const;
virtual void
do_write(Output_file* of, off_t off, size_t len) const;
private:
// Version of the header.
static const int version = 4;
// True if this is a .debug_types section.
bool is_debug_types_;
};
// Fill method that introduces a dummy compilation unit in
// a .debug_line section.
class Output_fill_debug_line : public Output_fill
{
public:
Output_fill_debug_line()
{ }
protected:
virtual size_t
do_minimum_hole_size() const;
virtual void
do_write(Output_file* of, off_t off, size_t len) const;
private:
// Version of the header. We write a DWARF-3 header because it's smaller
// and many tools have not yet been updated to understand the DWARF-4 header.
static const int version = 3;
// Length of the portion of the header that follows the header_length
// field. This includes the following fields:
// minimum_instruction_length, default_is_stmt, line_base, line_range,
// opcode_base, standard_opcode_lengths[], include_directories, filenames.
// The standard_opcode_lengths array is 12 bytes long, and the
// include_directories and filenames fields each contain only a single
// null byte.
static const size_t header_length = 19;
};
// An output section. We don't expect to have too many output
// sections, so we don't bother to do a template on the size.
@ -3438,6 +3531,15 @@ class Output_section : public Output_data
set_is_patch_space_allowed()
{ this->is_patch_space_allowed_ = true; }
// Set a fill method to use for free space left in the output section
// during incremental links.
void
set_free_space_fill(Output_fill* free_space_fill)
{
this->free_space_fill_ = free_space_fill;
this->free_list_.set_min_hole_size(free_space_fill->minimum_hole_size());
}
// Reserve space within the fixed layout for the section. Used for
// incremental update links.
void
@ -3913,6 +4015,8 @@ class Output_section : public Output_data
// List of available regions within the section, for incremental
// update links.
Free_list free_list_;
// Method for filling chunks of free space.
Output_fill* free_space_fill_;
// Amount added as patch space for incremental linking.
off_t patch_space_;
};

View File

@ -1966,7 +1966,7 @@ MOSTLYCLEANFILES += two_file_test_tmp_3.o
incremental_test_3: two_file_test_1.o two_file_test_1b_v1.o two_file_test_1b.o \
two_file_test_2.o two_file_test_main.o gcctestdir/ld
cp -f two_file_test_1b_v1.o two_file_test_tmp_3.o
$(CXXLINK) -Wl,--incremental-full -Bgcctestdir/ two_file_test_1.o two_file_test_tmp_3.o two_file_test_2.o two_file_test_main.o
$(CXXLINK) -Wl,--incremental-full,--incremental-patch=100 -Bgcctestdir/ two_file_test_1.o two_file_test_tmp_3.o two_file_test_2.o two_file_test_main.o
@sleep 1
cp -f two_file_test_1b.o two_file_test_tmp_3.o
$(CXXLINK) -Wl,--incremental-update -Bgcctestdir/ two_file_test_1.o two_file_test_tmp_3.o two_file_test_2.o two_file_test_main.o
@ -1976,7 +1976,7 @@ MOSTLYCLEANFILES += incremental_test_4.base two_file_test_tmp_4.o
incremental_test_4: two_file_test_1.o two_file_test_1b.o two_file_test_2_v1.o \
two_file_test_2.o two_file_test_main.o gcctestdir/ld
cp -f two_file_test_2_v1.o two_file_test_tmp_4.o
$(CXXLINK) -Wl,--incremental-full -Bgcctestdir/ two_file_test_1.o two_file_test_1b.o two_file_test_tmp_4.o two_file_test_main.o
$(CXXLINK) -Wl,--incremental-full,--incremental-patch=100 -Bgcctestdir/ two_file_test_1.o two_file_test_1b.o two_file_test_tmp_4.o two_file_test_main.o
mv -f incremental_test_4 incremental_test_4.base
@sleep 1
cp -f two_file_test_2.o two_file_test_tmp_4.o
@ -1988,7 +1988,7 @@ incremental_test_5: two_file_test_1.o two_file_test_1b_v1.o two_file_test_1b.o \
two_file_test_2.o two_file_test_main.o gcctestdir/ld
cp -f two_file_test_1b_v1.o two_file_test_tmp_5.o
$(TEST_AR) rc two_file_test_5.a two_file_test_1.o two_file_test_tmp_5.o two_file_test_2.o
$(CXXLINK) -Wl,--incremental-full -Bgcctestdir/ two_file_test_main.o two_file_test_5.a
$(CXXLINK) -Wl,--incremental-full,--incremental-patch=100 -Bgcctestdir/ two_file_test_main.o two_file_test_5.a
@sleep 1
cp -f two_file_test_1b.o two_file_test_tmp_5.o
$(TEST_AR) rc two_file_test_5.a two_file_test_1.o two_file_test_tmp_5.o two_file_test_2.o
@ -2002,7 +2002,7 @@ incremental_test_6: two_file_test_1.o two_file_test_1b_v1.o two_file_test_1b.o \
two_file_test_2.o two_file_test_main.o gcctestdir/ld
cp -f two_file_test_1b.o two_file_test_tmp_6.o
$(TEST_AR) rc two_file_test_6.a two_file_test_1.o two_file_test_tmp_6.o two_file_test_2.o
$(CXXLINK) -Wl,--incremental-full -Bgcctestdir/ two_file_test_main.o two_file_test_6.a
$(CXXLINK) -Wl,--incremental-full,--incremental-patch=100 -Bgcctestdir/ two_file_test_main.o two_file_test_6.a
@sleep 1
cp -f two_file_test_1b_v1.o two_file_test_tmp_6.o
$(TEST_AR) rc two_file_test_6.a two_file_test_1.o two_file_test_tmp_6.o two_file_test_2.o
@ -2011,7 +2011,7 @@ incremental_test_6: two_file_test_1.o two_file_test_1b_v1.o two_file_test_1b.o \
check_PROGRAMS += incremental_copy_test
incremental_copy_test: copy_test_v1.o copy_test.o copy_test_1.so copy_test_2.so
cp -f copy_test_v1.o copy_test_tmp.o
$(CXXLINK) -Wl,--incremental-full -Bgcctestdir/ -Wl,-R,. copy_test_tmp.o copy_test_1.so copy_test_2.so
$(CXXLINK) -Wl,--incremental-full,--incremental-patch=100 -Bgcctestdir/ -Wl,-R,. copy_test_tmp.o copy_test_1.so copy_test_2.so
@sleep 1
cp -f copy_test.o copy_test_tmp.o
$(CXXLINK) -Wl,--incremental-update -Bgcctestdir/ -Wl,-R,. copy_test_tmp.o copy_test_1.so copy_test_2.so
@ -2019,7 +2019,7 @@ incremental_copy_test: copy_test_v1.o copy_test.o copy_test_1.so copy_test_2.so
check_PROGRAMS += incremental_common_test_1
incremental_common_test_1: common_test_1_v1.o common_test_1_v2.o gcctestdir/ld
cp -f common_test_1_v1.o common_test_1_tmp.o
$(CXXLINK) -Wl,--incremental-full -Bgcctestdir/ common_test_1_tmp.o
$(CXXLINK) -Wl,--incremental-full,--incremental-patch=100 -Bgcctestdir/ common_test_1_tmp.o
@sleep 1
cp -f common_test_1_v2.o common_test_1_tmp.o
$(CXXLINK) -Wl,--incremental-update -Bgcctestdir/ common_test_1_tmp.o

View File

@ -4942,14 +4942,14 @@ uninstall-am:
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@incremental_test_3: two_file_test_1.o two_file_test_1b_v1.o two_file_test_1b.o \
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ two_file_test_2.o two_file_test_main.o gcctestdir/ld
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ cp -f two_file_test_1b_v1.o two_file_test_tmp_3.o
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Wl,--incremental-full -Bgcctestdir/ two_file_test_1.o two_file_test_tmp_3.o two_file_test_2.o two_file_test_main.o
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Wl,--incremental-full,--incremental-patch=100 -Bgcctestdir/ two_file_test_1.o two_file_test_tmp_3.o two_file_test_2.o two_file_test_main.o
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ @sleep 1
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ cp -f two_file_test_1b.o two_file_test_tmp_3.o
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Wl,--incremental-update -Bgcctestdir/ two_file_test_1.o two_file_test_tmp_3.o two_file_test_2.o two_file_test_main.o
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@incremental_test_4: two_file_test_1.o two_file_test_1b.o two_file_test_2_v1.o \
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ two_file_test_2.o two_file_test_main.o gcctestdir/ld
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ cp -f two_file_test_2_v1.o two_file_test_tmp_4.o
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Wl,--incremental-full -Bgcctestdir/ two_file_test_1.o two_file_test_1b.o two_file_test_tmp_4.o two_file_test_main.o
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Wl,--incremental-full,--incremental-patch=100 -Bgcctestdir/ two_file_test_1.o two_file_test_1b.o two_file_test_tmp_4.o two_file_test_main.o
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ mv -f incremental_test_4 incremental_test_4.base
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ @sleep 1
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ cp -f two_file_test_2.o two_file_test_tmp_4.o
@ -4958,7 +4958,7 @@ uninstall-am:
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ two_file_test_2.o two_file_test_main.o gcctestdir/ld
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ cp -f two_file_test_1b_v1.o two_file_test_tmp_5.o
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_AR) rc two_file_test_5.a two_file_test_1.o two_file_test_tmp_5.o two_file_test_2.o
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Wl,--incremental-full -Bgcctestdir/ two_file_test_main.o two_file_test_5.a
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Wl,--incremental-full,--incremental-patch=100 -Bgcctestdir/ two_file_test_main.o two_file_test_5.a
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ @sleep 1
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ cp -f two_file_test_1b.o two_file_test_tmp_5.o
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_AR) rc two_file_test_5.a two_file_test_1.o two_file_test_tmp_5.o two_file_test_2.o
@ -4967,20 +4967,20 @@ uninstall-am:
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ two_file_test_2.o two_file_test_main.o gcctestdir/ld
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ cp -f two_file_test_1b.o two_file_test_tmp_6.o
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_AR) rc two_file_test_6.a two_file_test_1.o two_file_test_tmp_6.o two_file_test_2.o
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Wl,--incremental-full -Bgcctestdir/ two_file_test_main.o two_file_test_6.a
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Wl,--incremental-full,--incremental-patch=100 -Bgcctestdir/ two_file_test_main.o two_file_test_6.a
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ @sleep 1
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ cp -f two_file_test_1b_v1.o two_file_test_tmp_6.o
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_AR) rc two_file_test_6.a two_file_test_1.o two_file_test_tmp_6.o two_file_test_2.o
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Wl,--incremental-update -Bgcctestdir/ two_file_test_main.o -Wl,--incremental-unchanged two_file_test_6.a -Wl,--incremental-unknown
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@incremental_copy_test: copy_test_v1.o copy_test.o copy_test_1.so copy_test_2.so
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ cp -f copy_test_v1.o copy_test_tmp.o
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Wl,--incremental-full -Bgcctestdir/ -Wl,-R,. copy_test_tmp.o copy_test_1.so copy_test_2.so
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Wl,--incremental-full,--incremental-patch=100 -Bgcctestdir/ -Wl,-R,. copy_test_tmp.o copy_test_1.so copy_test_2.so
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ @sleep 1
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ cp -f copy_test.o copy_test_tmp.o
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Wl,--incremental-update -Bgcctestdir/ -Wl,-R,. copy_test_tmp.o copy_test_1.so copy_test_2.so
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@incremental_common_test_1: common_test_1_v1.o common_test_1_v2.o gcctestdir/ld
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ cp -f common_test_1_v1.o common_test_1_tmp.o
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Wl,--incremental-full -Bgcctestdir/ common_test_1_tmp.o
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Wl,--incremental-full,--incremental-patch=100 -Bgcctestdir/ common_test_1_tmp.o
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ @sleep 1
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ cp -f common_test_1_v2.o common_test_1_tmp.o
@DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Wl,--incremental-update -Bgcctestdir/ common_test_1_tmp.o