mono_file_map_open (const char * name)
{
  struct MonoFileMap * D.8583;

  D.8583 = fopen (name, "rb");
  return D.8583;
}


mono_file_map_size (struct MonoFileMap * fmap)
{
  int D.8585;
  int D.8586;
  guint64 D.8589;
  long long int D.8590;
  struct stat stat_buf;

  try
    {
      D.8585 = fileno (fmap);
      D.8586 = fstat (D.8585, &stat_buf);
      if (D.8586 < 0) goto <D.8587>; else goto <D.8588>;
      <D.8587>:
      D.8589 = 0;
      return D.8589;
      <D.8588>:
      D.8590 = stat_buf.st_size;
      D.8589 = (guint64) D.8590;
      return D.8589;
    }
  finally
    {
      stat_buf = {CLOBBER};
    }
}


fstat (int __fd, struct stat * __statbuf)
{
  int D.8593;

  D.8593 = __fxstat (3, __fd, __statbuf);
  return D.8593;
}


mono_file_map_fd (struct MonoFileMap * fmap)
{
  int D.8595;

  D.8595 = fileno (fmap);
  return D.8595;
}


mono_file_map_close (struct MonoFileMap * fmap)
{
  int D.8597;

  D.8597 = fclose (fmap);
  return D.8597;
}


mono_file_map_set_allocator (void * (*mono_file_map_alloc_fn) (size_t) alloc, void (*mono_file_map_release_fn) (void *) release)
{
  void * (*<T1c60>) (size_t) iftmp.0;
  void (*<Tc1>) (void *) iftmp.1;

  if (alloc != 0B) goto <D.8600>; else goto <D.8601>;
  <D.8600>:
  iftmp.0 = alloc;
  goto <D.8602>;
  <D.8601>:
  iftmp.0 = malloc;
  <D.8602>:
  alloc_fn = iftmp.0;
  if (release != 0B) goto <D.8604>; else goto <D.8605>;
  <D.8604>:
  iftmp.1 = release;
  goto <D.8606>;
  <D.8605>:
  iftmp.1 = free;
  <D.8606>:
  release_fn = iftmp.1;
}


mono_file_map_fileio (size_t length, int flags, int fd, guint64 offset, void * * ret_handle)
{
  void * (*<T1c60>) (size_t) alloc_fn.2;
  void * D.8610;
  long long int D.8611;
  long long int offset.3;
  long long int D.8613;
  long long unsigned int D.8614;
  void (*<Tc1>) (void *) release_fn.4;
  int D.8618;
  long long int cur_offset.5;
  guint64 cur_offset;
  size_t bytes_read;
  void * ptr;

  alloc_fn.2 = alloc_fn;
  ptr = alloc_fn.2 (length);
  if (ptr == 0B) goto <D.8608>; else goto <D.8609>;
  <D.8608>:
  D.8610 = 0B;
  return D.8610;
  <D.8609>:
  D.8611 = lseek (fd, 0, 1);
  cur_offset = (guint64) D.8611;
  offset.3 = (long long int) offset;
  D.8613 = lseek (fd, offset.3, 0);
  D.8614 = (long long unsigned int) D.8613;
  if (D.8614 != offset) goto <D.8615>; else goto <D.8616>;
  <D.8615>:
  release_fn.4 = release_fn;
  release_fn.4 (ptr);
  D.8610 = 0B;
  return D.8610;
  <D.8616>:
  D.8618 = read (fd, ptr, length);
  bytes_read = (size_t) D.8618;
  cur_offset.5 = (long long int) cur_offset;
  lseek (fd, cur_offset.5, 0);
  *ret_handle = 0B;
  D.8610 = ptr;
  return D.8610;
}


read (int __fd, void * __buf, size_t __nbytes)
{
  unsigned int D.8621;
  int D.8624;
  ssize_t D.8627;
  unsigned int D.8628;
  unsigned int D.8629;
  unsigned int D.8632;

  D.8621 = __builtin_object_size (__buf, 0);
  if (D.8621 != 4294967295) goto <D.8622>; else goto <D.8623>;
  <D.8622>:
  D.8624 = __builtin_constant_p (__nbytes);
  if (D.8624 == 0) goto <D.8625>; else goto <D.8626>;
  <D.8625>:
  D.8628 = __builtin_object_size (__buf, 0);
  D.8627 = __read_chk (__fd, __buf, __nbytes, D.8628);
  return D.8627;
  <D.8626>:
  D.8629 = __builtin_object_size (__buf, 0);
  if (D.8629 < __nbytes) goto <D.8630>; else goto <D.8631>;
  <D.8630>:
  D.8632 = __builtin_object_size (__buf, 0);
  D.8627 = __read_chk_warn (__fd, __buf, __nbytes, D.8632);
  return D.8627;
  <D.8631>:
  <D.8623>:
  D.8627 = __read_alias (__fd, __buf, __nbytes);
  return D.8627;
}


mono_file_unmap_fileio (void * addr, void * handle)
{
  void (*<Tc1>) (void *) release_fn.6;
  int D.8635;

  release_fn.6 = release_fn;
  release_fn.6 (addr);
  D.8635 = 0;
  return D.8635;
}


