Mercurial > hg > index.cgi
view lwlink/lwlink.h @ 241:d0e9dbe9afbe
Add new heuristic for resolving instruction sizes.
Add new heuristic for resolving instruction sizes. This applies to the the
decision between extended and base page addressing by calculating the range
of possible addresses (if reasonably knowable) and deciding on whether to
force extended addressing based on that. (If the whole range is outside the
direct page, extended addressing is required.)
author | William Astle <lost@l-w.ca> |
---|---|
date | Sun, 23 Sep 2012 13:06:43 -0600 |
parents | ce1fdc8d6568 |
children | 7de7b14ebaee |
line wrap: on
line source
/* lwlink.h Copyright © 2009 William Astle This file is part of LWLINK. LWLINK 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, see <http://www.gnu.org/licenses/>. Contains the main defs used by the linker */ #ifndef __lwlink_h_seen__ #define __lwlink_h_seen__ #include "expr.h" #define OUTPUT_DECB 0 // DECB multirecord format #define OUTPUT_RAW 1 // raw sequence of bytes #define OUTPUT_LWEX0 2 // LWOS LWEX binary version 0 #define OUTPUT_OS9 3 // OS9 object code module typedef struct symtab_s symtab_t; struct symtab_s { unsigned char *sym; // symbol name int offset; // local offset // int realval; // resolved value symtab_t *next; // next symbol }; #define RELOC_NORM 0 // all default (16 bit) #define RELOC_8BIT 1 // only use the low 8 bits for the reloc typedef struct reloc_s reloc_t; struct reloc_s { int offset; // where in the section int flags; // flags for the relocation lw_expr_stack_t *expr; // the expression to calculate it reloc_t *next; // ptr to next relocation }; typedef struct fileinfo_s fileinfo_t; #define SECTION_BSS 1 #define SECTION_CONST 2 typedef struct { unsigned char *name; // name of the section int flags; // section flags int codesize; // size of the code unsigned char *code; // pointer to the code int loadaddress; // the actual load address of the section int processed; // was the section processed yet? symtab_t *localsyms; // local symbol table symtab_t *exportedsyms; // exported symbols table reloc_t *incompletes; // table of incomplete references fileinfo_t *file; // the file we are in int aftersize; // add this many bytes after section on output unsigned char *afterbytes; // add these bytes after section on output } section_t; struct fileinfo_s { char *filename; unsigned char *filedata; long filesize; section_t *sections; int nsections; int islib; // set to true if the file is a "-l" option int forced; // set to true if the file is a "forced" include // "sub" files (like in archives or libraries) int nsubs; fileinfo_t **subs; fileinfo_t *parent; }; struct section_list { section_t *ptr; // ptr to section structure int forceaddr; // was this force to an address by the link script? }; typedef struct sectopt_s sectopt_t; struct sectopt_s { char *name; // section name int aftersize; // number of bytes to append to section unsigned char *afterbytes; // the bytes to store after the section sectopt_t *next; // next section option }; #ifndef __link_c_seen__ extern struct section_list *sectlist; extern int nsects; extern sectopt_t *section_opts; #endif #ifndef __lwlink_c_seen__ extern int debug_level; extern int outformat; extern char *outfile; extern int ninputfiles; extern fileinfo_t **inputfiles; extern char *scriptfile; extern char *entrysym; extern int nlibdirs; extern char **libdirs; extern int nscriptls; extern char **scriptls; extern int symerr; extern char *map_file; extern char *sysroot; #define __lwlink_E__ extern #else #define __lwlink_E__ #endif // __lwlink_c_seen__ __lwlink_E__ void add_input_file(char *fn); __lwlink_E__ void add_input_library(char *fn); __lwlink_E__ void add_library_search(char *fn); __lwlink_E__ void add_section_base(char *fn); __lwlink_E__ char *sanitize_symbol(char *sym); #undef __lwlink_E__ struct scriptline_s { char *sectname; // name of section, NULL for wildcard int loadat; // address to load at (or -1) int noflags; // flags to NOT have int yesflags; // flags to HAVE }; typedef struct { int nlines; // number of lines in the script struct scriptline_s *lines; // the parsed script lines (section) int padsize; // the size to pad to, -1 for none char *execsym; // entry point symbol int execaddr; // execution address (entry point) int stacksize; // stack size int modtype; // module type int modlang; // module language int modattr; // module attributes int modrev; // module revision char *name; // module name char *basesympat; // pattern for section base symbol (%s for section name) char *lensympat; // pattern for section length symbol (%s for section name) } linkscript_t; #ifndef __script_c_seen__ extern linkscript_t linkscript; #endif typedef struct symlist_s symlist_t; struct symlist_s { char *sym; int val; symlist_t *next; }; extern symlist_t *symlist; #endif //__lwlink_h_seen__