| This is a loose collection of notes for people hacking on simulators. | |
| If this document gets big enough it can be prettied up then. | |
| Contents | |
| - The "common" directory | |
| - Common Makefile Support | |
| - TAGS support | |
| - Generating "configure" files | |
| - tconfig.in | |
| - C Language Assumptions | |
| - "dump" commands under gdb | |
| The "common" directory | |
| ====================== | |
| The common directory contains: | |
| - common documentation files (e.g. run.1, and maybe in time .texi files) | |
| - common source files (e.g. run.c) | |
| - common Makefile fragment and configury (e.g. Make-common.in, aclocal.m4). | |
| In addition "common" contains portions of the system call support | |
| (e.g. callback.c, nltvals.def). | |
| Even though no files are built in this directory, it is still configured | |
| so support for regenerating nltvals.def is present. | |
| Common Makefile Support | |
| ======================= | |
| A common configuration framework is available for simulators that want | |
| to use it. The common framework exists to remove a lot of duplication | |
| in configure.in and Makefile.in, and it also provides a foundation for | |
| enhancing the simulators uniformly (e.g. the more they share in common | |
| the easier a feature added to one is added to all). | |
| The configure.in of a simulator using the common framework should look like: | |
| --- snip --- | |
| dnl Process this file with autoconf to produce a configure script. | |
| sinclude(../common/aclocal.m4) | |
| AC_PREREQ(2.5)dnl | |
| AC_INIT(Makefile.in) | |
| SIM_AC_COMMON | |
| ... target specific additions ... | |
| SIM_AC_OUTPUT | |
| --- snip --- | |
| SIM_AC_COMMON: | |
| - invokes the autoconf macros most often used by the simulators | |
| - defines --enable/--with options usable by all simulators | |
| - initializes sim_link_files/sim_link_links as the set of symbolic links | |
| to set up | |
| SIM_AC_OUTPUT: | |
| - creates the symbolic links defined in sim_link_{files,links} | |
| - creates config.h | |
| - creates the Makefile | |
| The Makefile.in of a simulator using the common framework should look like: | |
| --- snip --- | |
| # Makefile for blah ... | |
| # Copyright blah ... | |
| ## COMMON_PRE_CONFIG_FRAG | |
| # These variables are given default values in COMMON_PRE_CONFIG_FRAG. | |
| # We override the ones we need to here. | |
| # Not all of these need to be mentioned, only the necessary ones. | |
| # In fact it is better to *not* mention ones if the value is the default. | |
| # List of object files, less common parts. | |
| SIM_OBJS = | |
| # List of extra dependencies. | |
| # Generally this consists of simulator specific files included by sim-main.h. | |
| SIM_EXTRA_DEPS = | |
| # List of flags to always pass to $(CC). | |
| SIM_EXTRA_CFLAGS = | |
| # List of extra libraries to link with. | |
| SIM_EXTRA_LIBS = | |
| # List of extra program dependencies. | |
| SIM_EXTRA_LIBDEPS = | |
| # List of main object files for `run'. | |
| SIM_RUN_OBJS = run.o | |
| # Dependency of `all' to build any extra files. | |
| SIM_EXTRA_ALL = | |
| # Dependency of `install' to install any extra files. | |
| SIM_EXTRA_INSTALL = | |
| # Dependency of `clean' to clean any extra files. | |
| SIM_EXTRA_CLEAN = | |
| ## COMMON_POST_CONFIG_FRAG | |
| # Rules need to build $(SIM_OBJS), plus whatever else the target wants. | |
| ... target specific rules ... | |
| --- snip --- | |
| COMMON_{PRE,POST}_CONFIG_FRAG are markers for SIM_AC_OUTPUT to tell it | |
| where to insert the two pieces of common/Make-common.in. | |
| The resulting Makefile is created by doing autoconf substitions on | |
| both the target's Makefile.in and Make-common.in, and inserting | |
| the two pieces of Make-common.in into the target's Makefile.in at | |
| COMMON_{PRE,POST}_CONFIG_FRAG. | |
| Note that SIM_EXTRA_{INSTALL,CLEAN} could be removed and "::" targets | |
| could be used instead. However, it's not clear yet whether "::" targets | |
| are portable enough. | |
| TAGS support | |
| ============ | |
| Many files generate program symbols at compile time. | |
| Such symbols can't be found with grep nor do they normally appear in | |
| the TAGS file. To get around this, source files can add the comment | |
| /* TAGS: foo1 foo2 */ | |
| where foo1, foo2 are program symbols. Symbols found in such comments | |
| are greppable and appear in the TAGS file. | |
| Generating "configure" files | |
| ============================ | |
| For targets using the common framework, "configure" can be generated | |
| by running `autoconf'. | |
| To regenerate the configure files for all targets using the common framework: | |
| $ cd devo/sim | |
| $ make -f Makefile.in SHELL=/bin/sh autoconf-common | |
| To add a change-log entry to the ChangeLog file for each updated | |
| directory (WARNING - check the modified new-ChangeLog files before | |
| renaming): | |
| $ make -f Makefile.in SHELL=/bin/sh autoconf-changelog | |
| $ more */new-ChangeLog | |
| $ make -f Makefile.in SHELL=/bin/sh autoconf-install | |
| In a similar vein, both the configure and config.in files can be | |
| updated using the sequence: | |
| $ cd devo/sim | |
| $ make -f Makefile.in SHELL=/bin/sh autoheader-common | |
| $ make -f Makefile.in SHELL=/bin/sh autoheader-changelog | |
| $ more */new-ChangeLog | |
| $ make -f Makefile.in SHELL=/bin/sh autoheader-install | |
| To add the entries to an alternative ChangeLog file, use: | |
| $ make ChangeLog=MyChangeLog .... | |
| tconfig.in | |
| ========== | |
| File tconfig.in defines one or more target configuration macros | |
| (e.g. a tm.h file). There are very few that need defining. | |
| For a list of all of them, see common/tconfig.in. | |
| It contains them all, commented out. | |
| The intent is that a new port can just copy this file and | |
| define the ones it needs. | |
| C Language Assumptions | |
| ====================== | |
| The programmer may assume that the simulator is being built using an | |
| ANSI C compiler that supports a 64 bit data type. Consequently: | |
| o prototypes can be used (although using | |
| PARAMS() and K&R declarations wouldn't | |
| go astray). | |
| o If sim-types.h is included, the two | |
| types signed64 and unsigned64 are | |
| available. | |
| o The type `unsigned' is valid. | |
| However, the user should be aware of the following: | |
| o GCC's `<number>LL' is NOT acceptable. | |
| Microsoft-C doesn't reconize it. | |
| o MSC's `<number>i64' is NOT acceptable. | |
| GCC doesn't reconize it. | |
| o GCC's `long long' MSC's `_int64' can | |
| NOT be used to define 64 bit integer data | |
| types. | |
| o An empty array (eg int a[0]) is not valid. | |
| When building with GCC it is effectivly a requirement that | |
| --enable-build-warnings=,-Werror be specified during configuration. | |
| "dump" commands under gdb | |
| ========================= | |
| gdbinit.in contains the following | |
| define dump | |
| set sim_debug_dump () | |
| end | |
| Simulators that define the sim_debug_dump function can then have their | |
| internal state pretty printed from gdb. | |
| FIXME: This can obviously be made more elaborate. As needed it will be. | |
| Rebuilding nltvals.def | |
| ====================== | |
| Checkout a copy of the SIM and LIBGLOSS modules (Unless you've already | |
| got one to hand): | |
| $ mkdir /tmp/$$ | |
| $ cd /tmp/$$ | |
| $ cvs checkout sim-no-testsuite libgloss-no-testsuite newlib-no-testsuite | |
| Configure things for an arbitrary simulator target (I've d10v for | |
| convenience): | |
| $ mkdir /tmp/$$/build | |
| $ cd /tmp/$$/build | |
| $ /tmp/$$/devo/configure --target=d10v-elf | |
| In the sim/common directory rebuild the headers: | |
| $ cd sim/common | |
| $ make headers | |
| To add a new target: | |
| devo/sim/common/gennltvals.sh | |
| Add your new processor target (you'll need to grub | |
| around to find where your syscall.h lives). | |
| devo/sim/<processor>/Makefile.in | |
| Add the definition: | |
| ``NL_TARGET = -DNL_TARGET_d10v'' | |
| just before the line COMMON_POST_CONFIG_FRAG. | |
| devo/sim/<processor>/*.[ch] | |
| Include targ-vals.h instead of syscall.h. | |