update _DATE/_TIME compiler chatter reduction bits.
authorNorm Jacobs <Norm.Jacobs@Sun.COM>
Thu, 10 Jun 2010 15:06:28 -0500
changeset 16 33aaaec59991
parent 15 21f7a7ab78ba
child 17 56b936d4786f
update _DATE/_TIME compiler chatter reduction bits. make env a macro
make-rules/configure.mk
make-rules/setup.py.mk
make-rules/shared-macros.mk
tools/Makefile
tools/time.c
--- a/make-rules/configure.mk	Thu May 20 13:21:58 2010 -0500
+++ b/make-rules/configure.mk	Thu Jun 10 15:06:28 2010 -0500
@@ -70,7 +70,7 @@
 $(COMPONENT_SRC)/build-%/.configured:	$(COMPONENT_SRC)/.prep
 	($(RM) -rf $(@D) ; $(MKDIR) $(@D))
 	$(COMPONENT_PRE_CONFIGURE_ACTION)
-	(cd $(@D) ; env - $(CONFIGURE_ENV) $(CONFIG_SHELL) \
+	(cd $(@D) ; $(ENV) $(CONFIGURE_ENV) $(CONFIG_SHELL) \
 		../configure $(CONFIGURE_OPTIONS) $(CONFIGURE_OPTIONS.$(BITS)))
 	$(COMPONENT_POST_CONFIGURE_ACTION)
 	$(TOUCH) $@
@@ -78,14 +78,15 @@
 # build the configured source
 $(COMPONENT_SRC)/build-%/.built:	$(COMPONENT_SRC)/build-%/.configured
 	$(COMPONENT_PRE_BUILD_ACTION)
-	(cd $(@D) ; $(COMPONENT_BUILD_ENV) $(GMAKE) $(COMPONENT_BUILD_TARGETS))
+	(cd $(@D) ; $(ENV) $(COMPONENT_BUILD_ENV) \
+		$(GMAKE) $(COMPONENT_BUILD_TARGETS))
 	$(COMPONENT_POST_BUILD_ACTION)
 	$(TOUCH) $@
 
 # install the built source into a prototype area
 $(COMPONENT_SRC)/build-%/.installed:	$(COMPONENT_SRC)/build-%/.built
 	$(COMPONENT_PRE_INSTALL_ACTION)
-	(cd $(@D) ; $(COMPONENT_INSTALL_ENV) $(GMAKE) \
+	(cd $(@D) ; $(ENV) $(COMPONENT_INSTALL_ENV) $(GMAKE) \
 			DESTDIR=$(PROTO_DIR) $(COMPONENT_INSTALL_TARGETS))
 	$(COMPONENT_POST_INSTALL_ACTION)
 	$(TOUCH) $@
--- a/make-rules/setup.py.mk	Thu May 20 13:21:58 2010 -0500
+++ b/make-rules/setup.py.mk	Thu Jun 10 15:06:28 2010 -0500
@@ -31,13 +31,15 @@
 $(COMPONENT_SRC)/build-%/.built:	$(COMPONENT_SRC)/.prep
 	$(RM) -r $(@D) ; $(MKDIR) $(@D)
 	$(COMPONENT_PRE_BUILD_ACTION)
-	(cd $(COMPONENT_SRC) ; env - $(PYTHON_ENV) $(PYTHON.$(BITS)) ./setup.py build --build-temp $(@D:$(COMPONENT_SRC)/%=%))
+	(cd $(COMPONENT_SRC) ; $(ENV) $(PYTHON_ENV) \
+		$(PYTHON.$(BITS)) ./setup.py build --build-temp $(@D:$(COMPONENT_SRC)/%=%))
 	$(COMPONENT_POST_BUILD_ACTION)
 	$(TOUCH) $@
 
 # install the built source into a prototype area
 $(COMPONENT_SRC)/build-%/.installed:	$(COMPONENT_SRC)/build-%/.built
 	$(COMPONENT_PRE_INSTALL_ACTION)
-	(cd $(COMPONENT_SRC) ; env - $(PYTHON_ENV) $(PYTHON.$(BITS)) ./setup.py install --root $(PROTO_DIR))
+	(cd $(COMPONENT_SRC) ; $(ENV) $(PYTHON_ENV) \
+		$(PYTHON.$(BITS)) ./setup.py install --root $(PROTO_DIR))
 	$(COMPONENT_POST_INSTALL_ACTION)
 	$(TOUCH) $@
--- a/make-rules/shared-macros.mk	Thu May 20 13:21:58 2010 -0500
+++ b/make-rules/shared-macros.mk	Thu Jun 10 15:06:28 2010 -0500
@@ -36,7 +36,12 @@
 PKG_REPO =	file://$(WS_TOP)/repo
 PROTO_DIR =	$(shell pwd)/$(COMPONENT_SRC)/installed-prototype-$(MACH)
 
-CONSTANT_TIME =	LD_PRELOAD=$(TOOLS)/time.o
+# work around _TIME, _DATE, embedded date chatter in component builds
+# to use, set TIME_CONSTANT in the component Makefile and add $(CONSTANT_TIME)
+# to the appropriate {CONFIGURE|BUILD|INSTALL}_ENV
+CONSTANT_TIME =		LD_PRELOAD_32=$(TOOLS)/time-$(MACH32).so
+CONSTANT_TIME +=	LD_PRELOAD_64=$(TOOLS)/time-$(MACH64).so
+CONSTANT_TIME +=	TIME_CONSTANT=$(TIME_CONSTANT)
 
 # set MACH from uname -p to either sparc or i386
 MACH =		$(shell uname -p)
@@ -75,6 +80,8 @@
 CC =		$(CC.$(COMPILER).$(BITS))
 CCC =		$(CCC.$(COMPILER).$(BITS))
 
+LD =		/usr/bin/ld
+
 PYTHON.2.4.32 =	/usr/bin/python2.4
 PYTHON.2.4.64 =	/usr/bin/amd64/python2.4
 
@@ -94,3 +101,4 @@
 MKDIR =		/bin/mkdir -p
 RM =		/bin/rm -f
 CP =		/bin/cp -f
+ENV =		/usr/bin/env
--- a/tools/Makefile	Thu May 20 13:21:58 2010 -0500
+++ b/tools/Makefile	Thu Jun 10 15:06:28 2010 -0500
@@ -23,7 +23,20 @@
 
 include ../make-rules/shared-macros.mk
 
-download setup prep build install publish validate:	time.o
+download setup prep build install publish validate:	time-$(MACH32).so \
+							time-$(MACH64).so
+
+time-$(MACH64).o:			BITS=64
+time-$(MACH32).o time-$(MACH64).o:	CFLAGS += -Kpic
+
+time-$(MACH32).o time-$(MACH64).o:	time.c
+	$(CC) $(CFLAGS) -c -o $@ $<
 
-clean clobber:
-	$(RM) time.o
+time-%.so:	time-%.o
+	$(LD) -G -o $@ $<
+
+clean:
+	$(RM) time-*.o
+
+clobber:	clean
+	$(RM) time-*.so
--- a/tools/time.c	Thu May 20 13:21:58 2010 -0500
+++ b/tools/time.c	Thu Jun 10 15:06:28 2010 -0500
@@ -23,8 +23,9 @@
 
 /*
  * This compiles to a module that can be preloaded during a build.  If this
- * is preloaded, it interposes on time(2) and returns a constant value when
- * the execname matches one of the desired "programs" and TIME_CONSTANT
+ * is preloaded, it interposes on time(2), gettimeofday(3C), and
+ * clock_gethrtime(3C) and returns a constant number of seconds since epoch
+ * when the execname matches one of the desired "programs" and TIME_CONSTANT
  * contains an integer value to be returned.
  */
 
@@ -32,9 +33,12 @@
 #include <ucontext.h>
 #include <dlfcn.h>
 #include <strings.h>
+#include <time.h>
 
 /* The list of programs that we want to use a constant time. */
-static char *programs[] = { "date", "cpp", "cc1", "perl", NULL };
+static char *programs[] = { "autogen", "bash", "cpp", "cc1", "date", "doxygen",
+	"erl", "javadoc", "ksh", "ksh93", "ld", "perl", "perl5.8.4", "perl5.10",
+	"ruby", "sh", NULL };
 
 static int
 stack_info(uintptr_t pc, int signo, void *arg)
@@ -43,7 +47,8 @@
 	void *sym;
 
 	if (dladdr1((void *)pc, &info, &sym, RTLD_DL_SYMENT) != NULL) {
-		*(char **)arg = (char *)info.dli_fname;
+		if (strstr(info.dli_fname, ".so") == NULL)
+			*(char **)arg = (char *)info.dli_fname;
 	}
 
 	return (0);
@@ -72,7 +77,7 @@
 }
 
 static time_t
-intercept()
+time_constant()
 {
 	char *execname = my_execname();
 	time_t result = -1;
@@ -82,13 +87,13 @@
 
 		for (i = 0; programs[i] != NULL; i++)
 			if (strcmp(execname, programs[i]) == 0) {
-				static char *time_constant;
+				static char *time_string;
 
-				if (time_constant == NULL)
-					time_constant = getenv("TIME_CONSTANT");
+				if (time_string == NULL)
+					time_string = getenv("TIME_CONSTANT");
 
-				if (time_constant != NULL)
-					result = atoll(time_constant);
+				if (time_string != NULL)
+					result = atoll(time_string);
 
 				break;
 			}
@@ -100,7 +105,7 @@
 time_t
 time(time_t *ptr)
 {
-	time_t result = intercept();
+	time_t result = time_constant();
 
 	if (result == (time_t)-1) {
 		static time_t (*fptr)(time_t *);
@@ -114,3 +119,43 @@
 
 	return (result);
 }
+
+int
+gettimeofday(struct timeval *tp, void *tzp)
+{
+	static int (*fptr)(struct timeval *, void *);
+	int result = -1;
+
+	if (fptr == NULL)
+		fptr = (int (*)(struct timeval *, void *))dlsym(RTLD_NEXT,
+				"gettimeofday");
+
+	if ((result = (fptr)(tp, tzp)) == 0) {
+		time_t curtime = time_constant();
+
+		if (curtime != (time_t)-1)
+			tp->tv_sec = curtime;
+	}
+
+	return (result);
+}
+
+int
+clock_gettime(clockid_t clock_id, struct timespec *tp)
+{
+	static int (*fptr)(clockid_t, struct timespec *);
+	int result = -1;
+
+	if (fptr == NULL)
+		fptr = (int (*)(clockid_t, struct timespec *))dlsym(RTLD_NEXT,
+				"clock_gettime");
+
+	if ((result = (fptr)(clock_id, tp)) == 0) {
+		time_t curtime = time_constant();
+
+		if (curtime != (time_t)-1)
+			tp->tv_sec = curtime;
+	}
+
+	return (result);
+}