replacement implementation for clock_gettime() on mac os x, build portability (resolv...
authorMorgan Deters <mdeters@gmail.com>
Fri, 1 Oct 2010 21:35:31 +0000 (21:35 +0000)
committerMorgan Deters <mdeters@gmail.com>
Fri, 1 Oct 2010 21:35:31 +0000 (21:35 +0000)
13 files changed:
config/cvc4.m4
configure.ac
src/Makefile.am
src/include/cvc4_public.h
src/lib/Makefile.am [new file with mode: 0644]
src/lib/clock_gettime.c [new file with mode: 0644]
src/lib/clock_gettime.h [new file with mode: 0644]
src/lib/replacements.h [new file with mode: 0644]
src/main/Makefile.am
src/main/util.cpp
src/parser/Makefile.am
src/util/stats.h
test/unit/Makefile.am

index ea7d77223b59eaf65ac81cd89fb4978fd456e4a3..718cdadd329a3aa3f538e198dd9ee647dbb45ace 100644 (file)
@@ -19,34 +19,35 @@ do
   case $ac_option in
     -*|*=*) ;;
     production|production-*|debug|debug-*|default|default-*|competition|competition-*)
-      ac_option_build=`expr "$ac_option" : '\([[^-]]*\)-\?'`
+      # regexp `\?' not supported on Mac OS X
+      ac_option_build=`expr "$ac_option" : '\([[^-]]*\)-\{0,1\}'`
       ac_cvc4_build_profile_set=yes
       AC_MSG_NOTICE([CVC4: building profile $ac_option_build])
       for x in optimized statistics assertions tracing muzzle coverage profiling; do
-        if expr "$ac_option" : '.*-no'$x'-\|.*-no'$x'$' >/dev/null; then
+        if expr "$ac_option" : '.*-no'$x'-\{0,1\}$' >/dev/null; then
           eval 'ac_cvc4_rewritten_args="${ac_cvc4_rewritten_args+$ac_cvc4_rewritten_args }\"--disable-$x\""'
         fi
-        if expr "$ac_option" : '.*-'$x'-\|.*-'$x'$' >/dev/null; then
+        if expr "$ac_option" : '.*-'$x'-\{0,1\}$' >/dev/null; then
           eval 'ac_cvc4_rewritten_args="${ac_cvc4_rewritten_args+$ac_cvc4_rewritten_args }\"--enable-$x\""'
         fi
       done
-      if expr "$ac_option" : '.*-nostaticbinary-\|.*-nostaticbinary$' >/dev/null; then
+      if expr "$ac_option" : '.*-nostaticbinary-\{0,1\}$' >/dev/null; then
         eval 'ac_cvc4_rewritten_args="${ac_cvc4_rewritten_args+$ac_cvc4_rewritten_args }\"--disable-static-binary\""'
       fi
-      if expr "$ac_option" : '.*-staticbinary-\|.*-staticbinary$' >/dev/null; then
+      if expr "$ac_option" : '.*-staticbinary-\{0,1\}$' >/dev/null; then
         eval 'ac_cvc4_rewritten_args="${ac_cvc4_rewritten_args+$ac_cvc4_rewritten_args }\"--enable-static-binary\""'
       fi
-      if expr "$ac_option" : '.*-nodebugsymbols-\|.*-nodebugsymbols$' >/dev/null; then
+      if expr "$ac_option" : '.*-nodebugsymbols-\{0,1\}$' >/dev/null; then
         eval 'ac_cvc4_rewritten_args="${ac_cvc4_rewritten_args+$ac_cvc4_rewritten_args }\"--disable-debug-symbols\""'
       fi
-      if expr "$ac_option" : '.*-debugsymbols-\|.*-debugsymbols$' >/dev/null; then
+      if expr "$ac_option" : '.*-debugsymbols-\{0,1\}$' >/dev/null; then
         eval 'ac_cvc4_rewritten_args="${ac_cvc4_rewritten_args+$ac_cvc4_rewritten_args }\"--enable-debug-symbols\""'
       fi
       for x in cln gmp; do
-        if expr "$ac_option" : '.*-no'$x'-\|.*-no'$x'$' >/dev/null; then
+        if expr "$ac_option" : '.*-no'$x'-\{0,1\}$' >/dev/null; then
           eval 'ac_cvc4_rewritten_args="${ac_cvc4_rewritten_args+$ac_cvc4_rewritten_args }\"--without-$x\""'
         fi
-        if expr "$ac_option" : '.*-'$x'-\|.*-'$x'$' >/dev/null; then
+        if expr "$ac_option" : '.*-'$x'-\{0,1\}$' >/dev/null; then
           eval 'ac_cvc4_rewritten_args="${ac_cvc4_rewritten_args+$ac_cvc4_rewritten_args }\"--with-$x\""'
         fi
       done
index f22ae595a372d95b2ecc2f4f9361cf0079eea56c..249122d2545296ecc5372eeff084fe4e06a6f8eb 100644 (file)
@@ -14,6 +14,7 @@ AC_INIT([cvc4], _CVC4_RELEASE_STRING)
 AC_CONFIG_SRCDIR([src/include/cvc4_public.h])
 AC_CONFIG_AUX_DIR([config])
 AC_CONFIG_MACRO_DIR([config])
+AC_CONFIG_LIBOBJ_DIR([src/lib])
 
 m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
 
@@ -639,7 +640,10 @@ fi
 AC_CHECK_LIB(z, gzread, , [AC_MSG_ERROR([zlib required, install your distro's zlib-dev package or see www.zlib.net])])
 AC_CHECK_HEADER(zlib.h, , [AC_MSG_ERROR([zlib required, install your distro's zlib-dev package or see www.zlib.net])])
 
-AC_CHECK_LIB(rt, clock_gettime, , [AC_MSG_ERROR([can't find clock_gettime() in librt])])
+AC_SEARCH_LIBS([clock_gettime], [rt],
+               [AC_DEFINE([HAVE_CLOCK_GETTIME], [1],
+                          [Defined to 1 if clock_gettime() is supported by the platform.])],
+               [AC_LIBOBJ([clock_gettime])])
 
 # Check for antlr C++ runtime (defined in config/antlr.m4)
 AC_LIB_ANTLR
@@ -656,7 +660,7 @@ AC_CHECK_HEADERS([getopt.h unistd.h])
 #AC_TYPE_SIZE_T
 
 # Check for availability of TLS support (e.g. __thread storage class)
-AC_MSG_CHECKING([whether user wants wants to use compiler-supported TLS])
+AC_MSG_CHECKING([whether to use compiler-supported TLS if available])
 AC_ARG_ENABLE([tls], AS_HELP_STRING([--disable-tls], [don't use compiler-native TLS]))
 if test -z "${enable_tls+set}" || test "$enable_tls" = "yes"; then
   AC_MSG_RESULT([yes])
@@ -701,7 +705,7 @@ AC_DEFINE_UNQUOTED(CVC4_RELEASE_STRING, ["${CVC4_RELEASE_STRING}"], [Full releas
 
 CPPFLAGS="${CPPFLAGS:+$CPPFLAGS }$CVC4CPPFLAGS"
 CXXFLAGS="${CXXFLAGS:+$CXXFLAGS }$CVC4CXXFLAGS -Wno-deprecated"
-CFLAGS="${CFLAGS:+$CFLAGS }$CVC4CFLAGS -Wno-deprecated -fexceptions"
+CFLAGS="${CFLAGS:+$CFLAGS }$CVC4CFLAGS -fexceptions"
 LDFLAGS="${LDFLAGS:+$LDFLAGS }$CVC4LDFLAGS"
 
 AC_SUBST(FLAG_VISIBILITY_HIDDEN)
@@ -742,7 +746,7 @@ AC_SUBST(CVC4_USE_GMP_IMP)
 AC_CONFIG_FILES([
   Makefile.builds
   Makefile]
-  m4_esyscmd([find contrib src test -name Makefile.am | sort | sed 's,\.am$,,'])
+  m4_esyscmd([find contrib lib src test -name Makefile.am | sort | sed 's,\.am$,,'])
   src/util/rational.h
   src/util/integer.h
   src/util/tls.h
index e436971fa04c24baaa00ec9ce25b598054372b85..fb337e2041fe9dab66ac0d06b8f2d22caa3370ee 100644 (file)
 #
 LIBCVC4_VERSION = @CVC4_LIBRARY_VERSION@
 
-AM_CPPFLAGS =
+AM_CPPFLAGS = \
        -D__BUILDING_CVC4LIB \
        -I@srcdir@/include -I@srcdir@ -I@builddir@
 AM_CXXFLAGS = -Wall -Wno-unknown-pragmas $(FLAG_VISIBILITY_HIDDEN)
 
-SUBDIRS = expr util context theory prop smt . parser main
+SUBDIRS = lib expr util context theory prop smt . parser main
 
 lib_LTLIBRARIES = libcvc4.la
 
@@ -40,7 +40,8 @@ libcvc4_noinst_la_LIBADD = \
        @builddir@/prop/libprop.la \
        @builddir@/prop/minisat/libminisat.la \
        @builddir@/smt/libsmt.la \
-       @builddir@/theory/libtheory.la
+       @builddir@/theory/libtheory.la \
+       @builddir@/lib/libreplacements.la
 
 EXTRA_DIST = \
        include/cvc4parser_private.h \
index 8375f75718f8240fce20e7ceb8694af691f319f4..714c32e298c30a49f082c469e865edeb97868a07 100644 (file)
@@ -45,8 +45,8 @@
 #  endif /* __GNUC__ >= 4 */
 #endif /* defined _WIN32 || defined __CYGWIN__ */
 
-#define EXPECT_TRUE(x) __builtin_expect( (x), true)
-#define EXPECT_FALSE(x) __builtin_expect( (x), false)
+#define EXPECT_TRUE(x) __builtin_expect( (x), true )
+#define EXPECT_FALSE(x) __builtin_expect( (x), false )
 #define NORETURN __attribute__ ((noreturn))
 
 #ifndef NULL
diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am
new file mode 100644 (file)
index 0000000..ba0ebdd
--- /dev/null
@@ -0,0 +1,19 @@
+AM_CPPFLAGS = \
+       -D__BUILDING_CVC4LIB \
+       -I@srcdir@/../include -I@srcdir@/.. -I@builddir@/..
+AM_CFLAGS = -Wall -Wno-unknown-pragmas $(FLAG_VISIBILITY_HIDDEN)
+AM_CXXFLAGS = -Wall -Wno-unknown-pragmas $(FLAG_VISIBILITY_HIDDEN)
+
+noinst_LTLIBRARIES = libreplacements.la
+
+libreplacements_la_SOURCES = empty.c
+libreplacements_la_LIBADD = \
+       $(LTLIBOBJS)
+
+EXTRA_DIST = \
+       replacements.h \
+       clock_gettime.c \
+       clock_gettime.h
+
+# empty.c hack -- need *some* source file so that library make rules are built
+empty.c:; touch empty.c
diff --git a/src/lib/clock_gettime.c b/src/lib/clock_gettime.c
new file mode 100644 (file)
index 0000000..6822694
--- /dev/null
@@ -0,0 +1,69 @@
+/*********************                                                        */
+/*! \file clock_gettime.c
+ ** \verbatim
+ ** Original author: 
+ ** Major contributors: none
+ ** Minor contributors (to current version): none
+ ** This file is part of the CVC4 prototype.
+ ** Copyright (c) 2009, 2010  The Analysis of Computer Systems Group (ACSys)
+ ** Courant Institute of Mathematical Sciences
+ ** New York University
+ ** See the file COPYING in the top-level source directory for licensing
+ ** information.\endverbatim
+ **
+ ** \brief Replacement for clock_gettime() for systems without it (like
+ ** Mac OS X)
+ **
+ ** Replacement for clock_gettime() for systems without it (like Mac
+ ** OS X).
+ **/
+
+#include <stdio.h>
+#include <errno.h>
+#include <time.h>
+
+#include "lib/clock_gettime.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#ifndef __APPLE__
+#  warning This code assumes you're on Mac OS X, and you don't seem to be.  You'll likely have problems.
+#endif /* __APPLE__ */
+
+#include <mach/mach_time.h>
+
+static double s_clockconv = 0.0;
+
+long clock_gettime(clockid_t which_clock, struct timespec *tp) {
+  if( s_clockconv == 0.0 ) {
+    mach_timebase_info_data_t tb;
+    kern_return_t err = mach_timebase_info(&tb);
+    if(err == 0) {
+      s_clockconv = ((double) tb.numer) / tb.denom;
+    } else {
+      return -EINVAL;
+    }
+  }
+
+  switch(which_clock) {
+  case CLOCK_REALTIME:
+  case CLOCK_REALTIME_HR:
+  case CLOCK_MONOTONIC:
+  case CLOCK_MONOTONIC_HR: {
+      uint64_t t = mach_absolute_time() * s_clockconv;
+      tp->tv_sec = t / 1000000000ul;
+      tp->tv_nsec = t % 1000000000ul;
+    }
+    break;
+  default:
+    return -EINVAL;
+  }
+
+  return 0;
+}
+
+#ifdef __cplusplus
+}/* extern "C" */
+#endif /* __cplusplus */
diff --git a/src/lib/clock_gettime.h b/src/lib/clock_gettime.h
new file mode 100644 (file)
index 0000000..aac80da
--- /dev/null
@@ -0,0 +1,55 @@
+/*********************                                                        */
+/*! \file clock_gettime.h
+ ** \verbatim
+ ** Original author: 
+ ** Major contributors: none
+ ** Minor contributors (to current version): none
+ ** This file is part of the CVC4 prototype.
+ ** Copyright (c) 2009, 2010  The Analysis of Computer Systems Group (ACSys)
+ ** Courant Institute of Mathematical Sciences
+ ** New York University
+ ** See the file COPYING in the top-level source directory for licensing
+ ** information.\endverbatim
+ **
+ ** \brief Replacement for clock_gettime() for systems without it (like Mac OS X)
+ **
+ ** Replacement for clock_gettime() for systems without it (like Mac OS X).
+ **/
+
+#ifndef __CVC4__LIB__CLOCK_GETTIME_H
+#define __CVC4__LIB__CLOCK_GETTIME_H
+
+#include "lib/replacements.h"
+
+#ifdef HAVE_CLOCK_GETTIME
+
+/* it should be available from <time.h> */
+#include <time.h>
+
+#else /* HAVE_CLOCK_GETTIME */
+
+/* otherwise, we have to define it */
+
+/* get timespec from <time.h> */
+#include <time.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+typedef enum {
+  CLOCK_REALTIME,
+  CLOCK_MONOTONIC,
+  CLOCK_REALTIME_HR,
+  CLOCK_MONOTONIC_HR
+} clockid_t;
+
+long clock_gettime(clockid_t which_clock, struct timespec *tp);
+
+#ifdef __cplusplus
+}/* extern "C" */
+#endif /* __cplusplus */
+
+#endif /* HAVE_CLOCK_GETTIME */
+#endif /*__CVC4__LIB__CLOCK_GETTIME_H */
+
diff --git a/src/lib/replacements.h b/src/lib/replacements.h
new file mode 100644 (file)
index 0000000..d38331b
--- /dev/null
@@ -0,0 +1,36 @@
+/*********************                                                        */
+/*! \file replacements.h
+ ** \verbatim
+ ** Original author: 
+ ** Major contributors: none
+ ** Minor contributors (to current version): none
+ ** This file is part of the CVC4 prototype.
+ ** Copyright (c) 2009, 2010  The Analysis of Computer Systems Group (ACSys)
+ ** Courant Institute of Mathematical Sciences
+ ** New York University
+ ** See the file COPYING in the top-level source directory for licensing
+ ** information.\endverbatim
+ **
+ ** \brief Common header for replacement function sources
+ **
+ ** Common header for replacement function sources.
+ **/
+
+#ifndef __CVC4__LIB__REPLACEMENTS_H
+#define __CVC4__LIB__REPLACEMENTS_H
+
+#if defined(__BUILDING_CVC4LIB) || defined(__BUILDING_CVC4LIB_UNIT_TEST)
+#  include "cvc4_private.h"
+#else
+#  if defined(__BUILDING_CVC4PARSERLIB) || defined(__BUILDING_CVC4PARSERLIB_UNIT_TEST)
+#    include "cvc4parser_private.h"
+#  else
+#    if defined(__BUILDING_CVC4DRIVER)
+#      include "cvc4autoconfig.h"
+#    else
+#      error Must be building libcvc4 or libcvc4parser to use replacement functions.  This is because replacement function headers should never be publicly-depended upon, as they should not be installed on user machines with 'make install'.
+#    endif
+#  endif
+#endif
+
+#endif /* __CVC4__LIB__REPLACEMENTS_H */
index 82ff00a60767ffaab523eb40de7c5e5ab93ec8a3..3cd062158891ba3f6cefdac9699b6b8ab503d19c 100644 (file)
@@ -1,4 +1,5 @@
 AM_CPPFLAGS = \
+       -D__BUILDING_CVC4DRIVER \
        -I@srcdir@/../include -I@srcdir@/.. -I@builddir@/.. $(ANTLR_INCLUDES)
 AM_CXXFLAGS = -Wall -Wno-unknown-pragmas
 
@@ -13,7 +14,8 @@ cvc4_SOURCES = \
 
 cvc4_LDADD = \
        ../parser/libcvc4parser.la \
-       ../libcvc4.la
+       ../libcvc4.la \
+       ../lib/libreplacements.la
 
 if STATIC_BINARY
 cvc4_LINK = $(CXXLINK) -all-static
index ddb9f84c8a24e4cca1c1f9f1e255f7da35155fac..e91e80c3f528cd1ca08539841d71b1f72d1b6f99 100644 (file)
@@ -82,6 +82,26 @@ void segv_handler(int sig, siginfo_t* info, void*) {
 #endif /* CVC4_DEBUG */
 }
 
+/** Handler for SIGILL (illegal instruction). */
+void ill_handler(int sig, siginfo_t* info, void*) {
+#ifdef CVC4_DEBUG
+  fprintf(stderr, "CVC4 executed an illegal instruction in DEBUG mode.\n");
+  if(segvNoSpin) {
+    fprintf(stderr, "No-spin requested, aborting...\n");
+    abort();
+  } else {
+    fprintf(stderr, "Spinning so that a debugger can be connected.\n");
+    fprintf(stderr, "Try:  gdb %s %u\n", progName, getpid());
+    for(;;) {
+      sleep(60);
+    }
+  }
+#else /* CVC4_DEBUG */
+  fprintf(stderr, "CVC4 executed an illegal instruction.\n");
+  abort();
+#endif /* CVC4_DEBUG */
+}
+
 static terminate_handler default_terminator;
 
 void cvc4unexpected() {
@@ -134,22 +154,33 @@ void cvc4_init() throw() {
   act1.sa_sigaction = sigint_handler;
   act1.sa_flags = SA_SIGINFO;
   sigemptyset(&act1.sa_mask);
-  if(sigaction(SIGINT, &act1, NULL))
+  if(sigaction(SIGINT, &act1, NULL)) {
     throw Exception(string("sigaction(SIGINT) failure: ") + strerror(errno));
+  }
 
   struct sigaction act2;
   act2.sa_sigaction = timeout_handler;
   act2.sa_flags = SA_SIGINFO;
   sigemptyset(&act2.sa_mask);
-  if(sigaction(SIGXCPU, &act2, NULL))
+  if(sigaction(SIGXCPU, &act2, NULL)) {
     throw Exception(string("sigaction(SIGXCPU) failure: ") + strerror(errno));
+  }
 
   struct sigaction act3;
   act3.sa_sigaction = segv_handler;
   act3.sa_flags = SA_SIGINFO;
   sigemptyset(&act3.sa_mask);
-  if(sigaction(SIGSEGV, &act3, NULL))
+  if(sigaction(SIGSEGV, &act3, NULL)) {
     throw Exception(string("sigaction(SIGSEGV) failure: ") + strerror(errno));
+  }
+
+  struct sigaction act4;
+  act4.sa_sigaction = segv_handler;
+  act4.sa_flags = SA_SIGINFO;
+  sigemptyset(&act4.sa_mask);
+  if(sigaction(SIGILL, &act4, NULL)) {
+    throw Exception(string("sigaction(SIGILL) failure: ") + strerror(errno));
+  }
 
   set_unexpected(cvc4unexpected);
   default_terminator = set_terminate(cvc4terminate);
index b1f265b56ede8dda02de6e143d962ffe02023df0..51a833c261597366d34b0578b741877688dac600 100644 (file)
@@ -30,13 +30,13 @@ libcvc4parser_la_LINK = $(CXXLINK)
 libcvc4parser_noinst_la_LDFLAGS = $(ANTLR_LDFLAGS)
 libcvc4parser_noinst_la_LIBADD = \
        @builddir@/smt/libparsersmt.la \
-    @builddir@/smt2/libparsersmt2.la \
-    @builddir@/cvc/libparsercvc.la
+       @builddir@/smt2/libparsersmt2.la \
+       @builddir@/../lib/libreplacements.la
 
 libcvc4parser_la_SOURCES =
 libcvc4parser_noinst_la_SOURCES = \
-    antlr_input.h \
-    antlr_input.cpp \
+       antlr_input.h \
+       antlr_input.cpp \
        antlr_input_imports.cpp \
        bounded_token_buffer.h \
        bounded_token_buffer.cpp \
@@ -46,10 +46,10 @@ libcvc4parser_noinst_la_SOURCES = \
        input.cpp \
        memory_mapped_input_buffer.h \
        memory_mapped_input_buffer.cpp \
-    parser.h \
-    parser.cpp \
-    parser_builder.h \
-    parser_builder.cpp \
-    parser_options.h \
-    parser_exception.h
+       parser.h \
+       parser.cpp \
+       parser_builder.h \
+       parser_builder.cpp \
+       parser_options.h \
+       parser_exception.h
 
index f8c10c79f04d4e7e496ea890aa1c0c442a7b1eab..3a1b8550675af5764bee3a98e73f98c0107deeed 100644 (file)
@@ -29,6 +29,7 @@
 #include <ctime>
 
 #include "util/Assert.h"
+#include "lib/clock_gettime.h"
 
 namespace CVC4 {
 
@@ -310,36 +311,6 @@ inline std::ostream& operator<<(std::ostream& os, const ::timespec& t) {
 }
 
 
-#ifdef __APPLE__
-
-class TimerStat : public BackedStat< ::timespec > {
-  bool d_running;
-
-public:
-
-  TimerStat(const std::string& s) :
-    BackedStat< ::timespec >(s, ::timespec()),
-    d_running(false) {
-  }
-
-  void start() {
-    if(__CVC4_USE_STATISTICS) {
-      AlwaysAssert(!d_running);
-      d_running = true;
-    }
-  }
-
-  void stop() {
-    if(__CVC4_USE_STATISTICS) {
-      AlwaysAssert(d_running);
-      ++d_data.tv_sec;
-      d_running = false;
-    }
-  }
-};/* class TimerStat */
-
-#else /* __APPLE__ */
-
 class TimerStat : public BackedStat< ::timespec > {
   // strange: timespec isn't placed in 'std' namespace ?!
   ::timespec d_start;
@@ -371,7 +342,6 @@ public:
   }
 };/* class TimerStat */
 
-#endif /* __APPLE__ */
 
 #undef __CVC4_USE_STATISTICS
 
index d5bf66496d0b9a9b199009335d44bb5aaf969881..059d1d163e15412c90541d1b8f3ed5a56757df2e 100644 (file)
@@ -50,12 +50,17 @@ TEST_DEPS_DIST = \
 if HAVE_CXXTESTGEN
 
 AM_CPPFLAGS = \
-       -I. "-I@CXXTEST@" "-I@top_srcdir@/src/include" \
-       "-I@top_srcdir@/src" "-I@top_builddir@/src" \
+       -I. \
+       "-I@CXXTEST@" \
+       "-I@top_srcdir@/src/include" \
+       "-I@top_srcdir@/lib" \
+       "-I@top_srcdir@/src" \
+       "-I@top_builddir@/src" \
        "-I@top_srcdir@/src/prop/minisat" \
        -D __STDC_LIMIT_MACROS \
        -D __STDC_FORMAT_MACROS \
-       $(ANTLR_INCLUDES) $(TEST_CPPFLAGS)
+       $(ANTLR_INCLUDES) \
+       $(TEST_CPPFLAGS)
 AM_CXXFLAGS = -Wall -Wno-unknown-pragmas -Wno-parentheses $(TEST_CXXFLAGS)
 AM_LDFLAGS = $(TEST_LDFLAGS)