]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
the gcc optimizer frequently finds broken code (use of uninitalized variables, unreac...
authorKevin P. Fleming <kpfleming@digium.com>
Wed, 19 Nov 2008 21:34:47 +0000 (21:34 +0000)
committerKevin P. Fleming <kpfleming@digium.com>
Wed, 19 Nov 2008 21:34:47 +0000 (21:34 +0000)
with this build system change, if (and only if) --enable-dev-mode was used and DONT_OPTIMIZE is turned on, when a source file is compiled it will actually be preprocessed (into a .i or .ii file), then compiled once with optimization (with the result sent to /dev/null) and again without optimization (but only if the first compile succeeded, of course).

while making these changes, i did some cleanup work in Makefile.rules to move commonly-used combinations of flag variables into their own variables, to make the file easier to read and maintain

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@157859 65c4cc65-6c06-0410-ace0-fbb531ad65f3

Makefile.moddir_rules
Makefile.rules
channels/misdn/Makefile
codecs/gsm/Makefile
main/db1-ast/Makefile
main/stdtime/Makefile
pbx/Makefile
res/Makefile

index 79a704d8550b7ad666b3c7f82567e5e282f73053..f79a8b64e7cc3afa75d97536275ff7b9dc288c1f 100644 (file)
@@ -64,7 +64,7 @@ modules.link:
        @for file in $(patsubst %,$(SUBDIR)/%,$(filter-out %.o,$^)); do echo "INPUT (../$${file})" >> $@; done
 
 clean::
-       rm -f *.so *.o *.oo *.s *.i
+       rm -f *.so *.o *.oo *.s *.i *.ii
        rm -f .*.o.d .*.oo.d
        rm -f modules.link
 
index 2d66c7a3eaacbf52829fb8827f114b85295d69f8..387420f321c05ec53f06c6568d71395b0ae287d1 100644 (file)
@@ -3,7 +3,7 @@
 # 
 # Makefile rules
 #
-# Copyright (C) 2006, Digium, Inc.
+# Copyright (C) 2006-2008, Digium, Inc.
 #
 # Kevin P. Fleming <kpfleming@digium.com>
 #
 
 .PHONY: dist-clean
 
+# extra cflags to build dependencies. Recursively expanded.
+MAKE_DEPS=-MD -MT $@ -MF .$(subst /,_,$@).d -MP
+
 ifeq ($(NOISY_BUILD),)
-   ECHO_PREFIX=@
-   CMD_PREFIX=@
+    ECHO_PREFIX=@
+    CMD_PREFIX=@
 else
-   ECHO_PREFIX=@\# 
-   CMD_PREFIX=
+    ECHO_PREFIX=@\# 
+    CMD_PREFIX=
 endif
 
+OPTIMIZE?=-O6
+
 ifeq ($(findstring DONT_OPTIMIZE,$(MENUSELECT_CFLAGS)),)
-# More GSM codec optimization
-# Uncomment to enable MMXTM optimizations for x86 architecture CPU's
-# which support MMX instructions.  This should be newer pentiums,
-# ppro's, etc, as well as the AMD K6 and K7.  
-#K6OPT=-DK6OPT
+    # More GSM codec optimization
+    # Uncomment to enable MMXTM optimizations for x86 architecture CPU's
+    # which support MMX instructions.  This should be newer pentiums,
+    # ppro's, etc, as well as the AMD K6 and K7.  
+    #K6OPT=-DK6OPT
 
-OPTIMIZE?=-O6
-ASTCFLAGS+=$(OPTIMIZE)
+    ASTCFLAGS+=$(OPTIMIZE)
 endif
 
-%.o: %.c
-       $(ECHO_PREFIX) echo "   [CC] $< -> $@"
-       $(CMD_PREFIX) $(CC) -o $@ -c $< $(PTHREAD_CFLAGS) $(ASTCFLAGS) -MD -MT $@ -MF .$(subst /,_,$@).d -MP
+# shortcuts for common combinations of flags; these must be recursively expanded so that
+# per-target settings will be applied
+CC_CFLAGS=$(PTHREAD_CFLAGS) $(ASTCFLAGS)
+CXX_CFLAGS=$(PTHREAD_CFLAGS) $(filter-out -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations $(AST_DECLARATION_AFTER_STATEMENT),$(ASTCFLAGS))
+CC_LDFLAGS_SO=$(PTHREAD_CFLAGS) $(ASTLDFLAGS) $(SOLINK)
+CXX_LDFLAGS_SO=$(PTHREAD_CFLAGS) $(ASTLDFLAGS) $(SOLINK)
+CC_LIBS=$(PTHREAD_LIBS) $(LIBS)
+CXX_LIBS=$(PTHREAD_LIBS) $(LIBS)
+
+# determine whether to double-compile so that the optimizer can report code path problems
+# this is only done when developer mode and DONT_OPTIMIZE are both enabled
+# in that case, we run the preprocessor to produce a .i or .ii file from the source
+# code, then compile once with optimizer enabled (and the output to /dev/null),
+# and if that doesn't fail then compile again with optimizer disabled
+ifeq ($(findstring DONT_OPTIMIZE,$(MENUSELECT_CFLAGS))$(AST_DEVMODE),DONT_OPTIMIZEyes)
+COMPILE_DOUBLE=yes
+endif
+
+%.o: %.s
+       $(ECHO_PREFIX) echo "   [AS] $< -> $@"
+ifeq ($(COMPILE_DOUBLE),yes)
+       $(CMD_PREFIX) $(CC) -o /dev/null -c $< $(CC_CFLAGS) $(OPTIMIZE)
+endif
+       $(CMD_PREFIX) $(CC) -o $@ -c $< $(CC_CFLAGS)
 
 %.o: %.i
        $(ECHO_PREFIX) echo "   [CCi] $< -> $@"
-       $(CMD_PREFIX) $(CC) -o $@ -c $< $(PTHREAD_CFLAGS) $(ASTCFLAGS) -MD -MT $@ -MF .$(subst /,_,$@).d -MP
+ifeq ($(COMPILE_DOUBLE),yes)
+       $(CMD_PREFIX) $(CC) -o /dev/null -c $< $(CC_CFLAGS) $(OPTIMIZE)
+endif
+       $(CMD_PREFIX) $(CC) -o $@ -c $< $(CC_CFLAGS)
+
+%.o: %.c
+       $(ECHO_PREFIX) echo "   [CC] $< -> $@"
+ifeq ($(COMPILE_DOUBLE),yes)
+       $(CMD_PREFIX) $(CC) -o $(@:%.o=%.i) -E $< $(CC_CFLAGS) $(MAKE_DEPS)
+       $(CMD_PREFIX) $(CC) -o /dev/null -c $(@:%.o=%.i) $(CC_CFLAGS) $(OPTIMIZE)
+       $(CMD_PREFIX) $(CC) -o $@ -c $(@:%.o=%.i) $(CC_CFLAGS)
+else
+       $(CMD_PREFIX) $(CC) -o $@ -c $< $(CC_CFLAGS) $(MAKE_DEPS)
+endif
 
 %.i: %.c
        $(ECHO_PREFIX) echo "   [CPP] $< -> $@"
-       $(CMD_PREFIX) $(CC) -o $@ -E $< $(PTHREAD_CFLAGS) $(ASTCFLAGS) -MD -MT $@ -MF .$(subst /,_,$@).d -MP
+       $(CMD_PREFIX) $(CC) -o $@ -E $< $(CC_CFLAGS) $(MAKE_DEPS)
 
-%.o: %.s
-       $(ECHO_PREFIX) echo "   [AS] $< -> $@"
-       $(CMD_PREFIX) $(CC) -o $@ -c $< $(PTHREAD_CFLAGS) $(ASTCFLAGS) -MD -MT $@ -MF .$(subst /,_,$@).d -MP
+%.oo: %.ii
+       $(ECHO_PREFIX) echo "   [CXXi] $< -> $@"
+ifeq ($(COMPILE_DOUBLE),yes)
+       $(CMD_PREFIX) $(CXX) -o /dev/null -c $< $(CXX_CFLAGS) $(OPTIMIZE)
+endif
+       $(CMD_PREFIX) $(CXX) -o $@ -c $< $(CXX_CFLAGS)
 
 %.oo: %.cc
        $(ECHO_PREFIX) echo "   [CXX] $< -> $@"
-       $(CMD_PREFIX) $(CXX) -o $@ -c $< $(PTHREAD_CFLAGS) $(filter-out -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations $(AST_DECLARATION_AFTER_STATEMENT),$(ASTCFLAGS)) -MD -MT $@ -MF .$(subst /,_,$@).d -MP
+ifeq ($(COMPILE_DOUBLE),yes)
+       $(CMD_PREFIX) $(CXX) -o $(@:%.oo=%.ii) -E $< $(CXX_CFLAGS) $(MAKE_DEPS)
+       $(CMD_PREFIX) $(CXX) -o /dev/null -c $(@:%.oo=%.ii) $(CXX_CFLAGS) $(MAKE_DEPS) $(OPTIMIZE)
+       $(CMD_PREFIX) $(CXX) -o $@ -c $(@:%.oo=%.ii) $(CXX_CFLAGS) $(MAKE_DEPS)
+else
+       $(CMD_PREFIX) $(CXX) -o $@ -c $< $(CXX_CFLAGS) $(MAKE_DEPS)
+endif
+
+%.ii: %.cc
+       $(ECHO_PREFIX) echo "   [CPP] $< -> $@"
+       $(CMD_PREFIX) $(CXX) -o $@ -E $< $(CXX_CFLAGS) $(MAKE_DEPS)
 
 %.c: %.y
        $(ECHO_PREFIX) echo "   [BISON] $< -> $@"
@@ -68,14 +119,14 @@ endif
 
 %.so: %.o
        $(ECHO_PREFIX) echo "   [LD] $^ -> $@"
-       $(CMD_PREFIX) $(CC) $(STATIC_BUILD) -o $@ $(PTHREAD_CFLAGS) $(ASTLDFLAGS) $(SOLINK) $^ $(PTHREAD_LIBS) $(LIBS)
+       $(CMD_PREFIX) $(CC) $(STATIC_BUILD) -o $@ $(CC_LDFLAGS_SO) $^ $(CC_LIBS)
 
 %.so: %.oo
        $(ECHO_PREFIX) echo "   [LDXX] $^ -> $@"
-       $(CMD_PREFIX) $(CXX) $(STATIC_BUILD) -o $@ $(PTHREAD_CFLAGS) $(ASTLDFLAGS) $(SOLINK) $^ $(PTHREAD_LIBS) $(LIBS)
+       $(CMD_PREFIX) $(CXX) $(STATIC_BUILD) -o $@ $(CXX_LDFLAGS_SO) $^ $(CXX_LIBS)
 
 %: %.o
        $(ECHO_PREFIX) echo "   [LD] $^ -> $@"
-       $(CMD_PREFIX) $(CXX) $(STATIC_BUILD) -o $@ $(PTHREAD_CFLAGS) $(ASTLDFLAGS) $^ $(PTHREAD_LIBS) $(LIBS)
+       $(CMD_PREFIX) $(CXX) $(STATIC_BUILD) -o $@ $(PTHREAD_CFLAGS) $(ASTLDFLAGS) $^ $(CXX_LIBS)
 
 dist-clean:: clean
index 85478225b8ee57abf06b43b7c7e22928499e764b..e277636e65bbb0dd52afbc68eae10c5fe3dd6c71 100644 (file)
@@ -14,4 +14,4 @@ portinfo: portinfo.o
        $(CC) -o $@ $^ -lisdnnet -lmISDN -lpthread
 
 clean: 
-       rm -rf *.a *.o *.so portinfo
+       rm -rf *.a *.o *.so portinfo *.i
index b83f9a0698cbe6259e171b0bdbb5acf129396357..8121b05a6c5813dcdf2de15e375d2aad03db212a 100644 (file)
@@ -477,7 +477,7 @@ clean:      semi-clean
                        $(TOAST) $(TCAT) $(UNTOAST)     \
                        $(ROOT)/gsm-1.0.tar.Z
                rm -rf lib
-               rm -f .*.d
+               rm -f .*.d *.i */*.i
 
 # Two tools that helped me generate gsm_encode.c and gsm_decode.c,
 # but aren't generally needed to port this.
index 4b9bb25d7fd03716df6dab907060b87bbbae0719..c9d29b36967148b58e5b26a4920801aa8f6ce1a2 100644 (file)
@@ -46,7 +46,7 @@ $(PROG): db_dump185.o $(LIBDBSO)
 clean-depend:
 
 clean:
-       rm -f $(LIBDB) $(LIBDBSO) $(OBJS) $(SHOBJS) *.s *.i
+       rm -f $(LIBDB) $(LIBDBSO) $(OBJS) $(SHOBJS) */*.s */*.i
 
 ASTCFLAGS:=-Wall -D__DBINTERFACE_PRIVATE -I. -I.. -Iinclude -Ihash -Ibtree -Irecno $(ASTCFLAGS)
 
index cbe3c48f70d5bf39d66dacb167b9f1165916e015..d4b7f0093832c741902db4b2d5c5e74e2f931448 100644 (file)
@@ -14,7 +14,7 @@ clean-depend:
        rm -f .depend
 
 clean: clean-depend
-       rm -f libtime.a *.o test
+       rm -f libtime.a *.o test *.i
 
 depend: .depend
 
index 161748b2da1273be9e17e1a5ef4b554c672ab5be..d92ac590cd44127da67cd80d0286a0f7685d2e44 100644 (file)
@@ -32,7 +32,7 @@ all: _all
 include $(ASTTOPDIR)/Makefile.moddir_rules
 
 clean::
-       rm -f ael/*.o
+       rm -f ael/*.o ael/*.i
 
 ael/ael_lex.o: ael/ael_lex.c ../include/asterisk/ael_structs.h ael/ael.tab.h
 ael/ael_lex.o: ASTCFLAGS+=-I. -Wno-unused
index aad078f23d3bf0d0f2b877c22c071f67d5534b7d..b289cbfffab2bb378187f53001c8a24d0e1c0930 100644 (file)
@@ -36,4 +36,4 @@ snmp/agent.o: ASTCFLAGS+=$(MENUSELECT_OPTS_res_snmp:%=-D%) $(foreach dep,$(MENUS
 $(if $(filter res_snmp,$(EMBEDDED_MODS)),modules.link,res_snmp.so): snmp/agent.o
 
 clean::
-       rm -f snmp/*.o
+       rm -f snmp/*.o snmp/*.i