|
- /*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
- *
- * Copyright (c) 1999 John D. Polstra
- * Copyright (c) 1999,2001 Peter Wemm <peter@FreeBSD.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
- #ifndef _SYS_LINKER_SET_H_
- #define _SYS_LINKER_SET_H_
-
- #include <sys/cdefs.h>
- /* START cdefs.h direct import from FreeBSD */
- /* This section has the follwing copyright */
- /*-
- * SPDX-License-Identifier: BSD-3-Clause
- *
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Berkeley Software Design, Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)cdefs.h 8.8 (Berkeley) 1/9/95
- * $FreeBSD$
- */
-
- #define __CONCAT1(x,y) x ## y
- #define __CONCAT(x,y) __CONCAT1(x,y)
- #define __STRING(x) #x /* stringify without expanding x */
- #define __XSTRING(x) __STRING(x) /* expand x, then stringify */
- #define __nosanitizeaddress
- #define __nosanitizememory
- #define __used __attribute__((__used__))
- #define __weak_symbol __attribute__((__weak__))
-
- /* END cdefs.h direct import */
-
- /*
- * The following macros are used to declare global sets of objects, which
- * are collected by the linker into a `linker_set' as defined below.
- * For ELF, this is done by constructing a separate segment for each set.
- */
-
- #if defined(__powerpc64__) && (!defined(_CALL_ELF) || _CALL_ELF == 1)
- /*
- * ELFv1 pointers to functions are actaully pointers to function
- * descriptors.
- *
- * Move the symbol pointer from ".text" to ".data" segment, to make
- * the GCC compiler happy:
- */
- #define __MAKE_SET_CONST
- #else
- #define __MAKE_SET_CONST const
- #endif
-
- /*
- * Private macros, not to be used outside this header file.
- */
- #ifdef __GNUCLIKE___SECTION
-
- /*
- * The userspace address sanitizer inserts redzones around global variables,
- * violating the assumption that linker set elements are packed.
- */
- #ifdef _KERNEL
- #define __NOASAN
- #else
- #define __NOASAN __nosanitizeaddress
- #endif
-
- #define __MAKE_SET_QV(set, sym, qv) \
- void *__WEAK(__CONCAT(__start_set_,set)); \
- void *__WEAK(__CONCAT(__stop_set_,set)); \
- static void const * qv \
- __NOASAN \
- __set_##set##_sym_##sym __section("set_" #set) \
- __used = &(sym)
- #define __MAKE_SET(set, sym) __MAKE_SET_QV(set, sym, __MAKE_SET_CONST)
- #else /* !__GNUCLIKE___SECTION */
- #error this file needs to be ported to your compiler
- #endif /* __GNUCLIKE___SECTION */
-
- /*
- * Public macros.
- */
- #define TEXT_SET(set, sym) __MAKE_SET(set, sym)
- #define DATA_SET(set, sym) __MAKE_SET(set, sym)
- #define DATA_WSET(set, sym) __MAKE_SET_QV(set, sym, )
- #define BSS_SET(set, sym) __MAKE_SET(set, sym)
- #define ABS_SET(set, sym) __MAKE_SET(set, sym)
- #define SET_ENTRY(set, sym) __MAKE_SET(set, sym)
-
- /*
- * Initialize before referring to a given linker set.
- */
- #define SET_DECLARE(set, ptype) \
- extern ptype __weak_symbol __section("set_" #set)*__CONCAT(__start_set_,set); \
- extern ptype __weak_symbol *__CONCAT(__stop_set_,set) __section("set_" #set)
-
- #define SET_BEGIN(set) \
- (&__CONCAT(__start_set_,set))
- #define SET_LIMIT(set) \
- (&__CONCAT(__stop_set_,set))
-
- /*
- * Iterate over all the elements of a set.
- *
- * Sets always contain addresses of things, and "pvar" points to words
- * containing those addresses. Thus is must be declared as "type **pvar",
- * and the address of each set item is obtained inside the loop by "*pvar".
- */
- #define SET_FOREACH(pvar, set) \
- for (pvar = SET_BEGIN(set); pvar < SET_LIMIT(set); pvar++)
-
- #define SET_ITEM(set, i) \
- ((SET_BEGIN(set))[i])
-
- /*
- * Provide a count of the items in a set.
- */
- #define SET_COUNT(set) \
- (SET_LIMIT(set) - SET_BEGIN(set))
-
- #endif /* _SYS_LINKER_SET_H_ */
|