xref: /netbsd-src/external/bsd/elftoolchain/dist/libelf/libelf_fsize.m4 (revision 5ac3bc719ce6e70593039505b491894133237d12)
1*5ac3bc71Schristosdnl 	$NetBSD: libelf_fsize.m4,v 1.5 2024/03/03 17:37:34 christos Exp $
29dd9d0cfSchristos/*-
39dd9d0cfSchristos * Copyright (c) 2006,2008-2011 Joseph Koshy
49dd9d0cfSchristos * All rights reserved.
59dd9d0cfSchristos *
69dd9d0cfSchristos * Redistribution and use in source and binary forms, with or without
79dd9d0cfSchristos * modification, are permitted provided that the following conditions
89dd9d0cfSchristos * are met:
99dd9d0cfSchristos * 1. Redistributions of source code must retain the above copyright
109dd9d0cfSchristos *    notice, this list of conditions and the following disclaimer.
119dd9d0cfSchristos * 2. Redistributions in binary form must reproduce the above copyright
129dd9d0cfSchristos *    notice, this list of conditions and the following disclaimer in the
139dd9d0cfSchristos *    documentation and/or other materials provided with the distribution.
149dd9d0cfSchristos *
159dd9d0cfSchristos * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
169dd9d0cfSchristos * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
179dd9d0cfSchristos * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
189dd9d0cfSchristos * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
199dd9d0cfSchristos * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
209dd9d0cfSchristos * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
219dd9d0cfSchristos * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
229dd9d0cfSchristos * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
239dd9d0cfSchristos * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
249dd9d0cfSchristos * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
259dd9d0cfSchristos * SUCH DAMAGE.
269dd9d0cfSchristos */
279dd9d0cfSchristos
28*5ac3bc71Schristos#include <sys/cdefs.h>
29*5ac3bc71Schristos
309dd9d0cfSchristos#include <libelf.h>
319dd9d0cfSchristos
329dd9d0cfSchristos#include "_libelf.h"
339dd9d0cfSchristos
34*5ac3bc71Schristos__RCSID("$NetBSD: libelf_fsize.m4,v 1.5 2024/03/03 17:37:34 christos Exp $");
35*5ac3bc71SchristosELFTC_VCSID("Id: libelf_fsize.m4 3977 2022-05-01 06:45:34Z jkoshy");
369dd9d0cfSchristos
379dd9d0cfSchristos/* WARNING: GENERATED FROM __file__. */
389dd9d0cfSchristos
399dd9d0cfSchristos/*
409dd9d0cfSchristos * Create an array of file sizes from the elf_type definitions
419dd9d0cfSchristos */
429dd9d0cfSchristos
439dd9d0cfSchristosdivert(-1)
449dd9d0cfSchristosinclude(SRCDIR`/elf_types.m4')
459dd9d0cfSchristos
469dd9d0cfSchristos/*
479dd9d0cfSchristos * Translations from structure definitions to the size of their file
489dd9d0cfSchristos * representations.
499dd9d0cfSchristos */
509dd9d0cfSchristos
519dd9d0cfSchristos/* `Basic' types. */
529dd9d0cfSchristosdefine(`BYTE_SIZE',	1)
539dd9d0cfSchristosdefine(`IDENT_SIZE',	`EI_NIDENT')
549dd9d0cfSchristos
559dd9d0cfSchristos/* Types that have variable length. */
569dd9d0cfSchristosdefine(`GNUHASH_SIZE',	1)
579dd9d0cfSchristosdefine(`NOTE_SIZE',	1)
589dd9d0cfSchristosdefine(`VDEF_SIZE',	1)
599dd9d0cfSchristosdefine(`VNEED_SIZE',	1)
609dd9d0cfSchristos
619dd9d0cfSchristos/* Currently unimplemented types. */
629dd9d0cfSchristosdefine(`MOVEP_SIZE',	0)
639dd9d0cfSchristos
649dd9d0cfSchristos/* Overrides for 32 bit types that do not exist. */
659dd9d0cfSchristosdefine(`XWORD_SIZE32',	0)
669dd9d0cfSchristosdefine(`SXWORD_SIZE32',	0)
679dd9d0cfSchristos
689dd9d0cfSchristos/*
699dd9d0cfSchristos * FSZ{32,64} define the sizes of 32 and 64 bit file structures respectively.
709dd9d0cfSchristos */
719dd9d0cfSchristos
729dd9d0cfSchristosdefine(`FSZ32',`_FSZ32($1_DEF)')
739dd9d0cfSchristosdefine(`_FSZ32',
749dd9d0cfSchristos  `ifelse($#,1,0,
759dd9d0cfSchristos    `_BSZ32($1)+_FSZ32(shift($@))')')
769dd9d0cfSchristosdefine(`_BSZ32',`$2_SIZE32')
779dd9d0cfSchristos
789dd9d0cfSchristosdefine(`FSZ64',`_FSZ64($1_DEF)')
799dd9d0cfSchristosdefine(`_FSZ64',
809dd9d0cfSchristos  `ifelse($#,1,0,
819dd9d0cfSchristos    `_BSZ64($1)+_FSZ64(shift($@))')')
829dd9d0cfSchristosdefine(`_BSZ64',`$2_SIZE64')
839dd9d0cfSchristos
849dd9d0cfSchristos/*
859dd9d0cfSchristos * DEFINE_ELF_FSIZES(TYPE,NAME)
869dd9d0cfSchristos *
879dd9d0cfSchristos * Shorthand for defining  for 32 and 64 versions
889dd9d0cfSchristos * of elf type TYPE.
899dd9d0cfSchristos *
909dd9d0cfSchristos * If TYPE`'_SIZE is defined, use its value for both 32 bit and 64 bit
919dd9d0cfSchristos * sizes.
929dd9d0cfSchristos *
939dd9d0cfSchristos * Otherwise, look for a explicit 32/64 bit size definition for TYPE,
949dd9d0cfSchristos * TYPE`'_SIZE32 or TYPE`'_SIZE64. If this definition is present, there
959dd9d0cfSchristos * is nothing further to do.
969dd9d0cfSchristos *
979dd9d0cfSchristos * Otherwise, if an Elf{32,64}_`'NAME structure definition is known,
989dd9d0cfSchristos * compute an expression that adds up the sizes of the structure's
999dd9d0cfSchristos * constituents.
1009dd9d0cfSchristos *
1019dd9d0cfSchristos * If such a structure definition is not known, treat TYPE as a primitive
1029dd9d0cfSchristos * (i.e., integral) type and use sizeof(Elf{32,64}_`'NAME) to get its
1039dd9d0cfSchristos * file representation size.
1049dd9d0cfSchristos */
1059dd9d0cfSchristos
1069dd9d0cfSchristosdefine(`DEFINE_ELF_FSIZE',
1079dd9d0cfSchristos  `ifdef($1`_SIZE',
1089dd9d0cfSchristos    `define($1_SIZE32,$1_SIZE)
1099dd9d0cfSchristos     define($1_SIZE64,$1_SIZE)',
1109dd9d0cfSchristos    `ifdef($1`_SIZE32',`',
1119dd9d0cfSchristos      `ifdef(`Elf32_'$2`_DEF',
1129dd9d0cfSchristos        `define($1_SIZE32,FSZ32(Elf32_$2))',
1139dd9d0cfSchristos        `define($1_SIZE32,`sizeof(Elf32_'$2`)')')')
1149dd9d0cfSchristos     ifdef($1`_SIZE64',`',
1159dd9d0cfSchristos      `ifdef(`Elf64_'$2`_DEF',
1169dd9d0cfSchristos        `define($1_SIZE64,FSZ64(Elf64_$2))',
1179dd9d0cfSchristos        `define($1_SIZE64,`sizeof(Elf64_'$2`)')')')')')
1189dd9d0cfSchristos
1199dd9d0cfSchristosdefine(`DEFINE_ELF_FSIZES',
1209dd9d0cfSchristos  `ifelse($#,1,`',
1219dd9d0cfSchristos    `DEFINE_ELF_FSIZE($1)
1229dd9d0cfSchristos     DEFINE_ELF_FSIZES(shift($@))')')
1239dd9d0cfSchristos
1249dd9d0cfSchristosDEFINE_ELF_FSIZES(ELF_TYPE_LIST)
1259dd9d0cfSchristosDEFINE_ELF_FSIZE(`IDENT',`')	# `IDENT' is a pseudo type
1269dd9d0cfSchristos
1279dd9d0cfSchristosdefine(`FSIZE',
1289dd9d0cfSchristos  `[ELF_T_$1] = { .fsz32 = $1_SIZE32, .fsz64 = $1_SIZE64 },
1299dd9d0cfSchristos')
1309dd9d0cfSchristosdefine(`FSIZES',
1319dd9d0cfSchristos  `ifelse($#,1,`',
1329dd9d0cfSchristos    `FSIZE($1)
1339dd9d0cfSchristosFSIZES(shift($@))')')
1349dd9d0cfSchristos
1359dd9d0cfSchristosdivert(0)
1369dd9d0cfSchristos
1379dd9d0cfSchristosstruct fsize {
1389dd9d0cfSchristos	size_t fsz32;
1399dd9d0cfSchristos	size_t fsz64;
1409dd9d0cfSchristos};
1419dd9d0cfSchristos
1429dd9d0cfSchristosstatic struct fsize fsize[ELF_T_NUM] = {
1439dd9d0cfSchristosFSIZES(ELF_TYPE_LIST)
1449dd9d0cfSchristos};
1459dd9d0cfSchristos
1469dd9d0cfSchristossize_t
1479dd9d0cfSchristos_libelf_fsize(Elf_Type t, int ec, unsigned int v, size_t c)
1489dd9d0cfSchristos{
1499dd9d0cfSchristos	size_t sz;
1509dd9d0cfSchristos
1519dd9d0cfSchristos	sz = 0;
1529dd9d0cfSchristos	if (v != EV_CURRENT)
1539dd9d0cfSchristos		LIBELF_SET_ERROR(VERSION, 0);
1549dd9d0cfSchristos	else if ((int) t < ELF_T_FIRST || t > ELF_T_LAST)
1559dd9d0cfSchristos		LIBELF_SET_ERROR(ARGUMENT, 0);
1569dd9d0cfSchristos	else {
1579dd9d0cfSchristos		sz = ec == ELFCLASS64 ? fsize[t].fsz64 : fsize[t].fsz32;
1589dd9d0cfSchristos		if (sz == 0)
1599dd9d0cfSchristos			LIBELF_SET_ERROR(UNIMPL, 0);
1609dd9d0cfSchristos	}
1619dd9d0cfSchristos
1629dd9d0cfSchristos	return (sz*c);
1639dd9d0cfSchristos}
164