From: Peter O. <obe...@us...> - 2006-02-21 15:07:19
|
Update of /cvsroot/ltp/utils/analysis/gcov-kernel/generic In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15821/generic Added Files: gcov-2.6.15-generic.patch Log Message: gcov-kernel: added patch for linux-2.6.15 (submitted by and...@gm...) --- NEW FILE: gcov-2.6.15-generic.patch --- diff -Naurp linux-2.6.15/Makefile linux-2.6.15-gcov/Makefile --- linux-2.6.15/Makefile 2006-02-06 18:33:57.000000000 +0000 +++ linux-2.6.15-gcov/Makefile 2006-02-06 20:26:03.000000000 +0000 @@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 15 -EXTRAVERSION = +EXTRAVERSION = -gcov NAME=Sliding Snow Leopard # *DOCUMENTATION* @@ -65,6 +65,7 @@ ifdef M endif endif +GCOV_FLAGS = -fprofile-arcs -ftest-coverage # kbuild supports saving output files in a separate directory. # To locate output files in a separate directory two syntaxes are supported. @@ -346,9 +347,9 @@ AFLAGS_KERNEL = # Use LINUXINCLUDE when you must reference the include/ directory. # Needed to be compatible with the O= option -LINUXINCLUDE := -Iinclude \ - $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include) \ - -include include/linux/autoconf.h +LINUXINCLUDE := -I$(objtree)/include -I$(srctree) -I$(objtree) \ + $(if $(KBUILD_SRC),-I$(objtree)/include2 -I$(srctree)/include) \ + -include include/linux/autoconf.h CPPFLAGS := -D__KERNEL__ $(LINUXINCLUDE) @@ -365,6 +366,7 @@ export VERSION PATCHLEVEL SUBLEVEL EXTRA export CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS LDFLAGS export CFLAGS CFLAGS_KERNEL CFLAGS_MODULE export AFLAGS AFLAGS_KERNEL AFLAGS_MODULE +export CFLAGS_NOGCOV GCOV_FLAGS # When compiling out-of-tree modules, put MODVERDIR in the module # tree rather than in the kernel tree. The kernel tree might @@ -904,6 +906,11 @@ depend dep: # --------------------------------------------------------------------------- # Modules +CFLAGS_NOGCOV := $(CFLAGS) +ifdef CONFIG_GCOV_ALL +CFLAGS += $(GCOV_FLAGS) +endif + ifdef CONFIG_MODULES # By default, build modules as well @@ -1005,6 +1012,8 @@ clean: archclean $(clean-dirs) $(call cmd,rmfiles) @find . $(RCS_FIND_IGNORE) \ \( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \ + -o -name '*.bb' -o -name '*.bbg' -o -name '*.da' \ + -o -name '*.gcno' -o -name '*.gcda' \ -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \) \ -type f -print | xargs rm -f diff -Naurp linux-2.6.15/drivers/Makefile linux-2.6.15-gcov/drivers/Makefile --- linux-2.6.15/drivers/Makefile 2006-02-06 18:33:59.000000000 +0000 +++ linux-2.6.15-gcov/drivers/Makefile 2006-02-06 20:25:41.000000000 +0000 @@ -67,6 +67,7 @@ obj-$(CONFIG_CPU_FREQ) += cpufreq/ obj-$(CONFIG_MMC) += mmc/ obj-$(CONFIG_INFINIBAND) += infiniband/ obj-$(CONFIG_SGI_IOC4) += sn/ +obj-$(CONFIG_GCOV_PROFILE) += gcov/ obj-y += firmware/ obj-$(CONFIG_CRYPTO) += crypto/ obj-$(CONFIG_SUPERH) += sh/ diff -Naurp linux-2.6.15/include/linux/module.h linux-2.6.15-gcov/include/linux/module.h --- linux-2.6.15/include/linux/module.h 2006-02-06 18:20:57.000000000 +0000 +++ linux-2.6.15-gcov/include/linux/module.h 2006-02-06 20:25:41.000000000 +0000 @@ -313,6 +313,11 @@ struct module /* The command line arguments (may be mangled). People like keeping pointers to this stuff */ char *args; + + #ifdef CONFIG_GCOV_PROFILE + const char *ctors_start; /* Pointer to start of .ctors-section */ + const char *ctors_end; /* Pointer to end of .ctors-section */ + #endif }; /* FIXME: It'd be nice to isolate modules during init, too, so they diff -Naurp linux-2.6.15/kernel/module.c linux-2.6.15-gcov/kernel/module.c --- linux-2.6.15/kernel/module.c 2006-02-06 18:20:57.000000000 +0000 +++ linux-2.6.15-gcov/kernel/module.c 2006-02-06 20:25:41.000000000 +0000 @@ -41,6 +41,7 @@ #include <asm/uaccess.h> #include <asm/semaphore.h> #include <asm/cacheflush.h> +#include <linux/gcov.h> #if 0 #define DEBUGP printk @@ -1175,6 +1176,11 @@ static void free_module(struct module *m /* Arch-specific cleanup. */ module_arch_cleanup(mod); +#ifdef CONFIG_GCOV_PROFILE + if (mod->ctors_start && mod->ctors_end) + remove_bb_link(mod); +#endif + /* Module unload stuff */ module_unload_free(mod); @@ -1709,6 +1715,13 @@ static struct module *load_module(void _ /* Module has been moved. */ mod = (void *)sechdrs[modindex].sh_addr; +#ifdef CONFIG_GCOV_PROFILE + modindex = find_sec(hdr, sechdrs, secstrings, ".ctors"); + mod->ctors_start = (char *)sechdrs[modindex].sh_addr; + mod->ctors_end = (char *)(mod->ctors_start + + sechdrs[modindex].sh_size); +#endif + /* Now we've moved module, initialize linked lists, etc. */ module_unload_init(mod); @@ -1909,6 +1922,12 @@ sys_init_module(void __user *umod, notifier_call_chain(&module_notify_list, MODULE_STATE_COMING, mod); up(¬ify_mutex); +#ifdef CONFIG_GCOV_PROFILE + if (mod->ctors_start && mod->ctors_end) { + do_global_ctors(mod->ctors_start, mod->ctors_end, mod); + } +#endif + /* Start the module */ if (mod->init != NULL) ret = mod->init(); diff -Naurp linux-2.6.15/scripts/Makefile.build linux-2.6.15-gcov/scripts/Makefile.build --- linux-2.6.15/scripts/Makefile.build 2006-02-06 18:20:57.000000000 +0000 +++ linux-2.6.15-gcov/scripts/Makefile.build 2006-02-06 20:25:41.000000000 +0000 @@ -146,7 +146,8 @@ cmd_cc_i_c = $(CPP) $(c_flags) - quiet_cmd_cc_o_c = CC $(quiet_modtag) $@ ifndef CONFIG_MODVERSIONS -cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $< +cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ \ + $(if $(filter-out /%,$<),$(srctree)/$<,$<) else # When module versioning is enabled the following steps are executed: @@ -161,7 +162,8 @@ else # replace the unresolved symbols __crc_exported_symbol with # the actual value of the checksum generated by genksyms -cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $< +cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) \ + $(if $(filter-out /%,$<),$(srctree)/$<,$<) cmd_modversions = \ if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \ $(CPP) -D__GENKSYMS__ $(c_flags) $< \ diff -Naurp linux-2.6.15/scripts/Makefile.lib linux-2.6.15-gcov/scripts/Makefile.lib --- linux-2.6.15/scripts/Makefile.lib 2006-02-06 18:20:57.000000000 +0000 +++ linux-2.6.15-gcov/scripts/Makefile.lib 2006-02-06 20:25:41.000000000 +0000 @@ -91,14 +91,15 @@ _cpp_flags = $(CPPFLAGS) $(EXTRA_CPP # If building the kernel in a separate objtree expand all occurrences # of -Idir to -I$(srctree)/dir except for absolute paths (starting with '/'). -ifeq ($(KBUILD_SRC),) +ifeq ($(KBUILD_SRC)$(CONFIG_GCOV_PROFILE),) __c_flags = $(_c_flags) __a_flags = $(_a_flags) __cpp_flags = $(_cpp_flags) else # Prefix -I with $(srctree) if it is not an absolute path -addtree = $(if $(filter-out -I/%,$(1)),$(patsubst -I%,-I$(srctree)/%,$(1))) $(1) +addtree = $(if $(filter-out -I/%,$(1)),$(patsubst -I%,-I$(srctree)/%,$(1)),$(1)) +addtree2 = $(if $(filter-out -I/%,$(1)),$(patsubst -I%,-I$(objtree)/%,$(1)),$(1)) # Find all -I options and call addtree flags = $(foreach o,$($(1)),$(if $(filter -I%,$(o)),$(call addtree,$(o)),$(o))) @@ -106,7 +107,7 @@ flags = $(foreach o,$($(1)),$(if $(filte # $(call addtree,-I$(obj)) locates .h files in srctree, from generated .c files # and locates generated .h files # FIXME: Replace both with specific CFLAGS* statements in the makefiles -__c_flags = $(call addtree,-I$(obj)) $(call flags,_c_flags) +__c_flags = $(call addtree,-I$(obj)) $(call addtree2,-I$(obj)) $(call flags,_c_flags) __a_flags = $(call flags,_a_flags) __cpp_flags = $(call flags,_cpp_flags) endif |