1 // Copyright 2017 Espressif Systems (Shanghai) PTE LTD 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 16 /* This header file wraps newlib's own unmodified assert.h and adds 17 support for silent assertion failure. 18 */ 19 #pragma once 20 #include <sdkconfig.h> 21 #include <stdlib.h> 22 #include <stdint.h> 23 24 #include_next <assert.h> 25 26 /* moved part of libc provided assert to here allows 27 * tweaking the assert macro to use __builtin_expect() 28 * and reduce jumps in the "asserts OK" code path 29 * 30 * Note: using __builtin_expect() not likely() to avoid defining the likely 31 * macro in namespace of non-IDF code that may include this standard header. 32 */ 33 #undef assert 34 35 /* __FILENAME__ points to the file name instead of path + filename 36 * e.g __FILE__ points to "/apps/test.c" where as __FILENAME__ points to "test.c" 37 */ 38 #define __FILENAME__ (__builtin_strrchr( "/" __FILE__, '/') + 1) 39 40 #if defined(NDEBUG) 41 42 #define assert(__e) ((void)(__e)) 43 44 #elif CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT 45 46 #define assert(__e) (__builtin_expect(!!(__e), 1) ? (void)0 : __assert_func(NULL, 0, NULL, NULL)) 47 48 #else // !CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT 49 50 #define assert(__e) (__builtin_expect(!!(__e), 1) ? (void)0 : __assert_func (__FILENAME__, __LINE__, \ 51 __ASSERT_FUNC, #__e)) 52 #endif 53