(command.CommandList
  children: [
    (command.ShFunction
      name: error_if_symbol_absent
      body: 
        (BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.Pipeline
                          children: [
                            (C {<is_symbol_present>} {($ Id.VSub_Number '$1')} {($ Id.VSub_Number '$2')})
                          ]
                          negated: T
                        )
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                  action: [
                    (C {<echo>} {(DQ <Symbol>)} {($ Id.VSub_Number '$2')} 
                      {(DQ <'not present, possibly folded.'>)}
                    )
                    (command.ControlFlow
                      token: <Id.ControlFlow_Exit exit>
                      arg_word: {<1>}
                    )
                  ]
                  spids: [78 90]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: is_symbol_present
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<grep>} {($ Id.VSub_Number '$2')} {($ Id.VSub_Number '$1')}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {<'/dev/null'>}
                )
                (redir op:<Id.Redir_GreatAnd '2>&'> loc:(redir_loc.Fd fd:2) arg:{<1>})
              ]
              do_fork: T
            )
            (command.ControlFlow
              token: <Id.ControlFlow_Return return>
              arg_word: {($ Id.VSub_QMark '$?')}
            )
          ]
        )
    )
    (command.ShFunction
      name: check_nofold
      body: 
        (BraceGroup
          children: [
            (C {<error_if_symbol_absent>} {($ Id.VSub_Number '$1')} {($ Id.VSub_Number '$2')})
            (C {<error_if_symbol_absent>} {($ Id.VSub_Number '$1')} {($ Id.VSub_Number '$3')})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:func_addr_1)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: <Id.Left_Backtick '`'>
                        child: 
                          (command.Pipeline
                            children: [
                              (C {<grep>} {($ Id.VSub_Number '$2')} {($ Id.VSub_Number '$1')})
                              (C {<awk>} {(SQ <'{print $1}'>)})
                            ]
                            negated: F
                          )
                      )
                    }
                  spids: [165]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:func_addr_2)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: <Id.Left_Backtick '`'>
                        child: 
                          (command.Pipeline
                            children: [
                              (C {<grep>} {($ Id.VSub_Number '$3')} {($ Id.VSub_Number '$1')})
                              (C {<awk>} {(SQ <'{print $1}'>)})
                            ]
                            negated: F
                          )
                      )
                    }
                  spids: [185]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (C {<Id.Lit_LBracket '['>} {($ Id.VSub_DollarName '$func_addr_1')} 
                          {<Id.Lit_Equals '='>} {($ Id.VSub_DollarName '$func_addr_2')} {<Id.Lit_RBracket ']'>}
                        )
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                  action: [
                    (C {<echo>} {(DQ <'Safe Identical Code Folding folded'>)} {($ Id.VSub_Number '$2')} 
                      {(DQ <and>)} {($ Id.VSub_Number '$3')}
                    )
                    (command.ControlFlow
                      token: <Id.ControlFlow_Exit exit>
                      arg_word: {<1>}
                    )
                  ]
                  spids: [205 219]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: check_fold
      body: 
        (BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Pipeline
                      children: [
                        (C {<is_symbol_present>} {($ Id.VSub_Number '$1')} {($ Id.VSub_Number '$2')})
                      ]
                      negated: T
                    )
                  ]
                  action: [(command.ControlFlow token:<Id.ControlFlow_Return return> arg_word:{<0>})]
                  spids: [254 265]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Pipeline
                      children: [
                        (C {<is_symbol_present>} {($ Id.VSub_Number '$1')} {($ Id.VSub_Number '$3')})
                      ]
                      negated: T
                    )
                  ]
                  action: [(command.ControlFlow token:<Id.ControlFlow_Return return> arg_word:{<0>})]
                  spids: [277 288]
                )
              ]
            )
            (C {<awk>} 
              {
                (DQ <'\n'> <'BEGIN { discard = 0; }\n'> <'/^Discarded input/ { discard = 1; }\n'> 
                  <'/^Memory map/ { discard = 0; }\n'> <'/.*'> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) <.text> 
                  (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) <'..*('> ($ Id.VSub_Number '$2') <'|'> ($ Id.VSub_Number '$3') <').*/ { act[discard] = act[discard] '> 
                  (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <' '> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <' '> 
                  (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\$'>) <'0; }\n'> <'END {\n'> <'      # printf '> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) 
                  <kept> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <' act[0] '> 
                  (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) <nfolded> 
                  (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <' act[1] '> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) 
                  (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) <n> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <';\n'> 
                  <'      if (length(act[0]) == 0 || length(act[1]) == 0)\n'> <'\t{\n'> <'\t  printf '> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) 
                  <'Safe Identical Code Folding did not fold '> ($ Id.VSub_Number '$2') <' and '> ($ Id.VSub_Number '$3') 
                  (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\\\'>) <n> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <'\n'> <'\t  exit 1;\n'> <'\t}\n'> 
                  <'    }'>
                )
              } {($ Id.VSub_Number '$4')}
            )
          ]
        )
    )
    (command.ShFunction
      name: arch_specific_safe_fold
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [
                {<grep>}
                {<-e>}
                {(DQ <'Intel 80386'>)}
                {<-e>}
                {(DQ <ARM>)}
                {<-e>}
                {(DQ <PowerPC>)}
                {($ Id.VSub_Number '$1')}
              ]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {<'/dev/null'>}
                )
                (redir op:<Id.Redir_GreatAnd '2>&'> loc:(redir_loc.Fd fd:2) arg:{<1>})
              ]
              do_fork: T
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (C {<Id.Lit_LBracket '['>} {($ Id.VSub_QMark '$?')} {<-eq>} {<0>} 
                          {<Id.Lit_RBracket ']'>}
                        )
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                  action: [
                    (C {<check_fold>} {($ Id.VSub_Number '$2')} {($ Id.VSub_Number '$4')} 
                      {($ Id.VSub_Number '$5')} {($ Id.VSub_Number '$3')}
                    )
                  ]
                  spids: [397 411]
                )
              ]
              else_action: [
                (C {<check_nofold>} {($ Id.VSub_Number '$2')} {($ Id.VSub_Number '$4')} 
                  {($ Id.VSub_Number '$5')}
                )
              ]
            )
          ]
        )
    )
    (C {<arch_specific_safe_fold>} {<icf_safe_so_test_2.stdout>} {<icf_safe_so_test_1.stdout>} 
      {<icf_safe_so_test.map>} {(DQ <foo_prot>)} {(DQ <foo_hidden>)}
    )
    (C {<arch_specific_safe_fold>} {<icf_safe_so_test_2.stdout>} {<icf_safe_so_test_1.stdout>} 
      {<icf_safe_so_test.map>} {(DQ <foo_prot>)} {(DQ <foo_internal>)}
    )
    (C {<arch_specific_safe_fold>} {<icf_safe_so_test_2.stdout>} {<icf_safe_so_test_1.stdout>} 
      {<icf_safe_so_test.map>} {(DQ <foo_prot>)} {(DQ <foo_static>)}
    )
    (C {<arch_specific_safe_fold>} {<icf_safe_so_test_2.stdout>} {<icf_safe_so_test_1.stdout>} 
      {<icf_safe_so_test.map>} {(DQ <foo_hidden>)} {(DQ <foo_internal>)}
    )
    (C {<arch_specific_safe_fold>} {<icf_safe_so_test_2.stdout>} {<icf_safe_so_test_1.stdout>} 
      {<icf_safe_so_test.map>} {(DQ <foo_hidden>)} {(DQ <foo_static>)}
    )
    (C {<arch_specific_safe_fold>} {<icf_safe_so_test_2.stdout>} {<icf_safe_so_test_1.stdout>} 
      {<icf_safe_so_test.map>} {(DQ <foo_internal>)} {(DQ <foo_static>)}
    )
    (C {<check_nofold>} {<icf_safe_so_test_1.stdout>} {(DQ <foo_glob>)} {(DQ <bar_glob>)})
  ]
)