1*4a5d661aSToomas Soome /*- 2*4a5d661aSToomas Soome * Copyright (c) 1999 John D. Polstra 3*4a5d661aSToomas Soome * Copyright (c) 1999,2001 Peter Wemm <peter@FreeBSD.org> 4*4a5d661aSToomas Soome * All rights reserved. 5*4a5d661aSToomas Soome * 6*4a5d661aSToomas Soome * Redistribution and use in source and binary forms, with or without 7*4a5d661aSToomas Soome * modification, are permitted provided that the following conditions 8*4a5d661aSToomas Soome * are met: 9*4a5d661aSToomas Soome * 1. Redistributions of source code must retain the above copyright 10*4a5d661aSToomas Soome * notice, this list of conditions and the following disclaimer. 11*4a5d661aSToomas Soome * 2. Redistributions in binary form must reproduce the above copyright 12*4a5d661aSToomas Soome * notice, this list of conditions and the following disclaimer in the 13*4a5d661aSToomas Soome * documentation and/or other materials provided with the distribution. 14*4a5d661aSToomas Soome * 15*4a5d661aSToomas Soome * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16*4a5d661aSToomas Soome * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17*4a5d661aSToomas Soome * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18*4a5d661aSToomas Soome * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19*4a5d661aSToomas Soome * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20*4a5d661aSToomas Soome * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21*4a5d661aSToomas Soome * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22*4a5d661aSToomas Soome * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23*4a5d661aSToomas Soome * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24*4a5d661aSToomas Soome * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25*4a5d661aSToomas Soome * SUCH DAMAGE. 26*4a5d661aSToomas Soome * 27*4a5d661aSToomas Soome * $FreeBSD$ 28*4a5d661aSToomas Soome */ 29*4a5d661aSToomas Soome 30*4a5d661aSToomas Soome #ifndef _SYS_LINKER_SET_H_ 31*4a5d661aSToomas Soome #define _SYS_LINKER_SET_H_ 32*4a5d661aSToomas Soome 33*4a5d661aSToomas Soome #ifndef _SYS_CDEFS_H_ 34*4a5d661aSToomas Soome #error this file needs sys/cdefs.h as a prerequisite 35*4a5d661aSToomas Soome #endif 36*4a5d661aSToomas Soome 37*4a5d661aSToomas Soome /* 38*4a5d661aSToomas Soome * The following macros are used to declare global sets of objects, which 39*4a5d661aSToomas Soome * are collected by the linker into a `linker_set' as defined below. 40*4a5d661aSToomas Soome * For ELF, this is done by constructing a separate segment for each set. 41*4a5d661aSToomas Soome */ 42*4a5d661aSToomas Soome 43*4a5d661aSToomas Soome #if defined(__powerpc64__) 44*4a5d661aSToomas Soome /* 45*4a5d661aSToomas Soome * Move the symbol pointer from ".text" to ".data" segment, to make 46*4a5d661aSToomas Soome * the GCC compiler happy: 47*4a5d661aSToomas Soome */ 48*4a5d661aSToomas Soome #define __MAKE_SET_CONST 49*4a5d661aSToomas Soome #else 50*4a5d661aSToomas Soome #define __MAKE_SET_CONST const 51*4a5d661aSToomas Soome #endif 52*4a5d661aSToomas Soome 53*4a5d661aSToomas Soome /* 54*4a5d661aSToomas Soome * Private macros, not to be used outside this header file. 55*4a5d661aSToomas Soome */ 56*4a5d661aSToomas Soome #ifdef __GNUCLIKE___SECTION 57*4a5d661aSToomas Soome #define __MAKE_SET(set, sym) \ 58*4a5d661aSToomas Soome __GLOBL(__CONCAT(__start_set_,set)); \ 59*4a5d661aSToomas Soome __GLOBL(__CONCAT(__stop_set_,set)); \ 60*4a5d661aSToomas Soome static void const * __MAKE_SET_CONST \ 61*4a5d661aSToomas Soome __set_##set##_sym_##sym __section("set_" #set) \ 62*4a5d661aSToomas Soome __used = &(sym) 63*4a5d661aSToomas Soome #else /* !__GNUCLIKE___SECTION */ 64*4a5d661aSToomas Soome #ifndef lint 65*4a5d661aSToomas Soome #error this file needs to be ported to your compiler 66*4a5d661aSToomas Soome #endif /* lint */ 67*4a5d661aSToomas Soome #define __MAKE_SET(set, sym) extern void const * const (__set_##set##_sym_##sym) 68*4a5d661aSToomas Soome #endif /* __GNUCLIKE___SECTION */ 69*4a5d661aSToomas Soome 70*4a5d661aSToomas Soome /* 71*4a5d661aSToomas Soome * Public macros. 72*4a5d661aSToomas Soome */ 73*4a5d661aSToomas Soome #define TEXT_SET(set, sym) __MAKE_SET(set, sym) 74*4a5d661aSToomas Soome #define DATA_SET(set, sym) __MAKE_SET(set, sym) 75*4a5d661aSToomas Soome #define BSS_SET(set, sym) __MAKE_SET(set, sym) 76*4a5d661aSToomas Soome #define ABS_SET(set, sym) __MAKE_SET(set, sym) 77*4a5d661aSToomas Soome #define SET_ENTRY(set, sym) __MAKE_SET(set, sym) 78*4a5d661aSToomas Soome 79*4a5d661aSToomas Soome /* 80*4a5d661aSToomas Soome * Initialize before referring to a given linker set. 81*4a5d661aSToomas Soome */ 82*4a5d661aSToomas Soome #define SET_DECLARE(set, ptype) \ 83*4a5d661aSToomas Soome extern ptype __weak_symbol *__CONCAT(__start_set_,set); \ 84*4a5d661aSToomas Soome extern ptype __weak_symbol *__CONCAT(__stop_set_,set) 85*4a5d661aSToomas Soome 86*4a5d661aSToomas Soome #define SET_BEGIN(set) \ 87*4a5d661aSToomas Soome (&__CONCAT(__start_set_,set)) 88*4a5d661aSToomas Soome #define SET_LIMIT(set) \ 89*4a5d661aSToomas Soome (&__CONCAT(__stop_set_,set)) 90*4a5d661aSToomas Soome 91*4a5d661aSToomas Soome /* 92*4a5d661aSToomas Soome * Iterate over all the elements of a set. 93*4a5d661aSToomas Soome * 94*4a5d661aSToomas Soome * Sets always contain addresses of things, and "pvar" points to words 95*4a5d661aSToomas Soome * containing those addresses. Thus is must be declared as "type **pvar", 96*4a5d661aSToomas Soome * and the address of each set item is obtained inside the loop by "*pvar". 97*4a5d661aSToomas Soome */ 98*4a5d661aSToomas Soome #define SET_FOREACH(pvar, set) \ 99*4a5d661aSToomas Soome for (pvar = SET_BEGIN(set); pvar < SET_LIMIT(set); pvar++) 100*4a5d661aSToomas Soome 101*4a5d661aSToomas Soome #define SET_ITEM(set, i) \ 102*4a5d661aSToomas Soome ((SET_BEGIN(set))[i]) 103*4a5d661aSToomas Soome 104*4a5d661aSToomas Soome /* 105*4a5d661aSToomas Soome * Provide a count of the items in a set. 106*4a5d661aSToomas Soome */ 107*4a5d661aSToomas Soome #define SET_COUNT(set) \ 108*4a5d661aSToomas Soome (SET_LIMIT(set) - SET_BEGIN(set)) 109*4a5d661aSToomas Soome 110*4a5d661aSToomas Soome #endif /* _SYS_LINKER_SET_H_ */ 111