]> Git Repo - binutils.git/blobdiff - bfd/ChangeLog
snapshot of eabi relocation support.
[binutils.git] / bfd / ChangeLog
index 4f6ef0f92b5d5e344a86c568dc69af05d75aa253..d41085c9926de72057d5dcdf69bcdcae2f8759c6 100644 (file)
@@ -1,3 +1,478 @@
+Mon Jan 22 11:21:51 1996  Michael Meissner  <[email protected]>
+
+       * elf-bfd.h (struct elf_link_hash_entry): Add
+       linker_section_pointer field.
+       (enum elf_linker_section_enum): Enumeration for new way of
+       creating linker dynamic sections and symbols.
+       (elf_linker_section{,_pointers}): New structures for creating
+       dynamic sections and symbols.
+       (elf_obj_tdata): Add linker_section_pointers and linker_section
+       fields.
+       (elf_local_ptr_offsets,elf_linker_section): New accessor macros.
+       (_bfd_elf_create_linker_section): New declarations.
+       (_bfd_elf_find_pointer_linker_section): Ditto.
+       (bfd_elf{32,64}_{create,finish}_pointer_linker_section): Ditto.
+       (_bfd_elf_make_linker_section_rela): Ditto.
+
+       * elf.c (_bfd_elf_link_hash_newfunc): Initialize new fields.
+
+       * elf32-ppc.c (ppc_elf_create_dynamic_sections): Delete.
+       (ppc_elf_create_linker_section): New function to create the
+       sections .got, .sdata, and .sdata2.
+       (ppc_elf_size_dynamic_sections): Zap .rela.{sdata,sdata2} if
+       needed.
+       (ppc_elf_check_relocs): Support more of the eabi relocations.
+       (ppc_elf_relocate_section): Ditto.
+       (ppc_elf_finish_dynamic_symbols): Adjust _SDA{,2}_BASE_ by 32768
+       if the .sdata{,2} + .sbss{,2} section size is > 32k.
+
+       * elflink.h (elf_create_pointer_linker_section): New function to
+       create initialized pointers in dynamic linker sections.
+       (elf_finish_pointer_linker_section): Actually intialize the
+       pointers created above.
+
+       * elfcode.h (bfd_elf{32,64}_create_pointer_linker_section): New
+       macros to provide both 32 and 64 bit versions of
+       elf_create_pointer_linker_section.
+       (bfd_elf{32,64}_finish_pointer_linker_section): New macros to
+       provide both 32 and 64 bit versions of
+       elf_finish_pointer_linker_section.
+
+       * elflink.c (_bfd_elf_create_linker_section): New function to
+       create a linker section.
+       (_bfd_elf_find_pointer_linker_section): Find a unique pointer to a
+       given address in the linker pointer offsets created for a given
+       symbol.
+       (_bfd_elf_make_linker_section_rela): Make a RELA section
+       corresponding to the generated linker section.
+
+start-sanitize-v8plus
+Sat Jan 20 08:36:10 1996  Doug Evans  <[email protected]>
+
+       * elf32-sparc.c (ELF_MACHINE_ALT1): Define.
+end-sanitize-v8plus
+
+Thu Jan 18 18:25:34 1996  Kim Knuttila  <[email protected]>
+
+       * coff-ppc.c (coff_ppc_relocate_section): changed TOCDEFN relocs.
+       (coff_ppc_relocate_section): Handle special values for gcc built dlls.
+       (dump_toc): fix diagnosing code to identify out-of-toc-bounds entries.
+       Also begin the toc at 4 as an eye catcher ('31313131' marks the first
+       toc entry in an objdump) for now.
+       (ppc_do_last, ppc_get_last): New function - needed to save processing 
+       the toc owner to the end.
+       (ppc_coff_swap_sym_in_hook): Removed an incorrect hack for doing the 
+       toc owner last.
+
+       * cofflink.c (_bfd_coff_final_link): Added a new hack to keep the 
+       toc owner from being done till last. Must define POWERPC_LE_PC 
+       to enable it.
+
+       * coffcode.h (coff_set_alignment_hook): alignment setting for .stab
+
+       * peicode.h (coff_swap_scnhdr_out): set section flags for stab/str
+       to INFO.
+       (coff_swap_aouthdr_out): Removed a non-working hack for computing the
+       SizeOfImage for PowerPC. Ignore the size of the .junk section.
+
+Thu Jan 18 17:42:12 1996  Ian Lance Taylor  <[email protected]>
+
+       * elfcore.h: Include <signal.h> before <sys/procfs.h>.
+
+Wed Jan 17 12:40:14 1996  Ian Lance Taylor  <[email protected]>
+
+       * cpu-powerpc.c (arch_info_struct): Change last entry to not point
+       back to first.
+       (bfd_powerpc_arch): Point at first entry in arch_info_struct.
+
+Tue Jan 16 15:10:49 1996  Ian Lance Taylor  <[email protected]>
+
+       * elf.c (assign_file_positions_for_segments): Don't increment file
+       offset for a segment which contains no loadable sections.
+
+Mon Jan 15 17:46:27 1996  Michael Meissner  <[email protected]>
+
+       * reloc.c: Add new PowerPC relocations.
+       * {bfd-in2,libbfd}.h: Regenerate.
+
+       * elf32-ppc.c (ppc_elf_howto_raw): Add more PPC relocations.
+       (ppc_elf_reloc_type_lookup): Lookup new relocations.
+
+Mon Jan 15 14:29:44 1996  Ian Lance Taylor  <[email protected]>
+
+       * aoutx.h (howto_table_ext): Fix RELOC_BASE10 and RELOC_BASE22
+       entries.
+
+       * sunos.c (sunos_scan_ext_relocs): Don't fail assert if
+        info->shared.
+
+       * coffgen.c (coff_find_nearest_line): Don't try to cache
+       information in sections that are not owned by a BFD.  From Richard
+       Henderson <[email protected]>.
+
+       * elf32-mips.c: Numerous changes to dynamic linking code, mostly
+       from Kazumoto Kojima <[email protected]>.
+       * elflink.h (elf_link_output_extsym): Remove special check for
+       _rld_new_interface.
+
+       * ecoffswap.h: Add prototypes for static functions.
+
+Sun Jan 14 21:36:08 1996  Michael Meissner  <[email protected]>
+
+       * elf32-ppc.c (ppc_elf_{unsupported,std}_reloc): Remove functions.
+       (ppc_elf_howto_raw): Remove ppc_elf_{unsupported,std}_reloc
+       references.
+       (ppc_elf_relocate_section):  No longer allow .sdata/.sbss sections
+       to satisfy a TOC16 relocation.  Rewrite unsupported relocation
+       support.  Begin support for R_PPC_SDA{2,}REL.
+
+Sat Jan 13 09:36:52 1996  Michael Meissner  <[email protected]>
+
+       * elf32-ppc.c (ppc_elf_create_dynamic_sections): New function to
+       create the .got and .got.neg sections.
+       (ppc_elf_size_dynamic_sections): Call it.
+       (ppc_elf_check_relocs): Call it.
+       (ppc_elf_size_dynamic_sections): Support .got.neg, just like .got.
+       (ppc_elf_check_relocs): Add error messages for relocations we
+       don't yet support.  Do not include R_PPC_SDAREL16 like a GOT
+       relocation.
+
+Fri Jan 12 15:27:59 1996  Michael Meissner  <[email protected]>
+
+       * elf32-ppc.c (ppc_elf_fake_sections): Define, and handle the new
+       section flags for V.4 and eabi.
+
+Fri Jan 12 13:59:16 1996  Ian Lance Taylor  <[email protected]>
+
+       * elf.c (assign_file_positions_for_segments): If a segment
+       contains no sections, don't mark it as readable.
+
+       * elf-bfd.h (_bfd_elf_section_from_bfd_section): Declare.
+       * elfcode.h (_bfd_elf_section_from_bfd_section): Don't declare.
+
+       * elf.c (_bfd_elf_print_private_bfd_data): Dump contents of
+       dynamic section, if there is one.
+       * elf-bfd.h (struct elf_size_info): Add swap_dyn_in field.
+       (bfd_elf32_swap_dyn_in): Change type of second parameter to PTR.
+       (bfd_elf64_swap_dyn_in): Likewise.
+       * elfcode.h (elf_swap_dyn_in): Change type of second parameter to
+       PTR.
+       (NAME(_bfd_elf,size_info)): Initialize swap_dyn_in field.
+
+       * elf32-i386.c (elf_i386_size_dynamic_sections): Don't create a
+       DT_TEXTREL entry because of .rel.plt.  From Martin Pirker
+       <[email protected]>.
+
+Thu Jan 11 17:06:14 1996  Michael Meissner  <[email protected]>
+
+       * section.c (SEC_{EXCLUDE,SORT_ENTRIES}): New section flags for
+       PowerPC V.4 and eabi.
+       * bfd-in2.h: Regenerate.
+       * libfd.h: Regenerate.
+
+       * elfxx-target.h (TARGET_{BIG,LITTLE}_SYM): Add new flags.
+
+       * elf32-ppc.c (ppc_elf_section_from_shdr): Support SHT_ORDERED
+       section type and SHF_EXCLUDE section flag, turning them into the
+       appropriate bfd section flag.
+
+Thu Jan 11 11:23:30 1996  Ian Lance Taylor  <[email protected]>
+
+       * xcofflink.c (xcoff_link_add_symbols): Create the special
+       sections if we see a DYNAMIC object, in case that is the only
+       XCOFF input object we see.
+       
+       * elf32-mips.c: Extensive changes for a start at dynamic linking
+       support, from Kazumoto Kojima <[email protected]>.
+
+       * elf-bfd.h (struct elf_backend_data): Add type_change_ok field.
+       (struct elf_backend_data): Remove
+       elf_backend_create_program_headers field.  Add
+       elf_backend_additional_program_headers and
+       elf_backend_modify_segment_map fields.
+       * elfxx-target.h (elf_backend_type_change_ok): Define if not
+       defined.
+       (elf_backend_additional_program_headers): Likewise.
+       (elf_backend_modify_segment_map): Likewise.
+       (elf_backend_create_program_headers): Don't define.
+       (elfNN_bed): Change to account for field changes.
+       * elf.c (assign_file_positions_for_segments): Call new
+       modify_segment_map backend function.  Don't call old
+       create_program_headers backend function.
+       (get_program_header_size): Call additional_program_headers rather
+       than create_program_headers.
+       * elflink.h (elf_link_add_object_symbols): Initialize
+       type_change_ok from new backend field.
+       (elf_link_output_extsym): Don't warn if _rld_new_interface is
+       defined.
+       (elf_reloc_link_order): Treat a reloc against a defined symbol as
+       a reloc against the appropriate section.
+
+       * elf-bfd.h (struct bfd_elf_section_data): Add tdata field.
+       (struct elf_obj_tdata): Rename ppc_flags_init field to flags_init.
+       (elf_flags_init): Rename from elf_ppc_flags_init.
+       * elf32-ppc.c (ppc_elf_set_private_flags): Use elf_flags_init, not
+       elf_ppc_flags_init.
+       (ppc_elf_copy_private_bfd_data): Likewise.
+       (ppc_elf_merge_private_bfd_data): Likewise.
+
+       * elf32-m68k.c (howto_table): Change src_mask to 0 for all
+       relocation entries.
+
+Tue Jan  9 15:22:53 1996  David Mosberger-Tang  <[email protected]>
+
+       * coff-alpha.c (alpha_relocate_section): During final link, allow
+       output .lita section to be bigger than 64k by adjusting gp value
+       on a per-input section basis.
+       * libecoff.h (struct ecoff_tdata): Add issued_multiple_gp_warning
+       field.
+       (struct ecoff_section_tdata): Add gp field.
+
+Tue Jan  9 12:00:36 1996  Ian Lance Taylor  <[email protected]>
+
+       Handle Alpha ECOFF changes in OSF/1 3.2.
+       * libecoff.h (struct ecoff_backend_data): Add get_elt_at_filepos
+       field.
+       * coff-alpha.c: Include "aout/ar.h".
+       (alpha_ecoff_get_relocated_section_contents): Don't require an
+       ALPHA_R_IGNORE reloc after an ALPHA_R_GPDISP reloc, since OSF/1
+       3.2 doesn't generate one.
+       (alpha_relocate_section): Likewise.
+       (alpha_ecoff_slurp_armap): Define.
+       (alpha_ecoff_slurp_extended_name_table): Define.
+       (alpha_ecoff_construct_extended_name_table): Define.
+       (alpha_ecoff_truncate_arname): Define.
+       (alpha_ecoff_write_armap): Define.
+       (alpha_ecoff_generic_stat_arch_elt): Define.
+       (alpha_ecoff_update_armap_timestamp): Define.
+       (ARFZMAG): Define.
+       (alpha_ecoff_read_ar_hdr): New static function.
+       (alpha_ecoff_get_elt_at_filepos): New static function.
+       (alpha_ecoff_openr_next_archived_file): New static function.
+       (alpha_ecoff_get_elt_at_index): New static function.
+       (alpha_ecoff_backend_data): Initialize get_elt_at_filepos field.
+       (ecoffalpha_little_vec): Change BFD_JUMP_TABLE_ARCHIVE from
+       _bfd_ecoff to alpha_ecoff.
+       * ecoff.c (ecoff_link_add_archive_symbols): Use get_elt_at_filepos
+       field from backend structure, rather than always calling
+       _bfd_get_elt_at_filepos.
+       * coff-mips.c (mips_ecoff_backend_data): Initialize
+       get_elt_at_filepos field.
+       * archive.c (_bfd_generic_read_ar_hdr_mag): New function, copied
+       from _bfd_generic_read_ar_hdr with minor changes.
+       (_bfd_generic_read_ar_hdr): Use _bfd_generic_read_ar_hdr_mag.
+       * libbfd-in.h (_bfd_generic_read_ar_hdr_mag): Declare.
+       * libbfd.h: Rebuild.
+
+       * bfd-in.h (BFD_IN_MEMORY): Define.
+       * libbfd-in.h (struct bfd_in_memory): Define.
+       * libbfd.c (bfd_read): Handle BFD_IN_MEMORY flag.
+       (bfd_get_file_window): Don't try to map a BFD_IN_MEMORY file.
+       (bfd_write, bfd_stat): Abort if BFD_IN_MEMORY is set.
+       (bfd_tell, bfd_flush, bfd_seek): Handle BFD_IN_MEMORY flag.
+       * bfd.c (struct _bfd): Change iostream field from char * to PTR.
+       (bfd_get_size): Handle BFD_IN_MEMORY flag.
+       * cache.c (bfd_cache_close): Ignore BFD_IN_MEMORY files.
+       (bfd_open_file): Cast to PTR, not char *, when setting iostream.
+       (bfd_cache_lookup_worker): Abort if BFD_IN_MEMORY is set.
+       * opncls.c (bfd_fdopenr): Cast to PTR, not char *, when setting
+       iostream.
+       (bfd_openstreamr): Likewise.
+       * aoutx.h (NAME(aout,some_aout_object_p)): Only fstat iostream if
+       BFD_IN_MEMORY is not set.
+       * riscix.c (riscix_some_aout_object_p): Likewise.
+       * bfd-in2.h, libbfd.h: Rebuild.
+
+       * targets.c (bfd_target): Add _bfd_get_elt_at_index field.
+       (BFD_JUMP_TABLE_ARCHIVE): Add _get_elt_at_index.
+       (bfd_get_elt_at_index): Define.
+       * archive.c (_bfd_generic_get_elt_at_index): Rename from
+       bfd_get_elt_at_index.  Change index parameter from int to
+       symindex.
+       * libbfd-in.h (_bfd_generic_get_elt_at_index): Declare.
+       (_bfd_noarchive_get_elt_at_index): Define.
+       (_bfd_archive_bsd_get_elt_at_index): Define.
+       (_bfd_archive_coff_get_elt_at_index): Define.
+       * bfd-in2.h, libbfd.h: Rebuild.
+       * aout-target.h (MY_get_elt_at_index): Define if not defined.
+       * coff-rs6000.c (xcoff_get_elt_at_index): Define.
+       * ieee.c (ieee_get_elt_at_index): Define.
+       * libecoff.h (_bfd_ecoff_get_elt_at_index): Define.
+       * oasys.c (oasys_get_elt_at_index): Define.
+       * som.c (som_get_elt_at_index): Define.
+
+       * ecoff.c (_bfd_ecoff_find_nearest_line): Don't restrict line
+       numbers to the .text section.
+
+Mon Jan  8 17:00:57 1996  Ian Lance Taylor  <[email protected]>
+
+       * ieee.c (ieee_write_debug_part): Change return type to boolean.
+       If there is a SEC_DEBUGGING section, get the contents of the debug
+       information part from it.
+       (ieee_set_section_contents): Store the contents of a SEC_DEBUGGING
+       section in memory.
+       (ieee_write_object_contents): Check ieee_write_debug_part return.
+
+Thu Jan  4 17:12:37 1996  Fred Fish  <[email protected]>
+
+       * config.bfd (i[345]86-*-freebsd*): Add target.
+       * configure.in (i386freebsd_vec): Add vec.
+       * configure: Regenerate.
+       * Makefile.in (BFD32_BACKENDS): Add i386freebsd.o.
+       (BFD32_BACKENDS_CFILES): Add i386freebsd.c.
+       Rebuild dependencies..
+       * freebsd.h: New file.
+       * i386freebsd.c: New file.
+       * targets.c (i386freebsd_vec): Declare.
+       (bfd_target_vector): Add i386freebsd_vec.
+       * i386linux.c (SEGMENT_SIZE): Define as TARGET_PAGE_SIZE
+       * i386netbsd.c (SEGMENT_SIZE):  Define as TARGET_PAGE_SIZE
+       
+Thu Jan  4 16:27:46 1996  Ian Lance Taylor  <[email protected]>
+
+       * ieee.c (ieee_slurp_debug): New static function.
+       (ieee_object_p): Call it.
+       (ieee_slurp_section_data): Skip debugging sections.
+       (ieee_get_reloc_upper_bound): Likewise.
+       (ieee_get_section_contents): Likewise.
+       (ieee_canonicalize_reloc): Likewise.
+       (ieee_write_section_part): Likewise.
+       (ieee_write_debug_part): Likewise.
+       (ieee_write_data_part): Likewise.
+       (init_for_output): Likewise.
+
+Wed Jan  3 19:42:47 1996  Michael Meissner  <[email protected]>
+
+       * elf32-ppc.c (ppc_elf_relocate_section): Make @GOT relocations
+       work.
+       (ppc_elf_howto_raw): Just use bfd_elf_generic_reloc for all howto
+       relocs, since ppc_elf_relocate_section handles the linker case.
+       (ppc_elf_{addr16_ha,got16,toc16,brtaken}_reloc): Delete, no longer
+       used.
+       (ppc_elf_{addr16_ha,got16,toc16,brtaken}_inner): Merge these into
+       ppc_elf_relocate_section since that is now the only caller.
+       (ppc_elf_relocate_section): Ditto.
+
+Wed Jan  3 15:11:30 1996  Ian Lance Taylor  <[email protected]>
+
+       * coffcode.h (coff_write_object_contents): If we don't know the
+       section of the entry point for an XCOFF executable, always set the
+       entry address to -1.
+
+Tue Jan  2 14:17:15 1996  Michael Meissner  <[email protected]>
+
+       * elf.c (bfd_section_from_shdr): Add support for note sections.
+
+Tue Jan  2 13:10:25 1996  Ian Lance Taylor  <[email protected]>
+
+       * bfd-in.h (struct _symbol_info): Add stab_type field.
+       * bfd-in2.h: Rebuild.
+       * aoutx.h (NAME(aout,get_symbol_info)): Set stab_type.
+
+       * elf32-ppc.c: Remove trailing newline from calls to
+        _bfd_error_handler.
+       (ppc_elf_merge_private_bfd_data): Only warn about endianness
+       difference if target endianness is known.
+
+Thu Dec 21 12:43:49 1995  Michael Meissner  <[email protected]>
+
+       * elf32-ppc.c (ppc_elf_howto_raw): Add a phony reloc to handle the
+       old style TOC16 references without using R_PPC_GOT.
+       (ppc_reloc_type): Ditto.
+       (ppc_elf_reloc_type_lookup): Add support for TOC16.
+       (ppc_elf_toc16_inner): Renamed from ppc_elf_got16_inner.
+       (ppc_elf_toc16_reloc): Renamed from ppc_elf_toc16_reloc.
+       (ppc_elf_got16_{inner,reloc}): Stubs for real GOT support.
+       (ppc_elf_check_relocs): New function for GOT/PLT support that is
+       work in progress.
+       (ppc_elf_adjust_dynamic_symbol): Ditto.
+       (ppc_elf_adjust_dynindx): Ditto.
+       (ppc_elf_size_dynamic_sections): Ditto.
+       (ppc_elf_finish_dynamic_symbol): Ditto.
+       (ppc_elf_finish_dynamic_sections): Ditto.
+       (ELF_DYNAMIC_INTERPRETER): Define.
+
+Wed Dec 20 19:14:18 1995  Ken Raeburn  <[email protected]>
+
+       * elf.c (copy_private_bfd_data): When attaching sections to
+       segments ignore sections that won't be allocated.  Patch from
+       Andreas Schwab.
+
+Tue Dec 19 20:01:43 1995  Ken Raeburn  <[email protected]>
+
+       * config.bfd: Match on m68k-cbm-* only if OS doesn't match
+       anything else.
+
+Tue Dec 19 16:38:59 1995  Ian Lance Taylor  <[email protected]>
+
+       * coff-i960.c (CALC_ADDEND): Define.
+       (coff_i960_relocate_section): Add the input section VMA to the
+       addend for PC relative relocs.
+
+Sun Dec 17 20:11:55 1995  Kim Knuttila  <[email protected]>
+
+       * peicode.h (pe_print_pdata): Must test the entire entry for zero
+       to correctly terminate.
+
+Fri Dec 15 12:05:57 1995  Ian Lance Taylor  <[email protected]>
+
+       * targets.c (enum bfd_endian): Define.
+       (bfd_target): Rename byteorder_big_p to byteorder, and change it
+       from boolean to enum bfd_endian.  Change header_byteorder_big_p
+       correspondingly.
+       * bfd-in.h (bfd_big_endian, bfd_little_endian): New macros.
+       (bfd_header_big_endian, bfd_header_little_endian): New macros.
+       * bfd-in2.h: Rebuild.
+       * All targets: Change initialization of byteorder and
+       header_byteorder to use enum bfd_endian values rather than
+       booleans.
+       * All files: Change all references to byteorder_big_p and
+       header_byteorder_big_p to use new bfd_*_endian macros.
+
+       * coffgen.c (make_a_section_from_file): Set lma to s_paddr, not
+       s_vaddr.
+       * coffcode.h (coff_write_object_contents): Set s_paddr to lma, not
+       vma.
+       * ecoff.c (_bfd_ecoff_write_object_contents): Likewise.
+
+Fri Dec 15 07:32:09 1995  steve chamberlain  <[email protected]>
+
+       * pe[i]-i386.c (TARGET_UNDERSCORE): Define to '_'.
+
+Thu Dec 14 13:45:37 1995  Ian Lance Taylor  <[email protected]>
+
+       * ieee.c: Lots of minor cleanups.  Make many functions return
+       errors rather than calling abort.  Also:
+       (ieee_write_twobyte): Remove; change callers to call existing
+       ieee_write_2bytes function.
+       (ieee_write_expression): Don't output the section twice when
+       outputting a local symbol.  Don't emit an extraneous zero if there
+       is only one term.
+       (ieee_slurp_sections): Set the lma as well as the vma.
+       (ieee_archive_p): Use bfd_alloc_grow rather than an obstack.
+
+       * ihex.c (ihex_set_arch_mach): Don't accept any architecture, just
+       a recognized one or bfd_arch_unknown.
+       (ihex_get_symtab_upper_bound): Define as bfd_0l, to permit objcopy
+       to succeed.
+       (ihex_get_symtab): Likewise.
+
+Wed Dec 13 15:44:06 1995  Ian Lance Taylor  <[email protected]>
+
+       * aoutx.h: Include <ctype.h>.
+       (struct aout_link_includes_table): Define.
+       (struct aout_link_includes_totals): Define.
+       (struct aout_link_includes_entry): Define.
+       (aout_link_includes_lookup): Define macro.
+       (struct aout_final_link_info): Add includes field.
+       (aout_link_includes_newfunc): New static function.
+       (NAME(aout,final_link)): Initialize includes hash table.
+       (aout_link_write_symbols): Eliminate duplicate N_BINCL entries.
+
+Wed Dec 13 10:52:14 1995  Stan Shebs  <[email protected]>
+
+       * mpw-config.in: Match on mips-*-* instead of mips-idt-ecoff.
+
 Wed Dec 13 11:07:45 1995  Kim Knuttila  <[email protected]>
 
        * coff-ppc.c (coff_ppc_relocate_section): removed debugging code.
This page took 0.033118 seconds and 4 git commands to generate.