1 /* 2 * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. 3 * 4 * This file is part of libFirm. 5 * 6 * This file may be distributed and/or modified under the terms of the 7 * GNU General Public License version 2 as published by the Free Software 8 * Foundation and appearing in the file LICENSE.GPL included in the 9 * packaging of this file. 10 * 11 * Licensees holding valid libFirm Professional Edition licenses may use 12 * this file in accordance with the libFirm Commercial License. 13 * Agreement provided with the Software. 14 * 15 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 16 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17 * PURPOSE. 18 */ 19 20 /** 21 * @file 22 * @brief never failing wrappers for malloc() & friends. 23 * @author Markus Armbruster 24 * @note The functions here never fail because they simply abort your 25 * program in case of an error. 26 */ 27 #ifndef FIRM_ADT_XMALLOC_H 28 #define FIRM_ADT_XMALLOC_H 29 30 #include <stddef.h> 31 #include <stdlib.h> 32 #include <string.h> 33 34 /* Includes for alloca() */ 35 #ifdef _WIN32 36 #include <malloc.h> 37 #endif 38 #if defined(__linux__) || defined(__APPLE__) 39 #include <alloca.h> 40 #endif 41 42 #include "../begin.h" 43 44 /** 45 * @ingroup adt 46 * @defgroup xmalloc Memory Allocation 47 * @{ 48 */ 49 50 /** 51 * Allocate @p size bytes on the heap. 52 * This is a wrapper for malloc which calls panic() in case of errors, so no 53 * error handling is required for code using it. 54 */ 55 FIRM_API void *xmalloc(size_t size); 56 /** 57 * Chane size of a previously allocated memory block to @p size bytes. 58 * This is a wrapper for realloc which calls panic() in case of errors, so no 59 * error handling is required for code using it. 60 */ 61 FIRM_API void *xrealloc(void *ptr, size_t size); 62 /** 63 * Allocates memory and copies string @p str into it. 64 * This is a wrapper for strdup which calls panic() in case of errors, so no 65 * error handling is required for code using it. 66 */ 67 FIRM_API char *xstrdup(const char *str); 68 /** 69 * Another name for the free function 70 * @deprecated 71 */ 72 #define xfree(ptr) free(ptr) 73 74 /** 75 * Allocate n objects of a certain type 76 */ 77 #define XMALLOCN(type, n) ((type*)xmalloc(sizeof(type) * (n))) 78 79 /** 80 * Allocate n objects of a certain type and zero them 81 */ 82 #define XMALLOCNZ(type, n) ((type*)memset(xmalloc(sizeof(type) * (n)), 0, sizeof(type) * (n))) 83 84 /** 85 * Allocate one object of a certain type 86 */ 87 #define XMALLOC(type) XMALLOCN(type, 1) 88 89 /** 90 * Allocate one object of a certain type and zero it 91 */ 92 #define XMALLOCZ(type) XMALLOCNZ(type, 1) 93 94 /** 95 * Reallocate n objects of a certain type 96 */ 97 #define XREALLOC(ptr, type, n) ((type*)xrealloc(ptr, sizeof(type) * (n))) 98 99 /** 100 * Allocate an object with n elements of a flexible array member 101 */ 102 #define XMALLOCF(type, member, n) ((type*)xmalloc(offsetof(type, member) + sizeof(*((type*)0)->member) * (n))) 103 104 /** 105 * Allocate an object with n elements of a flexible array member and zero the 106 * whole object 107 */ 108 #define XMALLOCFZ(type, member, n) ((type*)memset(XMALLOCF(type, member, (n)), 0, offsetof(type, member) + sizeof(*((type*)0)->member) * (n))) 109 110 /** 111 * Allocate n objects of a certain type on the stack 112 */ 113 #define ALLOCAN(type, n) ((type*)alloca(sizeof(type) * (n))) 114 115 /** 116 * Allocate n objects of a certain type on the stack and zero them 117 */ 118 #define ALLOCANZ(type, n) ((type*)memset((type*)alloca(sizeof(type) * (n)), 0, sizeof(type) * (n))) 119 120 /** 121 * Allocate n objects of a certain type on the given obstack 122 */ 123 #define OALLOCN(obst, type, n) ((type*)obstack_alloc((obst), sizeof(type) * (n))) 124 125 /** 126 * Allocate n objects of a certain type on the given obstack and zero them 127 */ 128 #define OALLOCNZ(obst, type, n) ((type*)memset(OALLOCN((obst), type, (n)), 0, sizeof(type) * (n))) 129 130 /** 131 * Allocate one object of a certain type on the given obstack 132 */ 133 #define OALLOC(obst, type) OALLOCN(obst, type, 1) 134 135 /** 136 * Allocate one object of a certain type on the given obstack and zero it 137 */ 138 #define OALLOCZ(obst, type) OALLOCNZ(obst, type, 1) 139 140 /** 141 * Allocate an object with n elements of a flexible array member on the given 142 * obstck 143 */ 144 #define OALLOCF(obst, type, member, n) ((type*)obstack_alloc((obst), offsetof(type, member) + sizeof(*((type*)0)->member) * (n))) 145 146 /** 147 * Allocate an object with n elements of a flexible array member on the given 148 * obstack and zero the whole object 149 */ 150 #define OALLOCFZ(obst, type, member, n) ((type*)memset(OALLOCF((obst), type, member, (n)), 0, offsetof(type, member) + sizeof(*((type*)0)->member) * (n))) 151 152 /** @} */ 153 154 #include "../end.h" 155 156 #endif 157