/* mremap.c -- version of mremap for gold.  */

/* Copyright (C) 2009-2021 Free Software Foundation, Inc.
   Written by Ian Lance Taylor <iant@google.com>.

   This file is part of gold.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

#include "config.h"
#include "ansidecl.h"

#include <errno.h>
#include <string.h>
#include <sys/types.h>

#ifdef HAVE_SYS_MMAN_H
#include <sys/mman.h>
#endif

extern void *gold_mremap (void *, size_t, size_t, int);

#ifdef HAVE_MMAP

/* This file implements mremap for systems which don't have it.  The
   gold code requires support for mmap.  However, there are systems
   which have mmap but not mremap.  This is not a general replacement
   for mremap; it only supports the features which are required for
   gold.  In particular, we assume that the MREMAP_MAYMOVE flag is
   set.  */

/* Some BSD systems still use MAP_ANON instead of MAP_ANONYMOUS.  */

#ifndef MAP_ANONYMOUS
# define MAP_ANONYMOUS MAP_ANON
#endif

void *
gold_mremap (void *old_address, size_t old_size, size_t new_size,
	     int flags ATTRIBUTE_UNUSED)
{
  void *ret;

  ret = mmap (0, new_size, PROT_READ | PROT_WRITE,
	      MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
  if (ret == MAP_FAILED)
    return ret;
  memcpy (ret, old_address,
	  old_size < new_size ? old_size : new_size);
  (void) munmap (old_address, old_size);
  return ret;
}

#else /* !defined(HAVE_MMAP) */

#ifndef MAP_FAILED
#define MAP_FAILED ((void *) -1)
#endif

#ifndef ENOSYS
#define ENOSYS EINVAL
#endif

void *
gold_mremap (void *old_address ATTRIBUTE_UNUSED,
	     size_t old_size ATTRIBUTE_UNUSED,
	     size_t new_size ATTRIBUTE_UNUSED,
	     int flags ATTRIBUTE_UNUSED)
{
  errno = ENOSYS;
  return MAP_FAILED;
}

#endif /* !defined(HAVE_MMAP) */
