69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * CDDL HEADER START
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * The contents of this file are subject to the terms of the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Common Development and Distribution License (the "License").
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * You may not use this file except in compliance with the License.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * or http://www.opensolaris.org/os/licensing.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * See the License for the specific language governing permissions
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * and limitations under the License.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * When distributing Covered Code, include this CDDL HEADER in each
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * If applicable, add the following below this CDDL HEADER, with the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * fields enclosed by brackets "[]" replaced with your own identifying
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * information: Portions Copyright [yyyy] [name of copyright owner]
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * CDDL HEADER END
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
1007fd6fd24227460e77ce89f5ca85641a85a576Ali Bahrami * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Local include file for libld mapfile subsystem.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#ifndef _MAP_DOT_H
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define _MAP_DOT_H
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#ifdef __cplusplus
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern "C" {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#endif
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Macro used to size name buffer corresponding to a NULL terminated array
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * of structures each of which contains a name string. Macro is used per-name.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * 2 extra characters are allowed per item to allow for a ', ' delimiter
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * or NULL termination.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define KW_NAME_SIZE(_size) (_size##_SIZE + 2)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Variant of isspace() that excludes newline characters. Requires <ctype.h>.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define isspace_nonl(_s) (isspace(_s) && ((_s) != '\n'))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Type used to insert NULL characters in the mapfile text and later
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * back them out and restore the original character. The mapfile text
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * is held in a single string, so when we want to access sub-strings,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * it is necessary to temporarily insert NULLs to prevent the entire
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mapfile from that point forward being output.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramitypedef struct {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami char *np_ptr; /* Address patched with NULL character */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami char np_ch; /* Character originally found at *np_ptr */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami} ld_map_npatch_t;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ld_map_gettoken() uses a table of 128 bytes to determine how to
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * process a token starting with any 7-bit ASCII value. The table is
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * indexed by the character code, and returns one of the TK_* token values.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramitypedef const char mf_tokdisp_t[128];
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * The definition of an unquoted identifier differs based on the mapfile
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * version. Rather than write a separate function to locate identifiers
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * for each version, we use a single function that relies on a per-character
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * table that encodes which characters can start an identifier, and which
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * can continue one, for each supported mapfile version.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Two bits are used for each version, one for the start attribute, and the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * other for continuation. The first two bits are not used (version 0), the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * next 2 are used for version 1, the following 2 for version 2, and so on.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define TKID_ATTR_B_START 1
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define TKID_ATTR_B_CONT 2
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define TKID_ATTR_START(_ver) (TKID_ATTR_B_START << (_ver * 2))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define TKID_ATTR_CONT(_ver) (TKID_ATTR_B_CONT << (_ver * 2))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* Convenience macros for chars that both start and continue an identifier */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define TKID_ATTR(_ver) ((TKID_ATTR_B_START | TKID_ATTR_B_CONT) << (_ver * 2))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * State for a mapfile held in memory.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramitypedef struct {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Ofl_desc *mf_ofl; /* Output descriptor being processed */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami char *mf_name; /* Mapfile name */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Ifl_desc *mf_ifl; /* NULL, or pseudo input file */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* descriptor from ld_map_ifl() */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami char *mf_text; /* Text of mapfile */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami char *mf_next; /* Next char in mapfile to examine */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami const char *mf_tokdisp; /* mf_tokdisp_t dispatch table to use */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Lineno mf_lineno; /* Line # within mf_text */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami int mf_version; /* Mapfile syntax version */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami int mf_tkid_start; /* TKID bitvalue for characters that */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* start an unquoted identifier */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami int mf_tkid_cont; /* TKID bitvalue for characters that */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* continue an unquoted ident. */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami int mf_next_ch; /* 0, or character read from *mf_next */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* prior to inserting NULL */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Aliste mf_ec_insndx; /* Insert index for entrance criteria */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Each mapfile starts at the */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* top, inserting each ec in the */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* file in the order seen. */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami} Mapfile;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * A very large percentage of mapfile errors start with the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * calling sequence:
1007fd6fd24227460e77ce89f5ca85641a85a576Ali Bahrami * ld_eprintf(ofl, ERR_XXX, format, mf->mf_name, mf->mf_lineno...)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * The mf_fatal() and mf_warn() varadic macros are used to supply all
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * of boilerplate, resulting in visually simpler code.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf_fatal0()/mf_warn0() are used when the format does not require any
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * additional arguments and the varargs list is empty. The GNU cpp has a
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * syntax for eliminating the extra comma (, ##__VA_ARGS__), but this isn't
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * supported by the Sun compilers yet.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define mf_fatal0(_mf, _fmt) \
1007fd6fd24227460e77ce89f5ca85641a85a576Ali Bahrami ld_eprintf((_mf)->mf_ofl, ERR_FATAL, _fmt, (_mf)->mf_name, \
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami EC_LINENO((_mf)->mf_lineno))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define mf_fatal(_mf, _fmt, ...) \
1007fd6fd24227460e77ce89f5ca85641a85a576Ali Bahrami ld_eprintf((_mf)->mf_ofl, ERR_FATAL, _fmt, (_mf)->mf_name, \
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami EC_LINENO((_mf)->mf_lineno), __VA_ARGS__)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define mf_warn0(_mf, _fmt) \
1007fd6fd24227460e77ce89f5ca85641a85a576Ali Bahrami ld_eprintf((_mf)->mf_ofl, ERR_WARNING, _fmt, (_mf)->mf_name, \
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami EC_LINENO((_mf)->mf_lineno))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define mf_warn(_mf, _fmt, ...) \
1007fd6fd24227460e77ce89f5ca85641a85a576Ali Bahrami ld_eprintf((_mf)->mf_ofl, ERR_WARNING, _fmt, (_mf)->mf_name, \
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami EC_LINENO((_mf)->mf_lineno), __VA_ARGS__)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* Possible return values from ld_map_gettoken */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramitypedef enum {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_ERROR = -1, /* Error in lexical analysis */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_EOF = 0, /* End of file: Requires TK_F_EOFOK to be set */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* or EOF results in TK_ERROR */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_STRING = 1, /* String literal */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_COLON = 2, /* : */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_SEMICOLON = 3, /* ; */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_EQUAL = 4, /* = */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_PLUSEQ = 5, /* += */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_MINUSEQ = 6, /* -= */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_ATSIGN = 7, /* @ */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_DASH = 8, /* - */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_LEFTBKT = 9, /* { */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_RIGHTBKT = 10, /* } */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_PIPE = 11, /* | */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_INT = 12, /* Integer value: Unsigned machine word */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_STAR = 13, /* * */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_BANG = 14, /* ! */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Items below this point are for the use of ld_map_gettoken().
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * They indicate a character that requires the lexical analyzer
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * to carry out some additional computation (OPeration), resulting
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * in one of the simple token types above, which is returned to
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * the caller. The TK_OP_ tokens are implementation details that are
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * never returned to a caller of ld_map_gettoken().
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_OP_EOF, /* end of file */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_OP_ILLCHR, /* unprintable illegal character */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_OP_BADCHR, /* printable but unexpected character */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_OP_WS, /* whitespace */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_OP_NL, /* newline */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_OP_SIMQUOTE, /* simple quoting */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_OP_CQUOTE, /* quoting with C string literal escapes */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_OP_CMT, /* Comment */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_OP_CDIR, /* Control directive */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_OP_NUM, /* Decimial, hex, or octal value */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_OP_ID, /* unquoted identifier using syntax rules */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* appropriate for mapfile version */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_OP_CEQUAL, /* One of += or -= */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami} Token;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Type used by ld_map_gettoken() to return values for token types that
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * have them.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramitypedef union {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami char *tkv_str; /* TK_STRING */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami struct { /* TK_INT */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami char *tkvi_str; /* String making up integer */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami size_t tkvi_cnt; /* # characters in tkvi_str */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Xword tkvi_value; /* Resulting value */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } tkv_int;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami} ld_map_tkval_t;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Values for gettoken() flags argument. These flags are used to
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * alter gettoken() default behavior under certain conditions.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define TK_F_EOFOK 1 /* Quietly return TK_EOF instead of normal */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* TK_ERROR "premature EOF" error */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define TK_F_STRLC 2 /* TK_STRING: Convert string to lowercase */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define TK_F_KEYWORD 4 /* For directives and attributes: Disallow */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* quoted TK_STRING tokens */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Possible return values from ld_map_strtoxword()
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramitypedef enum {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami STRTOXWORD_OK, /* Operation successful */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami STRTOXWORD_TOOBIG, /* Otherwise valid value is too large */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami STRTOXWORD_BAD /* String not recognized as an integer */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami} ld_map_strtoxword_t;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Possible return values from ld_map_seg_insert()
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramitypedef enum {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami SEG_INS_OK = 0, /* Segment was inserted */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami SEG_INS_FAIL = 1, /* Segment not inserted --- fatal */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami SEG_INS_SKIP = 2 /* Segment not inserted --- ignore */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami} ld_map_seg_ins_t;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Enumeration of different symbol scope possible in a mapfile
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramitypedef enum {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami FLG_SCOPE_HIDD, /* symbol defined hidden/local */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami FLG_SCOPE_DFLT, /* symbol defined default/global */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami FLG_SCOPE_PROT, /* symbol defined protected/symbolic */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami FLG_SCOPE_EXPT, /* symbol defined exported */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami FLG_SCOPE_SNGL, /* symbol defined singleton */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami FLG_SCOPE_ELIM /* symbol defined eliminate */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami} ld_map_scope_t;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* State of a mapfile symbol version */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramitypedef struct {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami const char *mv_name; /* NULL, or version name */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Ver_desc *mv_vdp; /* Descriptor for version */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_scope_t mv_scope; /* Current scope type */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami size_t mv_errcnt; /* Count of errors against version */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami} ld_map_ver_t;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* State of a mapfile symbol definition */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramitypedef struct {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami const char *ms_name; /* symbol name */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sd_flag_t ms_sdflags; /* 0 / mapfile set flags */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Word ms_shndx; /* SHN_UNDEF / mapfile set sec index */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami uchar_t ms_type; /* STT_NOTYPE / mapfile set type */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Addr ms_value; /* user set value, if ms_value_set */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Addr ms_size; /* 0 / mapfile set size */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami const char *ms_filtee; /* NULL or filtee name */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Boolean ms_value_set; /* TRUE if ms_value set, even if to 0 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Word ms_dft_flag; /* 0, or type of filter in ms_filtee */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami} ld_map_sym_t;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#if defined(_ELF64)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_cap_sanitize ld64_map_cap_sanitize
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_cap_set_ovflag ld64_map_cap_set_ovflag
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_dv ld64_map_dv
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_dv_entry ld64_map_dv_entry
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_gettoken ld64_map_gettoken
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_ifl ld64_map_ifl
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_parse_v1 ld64_map_parse_v1
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_parse_v2 ld64_map_parse_v2
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_seg_alloc ld64_map_seg_alloc
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_seg_ent_add ld64_map_seg_ent_add
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_seg_ent_files ld64_map_seg_ent_files
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_seg_index ld64_map_seg_index
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_seg_insert ld64_map_seg_insert
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_seg_lookup ld64_map_seg_lookup
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_seg_os_order_add ld64_map_seg_os_order_add
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_seg_size_symbol ld64_map_seg_size_symbol
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_seg_stack ld64_map_seg_stack
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_strtoxword ld64_map_strtoxword
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_sym_enter ld64_map_sym_enter
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_sym_filtee ld64_map_sym_filtee
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_sym_scope ld64_map_sym_scope
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_sym_autoreduce ld64_map_sym_autoreduce
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_sym_ver_fini ld64_map_sym_ver_fini
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_sym_ver_init ld64_map_sym_ver_init
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_tokenstr ld64_map_tokenstr
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#else
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_cap_sanitize ld32_map_cap_sanitize
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_cap_set_ovflag ld32_map_cap_set_ovflag
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_dv ld32_map_dv
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_dv_entry ld32_map_dv_entry
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_gettoken ld32_map_gettoken
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_ifl ld32_map_ifl
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_parse_v1 ld32_map_parse_v1
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_parse_v2 ld32_map_parse_v2
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_seg_alloc ld32_map_seg_alloc
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_seg_ent_add ld32_map_seg_ent_add
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_seg_ent_files ld32_map_seg_ent_files
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_seg_index ld32_map_seg_index
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_seg_insert ld32_map_seg_insert
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_seg_lookup ld32_map_seg_lookup
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_seg_os_order_add ld32_map_seg_os_order_add
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_seg_size_symbol ld32_map_seg_size_symbol
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_seg_stack ld32_map_seg_stack
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_strtoxword ld32_map_strtoxword
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_sym_enter ld32_map_sym_enter
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_sym_filtee ld32_map_sym_filtee
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_sym_scope ld32_map_sym_scope
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_sym_autoreduce ld32_map_sym_autoreduce
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_sym_ver_fini ld32_map_sym_ver_fini
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_sym_ver_init ld32_map_sym_ver_init
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ld_map_tokenstr ld32_map_tokenstr
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#endif
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Core functions used to parse mapfiles
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern void ld_map_lowercase(char *);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern Token ld_map_gettoken(Mapfile *, int, ld_map_tkval_t *);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern Boolean ld_map_parse_v1(Mapfile *);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern Boolean ld_map_parse_v2(Mapfile *);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern ld_map_strtoxword_t ld_map_strtoxword(const char *restrict,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami char **restrict, Xword *);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern const char *ld_map_tokenstr(Token, ld_map_tkval_t *,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t *);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Support code shared between the different mapfile parsing code, used to
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * provide a common implementation manipulating link-editor state.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evansextern Boolean ld_map_cap_sanitize(Mapfile *, Word, Capmask *);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern void ld_map_cap_set_ovflag(Mapfile *, Word);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern void *ld_map_kwfind(const char *, void *, size_t, size_t);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern char *ld_map_kwnames(void *, size_t, size_t, char *, size_t);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern Sdf_desc *ld_map_dv(Mapfile *, const char *);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern Boolean ld_map_dv_entry(Mapfile *, Sdf_desc *, Boolean,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami const char *);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern Ifl_desc *ld_map_ifl(Mapfile *);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern Sg_desc *ld_map_seg_alloc(const char *, Word, sg_flags_t);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern Ent_desc *ld_map_seg_ent_add(Mapfile *, Sg_desc *, const char *);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern Boolean ld_map_seg_ent_files(Mapfile *mf, Ent_desc *,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Word, const char *);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern Xword ld_map_seg_index(Mapfile *, Sg_desc *);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern ld_map_seg_ins_t ld_map_seg_insert(Mapfile *, dbg_state_t, Sg_desc *,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami avl_index_t where);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern Boolean ld_map_seg_os_order_add(Mapfile *, Sg_desc *,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami const char *);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern Boolean ld_map_seg_size_symbol(Mapfile *, Sg_desc *, Token,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami const char *symname);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern Sg_desc *ld_map_seg_stack(Mapfile *);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern Boolean ld_map_sym_enter(Mapfile *, ld_map_ver_t *,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_sym_t *);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern void ld_map_sym_filtee(Mapfile *, ld_map_ver_t *,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_sym_t *, Word, const char *);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern void ld_map_sym_scope(Mapfile *, const char *,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_ver_t *);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern void ld_map_sym_autoreduce(Mapfile *, ld_map_ver_t *);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern Boolean ld_map_sym_ver_fini(Mapfile *, ld_map_ver_t *);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiextern Boolean ld_map_sym_ver_init(Mapfile *, char *, ld_map_ver_t *);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#ifdef __cplusplus
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#endif
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#endif /* _MAP_DOT_H */