Add 'Chnages in 2.13' to NEWS files.
[deliverable/binutils-gdb.git] / bfd / reloc.c
index a9252b7f186b00ae1f917ed003b67de6927e101d..2e10dce34d697a833384ebdebe0acb1dbe8f7230 100644 (file)
@@ -1,6 +1,6 @@
 /* BFD support for handling relocation entries.
    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001
+   2000, 2001, 2002
    Free Software Foundation, Inc.
    Written by Cygnus Support.
 
@@ -65,25 +65,25 @@ CODE_FRAGMENT
 .
 .typedef enum bfd_reloc_status
 .{
-.  {* No errors detected *}
+.  {* No errors detected *}
 .  bfd_reloc_ok,
 .
-.  {* The relocation was performed, but there was an overflow. *}
+.  {* The relocation was performed, but there was an overflow.  *}
 .  bfd_reloc_overflow,
 .
-.  {* The address to relocate was not within the section supplied. *}
+.  {* The address to relocate was not within the section supplied.  *}
 .  bfd_reloc_outofrange,
 .
-.  {* Used by special functions *}
+.  {* Used by special functions *}
 .  bfd_reloc_continue,
 .
-.  {* Unsupported relocation size requested. *}
+.  {* Unsupported relocation size requested.  *}
 .  bfd_reloc_notsupported,
 .
-.  {* Unused *}
+.  {* Unused *}
 .  bfd_reloc_other,
 .
-.  {* The symbol to relocate against was undefined. *}
+.  {* The symbol to relocate against was undefined.  *}
 .  bfd_reloc_undefined,
 .
 .  {* The relocation was performed, but may not be ok - presently
@@ -97,20 +97,21 @@ CODE_FRAGMENT
 .
 .typedef struct reloc_cache_entry
 .{
-.  {* A pointer into the canonical table of pointers  *}
+.  {* A pointer into the canonical table of pointers.  *}
 .  struct symbol_cache_entry **sym_ptr_ptr;
 .
-.  {* offset in section *}
+.  {* offset in section *}
 .  bfd_size_type address;
 .
-.  {* addend for relocation value *}
+.  {* addend for relocation value *}
 .  bfd_vma addend;
 .
-.  {* Pointer to how to perform the required relocation *}
+.  {* Pointer to how to perform the required relocation *}
 .  reloc_howto_type *howto;
 .
-.} arelent;
-
+.}
+.arelent;
+.
 */
 
 /*
@@ -250,19 +251,19 @@ CODE_FRAGMENT
 .
 .enum complain_overflow
 .{
-.  {* Do not complain on overflow. *}
+.  {* Do not complain on overflow.  *}
 .  complain_overflow_dont,
 .
 .  {* Complain if the bitfield overflows, whether it is considered
-.     as signed or unsigned. *}
+.     as signed or unsigned.  *}
 .  complain_overflow_bitfield,
 .
 .  {* Complain if the value overflows when considered as signed
-.     number. *}
+.     number.  *}
 .  complain_overflow_signed,
 .
 .  {* Complain if the value overflows when considered as an
-.     unsigned number. *}
+.     unsigned number.  *}
 .  complain_overflow_unsigned
 .};
 
@@ -276,7 +277,7 @@ SUBSUBSECTION
         information that libbfd needs to know to tie up a back end's data.
 
 CODE_FRAGMENT
-.struct symbol_cache_entry;            {* Forward declaration *}
+.struct symbol_cache_entry;            {* Forward declaration *}
 .
 .struct reloc_howto_struct
 .{
@@ -366,7 +367,7 @@ CODE_FRAGMENT
 .     empty (e.g., m88k bcs); this flag signals the fact.  *}
 .  boolean pcrel_offset;
 .};
-
+.
 */
 
 /*
@@ -413,7 +414,7 @@ DESCRIPTION
 .          }                                             \
 .      }                                                 \
 .  }
-
+.
 */
 
 /*
@@ -457,8 +458,9 @@ DESCRIPTION
 .{
 .  arelent relent;
 .  struct relent_chain *next;
-.} arelent_chain;
-
+.}
+.arelent_chain;
+.
 */
 
 /* N_ONES produces N one bits, without overflowing machine arithmetic.  */
@@ -627,8 +629,8 @@ bfd_perform_relocation (abfd, reloc_entry, data, input_section, output_bfd,
     }
 
   /* Is the address of the relocation really within the section?  */
-  if (reloc_entry->address > input_section->_cooked_size /
-      bfd_octets_per_byte (abfd))
+  if (reloc_entry->address > (input_section->_cooked_size
+                             / bfd_octets_per_byte (abfd)))
     return bfd_reloc_outofrange;
 
   /* Work out which section the relocation is targetted at and the
@@ -643,7 +645,7 @@ bfd_perform_relocation (abfd, reloc_entry, data, input_section, output_bfd,
   reloc_target_output_section = symbol->section->output_section;
 
   /* Convert input-section-relative symbol value to absolute.  */
-  if (output_bfd && howto->partial_inplace == false)
+  if (output_bfd && ! howto->partial_inplace)
     output_base = 0;
   else
     output_base = reloc_target_output_section->vma;
@@ -656,7 +658,7 @@ bfd_perform_relocation (abfd, reloc_entry, data, input_section, output_bfd,
   /* Here the variable relocation holds the final address of the
      symbol we are relocating against, plus any addend.  */
 
-  if (howto->pc_relative == true)
+  if (howto->pc_relative)
     {
       /* This is a PC relative relocation.  We want to set RELOCATION
         to the distance between the address of the symbol and the
@@ -689,13 +691,13 @@ bfd_perform_relocation (abfd, reloc_entry, data, input_section, output_bfd,
       relocation -=
        input_section->output_section->vma + input_section->output_offset;
 
-      if (howto->pcrel_offset == true)
+      if (howto->pcrel_offset)
        relocation -= reloc_entry->address;
     }
 
   if (output_bfd != (bfd *) NULL)
     {
-      if (howto->partial_inplace == false)
+      if (! howto->partial_inplace)
        {
          /* This is a partial relocation, and we want to apply the relocation
             to the reloc entry rather than the raw data. Modify the reloc
@@ -819,11 +821,9 @@ space consuming.  For each target:
                               bfd_arch_bits_per_address (abfd),
                               relocation);
 
-  /*
-    Either we are relocating all the way, or we don't want to apply
-    the relocation to the reloc entry (probably because there isn't
-    any room in the output format to describe addends to relocs)
-    */
+  /* Either we are relocating all the way, or we don't want to apply
+     the relocation to the reloc entry (probably because there isn't
+     any room in the output format to describe addends to relocs).  */
 
   /* The cast to bfd_vma avoids a bug in the Alpha OSF/1 C compiler
      (OSF version 1.3, compiler version 3.11).  It miscompiles the
@@ -850,11 +850,10 @@ space consuming.  For each target:
 
   relocation >>= (bfd_vma) howto->rightshift;
 
-  /* Shift everything up to where it's going to be used */
-
+  /* Shift everything up to where it's going to be used.  */
   relocation <<= (bfd_vma) howto->bitpos;
 
-  /* Wait for the day when all have the mask in them */
+  /* Wait for the day when all have the mask in them */
 
   /* What we do:
      i instruction to be left alone
@@ -975,7 +974,6 @@ DESCRIPTION
 
        For now, this function should be considered reserved for the
        assembler.
-
 */
 
 bfd_reloc_status_type
@@ -1023,7 +1021,8 @@ bfd_install_relocation (abfd, reloc_entry, data_start, data_start_offset,
     }
 
   /* Is the address of the relocation really within the section?  */
-  if (reloc_entry->address > input_section->_cooked_size)
+  if (reloc_entry->address > (input_section->_cooked_size
+                             / bfd_octets_per_byte (abfd)))
     return bfd_reloc_outofrange;
 
   /* Work out which section the relocation is targetted at and the
@@ -1038,7 +1037,7 @@ bfd_install_relocation (abfd, reloc_entry, data_start, data_start_offset,
   reloc_target_output_section = symbol->section->output_section;
 
   /* Convert input-section-relative symbol value to absolute.  */
-  if (howto->partial_inplace == false)
+  if (! howto->partial_inplace)
     output_base = 0;
   else
     output_base = reloc_target_output_section->vma;
@@ -1051,7 +1050,7 @@ bfd_install_relocation (abfd, reloc_entry, data_start, data_start_offset,
   /* Here the variable relocation holds the final address of the
      symbol we are relocating against, plus any addend.  */
 
-  if (howto->pc_relative == true)
+  if (howto->pc_relative)
     {
       /* This is a PC relative relocation.  We want to set RELOCATION
         to the distance between the address of the symbol and the
@@ -1084,11 +1083,11 @@ bfd_install_relocation (abfd, reloc_entry, data_start, data_start_offset,
       relocation -=
        input_section->output_section->vma + input_section->output_offset;
 
-      if (howto->pcrel_offset == true && howto->partial_inplace == true)
+      if (howto->pcrel_offset && howto->partial_inplace)
        relocation -= reloc_entry->address;
     }
 
-  if (howto->partial_inplace == false)
+  if (! howto->partial_inplace)
     {
       /* This is a partial relocation, and we want to apply the relocation
         to the reloc entry rather than the raw data. Modify the reloc
@@ -1104,7 +1103,6 @@ bfd_install_relocation (abfd, reloc_entry, data_start, data_start_offset,
 
         If we've relocated with a symbol with a section, change
         into a ref to the section belonging to the symbol.  */
-
       reloc_entry->address += input_section->output_offset;
 
       /* WTF?? */
@@ -1180,8 +1178,7 @@ space consuming.  For each target:
     6) if the resulting object files are the same, you have at least
        made it no worse
     7) if they are different you have to figure out which version is
-       right
-*/
+       right.  */
          relocation -= reloc_entry->addend;
 #endif
          reloc_entry->addend = 0;
@@ -1206,11 +1203,9 @@ space consuming.  For each target:
                               bfd_arch_bits_per_address (abfd),
                               relocation);
 
-  /*
-    Either we are relocating all the way, or we don't want to apply
-    the relocation to the reloc entry (probably because there isn't
-    any room in the output format to describe addends to relocs)
-    */
+  /* Either we are relocating all the way, or we don't want to apply
+     the relocation to the reloc entry (probably because there isn't
+     any room in the output format to describe addends to relocs).  */
 
   /* The cast to bfd_vma avoids a bug in the Alpha OSF/1 C compiler
      (OSF version 1.3, compiler version 3.11).  It miscompiles the
@@ -1237,11 +1232,10 @@ space consuming.  For each target:
 
   relocation >>= (bfd_vma) howto->rightshift;
 
-  /* Shift everything up to where it's going to be used */
-
+  /* Shift everything up to where it's going to be used.  */
   relocation <<= (bfd_vma) howto->bitpos;
 
-  /* Wait for the day when all have the mask in them */
+  /* Wait for the day when all have the mask in them */
 
   /* What we do:
      i instruction to be left alone
@@ -1855,6 +1849,8 @@ ENUMX
 ENUMEQX
   BFD_RELOC_SPARC_DISP64
   BFD_RELOC_64_PCREL
+ENUMX
+  BFD_RELOC_SPARC_PLT32
 ENUMX
   BFD_RELOC_SPARC_PLT64
 ENUMX
@@ -1959,6 +1955,42 @@ ENUMDOC
   The GPREL_HI/LO relocations together form a 32-bit offset from the
      GP register.
 
+ENUM
+  BFD_RELOC_ALPHA_BRSGP
+ENUMDOC
+  Like BFD_RELOC_23_PCREL_S2, except that the source and target must
+  share a common GP, and the target address is adjusted for 
+  STO_ALPHA_STD_GPLOAD.
+
+ENUM
+  BFD_RELOC_ALPHA_TLSGD
+ENUMX
+  BFD_RELOC_ALPHA_TLSLDM
+ENUMX
+  BFD_RELOC_ALPHA_DTPMOD64
+ENUMX
+  BFD_RELOC_ALPHA_GOTDTPREL16
+ENUMX
+  BFD_RELOC_ALPHA_DTPREL64
+ENUMX
+  BFD_RELOC_ALPHA_DTPREL_HI16
+ENUMX
+  BFD_RELOC_ALPHA_DTPREL_LO16
+ENUMX
+  BFD_RELOC_ALPHA_DTPREL16
+ENUMX
+  BFD_RELOC_ALPHA_GOTTPREL16
+ENUMX
+  BFD_RELOC_ALPHA_TPREL64
+ENUMX
+  BFD_RELOC_ALPHA_TPREL_HI16
+ENUMX
+  BFD_RELOC_ALPHA_TPREL_LO16
+ENUMX
+  BFD_RELOC_ALPHA_TPREL16
+ENUMDOC
+  Alpha thread-local storage relocations.
+
 ENUM
   BFD_RELOC_MIPS_JMP
 ENUMDOC
@@ -1999,12 +2031,6 @@ ENUM
 ENUMDOC
   Like BFD_RELOC_LO16, but PC relative.
 
-ENUMEQ
-  BFD_RELOC_MIPS_GPREL
-  BFD_RELOC_GPREL16
-ENUMDOC
-  Relocation relative to the global pointer.
-
 ENUM
   BFD_RELOC_MIPS_LITERAL
 ENUMDOC
@@ -2014,9 +2040,6 @@ ENUM
   BFD_RELOC_MIPS_GOT16
 ENUMX
   BFD_RELOC_MIPS_CALL16
-ENUMEQX
-  BFD_RELOC_MIPS_GPREL32
-  BFD_RELOC_GPREL32
 ENUMX
   BFD_RELOC_MIPS_GOT_HI16
 ENUMX
@@ -2056,6 +2079,28 @@ ENUMX
 ENUMX
   BFD_RELOC_MIPS_JALR
 COMMENT
+ENUM
+  BFD_RELOC_FRV_LABEL16
+ENUMX
+  BFD_RELOC_FRV_LABEL24
+ENUMX
+  BFD_RELOC_FRV_LO16
+ENUMX
+  BFD_RELOC_FRV_HI16
+ENUMX
+  BFD_RELOC_FRV_GPREL12
+ENUMX
+  BFD_RELOC_FRV_GPRELU12
+ENUMX
+  BFD_RELOC_FRV_GPREL32
+ENUMX
+  BFD_RELOC_FRV_GPRELHI
+ENUMX
+  BFD_RELOC_FRV_GPRELLO
+ENUMDOC
+  Fujitsu Frv Relocations.
+COMMENT
+COMMENT
 ENUMDOC
   MIPS ELF relocations.
 
@@ -2077,6 +2122,24 @@ ENUMX
   BFD_RELOC_386_GOTOFF
 ENUMX
   BFD_RELOC_386_GOTPC
+ENUMX
+  BFD_RELOC_386_TLS_LE
+ENUMX
+  BFD_RELOC_386_TLS_GD
+ENUMX
+  BFD_RELOC_386_TLS_LDM
+ENUMX
+  BFD_RELOC_386_TLS_LDO_32
+ENUMX
+  BFD_RELOC_386_TLS_IE_32
+ENUMX
+  BFD_RELOC_386_TLS_LE_32
+ENUMX
+  BFD_RELOC_386_TLS_DTPMOD32
+ENUMX
+  BFD_RELOC_386_TLS_DTPOFF32
+ENUMX
+  BFD_RELOC_386_TLS_TPOFF32
 ENUMDOC
   i386/elf relocations
 
@@ -2392,6 +2455,104 @@ ENUMX
   BFD_RELOC_SH_RELATIVE
 ENUMX
   BFD_RELOC_SH_GOTPC
+ENUMX
+  BFD_RELOC_SH_GOT_LOW16
+ENUMX
+  BFD_RELOC_SH_GOT_MEDLOW16
+ENUMX
+  BFD_RELOC_SH_GOT_MEDHI16
+ENUMX
+  BFD_RELOC_SH_GOT_HI16
+ENUMX
+  BFD_RELOC_SH_GOTPLT_LOW16
+ENUMX
+  BFD_RELOC_SH_GOTPLT_MEDLOW16
+ENUMX
+  BFD_RELOC_SH_GOTPLT_MEDHI16
+ENUMX
+  BFD_RELOC_SH_GOTPLT_HI16
+ENUMX
+  BFD_RELOC_SH_PLT_LOW16
+ENUMX
+  BFD_RELOC_SH_PLT_MEDLOW16
+ENUMX
+  BFD_RELOC_SH_PLT_MEDHI16
+ENUMX
+  BFD_RELOC_SH_PLT_HI16
+ENUMX
+  BFD_RELOC_SH_GOTOFF_LOW16
+ENUMX
+  BFD_RELOC_SH_GOTOFF_MEDLOW16
+ENUMX
+  BFD_RELOC_SH_GOTOFF_MEDHI16
+ENUMX
+  BFD_RELOC_SH_GOTOFF_HI16
+ENUMX
+  BFD_RELOC_SH_GOTPC_LOW16
+ENUMX
+  BFD_RELOC_SH_GOTPC_MEDLOW16
+ENUMX
+  BFD_RELOC_SH_GOTPC_MEDHI16
+ENUMX
+  BFD_RELOC_SH_GOTPC_HI16
+ENUMX
+  BFD_RELOC_SH_COPY64
+ENUMX
+  BFD_RELOC_SH_GLOB_DAT64
+ENUMX
+  BFD_RELOC_SH_JMP_SLOT64
+ENUMX
+  BFD_RELOC_SH_RELATIVE64
+ENUMX
+  BFD_RELOC_SH_GOT10BY4
+ENUMX
+  BFD_RELOC_SH_GOT10BY8
+ENUMX
+  BFD_RELOC_SH_GOTPLT10BY4
+ENUMX
+  BFD_RELOC_SH_GOTPLT10BY8
+ENUMX
+  BFD_RELOC_SH_GOTPLT32
+ENUMX
+  BFD_RELOC_SH_SHMEDIA_CODE
+ENUMX
+  BFD_RELOC_SH_IMMU5
+ENUMX
+  BFD_RELOC_SH_IMMS6
+ENUMX
+  BFD_RELOC_SH_IMMS6BY32
+ENUMX
+  BFD_RELOC_SH_IMMU6
+ENUMX
+  BFD_RELOC_SH_IMMS10
+ENUMX
+  BFD_RELOC_SH_IMMS10BY2
+ENUMX
+  BFD_RELOC_SH_IMMS10BY4
+ENUMX
+  BFD_RELOC_SH_IMMS10BY8
+ENUMX
+  BFD_RELOC_SH_IMMS16
+ENUMX
+  BFD_RELOC_SH_IMMU16
+ENUMX
+  BFD_RELOC_SH_IMM_LOW16
+ENUMX
+  BFD_RELOC_SH_IMM_LOW16_PCREL
+ENUMX
+  BFD_RELOC_SH_IMM_MEDLOW16
+ENUMX
+  BFD_RELOC_SH_IMM_MEDLOW16_PCREL
+ENUMX
+  BFD_RELOC_SH_IMM_MEDHI16
+ENUMX
+  BFD_RELOC_SH_IMM_MEDHI16_PCREL
+ENUMX
+  BFD_RELOC_SH_IMM_HI16
+ENUMX
+  BFD_RELOC_SH_IMM_HI16_PCREL
+ENUMX
+  BFD_RELOC_SH_PT_16
 ENUMDOC
   Hitachi SH relocs.  Not all of these appear in object files.
 
@@ -2504,6 +2665,19 @@ ENUM
 ENUMDOC
   This is a 32-bit pc-relative reloc.
 
+ENUM
+  BFD_RELOC_DLX_HI16_S
+ENUMDOC
+  DLX relocs
+ENUM
+  BFD_RELOC_DLX_LO16
+ENUMDOC
+  DLX relocs
+ENUM
+  BFD_RELOC_DLX_JMP26
+ENUMDOC
+  DLX relocs
+
 ENUM
   BFD_RELOC_M32R_24
 ENUMDOC
@@ -3091,18 +3265,44 @@ ENUMX
   BFD_RELOC_IA64_IPLTLSB
 ENUMX
   BFD_RELOC_IA64_COPY
+ENUMX
+  BFD_RELOC_IA64_LTOFF22X
+ENUMX
+  BFD_RELOC_IA64_LDXMOV
+ENUMX
+  BFD_RELOC_IA64_TPREL14
 ENUMX
   BFD_RELOC_IA64_TPREL22
+ENUMX
+  BFD_RELOC_IA64_TPREL64I
 ENUMX
   BFD_RELOC_IA64_TPREL64MSB
 ENUMX
   BFD_RELOC_IA64_TPREL64LSB
 ENUMX
-  BFD_RELOC_IA64_LTOFF_TP22
+  BFD_RELOC_IA64_LTOFF_TPREL22
 ENUMX
-  BFD_RELOC_IA64_LTOFF22X
+  BFD_RELOC_IA64_DTPMOD64MSB
 ENUMX
-  BFD_RELOC_IA64_LDXMOV
+  BFD_RELOC_IA64_DTPMOD64LSB
+ENUMX
+  BFD_RELOC_IA64_LTOFF_DTPMOD22
+ENUMX
+  BFD_RELOC_IA64_DTPREL14
+ENUMX
+  BFD_RELOC_IA64_DTPREL22
+ENUMX
+  BFD_RELOC_IA64_DTPREL64I
+ENUMX
+  BFD_RELOC_IA64_DTPREL32MSB
+ENUMX
+  BFD_RELOC_IA64_DTPREL32LSB
+ENUMX
+  BFD_RELOC_IA64_DTPREL64MSB
+ENUMX
+  BFD_RELOC_IA64_DTPREL64LSB
+ENUMX
+  BFD_RELOC_IA64_LTOFF_DTPREL22
 ENUMDOC
   Intel IA64 Relocations.
 
@@ -3261,6 +3461,24 @@ ENUMX
 ENUMDOC
   H8 elf Relocations.
 
+ENUM
+  BFD_RELOC_XSTORMY16_REL_12
+ENUMX
+  BFD_RELOC_XSTORMY16_24
+ENUMX
+  BFD_RELOC_XSTORMY16_FPTR16
+ENUMDOC
+  Sony Xstormy16 Relocations.
+
+ENUM
+  BFD_RELOC_VAX_GLOB_DAT
+ENUMX
+  BFD_RELOC_VAX_JMP_SLOT
+ENUMX
+  BFD_RELOC_VAX_RELATIVE
+ENUMDOC
+  Relocations used by VAX ELF.
+
 ENDSENUM
   BFD_RELOC_UNUSED
 CODE_FRAGMENT
@@ -3371,7 +3589,6 @@ DESCRIPTION
        don't do relaxing -- i.e., does nothing.
 */
 
-/*ARGSUSED*/
 boolean
 bfd_generic_relax_section (abfd, section, link_info, again)
      bfd *abfd ATTRIBUTE_UNUSED;
@@ -3396,7 +3613,6 @@ DESCRIPTION
        don't do section gc -- i.e., does nothing.
 */
 
-/*ARGSUSED*/
 boolean
 bfd_generic_gc_sections (abfd, link_info)
      bfd *abfd ATTRIBUTE_UNUSED;
@@ -3418,7 +3634,6 @@ DESCRIPTION
        which don't have SEC_MERGE support -- i.e., does nothing.
 */
 
-/*ARGSUSED*/
 boolean
 bfd_generic_merge_sections (abfd, link_info)
      bfd *abfd ATTRIBUTE_UNUSED;
@@ -3456,7 +3671,7 @@ bfd_generic_get_relocated_section_contents (abfd, link_info, link_order, data,
      boolean relocateable;
      asymbol **symbols;
 {
-  /* Get enough memory to hold the stuff */
+  /* Get enough memory to hold the stuff */
   bfd *input_bfd = link_order->u.indirect.section->owner;
   asection *input_section = link_order->u.indirect.section;
 
@@ -3471,7 +3686,7 @@ bfd_generic_get_relocated_section_contents (abfd, link_info, link_order, data,
   if (reloc_vector == NULL && reloc_size != 0)
     goto error_return;
 
-  /* read in the section */
+  /* Read in the section.  */
   if (!bfd_get_section_contents (input_bfd,
                                 input_section,
                                 (PTR) data,
@@ -3479,7 +3694,7 @@ bfd_generic_get_relocated_section_contents (abfd, link_info, link_order, data,
                                 input_section->_raw_size))
     goto error_return;
 
-  /* We're not relaxing the section, so just copy the size info */
+  /* We're not relaxing the section, so just copy the size info */
   input_section->_cooked_size = input_section->_raw_size;
   input_section->reloc_done = true;
 
@@ -3509,7 +3724,7 @@ bfd_generic_get_relocated_section_contents (abfd, link_info, link_order, data,
            {
              asection *os = input_section->output_section;
 
-             /* A partial link, so keep the relocs */
+             /* A partial link, so keep the relocs */
              os->orelocation[os->reloc_count] = *parent;
              os->reloc_count++;
            }
This page took 0.03163 seconds and 4 git commands to generate.