diff --git a/mps/code/comm.gmk b/mps/code/comm.gmk
index 65c88abc9cf..ca2d40cce08 100644
--- a/mps/code/comm.gmk
+++ b/mps/code/comm.gmk
@@ -187,6 +187,7 @@ MPMCOMMON = \
mpm.c \
mpsi.c \
nailboard.c \
+ node.c \
policy.c \
pool.c \
poolabs.c \
diff --git a/mps/code/commpre.nmk b/mps/code/commpre.nmk
index c428e909fa9..5f25356494a 100644
--- a/mps/code/commpre.nmk
+++ b/mps/code/commpre.nmk
@@ -147,6 +147,7 @@ MPMCOMMON=\
[mpm] \
[mpsi] \
[nailboard] \
+ [node] \
[policy] \
[pool] \
[poolabs] \
diff --git a/mps/code/mpmst.h b/mps/code/mpmst.h
index 5d583a3e213..c1c1fc98ff1 100644
--- a/mps/code/mpmst.h
+++ b/mps/code/mpmst.h
@@ -240,6 +240,28 @@ typedef struct SegClassStruct {
} SegClassStruct;
+/* RangeStruct -- address range
+ *
+ * See design.mps.range, range.h, range.c.
+ */
+
+typedef struct RangeStruct {
+ Addr base;
+ Addr limit;
+} RangeStruct;
+
+
+/* NodeStruct -- address range in a tree
+ *
+ * See node.h, node.c.
+ */
+
+typedef struct NodeStruct {
+ TreeStruct treeStruct;
+ RangeStruct rangeStruct;
+} NodeStruct;
+
+
/* SegStruct -- segment structure
*
* .seg: Segments are the basic units of protection and tracer activity
diff --git a/mps/code/mpmtypes.h b/mps/code/mpmtypes.h
index f001038bc9f..49d22a44a52 100644
--- a/mps/code/mpmtypes.h
+++ b/mps/code/mpmtypes.h
@@ -109,6 +109,7 @@ typedef struct AllocPatternStruct *AllocPattern;
typedef struct AllocFrameStruct *AllocFrame; /* */
typedef struct StackContextStruct *StackContext;
typedef struct RangeStruct *Range; /* */
+typedef struct NodeStruct *Node;
typedef struct LandStruct *Land; /* */
typedef struct LandClassStruct *LandClass; /* */
typedef unsigned FindDelete; /* */
diff --git a/mps/code/node.c b/mps/code/node.c
new file mode 100644
index 00000000000..339ace62a54
--- /dev/null
+++ b/mps/code/node.c
@@ -0,0 +1,78 @@
+/* node.c -- binary trees of address ranges
+ *
+ * $Id$
+ * Copyright (C) 2016 Ravenbrook Limited. See end of file for license.
+ */
+
+#include "node.h"
+#include "tree.h"
+#include "range.h"
+#include "mpm.h"
+
+
+void NodeInit(Node node, Addr base, Addr limit)
+{
+ AVER(node != NULL);
+ TreeInit(NodeTree(node));
+ RangeInit(NodeRange(node), base, limit);
+ AVERT(Node, node);
+}
+
+
+Bool NodeCheck(Node node)
+{
+ CHECKL(node != NULL);
+ CHECKD_NOSIG(Tree, NodeTree(node));
+ CHECKD_NOSIG(Range, NodeRange(node));
+ return TRUE;
+}
+
+
+void NodeFinish(Node node)
+{
+ AVERT(Node, node);
+ TreeFinish(NodeTree(node));
+ RangeFinish(NodeRange(node));
+}
+
+
+/* C. COPYRIGHT AND LICENSE
+ *
+ * Copyright (C) 2013 Ravenbrook Limited .
+ * 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.
+ */
diff --git a/mps/code/node.h b/mps/code/node.h
new file mode 100644
index 00000000000..8409d811498
--- /dev/null
+++ b/mps/code/node.h
@@ -0,0 +1,62 @@
+/* node.c -- binary trees of address ranges
+ *
+ * $Id$
+ * Copyright (C) 2016 Ravenbrook Limited. See end of file for license.
+ */
+
+#ifndef node_h
+#define node_h
+
+#include "mpmtypes.h"
+
+#define NodeTree(node) (&(node)->treeStruct)
+#define NodeRange(node) (&(node)->rangeStruct)
+#define NodeOfTree(tree) PARENT(NodeStruct, treeStruct, tree)
+#define NodeOfRange(range) PARENT(NodeStruct, rangeStruct, range)
+
+extern void NodeInit(Node node, Addr base, Addr limit);
+extern Bool NodeCheck(Node node);
+extern void NodeFinish(Node node);
+
+#endif /* node_h */
+
+/* C. COPYRIGHT AND LICENSE
+ *
+ * Copyright (C) 2013 Ravenbrook Limited .
+ * 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.
+ */