X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gold%2Fscript-c.h;h=41e07009214f4d7a81f6e9033ef9a15d65fd9a84;hb=f6044a4be7f6f04e96f145ba045608e75e1e852b;hp=e40488985d0fac1f6d07e508a6e8f57011e695d9;hpb=dbe717effbdf31236088837f4686fd5ad5e71893;p=deliverable%2Fbinutils-gdb.git diff --git a/gold/script-c.h b/gold/script-c.h index e40488985d..41e0700921 100644 --- a/gold/script-c.h +++ b/gold/script-c.h @@ -1,15 +1,214 @@ /* script-c.h -- C interface for linker scripts in gold. */ +/* Copyright (C) 2006-2020 Free Software Foundation, Inc. + Written by Ian Lance Taylor . + + This file is part of gold. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + /* This file exists so that both the bison parser and script.cc can include it, so that they can communicate back and forth. */ #ifndef GOLD_SCRIPT_C_H #define GOLD_SCRIPT_C_H +#ifdef __cplusplus +#include +#include +#endif + +#ifdef __cplusplus + +// For the C++ code we declare the various supporting structures in +// the gold namespace. For the C code we declare it at the top level. +// The namespace level should not affect the layout of the structure. + +namespace gold +{ +#endif + +/* A string value for the bison parser. */ + +struct Parser_string +{ + const char* value; + size_t length; +}; + +/* The expression functions deal with pointers to Expression objects. + Since the bison parser generates C code, this is a hack to keep the + C++ code type safe. This hacks assumes that all pointers look + alike. */ + +#ifdef __cplusplus +class Expression; +typedef Expression* Expression_ptr; +#else +typedef void* Expression_ptr; +#endif + +/* Script_section type. */ +enum Script_section_type +{ + /* No section type. */ + SCRIPT_SECTION_TYPE_NONE, + SCRIPT_SECTION_TYPE_NOLOAD, + SCRIPT_SECTION_TYPE_DSECT, + SCRIPT_SECTION_TYPE_COPY, + SCRIPT_SECTION_TYPE_INFO, + SCRIPT_SECTION_TYPE_OVERLAY +}; + +/* A constraint for whether to use a particular output section + definition. */ + +enum Section_constraint +{ + /* No constraint. */ + CONSTRAINT_NONE, + /* Only if all input sections are read-only. */ + CONSTRAINT_ONLY_IF_RO, + /* Only if at least input section is writable. */ + CONSTRAINT_ONLY_IF_RW, + /* Special constraint. */ + CONSTRAINT_SPECIAL +}; + +/* The information we store for an output section header in the bison + parser. */ + +struct Parser_output_section_header +{ + /* The address. This may be NULL. */ + Expression_ptr address; + /* Section type. May be NULL string. */ + enum Script_section_type section_type; + /* The load address, from the AT specifier. This may be NULL. */ + Expression_ptr load_address; + /* The alignment, from the ALIGN specifier. This may be NULL. */ + Expression_ptr align; + /* The input section alignment, from the SUBALIGN specifier. This + may be NULL. */ + Expression_ptr subalign; + /* A constraint on this output section. */ + enum Section_constraint constraint; +}; + +/* We keep vectors of strings. In order to manage this in both C and + C++, we use a pointer to a vector. This assumes that all pointers + look the same. */ + +#ifdef __cplusplus +typedef std::vector String_list; +typedef String_list* String_list_ptr; +#else +typedef void* String_list_ptr; +#endif + +/* The information we store for an output section trailer in the bison + parser. */ + +struct Parser_output_section_trailer +{ + /* The fill value. This may be NULL. */ + Expression_ptr fill; + /* The program segments this section should go into. This may be + NULL. */ + String_list_ptr phdrs; +}; + +/* The different sorts we can find in a linker script. */ + +enum Sort_wildcard +{ + SORT_WILDCARD_NONE, + SORT_WILDCARD_BY_NAME, + SORT_WILDCARD_BY_ALIGNMENT, + SORT_WILDCARD_BY_NAME_BY_ALIGNMENT, + SORT_WILDCARD_BY_ALIGNMENT_BY_NAME, + SORT_WILDCARD_BY_INIT_PRIORITY +}; + +/* The information we build for a single wildcard specification. */ + +struct Wildcard_section +{ + /* The wildcard spec itself. */ + struct Parser_string name; + /* How the entries should be sorted. */ + enum Sort_wildcard sort; +}; + +/* A vector of Wildcard_section entries. */ + +#ifdef __cplusplus +typedef std::vector String_sort_list; +typedef String_sort_list* String_sort_list_ptr; +#else +typedef void* String_sort_list_ptr; +#endif + +/* A list of wildcard specifications, which may include EXCLUDE_FILE + clauses. */ + +struct Wildcard_sections +{ + /* Wildcard specs. */ + String_sort_list_ptr sections; + /* Exclusions. */ + String_list_ptr exclude; +}; + +/* A complete input section specification. */ + +struct Input_section_spec +{ + /* The file name. */ + struct Wildcard_section file; + /* The list of sections. */ + struct Wildcard_sections input_sections; +}; + +/* Information for a program header. */ + +struct Phdr_info +{ + /* A boolean value: whether to include the file header. */ + int includes_filehdr; + /* A boolean value: whether to include the program headers. */ + int includes_phdrs; + /* A boolean value: whether the flags field is valid. */ + int is_flags_valid; + /* The value to use for the flags. */ + unsigned int flags; + /* The load address. */ + Expression_ptr load_address; +}; + +struct Version_dependency_list; +struct Version_expression_list; +struct Version_tree; + #ifdef __cplusplus extern "C" { #endif +/* The bison parser definitions. */ + #include "yyscript.h" /* The bison parser function. */ @@ -27,10 +226,21 @@ yylex(YYSTYPE*, void* closure); extern void yyerror(void* closure, const char*); +/* Called by the bison parser to add an external symbol (a symbol in + an EXTERN declaration) to the link. */ + +extern void +script_add_extern(void* closure, const char*, size_t); + /* Called by the bison parser to add a file to the link. */ extern void -script_add_file(void* closure, const char*); +script_add_file(void* closure, const char*, size_t); + +/* Called by the bison parser to add a library to the link. */ + +extern void +script_add_library(void* closure, const char*, size_t); /* Called by the bison parser to start and stop a group. */ @@ -46,8 +256,312 @@ script_start_as_needed(void* closure); extern void script_end_as_needed(void* closure); +/* Called by the bison parser to set the entry symbol. */ + +extern void +script_set_entry(void* closure, const char*, size_t); + +/* Called by the bison parser to set whether to define common symbols. */ + +extern void +script_set_common_allocation(void* closure, int); + +/* Called by the bison parser to parse an OPTION. */ + +extern void +script_parse_option(void* closure, const char*, size_t); + +/* Called by the bison parser to handle OUTPUT_FORMAT. This return 0 + if the parse should be aborted. */ + +extern int +script_check_output_format(void* closure, const char*, size_t, + const char*, size_t, const char*, size_t); + +/* Called by the bison parser to handle TARGET. */ +extern void +script_set_target(void* closure, const char*, size_t); + +/* Called by the bison parser to handle SEARCH_DIR. */ + +extern void +script_add_search_dir(void* closure, const char*, size_t); + +/* Called by the bison parser to push the lexer into expression + mode. */ + +extern void +script_push_lex_into_expression_mode(void* closure); + +/* Called by the bison parser to push the lexer into version + mode. */ + +extern void +script_push_lex_into_version_mode(void* closure); + +/* Called by the bison parser to pop the lexer mode. */ + +extern void +script_pop_lex_mode(void* closure); + +/* Called by the bison parser to get the value of a symbol. This is + called for a reference to a symbol, but is not called for something + like "sym += 10". Uses of the special symbol "." can just call + script_exp_string. */ + +extern Expression_ptr +script_symbol(void* closure, const char*, size_t); + +/* Called by the bison parser to set a symbol to a value. PROVIDE is + non-zero if the symbol should be provided--only defined if there is + an undefined reference. HIDDEN is non-zero if the symbol should be + hidden. */ + +extern void +script_set_symbol(void* closure, const char*, size_t, Expression_ptr, + int provide, int hidden); + +/* Called by the bison parser to add an assertion. */ + +extern void +script_add_assertion(void* closure, Expression_ptr, const char* message, + size_t messagelen); + +/* Called by the bison parser to start a SECTIONS clause. */ + +extern void +script_start_sections(void* closure); + +/* Called by the bison parser to finish a SECTIONS clause. */ + +extern void +script_finish_sections(void* closure); + +/* Called by the bison parser to start handling input section + specifications for an output section. */ + +extern void +script_start_output_section(void* closure, const char* name, size_t namelen, + const struct Parser_output_section_header*); + +/* Called by the bison parser when done handling input section + specifications for an output section. */ + +extern void +script_finish_output_section(void* closure, + const struct Parser_output_section_trailer*); + +/* Called by the bison parser to handle a data statement (LONG, BYTE, + etc.) in an output section. */ + +extern void +script_add_data(void* closure, int data_token, Expression_ptr val); + +/* Called by the bison parser to set the fill value in an output + section. */ + +extern void +script_add_fill(void* closure, Expression_ptr val); + +/* Called by the bison parser to add an input section specification to + an output section. The KEEP parameter is non-zero if this is + within a KEEP clause, meaning that the garbage collector should not + discard it. */ + +extern void +script_add_input_section(void* closure, const struct Input_section_spec*, + int keep); + +/* Create a new list of string and sort entries. */ + +extern String_sort_list_ptr +script_new_string_sort_list(const struct Wildcard_section*); + +/* Add an entry to a list of string and sort entries. */ + +extern String_sort_list_ptr +script_string_sort_list_add(String_sort_list_ptr, + const struct Wildcard_section*); + +/* Create a new list of strings. */ + +extern String_list_ptr +script_new_string_list(const char*, size_t); + +/* Add an element to a list of strings. */ + +extern String_list_ptr +script_string_list_push_back(String_list_ptr, const char*, size_t); + +/* Concatenate two string lists. */ + +extern String_list_ptr +script_string_list_append(String_list_ptr, String_list_ptr); + +/* Define a new program header. */ + +extern void +script_add_phdr(void* closure, const char* name, size_t namelen, + unsigned int type, const struct Phdr_info*); + +/* Convert a program header string to a type. */ + +extern unsigned int +script_phdr_string_to_type(void* closure, const char*, size_t); + +/* Handle DATA_SEGMENT_ALIGN and DATA_SEGMENT_RELRO_END. */ + +extern void +script_data_segment_align(void* closure); + +extern void +script_data_segment_relro_end(void* closure); + +/* Record the fact that a SEGMENT_START expression is seen. */ + +extern void +script_saw_segment_start_expression(void* closure); + +/* Called by the bison parser for MEMORY regions. */ + +extern void +script_add_memory(void*, const char*, size_t, unsigned int, + Expression_ptr, Expression_ptr); + +extern unsigned int +script_parse_memory_attr(void*, const char*, size_t, int); + +extern void +script_set_section_region(void*, const char*, size_t, int); + +extern void +script_include_directive(int, void *, const char*, size_t); + +/* Called by the bison parser for expressions. */ + +extern Expression_ptr +script_exp_unary_minus(Expression_ptr); +extern Expression_ptr +script_exp_unary_logical_not(Expression_ptr); +extern Expression_ptr +script_exp_unary_bitwise_not(Expression_ptr); +extern Expression_ptr +script_exp_binary_mult(Expression_ptr, Expression_ptr); +extern Expression_ptr +script_exp_binary_div(Expression_ptr, Expression_ptr); +extern Expression_ptr +script_exp_binary_mod(Expression_ptr, Expression_ptr); +extern Expression_ptr +script_exp_binary_add(Expression_ptr, Expression_ptr); +extern Expression_ptr +script_exp_binary_sub(Expression_ptr, Expression_ptr); +extern Expression_ptr +script_exp_binary_lshift(Expression_ptr, Expression_ptr); +extern Expression_ptr +script_exp_binary_rshift(Expression_ptr, Expression_ptr); +extern Expression_ptr +script_exp_binary_eq(Expression_ptr, Expression_ptr); +extern Expression_ptr +script_exp_binary_ne(Expression_ptr, Expression_ptr); +extern Expression_ptr +script_exp_binary_le(Expression_ptr, Expression_ptr); +extern Expression_ptr +script_exp_binary_ge(Expression_ptr, Expression_ptr); +extern Expression_ptr +script_exp_binary_lt(Expression_ptr, Expression_ptr); +extern Expression_ptr +script_exp_binary_gt(Expression_ptr, Expression_ptr); +extern Expression_ptr +script_exp_binary_bitwise_and(Expression_ptr, Expression_ptr); +extern Expression_ptr +script_exp_binary_bitwise_xor(Expression_ptr, Expression_ptr); +extern Expression_ptr +script_exp_binary_bitwise_or(Expression_ptr, Expression_ptr); +extern Expression_ptr +script_exp_binary_logical_and(Expression_ptr, Expression_ptr); +extern Expression_ptr +script_exp_binary_logical_or(Expression_ptr, Expression_ptr); +extern Expression_ptr +script_exp_trinary_cond(Expression_ptr, Expression_ptr, Expression_ptr); +extern Expression_ptr +script_exp_integer(uint64_t); +extern Expression_ptr +script_exp_string(const char*, size_t); +extern Expression_ptr +script_exp_function_max(Expression_ptr, Expression_ptr); +extern Expression_ptr +script_exp_function_min(Expression_ptr, Expression_ptr); +extern Expression_ptr +script_exp_function_defined(const char*, size_t); +extern Expression_ptr +script_exp_function_sizeof_headers(void); +extern Expression_ptr +script_exp_function_alignof(const char*, size_t); +extern Expression_ptr +script_exp_function_sizeof(const char*, size_t); +extern Expression_ptr +script_exp_function_addr(const char*, size_t); +extern Expression_ptr +script_exp_function_loadaddr(const char*, size_t); +extern Expression_ptr +script_exp_function_origin(void*, const char*, size_t); +extern Expression_ptr +script_exp_function_length(void*, const char*, size_t); +extern Expression_ptr +script_exp_function_constant(const char*, size_t); +extern Expression_ptr +script_exp_function_absolute(Expression_ptr); +extern Expression_ptr +script_exp_function_align(Expression_ptr, Expression_ptr); +extern Expression_ptr +script_exp_function_data_segment_align(Expression_ptr, Expression_ptr); +extern Expression_ptr +script_exp_function_data_segment_relro_end(Expression_ptr, Expression_ptr); +extern Expression_ptr +script_exp_function_data_segment_end(Expression_ptr); +extern Expression_ptr +script_exp_function_segment_start(const char*, size_t, Expression_ptr); +extern Expression_ptr +script_exp_function_assert(Expression_ptr, const char*, size_t); + +extern void +script_register_vers_node(void* closure, + const char* tag, + int taglen, + struct Version_tree*, + struct Version_dependency_list*); + +extern struct Version_dependency_list* +script_add_vers_depend(void* closure, + struct Version_dependency_list* existing_dependencies, + const char* depend_to_add, int deplen); + +extern struct Version_expression_list* +script_new_vers_pattern(void* closure, + struct Version_expression_list*, + const char*, int, int); + +extern struct Version_expression_list* +script_merge_expressions(struct Version_expression_list* a, + struct Version_expression_list* b); + +extern struct Version_tree* +script_new_vers_node(void* closure, + struct Version_expression_list* global, + struct Version_expression_list* local); + +extern void +version_script_push_lang(void* closure, const char* lang, int langlen); + +extern void +version_script_pop_lang(void* closure); + +#ifdef __cplusplus +} // End extern "C" +#endif + #ifdef __cplusplus -} +} // End namespace gold. #endif #endif /* !defined(GOLD_SCRIPT_C_H) */