diff --git a/tools/misc.c b/tools/misc.c
index d86d7b15a0bfe09d0d2efc7ef65e02f9f1a9028b..bd20842fea153dd449c1061c55941efe6771833e 100644
--- a/tools/misc.c
+++ b/tools/misc.c
@@ -50,6 +50,19 @@ werror(const char *format, ...)
   va_end(args);
 }
 
+void *
+xalloc(size_t size)
+{
+  void *p = malloc(size);
+  if (!p)
+    {
+      fprintf(stderr, "Virtual memory exhausted.\n");
+      abort();
+    }
+
+  return p;
+}
+
 const char
 sexp_token_chars[0x80] =
   {
diff --git a/tools/misc.h b/tools/misc.h
index ee5afcd19b604fa5dbb5d2a9b184efe7ce8e5dbf..b0ddb61a4f0c686024965b5c47e1d60f1f1d7332 100644
--- a/tools/misc.h
+++ b/tools/misc.h
@@ -43,6 +43,9 @@ werror(const char *format, ...)
 #endif
      ;
 
+void *
+xalloc(size_t size);
+
 enum sexp_mode
   {
     SEXP_CANONICAL = 0,