1/* GNU Objective C Runtime Memory allocation functions
2   Copyright (C) 1993-2022 Free Software Foundation, Inc.
3   Contributed by Kresten Krab Thorup
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it
8under the terms of the GNU General Public License as published by the
9Free Software Foundation; either version 3, or (at your option) any
10later version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT
13ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15for 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/* This file includes the standard functions for memory allocation and
27   disposal.  Users should use these functions in their ObjC programs
28   so that they work properly with garbage collectors.  */
29
30/* TODO: Turn these into macros or inline functions.  */
31
32#include "objc-private/common.h"
33#include "objc-private/error.h"
34
35/* __USE_FIXED_PROTOTYPES__ used to be required to get prototypes for
36   malloc, free, etc. on some platforms.  It is unclear if we still
37   need it, but it can't hurt.  */
38#define __USE_FIXED_PROTOTYPES__
39#include <stdlib.h>
40
41#include "objc/runtime.h"
42
43#if OBJC_WITH_GC
44#include <gc/gc.h>
45
46void *
47objc_malloc (size_t size)
48{
49  void *res = (void *)(GC_malloc (size));
50  if (! res)
51    _objc_abort ("Virtual memory exhausted\n");
52  return res;
53}
54
55void *
56objc_atomic_malloc (size_t size)
57{
58  void *res = (void *)(GC_malloc_atomic (size));
59  if (! res)
60    _objc_abort ("Virtual memory exhausted\n");
61  return res;
62}
63
64void *
65objc_realloc (void *mem, size_t size)
66{
67  void *res = (void *)(GC_realloc (mem, size));
68  if (! res)
69    _objc_abort ("Virtual memory exhausted\n");
70  return res;
71}
72
73void *
74objc_calloc (size_t nelem, size_t size)
75{
76  /* Note that GC_malloc returns cleared memory (see documentation) so
77     there is no need to clear it.  */
78  void *res = (void *)(GC_malloc (nelem * size));
79  if (! res)
80    _objc_abort ("Virtual memory exhausted\n");
81  return res;
82}
83
84void
85objc_free (void *mem __attribute__ ((__unused__)))
86{
87  return;
88}
89
90#else
91
92void *
93objc_malloc (size_t size)
94{
95  void *res = (void *)(malloc (size));
96  if (! res)
97    _objc_abort ("Virtual memory exhausted\n");
98  return res;
99}
100
101void *
102objc_atomic_malloc (size_t size)
103{
104  void *res = (void *)(malloc (size));
105  if (! res)
106    _objc_abort ("Virtual memory exhausted\n");
107  return res;
108}
109
110void *
111objc_realloc (void *mem, size_t size)
112{
113  void *res = (void *)(realloc (mem, size));
114  if (! res)
115    _objc_abort ("Virtual memory exhausted\n");
116  return res;
117}
118
119void *
120objc_calloc (size_t nelem, size_t size)
121{
122  void *res = (void *)(calloc (nelem, size));
123  if (! res)
124    _objc_abort ("Virtual memory exhausted\n");
125  return res;
126}
127
128void
129objc_free (void *mem)
130{
131  free (mem);
132}
133
134#endif	/* !OBJC_WITH_GC */
135