1c63112a9Slntue //===-- Including stdio.h in overlay mode ---------------------------------===// 2c63112a9Slntue // 3c63112a9Slntue // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4c63112a9Slntue // See https://llvm.org/LICENSE.txt for license information. 5c63112a9Slntue // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6c63112a9Slntue // 7c63112a9Slntue //===----------------------------------------------------------------------===// 8c63112a9Slntue 9c63112a9Slntue #ifndef LLVM_LIBC_HDR_STDIO_OVERLAY_H 10c63112a9Slntue #define LLVM_LIBC_HDR_STDIO_OVERLAY_H 11c63112a9Slntue 12c63112a9Slntue #ifdef LIBC_FULL_BUILD 13c63112a9Slntue #error "This header should only be included in overlay mode" 14c63112a9Slntue #endif 15c63112a9Slntue 16c63112a9Slntue // Overlay mode 17c63112a9Slntue 18c63112a9Slntue // glibc <stdio.h> header might provide extern inline definitions for few 19c63112a9Slntue // functions, causing external alias errors. They are guarded by 20c63112a9Slntue // `__USE_EXTERN_INLINES` macro. We temporarily disable `__USE_EXTERN_INLINES` 21c63112a9Slntue // macro by defining `__NO_INLINE__` before including <stdio.h>. 22c63112a9Slntue // And the same with `__USE_FORTIFY_LEVEL`, which will be temporarily disabled 23c63112a9Slntue // with `_FORTIFY_SOURCE`. 24c63112a9Slntue 25c63112a9Slntue #ifdef _FORTIFY_SOURCE 26c63112a9Slntue #define LIBC_OLD_FORTIFY_SOURCE _FORTIFY_SOURCE 27c63112a9Slntue #undef _FORTIFY_SOURCE 28c63112a9Slntue #endif 29c63112a9Slntue 30*cf4442e6SJob Henandez Lara #ifdef __USE_EXTERN_INLINES 31*cf4442e6SJob Henandez Lara #define LIBC_OLD_USE_EXTERN_INLINES 32*cf4442e6SJob Henandez Lara #undef __USE_EXTERN_INLINES 33*cf4442e6SJob Henandez Lara #endif 34*cf4442e6SJob Henandez Lara 35*cf4442e6SJob Henandez Lara #ifdef __USE_FORTIFY_LEVEL 36*cf4442e6SJob Henandez Lara #define LIBC_OLD_USE_FORTIFY_LEVEL __USE_FORTIFY_LEVEL 37*cf4442e6SJob Henandez Lara #undef __USE_FORTIFY_LEVEL 38*cf4442e6SJob Henandez Lara #define __USE_FORTIFY_LEVEL 0 39*cf4442e6SJob Henandez Lara #endif 40*cf4442e6SJob Henandez Lara 41c63112a9Slntue #ifndef __NO_INLINE__ 42c63112a9Slntue #define __NO_INLINE__ 1 43c63112a9Slntue #define LIBC_SET_NO_INLINE 44c63112a9Slntue #endif 45c63112a9Slntue 46c63112a9Slntue #include <stdio.h> 47c63112a9Slntue 48c63112a9Slntue #ifdef LIBC_OLD_FORTIFY_SOURCE 49c63112a9Slntue #define _FORTIFY_SOURCE LIBC_OLD_FORTIFY_SOURCE 50c63112a9Slntue #undef LIBC_OLD_FORTIFY_SOURCE 51c63112a9Slntue #endif 52c63112a9Slntue 53c63112a9Slntue #ifdef LIBC_SET_NO_INLINE 54c63112a9Slntue #undef __NO_INLINE__ 55c63112a9Slntue #undef LIBC_SET_NO_INLINE 56c63112a9Slntue #endif 57c63112a9Slntue 58*cf4442e6SJob Henandez Lara #ifdef LIBC_OLD_USE_FORTIFY_LEVEL 59*cf4442e6SJob Henandez Lara #undef __USE_FORTIFY_LEVEL 60*cf4442e6SJob Henandez Lara #define __USE_FORTIFY_LEVEL LIBC_OLD_USE_FORTIFY_LEVEL 61*cf4442e6SJob Henandez Lara #undef LIBC_OLD_USE_FORTIFY_LEVEL 62*cf4442e6SJob Henandez Lara #endif 63*cf4442e6SJob Henandez Lara 64*cf4442e6SJob Henandez Lara #ifdef LIBC_OLD_USE_EXTERN_INLINES 65*cf4442e6SJob Henandez Lara #define __USE_EXTERN_INLINES 66*cf4442e6SJob Henandez Lara #undef LIBC_OLD_USE_EXTERN_INLINES 67*cf4442e6SJob Henandez Lara #endif 68*cf4442e6SJob Henandez Lara 69c63112a9Slntue #endif // LLVM_LIBC_HDR_STDIO_OVERLAY_H 70