1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-04-28 01:00:52 -07:00

Merging branch/2012-08-15/variety-reform.

Copied from Perforce
 Change: 179279
 ServerID: perforce.ravenbrook.com
This commit is contained in:
Richard Brooksby 2012-09-05 18:44:44 +01:00
commit 1d42c13c25
47 changed files with 1098 additions and 1786 deletions

View file

@ -26,7 +26,7 @@ static void ArenaTrivCompact(Arena arena, Trace trace);
static Res ArenaTrivDescribe(Arena arena, mps_lib_FILE *stream)
{
if (!CHECKT(Arena, arena)) return ResFAIL;
if (!TESTT(Arena, arena)) return ResFAIL;
if (stream == NULL) return ResFAIL;
/* .describe.triv.never-called-from-subclass-method:
@ -324,7 +324,7 @@ Res ArenaDescribe(Arena arena, mps_lib_FILE *stream)
Res res;
Size reserved;
if (!CHECKT(Arena, arena)) return ResFAIL;
if (!TESTT(Arena, arena)) return ResFAIL;
if (stream == NULL) return ResFAIL;
res = WriteF(stream, "Arena $P {\n", (WriteFP)arena,
@ -396,7 +396,7 @@ Res ArenaDescribeTracts(Arena arena, mps_lib_FILE *stream)
Addr oldLimit, base, limit;
Size size;
if (!CHECKT(Arena, arena)) return ResFAIL;
if (!TESTT(Arena, arena)) return ResFAIL;
if (stream == NULL) return ResFAIL;
b = TractFirst(&tract, arena);
@ -481,7 +481,7 @@ Res ControlDescribe(Arena arena, mps_lib_FILE *stream)
{
Res res;
if (!CHECKT(Arena, arena)) return ResFAIL;
if (!TESTT(Arena, arena)) return ResFAIL;
if (stream == NULL) return ResFAIL;
res = PoolDescribe(ArenaControlPool(arena), stream);

View file

@ -406,7 +406,7 @@ static Res ClientAlloc(Addr *baseReturn, Tract *baseTractReturn,
static void ClientFree(Addr base, Size size, Pool pool)
{
Arena arena;
Chunk chunk;
Chunk chunk = NULL; /* suppress "may be used uninitialized" */
Size pages;
ClientArena clientArena;
Index pi, baseIndex, limitIndex;

View file

@ -202,10 +202,10 @@ static Res VMArenaDescribe(Arena arena, mps_lib_FILE *stream)
VMArena vmArena;
Index gen;
if (!CHECKT(Arena, arena)) return ResFAIL;
if (!TESTT(Arena, arena)) return ResFAIL;
if (stream == NULL) return ResFAIL;
vmArena = Arena2VMArena(arena);
if (!CHECKT(VMArena, vmArena)) return ResFAIL;
if (!TESTT(VMArena, vmArena)) return ResFAIL;
/* Describe the superclass fields first via next-method call */
/* ...but the next method is ArenaTrivDescribe, so don't call it;
@ -1584,7 +1584,7 @@ static void VMFree(Addr base, Size size, Pool pool)
Arena arena;
VMArena vmArena;
VMChunk vmChunk;
Chunk chunk;
Chunk chunk = NULL; /* suppress "may be used uninitialized" */
Count pages;
Index pi, piBase, piLimit;
Index pageTableBase;

View file

@ -149,7 +149,7 @@ Res BufferDescribe(Buffer buffer, mps_lib_FILE *stream)
Res res;
char abzMode[5];
if (!CHECKT(Buffer, buffer)) return ResFAIL;
if (!TESTT(Buffer, buffer)) return ResFAIL;
if (stream == NULL) return ResFAIL;
abzMode[0] = (char)( (buffer->mode & BufferModeTRANSITION) ? 't' : '_' );
@ -1185,7 +1185,7 @@ static void bufferNoReassignSeg (Buffer buffer, Seg seg)
static Res bufferTrivDescribe(Buffer buffer, mps_lib_FILE *stream)
{
if (!CHECKT(Buffer, buffer)) return ResFAIL;
if (!TESTT(Buffer, buffer)) return ResFAIL;
if (stream == NULL) return ResFAIL;
/* dispatching function does it all */
return ResOK;
@ -1330,7 +1330,7 @@ static void segBufAttach(Buffer buffer, Addr base, Addr limit,
Addr init, Size size)
{
SegBuf segbuf;
Seg seg;
Seg seg = NULL; /* suppress "may be used uninitialized" */
Arena arena;
Bool found;
@ -1444,10 +1444,10 @@ static Res segBufDescribe(Buffer buffer, mps_lib_FILE *stream)
BufferClass super;
Res res;
if (!CHECKT(Buffer, buffer)) return ResFAIL;
if (!TESTT(Buffer, buffer)) return ResFAIL;
if (stream == NULL) return ResFAIL;
segbuf = BufferSegBuf(buffer);
if (!CHECKT(SegBuf, segbuf)) return ResFAIL;
if (!TESTT(SegBuf, segbuf)) return ResFAIL;
/* Describe the superclass fields first via next-method call */
super = BUFFER_SUPERCLASS(SegBufClass);

View file

@ -1561,7 +1561,7 @@ Bool CBSFindLargest(Addr *baseReturn, Addr *limitReturn,
notEmpty = SplayRoot(&root, splayTreeOfCBS(cbs));
if (notEmpty) {
CBSBlock block;
SplayNode node;
SplayNode node = NULL; /* suppress "may be used uninitialized" */
size = cbsBlockOfSplayNode(root)->maxSize;
METER_ACC(cbs->splaySearch, cbs->splayTreeSize);
@ -1627,7 +1627,7 @@ Res CBSDescribe(CBS cbs, mps_lib_FILE *stream)
{
Res res;
if (!CHECKT(CBS, cbs)) return ResFAIL;
if (!TESTT(CBS, cbs)) return ResFAIL;
if (stream == NULL) return ResFAIL;
res = WriteF(stream,

View file

@ -17,6 +17,18 @@
* will throw the code away, but check its syntax.
*
* .trans.level-check: CheckLevel itself is not checked anywhere.
*
* .careful: BE CAREFUL when changing this file. It is easy to make mistakes
* and change the checking level in a variety and thereby its performance
* without realising it. This has happened before. Eyeball the preprocessor
* output for each variety. For example:
*
* cc -E -DCONFIG_VAR_RASH trace.c
* cc -E -DCONFIG_VAR_HOT trace.c
* cc -E -DCONFIG_VAR_COOL trace.c
*
* Then look at TraceCheck to make sure checking is right, TraceAddWhite
* for general assertions, and TraceFix for the critical path assertions.
*/
#ifndef check_h
@ -27,9 +39,56 @@
#include "mpslib.h"
/* CheckLevel -- Control check method behaviour */
/* ASSERT -- basic assertion
*
* The ASSERT macro is equivalent to the ISO C assert() except that it is
* always defined, and uses the assertion handler from the MPS plinth, which
* can be replaced by the client code.
*
* It is not intended for direct use within the MPS. Use AVER and CHECK
* macros, which can be controlled by both build and run-time configuration.
*/
extern unsigned CheckLevel;
#define ASSERT(cond, condstring) \
BEGIN \
if (cond) NOOP; else \
mps_lib_assert_fail(condstring "\n" __FILE__ "\n" STR(__LINE__)); \
END
#define ASSERT_TYPECHECK(type, val) \
ASSERT(type ## Check(val), "TypeCheck " #type ": " #val)
#define ASSERT_NULLCHECK(type, val) \
ASSERT((val) != NULL, "NullCheck " #type ": " #val)
/* CheckLevel -- control for check method behaviour
*
* When the MPS is build with AVER_AND_CHECK_ALL (in a "cool" variety) the
* static variable CheckLevel controls the frequency and detail of
* consistency checking on structures.
*
* By default, CHECKLEVEL is defined to a static value in config.h, though
* it can be overridden on the compiler command line, e.g.
* cc -DCHECKLEVEL=CheckLevelSHALLOW ...
*
* However, if CHECKLEVEL_DYNAMIC is defined we use a variable to control
* the level of checking. The run-time overhead for this is quite high
* (observed double run-time on amcss when the variable is set to SHALLOW).
* CHECKLEVEL_DYNAMIC should be set to the initial level for the variable,
* which is in mpm.c.
*
* In general, it's better to adjust the check level by defining CHECKLEVEL
* but this is intended to meet the case where a run-time adjustable
* checking level is required -- where recompilation or relinking is
* undesirable or impossible.
*
* TODO: Should also allow the check level variable to come from an
* environment variable.
*
* TODO: CheckLevelDEEP asserts on arena creation with bootstrapping
* problems. It clearly hasn't been tried for a while. RB 2012-09-01
*/
enum {
CheckLevelMINIMAL = 0, /* local sig check only */
@ -40,225 +99,222 @@ enum {
/* and recursive down full type checks */
};
#ifdef CHECKLEVEL_DYNAMIC
extern unsigned CheckLevel;
#undef CHECKLEVEL
#define CHECKLEVEL CheckLevel
#endif
/* AVER, AVERT -- MPM assertions
*
* AVER and AVERT are used to assert conditions in the code.
* AVER and AVERT are used to assert conditions in the code. AVER checks
* an expression. AVERT checks that a value is of the correct type and
* may perform consistency checks on the value.
*
* AVER and AVERT are on by default, and check conditions even in "hot"
* varieties intended to work in production. To avoid the cost of a check
* in critical parts of the code, use AVER_CRITICAL and AVERT_CRITICAL,
* but only when you've *proved* that this makes a difference to performance
* that affects requirements.
*/
#if defined(AVER_AND_CHECK_NONE)
#define AVER(cond) DISCARD(cond)
#define AVERT(type, val) DISCARD(type ## Check(val))
#define AVER_CRITICAL(cond) DISCARD(cond)
#define AVERT_CRITICAL(type, val) DISCARD(type ## Check(val))
#elif defined(AVER_AND_CHECK)
#else
#define AVER(cond) ASSERT(cond, #cond)
#define AVERT(type, val) ASSERT(type ## Check(val), \
"TypeCheck " #type ": " #val)
#define AVERT(type, val) \
ASSERT(type ## Check(val), "TypeCheck " #type ": " #val)
#endif
#if defined(AVER_AND_CHECK_ALL)
#define AVER_CRITICAL(cond) \
BEGIN \
if (CheckLevel != CheckLevelMINIMAL) ASSERT(cond, #cond); \
ASSERT(cond, #cond); \
END
#define AVERT_CRITICAL(type, val) \
BEGIN \
if (CheckLevel != CheckLevelMINIMAL) \
ASSERT(type ## Check(val), "TypeCheck " #type ": " #val); \
ASSERT(type ## Check(val), "TypeCheck " #type ": " #val); \
END
#else
#error "No checking defined."
#define AVER_CRITICAL DISCARD
#define AVERT_CRITICAL(type, val) DISCARD(type ## Check(val))
#endif
/* internals for actually asserting */
/* NOTREACHED -- control should never reach this statement
*
* This is a sort of AVER; it is equivalent to AVER(FALSE), but will produce
* a more informative message.
*/
#define ASSERT(cond, condstring) \
BEGIN \
if (cond) NOOP; else \
mps_lib_assert_fail(condstring "\n" __FILE__ "\n" STR(__LINE__)); \
END
#if defined(AVER_AND_CHECK_NONE)
#define NOTREACHED NOOP
/* NOTREACHED -- control should never reach this statement */
/* This is a sort of AVER; it is equivalent to AVER(FALSE). */
#if defined(AVER_AND_CHECK)
#else
#define NOTREACHED \
BEGIN \
mps_lib_assert_fail("unreachable code" "\n" __FILE__ "\n" STR(__LINE__)); \
END
#else
#define NOTREACHED NOOP
#endif
/* CHECKT -- check type simply
/* TESTT -- check type simply
*
* Must be thread safe. See <design/interface-c/#thread-safety>
* and <design/interface-c/#check.space>.
*
* @@@@ This is a test, not a CHECK macro -- it does not assert.
* It should be renamed TESTSIG. RHSK 2006-12-13.
*/
#define CHECKT(type, val) ((val) != NULL && (val)->sig == type ## Sig)
#define TESTT(type, val) ((val) != NULL && (val)->sig == type ## Sig)
/* CHECKS -- Check Signature
*
* (if CHECKLEVEL == CheckLevelMINIMAL, this is all we check)
*/
#if defined(AVER_AND_CHECK_NONE)
#define CHECKS(type, val) DISCARD(CHECKT(type, val))
#define CHECKL(cond) DISCARD(cond)
#define CHECKD(type, val) DISCARD(CHECKT(type, val))
#define CHECKD_NOSIG(type, val) DISCARD((val) != NULL)
#define CHECKU(type, val) DISCARD(CHECKT(type, val))
#define CHECKU_NOSIG(type, val) DISCARD((val) != NULL)
#define CHECKS(type, val) DISCARD(TESTT(type, val))
#else
/* CHECKS -- Check Signature */
/* (if CheckLevel == CheckLevelMINIMAL, this is all we check) */
#define CHECKS(type, val) ASSERT(CHECKT(type, val), \
"SigCheck " #type ": " #val)
/* CHECKL -- Check Local Invariant
*
* Could make this an expression using ?:
*/
#define CHECKL(cond) \
BEGIN \
switch(CheckLevel) { \
case CheckLevelMINIMAL: \
NOOP; \
break; \
case CheckLevelSHALLOW: \
case CheckLevelDEEP: \
ASSERT(cond, #cond); \
break; \
} \
END
/* CHECKD -- Check Down */
#define CHECKD(type, val) \
BEGIN \
switch(CheckLevel) { \
case CheckLevelMINIMAL: \
NOOP; \
break; \
case CheckLevelSHALLOW: \
ASSERT(CHECKT(type, val), \
"SigCheck " #type ": " #val); \
break; \
case CheckLevelDEEP: \
ASSERT(type ## Check(val), \
"TypeCheck " #type ": " #val); \
break; \
} \
END
/* CHECKD_NOSIG -- Check Down for a type with no signature */
#define CHECKD_NOSIG(type, val) \
BEGIN \
switch(CheckLevel) { \
case CheckLevelMINIMAL: \
NOOP; \
break; \
case CheckLevelSHALLOW: \
ASSERT((val) != NULL, \
"NullCheck " #type ": " #val); \
break; \
case CheckLevelDEEP: \
ASSERT(type ## Check(val), \
"TypeCheck " #type ": " #val); \
break; \
} \
END
/* CHECKU -- Check Up */
#define CHECKU(type, val) \
BEGIN \
switch(CheckLevel) { \
case CheckLevelMINIMAL: \
NOOP; \
break; \
case CheckLevelSHALLOW: \
case CheckLevelDEEP: \
ASSERT(CHECKT(type, val), \
"SigCheck " #type ": " #val); \
break; \
} \
END
/* CHECKU_NOSIG -- Check Up for a type with no signature */
#define CHECKU_NOSIG(type, val) \
BEGIN \
switch(CheckLevel) { \
case CheckLevelMINIMAL: \
NOOP; \
break; \
case CheckLevelSHALLOW: \
case CheckLevelDEEP: \
ASSERT((val) != NULL, \
"NullCheck " #type ": " #val); \
break; \
} \
END
#define CHECKS(type, val) \
ASSERT(TESTT(type, val), "SigCheck " #type ": " #val)
#endif
/* CHECKLVALUE &c -- type compatibility checking
/* CHECKL, CHECKD, CHECKU -- local, "down", and "up" checks
*
* .check.macros: The CHECK* macros use some C trickery to attempt to
* Each type should have a function defined called <type>Check that checks
* the consistency of the type. This function should return TRUE iff the
* value passes consistency checks. In general, it should assert otherwise,
* but we allow for the possibility of returning FALSE in this case for
* configuration adaptability.
*
* For structure types, the check function should:
*
* - check its own signature with CHECKS
*
* - check fields that it "owns" with CHECKL, like asserts
*
* - check "down" values which are its "children" with CHEKCD
*
* - check "up" values which are its "parents" with CHECKU.
*
* These various checks will be compiled out or compiled to be controlled
* by CHECKLEVEL.
*
* For example:
*
* Bool MessageCheck(Message message)
* {
* CHECKS(Message, message);
* CHECKU(Arena, message->arena);
* CHECKD(MessageClass, message->class);
* CHECKL(RingCheck(&message->queueRing));
* CHECKL(MessageIsClocked(message) || (message->postedClock == 0));
* return TRUE;
* }
*
* The parent/child distinction depends on the structure, but in the MPS
* the Arena has no parents, and has children which are Pools, which have
* children which are Segments, etc.
*
* The important thing is to have a partial order on types so that recursive
* checking will terminate. When CHECKLEVEL is set to DEEP, checking will
* recurse into check methods for children, but will only do a shallow
* signature check on parents, avoiding infinite regression.
*/
#if defined(AVER_AND_CHECK_ALL)
#define CHECK_BY_LEVEL(minimal, shallow, deep) \
BEGIN \
switch (CHECKLEVEL) { \
case CheckLevelDEEP: deep; break; \
case CheckLevelSHALLOW: shallow; break; \
default: NOTREACHED; /* fall through */ \
case CheckLevelMINIMAL: minimal; break; \
} \
END
#define CHECKL(cond) \
CHECK_BY_LEVEL(NOOP, \
ASSERT(cond, #cond), \
ASSERT(cond, #cond))
#define CHECKD(type, val) \
CHECK_BY_LEVEL(NOOP, \
CHECKS(type, val), \
ASSERT_TYPECHECK(type, val))
#define CHECKD_NOSIG(type, val) \
CHECK_BY_LEVEL(NOOP, \
ASSERT_NULLCHECK(type, val), \
ASSERT_TYPECHECK(type, val))
#define CHECKU(type, val) \
CHECK_BY_LEVEL(NOOP, \
CHECKS(type, val), \
CHECKS(type, val))
#define CHECKU_NOSIG(type, val) \
CHECK_BY_LEVEL(NOOP, \
ASSERT_NULLCHECK(type, val), \
ASSERT_NULLCHECK(type, val))
#else /* AVER_AND_CHECK_ALL, not */
/* TODO: This gives comparable performance to white-hot when compiling
using mps.c and -O2 (to get check methods inlined), but is it a bit
too minimal? How much do we rely on check methods? */
#define CHECKL(cond) DISCARD(cond)
#define CHECKD(type, val) DISCARD(TESTT(type, val))
#define CHECKD_NOSIG(type, val) DISCARD((val) != NULL)
#define CHECKU(type, val) DISCARD(TESTT(type, val))
#define CHECKU_NOSIG(type, val) DISCARD((val) != NULL)
#endif /* AVER_AND_CHECK_ALL */
/* COMPAT* -- type compatibility checking
*
* .check.macros: The COMPAT* macros use some C trickery to attempt to
* verify that certain types and fields are equivalent. They do not
* do a complete job. This trickery is justified by the security gained
* in knowing that <code/mps.h> matches the MPM. See also
* mail.richard.1996-08-07.09-49. [This paragraph is intended to
* satisfy rule.impl.trick.]
*
* @@@@ These are tests, not CHECK macros -- they do not assert.
* They should be renamed TESTTYPE etc. RHSK 2006-12-13.
*/
/* compile-time check */
#define CHECKLVALUE(lv1, lv2) \
#define COMPATLVALUE(lv1, lv2) \
((void)sizeof((lv1) = (lv2)), (void)sizeof((lv2) = (lv1)), TRUE)
/* aims to test whether t1 and t2 are assignment-compatible */
#define CHECKTYPE(t1, t2) \
#define COMPATTYPE(t1, t2) \
(sizeof(t1) == sizeof(t2) && \
CHECKLVALUE(*((t1 *)0), *((t2 *)0)))
COMPATLVALUE(*((t1 *)0), *((t2 *)0)))
#define CHECKFIELDAPPROX(s1, f1, s2, f2) \
#define COMPATFIELDAPPROX(s1, f1, s2, f2) \
(sizeof(((s1 *)0)->f1) == sizeof(((s2 *)0)->f2) && \
offsetof(s1, f1) == offsetof(s2, f2))
#define CHECKFIELD(s1, f1, s2, f2) \
(CHECKFIELDAPPROX(s1, f1, s2, f2) && \
CHECKLVALUE(((s1 *)0)->f1, ((s2 *)0)->f2))
#define COMPATFIELD(s1, f1, s2, f2) \
(COMPATFIELDAPPROX(s1, f1, s2, f2) && \
COMPATLVALUE(((s1 *)0)->f1, ((s2 *)0)->f2))
#endif /* check_h */

View file

@ -16,8 +16,6 @@
# information, and any optimization possible
# CFLAGSOPT a list of flags for compilations with maximum
# optimization, and any debug info possible
# CFLAGSOPTNODEBUG a list of flags for compilations with maximum
# optimization, and absolutely no debug info
# CC the command for the C compiler
# LINKFLAGS a list of flags passed to the linker
# ARFLAGSPFM platform-specific flags for ar
@ -32,7 +30,6 @@
# MPMPF platform-dependent C sources for the "mpm" part
# MPMS assembler sources for the "mpm" part (.s files)
# MPMPS pre-processor assembler sources for the "mpm" part (.S files)
# SWPF platform-dependent C sources for the "sw" part
#
# %%PART: Add a new parameter above for the files included in the part.
#
@ -64,9 +61,6 @@ endif
ifndef CFLAGSOPT
error "comm.gmk: CFLAGSOPT not defined"
endif
ifndef CFLAGSOPTNODEBUG
error "comm.gmk: CFLAGSOPTNODEBUG not defined"
endif
#
# %%PART: Add checks for the parameter with the sources for the new
@ -94,69 +88,34 @@ endif
# C FLAGS
# Some flags depend on the target. Alas.
ifdef TARGET
ifeq ($(TARGET),mmsw.a)
CFLAGSTARGET = -DCONFIG_PROD_EPCORE
else
ifeq ($(TARGET),replaysw)
CFLAGSTARGET = -DCONFIG_PROD_EPCORE
else
ifeq ($(TARGET),mmdw.a)
CFLAGSTARGET = -DCONFIG_PROD_DYLAN
else
ifeq ($(TARGET),replay)
CFLAGSTARGET = -DCONFIG_PROD_DYLAN
else
CFLAGSTARGET = -DCONFIG_PROD_MPS
endif
endif
endif
endif
endif
# These flags are included in all compilations.
CFLAGSCOMMON = $(PFMDEFS) $(CFLAGSTARGET) $(CFLAGSCOMPILER)
# Avoid using PFMDEFS in platform makefiles, as they prevent the MPS being
# built with a simple command like "cc -c mps.c".
CFLAGSCOMMON = $(PFMDEFS) $(CFLAGSCOMPILER)
# %%VARIETY: Define a macro containing the set of flags for the new
# variety.
# These flags are added to compilations for the indicated variety.
CFWE = -DCONFIG_VAR_WE -DNDEBUG $(CFLAGSOPTNODEBUG)
CFWI = -DCONFIG_VAR_WI -DNDEBUG $(CFLAGSOPT)
CFHE = -DCONFIG_VAR_HE -DNDEBUG $(CFLAGSOPTNODEBUG)
CFHI = -DCONFIG_VAR_HI -DNDEBUG $(CFLAGSOPT)
CFDI = -DCONFIG_VAR_DI -DNDEBUG $(CFLAGSOPT)
CFII = -DCONFIG_VAR_II -DNDEBUG $(CFLAGSOPT)
CFCE = -DCONFIG_VAR_CE $(CFLAGSOPTNODEBUG)
CFCI = -DCONFIG_VAR_CI $(CFLAGSDEBUG)
CFTI = -DCONFIG_VAR_TI $(CFLAGSDEBUG)
CFRASH = -DCONFIG_VAR_RASH -DNDEBUG $(CFLAGSOPT)
CFHOT = -DCONFIG_VAR_HOT -DNDEBUG $(CFLAGSOPT)
CFDIAG = -DCONFIG_VAR_DIAG -DNDEBUG $(CFLAGSOPT)
CFCOOL = -DCONFIG_VAR_COOL $(CFLAGSDEBUG)
CFTI = -DCONFIG_VAR_TI $(CFLAGSDEBUG)
# Bind CFLAGS to the appropriate set of flags for the variety.
# %%VARIETY: Add a test for the variety and set CFLAGS here.
ifeq ($(VARIETY),we)
CFLAGS=$(CFLAGSCOMMON) $(CFWE)
ifeq ($(VARIETY),rash)
CFLAGS=$(CFLAGSCOMMON) $(CFRASH)
else
ifeq ($(VARIETY),wi)
CFLAGS=$(CFLAGSCOMMON) $(CFWI)
ifeq ($(VARIETY),hot)
CFLAGS=$(CFLAGSCOMMON) $(CFHOT)
else
ifeq ($(VARIETY),he)
CFLAGS=$(CFLAGSCOMMON) $(CFHE)
ifeq ($(VARIETY),diag)
CFLAGS=$(CFLAGSCOMMON) $(CFDIAG)
else
ifeq ($(VARIETY),hi)
CFLAGS=$(CFLAGSCOMMON) $(CFHI)
else
ifeq ($(VARIETY),di)
CFLAGS=$(CFLAGSCOMMON) $(CFDI)
else
ifeq ($(VARIETY),ii)
CFLAGS=$(CFLAGSCOMMON) $(CFII)
else
ifeq ($(VARIETY),ce)
CFLAGS=$(CFLAGSCOMMON) $(CFCE)
else
ifeq ($(VARIETY),ci)
CFLAGS=$(CFLAGSCOMMON) $(CFCI)
ifeq ($(VARIETY),cool)
CFLAGS=$(CFLAGSCOMMON) $(CFCOOL)
else
ifeq ($(VARIETY),ti)
CFLAGS=$(CFLAGSCOMMON) $(CFTI)
@ -166,10 +125,6 @@ endif
endif
endif
endif
endif
endif
endif
endif
ARFLAGS=rc$(ARFLAGSPFM)
@ -198,16 +153,8 @@ MPMCOMMON = mpsi.c mpm.c arenavm.c arenacl.c arena.c global.c locus.c \
trace.c traceanc.c root.c seg.c format.c buffer.c ref.c \
bt.c ring.c shield.c ld.c event.c sac.c message.c \
poolmrg.c poolmfs.c poolmv.c dbgpool.c dbgpooli.c \
boot.c meter.c splay.c cbs.c diag.c version.c
boot.c meter.c splay.c cbs.c diag.c
MPM = $(MPMCOMMON) $(MPMPF)
SWCOMMON = mpsi.c mpm.c arenavm.c arenacl.c arena.c global.c locus.c \
tract.c walk.c reserv.c protocol.c pool.c poolabs.c \
trace.c traceanc.c root.c seg.c format.c buffer.c ref.c \
bt.c ring.c shield.c ld.c event.c sac.c message.c \
poolmrg.c poolmfs.c poolmv.c dbgpool.c dbgpooli \
poolams.c poolamsi.c poolmvff.c \
boot.c meter.c splay.c cbs.c version.c mpsioan.c
SW = $(SWCOMMON) $(SWPF)
# These map the source file lists onto object files and dependency files
@ -234,21 +181,6 @@ POOLNOBJ = $(POOLN:%.c=$(PFM)/$(VARIETY)/%.o)
POOLNDEP = $(POOLN:%.c=$(PFM)/$(VARIETY)/%.d)
MVFFOBJ = $(MVFF:%.c=$(PFM)/$(VARIETY)/%.o)
MVFFDEP = $(MVFF:%.c=$(PFM)/$(VARIETY)/%.d)
SWOBJ = $(SW:%.c=$(PFM)/$(VARIETY)/%.o)
# The following hack for SWDEP only creates those dependencies when
# a SW target is being built.
ifdef TARGET
ifeq ($(TARGET),mmsw.a)
SWDEP = $(SW:%.c=$(PFM)/$(VARIETY)/%.d)
else
ifeq ($(TARGET),depend)
SWDEP = $(SW:%.c=$(PFM)/$(VARIETY)/%.d)
else
SWDEP =
endif
endif
endif
TESTLIBOBJ = $(TESTLIB:%.c=$(PFM)/$(VARIETY)/%.o)
TESTLIBDEP = $(TESTLIB:%.c=$(PFM)/$(VARIETY)/%.d)
@ -266,18 +198,16 @@ endif
# == Pseudo-targets ==
# %%TARGET: Add the target to the all dependencies, if it uses the
# CONFIG_PROD_MPS configuration, to swall if CONFIG_PROD_EPCORE
# %%TARGET: Add the target to the all dependencies
all: mpmss sacss amcss amcsshe amsss amssshe segsmss awlut awluthe \
mpsicv lockcov poolncv locv qs apss \
finalcv finaltest arenacv bttest teletest \
abqtest cbstest btcv mv2test messtest steptest \
walkt0 libcbt zcoll zmess \
walkt0 zcoll zmess \
eventcnv \
mps.a mpsplan.a
swall: mmsw.a replaysw
# Runs the automatic tests that are built with CONFIG_PROD_MPS.
# These tests are run overnight (see design.buildsys.overnight).
@ -299,14 +229,13 @@ mpmss sacss amcss amcssth amcsshe amsss amssshe segsmss awlut awlutth \
awluthe mpsicv lockcov poolncv locv qs apss \
finalcv finaltest arenacv bttest teletest \
expt825 \
libcbt \
abqtest cbstest btcv mv2test \
messtest steptest \
walkt0 \
exposet0 \
zcoll zmess \
eventcnv replay replaysw \
mps.a mmsw.a mpsplan.a mmdw.a: phony
mps.a mpsplan.a: phony
ifdef VARIETY
$(MAKE) -f $(PFM).gmk TARGET=$@ variety
else
@ -328,10 +257,8 @@ clean: phony
ifdef TARGET
ifndef VARIETY
target: phony
$(MAKE) -f $(PFM).gmk VARIETY=hi variety
$(MAKE) -f $(PFM).gmk VARIETY=ci variety
$(MAKE) -f $(PFM).gmk VARIETY=di variety
$(MAKE) -f $(PFM).gmk VARIETY=we variety
$(MAKE) -f $(PFM).gmk VARIETY=hot variety
$(MAKE) -f $(PFM).gmk VARIETY=cool variety
endif
endif
@ -346,7 +273,39 @@ endif
endif
# GENUINE TARGETS
# THE MPS LIBRARY
#
# The MPS library is built in two ways:
#
# 1. In the usual way, from a pile of object files compiled from their
# corresponding sources.
#
# 2. From mps.c, which effectively concatenates all the sources, allowing
# important global optimisation and inlining to occur.
#
# We mostly use the method (2), because it is fast to compile and execute.
# But we use method (1) for some varieties to ensure correctness of
# code (linkage errors are masked by (2)) and to maintain a correct list
# of source files in case method (1) won't work on some future constrained
# platform.
#
# %%VARIETY: Add a rule for how to build the MPS library for the variety
$(PFM)/rash/mps.a: $(PFM)/rash/mps.o
$(PFM)/hot/mps.a: $(PFM)/hot/mps.o
$(PFM)/diag/mps.a: \
$(MPMOBJ) $(AMCOBJ) $(AMSOBJ) $(AWLOBJ) $(LOOBJ) $(SNCOBJ) \
$(MVFFOBJ) $(PLINTHOBJ) $(POOLNOBJ)
$(PFM)/cool/mps.a: \
$(MPMOBJ) $(AMCOBJ) $(AMSOBJ) $(AWLOBJ) $(LOOBJ) $(SNCOBJ) \
$(MVFFOBJ) $(PLINTHOBJ) $(POOLNOBJ)
$(PFM)/ti/mps.a: \
$(MPMOBJ) $(AMCOBJ) $(AMSOBJ) $(AWLOBJ) $(LOOBJ) $(SNCOBJ) \
$(MVFFOBJ) $(PLINTHOBJ) $(POOLNOBJ)
# OTHER GENUINE TARGETS
#
# Each line defines an executable or library target to be built and the
# object files it is built from. These lines add dependencies to the
@ -357,109 +316,104 @@ endif
ifdef VARIETY
$(PFM)/$(VARIETY)/finalcv: $(PFM)/$(VARIETY)/finalcv.o \
$(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ)
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/finaltest: $(PFM)/$(VARIETY)/finaltest.o \
$(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ)
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/expt825: $(PFM)/$(VARIETY)/expt825.o \
$(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ)
$(PFM)/$(VARIETY)/libcbt: $(PFM)/$(VARIETY)/libcbt.o \
$(PFM)/$(VARIETY)/mpslibcb.o \
$(PFM)/$(VARIETY)/mpsioan.o \
$(MPMOBJ) $(TESTLIBOBJ)
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/locv: $(PFM)/$(VARIETY)/locv.o \
$(MPMOBJ) $(PLINTHOBJ) $(LOOBJ) $(TESTLIBOBJ)
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/mpmss: $(PFM)/$(VARIETY)/mpmss.o \
$(MPMOBJ) $(PLINTHOBJ) $(MVFFOBJ) $(TESTLIBOBJ)
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/apss: $(PFM)/$(VARIETY)/apss.o \
$(MPMOBJ) $(PLINTHOBJ) $(MVFFOBJ) $(TESTLIBOBJ)
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/sacss: $(PFM)/$(VARIETY)/sacss.o \
$(MPMOBJ) $(PLINTHOBJ) $(MVFFOBJ) $(TESTLIBOBJ)
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/bttest: $(PFM)/$(VARIETY)/bttest.o \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/teletest: $(PFM)/$(VARIETY)/teletest.o \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/lockcov: $(PFM)/$(VARIETY)/lockcov.o \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/mpsicv: $(PFM)/$(VARIETY)/mpsicv.o \
$(FMTDYTSTOBJ) $(FMTHETSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ)
$(FMTDYTSTOBJ) $(FMTHETSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/amcss: $(PFM)/$(VARIETY)/amcss.o \
$(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ)
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/amcssth: $(PFM)/$(VARIETY)/amcssth.o \
$(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ)
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/amcsshe: $(PFM)/$(VARIETY)/amcsshe.o \
$(FMTHETSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ)
$(FMTHETSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/amsss: $(PFM)/$(VARIETY)/amsss.o \
$(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMSOBJ) $(TESTLIBOBJ)
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/amssshe: $(PFM)/$(VARIETY)/amssshe.o \
$(FMTHETSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMSOBJ) $(TESTLIBOBJ)
$(FMTHETSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/segsmss: $(PFM)/$(VARIETY)/segsmss.o \
$(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMSOBJ) $(TESTLIBOBJ)
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/awlut: $(PFM)/$(VARIETY)/awlut.o \
$(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(LOOBJ) $(AWLOBJ) $(TESTLIBOBJ)
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/awluthe: $(PFM)/$(VARIETY)/awluthe.o \
$(FMTHETSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(LOOBJ) $(AWLOBJ) $(TESTLIBOBJ)
$(FMTHETSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/awlutth: $(PFM)/$(VARIETY)/awlutth.o \
$(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(LOOBJ) $(AWLOBJ) $(TESTLIBOBJ)
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/poolncv: $(PFM)/$(VARIETY)/poolncv.o \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) $(POOLNOBJ)
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/qs: $(PFM)/$(VARIETY)/qs.o \
$(AMCOBJ) $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/arenacv: $(PFM)/$(VARIETY)/arenacv.o \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/abqtest: $(PFM)/$(VARIETY)/abqtest.o \
$(PFM)/$(VARIETY)/abq.o $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(PFM)/$(VARIETY)/abq.o $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/cbstest: $(PFM)/$(VARIETY)/cbstest.o \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/btcv: $(PFM)/$(VARIETY)/btcv.o \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/mv2test: $(PFM)/$(VARIETY)/mv2test.o \
$(PFM)/$(VARIETY)/poolmv2.o $(PFM)/$(VARIETY)/abq.o \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/messtest: $(PFM)/$(VARIETY)/messtest.o \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/steptest: $(PFM)/$(VARIETY)/steptest.o \
$(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ)
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/walkt0: $(PFM)/$(VARIETY)/walkt0.o \
$(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ)
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/exposet0: $(PFM)/$(VARIETY)/exposet0.o \
$(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ)
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/zcoll: $(PFM)/$(VARIETY)/zcoll.o \
$(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ)
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/zmess: $(PFM)/$(VARIETY)/zmess.o \
$(FMTDYTSTOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(TESTLIBOBJ)
$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/eventcnv: $(PFM)/$(VARIETY)/eventcnv.o \
$(PFM)/$(VARIETY)/eventpro.o $(PFM)/$(VARIETY)/table.o
@ -467,19 +421,10 @@ $(PFM)/$(VARIETY)/eventcnv: $(PFM)/$(VARIETY)/eventcnv.o \
$(PFM)/$(VARIETY)/replay: $(PFM)/$(VARIETY)/replay.o \
$(PFM)/$(VARIETY)/eventrep.o \
$(PFM)/$(VARIETY)/eventpro.o $(PFM)/$(VARIETY)/table.o \
$(MPMOBJ) $(PLINTHOBJ) $(AWLOBJ) $(AMSOBJ) $(POOLNOBJ) \
$(AMCOBJ) $(SNCOBJ) $(MVFFOBJ)
$(PFM)/$(VARIETY)/mps.a: $(MPMOBJ) $(AMCOBJ) $(SNCOBJ) $(MVFFOBJ)
$(PFM)/$(VARIETY)/mmdw.a: $(MPMOBJ) $(AMCOBJ) $(LOOBJ) $(SNCOBJ) \
$(FMTDYOBJ) $(AWLOBJ)
$(PFM)/$(VARIETY)/mps.a
$(PFM)/$(VARIETY)/mpsplan.a: $(PLINTHOBJ)
$(PFM)/$(VARIETY)/mmsw.a: \
$(SWOBJ)
endif
@ -498,25 +443,6 @@ test -d $(PFM)/$(VARIETY) || mkdir $(PFM)/$(VARIETY)
$(CC) $(CFLAGS) -c -o $@ $<
endef
# .force: FORCE is a dependent that can be used to force targets to be
# built.
.PHONY: FORCE
# A rule with no dependents and no commands always causes update.
# (See GNUMake doc, make.info, Node: Force Targets)
# (ignore the bit about using FORCE as being the same as using .PHONY
# it's not, and we make use of that, see .special.version below)
FORCE:
# .special.version: version.o has a special rule so that it is always
# built. This rule has no commands, this has the effect of adding the
# dependents to those specified by other rules (in this case the implicit
# .o:.c rule below, .rule.c-to-o). The extra dependent added is the
# FORCE dependent (defined above, .force) which causes the target to be
# always built.
ifdef VARIETY
$(PFM)/$(VARIETY)/version.o: FORCE
endif
# .rule.c-to-o:
$(PFM)/$(VARIETY)/%.o: %.c
$(run-cc)
@ -544,7 +470,7 @@ $(PFM)/$(VARIETY)/%.d: %.c
ifdef VARIETY
ifdef TARGET
# %%PART: Add the dependency file macro for the new part here.
include $(MPMDEP) $(AMSDEP) $(AMCDEP) $(LODEP) $(SWDEP) \
include $(MPMDEP) $(AMSDEP) $(AMCDEP) $(LODEP) \
$(AWLDEP) $(POOLNDEP) $(TESTLIBDEP) $(FMTDYDEP) $(FMTHETSTDEP) \
$(PLINTHDEP) $(EVENTPROCDEP)
endif
@ -561,14 +487,15 @@ endif
$(PFM)/$(VARIETY)/%.a:
$(ECHO) "$(PFM): $@"
rm -f $@
$(AR) $(ARFLAGS) $@ $^
$(CC) $(CFLAGS) -c -o $(PFM)/$(VARIETY)/version.o version.c
$(AR) $(ARFLAGS) $@ $^ $(PFM)/$(VARIETY)/version.o
$(RANLIB) $@
# Executable
$(PFM)/$(VARIETY)/%:
$(ECHO) "$(PFM): $@"
$(CC) $(LINKFLAGS) -o $@ $^ $(LIBS)
$(CC) $(CFLAGS) $(LINKFLAGS) -o $@ $^ $(LIBS)
# C. COPYRIGHT AND LICENSE

View file

@ -11,8 +11,7 @@
# PSEUDO-TARGETS
# "all" builds all the varieties of all targets
# %%TARGET: Add the target to the all dependencies, if it uses the
# CONFIG_PROD_MPS configuration, to swall if CONFIG_PROD_EPCORE
# %%TARGET: Add the target to the all dependencies.
all: mpmss.exe amcss.exe amsss.exe amssshe.exe segsmss.exe awlut.exe awluthe.exe\
mpsicv.exe lockutw3.exe lockcov.exe poolncv.exe locv.exe qs.exe apss.exe \
@ -21,9 +20,7 @@ all: mpmss.exe amcss.exe amsss.exe amssshe.exe segsmss.exe awlut.exe awluthe.exe
abqtest.exe cbstest.exe btcv.exe mv2test.exe messtest.exe steptest.exe \
locbwcss.exe locusss.exe zcoll.exe zmess.exe \
eventcnv.exe \
mps.lib mpsplan.lib
swall: mmsw.lib replaysw.exe
mps.lib
# Convenience targets
@ -40,8 +37,7 @@ mpmss.exe amcss.exe amcsshe.exe amsss.exe amssshe.exe segsmss.exe awlut.exe awlu
walkt0.exe locbwcss.exe locusss.exe \
exposet0.exe zcoll.exe zmess.exe \
replay.exe replaysw.exe eventcnv.exe \
mmdw.lib mmsw.lib mps.lib mpsplan.lib mpsplcb.lib \
mpsdy.dll:
mps.lib:
!IFDEF VARIETY
$(MAKE) /nologo /f $(PFM).nmk TARGET=$@ variety
!ELSE
@ -50,12 +46,10 @@ mpmss.exe amcss.exe amcsshe.exe amsss.exe amssshe.exe segsmss.exe awlut.exe awlu
# "clean" removes the directory containing the build results.
# Depends on there being no file called "clean".
# Since we can't know whether we have rmdir, try with deltree as well.
clean:
$(ECHO) $(PFM): $@
-echo y | rmdir/s $(PFM)
-deltree /Y $(PFM)
# target target
# %%VARIETY: Optionally, add a recursive make call for the new variety,
@ -66,10 +60,8 @@ clean:
!IFDEF TARGET
!IFNDEF VARIETY
target:
$(MAKE) /nologo /f $(PFM).nmk VARIETY=hi variety
$(MAKE) /nologo /f $(PFM).nmk VARIETY=ci variety
$(MAKE) /nologo /f $(PFM).nmk VARIETY=ti variety
$(MAKE) /nologo /f $(PFM).nmk VARIETY=wi variety
$(MAKE) /nologo /f $(PFM).nmk VARIETY=hot variety
$(MAKE) /nologo /f $(PFM).nmk VARIETY=cool variety
!ENDIF
!ENDIF
@ -85,13 +77,56 @@ variety: $(PFM)\$(VARIETY)\$(TARGET)
mpsicv.cov:
$(MAKE) /nologo /f $(PFM).nmk TARGET=$@ VARIETY=cv variety
# FORCE
# Used to force a target to be built.
# Depends on there being no file called "FORCE".
FORCE:
# THE MPS LIBRARY
#
# The MPS library is built in two ways:
#
# 1. In the usual way, from a pile of object files compiled from their
# corresponding sources.
#
# 2. From mps.c, which effectively concatenates all the sources, allowing
# important global optimisation and inlining to occur.
#
# We mostly use the method (2), because it is fast to compile and execute.
# But we use method (1) for some varieties to ensure correctness of
# code (linkage errors are masked by (2)) and to maintain a correct list
# of source files in case method (1) won't work on some future constrained
# platform.
#
# %%VARIETY: Add a rule for how to build the MPS library for the variety
$(PFM)\rash\mps.lib: $(PFM)\rash\mps.obj
$(ECHO) $@
$(LIBMAN) $(LIBFLAGS) /OUT:$@ $**
$(PFM)\hot\mps.lib: $(PFM)\hot\mps.obj
$(ECHO) $@
$(LIBMAN) $(LIBFLAGS) /OUT:$@ $**
$(PFM)\cool\mps.lib: \
$(MPMOBJ) $(AMCOBJ) $(AMSOBJ) $(AWLOBJ) $(LOOBJ) $(SNCOBJ) \
$(MVFFOBJ) $(PLINTHOBJ) $(POOLNOBJ)
$(ECHO) $@
cl /c $(CFLAGS) /Fd$(PFM)\$(VARIETY)\ /Fo$(PFM)\$(VARIETY)\version.o version.c
$(LIBMAN) $(LIBFLAGS) /OUT:$@ $** $(PFM)\$(VARIETY)\version.o
$(PFM)\di\mps.lib: \
$(MPMOBJ) $(AMCOBJ) $(AMSOBJ) $(AWLOBJ) $(LOOBJ) $(SNCOBJ) \
$(MVFFOBJ) $(PLINTHOBJ) $(POOLNOBJ)
$(ECHO) $@
cl /c $(CFLAGS) /Fd$(PFM)\$(VARIETY)\ /Fo$(PFM)\$(VARIETY)\version.o version.c
$(LIBMAN) $(LIBFLAGS) /OUT:$@ $** $(PFM)\$(VARIETY)\version.o
$(PFM)\ti\mps.lib: \
$(MPMOBJ) $(AMCOBJ) $(AMSOBJ) $(AWLOBJ) $(LOOBJ) $(SNCOBJ) \
$(MVFFOBJ) $(PLINTHOBJ) $(POOLNOBJ)
$(ECHO) $@
cl /c $(CFLAGS) /Fd$(PFM)\$(VARIETY)\ /Fo$(PFM)\$(VARIETY)\version.o version.c
$(LIBMAN) $(LIBFLAGS) /OUT:$@ $** $(PFM)\$(VARIETY)\version.o
# GENUINE TARGETS
# OTHER GENUINE TARGETS
#
# Each line defines an executable or library target to be built and the object
# files it is build from. For an executable these lines add dependencies to
@ -100,125 +135,105 @@ FORCE:
# to build it.
# %%TARGET: Add your new target here
!IFDEF VARIETY
# .special.version: version.obj has a special rule so that it is always
# built. This rule has no commands, meaning that the commands from
# other rules (the implicit .c -> .obj rule in particular) will be used.
# (Actually, there's a MS bug that causes this to randomly fail to build.)
$(PFM)\$(VARIETY)\version.obj: FORCE
$(PFM)\$(VARIETY)\finalcv.exe: $(PFM)\$(VARIETY)\finalcv.obj \
$(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(FMTTESTOBJ) \
$(MRGOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(FMTTESTOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\finaltest.exe: $(PFM)\$(VARIETY)\finaltest.obj \
$(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(FMTTESTOBJ) \
$(MRGOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(FMTTESTOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\expt825.exe: $(PFM)\$(VARIETY)\expt825.obj \
$(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(FMTTESTOBJ) \
$(MRGOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(FMTTESTOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\locv.exe: $(PFM)\$(VARIETY)\locv.obj \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) $(LOOBJ)
$(PFM)\$(VARIETY)\mps.lib $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mpmss.exe: $(PFM)\$(VARIETY)\mpmss.obj \
$(PFM)\$(VARIETY)\poolmvff.obj \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\apss.exe: $(PFM)\$(VARIETY)\apss.obj \
$(PFM)\$(VARIETY)\poolmvff.obj \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\sacss.exe: $(PFM)\$(VARIETY)\sacss.obj \
$(PFM)\$(VARIETY)\poolmvff.obj \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\bttest.exe: $(PFM)\$(VARIETY)\bttest.obj \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\teletest.exe: $(PFM)\$(VARIETY)\teletest.obj \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\lockcov.exe: $(PFM)\$(VARIETY)\lockcov.obj \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\lockutw3.exe: $(PFM)\$(VARIETY)\lockutw3.obj \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mpsicv.exe: $(PFM)\$(VARIETY)\mpsicv.obj \
$(MPMOBJ) $(AMCOBJ) $(PLINTHOBJ) $(FMTTESTOBJ) \
$(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(FMTTESTOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\amcss.exe: $(PFM)\$(VARIETY)\amcss.obj \
$(MPMOBJ) $(AMCOBJ) $(PLINTHOBJ) $(FMTTESTOBJ) \
$(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(FMTTESTOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\amcsshe.exe: $(PFM)\$(VARIETY)\amcsshe.obj \
$(MPMOBJ) $(AMCOBJ) $(PLINTHOBJ) $(FMTTESTOBJ) \
$(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(FMTTESTOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\amsss.exe: $(PFM)\$(VARIETY)\amsss.obj \
$(MPMOBJ) $(AMSOBJ) $(PLINTHOBJ) $(FMTTESTOBJ) \
$(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(FMTTESTOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\amssshe.exe: $(PFM)\$(VARIETY)\amssshe.obj \
$(MPMOBJ) $(AMSOBJ) $(PLINTHOBJ) $(FMTTESTOBJ) \
$(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(FMTTESTOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\segsmss.exe: $(PFM)\$(VARIETY)\segsmss.obj \
$(MPMOBJ) $(AMSOBJ) $(PLINTHOBJ) $(FMTTESTOBJ) \
$(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(FMTTESTOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\locbwcss.exe: $(PFM)\$(VARIETY)\locbwcss.obj \
$(PFM)\$(VARIETY)\poolmvff.obj \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\locusss.exe: $(PFM)\$(VARIETY)\locusss.obj \
$(PFM)\$(VARIETY)\poolmvff.obj \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\dwstress.exe: $(PFM)\$(VARIETY)\dwstress.obj \
$(DWOBJ) $(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ)
$(PFM)\$(VARIETY)\dwstress.exe: $(PFM)\$(VARIETY)\dwstress.obj \
$(DWOBJ) $(PFM)\$(VARIETY)\mps.lib
$(PFM)\$(VARIETY)\awlut.exe: $(PFM)\$(VARIETY)\awlut.obj \
$(PFM)\$(VARIETY)\awlut.exe: $(PFM)\$(VARIETY)\awlut.obj \
$(FMTTESTOBJ) \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) $(LOOBJ) $(AWLOBJ)
$(PFM)\$(VARIETY)\mps.lib $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\awluthe.exe: $(PFM)\$(VARIETY)\awluthe.obj \
$(FMTTESTOBJ) \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) $(LOOBJ) $(AWLOBJ)
$(PFM)\$(VARIETY)\mps.lib $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\poolncv.exe: $(PFM)\$(VARIETY)\poolncv.obj \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ) $(POOLNOBJ)
$(PFM)\$(VARIETY)\mps.lib $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\qs.exe: $(PFM)\$(VARIETY)\qs.obj \
$(AMCOBJ) $(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\arenacv.exe: $(PFM)\$(VARIETY)\arenacv.obj \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\abqtest.exe: $(PFM)\$(VARIETY)\abqtest.obj \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\abq.obj $(PFM)\$(VARIETY)\mps.lib $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\cbstest.exe: $(PFM)\$(VARIETY)\cbstest.obj \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\btcv.exe: $(PFM)\$(VARIETY)\btcv.obj \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mv2test.exe: $(PFM)\$(VARIETY)\mv2test.obj \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\poolmv2.obj $(PFM)\$(VARIETY)\abq.obj \
$(PFM)\$(VARIETY)\mps.lib $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\zcoll.exe: $(PFM)\$(VARIETY)\zcoll.obj \
$(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(FMTTESTOBJ) \
$(MRGOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(FMTTESTOBJ) \
$(TESTLIBOBJ)
$(PFM)\$(VARIETY)\zmess.exe: $(PFM)\$(VARIETY)\zmess.obj \
$(MPMOBJ) $(PLINTHOBJ) $(AMCOBJ) $(FMTTESTOBJ) \
$(MRGOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(FMTTESTOBJ) \
$(TESTLIBOBJ)
$(PFM)\$(VARIETY)\eventcnv.exe: $(PFM)\$(VARIETY)\eventcnv.obj \
$(PFM)\$(VARIETY)\eventpro.obj $(PFM)\$(VARIETY)\table.obj
@ -226,8 +241,7 @@ $(PFM)\$(VARIETY)\eventcnv.exe: $(PFM)\$(VARIETY)\eventcnv.obj \
$(PFM)\$(VARIETY)\replay.exe: $(PFM)\$(VARIETY)\replay.obj \
$(PFM)\$(VARIETY)\eventrep.obj \
$(PFM)\$(VARIETY)\eventpro.obj $(PFM)\$(VARIETY)\table.obj \
$(MPMOBJ) $(AWLOBJ) $(AMSOBJ) $(POOLNOBJ) $(AMCOBJ) $(SNCOBJ) \
$(PFM)\$(VARIETY)\poolmvff.obj $(PFM)\$(VARIETY)\mpsliban.obj
$(PFM)\$(VARIETY)\mps.lib
# Have to rename the object file, because the names must match, or
# the template rule for .exe.obj won't be used.
@ -235,63 +249,17 @@ $(PFM)\$(VARIETY)\replaysw.obj: $(PFM)\$(VARIETY)\replay.obj
$(ECHO) $@
copy $** $@ >nul:
$(PFM)\$(VARIETY)\replaysw.exe: $(PFM)\$(VARIETY)\replaysw.obj \
$(PFM)\$(VARIETY)\eventrep.obj \
$(PFM)\$(VARIETY)\eventpro.obj $(PFM)\$(VARIETY)\table.obj \
$(PFM)\$(VARIETY)\fmtpstst.obj $(TESTLIBOBJ) \
$(PFM)\$(VARIETY)\mpsliban.obj $(SWOBJ)
$(PFM)\$(VARIETY)\messtest.exe: $(PFM)\$(VARIETY)\messtest.obj \
$(MPMOBJ) $(PLINTHOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\steptest.exe: $(PFM)\$(VARIETY)\steptest.obj \
$(MPMOBJ) $(AMCOBJ) $(PLINTHOBJ) $(FMTTESTOBJ) \
$(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(FMTTESTOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\walkt0.exe: $(PFM)\$(VARIETY)\walkt0.obj \
$(MPMOBJ) $(AMCOBJ) $(PLINTHOBJ) $(FMTTESTOBJ) \
$(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mps.lib $(FMTTESTOBJ) $(TESTLIBOBJ)
$(PFM)\$(VARIETY)\exposet0.exe: $(PFM)\$(VARIETY)\exposet0.obj \
$(MPMOBJ) $(AMCOBJ) $(PLINTHOBJ) $(FMTTESTOBJ) \
$(TESTLIBOBJ)
$(PFM)\$(VARIETY)\mmsw.lib: $(SWOBJ)
$(ECHO) $@
$(LIBMAN) $(LIBFLAGS) /OUT:$@ $**
$(PFM)\$(VARIETY)\mmdw.lib: $(MPMOBJ) $(AMCOBJ) $(DWOBJ) \
$(AWLOBJ) $(LOOBJ) $(SNCOBJ)
$(ECHO) $@
$(LIBMAN) $(LIBFLAGS) /OUT:$@ $**
$(PFM)\$(VARIETY)\mps.lib: $(MPMOBJ) $(AMCOBJ) $(LOOBJ) $(SNCOBJ) \
$(MVFFOBJ) $(AMSOBJ) $(AWLOBJ)
$(ECHO) $@
$(LIBMAN) $(LIBFLAGS) /OUT:$@ $**
# We would like to use $** in the linker command line here, but we
# cannot because the target, mpsdy.dll, depends on the w3gen.def file,
# but this is not to be treated as an object on the linker line. Sorry
# about the repetition of the object list.
$(PFM)\$(VARIETY)\mpsdy.dll: $(PFM)\$(VARIETY)\mpslibcb.obj \
$(MPMOBJ) $(AMCOBJ) $(LOOBJ) $(SNCOBJ) \
$(MVFFOBJ) $(AMSOBJ) $(AWLOBJ) w3gen.def \
mpslibcb.def
$(ECHO) $@
$(LINKER) $(LINKFLAGS) /def:w3gen.def \
/def:mpslibcb.def /dll /OUT:$@ \
$(PFM)\$(VARIETY)\mpslibcb.obj \
$(MPMOBJ) $(AMCOBJ) $(LOOBJ) $(SNCOBJ) \
$(MVFFOBJ) $(AMSOBJ) $(AWLOBJ)
$(PFM)\$(VARIETY)\mpsplan.lib: $(PLINTHOBJ)
$(ECHO) $@
$(LIBMAN) $(LIBFLAGS) /OUT:$@ $**
$(PFM)\$(VARIETY)\mpsplcb.lib: $(PFM)\$(VARIETY)\mpslibcb.obj
$(ECHO) $@
$(LIBMAN) $(LIBFLAGS) /OUT:$@ $**
$(PFM)\$(VARIETY)\mps.lib $(FMTTESTOBJ) $(TESTLIBOBJ)
!ENDIF

View file

@ -24,7 +24,6 @@
# AMS as above for the "ams" part
# LO as above for the "lo" part
# MRG as above for the "mrg" part
# SW as above for the "sw" part
# TESTLIB as above for the "testlib" part
# NOISY if defined, causes command to be emitted
#
@ -64,9 +63,6 @@
!IFNDEF AMS
!ERROR commpre.nmk: AMS not defined
!ENDIF
!IFNDEF SW
!ERROR commpre.nmk: SW not defined
!ENDIF
!IFNDEF TESTLIB
!ERROR commpre.nmk: TESTLIB not defined
!ENDIF
@ -90,39 +86,12 @@ ECHO = echo
# /ML means compile for single-threaded environment.
# A 'd' at the end means compile for debugging.
!ifdef TARGET
!if "$(TARGET)" == "mmsw.lib" || "$(TARGET)" == "epvmss.exe" || "$(TARGET)" == "replaysw.exe"
CFLAGSTARGETPRE = /DCONFIG_PROD_EPCORE
CFLAGSTARGETPRE =
CFLAGSTARGETPOST =
CRTFLAGSW = /MD
CRTFLAGSH = /MDd
CRTFLAGSC = /MDd
LINKFLAGSWHITE = msvcrt.lib
LINKFLAGSHOT = msvcrtd.lib
LINKFLAGSCOOL = msvcrtd.lib
!elseif "$(TARGET)" == "mmdw.lib"
# /Oy- is actually 86-specific, but Dylan is only built for that platform
CFLAGSTARGETPRE = /DCONFIG_PROD_DYLAN
CFLAGSTARGETPOST = /Oy-
CRTFLAGSW = /MT
CRTFLAGSH = /MT
CRTFLAGSC = /MT
LINKFLAGSWHITE = libcmt.lib
LINKFLAGSHOT = libcmt.lib
LINKFLAGSCOOL = libcmt.lib
!else
CFLAGSTARGETPRE = /DCONFIG_PROD_MPS
CFLAGSTARGETPOST =
CRTFLAGSW = /MT
CRTFLAGSH = /MT
CRTFLAGSC = /MTd
LINKFLAGSWHITE = libcmt.lib
CRTFLAGSHOT = /MT
CRTFLAGSCOOL = /MTd
LINKFLAGSHOT = libcmt.lib
LINKFLAGSCOOL = libcmtd.lib
!endif
!endif
CFLAGSCOMMONPRE = /nologo /W4 /WX $(PFMDEFS) $(CFLAGSTARGETPRE)
CFLAGSCOMMONPOST = $(CFLAGSTARGETPOST)
@ -144,14 +113,11 @@ CFLAGSEXTERNAL =
# The combinations of variety
# %%VARIETY: Define a macro containing the set of flags for the new variety.
CFWE = /DCONFIG_VAR_WE $(CRTFLAGSW) $(CFLAGSHOT) $(CFLAGSEXTERNAL)
CFWI = /DCONFIG_VAR_WI $(CRTFLAGSW) $(CFLAGSHOT) $(CFLAGSINTERNAL)
CFHE = /DCONFIG_VAR_HE $(CRTFLAGSH) $(CFLAGSHOT) $(CFLAGSEXTERNAL)
CFHI = /DCONFIG_VAR_HI $(CRTFLAGSH) $(CFLAGSHOT) $(CFLAGSINTERNAL)
CFDI = /DCONFIG_VAR_DI $(CRTFLAGSH) $(CFLAGSHOT) $(CFLAGSINTERNAL)
CFCE = /DCONFIG_VAR_CE $(CRTFLAGSC) $(CFLAGSCOOL) $(CFLAGSEXTERNAL)
CFCI = /DCONFIG_VAR_CI $(CRTFLAGSC) $(CFLAGSCOOL) $(CFLAGSINTERNAL)
CFTI = /DCONFIG_VAR_TI $(CRTFLAGSC) $(CFLAGSCOOL) $(CFLAGSINTERNAL)
CFRASH = /DCONFIG_VAR_RASH $(CRTFLAGSHOT) $(CFLAGSHOT) $(CFLAGSEXTERNAL)
CFHOT = /DCONFIG_VAR_HOT $(CRTFLAGSHOT) $(CFLAGSHOT) $(CFLAGSEXTERNAL)
CFDIAG = /DCONFIG_VAR_DIAG $(CRTFLAGSHOT) $(CFLAGSHOT) $(CFLAGSINTERNAL)
CFCOOL = /DCONFIG_VAR_COOL $(CRTFLAGSCOOL) $(CFLAGSCOOL) $(CFLAGSINTERNAL)
CFTI = /DCONFIG_VAR_TI $(CRTFLAGSCOOL) $(CFLAGSCOOL) $(CFLAGSINTERNAL)
# Microsoft documentation is not very clear on the point of using both
# optimization and debug information
@ -164,14 +130,11 @@ LINKFLAGSINTERNAL = /DEBUG
# ( Internal flags used to be set to /DEBUG:full )
LINKFLAGSEXTERNAL = /RELEASE
LFWE = $(LINKFLAGSWHITE) $(LINKFLAGSEXTERNAL)
LFWI = $(LINKFLAGSWHITE) $(LINKFLAGSINTERNAL)
LFHE = $(LINKFLAGSHOT) $(LINKFLAGSEXTERNAL)
LFHI = $(LINKFLAGSHOT) $(LINKFLAGSINTERNAL)
LFDI = $(LINKFLAGSHOT) $(LINKFLAGSINTERNAL)
LFCE = $(LINKFLAGSCOOL) $(LINKFLAGSEXTERNAL)
LFCI = $(LINKFLAGSCOOL) $(LINKFLAGSINTERNAL)
LFTI = $(LINKFLAGSCOOL) $(LINKFLAGSINTERNAL)
LFRASH = $(LINKFLAGSHOT) $(LINKFLAGSEXTERNAL)
LFHOT = $(LINKFLAGSHOT) $(LINKFLAGSEXTERNAL)
LFDIAG = $(LINKFLAGSHOT) $(LINKFLAGSINTERNAL)
LFCOOL = $(LINKFLAGSCOOL) $(LINKFLAGSINTERNAL)
LFTI = $(LINKFLAGSCOOL) $(LINKFLAGSINTERNAL)
#LFCV = /PROFILE /DEBUG:full /DEBUGTYPE:cv
@ -180,15 +143,11 @@ LFTI = $(LINKFLAGSCOOL) $(LINKFLAGSINTERNAL)
LIBMAN = lib # can't call this LIB - it screws the environment
LIBFLAGSCOMMON = /nologo
LIBFLAGSWE =
LIBFLAGSWI =
LIBFLAGSHE =
LIBFLAGSHI =
LIBFLAGSDI =
LIBFLAGSCE =
LIBFLAGSCI =
LIBFLAGSRASH =
LIBFLAGSHOT =
LIBFLAGSDIAG =
LIBFLAGSCOOL =
LIBFLAGSTI =
#LIBFLAGSCV =
# Browser database manager [not used at present]
#BSC = bscmake

View file

@ -21,39 +21,52 @@
/* Variety Configuration */
/* First translate GG build directives into better ones.
*/
/* Then deal with CONFIG_VAR_* build directives. These are translated into
the directives CONFIG_ASSERT, CONFIG_STATS, CONFIG_LOG, etc. which control
actual compilation features. */
#ifdef CONFIG_DEBUG
/* Translate CONFIG_DEBUG to CONFIG_STATS, because that's what it */
/* means. It's got nothing to do with debugging! RHSK 2007-06-29 */
#define CONFIG_STATS
#endif
/* Then deal with old-style CONFIG_VAR_* build directives. These
* must be translated into the new directives CONFIG_ASSERT,
* CONFIG_STATS, and CONFIG_LOG.
/* CONFIG_VAR_RASH -- the rash and reckless variety
*
* One day the old build system may be converted to use the new
* directives.
* This variety switches off as many features as possible for maximum
* performance, but is therefore unsafe and undebuggable. It is not intended
* for use, but for comparison with the hot variety, to check that assertion,
* logging, etc. have negligible overhead.
*/
#if defined(CONFIG_VAR_WI) || defined(CONFIG_VAR_WE) /* White-hot varieties */
#if defined(CONFIG_VAR_RASH)
/* no asserts */
/* ... so CHECKLEVEL_INITIAL is irrelevant */
/* no statistic meters */
/* no telemetry log events */
#elif defined(CONFIG_VAR_HI) || defined(CONFIG_VAR_HE) /* Hot varieties */
/* CONFIG_VAR_HOT -- the hot variety
*
* This variety is the default variety for distribution in products that use
* the MPS. It has maximum performance while retaining a good level of
* consistency checking and allowing some debugging and telemetry features.
*/
#elif defined(CONFIG_VAR_HOT)
#define CONFIG_ASSERT
#define CHECKLEVEL_INITIAL CheckLevelMINIMAL
#ifndef CHECKLEVEL
#define CHECKLEVEL CheckLevelMINIMAL
#endif
/* no statistic meters */
/* no telemetry log events */
#elif defined(CONFIG_VAR_DI) /* Diagnostic variety */
/* CONFIG_VAR_DIAG -- diagnostic variety
*
* Deprecated. The diagnostic variety prints messages about the internals
* of the MPS to an output stream. This is being replaced by an extended
* telemetry system. RB 2012-08-31
*/
#elif defined(CONFIG_VAR_DIAG) /* Diagnostic variety */
#define CONFIG_ASSERT
#define CHECKLEVEL_INITIAL CheckLevelMINIMAL
#ifndef CHECKLEVEL
#define CHECKLEVEL CheckLevelMINIMAL
#endif
#define CONFIG_STATS
/* For diagnostics, choose a DIAG_WITH_... output method.
* (We need to choose because the DIAG output system is under
@ -63,24 +76,42 @@
/* #define DIAG_WITH_PRINTF */
/* no telemetry log events */
#elif defined(CONFIG_VAR_CI) || defined(CONFIG_VAR_CE) /* Cool varieties */
/* CONFIG_VAR_COOL -- cool variety
*
* The cool variety is intended for use when developing an integration with
* the MPS or debugging memory problems or collecting detailed telemetry
* data for performance analysis. It has more thorough consistency checking
* and data collection and output, and full debugging information.
*/
#elif defined(CONFIG_VAR_COOL)
#define CONFIG_ASSERT
/* ... let PRODUCT determine CHECKLEVEL_INITIAL */
#define CONFIG_ASSERT_ALL
#define CONFIG_STATS
#ifndef CHECKLEVEL
#define CHECKLEVEL CheckLevelSHALLOW
#endif
/* no telemetry log events */
/* CONFIG_VAR_TI -- telemetry variety
*
* Deprecated. This is the variety with event logging to a telemetry stream.
* Currently being reworked to retain event logging with negligible overhead
* on all other varieties. RB 2012-08-31
*/
#elif defined(CONFIG_VAR_TI) /* Telemetry, Internal; variety.ti */
#define CONFIG_ASSERT
/* ... let PRODUCT determine CHECKLEVEL_INITIAL */
#define CONFIG_ASSERT_ALL
#ifndef CHECKLEVEL
#define CHECKLEVEL CheckLevelSHALLOW
#endif
#define CONFIG_STATS
#define CONFIG_LOG
#elif defined(CONFIG_VAR_II) /* Ice, Internal; variety.ii (HotLog) */
#define CONFIG_ASSERT
#define CHECKLEVEL_INITIAL CheckLevelMINIMAL
/* no statistic meters */
#define CONFIG_LOG
#endif
#endif /* CONFIG_VAR_* */
/* Build Features */
@ -90,8 +121,13 @@
/* asserts: AVER, AVERT, NOTREACHED, CHECKx */
/* note: a direct call to ASSERT() will *still* fire */
#define AVER_AND_CHECK
#if defined(CONFIG_ASSERT_ALL)
#define AVER_AND_CHECK_ALL
#define MPS_ASSERT_STRING "assertastic"
#else /* CONFIG_ASSERT_ALL, not */
#define MPS_ASSERT_STRING "asserted"
#else
#endif /* CONFIG_ASSERT_ALL */
#else /* CONFIG_ASSERT, not */
#define AVER_AND_CHECK_NONE
#define MPS_ASSERT_STRING "nonasserted"
#endif
@ -347,30 +383,11 @@
/* Product Configuration
*
* Convert CONFIG_PROD_* defined on compiler command line into
* internal configuration parameters. See <design/config/#prod>.
* Deprecated, see design/config/#req.prod>. This now only contains the
* configuration used by the former "MPS" product, which is now the only
* product.
*/
#if defined(CONFIG_PROD_EPCORE)
#define MPS_PROD_STRING "epcore"
#define MPS_PROD_EPCORE
#define ARENA_INIT_SPARE_COMMIT_LIMIT ((Size)0)
/* .nosync.why: ScriptWorks is single-threaded when using the MM. */
#define THREAD_SINGLE
#define PROTECTION_NONE
#define DONGLE_NONE
#define PROD_CHECKLEVEL_INITIAL CheckLevelMINIMAL /* CheckLevelSHALLOW is too slow for SW */
#elif defined(CONFIG_PROD_DYLAN)
#define MPS_PROD_STRING "dylan"
#define MPS_PROD_DYLAN
#define ARENA_INIT_SPARE_COMMIT_LIMIT ((Size)10uL*1024uL*1024uL)
#define THREAD_MULTI
#define PROTECTION
#define DONGLE_NONE
#define PROD_CHECKLEVEL_INITIAL CheckLevelSHALLOW
#elif defined(CONFIG_PROD_MPS)
#define MPS_PROD_STRING "mps"
#define MPS_PROD_MPS
#define ARENA_INIT_SPARE_COMMIT_LIMIT ((Size)10uL*1024uL*1024uL)
@ -379,36 +396,6 @@
#define DONGLE_NONE
#define PROD_CHECKLEVEL_INITIAL CheckLevelSHALLOW
#else
#error "No target product configured."
#endif
/* .prod.arena-size: ARENA_SIZE is currently set larger for the
* MM/Dylan product as an interim solution.
* See request.dylan.170170.sol.patch and change.dylan.buffalo.170170.
* Note that this define is only used by the implementation of the
* deprecated mps_space_create interface.
*/
#define ARENA_SIZE ((Size)1<<30)
/* if CHECKLEVEL_INITIAL hasn't been defined already (e.g. by a variety, or
* in a makefile), take the value from the product. */
#ifndef CHECKLEVEL_INITIAL
#define CHECKLEVEL_INITIAL PROD_CHECKLEVEL_INITIAL
#endif
/* Dongle configuration */
#if defined(DONGLE)
#define DONGLE_TEST_FREQUENCY ((unsigned int)4000)
#elif defined(DONGLE_NONE)
/* nothing to do */
#else
#error "No dongle configured."
#endif
/* Pool Class AMC configuration */

View file

@ -72,7 +72,7 @@ Bool PoolDebugMixinCheck(PoolDebugMixin debug)
CHECKL(TagInitMethodCheck(debug->tagInit));
/* Nothing to check about tagSize */
CHECKD(Pool, debug->tagPool);
CHECKL(CHECKTYPE(Addr, void*)); /* tagPool relies on this */
CHECKL(COMPATTYPE(Addr, void*)); /* tagPool relies on this */
/* Nothing to check about missingTags */
CHECKL(SplayTreeCheck(&debug->index));
}
@ -224,7 +224,7 @@ static void freeSplat(PoolDebugMixin debug, Pool pool, Addr base, Addr limit)
Addr p, next;
Size freeSize = debug->freeSize;
Arena arena;
Seg seg;
Seg seg = NULL; /* suppress "may be used uninitialized" */
Bool inSeg;
AVER(base < limit);
@ -258,7 +258,7 @@ static Bool freeCheck(PoolDebugMixin debug, Pool pool, Addr base, Addr limit)
Size freeSize = debug->freeSize;
Res res;
Arena arena;
Seg seg;
Seg seg = NULL; /* suppress "may be used uninitialized" */
Bool inSeg;
AVER(base < limit);
@ -472,7 +472,7 @@ static Res DebugPoolAlloc(Addr *aReturn,
Pool pool, Size size, Bool withReservoir)
{
Res res;
Addr new;
Addr new = NULL; /* suppress "may be used uninitialized" warning */
PoolDebugMixin debug;
AVER(aReturn != NULL);

View file

@ -21,8 +21,8 @@ void mps_pool_check_fenceposts(mps_pool_t mps_pool)
Pool pool = (Pool)mps_pool;
Arena arena;
/* CHECKT not AVERT, see <design/interface-c/#check.space */
AVER(CHECKT(Pool, pool));
/* TESTT not AVERT, see <design/interface-c/#check.space */
AVER(TESTT(Pool, pool));
arena = PoolArena(pool);
ArenaEnter(arena);
@ -41,8 +41,8 @@ void mps_pool_check_free_space(mps_pool_t mps_pool)
Pool pool = (Pool)mps_pool;
Arena arena;
/* CHECKT not AVERT, see <design/interface-c/#check.space */
AVER(CHECKT(Pool, pool));
/* TESTT not AVERT, see <design/interface-c/#check.space */
AVER(TESTT(Pool, pool));
arena = PoolArena(pool);
ArenaEnter(arena);

View file

@ -356,20 +356,20 @@ void EventDestroy(EventProc proc, Event event)
/* Checking macros, copied from check.h */
#define CHECKLVALUE(lv1, lv2) \
#define COMPATLVALUE(lv1, lv2) \
((void)sizeof((lv1) = (lv2)), (void)sizeof((lv2) = (lv1)), TRUE)
#define CHECKTYPE(t1, t2) \
#define COMPATTYPE(t1, t2) \
(sizeof(t1) == sizeof(t2) && \
CHECKLVALUE(*((t1 *)0), *((t2 *)0)))
COMPATLVALUE(*((t1 *)0), *((t2 *)0)))
#define CHECKFIELDAPPROX(s1, f1, s2, f2) \
#define COMPATFIELDAPPROX(s1, f1, s2, f2) \
(sizeof(((s1 *)0)->f1) == sizeof(((s2 *)0)->f2) && \
offsetof(s1, f1) == offsetof(s2, f2))
#define CHECKFIELD(s1, f1, s2, f2) \
(CHECKFIELDAPPROX(s1, f1, s2, f2) && \
CHECKLVALUE(((s1 *)0)->f1, ((s2 *)0)->f2))
#define COMPATFIELD(s1, f1, s2, f2) \
(COMPATFIELDAPPROX(s1, f1, s2, f2) && \
COMPATLVALUE(((s1 *)0)->f1, ((s2 *)0)->f2))
/* EventProcCreate -- initialize the module */
@ -383,8 +383,8 @@ Res EventProcCreate(EventProc *procReturn, Bool partial,
if (proc == NULL) return ResMEMORY;
/* check event struct access */
assert(CHECKFIELD(EventUnion, any.code, EventWSStruct, code));
assert(CHECKFIELD(EventUnion, any.clock, EventWSStruct, clock));
assert(COMPATFIELD(EventUnion, any.code, EventWSStruct, code));
assert(COMPATFIELD(EventUnion, any.clock, EventWSStruct, clock));
/* check use of labelTable */
#if !defined(MPS_OS_FR)
/* GCC -ansi -pedantic -Werror on FreeBSD will fail here

View file

@ -682,12 +682,12 @@ void EventReplay(Event event, Word etime)
/* Checking macros, copied from check.h */
#define CHECKLVALUE(lv1, lv2) \
#define COMPATLVALUE(lv1, lv2) \
((void)sizeof((lv1) = (lv2)), (void)sizeof((lv2) = (lv1)), TRUE)
#define CHECKTYPE(t1, t2) \
#define COMPATTYPE(t1, t2) \
(sizeof(t1) == sizeof(t2) && \
CHECKLVALUE(*((t1 *)0), *((t2 *)0)))
COMPATLVALUE(*((t1 *)0), *((t2 *)0)))
/* CHECKCONV -- check t2 can be cast to t1 without loss */
@ -705,8 +705,8 @@ Res EventRepInit(Bool partial)
/* Check using pointers as keys in the tables. */
verify(CHECKCONV(Word, void *));
/* Check storage of MPS opaque handles in the tables. */
verify(CHECKTYPE(mps_arena_t, void *));
verify(CHECKTYPE(mps_ap_t, void *));
verify(COMPATTYPE(mps_arena_t, void *));
verify(COMPATTYPE(mps_ap_t, void *));
/* .event-conv: Conversion of event fields into the types required */
/* by the MPS functions is justified by the reverse conversion */
/* being acceptable (which is upto the event log generator). */

View file

@ -5,19 +5,16 @@
PFM = fri3gc
PFMDEFS = -D_REENTRANT
MPMPF = lockix.c thix.c pthrdext.c vmix.c \
protix.c protsgix.c prmcan.c prmci3fr.c ssixi3.c span.c
SWPF = than.c vmfr.c protsw.c prmcan.c ssan.c
LIBS = -lm -pthread
include gc.gmk
CFLAGSCOMPILER := $(subst -pedantic,,$(CFLAGSCOMPILER))
CFLAGSDEBUG = -g3
CFLAGSOPT = -O -g3
# FIXME: We pun types through the MPS interface, setting off this warning.
# Can we avoid this? The puns might indeed be dangerous.
CFLAGSCOMPILER := $(CFLAGSCOMPILER) -Wno-strict-aliasing
CC = cc

View file

@ -5,19 +5,14 @@
PFM = fri6gc
PFMDEFS = -D_REENTRANT
MPMPF = lockix.c thix.c pthrdext.c vmix.c \
protix.c protsgix.c prmcan.c prmci6fr.c ssixi6.c span.c
SWPF = than.c vmfr.c protsw.c prmcan.c ssan.c
LIBS = -lm -pthread
include gc.gmk
CFLAGSCOMPILER := $(subst -pedantic,,$(CFLAGSCOMPILER))
CFLAGSDEBUG = -g3
CFLAGSOPT = -O -g3
CFLAGSCOMPILER := $(CFLAGSCOMPILER) -Wno-strict-aliasing
CC = cc

View file

@ -13,9 +13,8 @@ CFLAGSCOMPILER := \
-Wstrict-prototypes -Wmissing-prototypes \
-Winline -Waggregate-return -Wnested-externs \
-Wcast-qual -Wshadow
CFLAGSDEBUG = -g -ggdb3
CFLAGSOPT = -O -g -ggdb3
CFLAGSOPTNODEBUG = -O -g0
CFLAGSDEBUG = -O -g3
CFLAGSOPT = -O2 -g3
# gcc -MM generates a dependency line of the form:
# thing.o : thing.c ...

View file

@ -462,6 +462,10 @@ Ring GlobalsRememberedSummaryRing(Globals global)
/* ArenaEnter -- enter the state where you can look at the arena */
/* TODO: The THREAD_SINGLE and PROTECTION_NONE build configs aren't regularly
tested, though they might well be useful for embedded custom targets.
Should test them. RB 2012-09-03 */
#if defined(THREAD_SINGLE) && defined(PROTECTION_NONE)
void (ArenaEnter)(Arena arena)
{
@ -484,7 +488,7 @@ void arenaEnterLock(Arena arena, int recursive)
/* This check is safe to do outside the lock. Unless the client
is also calling ArenaDestroy, but that's a protocol violation by
the client if so. */
AVER(CHECKT(Arena, arena));
AVER(TESTT(Arena, arena));
StackProbe(StackProbeDEPTH);
lock = ArenaGlobals(arena)->lock;
@ -912,7 +916,7 @@ void ArenaPokeSeg(Arena arena, Seg seg, Addr addr, Ref ref)
Ref ArenaRead(Arena arena, Addr addr)
{
Bool b;
Seg seg;
Seg seg = NULL; /* suppress "may be used uninitialized" */
AVERT(Arena, arena);
@ -946,7 +950,7 @@ Res GlobalsDescribe(Globals arenaGlobals, mps_lib_FILE *stream)
Ring node, nextNode;
Index i;
if (!CHECKT(Globals, arenaGlobals)) return ResFAIL;
if (!TESTT(Globals, arenaGlobals)) return ResFAIL;
if (stream == NULL) return ResFAIL;
arena = GlobalsArena(arenaGlobals);

View file

@ -16,7 +16,6 @@ CFLAGSCOMPILER = \
-Wcast-qual -Wshadow -pg
CFLAGSDEBUG = -g -ggdb3
CFLAGSOPT = -O -g -ggdb3
CFLAGSOPTNODEBUG = -O -g0
# gcc -MM generates a dependency line of the form:
# thing.o : thing.c ...

View file

@ -8,13 +8,8 @@ PFM = lii3gc
THREADSRC = lockli.c thix.c pthrdext.c
THREADLIB = -lpthread
# _XOPEN_SOURCE is to get the modern POSIX signal handling
# _GNU_SOURCE is to get register numbers in prmci3li.c
PFMDEFS = -D_REENTRANT -D_XOPEN_SOURCE=500 -D_GNU_SOURCE
MPMPF = ${THREADSRC} vmix.c \
protix.c protli.c proti3.c prmci3li.c ssixi3.c span.c
SWPF = than.c vmli.c protsw.c prmcan.c ssan.c
LIBS = -lm ${THREADLIB}

View file

@ -8,13 +8,8 @@ PFM = lii6gc
THREADSRC = lockli.c thix.c pthrdext.c
THREADLIB = -lpthread
# _XOPEN_SOURCE is to get the modern POSIX signal handling
# _GNU_SOURCE is to get register numbers in prmci3li.c
PFMDEFS = -D_REENTRANT -D_XOPEN_SOURCE=500 -D_GNU_SOURCE
MPMPF = ${THREADSRC} vmix.c \
protix.c protli.c proti6.c prmci6li.c ssixi6.c span.c
SWPF = than.c vmli.c protsw.c prmcan.c ssan.c
LIBS = -lm ${THREADLIB}

View file

@ -22,15 +22,14 @@
* while we hold the mutex.
*/
#define _XOPEN_SOURCE 500
#include <pthread.h>
#include <semaphore.h>
#include <errno.h>
#include "mpmtypes.h"
#include "lock.h"
#include "config.h"
#include <pthread.h>
#include <semaphore.h>
#include <errno.h>
#ifndef MPS_OS_LI
#error "lockli.c is specific to LinuxThreads but MPS_OS_LI not defined"

View file

@ -23,10 +23,12 @@ SRCID(mpm, "$Id$");
/* CheckLevel -- Control check level
*
* This controls the behaviour of Check methods (see impl.h.check).
* This controls the behaviour of Check methods (see check.h).
*/
unsigned CheckLevel = CHECKLEVEL_INITIAL;
#ifdef CHECKLEVEL_DYNAMIC
unsigned CheckLevel = CHECKLEVEL_DYNAMIC;
#endif
/* MPMCheck -- test MPM assumptions */

View file

@ -18,6 +18,16 @@
* which closely mirror those in the makefiles.
*/
/* Platform interface
*
* This must be included first as it defines symbols which affect system
* headers, such as _POSIX_C_SOURCE _REENTRANT etc.
*/
#include "mpstd.h"
/* MPM Core */
#include "mpsi.c"
@ -77,10 +87,6 @@
#include "mpsioan.c"
#endif
/* Platform interface */
#include "mpstd.h"
/* Mac OS X on 32-bit Intel built with Clang or GCC */
#if defined(MPS_PF_XCI3LL) || defined(MPS_PF_XCI3GC)
@ -112,7 +118,7 @@
#elif defined(MPS_PF_FRI3GC)
#include "lockix.c" /* Posix locks */
#include "thix.c" /* FreeBSD on 32-bit Intel threading */
#include "thix.c" /* Posix threading */
#include "pthrdext.c" /* Posix thread extensions */
#include "vmix.c" /* Posix virtual memory */
#include "protix.c" /* Posix protection */
@ -122,6 +128,21 @@
#include "span.c" /* generic stack probe */
#include "ssixi3.c" /* Posix on 32-bit Intel stack scan */
/* FreeBSD on 64-bit Intel built with GCC */
#elif defined(MPS_PF_FRI6GC)
#include "lockix.c" /* Posix locks */
#include "thix.c" /* Posix threading */
#include "pthrdext.c" /* Posix thread extensions */
#include "vmix.c" /* Posix virtual memory */
#include "protix.c" /* Posix protection */
#include "protsgix.c" /* Posix signal handling */
#include "prmcan.c" /* generic mutator context */
#include "prmci6fr.c" /* 64-bit Intel for FreeBSD mutator context */
#include "span.c" /* generic stack probe */
#include "ssixi6.c" /* Posix on 64-bit Intel stack scan */
/* Linux on 32-bit Intel with GCC */
#elif defined(MPS_PF_LII3GC)
@ -147,10 +168,10 @@
#include "vmix.c" /* Posix virtual memory */
#include "protix.c" /* Posix protection */
#include "protli.c" /* Linux protection */
#include "proti6.c" /* 32-bit Intel mutator context */
#include "prmci6li.c" /* 32-bit Intel for Linux mutator context */
#include "proti6.c" /* 64-bit Intel mutator context */
#include "prmci6li.c" /* 64-bit Intel for Linux mutator context */
#include "span.c" /* generic stack probe */
#include "ssixi6.c" /* Posix on 32-bit Intel stack scan */
#include "ssixi6.c" /* Posix on 64-bit Intel stack scan */
/* Windows on 32-bit Intel with Microsoft Visual Studio */

View file

@ -274,10 +274,6 @@ extern mps_res_t mps_arena_create(mps_arena_t *, mps_arena_class_t, ...);
extern mps_res_t mps_arena_create_v(mps_arena_t *, mps_arena_class_t, va_list);
extern void mps_arena_destroy(mps_arena_t);
/* these two for backward compatibility */
extern mps_res_t mps_space_create(mps_space_t *);
extern void mps_space_destroy(mps_space_t);
extern size_t mps_arena_reserved(mps_arena_t);
extern size_t mps_arena_committed(mps_arena_t);
extern size_t mps_arena_spare_committed(mps_arena_t);

View file

@ -2081,7 +2081,7 @@
31EEABDA156AAE9E00714D05 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0430;
LastUpgradeCheck = 0440;
};
buildConfigurationList = 31EEABDD156AAE9E00714D05 /* Build configuration list for PBXProject "mps" */;
compatibilityVersion = "Xcode 3.2";
@ -2818,6 +2818,7 @@
3104AFF3156D37A0000A585A /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
COMBINE_HIDPI_IMAGES = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
@ -2825,6 +2826,7 @@
3104AFF4156D37A0000A585A /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
COMBINE_HIDPI_IMAGES = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
@ -3109,6 +3111,285 @@
};
name = Release;
};
318387EB15DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES;
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
GCC_C_LANGUAGE_STANDARD = ansi;
GCC_OPTIMIZATION_LEVEL = 2;
GCC_PREPROCESSOR_DEFINITIONS = CONFIG_VAR_WE;
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES;
GCC_TREAT_WARNINGS_AS_ERRORS = NO;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = NO;
GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES;
GCC_WARN_PEDANTIC = YES;
GCC_WARN_SHADOW = YES;
GCC_WARN_SIGN_COMPARE = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNKNOWN_PRAGMAS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_LABEL = YES;
GCC_WARN_UNUSED_PARAMETER = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
OTHER_CFLAGS = (
"-pedantic",
"-Wall",
"-Wno-extended-offsetof",
);
SDKROOT = macosx;
WARNING_CFLAGS = (
"-pedantic",
"-Wpointer-arith",
"-Wstrict-prototypes",
"-Wmissing-prototypes",
"-Winline",
"-Waggregate-return",
"-Wnested-externs",
"-Wcast-qual",
"-Wshadow",
"-Wall",
"-Wno-extended-offsetof",
);
};
name = WE;
};
318387EC15DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
COMBINE_HIDPI_IMAGES = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
318387ED15DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
COMBINE_HIDPI_IMAGES = YES;
EXECUTABLE_PREFIX = lib;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
318387EE15DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
318387EF15DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
318387F015DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
318387F115DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
318387F215DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
318387F315DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
318387F415DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
318387F515DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
318387F615DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
318387F715DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
318387F815DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
318387F915DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
318387FA15DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
318387FB15DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
318387FC15DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
318387FD15DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
318387FE15DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
318387FF15DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
3183880015DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
3183880115DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
3183880215DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
3183880315DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
3183880415DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
3183880515DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
3183880615DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
3183880715DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
3183880815DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
3183880915DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
3183880A15DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
3183880B15DC30CC008E4EA0 /* WE */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = WE;
};
31D60015156D3CB200337B26 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
@ -3202,11 +3483,7 @@
COPY_PHASE_STRIP = NO;
GCC_C_LANGUAGE_STANDARD = ansi;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
CONFIG_PF_XCI6LL,
CONFIG_PROD_MPS,
CONFIG_VAR_CI,
);
GCC_PREPROCESSOR_DEFINITIONS = CONFIG_VAR_COOL;
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES;
GCC_TREAT_WARNINGS_AS_ERRORS = NO;
@ -3226,7 +3503,6 @@
GCC_WARN_UNUSED_LABEL = YES;
GCC_WARN_UNUSED_PARAMETER = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.4;
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = (
"-pedantic",
@ -3258,12 +3534,8 @@
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
GCC_C_LANGUAGE_STANDARD = ansi;
GCC_PREPROCESSOR_DEFINITIONS = (
CONFIG_PF_XCI6LL,
CONFIG_PROD_MPS,
CONFIG_VAR_HE,
NDEBUG,
);
GCC_OPTIMIZATION_LEVEL = 2;
GCC_PREPROCESSOR_DEFINITIONS = CONFIG_VAR_HOT;
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES;
GCC_TREAT_WARNINGS_AS_ERRORS = NO;
@ -3283,7 +3555,6 @@
GCC_WARN_UNUSED_LABEL = YES;
GCC_WARN_UNUSED_PARAMETER = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.4;
OTHER_CFLAGS = (
"-pedantic",
"-Wall",
@ -3310,6 +3581,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
COMBINE_HIDPI_IMAGES = YES;
EXECUTABLE_PREFIX = lib;
PRODUCT_NAME = "$(TARGET_NAME)";
};
@ -3319,6 +3591,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
COMBINE_HIDPI_IMAGES = YES;
EXECUTABLE_PREFIX = lib;
PRODUCT_NAME = "$(TARGET_NAME)";
};
@ -3346,6 +3619,7 @@
buildConfigurations = (
3104AFBA156D357B000A585A /* Debug */,
3104AFBB156D357B000A585A /* Release */,
318387EF15DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3355,6 +3629,7 @@
buildConfigurations = (
3104AFD0156D35E2000A585A /* Debug */,
3104AFD1156D35E2000A585A /* Release */,
318387F315DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3364,6 +3639,7 @@
buildConfigurations = (
3104AFE5156D3682000A585A /* Debug */,
3104AFE6156D3682000A585A /* Release */,
318387F415DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3373,6 +3649,7 @@
buildConfigurations = (
3104AFF3156D37A0000A585A /* Debug */,
3104AFF4156D37A0000A585A /* Release */,
318387EC15DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3382,6 +3659,7 @@
buildConfigurations = (
3104B011156D38F3000A585A /* Debug */,
3104B012156D38F3000A585A /* Release */,
318387F515DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3391,6 +3669,7 @@
buildConfigurations = (
3104B02A156D39D4000A585A /* Debug */,
3104B02B156D39D4000A585A /* Release */,
318387F615DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3400,6 +3679,7 @@
buildConfigurations = (
3104B045156D3AD8000A585A /* Debug */,
3104B046156D3AD8000A585A /* Release */,
318387F715DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3409,6 +3689,7 @@
buildConfigurations = (
3114A597156E913C001E0AA3 /* Debug */,
3114A598156E913C001E0AA3 /* Release */,
318387FE15DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3418,6 +3699,7 @@
buildConfigurations = (
3114A5AF156E92C0001E0AA3 /* Debug */,
3114A5B0156E92C0001E0AA3 /* Release */,
318387FF15DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3427,6 +3709,7 @@
buildConfigurations = (
3114A5C5156E9315001E0AA3 /* Debug */,
3114A5C6156E9315001E0AA3 /* Release */,
3183880015DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3436,6 +3719,7 @@
buildConfigurations = (
3114A5DE156E93A0001E0AA3 /* Debug */,
3114A5DF156E93A0001E0AA3 /* Release */,
3183880115DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3445,6 +3729,7 @@
buildConfigurations = (
3114A5F7156E93E7001E0AA3 /* Debug */,
3114A5F8156E93E7001E0AA3 /* Release */,
3183880215DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3454,6 +3739,7 @@
buildConfigurations = (
3114A60D156E9430001E0AA3 /* Debug */,
3114A60E156E9430001E0AA3 /* Release */,
3183880315DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3463,6 +3749,7 @@
buildConfigurations = (
3114A624156E9485001E0AA3 /* Debug */,
3114A625156E9485001E0AA3 /* Release */,
3183880415DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3472,6 +3759,7 @@
buildConfigurations = (
3114A63B156E94DB001E0AA3 /* Debug */,
3114A63C156E94DB001E0AA3 /* Release */,
3183880515DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3481,6 +3769,7 @@
buildConfigurations = (
3114A654156E9596001E0AA3 /* Debug */,
3114A655156E9596001E0AA3 /* Release */,
3183880615DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3490,6 +3779,7 @@
buildConfigurations = (
3114A66A156E95D9001E0AA3 /* Debug */,
3114A66B156E95D9001E0AA3 /* Release */,
3183880715DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3499,6 +3789,7 @@
buildConfigurations = (
3114A684156E9669001E0AA3 /* Debug */,
3114A685156E9669001E0AA3 /* Release */,
3183880815DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3508,6 +3799,7 @@
buildConfigurations = (
3114A69D156E971B001E0AA3 /* Debug */,
3114A69E156E971B001E0AA3 /* Release */,
3183880915DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3517,6 +3809,7 @@
buildConfigurations = (
3114A6B4156E9759001E0AA3 /* Debug */,
3114A6B5156E9759001E0AA3 /* Release */,
3183880A15DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3526,6 +3819,7 @@
buildConfigurations = (
3114A6CE156E9815001E0AA3 /* Debug */,
3114A6CF156E9815001E0AA3 /* Release */,
3183880B15DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3535,6 +3829,7 @@
buildConfigurations = (
3124CAC0156BE3EC00753214 /* Debug */,
3124CAC1156BE3EC00753214 /* Release */,
318387F015DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3544,6 +3839,7 @@
buildConfigurations = (
3124CADC156BE64A00753214 /* Debug */,
3124CADD156BE64A00753214 /* Release */,
318387F215DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3553,6 +3849,7 @@
buildConfigurations = (
3124CAF3156BE7F300753214 /* Debug */,
3124CAF4156BE7F300753214 /* Release */,
318387EE15DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3562,6 +3859,7 @@
buildConfigurations = (
31D60015156D3CB200337B26 /* Debug */,
31D60016156D3CB200337B26 /* Release */,
318387F815DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3571,6 +3869,7 @@
buildConfigurations = (
31D6002F156D3D3F00337B26 /* Debug */,
31D60030156D3D3F00337B26 /* Release */,
318387F915DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3580,6 +3879,7 @@
buildConfigurations = (
31D60046156D3EC700337B26 /* Debug */,
31D60047156D3EC700337B26 /* Release */,
318387FA15DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3589,6 +3889,7 @@
buildConfigurations = (
31D6005C156D3F3500337B26 /* Debug */,
31D6005D156D3F3500337B26 /* Release */,
318387FB15DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3598,6 +3899,7 @@
buildConfigurations = (
31D60079156D3FBC00337B26 /* Debug */,
31D6007A156D3FBC00337B26 /* Release */,
318387FC15DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3607,6 +3909,7 @@
buildConfigurations = (
31D60094156D402900337B26 /* Debug */,
31D60095156D402900337B26 /* Release */,
318387FD15DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3616,6 +3919,7 @@
buildConfigurations = (
31EEABDF156AAE9E00714D05 /* Debug */,
31EEABE0156AAE9E00714D05 /* Release */,
318387EB15DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3625,6 +3929,7 @@
buildConfigurations = (
31EEABFD156AAF9D00714D05 /* Debug */,
31EEABFE156AAF9D00714D05 /* Release */,
318387ED15DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -3634,6 +3939,7 @@
buildConfigurations = (
31EEAC6D156AB52600714D05 /* Debug */,
31EEAC6E156AB52600714D05 /* Release */,
318387F115DC30CC008E4EA0 /* WE */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;

View file

@ -73,7 +73,7 @@ static Bool mpsi_check(void)
/* .check.rc: Check that external and internal result codes match. */
/* See <code/mps.h#result-codes> and <code/mpmtypes.h#result-codes>. */
/* Also see .check.enum.cast. */
CHECKL(CHECKTYPE(mps_res_t, Res));
CHECKL(COMPATTYPE(mps_res_t, Res));
CHECKL((int)MPS_RES_OK == (int)ResOK);
CHECKL((int)MPS_RES_FAIL == (int)ResFAIL);
CHECKL((int)MPS_RES_RESOURCE == (int)ResRESOURCE);
@ -86,7 +86,7 @@ static Bool mpsi_check(void)
/* Check that external and internal rank numbers match. */
/* See <code/mps.h#ranks> and <code/mpmtypes.h#ranks>. */
/* Also see .check.enum.cast. */
CHECKL(CHECKTYPE(mps_rank_t, Rank));
CHECKL(COMPATTYPE(mps_rank_t, Rank));
CHECKL((int)MPS_RANK_AMBIG == (int)RankAMBIG);
CHECKL((int)MPS_RANK_EXACT == (int)RankEXACT);
CHECKL((int)MPS_RANK_WEAK == (int)RankWEAK);
@ -95,7 +95,7 @@ static Bool mpsi_check(void)
/* See <code/mps.h#message.types> and */
/* <code/mpmtypes.h#message.types>. */
/* Also see .check.enum.cast. */
CHECKL(CHECKTYPE(mps_message_type_t, MessageType));
CHECKL(COMPATTYPE(mps_message_type_t, MessageType));
CHECKL((int)MessageTypeFINALIZATION
== (int)MPS_MESSAGE_TYPE_FINALIZATION);
CHECKL((int)MessageTypeGC
@ -106,74 +106,74 @@ static Bool mpsi_check(void)
/* The external idea of a word width and the internal one */
/* had better match. See <design/interface-c/#cons>. */
CHECKL(sizeof(mps_word_t) == sizeof(void *));
CHECKL(CHECKTYPE(mps_word_t, Word));
CHECKL(COMPATTYPE(mps_word_t, Word));
/* The external idea of an address and the internal one */
/* had better match. */
CHECKL(CHECKTYPE(mps_addr_t, Addr));
CHECKL(COMPATTYPE(mps_addr_t, Addr));
/* The external idea of size and the internal one had */
/* better match. See <design/interface-c/#cons.size> */
/* and <design/interface-c/#pun.size>. */
CHECKL(CHECKTYPE(size_t, Size));
CHECKL(COMPATTYPE(size_t, Size));
/* Clock values are passed from external to internal and back */
/* out to external. */
CHECKL(CHECKTYPE(mps_clock_t, Clock));
CHECKL(COMPATTYPE(mps_clock_t, Clock));
/* Check ap_s/APStruct compatibility by hand */
/* .check.ap: See <code/mps.h#ap> and <code/buffer.h#ap>. */
CHECKL(sizeof(mps_ap_s) == sizeof(APStruct));
CHECKL(CHECKFIELD(mps_ap_s, init, APStruct, init));
CHECKL(CHECKFIELD(mps_ap_s, alloc, APStruct, alloc));
CHECKL(CHECKFIELD(mps_ap_s, limit, APStruct, limit));
CHECKL(COMPATFIELD(mps_ap_s, init, APStruct, init));
CHECKL(COMPATFIELD(mps_ap_s, alloc, APStruct, alloc));
CHECKL(COMPATFIELD(mps_ap_s, limit, APStruct, limit));
/* Check sac_s/ExternalSACStruct compatibility by hand */
/* See <code/mps.h#sac> and <code/sac.h#sac>. */
CHECKL(sizeof(mps_sac_s) == sizeof(ExternalSACStruct));
CHECKL(CHECKFIELD(mps_sac_s, mps_middle, ExternalSACStruct, middle));
CHECKL(CHECKFIELD(mps_sac_s, mps_trapped,
CHECKL(COMPATFIELD(mps_sac_s, mps_middle, ExternalSACStruct, middle));
CHECKL(COMPATFIELD(mps_sac_s, mps_trapped,
ExternalSACStruct, trapped));
CHECKL(CHECKFIELDAPPROX(mps_sac_s, mps_freelists,
CHECKL(COMPATFIELDAPPROX(mps_sac_s, mps_freelists,
ExternalSACStruct, freelists));
CHECKL(sizeof(mps_sac_freelist_block_s)
== sizeof(SACFreeListBlockStruct));
CHECKL(CHECKFIELD(mps_sac_freelist_block_s, mps_size,
CHECKL(COMPATFIELD(mps_sac_freelist_block_s, mps_size,
SACFreeListBlockStruct, size));
CHECKL(CHECKFIELD(mps_sac_freelist_block_s, mps_count,
CHECKL(COMPATFIELD(mps_sac_freelist_block_s, mps_count,
SACFreeListBlockStruct, count));
CHECKL(CHECKFIELD(mps_sac_freelist_block_s, mps_count_max,
CHECKL(COMPATFIELD(mps_sac_freelist_block_s, mps_count_max,
SACFreeListBlockStruct, countMax));
CHECKL(CHECKFIELD(mps_sac_freelist_block_s, mps_blocks,
CHECKL(COMPATFIELD(mps_sac_freelist_block_s, mps_blocks,
SACFreeListBlockStruct, blocks));
/* Check sac_classes_s/SACClassesStruct compatibility by hand */
/* See <code/mps.h#sacc> and <code/sac.h#sacc>. */
CHECKL(sizeof(mps_sac_classes_s) == sizeof(SACClassesStruct));
CHECKL(CHECKFIELD(mps_sac_classes_s, mps_block_size,
CHECKL(COMPATFIELD(mps_sac_classes_s, mps_block_size,
SACClassesStruct, blockSize));
CHECKL(CHECKFIELD(mps_sac_classes_s, mps_cached_count,
CHECKL(COMPATFIELD(mps_sac_classes_s, mps_cached_count,
SACClassesStruct, cachedCount));
CHECKL(CHECKFIELD(mps_sac_classes_s, mps_frequency,
CHECKL(COMPATFIELD(mps_sac_classes_s, mps_frequency,
SACClassesStruct, frequency));
/* Check ss_s/ScanStateStruct compatibility by hand */
/* .check.ss: See <code/mps.h#ss> and <code/mpmst.h#ss>. */
/* Note that the size of the mps_ss_s and ScanStateStruct */
/* are not equal. See <code/mpmst.h#ss>. CHECKFIELDAPPROX */
/* are not equal. See <code/mpmst.h#ss>. COMPATFIELDAPPROX */
/* is used on the fix field because its type is punned and */
/* therefore isn't exactly checkable. See */
/* <design/interface-c/#pun.addr>. */
CHECKL(CHECKFIELDAPPROX(mps_ss_s, fix, ScanStateStruct, fix));
CHECKL(CHECKFIELD(mps_ss_s, w0, ScanStateStruct, zoneShift));
CHECKL(CHECKFIELD(mps_ss_s, w1, ScanStateStruct, white));
CHECKL(CHECKFIELD(mps_ss_s, w2, ScanStateStruct, unfixedSummary));
CHECKL(COMPATFIELDAPPROX(mps_ss_s, fix, ScanStateStruct, fix));
CHECKL(COMPATFIELD(mps_ss_s, w0, ScanStateStruct, zoneShift));
CHECKL(COMPATFIELD(mps_ss_s, w1, ScanStateStruct, white));
CHECKL(COMPATFIELD(mps_ss_s, w2, ScanStateStruct, unfixedSummary));
/* Check ld_s/LDStruct compatibility by hand */
/* .check.ld: See also <code/mpmst.h#ld.struct> and <code/mps.h#ld> */
CHECKL(sizeof(mps_ld_s) == sizeof(LDStruct));
CHECKL(CHECKFIELD(mps_ld_s, w0, LDStruct, epoch));
CHECKL(CHECKFIELD(mps_ld_s, w1, LDStruct, rs));
CHECKL(COMPATFIELD(mps_ld_s, w0, LDStruct, epoch));
CHECKL(COMPATFIELD(mps_ld_s, w1, LDStruct, rs));
return TRUE;
}
@ -459,13 +459,6 @@ mps_res_t mps_arena_create_v(mps_arena_t *mps_arena_o,
return MPS_RES_OK;
}
/* DEPRECATED */
mps_res_t mps_space_create(mps_space_t *mps_space_o)
{
return mps_arena_create(mps_space_o, mps_arena_class_vm(), ARENA_SIZE);
}
/* mps_arena_destroy -- destroy an arena object */
void mps_arena_destroy(mps_arena_t mps_arena)
@ -476,12 +469,6 @@ void mps_arena_destroy(mps_arena_t mps_arena)
ArenaDestroy(arena);
}
/* DEPRECATED */
void mps_space_destroy(mps_space_t mps_space)
{
mps_arena_destroy(mps_space);
}
/* mps_arena_has_addr -- is this address managed by this arena? */
@ -726,7 +713,7 @@ void mps_fmt_destroy(mps_fmt_t mps_fmt)
Format format = (Format)mps_fmt;
Arena arena;
AVER(CHECKT(Format, format));
AVER(TESTT(Format, format));
arena = FormatArena(format);
ArenaEnter(arena);
@ -776,7 +763,7 @@ void mps_pool_destroy(mps_pool_t mps_pool)
Pool pool = (Pool)mps_pool;
Arena arena;
AVER(CHECKT(Pool, pool));
AVER(TESTT(Pool, pool));
arena = PoolArena(pool);
ArenaEnter(arena);
@ -794,7 +781,7 @@ mps_res_t mps_alloc(mps_addr_t *p_o, mps_pool_t mps_pool, size_t size, ...)
Addr p;
Res res;
AVER(CHECKT(Pool, pool));
AVER(TESTT(Pool, pool));
arena = PoolArena(pool);
ArenaEnter(arena);
@ -836,7 +823,7 @@ void mps_free(mps_pool_t mps_pool, mps_addr_t p, size_t size)
Pool pool = (Pool)mps_pool;
Arena arena;
AVER(CHECKT(Pool, pool));
AVER(TESTT(Pool, pool));
arena = PoolArena(pool);
ArenaEnter(arena);
@ -864,7 +851,7 @@ mps_res_t mps_ap_create(mps_ap_t *mps_ap_o, mps_pool_t mps_pool, ...)
va_list args;
AVER(mps_ap_o != NULL);
AVER(CHECKT(Pool, pool));
AVER(TESTT(Pool, pool));
arena = PoolArena(pool);
ArenaEnter(arena);
@ -897,7 +884,7 @@ mps_res_t mps_ap_create_v(mps_ap_t *mps_ap_o, mps_pool_t mps_pool,
Res res;
AVER(mps_ap_o != NULL);
AVER(CHECKT(Pool, pool));
AVER(TESTT(Pool, pool));
arena = PoolArena(pool);
ArenaEnter(arena);
@ -921,7 +908,7 @@ void mps_ap_destroy(mps_ap_t mps_ap)
Arena arena;
AVER(mps_ap != NULL);
AVER(CHECKT(Buffer, buf));
AVER(TESTT(Buffer, buf));
arena = BufferArena(buf);
ArenaEnter(arena);
@ -945,7 +932,7 @@ mps_res_t (mps_reserve)(mps_addr_t *p_o, mps_ap_t mps_ap, size_t size)
AVER(p_o != NULL);
AVER(mps_ap != NULL);
AVER(CHECKT(Buffer, BufferOfAP((AP)mps_ap)));
AVER(TESTT(Buffer, BufferOfAP((AP)mps_ap)));
AVER(mps_ap->init == mps_ap->alloc);
AVER(size > 0);
@ -964,7 +951,7 @@ mps_res_t mps_reserve_with_reservoir_permit(mps_addr_t *p_o,
AVER(p_o != NULL);
AVER(size > 0);
AVER(mps_ap != NULL);
AVER(CHECKT(Buffer, BufferOfAP((AP)mps_ap)));
AVER(TESTT(Buffer, BufferOfAP((AP)mps_ap)));
AVER(mps_ap->init == mps_ap->alloc);
MPS_RESERVE_WITH_RESERVOIR_PERMIT_BLOCK(res, *p_o, mps_ap, size);
@ -985,7 +972,7 @@ mps_res_t mps_reserve_with_reservoir_permit(mps_addr_t *p_o,
mps_bool_t (mps_commit)(mps_ap_t mps_ap, mps_addr_t p, size_t size)
{
AVER(mps_ap != NULL);
AVER(CHECKT(Buffer, BufferOfAP((AP)mps_ap)));
AVER(TESTT(Buffer, BufferOfAP((AP)mps_ap)));
AVER(p != NULL);
AVER(size > 0);
AVER(p == mps_ap->init);
@ -1027,7 +1014,7 @@ mps_res_t (mps_ap_frame_push)(mps_frame_t *frame_o, mps_ap_t mps_ap)
AllocFrame frame;
Res res;
AVER(CHECKT(Buffer, buf));
AVER(TESTT(Buffer, buf));
arena = BufferArena(buf);
ArenaEnter(arena);
@ -1070,7 +1057,7 @@ mps_res_t (mps_ap_frame_pop)(mps_ap_t mps_ap, mps_frame_t frame)
Arena arena;
Res res;
AVER(CHECKT(Buffer, buf));
AVER(TESTT(Buffer, buf));
arena = BufferArena(buf);
ArenaEnter(arena);
@ -1097,7 +1084,7 @@ mps_res_t mps_ap_fill(mps_addr_t *p_o, mps_ap_t mps_ap, size_t size)
Res res;
AVER(mps_ap != NULL);
AVER(CHECKT(Buffer, buf));
AVER(TESTT(Buffer, buf));
arena = BufferArena(buf);
ArenaEnter(arena);
@ -1128,7 +1115,7 @@ mps_res_t mps_ap_fill_with_reservoir_permit(mps_addr_t *p_o, mps_ap_t mps_ap,
Res res;
AVER(mps_ap != NULL);
AVER(CHECKT(Buffer, buf));
AVER(TESTT(Buffer, buf));
arena = BufferArena(buf);
ArenaEnter(arena);
@ -1162,7 +1149,7 @@ mps_bool_t mps_ap_trip(mps_ap_t mps_ap, mps_addr_t p, size_t size)
Bool b;
AVER(mps_ap != NULL);
AVER(CHECKT(Buffer, buf));
AVER(TESTT(Buffer, buf));
arena = BufferArena(buf);
ArenaEnter(arena);
@ -1191,7 +1178,7 @@ mps_res_t mps_sac_create(mps_sac_t *mps_sac_o, mps_pool_t mps_pool,
Res res;
AVER(mps_sac_o != NULL);
AVER(CHECKT(Pool, pool));
AVER(TESTT(Pool, pool));
arena = PoolArena(pool);
ArenaEnter(arena);
@ -1214,7 +1201,7 @@ void mps_sac_destroy(mps_sac_t mps_sac)
SAC sac = SACOfExternalSAC((ExternalSAC)mps_sac);
Arena arena;
AVER(CHECKT(SAC, sac));
AVER(TESTT(SAC, sac));
arena = SACArena(sac);
ArenaEnter(arena);
@ -1232,7 +1219,7 @@ void mps_sac_flush(mps_sac_t mps_sac)
SAC sac = SACOfExternalSAC((ExternalSAC)mps_sac);
Arena arena;
AVER(CHECKT(SAC, sac));
AVER(TESTT(SAC, sac));
arena = SACArena(sac);
ArenaEnter(arena);
@ -1250,11 +1237,11 @@ mps_res_t mps_sac_fill(mps_addr_t *p_o, mps_sac_t mps_sac, size_t size,
{
SAC sac = SACOfExternalSAC((ExternalSAC)mps_sac);
Arena arena;
Addr p;
Addr p = NULL; /* suppress "may be used uninitialized" */
Res res;
AVER(p_o != NULL);
AVER(CHECKT(SAC, sac));
AVER(TESTT(SAC, sac));
arena = SACArena(sac);
ArenaEnter(arena);
@ -1276,7 +1263,7 @@ void mps_sac_empty(mps_sac_t mps_sac, mps_addr_t p, size_t size)
SAC sac = SACOfExternalSAC((ExternalSAC)mps_sac);
Arena arena;
AVER(CHECKT(SAC, sac));
AVER(TESTT(SAC, sac));
arena = SACArena(sac);
ArenaEnter(arena);
@ -1295,7 +1282,7 @@ mps_res_t mps_sac_alloc(mps_addr_t *p_o, mps_sac_t mps_sac, size_t size,
Res res;
AVER(p_o != NULL);
AVER(CHECKT(SAC, SACOfExternalSAC((ExternalSAC)mps_sac)));
AVER(TESTT(SAC, SACOfExternalSAC((ExternalSAC)mps_sac)));
AVER(size > 0);
MPS_SAC_ALLOC_FAST(res, *p_o, mps_sac, size, (has_reservoir_permit != 0));
@ -1307,7 +1294,7 @@ mps_res_t mps_sac_alloc(mps_addr_t *p_o, mps_sac_t mps_sac, size_t size,
void mps_sac_free(mps_sac_t mps_sac, mps_addr_t p, size_t size)
{
AVER(CHECKT(SAC, SACOfExternalSAC((ExternalSAC)mps_sac)));
AVER(TESTT(SAC, SACOfExternalSAC((ExternalSAC)mps_sac)));
/* Can't check p outside arena lock */
AVER(size > 0);
@ -1940,7 +1927,7 @@ mps_res_t mps_ap_alloc_pattern_begin(mps_ap_t mps_ap,
AVER(mps_ap != NULL);
buf = BufferOfAP((AP)mps_ap);
AVER(CHECKT(Buffer, buf));
AVER(TESTT(Buffer, buf));
arena = BufferArena(buf);
ArenaEnter(arena);
@ -1961,7 +1948,7 @@ mps_res_t mps_ap_alloc_pattern_end(mps_ap_t mps_ap,
AVER(mps_ap != NULL);
buf = BufferOfAP((AP)mps_ap);
AVER(CHECKT(Buffer, buf));
AVER(TESTT(Buffer, buf));
UNUSED(alloc_pattern); /* .ramp.hack */
arena = BufferArena(buf);
@ -1982,7 +1969,7 @@ mps_res_t mps_ap_alloc_pattern_reset(mps_ap_t mps_ap)
AVER(mps_ap != NULL);
buf = BufferOfAP((AP)mps_ap);
AVER(CHECKT(Buffer, buf));
AVER(TESTT(Buffer, buf));
arena = BufferArena(buf);
ArenaEnter(arena);
@ -2074,7 +2061,7 @@ void mps_chain_destroy(mps_chain_t mps_chain)
Arena arena;
Chain chain = (Chain)mps_chain;
AVER(CHECKT(Chain, chain));
AVER(TESTT(Chain, chain));
arena = chain->arena;
ArenaEnter(arena);

View file

@ -1,343 +0,0 @@
/* mpslibcb.c: RAVENBROOK MEMORY POOL SYSTEM LIBRARY INTERFACE (CALLBACK)
*
* $Header$
* Copyright (c) 2005 Ravenbrook Limited. See end of file for license.
*
* .purpose: The purpose of this code is
* 1. permit the MPS Library Interface to be used conveniently when
* the MPS is packaged as a dynamic library (and in particular a
* Windows DLL).
*
* .readership: For MPS client application developers and MPS developers.
* .sources: <design/lib/>
*
* .freestanding: This is designed to be deployed in a freestanding
* environment, so we can't use strcmp from <string.h>, so we have to
* roll our own (in fact we only ever need equality so we define a
* simpler interface).
*
* .mpm.not: This module occupies a halfway house between the MPM and
* the client. Let's make it clearer: this module should not use any
* services of the MPM. That is, it should be written as if the client
* could have, in principle, written it. .mpm.not.why: Perhaps the most
* compelling reason is that if config.h is included (via mpm.h) then
* the compile breaks on platform.w3i3mv because of "#define
* mps_lib_memset memset" in config.h.
*/
#include "mpslibcb.h"
#include "mpslib.h"
#include "mps.h"
/* Forward declarations. */
int mps_lib_callback_default_get_EOF(void);
mps_lib_FILE *mps_lib_callback_default_get_stderr(void);
mps_lib_FILE *mps_lib_callback_default_get_stdout(void);
int mps_lib_callback_default_fputc(int c_, mps_lib_FILE *f_);
int mps_lib_callback_default_fputs(const char *s_, mps_lib_FILE *f_);
void *mps_lib_callback_default_memset(void *p_, int c_, size_t n_);
void *mps_lib_callback_default_memcpy(void *p_, const void *q_, size_t n_);
int mps_lib_callback_default_memcmp(const void *p_, const void *q_, size_t n_);
mps_clock_t mps_lib_callback_default_clock(void);
mps_clock_t mps_lib_callback_default_clocks_per_sec(void);
unsigned long mps_lib_callback_default_telemetry_control(void);
int mps_lib_callback_streq(const char *, const char *);
/* Macros */
/* See .freestanding */
#define EQ(p, q) (mps_lib_callback_streq((p), (q)))
/* We use this to call mps_lib_asssert_fail (which we only ever do
* unconditionally). See .mpm.not on why we cannot use ASSERT from
* mpm.h */
#define AFAIL mps_lib_assert_fail
/* Replaced UNUSED from mpm.h, see .mpm.not */
#define UNUSED(x) ((void)(x))
/* Structures and Types */
struct mps_lib_callback_s
{
int (*lib_get_EOF)(void);
mps_lib_FILE * (*lib_get_stderr)(void);
mps_lib_FILE * (*lib_get_stdout)(void);
int (*lib_fputc)(int, mps_lib_FILE *);
int (*lib_fputs)(const char *, mps_lib_FILE *);
void (*lib_assert_fail)(const char *);
void * (*lib_memset)(void *, int, size_t);
void * (*lib_memcpy)(void *, const void *, size_t);
int (*lib_memcmp)(const void *, const void *, size_t);
mps_clock_t (*clock)(void);
mps_clock_t (*clocks_per_sec)(void);
unsigned long (*lib_telemetry_control)(void);
};
/* Globals */
/* .global.why: A global is necessary so that we can store the function
* pointers that the client gives us. The functions in the mpslib.h
* interface _are_ global. There is no scope for having one memset
* function for one Arena and a different memset function for another.
* */
/* The default functions are stubs that assert. Except for the
* assert_fail function (which is called when assertions fail) which
* will be NULL. This means: if you provide assert_fail and forget
* something else, you'll know about it. If you do not provide
* assert_fail then it will probably stop anyway.
*
* These functions really do need to fail, so they subvert the checking
* mechanism (which is in mpm.h and not available to us, see .mpm.not)
*/
struct mps_lib_callback_s mps_lib_callback_global = {
mps_lib_callback_default_get_EOF,
mps_lib_callback_default_get_stderr,
mps_lib_callback_default_get_stdout,
mps_lib_callback_default_fputc,
mps_lib_callback_default_fputs,
NULL, /* assert_fail */
mps_lib_callback_default_memset,
mps_lib_callback_default_memcpy,
mps_lib_callback_default_memcmp,
mps_lib_callback_default_clock,
mps_lib_callback_default_clocks_per_sec,
mps_lib_callback_default_telemetry_control
};
/* Functions */
int mps_lib_callback_register(const char *name, mps_lib_function_t f)
{
if(NULL == name) {
return MPS_RES_FAIL;
}
if(EQ(name, "mps_lib_get_EOF")) {
mps_lib_callback_global.lib_get_EOF = (int(*)(void))f;
} else if(EQ(name, "mps_lib_get_stderr")) {
mps_lib_callback_global.lib_get_stderr = (mps_lib_FILE *(*)(void))f;
} else if(EQ(name, "mps_lib_get_stdout")) {
mps_lib_callback_global.lib_get_stdout = (mps_lib_FILE *(*)(void))f;
} else if(EQ(name, "mps_lib_fputc")) {
mps_lib_callback_global.lib_fputc = (int(*)(int, mps_lib_FILE *))f;
} else if(EQ(name, "mps_lib_fputs")) {
mps_lib_callback_global.lib_fputs =
(int(*)(const char *, mps_lib_FILE *))f;
} else if(EQ(name, "mps_lib_assert_fail")) {
mps_lib_callback_global.lib_assert_fail = (void(*)(const char *))f;
} else if(EQ(name, "mps_lib_memset")) {
mps_lib_callback_global.lib_memset = (void *(*)(void *, int, size_t))f;
} else if(EQ(name, "mps_lib_memcpy")) {
mps_lib_callback_global.lib_memcpy =
(void *(*)(void *, const void *, size_t))f;
} else if(EQ(name, "mps_lib_memcmp")) {
mps_lib_callback_global.lib_memcmp =
(int(*)(const void *, const void *, size_t))f;
} else if(EQ(name, "mps_clock")) {
mps_lib_callback_global.clock = (mps_clock_t(*)(void))f;
} else if(EQ(name, "mps_clocks_per_sec")) {
mps_lib_callback_global.clocks_per_sec = (mps_clock_t(*)(void))f;
} else if(EQ(name, "mps_lib_telemetry_control")) {
mps_lib_callback_global.lib_telemetry_control =
(unsigned long(*)(void))f;
} else {
return MPS_RES_UNIMPL;
}
return MPS_RES_OK;
}
/* Return non-zero if and only if string p equals string q. */
int mps_lib_callback_streq(const char *p, const char *q)
{
do {
if(*p == '\0' && *q == '\0') {
return 1;
}
} while(*p++ == *q++);
return 0;
}
int mps_lib_callback_default_get_EOF(void)
{
AFAIL("mps_lib_get_EOF needs to be provided");
return 0;
}
mps_lib_FILE *mps_lib_callback_default_get_stderr(void)
{
AFAIL("mps_lib_get_stderr needs to be provided");
return NULL;
}
mps_lib_FILE *mps_lib_callback_default_get_stdout(void)
{
AFAIL("mps_lib_get_stdout needs to be provided");
return NULL;
}
int mps_lib_callback_default_fputc(int c_, mps_lib_FILE *f_)
{
UNUSED(c_);
UNUSED(f_);
AFAIL("mps_lib_fputc needs to be provided");
return 0;
}
int mps_lib_callback_default_fputs(const char *s_, mps_lib_FILE *f_)
{
UNUSED(s_);
UNUSED(f_);
AFAIL("mps_lib_fputs needs to be provided");
return 0;
}
/* No default implementation for mps_lib_assert_fail */
void *mps_lib_callback_default_memset(void *p_, int c_, size_t n_)
{
UNUSED(p_);
UNUSED(c_);
UNUSED(n_);
AFAIL("mps_lib_memset needs to be provided");
return NULL;
}
void *mps_lib_callback_default_memcpy(void *p_, const void *q_, size_t n_)
{
UNUSED(p_);
UNUSED(q_);
UNUSED(n_);
AFAIL("mps_lib_memcpy needs to be provided");
return NULL;
}
int mps_lib_callback_default_memcmp(const void *p_, const void *q_, size_t n_)
{
UNUSED(p_);
UNUSED(q_);
UNUSED(n_);
AFAIL("mps_lib_memcmp needs to be provided");
return 0;
}
mps_clock_t mps_lib_callback_default_clock(void)
{
AFAIL("mps_clock needs to be provided");
return 0;
}
mps_clock_t mps_lib_callback_default_clocks_per_sec(void)
{
AFAIL("mps_clocks_per_sec needs to be provided");
return 0;
}
unsigned long mps_lib_callback_default_telemetry_control(void)
{
AFAIL("mps_lib_telemetry_control needs to be provided");
return 0;
}
int mps_lib_get_EOF(void)
{
return mps_lib_callback_global.lib_get_EOF();
}
mps_lib_FILE *mps_lib_get_stderr(void)
{
return mps_lib_callback_global.lib_get_stderr();
}
mps_lib_FILE *mps_lib_get_stdout(void)
{
return mps_lib_callback_global.lib_get_stdout();
}
int mps_lib_fputc(int c, mps_lib_FILE *f)
{
return mps_lib_callback_global.lib_fputc(c, f);
}
int mps_lib_fputs(const char *s, mps_lib_FILE *f)
{
return mps_lib_callback_global.lib_fputs(s, f);
}
void mps_lib_assert_fail(const char *m)
{
mps_lib_callback_global.lib_assert_fail(m);
}
void *(mps_lib_memset)(void *p, int c, size_t n)
{
return mps_lib_callback_global.lib_memset(p, c, n);
}
void *(mps_lib_memcpy)(void *p, const void *q, size_t n)
{
return mps_lib_callback_global.lib_memcpy(p, q, n);
}
int (mps_lib_memcmp)(const void *p, const void *q, size_t n)
{
return mps_lib_callback_global.lib_memcmp(p, q, n);
}
mps_clock_t mps_clock(void)
{
return mps_lib_callback_global.clock();
}
mps_clock_t mps_clocks_per_sec(void)
{
return mps_lib_callback_global.clocks_per_sec();
}
unsigned long mps_lib_telemetry_control(void)
{
return mps_lib_callback_global.lib_telemetry_control();
}
/* C. COPYRIGHT AND LICENSE
*
* Copyright (C) 2005 Ravenbrook Limited <http://www.ravenbrook.com/>.
* All rights reserved. This is an open source license. Contact
* Ravenbrook for commercial licensing options.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Redistributions in any form must be accompanied by information on how
* to obtain complete source code for this software and any accompanying
* software that uses this software. The source code must either be
* included in the distribution or be available for no more than the cost
* of distribution plus a nominal fee, and must be freely redistributable
* under reasonable conditions. For an executable file, complete source
* code means the source code for all modules it contains. It does not
* include source code for modules or files that typically accompany the
* major components of the operating system on which the executable file
* runs.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

View file

@ -1,58 +0,0 @@
/* mpslibcb.h: RAVENBROOK MEMORY POOL SYSTEM LIBRARY CALLBACK INTERFACE
*
* $Header$
* Copyright (c) 2005 Ravenbrook Limited. See end of file for license.
*
* .readership: MPS client application developers, MPS developers.
*
*/
#ifndef mpslibcb_h
#define mpslibcb_h
typedef void (*mps_lib_function_t)(void);
int mps_lib_callback_register(const char *, mps_lib_function_t);
#endif /* mpslibcb_h */
/* C. COPYRIGHT AND LICENSE
*
* Copyright (C) 2005 Ravenbrook Limited <http://www.ravenbrook.com/>.
* All rights reserved. This is an open source license. Contact
* Ravenbrook for commercial licensing options.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Redistributions in any form must be accompanied by information on how
* to obtain complete source code for this software and any accompanying
* software that uses this software. The source code must either be
* included in the distribution or be available for no more than the cost
* of distribution plus a nominal fee, and must be freely redistributable
* under reasonable conditions. For an executable file, complete source
* code means the source code for all modules it contains. It does not
* include source code for modules or files that typically accompany the
* major components of the operating system on which the executable file
* runs.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

View file

@ -127,6 +127,7 @@
#define MPS_WORD_SHIFT 5
#define MPS_PF_ALIGN 4 /* I'm just guessing. */
/* Apple clang version 3.1, clang -E -dM */
#elif defined(__APPLE__) && defined(__i386__) && defined(__MACH__) \
@ -145,6 +146,7 @@
#define MPS_WORD_SHIFT 5
#define MPS_PF_ALIGN 4 /* I'm just guessing. */
/* Apple clang version 3.1, clang -E -dM */
#elif defined(__APPLE__) && defined(__x86_64__) && defined(__MACH__) \
@ -163,6 +165,7 @@
#define MPS_WORD_SHIFT 6
#define MPS_PF_ALIGN 8
/* GCC 2.6.3, gcc -E -dM
* The actual granularity of GNU malloc is 8, but field alignments are
* all 4.
@ -183,6 +186,13 @@
#define MPS_WORD_SHIFT 5
#define MPS_PF_ALIGN 4
#ifndef _REENTRANT /* it's also defined by cc -pthread */
#define _REENTRANT /* defines, e.g., pthread_mutexattr_settype */
#endif
#define _XOPEN_SOURCE 500 /* to get POSIX signal handling */
#define _GNU_SOURCE /* to get register numbers for prmci3li.c */
/* GCC 4.6.3, gcc -E -dM */
#elif defined(__linux__) && defined(__x86_64) && defined(__GNUC__)
@ -200,22 +210,12 @@
#define MPS_WORD_SHIFT 6
#define MPS_PF_ALIGN 8
/* GCC 2.7.2, gcc -E -dM */
#elif defined(__linux__) && defined(__PPC__) && defined(__GNUC__)
#if defined(CONFIG_PF_STRING) && ! defined(CONFIG_PF_LIPPGC)
#error "specified CONFIG_PF_... inconsistent with detected lippgc"
#ifndef _REENTRANT /* it's also defined by cc -pthread */
#define _REENTRANT /* defines, e.g., pthread_mutexattr_settype */
#endif
#define MPS_PF_LIPPGC
#define MPS_PF_STRING "lippgc"
#define MPS_OS_LI
#define MPS_ARCH_PP
#define MPS_BUILD_GC
#define MPS_T_WORD unsigned long
#define MPS_T_ULONGEST unsigned long
#define MPS_WORD_WIDTH 32
#define MPS_WORD_SHIFT 5
#define MPS_PF_ALIGN 8 /* @@@@ not tested */
#define _XOPEN_SOURCE 500 /* to get POSIX signal handling */
#define _GNU_SOURCE /* to get register numbers for prmci3li.c */
/* GCC 2.95.3, gcc -E -dM */
@ -234,6 +234,7 @@
#define MPS_WORD_SHIFT 5
#define MPS_PF_ALIGN 4
#elif defined(__FreeBSD__) && defined (__x86_64__) && defined (__GNUC__)
#if defined(CONFIG_PF_STRING) && ! defined(CONFIG_PF_FRI6GC)
#error "specified CONFIG_PF_... inconsistent with detected fri6gc"
@ -249,6 +250,7 @@
#define MPS_WORD_SHIFT 6
#define MPS_PF_ALIGN 8
#else
#error "Unable to detect target platform"
#endif

View file

@ -515,7 +515,7 @@ Res PoolDescribe(Pool pool, mps_lib_FILE *stream)
Res res;
Ring node, nextNode;
if (!CHECKT(Pool, pool)) return ResFAIL;
if (!TESTT(Pool, pool)) return ResFAIL;
if (stream == NULL) return ResFAIL;
res = WriteF(stream,

View file

@ -258,12 +258,12 @@ static Res AMCSegDescribe(Seg seg, mps_lib_FILE *stream)
Size row;
char abzSketch[5];
if(!CHECKT(Seg, seg))
if(!TESTT(Seg, seg))
return ResFAIL;
if(stream == NULL)
return ResFAIL;
amcseg = Seg2amcSeg(seg);
if(!CHECKT(amcSeg, amcseg))
if(!TESTT(amcSeg, amcseg))
return ResFAIL;
/* Describe the superclass fields first via next-method call */
@ -745,7 +745,7 @@ static Res amcGenDescribe(amcGen gen, mps_lib_FILE *stream)
{
Res res;
if(!CHECKT(amcGen, gen))
if(!TESTT(amcGen, gen))
return ResFAIL;
res = WriteF(stream,
@ -2330,10 +2330,10 @@ static Res AMCDescribe(Pool pool, mps_lib_FILE *stream)
Ring node, nextNode;
char *rampmode;
if(!CHECKT(Pool, pool))
if(!TESTT(Pool, pool))
return ResFAIL;
amc = Pool2AMC(pool);
if(!CHECKT(AMC, amc))
if(!TESTT(AMC, amc))
return ResFAIL;
if(stream == NULL)
return ResFAIL;
@ -2485,7 +2485,7 @@ void mps_amc_apply(mps_pool_t mps_pool,
mps_amc_apply_closure_s closure_s;
Arena arena;
AVER(CHECKT(Pool, pool));
AVER(TESTT(Pool, pool));
arena = PoolArena(pool);
ArenaEnter(arena);
AVERT(Pool, pool);

View file

@ -524,10 +524,10 @@ static Res AMSSegDescribe(Seg seg, mps_lib_FILE *stream)
Buffer buffer; /* the segment's buffer, if it has one */
Index i;
if (!CHECKT(Seg, seg)) return ResFAIL;
if (!TESTT(Seg, seg)) return ResFAIL;
if (stream == NULL) return ResFAIL;
amsseg = Seg2AMSSeg(seg);
if (!CHECKT(AMSSeg, amsseg)) return ResFAIL;
if (!TESTT(AMSSeg, amsseg)) return ResFAIL;
/* Describe the superclass fields first via next-method call */
super = SEG_SUPERCLASS(AMSSegClass);
@ -885,7 +885,7 @@ static Res AMSBufferFill(Addr *baseReturn, Addr *limitReturn,
AMS ams;
Seg seg;
Ring node, ring, nextNode; /* for iterating over the segments */
Index base, limit;
Index base = 0, limit = 0; /* suppress "may be used uninitialized" */
Addr baseAddr, limitAddr;
RankSet rankSet;
Bool b; /* the return value of amsSegAlloc */
@ -1366,7 +1366,7 @@ static Res AMSFix(Pool pool, ScanState ss, Seg seg, Ref *refIO)
Format format;
AVERT_CRITICAL(Pool, pool);
AVER_CRITICAL(CHECKT(AMS, Pool2AMS(pool)));
AVER_CRITICAL(TESTT(AMS, Pool2AMS(pool)));
AVERT_CRITICAL(ScanState, ss);
AVERT_CRITICAL(Seg, seg);
AVER_CRITICAL(refIO != NULL);
@ -1591,9 +1591,9 @@ static Res AMSDescribe(Pool pool, mps_lib_FILE *stream)
Ring node, nextNode;
Res res;
if (!CHECKT(Pool, pool)) return ResFAIL;
if (!TESTT(Pool, pool)) return ResFAIL;
ams = Pool2AMS(pool);
if (!CHECKT(AMS, ams)) return ResFAIL;
if (!TESTT(AMS, ams)) return ResFAIL;
if (stream == NULL) return ResFAIL;
res = WriteF(stream,

View file

@ -332,7 +332,7 @@ static Count MRGGuardiansPerSeg(MRG mrg)
static RefPart MRGRefPartOfLink(Link link, Arena arena)
{
Seg seg;
Seg seg = NULL; /* suppress "may be used uninitialized" */
Bool b;
Link linkBase;
Index index;
@ -407,7 +407,7 @@ static void MRGGuardianInit(MRG mrg, Link link, RefPart refPart)
static void MRGMessageDelete(Message message)
{
Pool pool;
Pool pool = NULL; /* suppress "may be used uninitialized" */
Arena arena;
Link link;
Bool b;
@ -792,9 +792,9 @@ static Res MRGDescribe(Pool pool, mps_lib_FILE *stream)
RefPart refPart;
Res res;
if (!CHECKT(Pool, pool)) return ResFAIL;
if (!TESTT(Pool, pool)) return ResFAIL;
mrg = Pool2MRG(pool);
if (!CHECKT(MRG, mrg)) return ResFAIL;
if (!TESTT(MRG, mrg)) return ResFAIL;
if (stream == NULL) return ResFAIL;
arena = PoolArena(pool);

View file

@ -574,7 +574,7 @@ static void MVFree(Pool pool, Addr old, Size size)
MV mv;
Res res;
Bool b;
Tract tract;
Tract tract = NULL; /* suppress "may be used uninitialized" */
AVERT(Pool, pool);
mv = Pool2MV(pool);
@ -646,9 +646,9 @@ static Res MVDescribe(Pool pool, mps_lib_FILE *stream)
char c;
Ring spans, node = NULL, nextNode; /* gcc whinge stop */
if(!CHECKT(Pool, pool)) return ResFAIL;
if(!TESTT(Pool, pool)) return ResFAIL;
mv = Pool2MV(pool);
if(!CHECKT(MV, mv)) return ResFAIL;
if(!TESTT(MV, mv)) return ResFAIL;
if(stream == NULL) return ResFAIL;
res = WriteF(stream,

View file

@ -685,9 +685,9 @@ static Res MVTDescribe(Pool pool, mps_lib_FILE *stream)
Res res;
MVT mvt;
if (!CHECKT(Pool, pool)) return ResFAIL;
if (!TESTT(Pool, pool)) return ResFAIL;
mvt = Pool2MVT(pool);
if (!CHECKT(MVT, mvt)) return ResFAIL;
if (!TESTT(MVT, mvt)) return ResFAIL;
if (stream == NULL) return ResFAIL;
res = WriteF(stream,

View file

@ -112,7 +112,7 @@ static void MVFFAddToFreeList(Addr *baseIO, Addr *limitIO, MVFF mvff) {
*/
static void MVFFFreeSegs(MVFF mvff, Addr base, Addr limit)
{
Seg seg;
Seg seg = NULL; /* suppress "may be used uninitialized" */
Arena arena;
Bool b;
Addr segLimit; /* limit of the current segment when iterating */
@ -537,9 +537,9 @@ static Res MVFFDescribe(Pool pool, mps_lib_FILE *stream)
Res res;
MVFF mvff;
if (!CHECKT(Pool, pool)) return ResFAIL;
if (!TESTT(Pool, pool)) return ResFAIL;
mvff = Pool2MVFF(pool);
if (!CHECKT(MVFF, mvff)) return ResFAIL;
if (!TESTT(MVFF, mvff)) return ResFAIL;
if (stream == NULL) return ResFAIL;
res = WriteF(stream,

View file

@ -590,7 +590,7 @@ static void SNCFramePopPending(Pool pool, Buffer buf, AllocFrame frame)
} else {
Arena arena;
Seg seg;
Seg seg = NULL; /* suppress "may be used uninitialized" */
Bool foundSeg;
arena = PoolArena(pool);

View file

@ -39,11 +39,6 @@
* is permitted when PROT_NONE alone is used.
*/
/* open sesame magic, see standards(5) */
#define _POSIX_C_SOURCE 199309L
#define _XOPEN_SOURCE_EXTENDED 1
#include "mpm.h"
#if !defined(MPS_OS_LI) && !defined(MPS_OS_FR) && !defined(MPS_OS_XC)

View file

@ -380,7 +380,7 @@ void RootDestroy(Root root)
Arena RootArena(Root root)
{
AVER(CHECKT(Root, root));
AVER(TESTT(Root, root));
return root->arena;
}
@ -584,7 +584,7 @@ Res RootDescribe(Root root, mps_lib_FILE *stream)
{
Res res;
if (!CHECKT(Root, root)) return ResFAIL;
if (!TESTT(Root, root)) return ResFAIL;
if (stream == NULL) return ResFAIL;
res = WriteF(stream,

View file

@ -353,7 +353,7 @@ Res SegDescribe(Seg seg, mps_lib_FILE *stream)
Res res;
Pool pool;
if (!CHECKT(Seg, seg)) return ResFAIL;
if (!TESTT(Seg, seg)) return ResFAIL;
if (stream == NULL) return ResFAIL;
pool = SegPool(seg);
@ -964,7 +964,7 @@ static Res segTrivDescribe(Seg seg, mps_lib_FILE *stream)
{
Res res;
if (!CHECKT(Seg, seg)) return ResFAIL;
if (!TESTT(Seg, seg)) return ResFAIL;
if (stream == NULL) return ResFAIL;
res = WriteF(stream,
@ -1550,10 +1550,10 @@ static Res gcSegDescribe(Seg seg, mps_lib_FILE *stream)
SegClass super;
GCSeg gcseg;
if (!CHECKT(Seg, seg)) return ResFAIL;
if (!TESTT(Seg, seg)) return ResFAIL;
if (stream == NULL) return ResFAIL;
gcseg = SegGCSeg(seg);
if (!CHECKT(GCSeg, gcseg)) return ResFAIL;
if (!TESTT(GCSeg, gcseg)) return ResFAIL;
/* Describe the superclass fields first via next-method call */
super = SEG_SUPERCLASS(GCSegClass);

View file

@ -103,8 +103,8 @@ Res VMCreate(VM *vmReturn, Size size)
AVER(vmReturn != NULL);
AVER(CHECKTYPE(LPVOID, Addr)); /* .assume.lpvoid-addr */
AVER(CHECKTYPE(SIZE_T, Size));
AVER(COMPATTYPE(LPVOID, Addr)); /* .assume.lpvoid-addr */
AVER(COMPATTYPE(SIZE_T, Size));
GetSystemInfo(&si);
align = (Align)si.dwPageSize;

View file

@ -5,9 +5,6 @@
PFM = w3i3mv
RAINBOWPATH = MSVISUAL\WIN32\I386
DONGLELIB = $(RAINBOWPATH)\spromeps.lib
# /Gs appears to be necessary to suppress stack checks. Stack checks
# (if not suppressed) generate a dependency on the C library, __chkesp,
# which causes the linker step to fail when building the DLL, mpsdy.dll.
@ -22,23 +19,15 @@ MPM = <ring> <mpm> <bt> <protocol> <boot> \
<shield> <vmw3> \
<thw3> <thw3i3> <ssw3mv> <mpsi> <mpsiw3> <ld> <spi3> \
<event> <seg> <sac> <poolmrg> <message> <dbgpool> <dbgpooli> \
<abq> <meter> <cbs> <poolmv2> <splay> <diag> <version>
SW = <ring> <mpm> <bt> <protocol> <boot> \
<arenavm> <arenacl> <locus> <arena> <global> <tract> <reserv> \
<pool> <poolabs> <poolmfs> <poolmv> \
<root> <format> <buffer> <walk> \
<ref> <trace> <traceanc> <protsw> <prmcan> \
<shield> <vmw3> \
<thw3> <thw3i3> <ssan> <mpsi> <ld> \
<event> <seg> <sac> <poolmrg> <message> <mpsioan> \
<poolams> <poolamsi> <dbgpool> <dbgpooli> \
<abq> <meter> <cbs> <poolmv2> <splay> <diag> <version> <poolmvff>
<abq> <meter> <cbs> <poolmv2> <splay> <diag>
PLINTH = <mpsliban> <mpsioan>
AMC = <poolamc>
AMS = <poolams> <poolamsi>
AWL = <poolawl>
LO = <poollo>
SNC = <poolsnc>
MVFF = <poolmvff>
N = <pooln>
DW = <fmtdy> <fmtno>
FMTTEST = <fmthe> <fmtdy> <fmtno> <fmtdytst>
POOLN = <pooln>
@ -57,237 +46,90 @@ TESTLIB = <testlib>
# macro which expands to the flags that the variety should use when building
# libraries
!IF "$(VARIETY)" == "he"
CFLAGS=$(CFLAGSCOMMONPRE) $(CFHE) $(CFLAGSCOMMONPOST)
LINKFLAGS=$(LINKFLAGSCOMMON) $(LFHE)
LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSHE)
MPMOBJ0 = $(MPM:<=w3i3mv\he\)
MPMOBJ = $(MPMOBJ0:>=.obj)
PLINTHOBJ0 = $(PLINTH:<=w3i3mv\he\)
PLINTHOBJ = $(PLINTHOBJ0:>=.obj)
SWOBJ0 = $(SW:<=w3i3mv\he\)
SWOBJ = $(SWOBJ0:>=.obj)
AMSOBJ0 = $(AMS:<=w3i3mv\he\)
AMSOBJ = $(AMSOBJ0:>=.obj)
AMCOBJ0 = $(AMC:<=w3i3mv\he\)
AMCOBJ = $(AMCOBJ0:>=.obj)
AWLOBJ0 = $(AWL:<=w3i3mv\he\)
AWLOBJ = $(AWLOBJ0:>=.obj)
LOOBJ0 = $(LO:<=w3i3mv\he\)
LOOBJ = $(LOOBJ0:>=.obj)
SNCOBJ0 = $(SNC:<=w3i3mv\he\)
SNCOBJ = $(SNCOBJ0:>=.obj)
DWOBJ0 = $(DW:<=w3i3mv\he\)
DWOBJ = $(DWOBJ0:>=.obj)
FMTTESTOBJ0 = $(FMTTEST:<=w3i3mv\he\)
FMTTESTOBJ = $(FMTTESTOBJ0:>=.obj)
POOLNOBJ0 = $(POOLN:<=w3i3mv\he\)
POOLNOBJ = $(POOLNOBJ0:>=.obj)
TESTLIBOBJ0 = $(TESTLIB:<=w3i3mv\he\)
TESTLIBOBJ = $(TESTLIBOBJ0:>=.obj)
!ELSEIF "$(VARIETY)" == "ce"
CFLAGS=$(CFLAGSCOMMONPRE) $(CFCE) $(CFLAGSCOMMONPOST)
LINKFLAGS=$(LINKFLAGSCOMMON) $(LFCE)
LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSCE)
MPMOBJ0 = $(MPM:<=w3i3mv\ce\)
MPMOBJ = $(MPMOBJ0:>=.obj)
PLINTHOBJ0 = $(PLINTH:<=w3i3mv\ce\)
PLINTHOBJ = $(PLINTHOBJ0:>=.obj)
SWOBJ0 = $(SW:<=w3i3mv\ce\)
SWOBJ = $(SWOBJ0:>=.obj)
AMSOBJ0 = $(AMS:<=w3i3mv\ce\)
AMSOBJ = $(AMSOBJ0:>=.obj)
AMCOBJ0 = $(AMC:<=w3i3mv\ce\)
AMCOBJ = $(AMCOBJ0:>=.obj)
AWLOBJ0 = $(AWL:<=w3i3mv\ce\)
AWLOBJ = $(AWLOBJ0:>=.obj)
LOOBJ0 = $(LO:<=w3i3mv\ce\)
LOOBJ = $(LOOBJ0:>=.obj)
SNCOBJ0 = $(SNC:<=w3i3mv\ce\)
SNCOBJ = $(SNCOBJ0:>=.obj)
DWOBJ0 = $(DW:<=w3i3mv\ce\)
DWOBJ = $(DWOBJ0:>=.obj)
FMTTESTOBJ0 = $(FMTTEST:<=w3i3mv\ce\)
FMTTESTOBJ = $(FMTTESTOBJ0:>=.obj)
POOLNOBJ0 = $(POOLN:<=w3i3mv\ce\)
POOLNOBJ = $(POOLNOBJ0:>=.obj)
TESTLIBOBJ0 = $(TESTLIB:<=w3i3mv\ce\)
TESTLIBOBJ = $(TESTLIBOBJ0:>=.obj)
!ELSEIF "$(VARIETY)" == "hi"
CFLAGS=$(CFLAGSCOMMONPRE) $(CFHI) $(CFLAGSCOMMONPOST)
LINKFLAGS=$(LINKFLAGSCOMMON) $(LFHI)
LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSHI)
MPMOBJ0 = $(MPM:<=w3i3mv\hi\)
MPMOBJ = $(MPMOBJ0:>=.obj)
PLINTHOBJ0 = $(PLINTH:<=w3i3mv\hi\)
PLINTHOBJ = $(PLINTHOBJ0:>=.obj)
SWOBJ0 = $(SW:<=w3i3mv\hi\)
SWOBJ = $(SWOBJ0:>=.obj)
AMSOBJ0 = $(AMS:<=w3i3mv\hi\)
AMSOBJ = $(AMSOBJ0:>=.obj)
AMCOBJ0 = $(AMC:<=w3i3mv\hi\)
AMCOBJ = $(AMCOBJ0:>=.obj)
AWLOBJ0 = $(AWL:<=w3i3mv\hi\)
AWLOBJ = $(AWLOBJ0:>=.obj)
LOOBJ0 = $(LO:<=w3i3mv\hi\)
LOOBJ = $(LOOBJ0:>=.obj)
SNCOBJ0 = $(SNC:<=w3i3mv\hi\)
SNCOBJ = $(SNCOBJ0:>=.obj)
DWOBJ0 = $(DW:<=w3i3mv\hi\)
DWOBJ = $(DWOBJ0:>=.obj)
FMTTESTOBJ0 = $(FMTTEST:<=w3i3mv\hi\)
FMTTESTOBJ = $(FMTTESTOBJ0:>=.obj)
POOLNOBJ0 = $(POOLN:<=w3i3mv\hi\)
POOLNOBJ = $(POOLNOBJ0:>=.obj)
TESTLIBOBJ0 = $(TESTLIB:<=w3i3mv\hi\)
TESTLIBOBJ = $(TESTLIBOBJ0:>=.obj)
!IF "$(VARIETY)" == "hot"
CFLAGS=$(CFLAGSCOMMONPRE) $(CFHOT) $(CFLAGSCOMMONPOST)
LINKFLAGS=$(LINKFLAGSCOMMON) $(LFHOT)
LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSHOT)
MPMOBJ0 = $(MPM:<=w3i3mv\hot\)
PLINTHOBJ0 = $(PLINTH:<=w3i3mv\hot\)
AMSOBJ0 = $(AMS:<=w3i3mv\hot\)
AMCOBJ0 = $(AMC:<=w3i3mv\hot\)
AWLOBJ0 = $(AWL:<=w3i3mv\hot\)
LOOBJ0 = $(LO:<=w3i3mv\hot\)
SNCOBJ0 = $(SNC:<=w3i3mv\hot\)
MVFFOBJ0 = $(MVFF:<=w3i3mv\hot\)
DWOBJ0 = $(DW:<=w3i3mv\hot\)
FMTTESTOBJ0 = $(FMTTEST:<=w3i3mv\hot\)
POOLNOBJ0 = $(POOLN:<=w3i3mv\hot\)
TESTLIBOBJ0 = $(TESTLIB:<=w3i3mv\hot\)
!ELSEIF "$(VARIETY)" == "di"
CFLAGS=$(CFLAGSCOMMONPRE) $(CFDI) $(CFLAGSCOMMONPOST)
LINKFLAGS=$(LINKFLAGSCOMMON) $(LFDI)
LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSDI)
MPMOBJ0 = $(MPM:<=w3i3mv\di\)
MPMOBJ = $(MPMOBJ0:>=.obj)
PLINTHOBJ0 = $(PLINTH:<=w3i3mv\di\)
PLINTHOBJ = $(PLINTHOBJ0:>=.obj)
SWOBJ0 = $(SW:<=w3i3mv\di\)
SWOBJ = $(SWOBJ0:>=.obj)
AMSOBJ0 = $(AMS:<=w3i3mv\di\)
AMSOBJ = $(AMSOBJ0:>=.obj)
AMCOBJ0 = $(AMC:<=w3i3mv\di\)
AMCOBJ = $(AMCOBJ0:>=.obj)
AWLOBJ0 = $(AWL:<=w3i3mv\di\)
AWLOBJ = $(AWLOBJ0:>=.obj)
LOOBJ0 = $(LO:<=w3i3mv\di\)
LOOBJ = $(LOOBJ0:>=.obj)
SNCOBJ0 = $(SNC:<=w3i3mv\di\)
SNCOBJ = $(SNCOBJ0:>=.obj)
MVFFOBJ0 = $(MVFF:<=w3i3mv\di\)
DWOBJ0 = $(DW:<=w3i3mv\di\)
DWOBJ = $(DWOBJ0:>=.obj)
FMTTESTOBJ0 = $(FMTTEST:<=w3i3mv\di\)
FMTTESTOBJ = $(FMTTESTOBJ0:>=.obj)
POOLNOBJ0 = $(POOLN:<=w3i3mv\di\)
POOLNOBJ = $(POOLNOBJ0:>=.obj)
TESTLIBOBJ0 = $(TESTLIB:<=w3i3mv\di\)
TESTLIBOBJ = $(TESTLIBOBJ0:>=.obj)
!ELSEIF "$(VARIETY)" == "ci"
CFLAGS=$(CFLAGSCOMMONPRE) $(CFCI) $(CFLAGSCOMMONPOST)
LINKFLAGS=$(LINKFLAGSCOMMON) $(LFCI)
LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSCI)
MPMOBJ0 = $(MPM:<=w3i3mv\ci\)
MPMOBJ = $(MPMOBJ0:>=.obj)
PLINTHOBJ0 = $(PLINTH:<=w3i3mv\ci\)
PLINTHOBJ = $(PLINTHOBJ0:>=.obj)
SWOBJ0 = $(SW:<=w3i3mv\ci\)
SWOBJ = $(SWOBJ0:>=.obj)
AMSOBJ0 = $(AMS:<=w3i3mv\ci\)
AMSOBJ = $(AMSOBJ0:>=.obj)
AMCOBJ0 = $(AMC:<=w3i3mv\ci\)
AMCOBJ = $(AMCOBJ0:>=.obj)
AWLOBJ0 = $(AWL:<=w3i3mv\ci\)
AWLOBJ = $(AWLOBJ0:>=.obj)
LOOBJ0 = $(LO:<=w3i3mv\ci\)
LOOBJ = $(LOOBJ0:>=.obj)
SNCOBJ0 = $(SNC:<=w3i3mv\ci\)
SNCOBJ = $(SNCOBJ0:>=.obj)
DWOBJ0 = $(DW:<=w3i3mv\ci\)
DWOBJ = $(DWOBJ0:>=.obj)
FMTTESTOBJ0 = $(FMTTEST:<=w3i3mv\ci\)
FMTTESTOBJ = $(FMTTESTOBJ0:>=.obj)
POOLNOBJ0 = $(POOLN:<=w3i3mv\ci\)
POOLNOBJ = $(POOLNOBJ0:>=.obj)
TESTLIBOBJ0 = $(TESTLIB:<=w3i3mv\ci\)
TESTLIBOBJ = $(TESTLIBOBJ0:>=.obj)
!ELSEIF "$(VARIETY)" == "cool"
CFLAGS=$(CFLAGSCOMMONPRE) $(CFCOOL) $(CFLAGSCOMMONPOST)
LINKFLAGS=$(LINKFLAGSCOMMON) $(LFCOOL)
LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSCOOL)
MPMOBJ0 = $(MPM:<=w3i3mv\cool\)
PLINTHOBJ0 = $(PLINTH:<=w3i3mv\cool\)
AMSOBJ0 = $(AMS:<=w3i3mv\cool\)
AMCOBJ0 = $(AMC:<=w3i3mv\cool\)
AWLOBJ0 = $(AWL:<=w3i3mv\cool\)
LOOBJ0 = $(LO:<=w3i3mv\cool\)
SNCOBJ0 = $(SNC:<=w3i3mv\cool\)
MVFFOBJ0 = $(MVFF:<=w3i3mv\cool\)
DWOBJ0 = $(DW:<=w3i3mv\cool\)
FMTTESTOBJ0 = $(FMTTEST:<=w3i3mv\cool\)
POOLNOBJ0 = $(POOLN:<=w3i3mv\cool\)
TESTLIBOBJ0 = $(TESTLIB:<=w3i3mv\cool\)
!ELSEIF "$(VARIETY)" == "ti"
CFLAGS=$(CFLAGSCOMMONPRE) $(CFTI) $(CFLAGSCOMMONPOST)
LINKFLAGS=$(LINKFLAGSCOMMON) $(LFTI)
LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSTI)
MPMOBJ0 = $(MPM:<=w3i3mv\ti\)
MPMOBJ = $(MPMOBJ0:>=.obj)
PLINTHOBJ0 = $(PLINTH:<=w3i3mv\ti\)
PLINTHOBJ = $(PLINTHOBJ0:>=.obj)
SWOBJ0 = $(SW:<=w3i3mv\ti\)
SWOBJ = $(SWOBJ0:>=.obj)
AMSOBJ0 = $(AMS:<=w3i3mv\ti\)
AMSOBJ = $(AMSOBJ0:>=.obj)
AMCOBJ0 = $(AMC:<=w3i3mv\ti\)
AMCOBJ = $(AMCOBJ0:>=.obj)
AWLOBJ0 = $(AWL:<=w3i3mv\ti\)
AWLOBJ = $(AWLOBJ0:>=.obj)
LOOBJ0 = $(LO:<=w3i3mv\ti\)
LOOBJ = $(LOOBJ0:>=.obj)
SNCOBJ0 = $(SNC:<=w3i3mv\ti\)
SNCOBJ = $(SNCOBJ0:>=.obj)
MVFFOBJ0 = $(MVFF:<=w3i3mv\ti\)
DWOBJ0 = $(DW:<=w3i3mv\ti\)
DWOBJ = $(DWOBJ0:>=.obj)
FMTTESTOBJ0 = $(FMTTEST:<=w3i3mv\ti\)
FMTTESTOBJ = $(FMTTESTOBJ0:>=.obj)
POOLNOBJ0 = $(POOLN:<=w3i3mv\ti\)
POOLNOBJ = $(POOLNOBJ0:>=.obj)
TESTLIBOBJ0 = $(TESTLIB:<=w3i3mv\ti\)
TESTLIBOBJ = $(TESTLIBOBJ0:>=.obj)
!ELSEIF "$(VARIETY)" == "wi"
CFLAGS=$(CFLAGSCOMMONPRE) $(CFWI) $(CFLAGSCOMMONPOST)
LINKFLAGS=$(LINKFLAGSCOMMON) $(LFWI)
LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSWI)
MPMOBJ0 = $(MPM:<=w3i3mv\wi\)
MPMOBJ = $(MPMOBJ0:>=.obj)
PLINTHOBJ0 = $(PLINTH:<=w3i3mv\wi\)
PLINTHOBJ = $(PLINTHOBJ0:>=.obj)
SWOBJ0 = $(SW:<=w3i3mv\wi\)
SWOBJ = $(SWOBJ0:>=.obj)
AMSOBJ0 = $(AMS:<=w3i3mv\wi\)
AMSOBJ = $(AMSOBJ0:>=.obj)
AMCOBJ0 = $(AMC:<=w3i3mv\wi\)
AMCOBJ = $(AMCOBJ0:>=.obj)
AWLOBJ0 = $(AWL:<=w3i3mv\wi\)
AWLOBJ = $(AWLOBJ0:>=.obj)
LOOBJ0 = $(LO:<=w3i3mv\wi\)
LOOBJ = $(LOOBJ0:>=.obj)
SNCOBJ0 = $(SNC:<=w3i3mv\wi\)
SNCOBJ = $(SNCOBJ0:>=.obj)
DWOBJ0 = $(DW:<=w3i3mv\wi\)
DWOBJ = $(DWOBJ0:>=.obj)
FMTTESTOBJ0 = $(FMTTEST:<=w3i3mv\wi\)
FMTTESTOBJ = $(FMTTESTOBJ0:>=.obj)
POOLNOBJ0 = $(POOLN:<=w3i3mv\wi\)
POOLNOBJ = $(POOLNOBJ0:>=.obj)
TESTLIBOBJ0 = $(TESTLIB:<=w3i3mv\wi\)
TESTLIBOBJ = $(TESTLIBOBJ0:>=.obj)
!ELSEIF "$(VARIETY)" == "we"
CFLAGS=$(CFLAGSCOMMONPRE) $(CFWE) $(CFLAGSCOMMONPOST)
LINKFLAGS=$(LINKFLAGSCOMMON) $(LFWE)
LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSWE)
MPMOBJ0 = $(MPM:<=w3i3mv\we\)
MPMOBJ = $(MPMOBJ0:>=.obj)
PLINTHOBJ0 = $(PLINTH:<=w3i3mv\we\)
PLINTHOBJ = $(PLINTHOBJ0:>=.obj)
SWOBJ0 = $(SW:<=w3i3mv\we\)
SWOBJ = $(SWOBJ0:>=.obj)
AMSOBJ0 = $(AMS:<=w3i3mv\we\)
AMSOBJ = $(AMSOBJ0:>=.obj)
AMCOBJ0 = $(AMC:<=w3i3mv\we\)
AMCOBJ = $(AMCOBJ0:>=.obj)
AWLOBJ0 = $(AWL:<=w3i3mv\we\)
AWLOBJ = $(AWLOBJ0:>=.obj)
LOOBJ0 = $(LO:<=w3i3mv\we\)
LOOBJ = $(LOOBJ0:>=.obj)
SNCOBJ0 = $(SNC:<=w3i3mv\we\)
SNCOBJ = $(SNCOBJ0:>=.obj)
MVFFOBJ0 = $(MVFF:<=w3i3mv\we\)
DWOBJ0 = $(DW:<=w3i3mv\we\)
DWOBJ = $(DWOBJ0:>=.obj)
FMTTESTOBJ0 = $(FMTTEST:<=w3i3mv\we\)
FMTTESTOBJ = $(FMTTESTOBJ0:>=.obj)
POOLNOBJ0 = $(POOLN:<=w3i3mv\we\)
POOLNOBJ = $(POOLNOBJ0:>=.obj)
TESTLIBOBJ0 = $(TESTLIB:<=w3i3mv\we\)
TESTLIBOBJ = $(TESTLIBOBJ0:>=.obj)
#!ELSEIF "$(VARIETY)" == "cv"
#CFLAGS=$(CFLAGSCOMMON) $(CFCV)
@ -316,6 +158,19 @@ TESTLIBOBJ = $(TESTLIBOBJ0:>=.obj)
!ENDIF
MPMOBJ = $(MPMOBJ0:>=.obj)
PLINTHOBJ = $(PLINTHOBJ0:>=.obj)
AMSOBJ = $(AMSOBJ0:>=.obj)
AMCOBJ = $(AMCOBJ0:>=.obj)
AWLOBJ = $(AWLOBJ0:>=.obj)
LOOBJ = $(LOOBJ0:>=.obj)
SNCOBJ = $(SNCOBJ0:>=.obj)
MVFFOBJ = $(MVFFOBJ0:>=.obj)
DWOBJ = $(DWOBJ0:>=.obj)
FMTTESTOBJ = $(FMTTESTOBJ0:>=.obj)
POOLNOBJ = $(POOLNOBJ0:>=.obj)
TESTLIBOBJ = $(TESTLIBOBJ0:>=.obj)
!INCLUDE commpost.nmk

View file

@ -5,10 +5,6 @@
PFM = w3i6mv
# @@@@ Can we remove this? RB 2012-03-26
RAINBOWPATH = MSVISUAL\WIN32\I386
DONGLELIB = $(RAINBOWPATH)\spromeps.lib
# /Gs appears to be necessary to suppress stack checks. Stack checks
# (if not suppressed) generate a dependency on the C library, __chkesp,
# which causes the linker step to fail when building the DLL, mpsdy.dll.
@ -25,22 +21,13 @@ MPM = <ring> <mpm> <bt> <protocol> <boot> \
<thw3> <thw3i6> <ssw3mv> <mpsi> <mpsiw3> <ld> <span> \
<event> <seg> <sac> <poolmrg> <message> <dbgpool> <dbgpooli> \
<abq> <meter> <cbs> <poolmv2> <splay> <diag> <version>
SW = <ring> <mpm> <bt> <protocol> <boot> \
<arenavm> <arenacl> <locus> <arena> <global> <tract> <reserv> \
<pool> <poolabs> <poolmfs> <poolmv> \
<root> <format> <buffer> <walk> \
<ref> <trace> <traceanc> <protsw> <prmcan> \
<shield> <vmw3> \
<thw3> <thw3i6> <ssan> <mpsi> <ld> \
<event> <seg> <sac> <poolmrg> <message> <mpsioan> \
<poolams> <poolamsi> <dbgpool> <dbgpooli> \
<abq> <meter> <cbs> <poolmv2> <splay> <diag> <version> <poolmvff>
PLINTH = <mpsliban> <mpsioan>
AMC = <poolamc>
AMS = <poolams> <poolamsi>
AWL = <poolawl>
LO = <poollo>
SNC = <poolsnc>
MVFF = <poolmvff>
DW = <fmtdy> <fmtno>
FMTTEST = <fmthe> <fmtdy> <fmtno> <fmtdytst>
POOLN = <pooln>
@ -59,237 +46,90 @@ TESTLIB = <testlib>
# macro which expands to the flags that the variety should use when building
# libraries
!IF "$(VARIETY)" == "he"
CFLAGS=$(CFLAGSCOMMONPRE) $(CFHE) $(CFLAGSCOMMONPOST)
LINKFLAGS=$(LINKFLAGSCOMMON) $(LFHE)
LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSHE)
MPMOBJ0 = $(MPM:<=w3i6mv\he\)
MPMOBJ = $(MPMOBJ0:>=.obj)
PLINTHOBJ0 = $(PLINTH:<=w3i6mv\he\)
PLINTHOBJ = $(PLINTHOBJ0:>=.obj)
SWOBJ0 = $(SW:<=w3i6mv\he\)
SWOBJ = $(SWOBJ0:>=.obj)
AMSOBJ0 = $(AMS:<=w3i6mv\he\)
AMSOBJ = $(AMSOBJ0:>=.obj)
AMCOBJ0 = $(AMC:<=w3i6mv\he\)
AMCOBJ = $(AMCOBJ0:>=.obj)
AWLOBJ0 = $(AWL:<=w3i6mv\he\)
AWLOBJ = $(AWLOBJ0:>=.obj)
LOOBJ0 = $(LO:<=w3i6mv\he\)
LOOBJ = $(LOOBJ0:>=.obj)
SNCOBJ0 = $(SNC:<=w3i6mv\he\)
SNCOBJ = $(SNCOBJ0:>=.obj)
DWOBJ0 = $(DW:<=w3i6mv\he\)
DWOBJ = $(DWOBJ0:>=.obj)
FMTTESTOBJ0 = $(FMTTEST:<=w3i6mv\he\)
FMTTESTOBJ = $(FMTTESTOBJ0:>=.obj)
POOLNOBJ0 = $(POOLN:<=w3i6mv\he\)
POOLNOBJ = $(POOLNOBJ0:>=.obj)
TESTLIBOBJ0 = $(TESTLIB:<=w3i6mv\he\)
TESTLIBOBJ = $(TESTLIBOBJ0:>=.obj)
!ELSEIF "$(VARIETY)" == "ce"
CFLAGS=$(CFLAGSCOMMONPRE) $(CFCE) $(CFLAGSCOMMONPOST)
LINKFLAGS=$(LINKFLAGSCOMMON) $(LFCE)
LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSCE)
MPMOBJ0 = $(MPM:<=w3i6mv\ce\)
MPMOBJ = $(MPMOBJ0:>=.obj)
PLINTHOBJ0 = $(PLINTH:<=w3i6mv\ce\)
PLINTHOBJ = $(PLINTHOBJ0:>=.obj)
SWOBJ0 = $(SW:<=w3i6mv\ce\)
SWOBJ = $(SWOBJ0:>=.obj)
AMSOBJ0 = $(AMS:<=w3i6mv\ce\)
AMSOBJ = $(AMSOBJ0:>=.obj)
AMCOBJ0 = $(AMC:<=w3i6mv\ce\)
AMCOBJ = $(AMCOBJ0:>=.obj)
AWLOBJ0 = $(AWL:<=w3i6mv\ce\)
AWLOBJ = $(AWLOBJ0:>=.obj)
LOOBJ0 = $(LO:<=w3i6mv\ce\)
LOOBJ = $(LOOBJ0:>=.obj)
SNCOBJ0 = $(SNC:<=w3i6mv\ce\)
SNCOBJ = $(SNCOBJ0:>=.obj)
DWOBJ0 = $(DW:<=w3i6mv\ce\)
DWOBJ = $(DWOBJ0:>=.obj)
FMTTESTOBJ0 = $(FMTTEST:<=w3i6mv\ce\)
FMTTESTOBJ = $(FMTTESTOBJ0:>=.obj)
POOLNOBJ0 = $(POOLN:<=w3i6mv\ce\)
POOLNOBJ = $(POOLNOBJ0:>=.obj)
TESTLIBOBJ0 = $(TESTLIB:<=w3i6mv\ce\)
TESTLIBOBJ = $(TESTLIBOBJ0:>=.obj)
!ELSEIF "$(VARIETY)" == "hi"
CFLAGS=$(CFLAGSCOMMONPRE) $(CFHI) $(CFLAGSCOMMONPOST)
LINKFLAGS=$(LINKFLAGSCOMMON) $(LFHI)
LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSHI)
MPMOBJ0 = $(MPM:<=w3i6mv\hi\)
MPMOBJ = $(MPMOBJ0:>=.obj)
PLINTHOBJ0 = $(PLINTH:<=w3i6mv\hi\)
PLINTHOBJ = $(PLINTHOBJ0:>=.obj)
SWOBJ0 = $(SW:<=w3i6mv\hi\)
SWOBJ = $(SWOBJ0:>=.obj)
AMSOBJ0 = $(AMS:<=w3i6mv\hi\)
AMSOBJ = $(AMSOBJ0:>=.obj)
AMCOBJ0 = $(AMC:<=w3i6mv\hi\)
AMCOBJ = $(AMCOBJ0:>=.obj)
AWLOBJ0 = $(AWL:<=w3i6mv\hi\)
AWLOBJ = $(AWLOBJ0:>=.obj)
LOOBJ0 = $(LO:<=w3i6mv\hi\)
LOOBJ = $(LOOBJ0:>=.obj)
SNCOBJ0 = $(SNC:<=w3i6mv\hi\)
SNCOBJ = $(SNCOBJ0:>=.obj)
DWOBJ0 = $(DW:<=w3i6mv\hi\)
DWOBJ = $(DWOBJ0:>=.obj)
FMTTESTOBJ0 = $(FMTTEST:<=w3i6mv\hi\)
FMTTESTOBJ = $(FMTTESTOBJ0:>=.obj)
POOLNOBJ0 = $(POOLN:<=w3i6mv\hi\)
POOLNOBJ = $(POOLNOBJ0:>=.obj)
TESTLIBOBJ0 = $(TESTLIB:<=w3i6mv\hi\)
TESTLIBOBJ = $(TESTLIBOBJ0:>=.obj)
!IF "$(VARIETY)" == "hot"
CFLAGS=$(CFLAGSCOMMONPRE) $(CFHOT) $(CFLAGSCOMMONPOST)
LINKFLAGS=$(LINKFLAGSCOMMON) $(LFHOT)
LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSHOT)
MPMOBJ0 = $(MPM:<=w3i6mv\hot\)
PLINTHOBJ0 = $(PLINTH:<=w3i6mv\hot\)
AMSOBJ0 = $(AMS:<=w3i6mv\hot\)
AMCOBJ0 = $(AMC:<=w3i6mv\hot\)
AWLOBJ0 = $(AWL:<=w3i6mv\hot\)
LOOBJ0 = $(LO:<=w3i6mv\hot\)
SNCOBJ0 = $(SNC:<=w3i6mv\hot\)
MVFFOBJ0 = $(MVFF:<=w3i6mv\hot\)
DWOBJ0 = $(DW:<=w3i6mv\hot\)
FMTTESTOBJ0 = $(FMTTEST:<=w3i6mv\hot\)
POOLNOBJ0 = $(POOLN:<=w3i6mv\hot\)
TESTLIBOBJ0 = $(TESTLIB:<=w3i6mv\hot\)
!ELSEIF "$(VARIETY)" == "di"
CFLAGS=$(CFLAGSCOMMONPRE) $(CFDI) $(CFLAGSCOMMONPOST)
LINKFLAGS=$(LINKFLAGSCOMMON) $(LFDI)
LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSDI)
MPMOBJ0 = $(MPM:<=w3i6mv\di\)
MPMOBJ = $(MPMOBJ0:>=.obj)
PLINTHOBJ0 = $(PLINTH:<=w3i6mv\di\)
PLINTHOBJ = $(PLINTHOBJ0:>=.obj)
SWOBJ0 = $(SW:<=w3i6mv\di\)
SWOBJ = $(SWOBJ0:>=.obj)
AMSOBJ0 = $(AMS:<=w3i6mv\di\)
AMSOBJ = $(AMSOBJ0:>=.obj)
AMCOBJ0 = $(AMC:<=w3i6mv\di\)
AMCOBJ = $(AMCOBJ0:>=.obj)
AWLOBJ0 = $(AWL:<=w3i6mv\di\)
AWLOBJ = $(AWLOBJ0:>=.obj)
LOOBJ0 = $(LO:<=w3i6mv\di\)
LOOBJ = $(LOOBJ0:>=.obj)
SNCOBJ0 = $(SNC:<=w3i6mv\di\)
SNCOBJ = $(SNCOBJ0:>=.obj)
MVFFOBJ0 = $(MVFF:<=w3i6mv\di\)
DWOBJ0 = $(DW:<=w3i6mv\di\)
DWOBJ = $(DWOBJ0:>=.obj)
FMTTESTOBJ0 = $(FMTTEST:<=w3i6mv\di\)
FMTTESTOBJ = $(FMTTESTOBJ0:>=.obj)
POOLNOBJ0 = $(POOLN:<=w3i6mv\di\)
POOLNOBJ = $(POOLNOBJ0:>=.obj)
TESTLIBOBJ0 = $(TESTLIB:<=w3i6mv\di\)
TESTLIBOBJ = $(TESTLIBOBJ0:>=.obj)
!ELSEIF "$(VARIETY)" == "ci"
CFLAGS=$(CFLAGSCOMMONPRE) $(CFCI) $(CFLAGSCOMMONPOST)
LINKFLAGS=$(LINKFLAGSCOMMON) $(LFCI)
LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSCI)
MPMOBJ0 = $(MPM:<=w3i6mv\ci\)
MPMOBJ = $(MPMOBJ0:>=.obj)
PLINTHOBJ0 = $(PLINTH:<=w3i6mv\ci\)
PLINTHOBJ = $(PLINTHOBJ0:>=.obj)
SWOBJ0 = $(SW:<=w3i6mv\ci\)
SWOBJ = $(SWOBJ0:>=.obj)
AMSOBJ0 = $(AMS:<=w3i6mv\ci\)
AMSOBJ = $(AMSOBJ0:>=.obj)
AMCOBJ0 = $(AMC:<=w3i6mv\ci\)
AMCOBJ = $(AMCOBJ0:>=.obj)
AWLOBJ0 = $(AWL:<=w3i6mv\ci\)
AWLOBJ = $(AWLOBJ0:>=.obj)
LOOBJ0 = $(LO:<=w3i6mv\ci\)
LOOBJ = $(LOOBJ0:>=.obj)
SNCOBJ0 = $(SNC:<=w3i6mv\ci\)
SNCOBJ = $(SNCOBJ0:>=.obj)
DWOBJ0 = $(DW:<=w3i6mv\ci\)
DWOBJ = $(DWOBJ0:>=.obj)
FMTTESTOBJ0 = $(FMTTEST:<=w3i6mv\ci\)
FMTTESTOBJ = $(FMTTESTOBJ0:>=.obj)
POOLNOBJ0 = $(POOLN:<=w3i6mv\ci\)
POOLNOBJ = $(POOLNOBJ0:>=.obj)
TESTLIBOBJ0 = $(TESTLIB:<=w3i6mv\ci\)
TESTLIBOBJ = $(TESTLIBOBJ0:>=.obj)
!ELSEIF "$(VARIETY)" == "cool"
CFLAGS=$(CFLAGSCOMMONPRE) $(CFCOOL) $(CFLAGSCOMMONPOST)
LINKFLAGS=$(LINKFLAGSCOMMON) $(LFCOOL)
LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSCOOL)
MPMOBJ0 = $(MPM:<=w3i6mv\cool\)
PLINTHOBJ0 = $(PLINTH:<=w3i6mv\cool\)
AMSOBJ0 = $(AMS:<=w3i6mv\cool\)
AMCOBJ0 = $(AMC:<=w3i6mv\cool\)
AWLOBJ0 = $(AWL:<=w3i6mv\cool\)
LOOBJ0 = $(LO:<=w3i6mv\cool\)
SNCOBJ0 = $(SNC:<=w3i6mv\cool\)
MVFFOBJ0 = $(MVFF:<=w3i6mv\cool\)
DWOBJ0 = $(DW:<=w3i6mv\cool\)
FMTTESTOBJ0 = $(FMTTEST:<=w3i6mv\cool\)
POOLNOBJ0 = $(POOLN:<=w3i6mv\cool\)
TESTLIBOBJ0 = $(TESTLIB:<=w3i6mv\cool\)
!ELSEIF "$(VARIETY)" == "ti"
CFLAGS=$(CFLAGSCOMMONPRE) $(CFTI) $(CFLAGSCOMMONPOST)
LINKFLAGS=$(LINKFLAGSCOMMON) $(LFTI)
LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSTI)
MPMOBJ0 = $(MPM:<=w3i6mv\ti\)
MPMOBJ = $(MPMOBJ0:>=.obj)
PLINTHOBJ0 = $(PLINTH:<=w3i6mv\ti\)
PLINTHOBJ = $(PLINTHOBJ0:>=.obj)
SWOBJ0 = $(SW:<=w3i6mv\ti\)
SWOBJ = $(SWOBJ0:>=.obj)
AMSOBJ0 = $(AMS:<=w3i6mv\ti\)
AMSOBJ = $(AMSOBJ0:>=.obj)
AMCOBJ0 = $(AMC:<=w3i6mv\ti\)
AMCOBJ = $(AMCOBJ0:>=.obj)
AWLOBJ0 = $(AWL:<=w3i6mv\ti\)
AWLOBJ = $(AWLOBJ0:>=.obj)
LOOBJ0 = $(LO:<=w3i6mv\ti\)
LOOBJ = $(LOOBJ0:>=.obj)
SNCOBJ0 = $(SNC:<=w3i6mv\ti\)
SNCOBJ = $(SNCOBJ0:>=.obj)
MVFFOBJ0 = $(MVFF:<=w3i6mv\ti\)
DWOBJ0 = $(DW:<=w3i6mv\ti\)
DWOBJ = $(DWOBJ0:>=.obj)
FMTTESTOBJ0 = $(FMTTEST:<=w3i6mv\ti\)
FMTTESTOBJ = $(FMTTESTOBJ0:>=.obj)
POOLNOBJ0 = $(POOLN:<=w3i6mv\ti\)
POOLNOBJ = $(POOLNOBJ0:>=.obj)
TESTLIBOBJ0 = $(TESTLIB:<=w3i6mv\ti\)
TESTLIBOBJ = $(TESTLIBOBJ0:>=.obj)
!ELSEIF "$(VARIETY)" == "wi"
CFLAGS=$(CFLAGSCOMMONPRE) $(CFWI) $(CFLAGSCOMMONPOST)
LINKFLAGS=$(LINKFLAGSCOMMON) $(LFWI)
LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSWI)
MPMOBJ0 = $(MPM:<=w3i6mv\wi\)
MPMOBJ = $(MPMOBJ0:>=.obj)
PLINTHOBJ0 = $(PLINTH:<=w3i6mv\wi\)
PLINTHOBJ = $(PLINTHOBJ0:>=.obj)
SWOBJ0 = $(SW:<=w3i6mv\wi\)
SWOBJ = $(SWOBJ0:>=.obj)
AMSOBJ0 = $(AMS:<=w3i6mv\wi\)
AMSOBJ = $(AMSOBJ0:>=.obj)
AMCOBJ0 = $(AMC:<=w3i6mv\wi\)
AMCOBJ = $(AMCOBJ0:>=.obj)
AWLOBJ0 = $(AWL:<=w3i6mv\wi\)
AWLOBJ = $(AWLOBJ0:>=.obj)
LOOBJ0 = $(LO:<=w3i6mv\wi\)
LOOBJ = $(LOOBJ0:>=.obj)
SNCOBJ0 = $(SNC:<=w3i6mv\wi\)
SNCOBJ = $(SNCOBJ0:>=.obj)
DWOBJ0 = $(DW:<=w3i6mv\wi\)
DWOBJ = $(DWOBJ0:>=.obj)
FMTTESTOBJ0 = $(FMTTEST:<=w3i6mv\wi\)
FMTTESTOBJ = $(FMTTESTOBJ0:>=.obj)
POOLNOBJ0 = $(POOLN:<=w3i6mv\wi\)
POOLNOBJ = $(POOLNOBJ0:>=.obj)
TESTLIBOBJ0 = $(TESTLIB:<=w3i6mv\wi\)
TESTLIBOBJ = $(TESTLIBOBJ0:>=.obj)
!ELSEIF "$(VARIETY)" == "we"
CFLAGS=$(CFLAGSCOMMONPRE) $(CFWE) $(CFLAGSCOMMONPOST)
LINKFLAGS=$(LINKFLAGSCOMMON) $(LFWE)
LIBFLAGS=$(LIBFLAGSCOMMON) $(LIBFLAGSWE)
MPMOBJ0 = $(MPM:<=w3i6mv\we\)
MPMOBJ = $(MPMOBJ0:>=.obj)
PLINTHOBJ0 = $(PLINTH:<=w3i6mv\we\)
PLINTHOBJ = $(PLINTHOBJ0:>=.obj)
SWOBJ0 = $(SW:<=w3i6mv\we\)
SWOBJ = $(SWOBJ0:>=.obj)
AMSOBJ0 = $(AMS:<=w3i6mv\we\)
AMSOBJ = $(AMSOBJ0:>=.obj)
AMCOBJ0 = $(AMC:<=w3i6mv\we\)
AMCOBJ = $(AMCOBJ0:>=.obj)
AWLOBJ0 = $(AWL:<=w3i6mv\we\)
AWLOBJ = $(AWLOBJ0:>=.obj)
LOOBJ0 = $(LO:<=w3i6mv\we\)
LOOBJ = $(LOOBJ0:>=.obj)
SNCOBJ0 = $(SNC:<=w3i6mv\we\)
SNCOBJ = $(SNCOBJ0:>=.obj)
MVFFOBJ0 = $(MVFF:<=w3i6mv\we\)
DWOBJ0 = $(DW:<=w3i6mv\we\)
DWOBJ = $(DWOBJ0:>=.obj)
FMTTESTOBJ0 = $(FMTTEST:<=w3i6mv\we\)
FMTTESTOBJ = $(FMTTESTOBJ0:>=.obj)
POOLNOBJ0 = $(POOLN:<=w3i6mv\we\)
POOLNOBJ = $(POOLNOBJ0:>=.obj)
TESTLIBOBJ0 = $(TESTLIB:<=w3i6mv\we\)
TESTLIBOBJ = $(TESTLIBOBJ0:>=.obj)
#!ELSEIF "$(VARIETY)" == "cv"
#CFLAGS=$(CFLAGSCOMMON) $(CFCV)
@ -318,6 +158,19 @@ TESTLIBOBJ = $(TESTLIBOBJ0:>=.obj)
!ENDIF
MPMOBJ = $(MPMOBJ0:>=.obj)
PLINTHOBJ = $(PLINTHOBJ0:>=.obj)
AMSOBJ = $(AMSOBJ0:>=.obj)
AMCOBJ = $(AMCOBJ0:>=.obj)
AWLOBJ = $(AWLOBJ0:>=.obj)
LOOBJ = $(LOOBJ0:>=.obj)
SNCOBJ = $(SNCOBJ0:>=.obj)
MVFFOBJ = $(MVFFOBJ0:>=.obj)
DWOBJ = $(DWOBJ0:>=.obj)
FMTTESTOBJ = $(FMTTESTOBJ0:>=.obj)
POOLNOBJ = $(POOLNOBJ0:>=.obj)
TESTLIBOBJ = $(TESTLIBOBJ0:>=.obj)
!INCLUDE commpost.nmk

View file

@ -9,7 +9,6 @@ PFM = xci3gc
MPMPF = lockix.c than.c vmix.c \
protix.c protsgix.c prmcan.c span.c ssixi3.c
SWPF = than.c vmxc.c protsw.c prmcan.c ssan.c
LIBS =

View file

@ -77,14 +77,6 @@
</tr>
<tr valign="top">
<td><code><a href="supplement/dll-notes/">supplement/dll-notes/</a></code></td>
<td>Notes on the MPS DLL (the MPS library in dynamically linkable form)</td>
</tr>
</table>
@ -165,7 +157,8 @@
<tr valign="top">
<td>2012-09-05</td>
<td><a href="mailto:rb@ravenbrook.com">RB</a></td>
<td>Removing the old build notes and replacing with new user-oriented build document.</td>
<td>Deleting obsolete instructions for using the Windows DLL.
Removing the old build notes and replacing with new user-oriented build document.</td>
</tr>
</table>

View file

@ -1,176 +0,0 @@
MEMORY POOL SYSTEM -- DLL VERSION
Richard Kistruck, Ravenbrook Limited, 2005-10-06
CONTENTS
1. Introduction
2. Overview
3. DLL Interface
4. What's in the box
5. What else has changed
A. References
B. Document history
C. Copyright and license
INTRODUCTION
This document helps you write MPS client code that uses the dynamically-linked (DLL) version of the MPS.
Readership: developers using the MPS, and developers of the MPS. Confidential: no. Status: rough notes, informally peer-reviewed. Author: RHSK.
Background: The MPS ships in two versions: the static-library version (packaged as a statically-linked library, that is: a .lib file), and the DLL version (a dynamically-linked library). To use the DLL version, extra steps are required; this document describes them.
Peer documents:
<http://www.ravenbrook.com/project/mps/master/readme.txt>
<http://www.ravenbrook.com/project/mps/master/manual/reference/>
OVERVIEW
The MPS provides the various functions etc that constitute the mps.h interface. These are normally declared to the linker as EXPORTS.
The MPS also requires various functions to be provided to it by the client: these are called 'plinth functions'. They are specified in mpslib.h (and for telemetry builds, also mpsio.h). These are normally declared to the linker as IMPORTS.
However, any DLL (on Windows) must state, for each linker-import, the *filename* of the DLL that will provide that import. When building the MPS DLL, we do not know the filename of the DLL that will provide the plinth functions. It could be "MyApp.exe", "languageruntime.dll", or anything else. Corollary: the MPS DLL must require no linker-imports.
The client must provide the required plinth functions in another way. The client calls mps_lib_callback_register() once for each plinth function, passing a function pointer to the client code that implements that function.
Even if "the client" is made up of several DLLs, it only needs to register each plinth function once. Usually this job is done at startup by the 'main' DLL in the client. The other DLLs in the client do not need to be aware of the mpslib interface, and do not need to register any mpslib callbacks.
DLL INTERFACE
The MPS DLL (mpsdy.dll) provides the same linker-exports as the MPS statically-linked library (mps.lib), plus one extra: "mps_lib_callback_register()". It requires no linker-imports.
Exports are linked automatically by the operating system. Client code simply calls mps_pool_create(), etc.
The client must 'manually' provide the plinth functions to the MPS, by calling mps_lib_callback_register(name, function-pointer) one-by-one for each plinth function. The interface (see mpslibcb.h) is:
typedef void (*mps_lib_function_t)(void);
int mps_lib_callback_register(const char *name, mps_lib_function_t f);
Where: "name" specifies the name of the MPS plinth function that the client is providing. The name is the same as the C identifier used in the header file, EG, "mps_lib_assert_fail". "f" is a pointer to the function cast to the one-type-fits-all mps_lib_function_t type. Even though "f" is cast to mps_lib_function_t it must point to a function of the correct type (as specified by the declaration in the header file); the MPS is unlikely to have any way of checking (though of course we reserve the right to check).
The client must do this 'soon after linking': all callbacks must be registered before calling any mps.h function, or behaviour is undefined. (The MPS will not even be able to assert until at least mps_lib_assert_fail() has been registered).
Once the client registers its plinth functions, they may be called by the MPS at various times, just as for the statically-linked version of the MPS.
See mpslib.h for the list of plinth functions the client must register. (Functions in mpsio.h do not need to be registered for normal builds, and the MPS DLL does not support them). There is no way for the client to check that all required callbacks have been successfully registered. [Should MPS provide a way for the client to check this? Even linkers report unresolved symbols; surely we should set our sights at least that high. -RHSK]
Scope of the DLL callback-register mechanism's state: currently, the DLL stores the function pointers passed to mps_lib_callback_register() in global static data. When, whether, and how this is created, shared, and destroyed, is up to the operating system. The function pointers in the static data are statically initialised to dummy functions. The client does not need to do anything to the callback-register mechanism on shut-down: storage is reclaimed by the operating system automatically.
[Aside: multiple calls to mps_lib_callback_register() with the same callback name do currently work (later supersedes earlier). Is this considered to be needed functionality, or might it unhelpfully mask a client bug? There's also an issue supporting this with future mechanisms -- if we actually manage to get the OS to do the linking, for example. If it's not needed, we should probably assert to disallow it. -RHSK]
Examples, using release 1.106.0:
From "mpslib.h", the list of functions is:
extern int mps_lib_get_EOF(void);
extern mps_lib_FILE *mps_lib_get_stderr(void);
extern mps_lib_FILE *mps_lib_get_stdout(void);
extern int mps_lib_fputc(int, mps_lib_FILE *);
extern int mps_lib_fputs(const char *, mps_lib_FILE *);
extern void mps_lib_assert_fail(const char *);
extern void *(mps_lib_memset)(void *, int, size_t);
extern void *(mps_lib_memcpy)(void *, const void *, size_t);
extern int (mps_lib_memcmp)(const void *, const void *, size_t);
extern mps_clock_t mps_clock(void);
extern mps_clock_t mps_clocks_per_sec(void);
extern unsigned long mps_lib_telemetry_control(void);
The callback name of each function is just its C identifier.
From "mpslibcb.h":
int mps_lib_callback_register(const char *, mps_lib_function_t);
Example of registering a callback:
#include "mpslibcb.h"
res = mps_lib_callback_register(
"mps_clock",
(mps_lib_function_t) my_clock_function
);
if(res != MPS_RES_OK) {
printf("mps_lib_callback_register failed.\n");
exit(1);
}
WHAT'S IN THE BOX
Files for MPS DLL, new in 1.105.0:
mpslibcb.h: declares the mps_lib_callback_register() interface.
mpsdy.dll: the MPS DLL
mpsdy.lib: the .lib file produced when linking mpsdy.dll
(Also included, though not needed for DLLs: mpsplcb.lib. Whilst the register callback functionality is not required for a statically-linking client, it might be desirable in some circumstances. The "mpsplcb.lib" provides it: it is simply an 'adaptor' that satisfies all the mpslib.h import requirements with stub functions, and provides the mps_lib_callback_register() interface for the client to pass in function pointers for the stubs to call. The mpsdy.dll DLL incorporates this same adaptor.)
Files for using the MPS statically-linked library are:
mps.lib: the MPS statically-linked library
mpsplan.lib: ("ANSI plinth") a working example of implementing the interfaces that the MPS requires the client to provide, namely the "mpslib.h", and, for telemetry versions, "mpsio.h", interfaces. Source is provided in mpsliban.c and mpsioan.c.
WHAT ELSE HAS CHANGED
Obviously, various linker flags are different to make a DLL.
In addition, the MPS -- in both static .lib and dynamic .dll form -- is now built with /Gs (for compilations) and /GZ (for linking). This suppresses stack probe / stack check, which would otherwise require __chkesp from C library.
A. REFERENCES
B. DOCUMENT HISTORY
2005-10-06 RHSK Created based on <http://info.ravenbrook.com/mail/2005/10/05/14-25-04/0.txt>.
2005-10-14 RHSK Improve clarity of explanation.
2005-10-17 RHSK Clarity: register only once, eg. from 'main' DLL.
C. COPYRIGHT AND LICENSE
Copyright (C) 2005 Ravenbrook Limited <http://www.ravenbrook.com/>.
All rights reserved. This is an open source license. Contact
Ravenbrook for commercial licensing options.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Redistributions in any form must be accompanied by information on how
to obtain complete source code for this software and any
accompanying software that uses this software. The source code must
either be included in the distribution or be available for no more than
the cost of distribution plus a nominal fee, and must be freely
redistributable under reasonable conditions. For an executable file,
complete source code means the source code for all modules it contains.
It does not include source code for modules or files that typically
accompany the major components of the operating system on which the
executable file runs.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
$Id$