|  | 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. | 
|  |  |