Index: gold/gold.cc =================================================================== RCS file: /cvs/src/src/gold/gold.cc,v retrieving revision 1.104 diff -u -r1.104 gold.cc --- gold/gold.cc 10 Mar 2013 23:08:18 -0000 1.104 +++ gold/gold.cc 5 Apr 2013 00:18:22 -0000 @@ -874,6 +874,9 @@ final_blocker = new_final_blocker; } + // Create tasks for tree-style build ID computation, if necessary. + final_blocker = layout->queue_build_id_tasks(workqueue, final_blocker, of); + // Queue a task to close the output file. This will be blocked by // FINAL_BLOCKER. workqueue->queue(new Task_function(new Close_task_runner(&options, layout, Index: gold/layout.cc =================================================================== RCS file: /cvs/src/src/gold/layout.cc,v retrieving revision 1.248 diff -u -r1.248 layout.cc --- gold/layout.cc 21 Mar 2013 04:52:55 -0000 1.248 +++ gold/layout.cc 5 Apr 2013 00:18:22 -0000 @@ -236,6 +236,56 @@ program_name, Free_list::num_allocate_visits); } +// A Hash_task computes the MD5 checksum of an array of char. +// It has a blocker on either side (i.e., the task cannot run until +// the first is unblocked, and it unblocks the second after running). + +class Hash_task : public Task +{ + public: + Hash_task(const unsigned char* src, + size_t size, + unsigned char* dst, + Task_token* build_id_blocker, + Task_token* final_blocker) + : src_(src), size_(size), dst_(dst), build_id_blocker_(build_id_blocker), + final_blocker_(final_blocker) + { } + + void + run(Workqueue*) + { md5_buffer(reinterpret_cast(src_), size_, dst_); } + + Task_token* + is_runnable(); + + // Unblock FINAL_BLOCKER_ when done. + void + locks(Task_locker* tl) + { tl->add(this, this->final_blocker_); } + + std::string + get_name() const + { return "Hash_task"; } + + private: + const unsigned char* const src_; + const size_t size_; + unsigned char* const dst_; + Task_token* const build_id_blocker_; + Task_token* const final_blocker_; +}; + + +// BUILD_ID_BLOCKER_ blocks this. +Task_token* +Hash_task::is_runnable() +{ + if (this->build_id_blocker_->is_blocked()) + return this->build_id_blocker_; + return NULL; +} + // Layout::Relaxation_debug_check methods. // Check that sections and special data are in reset states. @@ -398,6 +448,9 @@ eh_frame_hdr_section_(NULL), gdb_index_data_(NULL), build_id_note_(NULL), + array_of_hashes_(NULL), + size_of_array_of_hashes_(0), + input_view_(NULL), debug_abbrev_(NULL), debug_info_(NULL), group_signatures_(), @@ -2924,7 +2977,7 @@ std::string desc; if (strcmp(style, "md5") == 0) descsz = 128 / 8; - else if (strcmp(style, "sha1") == 0) + else if ((strcmp(style, "sha1") == 0) || (strcmp(style, "tree") == 0)) descsz = 160 / 8; else if (strcmp(style, "uuid") == 0) { @@ -5209,9 +5262,53 @@ this->section_headers_->write(of); } -// If the build ID requires computing a checksum, do so here, and -// write it out. We compute a checksum over the entire file because -// that is simplest. +// Build IDs can be computed as a "flat" sha1 or md5 of a string of bytes, +// or as a "tree" where each chunk of the string is hashed and then those +// hashes are put into a (much smaller) string which is hashed with sha1. +// We compute a checksum over the entire file because that is simplest. + +Task_token* +Layout::queue_build_id_tasks(Workqueue* workqueue, Task_token* build_id_blocker, + Output_file* of) +{ + const size_t filesize = (this->output_file_size() <= 0 ? 0 + : static_cast(this->output_file_size())); + if (this->build_id_note_ != NULL + && (strcmp(parameters->options().build_id(), "tree") == 0) + && (parameters->options().build_id_chunk_size_for_treehash() > 0) + && (filesize > 0) + && (filesize >= + parameters->options().build_id_min_file_size_for_treehash())) + { + static const size_t MD5_OUTPUT_SIZE_IN_BYTES = 16; + const size_t chunk_size = + parameters->options().build_id_chunk_size_for_treehash(); + const size_t num_hashes = ((filesize - 1) / chunk_size) + 1; + Task_token* post_hash_tasks_blocker = new Task_token(true); + post_hash_tasks_blocker->add_blockers(num_hashes); + this->size_of_array_of_hashes_ = num_hashes * MD5_OUTPUT_SIZE_IN_BYTES; + const unsigned char* src = of->get_input_view(0, filesize); + this->input_view_ = src; + unsigned char *dst = new unsigned char[this->size_of_array_of_hashes_]; + this->array_of_hashes_ = dst; + for (size_t i = 0, src_offset = 0; i < num_hashes; + i++, dst += MD5_OUTPUT_SIZE_IN_BYTES, src_offset += chunk_size) + { + size_t size = std::min(chunk_size, filesize - src_offset); + workqueue->queue(new Hash_task(src + src_offset, + size, + dst, + build_id_blocker, + post_hash_tasks_blocker)); + } + return post_hash_tasks_blocker; + } + return build_id_blocker; +} + +// If a tree-style build ID was requested, the parallel part of that computation +// is already done, and the final hash-of-hashes is computed here. For other +// types of build IDs, all the work is done here. void Layout::write_build_id(Output_file* of) const @@ -5219,34 +5316,39 @@ if (this->build_id_note_ == NULL) return; - const unsigned char* iv = of->get_input_view(0, this->output_file_size_); - unsigned char* ov = of->get_output_view(this->build_id_note_->offset(), - this->build_id_note_->data_size()); + this->build_id_note_->data_size()); - const char* style = parameters->options().build_id(); - if (strcmp(style, "sha1") == 0) + if (this->array_of_hashes_ == NULL) { - sha1_ctx ctx; - sha1_init_ctx(&ctx); - sha1_process_bytes(iv, this->output_file_size_, &ctx); - sha1_finish_ctx(&ctx, ov); - } - else if (strcmp(style, "md5") == 0) - { - md5_ctx ctx; - md5_init_ctx(&ctx); - md5_process_bytes(iv, this->output_file_size_, &ctx); - md5_finish_ctx(&ctx, ov); + const size_t output_file_size = this->output_file_size(); + const unsigned char* iv = of->get_input_view(0, output_file_size); + const char* style = parameters->options().build_id(); + + // If we get here with style == "tree" then the output must be + // too small for chunking, and we use SHA-1 in that case. + if ((strcmp(style, "sha1") == 0) || (strcmp(style, "tree") == 0)) + sha1_buffer(reinterpret_cast(iv), output_file_size, ov); + else if (strcmp(style, "md5") == 0) + md5_buffer(reinterpret_cast(iv), output_file_size, ov); + else + gold_unreachable(); + + of->free_input_view(0, output_file_size, iv); } else - gold_unreachable(); + { + // Non-overlapping substrings of the output file have been hashed. + // Compute SHA-1 hash of the hashes. + sha1_buffer(reinterpret_cast(this->array_of_hashes_), + this->size_of_array_of_hashes_, ov); + delete[] this->array_of_hashes_; + of->free_input_view(0, this->output_file_size(), this->input_view_); + } of->write_output_view(this->build_id_note_->offset(), this->build_id_note_->data_size(), ov); - - of->free_input_view(0, this->output_file_size_, iv); } // Write out a binary file. This is called after the link is @@ -5436,12 +5538,14 @@ // Close_task_runner methods. -// Run the task--close the file. +// Finish up the build ID computation, if necessary, and write a binary file, +// if necessary. Then close the output file. void Close_task_runner::run(Workqueue*, const Task*) { - // If we need to compute a checksum for the BUILD if, we do so here. + // At this point the multi-threaded part of the build ID computation, + // if any, is done. See queue_build_id_tasks(). this->layout_->write_build_id(this->of_); // If we've been asked to create a binary file, we do so here. Index: gold/layout.h =================================================================== RCS file: /cvs/src/src/gold/layout.h,v retrieving revision 1.108 diff -u -r1.108 layout.h --- gold/layout.h 21 Dec 2012 06:24:31 -0000 1.108 +++ gold/layout.h 5 Apr 2013 00:18:22 -0000 @@ -892,6 +892,13 @@ const Output_data_reloc_generic* dyn_rel, bool add_debug, bool dynrel_includes_plt); + // If a treehash is necessary to compute the build ID, then queue + // the necessary tasks and return a blocker that will unblock when + // they finish. Otherwise return the 2nd arg. + Task_token* + queue_build_id_tasks(Workqueue* workqueue, Task_token* build_id_blocker, + Output_file* of); + // Compute and write out the build ID if needed. void write_build_id(Output_file*) const; @@ -1354,6 +1361,12 @@ Gdb_index* gdb_index_data_; // The space for the build ID checksum if there is one. Output_section_data* build_id_note_; + // Temporary storage for tree hash of build ID. + unsigned char* array_of_hashes_; + // Size of array_of_hashes_ (in bytes). + size_t size_of_array_of_hashes_; + // Input view for computing tree hash of build ID. Freed in write_build_id(). + const unsigned char* input_view_; // The output section containing dwarf abbreviations Output_reduced_debug_abbrev_section* debug_abbrev_; // The output section containing the dwarf debug info tree Index: gold/options.h =================================================================== RCS file: /cvs/src/src/gold/options.h,v retrieving revision 1.184 diff -u -r1.184 options.h --- gold/options.h 15 Feb 2013 15:44:03 -0000 1.184 +++ gold/options.h 5 Apr 2013 00:18:22 -0000 @@ -678,10 +678,19 @@ DEFINE_bool(Bsymbolic_functions, options::ONE_DASH, '\0', false, N_("Bind defined function symbols locally"), NULL); - DEFINE_optional_string(build_id, options::TWO_DASHES, '\0', "sha1", + DEFINE_optional_string(build_id, options::TWO_DASHES, '\0', "tree", N_("Generate build ID note"), N_("[=STYLE]")); + DEFINE_uint64(build_id_chunk_size_for_treehash, + options::TWO_DASHES, '\0', 2 << 20, + N_("Chunk size for '--build-id=tree'"), N_("SIZE")); + + DEFINE_uint64(build_id_min_file_size_for_treehash, options::TWO_DASHES, + '\0', 40 << 20, + N_("Minimum output file size for '--build-id=tree' to work" + " differently than '--build-id=sha1'"), N_("SIZE")); + DEFINE_bool(check_sections, options::TWO_DASHES, '\0', true, N_("Check segment addresses for overlaps (default)"), N_("Do not check segment addresses for overlaps")); Index: gold/Makefile.am =================================================================== RCS file: /cvs/src/src/gold/Makefile.am,v retrieving revision 1.70 diff -u -r1.70 Makefile.am --- gold/Makefile.am 11 Jan 2013 14:36:36 -0000 1.70 +++ gold/Makefile.am 5 Apr 2013 06:12:30 -0000 @@ -269,7 +269,7 @@ bootstrap-test: ld2 rm -f $@ echo "#!/bin/sh" > $@ - echo "cmp ld1 ld2" > $@ + echo "cmp ld1 ld2" >> $@ chmod +x $@ libgold-1-r.o: gcctestdir1/ld libgold.a @@ -296,11 +296,68 @@ bootstrap-test-r: ld2-r rm -f $@ echo "#!/bin/sh" > $@ - echo "cmp ld1-r ld2-r" > $@ + echo "cmp ld1-r ld2-r" >> $@ chmod +x $@ check_PROGRAMS = ld1 ld2 ld1-r ld2-r TESTS = bootstrap-test bootstrap-test-r +# Verify that changing the number of threads doesn't change the +# treehash computation, by building ld1 and ld3 the same way except +# for the number of threads. However, the build ID should change if +# we change the chunk size for --build-id=tree, so ld4 should be +# different. We run the latter test even if multithreading is unavailable, +# because the treehash can still operate in that mode. +check_PROGRAMS += ld4 +TESTS += bootstrap-test-treehash-chunksize + +gcctestdir3/ld: ld-new + test -d gcctestdir3 || mkdir -p gcctestdir3 + rm -f gcctestdir3/ld + (cd gcctestdir3 && $(LN_S) ../ld-new ld) + +ld3_SOURCES = $(sources_var) +ld3_DEPENDENCIES = $(deps_var) gcctestdir3/ld +ld3_LDADD = $(ldadd_var) +ld3_LDFLAGS = -Bgcctestdir3/ + +gcctestdir4/ld: ld-new + test -d gcctestdir4 || mkdir -p gcctestdir4 + rm -f gcctestdir4/ld + (cd gcctestdir4 && $(LN_S) ../ld-new ld) + +ld4_SOURCES = $(sources_var) +ld4_DEPENDENCIES = $(deps_var) gcctestdir4/ld +ld4_LDADD = $(ldadd_var) +ld4_LDFLAGS = -Bgcctestdir4/ + +ld1_LDFLAGS += -Wl,--build-id=tree -Wl,--build-id-chunk-size-for-treehash=12345 -Wl,--build-id-min-file-size-for-treehash=0 +ld2_LDFLAGS += -Wl,--build-id=tree -Wl,--build-id-chunk-size-for-treehash=12345 -Wl,--build-id-min-file-size-for-treehash=0 +ld3_LDFLAGS += -Wl,--build-id=tree -Wl,--build-id-chunk-size-for-treehash=12345 -Wl,--build-id-min-file-size-for-treehash=0 +ld4_LDFLAGS += -Wl,--build-id=tree -Wl,--build-id-chunk-size-for-treehash=12346 -Wl,--build-id-min-file-size-for-treehash=0 + +if THREADS + +ld1_LDFLAGS += -Wl,--thread-count=3 +ld2_LDFLAGS += -Wl,--thread-count=3 +ld3_LDFLAGS += -Wl,--thread-count=13 +ld4_LDFLAGS += -Wl,--thread-count=3 +check_PROGRAMS += ld3 +TESTS += bootstrap-test-treehash-chunksize + +bootstrap-test-treehash: ld1 ld3 + rm -f $@ + echo "#!/bin/sh" > $@ + echo "cmp ld1 ld3" >> $@ + chmod +x $@ + +endif + +bootstrap-test-treehash-chunksize: ld1 ld4 + rm -f $@ + echo "#!/bin/sh" > $@ + echo "cmp ld1 ld4 | grep ." >> $@ + chmod +x $@ + endif endif Index: gold/Makefile.in =================================================================== RCS file: /cvs/src/src/gold/Makefile.in,v retrieving revision 1.98 diff -u -r1.98 Makefile.in --- gold/Makefile.in 11 Jan 2013 14:36:36 -0000 1.98 +++ gold/Makefile.in 5 Apr 2013 06:12:30 -0000 @@ -1,9 +1,9 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -59,7 +59,14 @@ noinst_PROGRAMS = ld-new$(EXEEXT) incremental-dump$(EXEEXT) @GCC_TRUE@@NATIVE_LINKER_TRUE@check_PROGRAMS = ld1$(EXEEXT) \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ ld2$(EXEEXT) ld1-r$(EXEEXT) \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ ld2-r$(EXEEXT) +@GCC_TRUE@@NATIVE_LINKER_TRUE@ ld2-r$(EXEEXT) ld4$(EXEEXT) \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(am__EXEEXT_1) +@GCC_TRUE@@NATIVE_LINKER_TRUE@@THREADS_TRUE@am__append_1 = -Wl,--thread-count=3 +@GCC_TRUE@@NATIVE_LINKER_TRUE@@THREADS_TRUE@am__append_2 = -Wl,--thread-count=3 +@GCC_TRUE@@NATIVE_LINKER_TRUE@@THREADS_TRUE@am__append_3 = -Wl,--thread-count=13 +@GCC_TRUE@@NATIVE_LINKER_TRUE@@THREADS_TRUE@am__append_4 = -Wl,--thread-count=3 +@GCC_TRUE@@NATIVE_LINKER_TRUE@@THREADS_TRUE@am__append_5 = ld3 +@GCC_TRUE@@NATIVE_LINKER_TRUE@@THREADS_TRUE@am__append_6 = bootstrap-test-treehash-chunksize subdir = . DIST_COMMON = NEWS README ChangeLog $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/configure \ @@ -114,6 +121,8 @@ $(am__objects_3) $(am__objects_2) libgold_a_OBJECTS = $(am_libgold_a_OBJECTS) am__installdirs = "$(DESTDIR)$(bindir)" +@GCC_TRUE@@NATIVE_LINKER_TRUE@@THREADS_TRUE@am__EXEEXT_1 = \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@@THREADS_TRUE@ ld3$(EXEEXT) PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) am_dwp_OBJECTS = dwp.$(OBJEXT) dwp_OBJECTS = $(am_dwp_OBJECTS) @@ -146,6 +155,14 @@ ld2_r_OBJECTS = $(am_ld2_r_OBJECTS) ld2_r_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(ld2_r_LDFLAGS) \ $(LDFLAGS) -o $@ +@GCC_TRUE@@NATIVE_LINKER_TRUE@am_ld3_OBJECTS = $(am__objects_4) +ld3_OBJECTS = $(am_ld3_OBJECTS) +ld3_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(ld3_LDFLAGS) \ + $(LDFLAGS) -o $@ +@GCC_TRUE@@NATIVE_LINKER_TRUE@am_ld4_OBJECTS = $(am__objects_4) +ld4_OBJECTS = $(am_ld4_OBJECTS) +ld4_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(ld4_LDFLAGS) \ + $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/../depcomp am__depfiles_maybe = depfiles @@ -160,12 +177,12 @@ CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ @MAINTAINER_MODE_FALSE@am__skipyacc = test -f $@ || -YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS) +YACCCOMPILE = $(YACC) $(AM_YFLAGS) $(YFLAGS) YLWRAP = $(top_srcdir)/../ylwrap SOURCES = $(libgold_a_SOURCES) $(dwp_SOURCES) \ $(incremental_dump_SOURCES) $(ld_new_SOURCES) \ $(EXTRA_ld_new_SOURCES) $(ld1_SOURCES) $(ld1_r_SOURCES) \ - $(ld2_SOURCES) $(ld2_r_SOURCES) + $(ld2_SOURCES) $(ld2_r_SOURCES) $(ld3_SOURCES) $(ld4_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ @@ -177,7 +194,7 @@ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ - check check-html recheck recheck-html + check recheck check-html recheck-html ETAGS = etags CTAGS = ctags am__tty_colors = \ @@ -203,22 +220,34 @@ am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } # Restructured Text title and section. am__rst_title = sed 's/.*/ & /;h;s/./=/g;p;x;p;g;p;s/.*//' am__rst_section = sed 'p;s/./=/g;p;g' # Put stdin (possibly several lines separated by ". ") in a box. -am__text_box = $(AWK) '{ \ - n = split($$0, lines, "\\. "); max = 0; \ - for (i = 1; i <= n; ++i) \ - if (max < length(lines[i])) \ - max = length(lines[i]); \ - for (i = 0; i < max; ++i) line = line "="; \ - print line; \ - for (i = 1; i <= n; ++i) if (lines[i]) print lines[i];\ - print line; \ +# Prefix each line by 'col' and terminate each with 'std', for coloring. +# Multi line coloring is problematic with "less -R", so we really need +# to color each line individually. +am__text_box = $(AWK) '{ \ + n = split($$0, lines, "\\. "); max = 0; \ + for (i = 1; i <= n; ++i) \ + if (max < length(lines[i])) \ + max = length(lines[i]); \ + for (i = 0; i < max; ++i) \ + line = line "="; \ + print col line std; \ + for (i = 1; i <= n; ++i) \ + if (lines[i]) \ + print col lines[i] std; \ + print col line std; \ }' # Solaris 10 'make', and several other traditional 'make' implementations, -# pass "-e" to $(SHELL). This contradicts POSIX. Work around the problem +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # To be inserted before the command running the test. Creates the @@ -231,8 +260,9 @@ $(am__vpath_adj_setup) $(am__vpath_adj) \ srcdir=$(srcdir); export srcdir; \ rm -f $@-t; \ -trap 'st=$$?; rm -f '\''$(abs_builddir)/$@-t'\''; (exit $$st); exit $$st' \ - 1 2 13 15; \ +am__trap='rm -f '\''$(abs_builddir)/$@-t'\''; (exit $$st); exit $$st'; \ +trap "st=129; $$am__trap" 1; trap "st=130; $$am__trap" 2; \ +trap "st=141; $$am__trap" 13; trap "st=143; $$am__trap" 15; \ am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`; \ test "x$$am__odir" = x. || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ @@ -240,9 +270,38 @@ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; __SAVED_TERM=$$TERM; \ $(TESTS_ENVIRONMENT) +# To be appended to the command running the test. Handle the stdout +# and stderr redirection, and catch the exit status. +am__check_post = \ +>$@-t 2>&1; \ +estatus=$$?; \ +if test -n '$(DISABLE_HARD_ERRORS)' \ + && test $$estatus -eq 99; then \ + estatus=1; \ +fi; \ +TERM=$$__SAVED_TERM; export TERM; \ +$(am__tty_colors); \ +xfailed=PASS; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + xfailed=XFAIL;; \ +esac; \ +case $$estatus.$$xfailed in \ + 0.XFAIL) col=$$red; res=XPASS;; \ + 0.*) col=$$grn; res=PASS ;; \ + 77.*) col=$$blu; res=SKIP ;; \ + 99.*) col=$$red; res=FAIL ;; \ + *.XFAIL) col=$$lgn; res=XFAIL;; \ + *.*) col=$$red; res=FAIL ;; \ +esac; \ +echo "$${col}$$res$${std}: $$f"; \ +echo "$$res: $$f (exit: $$estatus)" | \ + $(am__rst_section) >$@; \ +cat $@-t >>$@; \ +rm -f $@-t RECHECK_LOGS = $(TEST_LOGS) -TEST_SUITE_LOG = test-suite.log TEST_SUITE_HTML = $(TEST_SUITE_LOG:.log=.html) +TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__test_logs1 = $(TESTS:=.log) @@ -550,11 +609,19 @@ @GCC_TRUE@@NATIVE_LINKER_TRUE@ld1_SOURCES = $(sources_var) @GCC_TRUE@@NATIVE_LINKER_TRUE@ld1_DEPENDENCIES = $(deps_var) gcctestdir1/ld @GCC_TRUE@@NATIVE_LINKER_TRUE@ld1_LDADD = $(ldadd_var) -@GCC_TRUE@@NATIVE_LINKER_TRUE@ld1_LDFLAGS = -Bgcctestdir1/ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ld1_LDFLAGS = -Bgcctestdir1/ \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ -Wl,--build-id=tree \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ -Wl,--build-id-chunk-size-for-treehash=12345 \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ -Wl,--build-id-min-file-size-for-treehash=0 \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(am__append_1) @GCC_TRUE@@NATIVE_LINKER_TRUE@ld2_SOURCES = $(sources_var) @GCC_TRUE@@NATIVE_LINKER_TRUE@ld2_DEPENDENCIES = $(deps_var) gcctestdir2/ld @GCC_TRUE@@NATIVE_LINKER_TRUE@ld2_LDADD = $(ldadd_var) -@GCC_TRUE@@NATIVE_LINKER_TRUE@ld2_LDFLAGS = -Bgcctestdir2/ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ld2_LDFLAGS = -Bgcctestdir2/ \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ -Wl,--build-id=tree \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ -Wl,--build-id-chunk-size-for-treehash=12345 \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ -Wl,--build-id-min-file-size-for-treehash=0 \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(am__append_2) @GCC_TRUE@@NATIVE_LINKER_TRUE@ld1_r_SOURCES = $(sources_var) @GCC_TRUE@@NATIVE_LINKER_TRUE@ld1_r_DEPENDENCIES = libgold-1-r.o $(deps_var) gcctestdir1/ld @GCC_TRUE@@NATIVE_LINKER_TRUE@ld1_r_LDADD = libgold-1-r.o $(ldadd_var) @@ -563,13 +630,31 @@ @GCC_TRUE@@NATIVE_LINKER_TRUE@ld2_r_DEPENDENCIES = libgold-2-r.o $(deps_var) gcctestdir2-r/ld @GCC_TRUE@@NATIVE_LINKER_TRUE@ld2_r_LDADD = libgold-2-r.o $(ldadd_var) @GCC_TRUE@@NATIVE_LINKER_TRUE@ld2_r_LDFLAGS = -Bgcctestdir2-r/ -@GCC_TRUE@@NATIVE_LINKER_TRUE@TESTS = bootstrap-test bootstrap-test-r +@GCC_TRUE@@NATIVE_LINKER_TRUE@TESTS = bootstrap-test bootstrap-test-r \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ bootstrap-test-treehash-chunksize \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(am__append_6) +@GCC_TRUE@@NATIVE_LINKER_TRUE@ld3_SOURCES = $(sources_var) +@GCC_TRUE@@NATIVE_LINKER_TRUE@ld3_DEPENDENCIES = $(deps_var) gcctestdir3/ld +@GCC_TRUE@@NATIVE_LINKER_TRUE@ld3_LDADD = $(ldadd_var) +@GCC_TRUE@@NATIVE_LINKER_TRUE@ld3_LDFLAGS = -Bgcctestdir3/ \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ -Wl,--build-id=tree \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ -Wl,--build-id-chunk-size-for-treehash=12345 \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ -Wl,--build-id-min-file-size-for-treehash=0 \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(am__append_3) +@GCC_TRUE@@NATIVE_LINKER_TRUE@ld4_SOURCES = $(sources_var) +@GCC_TRUE@@NATIVE_LINKER_TRUE@ld4_DEPENDENCIES = $(deps_var) gcctestdir4/ld +@GCC_TRUE@@NATIVE_LINKER_TRUE@ld4_LDADD = $(ldadd_var) +@GCC_TRUE@@NATIVE_LINKER_TRUE@ld4_LDFLAGS = -Bgcctestdir4/ \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ -Wl,--build-id=tree \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ -Wl,--build-id-chunk-size-for-treehash=12346 \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ -Wl,--build-id-min-file-size-for-treehash=0 \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(am__append_4) all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .c .cc .html .log .o .obj .test .test$(EXEEXT) .y -am--refresh: +am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ @@ -605,10 +690,8 @@ $(am__aclocal_m4_deps): config.h: stamp-h1 - @if test ! -f $@; then \ - rm -f stamp-h1; \ - $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ - else :; fi + @if test ! -f $@; then rm -f stamp-h1; else :; fi + @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi stamp-h1: $(srcdir)/config.in $(top_builddir)/config.status @rm -f stamp-h1 @@ -626,11 +709,9 @@ clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) yyscript.h: yyscript.c - @if test ! -f $@; then \ - rm -f yyscript.c; \ - $(MAKE) $(AM_MAKEFLAGS) yyscript.c; \ - else :; fi -libgold.a: $(libgold_a_OBJECTS) $(libgold_a_DEPENDENCIES) + @if test ! -f $@; then rm -f yyscript.c; else :; fi + @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) yyscript.c; else :; fi +libgold.a: $(libgold_a_OBJECTS) $(libgold_a_DEPENDENCIES) $(EXTRA_libgold_a_DEPENDENCIES) -rm -f libgold.a $(libgold_a_AR) libgold.a $(libgold_a_OBJECTS) $(libgold_a_LIBADD) $(RANLIB) libgold.a @@ -677,27 +758,33 @@ clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) -dwp$(EXEEXT): $(dwp_OBJECTS) $(dwp_DEPENDENCIES) +dwp$(EXEEXT): $(dwp_OBJECTS) $(dwp_DEPENDENCIES) $(EXTRA_dwp_DEPENDENCIES) @rm -f dwp$(EXEEXT) $(dwp_LINK) $(dwp_OBJECTS) $(dwp_LDADD) $(LIBS) -incremental-dump$(EXEEXT): $(incremental_dump_OBJECTS) $(incremental_dump_DEPENDENCIES) +incremental-dump$(EXEEXT): $(incremental_dump_OBJECTS) $(incremental_dump_DEPENDENCIES) $(EXTRA_incremental_dump_DEPENDENCIES) @rm -f incremental-dump$(EXEEXT) $(CXXLINK) $(incremental_dump_OBJECTS) $(incremental_dump_LDADD) $(LIBS) -ld-new$(EXEEXT): $(ld_new_OBJECTS) $(ld_new_DEPENDENCIES) +ld-new$(EXEEXT): $(ld_new_OBJECTS) $(ld_new_DEPENDENCIES) $(EXTRA_ld_new_DEPENDENCIES) @rm -f ld-new$(EXEEXT) $(ld_new_LINK) $(ld_new_OBJECTS) $(ld_new_LDADD) $(LIBS) -ld1$(EXEEXT): $(ld1_OBJECTS) $(ld1_DEPENDENCIES) +ld1$(EXEEXT): $(ld1_OBJECTS) $(ld1_DEPENDENCIES) $(EXTRA_ld1_DEPENDENCIES) @rm -f ld1$(EXEEXT) $(ld1_LINK) $(ld1_OBJECTS) $(ld1_LDADD) $(LIBS) -ld1-r$(EXEEXT): $(ld1_r_OBJECTS) $(ld1_r_DEPENDENCIES) +ld1-r$(EXEEXT): $(ld1_r_OBJECTS) $(ld1_r_DEPENDENCIES) $(EXTRA_ld1_r_DEPENDENCIES) @rm -f ld1-r$(EXEEXT) $(ld1_r_LINK) $(ld1_r_OBJECTS) $(ld1_r_LDADD) $(LIBS) -ld2$(EXEEXT): $(ld2_OBJECTS) $(ld2_DEPENDENCIES) +ld2$(EXEEXT): $(ld2_OBJECTS) $(ld2_DEPENDENCIES) $(EXTRA_ld2_DEPENDENCIES) @rm -f ld2$(EXEEXT) $(ld2_LINK) $(ld2_OBJECTS) $(ld2_LDADD) $(LIBS) -ld2-r$(EXEEXT): $(ld2_r_OBJECTS) $(ld2_r_DEPENDENCIES) +ld2-r$(EXEEXT): $(ld2_r_OBJECTS) $(ld2_r_DEPENDENCIES) $(EXTRA_ld2_r_DEPENDENCIES) @rm -f ld2-r$(EXEEXT) $(ld2_r_LINK) $(ld2_r_OBJECTS) $(ld2_r_LDADD) $(LIBS) +ld3$(EXEEXT): $(ld3_OBJECTS) $(ld3_DEPENDENCIES) $(EXTRA_ld3_DEPENDENCIES) + @rm -f ld3$(EXEEXT) + $(ld3_LINK) $(ld3_OBJECTS) $(ld3_LDADD) $(LIBS) +ld4$(EXEEXT): $(ld4_OBJECTS) $(ld4_DEPENDENCIES) $(EXTRA_ld4_DEPENDENCIES) + @rm -f ld4$(EXEEXT) + $(ld4_LINK) $(ld4_OBJECTS) $(ld4_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -933,41 +1020,12 @@ distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -# To be appended to the command running the test. Handle the stdout -# and stderr redirection, and catch the exit status. -am__check_post = \ ->$@-t 2>&1; \ -estatus=$$?; \ -if test -n '$(DISABLE_HARD_ERRORS)' \ - && test $$estatus -eq 99; then \ - estatus=1; \ -fi; \ -TERM=$$__SAVED_TERM; export TERM; \ -$(am__tty_colors); \ -xfailed=PASS; \ -case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ - xfailed=XFAIL;; \ -esac; \ -case $$estatus:$$xfailed in \ - 0:XFAIL) col=$$red; res=XPASS;; \ - 0:*) col=$$grn; res=PASS ;; \ - 77:*) col=$$blu; res=SKIP ;; \ - 99:*) col=$$red; res=FAIL ;; \ - *:XFAIL) col=$$lgn; res=XFAIL;; \ - *:*) col=$$red; res=FAIL ;; \ -esac; \ -echo "$${col}$$res$${std}: $$f"; \ -echo "$$res: $$f (exit: $$estatus)" | \ - $(am__rst_section) >$@; \ -cat $@-t >>$@; \ -rm -f $@-t - $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__sh_e_setup); \ list='$(TEST_LOGS)'; \ results=`for f in $$list; do \ - read line < $$f && echo "$$line" || echo FAIL; \ + test -r $$f && read line < $$f && echo "$$line" \ + || echo FAIL; \ done`; \ all=`echo "$$results" | sed '/^$$/d' | wc -l | sed -e 's/^[ ]*//'`; \ fail=`echo "$$results" | grep -c '^FAIL'`; \ @@ -1016,7 +1074,7 @@ echo ".. contents:: :depth: 2"; \ echo; \ for f in $$list; do \ - read line < $$f; \ + test -r $$f && read line < $$f || line=; \ case $$line in \ PASS:*|XFAIL:*);; \ *) echo; cat $$f;; \ @@ -1033,23 +1091,38 @@ test x"$$VERBOSE" = x || $$exit || cat $(TEST_SUITE_LOG); \ $(am__tty_colors); \ if $$exit; then \ - echo $(ECHO_N) "$$grn$(ECHO_C)"; \ + col="$$grn"; \ else \ - echo $(ECHO_N) "$$red$(ECHO_C)"; \ + col="$$red"; \ fi; \ - echo "$$msg" | $(am__text_box); \ - echo $(ECHO_N) "$$std$(ECHO_C)"; \ - $$exit - -# Run all the tests. -check-TESTS: - @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + echo "$$msg" | $(am__text_box) "col=$$col" "std=$$std"; \ + $$exit || exit 1 + +check-TESTS recheck: + @if test $@ != recheck; then \ + list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list; \ + fi @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) - @list='$(TEST_LOGS)'; \ - list=`for f in $$list; do \ - test .log = $$f || echo $$f; \ - done | tr '\012\015' ' '`; \ + @list='' list2='$(TEST_LOGS)'; for f in $$list2; do \ + test .log = $$f && continue; \ + if test $@ = recheck; then \ + test -f $$f || continue; \ + if test -r $$f && read line < $$f; then \ + case $$line in FAIL*|XPASS*) : ;; *) continue;; esac; \ + fi; \ + fi; \ + if test -z "$$list"; then list=$$f; else list="$$list $$f"; fi; \ + done; \ + if test $@ = recheck && test -n "$$list"; then \ + echo "am--clean: ; rm -f $$list" \ + | $(MAKE) $(AM_MAKEFLAGS) -f - am--clean || exit 1; \ + fi; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$list" +recheck: $(check_PROGRAMS) + +am--mostlyclean-test-html: + list='$(TEST_LOGS:.log=.html)'; test -z "$$list" || rm -f $$list + rm -f $(TEST_SUITE_HTML) .log.html: @list='$(RST2HTML) $$RST2HTML rst2html rst2html.py'; \ @@ -1069,26 +1142,17 @@ # Beware of concurrent executions. Run "check" not "check-TESTS", as # check-SCRIPTS and other dependencies are rebuilt by the former only. # And expect check to fail. -check-html: - @if $(MAKE) $(AM_MAKEFLAGS) check; then \ - rv=0; else rv=$$?; \ - fi; \ - $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_HTML) || exit 4; \ +check-html recheck-html: + @target=`echo $@ | sed 's/-html$$//'`; \ + rv=0; $(MAKE) $(AM_MAKEFLAGS) $$target || rv=$$?; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_HTML) TEST_LOGS= || exit 4; \ exit $$rv -recheck recheck-html: - @target=`echo $@ | sed 's,^re,,'`; \ - list='$(TEST_LOGS)'; \ - list=`for f in $$list; do \ - test -f $$f || continue; \ - if read line < $$f; then \ - case $$line in FAIL*|XPASS*) echo $$f;; esac; \ - else echo $$f; fi; \ - done | tr '\012\015' ' '`; \ - $(MAKE) $(AM_MAKEFLAGS) $$target AM_MAKEFLAGS='$(AM_MAKEFLAGS) TEST_LOGS="'"$$list"'"' bootstrap-test.log: bootstrap-test @p='bootstrap-test'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) bootstrap-test-r.log: bootstrap-test-r @p='bootstrap-test-r'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) +bootstrap-test-treehash-chunksize.log: bootstrap-test-treehash-chunksize + @p='bootstrap-test-treehash-chunksize'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) .test.log: @p='$<'; $(am__check_pre) $(TEST_LOG_COMPILE) "$$tst" $(am__check_post) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @@ -1113,14 +1177,18 @@ installcheck: installcheck-recursive install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS_TMP)" || rm -f $(TEST_LOGS_TMP) - -test -z "$(TEST_SUITE_HTML)" || rm -f $(TEST_SUITE_HTML) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: @@ -1195,7 +1263,8 @@ mostlyclean: mostlyclean-recursive -mostlyclean-am: mostlyclean-compile mostlyclean-generic +mostlyclean-am: am--mostlyclean-test-html mostlyclean-compile \ + mostlyclean-generic pdf: pdf-recursive @@ -1208,18 +1277,19 @@ uninstall-am: uninstall-binPROGRAMS .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check-am \ - check-html ctags-recursive install-am install-strip recheck \ + check-html ctags-recursive install-am install-strip \ recheck-html tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am am--refresh check check-TESTS check-am check-html \ - clean clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ - clean-noinstLIBRARIES clean-noinstPROGRAMS ctags \ - ctags-recursive distclean distclean-compile distclean-generic \ - distclean-hdr distclean-tags dvi dvi-am html html-am info \ - info-am install install-am install-binPROGRAMS install-data \ - install-data-am install-data-local install-dvi install-dvi-am \ - install-exec install-exec-am install-exec-local install-html \ + all all-am am--mostlyclean-test-html am--refresh check \ + check-TESTS check-am check-html clean clean-binPROGRAMS \ + clean-checkPROGRAMS clean-generic clean-noinstLIBRARIES \ + clean-noinstPROGRAMS ctags ctags-recursive distclean \ + distclean-compile distclean-generic distclean-hdr \ + distclean-tags dvi dvi-am html html-am info info-am install \ + install-am install-binPROGRAMS install-data install-data-am \ + install-data-local install-dvi install-dvi-am install-exec \ + install-exec-am install-exec-local install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ @@ -1285,7 +1355,7 @@ @GCC_TRUE@@NATIVE_LINKER_TRUE@bootstrap-test: ld2 @GCC_TRUE@@NATIVE_LINKER_TRUE@ rm -f $@ @GCC_TRUE@@NATIVE_LINKER_TRUE@ echo "#!/bin/sh" > $@ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ echo "cmp ld1 ld2" > $@ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ echo "cmp ld1 ld2" >> $@ @GCC_TRUE@@NATIVE_LINKER_TRUE@ chmod +x $@ @GCC_TRUE@@NATIVE_LINKER_TRUE@libgold-1-r.o: gcctestdir1/ld libgold.a @@ -1302,7 +1372,29 @@ @GCC_TRUE@@NATIVE_LINKER_TRUE@bootstrap-test-r: ld2-r @GCC_TRUE@@NATIVE_LINKER_TRUE@ rm -f $@ @GCC_TRUE@@NATIVE_LINKER_TRUE@ echo "#!/bin/sh" > $@ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ echo "cmp ld1-r ld2-r" > $@ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ echo "cmp ld1-r ld2-r" >> $@ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ chmod +x $@ + +@GCC_TRUE@@NATIVE_LINKER_TRUE@gcctestdir3/ld: ld-new +@GCC_TRUE@@NATIVE_LINKER_TRUE@ test -d gcctestdir3 || mkdir -p gcctestdir3 +@GCC_TRUE@@NATIVE_LINKER_TRUE@ rm -f gcctestdir3/ld +@GCC_TRUE@@NATIVE_LINKER_TRUE@ (cd gcctestdir3 && $(LN_S) ../ld-new ld) + +@GCC_TRUE@@NATIVE_LINKER_TRUE@gcctestdir4/ld: ld-new +@GCC_TRUE@@NATIVE_LINKER_TRUE@ test -d gcctestdir4 || mkdir -p gcctestdir4 +@GCC_TRUE@@NATIVE_LINKER_TRUE@ rm -f gcctestdir4/ld +@GCC_TRUE@@NATIVE_LINKER_TRUE@ (cd gcctestdir4 && $(LN_S) ../ld-new ld) + +@GCC_TRUE@@NATIVE_LINKER_TRUE@@THREADS_TRUE@bootstrap-test-treehash: ld1 ld3 +@GCC_TRUE@@NATIVE_LINKER_TRUE@@THREADS_TRUE@ rm -f $@ +@GCC_TRUE@@NATIVE_LINKER_TRUE@@THREADS_TRUE@ echo "#!/bin/sh" > $@ +@GCC_TRUE@@NATIVE_LINKER_TRUE@@THREADS_TRUE@ echo "cmp ld1 ld3" >> $@ +@GCC_TRUE@@NATIVE_LINKER_TRUE@@THREADS_TRUE@ chmod +x $@ + +@GCC_TRUE@@NATIVE_LINKER_TRUE@bootstrap-test-treehash-chunksize: ld1 ld4 +@GCC_TRUE@@NATIVE_LINKER_TRUE@ rm -f $@ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ echo "#!/bin/sh" > $@ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ echo "cmp ld1 ld4 | grep ." >> $@ @GCC_TRUE@@NATIVE_LINKER_TRUE@ chmod +x $@ # Tell versions [3.59,3.63) of GNU make to not export all variables.