// File: /workspace/github_cpp_makefile_star2_O2/halfflat[P]tinyopt/test/googletest/googletest/src/gtest.cc
// Function: testing::TestSuite::Run()
void TestSuite::Run() {
  if (!should_run_) return;

  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
  impl->set_current_test_suite(this);

  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();

  // Ensure our tests are in a deterministic order.
  //
  // We do this by sorting lexicographically on (file, line number), providing
  // an order matching what the user can see in the source code.
  //
  // In the common case the line number comparison shouldn't be necessary,
  // because the registrations made by the TEST macro are executed in order
  // within a translation unit. But this is not true of the manual registration
  // API, and in more exotic scenarios a single file may be part of multiple
  // translation units.
  std::stable_sort(test_info_list_.begin(), test_info_list_.end(),
                   [](const TestInfo* const a, const TestInfo* const b) {
                     if (const int result = std::strcmp(a->file(), b->file())) {
                       return result < 0;
                     }

                     return a->line() < b->line();
                   });

  // Call both legacy and the new API
  repeater->OnTestSuiteStart(*this);
//  Legacy API is deprecated but still available
#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
  repeater->OnTestCaseStart(*this);
#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_

  impl->os_stack_trace_getter()->UponLeavingGTest();
  internal::HandleExceptionsInMethodIfSupported(
      this, &TestSuite::RunSetUpTestSuite, "SetUpTestSuite()");

  const bool skip_all =
      ad_hoc_test_result().Failed() || ad_hoc_test_result().Skipped();

  start_timestamp_ = internal::GetTimeInMillis();
  internal::Timer timer;
  for (int i = 0; i < total_test_count(); i++) {
    if (skip_all) {
      GetMutableTestInfo(i)->Skip();
    } else {
      GetMutableTestInfo(i)->Run();
    }
    if (GTEST_FLAG_GET(fail_fast) &&
        GetMutableTestInfo(i)->result()->Failed()) {
      for (int j = i + 1; j < total_test_count(); j++) {
        GetMutableTestInfo(j)->Skip();
      }
      break;
    }
  }
  elapsed_time_ = timer.Elapsed();

  impl->os_stack_trace_getter()->UponLeavingGTest();
  internal::HandleExceptionsInMethodIfSupported(
      this, &TestSuite::RunTearDownTestSuite, "TearDownTestSuite()");

  // Call both legacy and the new API
  repeater->OnTestSuiteEnd(*this);
//  Legacy API is deprecated but still available
#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
  repeater->OnTestCaseEnd(*this);
#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_

  impl->set_current_test_suite(nullptr);
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x18, %rsp
cmpb $0x1, 0x70(%rdi)
jne 0x412a6
movq %rdi, %rbx
callq 0x4c032
movq %rax, %r14
movq %rbx, 0x168(%rax)
callq 0x3b634
movq 0x43926(%rip), %rax     # 0x84a10
movq 0x1f8(%rax), %r15
movq 0x30(%rbx), %r13
movq 0x38(%rbx), %r12
cmpq %r12, %r13
je 0x41152
movq %r12, %rax
subq %r13, %rax
sarq $0x3, %rax
incq %rax
pushq $0x2
popq %rcx
cqto
idivq %rcx
movq %rsp, %rbp
movq %rbp, %rdi
movq %r13, %rsi
movq %rax, %rdx
callq 0x54780
movq 0x10(%rbp), %rdx
testq %rdx, %rdx
je 0x4113f
movq 0x8(%rsp), %rcx
movq %r13, %rdi
movq %r12, %rsi
callq 0x4af1d
jmp 0x4114a
movq %r13, %rdi
movq %r12, %rsi
callq 0x4aea6
movq %rsp, %rdi
callq 0x547a6
movq (%r15), %rax
movq %r15, %rdi
movq %rbx, %rsi
callq *0x30(%rax)
movq (%r15), %rax
movq %r15, %rdi
movq %rbx, %rsi
callq *0x38(%rax)
movq %r14, %rdi
callq 0x3d58a
movq (%rax), %rcx
movq %rax, %rdi
callq *0x18(%rcx)
leaq 0xd45e(%rip), %rsi      # 0x4e5e0
leaq 0x1af66(%rip), %rcx     # 0x5c0ef
movq %rbx, %rdi
xorl %edx, %edx
callq 0x4e499
leaq 0x88(%rbx), %r12
movq %r12, %rdi
callq 0x40042
movb $0x1, %bpl
testb %al, %al
jne 0x411b3
movq %r12, %rdi
callq 0x4000c
movl %eax, %ebp
callq 0x3d5b6
movq %rax, 0x78(%rbx)
callq 0xd830
movq %rax, (%rsp)
pushq $0x1
popq %r12
leal -0x1(%r12), %r13d
movq 0x38(%rbx), %rax
subq 0x30(%rbx), %rax
shrq $0x3, %rax
cmpl %eax, %r13d
jge 0x4124e
movq %rbx, %rdi
movl %r13d, %esi
callq 0x41048
movq %rax, %rdi
testb %bpl, %bpl
je 0x411f9
callq 0x40de6
jmp 0x411fe
callq 0x40cb0
cmpb $0x1, 0x436dd(%rip)     # 0x848e2
jne 0x41222
movq %rbx, %rdi
movl %r13d, %esi
callq 0x41048
leaq 0x90(%rax), %rdi
callq 0x40042
testb %al, %al
jne 0x4123d
incl %r12d
jmp 0x411c9
movq %rbx, %rdi
movl %r12d, %esi
callq 0x41048
movq %rax, %rdi
callq 0x40de6
incl %r12d
movq 0x38(%rbx), %rax
subq 0x30(%rbx), %rax
shrq $0x3, %rax
cmpl %eax, %r12d
jl 0x41227
movq %rsp, %rdi
callq 0x4e2fc
movq %rax, 0x80(%rbx)
movq %r14, %rdi
callq 0x3d58a
movq (%rax), %rcx
movq %rax, %rdi
callq *0x18(%rcx)
leaq 0xd377(%rip), %rsi      # 0x4e5ec
leaq 0x1ae84(%rip), %rcx     # 0x5c100
movq %rbx, %rdi
xorl %edx, %edx
callq 0x4e499
movq (%r15), %rax
movq %r15, %rdi
movq %rbx, %rsi
callq *0x60(%rax)
movq (%r15), %rax
movq %r15, %rdi
movq %rbx, %rsi
callq *0x68(%rax)
andq $0x0, 0x168(%r14)
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq %rax, %rbx
movq %rsp, %rdi
callq 0x547a6
movq %rbx, %rdi
callq 0xdaa0