1/* Memory management routines.
2   Copyright (C) 2002-2022 Free Software Foundation, Inc.
3   Contributed by Paul Brook <paul@nowt.org>
4
5This file is part of the GNU Fortran runtime library (libgfortran).
6
7Libgfortran is free software; you can redistribute it and/or
8modify it under the terms of the GNU General Public
9License as published by the Free Software Foundation; either
10version 3 of the License, or (at your option) any later version.
11
12Libgfortran is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15GNU General Public License for more details.
16
17Under Section 7 of GPL version 3, you are granted additional
18permissions described in the GCC Runtime Library Exception, version
193.1, as published by the Free Software Foundation.
20
21You should have received a copy of the GNU General Public License and
22a copy of the GCC Runtime Library Exception along with this program;
23see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24<http://www.gnu.org/licenses/>.  */
25
26#include "libgfortran.h"
27#include <errno.h>
28
29
30void *
31xmalloc (size_t n)
32{
33  void *p;
34
35  if (n == 0)
36    n = 1;
37
38  p = malloc (n);
39
40  if (p == NULL)
41    os_error ("Memory allocation failed");
42
43  return p;
44}
45
46
47void *
48xmallocarray (size_t nmemb, size_t size)
49{
50  void *p;
51  size_t prod;
52
53  if (!nmemb || !size)
54    prod = 1;
55  else if (__builtin_mul_overflow (nmemb, size, &prod))
56    {
57      errno = ENOMEM;
58      os_error ("Integer overflow in xmallocarray");
59    }
60
61  p = malloc (prod);
62
63  if (!p)
64    os_error ("Memory allocation failed in xmallocarray");
65
66  return p;
67}
68
69
70/* calloc wrapper that aborts on error.  */
71
72void *
73xcalloc (size_t nmemb, size_t size)
74{
75  if (!nmemb || !size)
76    nmemb = size = 1;
77
78  void *p = calloc (nmemb, size);
79  if (!p)
80    os_error ("Allocating cleared memory failed");
81
82  return p;
83}
84
85
86void *
87xrealloc (void *ptr, size_t size)
88{
89  if (size == 0)
90    size = 1;
91
92  void *newp = realloc (ptr, size);
93  if (!newp)
94    os_error ("Memory allocation failure in xrealloc");
95
96  return newp;
97}
98