35#ifndef __CODE_REGION_H__
36#define __CODE_REGION_H__
39#include "../compiler/compiler.h"
106#ifndef COMPILER_PATCH_CODE_REGION_LOCAL_SIZE
107# define COMPILER_PATCH_CODE_REGION_LOCAL_SIZE 4
112#if __IS_COMPILER_IAR__
113# define __CODE_REGION(__REGION_ADDR) \
114 for(code_region_t *code_region_ptr = (code_region_t *)(__REGION_ADDR); \
115 NULL != code_region_ptr; \
116 code_region_ptr = NULL) \
117 for(uint8_t local[COMPILER_PATCH_CODE_REGION_LOCAL_SIZE], \
118 VSF_MCONNECT2(__code_region_, __LINE__) = 1; \
119 VSF_MCONNECT2(__code_region_, __LINE__)-- ? \
120 (code_region_ptr->methods_ptr->OnEnter( \
121 code_region_ptr->target_ptr, local) \
124 code_region_ptr->methods_ptr->OnLeave( \
125 code_region_ptr->target_ptr, local))
127# define __CODE_REGION_START(__REGION_ADDR) __CODE_REGION(__REGION_ADDR) {
128# define __CODE_REGION_END() }
130# define __CODE_REGION_SIMPLE(__REGION_ADDR, ...) \
131 do {if (NULL != (__REGION_ADDR)) { \
132 code_region_t *code_region_ptr = (code_region_t *)(__REGION_ADDR); \
133 uint8_t local[COMPILER_PATCH_CODE_REGION_LOCAL_SIZE]; \
134 code_region_ptr->methods_ptr->OnEnter( \
135 code_region_ptr->target_ptr, local); \
137 code_region_ptr->methods_ptr->OnLeave( \
138 code_region_ptr->target_ptr, local); \
141# define __CODE_REGION_SIMPLE_START(__REGION_ADDR, ...) \
142 do {if (NULL != (__REGION_ADDR)) { \
143 code_region_t *code_region_ptr = (code_region_t *)(__REGION_ADDR); \
144 uint8_t local[COMPILER_PATCH_CODE_REGION_LOCAL_SIZE]; \
145 code_region_ptr->methods_ptr->OnEnter(code_region_ptr->target_ptr, local);
147# define __CODE_REGION_SIMPLE_END(__REGION_ADDR, ...) \
148 code_region_ptr->methods_ptr->OnLeave( \
149 code_region_ptr->target_ptr, local); \
153# define EXIT_CODE_REGION() \
154 code_region_ptr->ptMethods->OnLeave(code_region_ptr->target_ptr, local)
155# define exit_code_region() EXIT_CODE_REGION()
157# define CODE_REGION(__REGION_ADDR) __CODE_REGION((__REGION_ADDR))
158# define code_region(__region_addr) __CODE_REGION((__region_addr))
163# if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L
164# define __CODE_REGION_SIMPLE(__REGION_ADDR, __CODE) \
165 do {if (NULL != (__REGION_ADDR)) { \
166 code_region_t *code_region_ptr = (code_region_t *)(__REGION_ADDR); \
167 uint8_t local[COMPILER_PATCH_CODE_REGION_LOCAL_SIZE]; \
168 code_region_ptr->methods_ptr->OnEnter( \
169 code_region_ptr->target_ptr, local); \
171 code_region_ptr->methods_ptr->OnLeave( \
172 code_region_ptr->target_ptr, local); \
175# define __CODE_REGION_SIMPLE_START(__REGION_ADDR) \
176 do {if (NULL != (__REGION_ADDR)) { \
177 code_region_t *code_region_ptr = (code_region_t *)(__REGION_ADDR); \
178 uint8_t local[COMPILER_PATCH_CODE_REGION_LOCAL_SIZE]; \
179 code_region_ptr->methods_ptr->OnEnter(code_region_ptr->target_ptr, local);
181# define __CODE_REGION_SIMPLE_END(__REGION_ADDR) \
182 code_region_ptr->methods_ptr->OnLeave( \
183 code_region_ptr->target_ptr, local); \
188# define __CODE_REGION(__REGION_ADDR) \
189 for(code_region_t *code_region_ptr = (code_region_t *)(__REGION_ADDR); \
190 NULL != code_region_ptr; \
191 code_region_ptr = NULL) \
192 for(uint8_t local[code_region_ptr->methods_ptr->local_obj_size], \
193 VSF_MCONNECT2(__code_region_, __LINE__) = 1; \
194 VSF_MCONNECT2(__code_region_, __LINE__)-- ? \
195 (code_region_ptr->methods_ptr->OnEnter( \
196 code_region_ptr->target_ptr, local) \
199 code_region_ptr->methods_ptr->OnLeave( \
200 code_region_ptr->target_ptr, local))
202# define __CODE_REGION_START(__REGION_ADDR) __CODE_REGION(__REGION_ADDR) {
203# define __CODE_REGION_END() }
206# define __CODE_REGION_SIMPLE(__REGION_ADDR, ...) \
207 do {if (NULL != (__REGION_ADDR)) { \
208 code_region_t *code_region_ptr = (code_region_t *)(__REGION_ADDR); \
209 uint8_t local[code_region_ptr->methods_ptr->local_obj_size]; \
210 code_region_ptr->methods_ptr->OnEnter( \
211 code_region_ptr->target_ptr, local); \
213 code_region_ptr->methods_ptr->OnLeave( \
214 code_region_ptr->target_ptr, local); \
217# define __CODE_REGION_SIMPLE_START(__REGION_ADDR, ...) \
218 do {if (NULL != (__REGION_ADDR)) { \
219 code_region_t *code_region_ptr = (code_region_t *)(__REGION_ADDR); \
220 uint8_t local[code_region_ptr->methods_ptr->local_obj_size]; \
221 code_region_ptr->methods_ptr->OnEnter(code_region_ptr->target_ptr, local);
223# define __CODE_REGION_SIMPLE_END(__REGION_ADDR, ...) \
224 code_region_ptr->methods_ptr->OnLeave( \
225 code_region_ptr->target_ptr, local); \
229# define EXIT_CODE_REGION() \
230 code_region_ptr->ptMethods->OnLeave(code_region_ptr->target_ptr, local)
231# define exit_code_region() EXIT_CODE_REGION()
233# define CODE_REGION(__REGION_ADDR) __CODE_REGION((__REGION_ADDR))
234# define code_region(__region_addr) __CODE_REGION((__region_addr))
239#define CODE_REGION_START(__REGION_ADDR) __CODE_REGION_START((__REGION_ADDR))
240#define CODE_REGION_END() __CODE_REGION_END()
242#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L
243#define CODE_REGION_SIMPLE(__REGION_ADDR, __CODE) \
244 __CODE_REGION_SIMPLE((__REGION_ADDR), __CODE)
245#define code_region_simple(__REGION_ADDR, __CODE) \
246 __CODE_REGION_SIMPLE((__REGION_ADDR), __CODE)
248#define CODE_REGION_SIMPLE(__REGION_ADDR, ...) \
249 __CODE_REGION_SIMPLE((__REGION_ADDR), __VA_ARGS__)
250#define code_region_simple(__REGION_ADDR, ...) \
251 __CODE_REGION_SIMPLE((__REGION_ADDR), __VA_ARGS__)
254#define CODE_REGION_SIMPLE_START(__REGION_ADDR) \
255 __CODE_REGION_SIMPLE_START((__REGION_ADDR))
256#define CODE_REGION_SIMPLE_END() \
257 __CODE_REGION_SIMPLE_END()
264 void (*OnEnter)(
void *obj_ptr,
void *local_ptr);
265 void (*OnLeave)(
void *obj_ptr,
void *local_ptr);
const code_region_t DEFAULT_CODE_REGION_NONE
Definition code_region.c:56
unsigned char uint_fast8_t
Definition stdint.h:23
Definition code_region.h:268
void * target_ptr
Definition code_region.h:269
i_code_region_t * methods_ptr
Definition code_region.h:270
Definition code_region.h:262
uint_fast8_t local_obj_size
Definition code_region.h:263