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