// File: /workspace/github_c_makefile_star2_O0/LPD-EPFL[P]mctop/src/mctop_topology.c
// Function: mctop_free
void
mctop_free(mctop_t* topo)
{
  /* free siblings */
  for (int l = topo->socket_level + 1; l < topo->n_levels; l++)
    {
      sibling_t* sibling = mctop_get_first_sibling_lvl(topo, l);
      do
	{
	  sibling_t* next = sibling->next;
	  free(sibling);
	  sibling = next;
	}
      while (sibling != NULL);
    }

  /* free groups */
  for (int l = 1; l < topo->socket_level; l++)
    {
      hwc_gs_t* gs = mctop_get_first_gs_at_lvl(topo, l);
      do
	{
	  hwc_gs_t* next = gs->next;
	  free(gs->hwcs);
	  free(gs->children);
	  free(gs);
	  gs = next;
	}
      while (gs != NULL);
    }

  /* free socket stuff */
  for (int s = 0; s < topo->n_sockets; s++)
    {
      socket_t* socket = topo->sockets + s;
      free(socket->hwcs);
      free(socket->children);
      if (socket->n_siblings > 0)
	{
	  free(socket->siblings);
	  if (socket->siblings_in)
	    {
	      free(socket->siblings_in);
	    }
	}
      if (topo->has_mem >= LATENCY)
	{
	  free(socket->mem_latencies);
	}
      if (topo->has_mem == BANDWIDTH)
	{
	  free(socket->mem_bandwidths_r);
	  free(socket->mem_bandwidths1_r);
	}
      if (socket->pow_info)
	{
	  free(socket->pow_info);
	}
    }

  /* free topo */
  free(topo->latencies);
  free(topo->sockets);
  free(topo->hwcs);
  if (topo->n_siblings > 0)
    {
      free(topo->siblings);
    }
  if (topo->has_mem)
    {
      free(topo->node_to_socket);
      if (topo->has_mem == BANDWIDTH)
	{
	  free(topo->mem_bandwidths_r);
	  free(topo->mem_bandwidths1_r);
	  free(topo->mem_bandwidths_w);
	  free(topo->mem_bandwidths1_w);
	}
    }
  if (topo->pow_info)
    {
      free(topo->pow_info);
    }
  free(topo);
  topo = NULL;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movl 0x14(%rax), %eax
addl $0x1, %eax
movl %eax, -0xc(%rbp)
movl -0xc(%rbp), %eax
movq -0x8(%rbp), %rcx
cmpl (%rcx), %eax
jae 0xa295
movq -0x8(%rbp), %rdi
movl -0xc(%rbp), %esi
callq 0xbb70
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x20(%rbp)
movq -0x18(%rbp), %rdi
callq 0x2030
movq -0x20(%rbp), %rax
movq %rax, -0x18(%rbp)
cmpq $0x0, -0x18(%rbp)
jne 0xa264
jmp 0xa28a
movl -0xc(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xc(%rbp)
jmp 0xa249
movl $0x1, -0x24(%rbp)
movl -0x24(%rbp), %eax
movq -0x8(%rbp), %rcx
cmpl 0x14(%rcx), %eax
jae 0xa303
movq -0x8(%rbp), %rdi
movl -0x24(%rbp), %esi
callq 0xbb10
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x38(%rbp)
movq -0x30(%rbp), %rax
movq 0x30(%rax), %rdi
callq 0x2030
movq -0x30(%rbp), %rax
movq 0x40(%rax), %rdi
callq 0x2030
movq -0x30(%rbp), %rdi
callq 0x2030
movq -0x38(%rbp), %rax
movq %rax, -0x30(%rbp)
cmpq $0x0, -0x30(%rbp)
jne 0xa2b8
jmp 0xa2f8
movl -0x24(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x24(%rbp)
jmp 0xa29c
movl $0x0, -0x3c(%rbp)
movl -0x3c(%rbp), %eax
movq -0x8(%rbp), %rcx
cmpl 0x18(%rcx), %eax
jae 0xa3ee
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movslq -0x3c(%rbp), %rcx
imulq $0xa8, %rcx, %rcx
addq %rcx, %rax
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rax
movq 0x30(%rax), %rdi
callq 0x2030
movq -0x48(%rbp), %rax
movq 0x40(%rax), %rdi
callq 0x2030
movq -0x48(%rbp), %rax
cmpl $0x0, 0x50(%rax)
jbe 0xa37f
movq -0x48(%rbp), %rax
movq 0x58(%rax), %rdi
callq 0x2030
movq -0x48(%rbp), %rax
cmpq $0x0, 0x60(%rax)
je 0xa37d
movq -0x48(%rbp), %rax
movq 0x60(%rax), %rdi
callq 0x2030
jmp 0xa37f
movq -0x8(%rbp), %rax
cmpl $0x1, 0x30(%rax)
jb 0xa396
movq -0x48(%rbp), %rax
movq 0x78(%rax), %rdi
callq 0x2030
movq -0x8(%rbp), %rax
cmpl $0x2, 0x30(%rax)
jne 0xa3c0
movq -0x48(%rbp), %rax
movq 0x80(%rax), %rdi
callq 0x2030
movq -0x48(%rbp), %rax
movq 0x88(%rax), %rdi
callq 0x2030
movq -0x48(%rbp), %rax
cmpq $0x0, 0xa0(%rax)
je 0xa3de
movq -0x48(%rbp), %rax
movq 0xa0(%rax), %rdi
callq 0x2030
jmp 0xa3e0
movl -0x3c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x3c(%rbp)
jmp 0xa30a
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x2030
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x2030
movq -0x8(%rbp), %rax
movq 0x40(%rax), %rdi
callq 0x2030
movq -0x8(%rbp), %rax
cmpl $0x0, 0x48(%rax)
jbe 0xa42c
movq -0x8(%rbp), %rax
movq 0x50(%rax), %rdi
callq 0x2030
movq -0x8(%rbp), %rax
cmpl $0x0, 0x30(%rax)
je 0xa483
movq -0x8(%rbp), %rax
movq 0x38(%rax), %rdi
callq 0x2030
movq -0x8(%rbp), %rax
cmpl $0x2, 0x30(%rax)
jne 0xa481
movq -0x8(%rbp), %rax
movq 0x60(%rax), %rdi
callq 0x2030
movq -0x8(%rbp), %rax
movq 0x68(%rax), %rdi
callq 0x2030
movq -0x8(%rbp), %rax
movq 0x70(%rax), %rdi
callq 0x2030
movq -0x8(%rbp), %rax
movq 0x78(%rax), %rdi
callq 0x2030
jmp 0xa483
movq -0x8(%rbp), %rax
cmpq $0x0, 0x80(%rax)
je 0xa4a1
movq -0x8(%rbp), %rax
movq 0x80(%rax), %rdi
callq 0x2030
movq -0x8(%rbp), %rdi
callq 0x2030
movq $0x0, -0x8(%rbp)
addq $0x50, %rsp
popq %rbp
retq
nopl (%rax,%rax)