Commit 96faec94 authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild-next

* git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild-next: (25 commits)
  allow stripping of generated symbols under CONFIG_KALLSYMS_ALL
  kbuild: strip generated symbols from *.ko
  kbuild: simplify use of genksyms
  kernel-doc: check for extra kernel-doc notations
  kbuild: add headerdep used to detect inclusion cycles in header files
  kbuild: fix string equality testing in tags.sh
  kbuild: fix make tags/cscope
  kbuild: fix make incompatibility
  kbuild: remove TAR_IGNORE
  setlocalversion: add git-svn support
  setlocalversion: print correct subversion revision
  scripts: improve the decodecode script
  scripts/package: allow custom options to rpm
  genksyms: allow to ignore symbol checksum changes
  genksyms: track symbol checksum changes
  tags and cscope support really belongs in a shell script
  kconfig: fix options to check-lxdialog.sh
  kbuild: gen_init_cpio expands shell variables in file names
  remove bashisms from scripts/extract-ikconfig
  kbuild: teach mkmakfile to be silent
  ...
parents 29263285 9bb48247
...@@ -383,6 +383,20 @@ more details, with real examples. ...@@ -383,6 +383,20 @@ more details, with real examples.
to prerequisites are referenced with $(src) (because they are not to prerequisites are referenced with $(src) (because they are not
generated files). generated files).
$(kecho)
echoing information to user in a rule is often a good practice
but when execution "make -s" one does not expect to see any output
except for warnings/errors.
To support this kbuild define $(kecho) which will echo out the
text following $(kecho) to stdout except if "make -s" is used.
Example:
#arch/blackfin/boot/Makefile
$(obj)/vmImage: $(obj)/vmlinux.gz
$(call if_changed,uimage)
@$(kecho) 'Kernel: $@ is ready'
--- 3.11 $(CC) support functions --- 3.11 $(CC) support functions
The kernel may be built with several different versions of The kernel may be built with several different versions of
......
This diff is collapsed.
...@@ -25,7 +25,7 @@ $(obj)/vmlinux.gz: $(obj)/vmlinux.bin FORCE ...@@ -25,7 +25,7 @@ $(obj)/vmlinux.gz: $(obj)/vmlinux.bin FORCE
$(obj)/vmImage: $(obj)/vmlinux.gz $(obj)/vmImage: $(obj)/vmlinux.gz
$(call if_changed,uimage) $(call if_changed,uimage)
@echo 'Kernel: $@ is ready' @$(kecho) 'Kernel: $@ is ready'
install: install:
sh $(srctree)/$(src)/install.sh $(KERNELRELEASE) $(BOOTIMAGE) System.map "$(INSTALL_PATH)" sh $(srctree)/$(src)/install.sh $(KERNELRELEASE) $(BOOTIMAGE) System.map "$(INSTALL_PATH)"
__cpu_vendor_dev_X86_VENDOR_*
...@@ -588,6 +588,13 @@ config KALLSYMS_ALL ...@@ -588,6 +588,13 @@ config KALLSYMS_ALL
Say N. Say N.
config KALLSYMS_STRIP_GENERATED
bool "Strip machine generated symbols from kallsyms"
depends on KALLSYMS_ALL
default y
help
Say N if you want kallsyms to retain even machine generated symbols.
config KALLSYMS_EXTRA_PASS config KALLSYMS_EXTRA_PASS
bool "Do an extra kallsyms pass" bool "Do an extra kallsyms pass"
depends on KALLSYMS depends on KALLSYMS
......
...@@ -30,20 +30,19 @@ ...@@ -30,20 +30,19 @@
#define all_var 0 #define all_var 0
#endif #endif
/* These will be re-linked against their real values during the second link stage */ extern const unsigned long kallsyms_addresses[];
extern const unsigned long kallsyms_addresses[] __attribute__((weak)); extern const u8 kallsyms_names[];
extern const u8 kallsyms_names[] __attribute__((weak));
/* tell the compiler that the count isn't in the small data section if the arch /* tell the compiler that the count isn't in the small data section if the arch
* has one (eg: FRV) * has one (eg: FRV)
*/ */
extern const unsigned long kallsyms_num_syms extern const unsigned long kallsyms_num_syms
__attribute__((weak, section(".rodata"))); __attribute__((__section__(".rodata")));
extern const u8 kallsyms_token_table[] __attribute__((weak)); extern const u8 kallsyms_token_table[];
extern const u16 kallsyms_token_index[] __attribute__((weak)); extern const u16 kallsyms_token_index[];
extern const unsigned long kallsyms_markers[] __attribute__((weak)); extern const unsigned long kallsyms_markers[];
static inline int is_kernel_inittext(unsigned long addr) static inline int is_kernel_inittext(unsigned long addr)
{ {
...@@ -168,9 +167,6 @@ static unsigned long get_symbol_pos(unsigned long addr, ...@@ -168,9 +167,6 @@ static unsigned long get_symbol_pos(unsigned long addr,
unsigned long symbol_start = 0, symbol_end = 0; unsigned long symbol_start = 0, symbol_end = 0;
unsigned long i, low, high, mid; unsigned long i, low, high, mid;
/* This kernel should never had been booted. */
BUG_ON(!kallsyms_addresses);
/* do a binary search on the sorted kallsyms_addresses array */ /* do a binary search on the sorted kallsyms_addresses array */
low = 0; low = 0;
high = kallsyms_num_syms; high = kallsyms_num_syms;
......
...@@ -24,6 +24,13 @@ basetarget = $(basename $(notdir $@)) ...@@ -24,6 +24,13 @@ basetarget = $(basename $(notdir $@))
# Escape single quote for use in echo statements # Escape single quote for use in echo statements
escsq = $(subst $(squote),'\$(squote)',$1) escsq = $(subst $(squote),'\$(squote)',$1)
###
# Easy method for doing a status message
kecho := :
quiet_kecho := echo
silent_kecho := :
kecho := $($(quiet)kecho)
### ###
# filechk is used to check if the content of a generated file is updated. # filechk is used to check if the content of a generated file is updated.
# Sample usage: # Sample usage:
...@@ -39,22 +46,15 @@ escsq = $(subst $(squote),'\$(squote)',$1) ...@@ -39,22 +46,15 @@ escsq = $(subst $(squote),'\$(squote)',$1)
# - If they are equal no change, and no timestamp update # - If they are equal no change, and no timestamp update
# - stdin is piped in from the first prerequisite ($<) so one has # - stdin is piped in from the first prerequisite ($<) so one has
# to specify a valid file as first prerequisite (often the kbuild file) # to specify a valid file as first prerequisite (often the kbuild file)
chk_filechk = :
quiet_chk_filechk = echo ' CHK $@'
silent_chk_filechk = :
upd_filechk = :
quiet_upd_filechk = echo ' UPD $@'
silent_upd_filechk = :
define filechk define filechk
$(Q)set -e; \ $(Q)set -e; \
$($(quiet)chk_filechk); \ $(kecho) ' CHK $@'; \
mkdir -p $(dir $@); \ mkdir -p $(dir $@); \
$(filechk_$(1)) < $< > $@.tmp; \ $(filechk_$(1)) < $< > $@.tmp; \
if [ -r $@ ] && cmp -s $@ $@.tmp; then \ if [ -r $@ ] && cmp -s $@ $@.tmp; then \
rm -f $@.tmp; \ rm -f $@.tmp; \
else \ else \
$($(quiet)upd_filechk); \ $(kecho) ' UPD $@'; \
mv -f $@.tmp $@; \ mv -f $@.tmp $@; \
fi fi
endef endef
...@@ -144,7 +144,9 @@ ld-option = $(call try-run,\ ...@@ -144,7 +144,9 @@ ld-option = $(call try-run,\
build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj
# Prefix -I with $(srctree) if it is not an absolute path. # Prefix -I with $(srctree) if it is not an absolute path.
addtree = $(if $(filter-out -I/%,$(1)),$(patsubst -I%,-I$(srctree)/%,$(1))) $(1) # skip if -I has no parameter
addtree = $(if $(patsubst -I%,%,$(1)), \
$(if $(filter-out -I/%,$(1)),$(patsubst -I%,-I$(srctree)/%,$(1))) $(1))
# Find all -I options and call addtree # Find all -I options and call addtree
flags = $(foreach o,$($(1)),$(if $(filter -I%,$(o)),$(call addtree,$(o)),$(o))) flags = $(foreach o,$($(1)),$(if $(filter -I%,$(o)),$(call addtree,$(o)),$(o)))
......
...@@ -151,14 +151,20 @@ cmd_cc_i_c = $(CPP) $(c_flags) -o $@ $< ...@@ -151,14 +151,20 @@ cmd_cc_i_c = $(CPP) $(c_flags) -o $@ $<
$(obj)/%.i: $(src)/%.c FORCE $(obj)/%.i: $(src)/%.c FORCE
$(call if_changed_dep,cc_i_c) $(call if_changed_dep,cc_i_c)
cmd_genksyms = \
$(CPP) -D__GENKSYMS__ $(c_flags) $< | \
$(GENKSYMS) -T $@ -A -a $(ARCH) \
$(if $(KBUILD_PRESERVE),-p) \
$(if $(1),-r $(firstword $(wildcard $(@:.symtypes=.symref) /dev/null)))
quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@ quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@
cmd_cc_symtypes_c = \ cmd_cc_symtypes_c = \
$(CPP) -D__GENKSYMS__ $(c_flags) $< \ set -e; \
| $(GENKSYMS) -T $@ >/dev/null; \ $(call cmd_genksyms, true) >/dev/null; \
test -s $@ || rm -f $@ test -s $@ || rm -f $@
$(obj)/%.symtypes : $(src)/%.c FORCE $(obj)/%.symtypes : $(src)/%.c FORCE
$(call if_changed_dep,cc_symtypes_c) $(call cmd,cc_symtypes_c)
# C (.c) files # C (.c) files
# The C file is compiled and updated dependency information is generated. # The C file is compiled and updated dependency information is generated.
...@@ -171,30 +177,38 @@ cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $< ...@@ -171,30 +177,38 @@ cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
else else
# When module versioning is enabled the following steps are executed: # When module versioning is enabled the following steps are executed:
# o compile a .tmp_<file>.o from <file>.c # o compile a .tmp_<file>.s from <file>.c
# o if .tmp_<file>.o doesn't contain a __ksymtab version, i.e. does # o if .tmp_<file>.s doesn't contain a __ksymtab version, i.e. does
# not export symbols, we just rename .tmp_<file>.o to <file>.o and # not export symbols, we just assemble .tmp_<file>.s to <file>.o and
# are done. # are done.
# o otherwise, we calculate symbol versions using the good old # o otherwise, we calculate symbol versions using the good old
# genksyms on the preprocessed source and postprocess them in a way # genksyms on the preprocessed source and postprocess them in a way
# that they are usable as a linker script # that they are usable as assembly source
# o generate <file>.o from .tmp_<file>.o using the linker to # o assemble <file>.o from .tmp_<file>.s forcing inclusion of directives
# replace the unresolved symbols __crc_exported_symbol with # defining the actual values of __crc_*, followed by objcopy-ing them
# the actual value of the checksum generated by genksyms # to force these symbols to be local to permit stripping them later.
s_file = $(@D)/.tmp_$(@F:.o=.s)
v_file = $(@D)/.tmp_$(@F:.o=.v)
tmp_o_file = $(@D)/.tmp_$(@F)
no_g_c_flags = $(filter-out -g%,$(c_flags))
cmd_cc_o_c = $(CC) $(c_flags) -S -o $(s_file) $<
cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $<
cmd_modversions = \ cmd_modversions = \
if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \ if grep -q __ksymtab $(s_file); then \
$(CPP) -D__GENKSYMS__ $(c_flags) $< \ if $(call cmd_genksyms, $(KBUILD_SYMTYPES)) > $(v_file) \
| $(GENKSYMS) $(if $(KBUILD_SYMTYPES), \ && $(CC) $(no_g_c_flags) -c -Wa,$(v_file) \
-T $(@D)/$(@F:.o=.symtypes)) -a $(ARCH) \ -o $(tmp_o_file) $(s_file) \
> $(@D)/.tmp_$(@F:.o=.ver); \ && $(OBJCOPY) -L '__crc_*' -L '___crc_*' -w \
\ $(tmp_o_file) $@; \
$(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) \ then \
-T $(@D)/.tmp_$(@F:.o=.ver); \ : ; \
rm -f $(@D)/.tmp_$(@F) $(@D)/.tmp_$(@F:.o=.ver); \ else \
rm -f $@; exit 1; \
fi; \
else \ else \
mv -f $(@D)/.tmp_$(@F) $@; \ rm -f $(v_file); \
$(CC) $(no_g_c_flags) -c -o $@ $(s_file); \
fi; fi;
endif endif
...@@ -211,7 +225,12 @@ define rule_cc_o_c ...@@ -211,7 +225,12 @@ define rule_cc_o_c
$(cmd_record_mcount) \ $(cmd_record_mcount) \
scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' > \ scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' > \
$(dot-target).tmp; \ $(dot-target).tmp; \
rm -f $(depfile); \ if [ -r $(@D)/.tmp_$(@F:.o=.v) ]; then \
echo >> $(dot-target).tmp; \
echo '$@: $(GENKSYMS)' >> $(dot-target).tmp; \
echo '$(GENKSYMS):: ;' >> $(dot-target).tmp; \
fi; \
rm -f $(depfile) $(@D)/.tmp_$(@F:.o=.?); \
mv -f $(dot-target).tmp $(dot-target).cmd mv -f $(dot-target).tmp $(dot-target).cmd
endef endef
......
...@@ -104,9 +104,11 @@ else ...@@ -104,9 +104,11 @@ else
debug_flags = debug_flags =
endif endif
orig_c_flags = $(KBUILD_CFLAGS) $(ccflags-y) $(CFLAGS_$(basetarget).o) orig_c_flags = $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) \
$(ccflags-y) $(CFLAGS_$(basetarget).o)
_c_flags = $(filter-out $(CFLAGS_REMOVE_$(basetarget).o), $(orig_c_flags)) _c_flags = $(filter-out $(CFLAGS_REMOVE_$(basetarget).o), $(orig_c_flags))
_a_flags = $(KBUILD_AFLAGS) $(asflags-y) $(AFLAGS_$(basetarget).o) _a_flags = $(KBUILD_CPPFLAGS) $(KBUILD_AFLAGS) \
$(asflags-y) $(AFLAGS_$(basetarget).o)
_cpp_flags = $(KBUILD_CPPFLAGS) $(cppflags-y) $(CPPFLAGS_$(@F)) _cpp_flags = $(KBUILD_CPPFLAGS) $(cppflags-y) $(CPPFLAGS_$(@F))
# If building the kernel in a separate objtree expand all occurrences # If building the kernel in a separate objtree expand all occurrences
...@@ -127,15 +129,16 @@ __a_flags = $(call flags,_a_flags) ...@@ -127,15 +129,16 @@ __a_flags = $(call flags,_a_flags)
__cpp_flags = $(call flags,_cpp_flags) __cpp_flags = $(call flags,_cpp_flags)
endif endif
c_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(KBUILD_CPPFLAGS) \ c_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \
$(__c_flags) $(modkern_cflags) \ $(__c_flags) $(modkern_cflags) \
-D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags) \ -D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags) \
$(debug_flags) $(debug_flags)
a_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(KBUILD_CPPFLAGS) \ a_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \
$(__a_flags) $(modkern_aflags) $(__a_flags) $(modkern_aflags)
cpp_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(__cpp_flags) cpp_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \
$(__cpp_flags)
ld_flags = $(LDFLAGS) $(ldflags-y) ld_flags = $(LDFLAGS) $(ldflags-y)
......
...@@ -17,7 +17,8 @@ __modinst: $(modules) ...@@ -17,7 +17,8 @@ __modinst: $(modules)
@: @:
quiet_cmd_modules_install = INSTALL $@ quiet_cmd_modules_install = INSTALL $@
cmd_modules_install = mkdir -p $(2); cp $@ $(2) ; $(mod_strip_cmd) $(2)/$(notdir $@) cmd_modules_install = mkdir -p $(2); \
$(mod_strip_cmd) $@ $(2)/$(notdir $@) || cp $@ $(2)
# Modules built outside the kernel source tree go into extra by default # Modules built outside the kernel source tree go into extra by default
INSTALL_MOD_DIR ?= extra INSTALL_MOD_DIR ?= extra
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
# AFLAGS=--32 decodecode < 386.oops # AFLAGS=--32 decodecode < 386.oops
cleanup() { cleanup() {
rm -f $T $T.s $T.o rm -f $T $T.s $T.o $T.oo $T.aa $T.aaa
exit 1 exit 1
} }
...@@ -44,21 +44,33 @@ if [ $marker -eq 0 ]; then ...@@ -44,21 +44,33 @@ if [ $marker -eq 0 ]; then
marker=`expr index "$code" "\("` marker=`expr index "$code" "\("`
fi fi
touch $T.oo
if [ $marker -ne 0 ]; then if [ $marker -ne 0 ]; then
beforemark=`echo "$code" | cut -c-$((${marker} - 1))` echo All code >> $T.oo
echo ======== >> $T.oo
beforemark=`echo "$code"`
echo -n " .byte 0x" > $T.s echo -n " .byte 0x" > $T.s
echo $beforemark | sed -e 's/ /,0x/g' >> $T.s echo $beforemark | sed -e 's/ /,0x/g' | sed -e 's/<//g' | sed -e 's/>//g' >> $T.s
as $AFLAGS -o $T.o $T.s as $AFLAGS -o $T.o $T.s &> /dev/null
objdump -S $T.o objdump -S $T.o | grep -v "/tmp" | grep -v "Disassembly" | grep -v "\.text" | grep -v "^$" &> $T.ooo
rm $T.o $T.s cat $T.ooo >> $T.oo
rm -f $T.o $T.s $T.ooo
# and fix code at-and-after marker # and fix code at-and-after marker
code=`echo "$code" | cut -c$((${marker} + 1))-` code=`echo "$code" | cut -c$((${marker} + 1))-`
fi fi
echo Code starting with the faulting instruction > $T.aa
echo =========================================== >> $T.aa
code=`echo $code | sed -e 's/ [<(]/ /;s/[>)] / /;s/ /,0x/g'` code=`echo $code | sed -e 's/ [<(]/ /;s/[>)] / /;s/ /,0x/g'`
echo -n " .byte 0x" > $T.s echo -n " .byte 0x" > $T.s
echo $code >> $T.s echo $code >> $T.s
as $AFLAGS -o $T.o $T.s as $AFLAGS -o $T.o $T.s &> /dev/null
objdump -S $T.o objdump -S $T.o | grep -v "Disassembly" | grep -v "/tmp" | grep -v "\.text" | grep -v "^$" &> $T.aaa
rm $T $T.s $T.o cat $T.aaa >> $T.aa
faultline=`cat $T.aaa | head -1 | cut -d":" -f2`
cat $T.oo | sed -e "s/\($faultline\)/\*\1 <-- trapping instruction/g"
echo
cat $T.aa
cleanup
...@@ -8,8 +8,8 @@ test -e $binoffset || cc -o $binoffset ./scripts/binoffset.c || exit 1 ...@@ -8,8 +8,8 @@ test -e $binoffset || cc -o $binoffset ./scripts/binoffset.c || exit 1
IKCFG_ST="0x49 0x4b 0x43 0x46 0x47 0x5f 0x53 0x54" IKCFG_ST="0x49 0x4b 0x43 0x46 0x47 0x5f 0x53 0x54"
IKCFG_ED="0x49 0x4b 0x43 0x46 0x47 0x5f 0x45 0x44" IKCFG_ED="0x49 0x4b 0x43 0x46 0x47 0x5f 0x45 0x44"
function dump_config { dump_config() {
typeset file="$1" file="$1"
start=`$binoffset $file $IKCFG_ST 2>/dev/null` start=`$binoffset $file $IKCFG_ST 2>/dev/null`
[ "$?" != "0" ] && start="-1" [ "$?" != "0" ] && start="-1"
...@@ -18,8 +18,8 @@ function dump_config { ...@@ -18,8 +18,8 @@ function dump_config {
fi fi
end=`$binoffset $file $IKCFG_ED 2>/dev/null` end=`$binoffset $file $IKCFG_ED 2>/dev/null`
let start="$start + 8" start=`expr $start + 8`
let size="$end - $start" size=`expr $end - $start`
dd if="$file" ibs=1 skip="$start" count="$size" 2>/dev/null | zcat dd if="$file" ibs=1 skip="$start" count="$size" 2>/dev/null | zcat
......
This diff is collapsed.
...@@ -29,6 +29,10 @@ enum symbol_type { ...@@ -29,6 +29,10 @@ enum symbol_type {
SYM_NORMAL, SYM_TYPEDEF, SYM_ENUM, SYM_STRUCT, SYM_UNION SYM_NORMAL, SYM_TYPEDEF, SYM_ENUM, SYM_STRUCT, SYM_UNION
}; };
enum symbol_status {
STATUS_UNCHANGED, STATUS_DEFINED, STATUS_MODIFIED
};
struct string_list { struct string_list {
struct string_list *next; struct string_list *next;
enum symbol_type tag; enum symbol_type tag;
...@@ -43,6 +47,9 @@ struct symbol { ...@@ -43,6 +47,9 @@ struct symbol {
struct symbol *expansion_trail; struct symbol *expansion_trail;
struct symbol *visited; struct symbol *visited;
int is_extern; int is_extern;
int is_declared;
enum symbol_status status;
int is_override;
}; };
typedef struct string_list **yystype; typedef struct string_list **yystype;
......
/* ANSI-C code produced by gperf version 3.0.2 */ /* ANSI-C code produced by gperf version 3.0.1 */
/* Command-line: gperf -L ANSI-C -a -C -E -g -H is_reserved_hash -k '1,3,$' -N is_reserved_word -p -t scripts/genksyms/keywords.gperf */ /* Command-line: gperf -L ANSI-C -a -C -E -g -H is_reserved_hash -k '1,3,$' -N is_reserved_word -p -t scripts/genksyms/keywords.gperf */
#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
#line 3 "scripts/genksyms/keywords.gperf" #line 3 "scripts/genksyms/keywords.gperf"
struct resword { const char *name; int token; }; struct resword { const char *name; int token; };
/* maximum key range = 62, duplicates = 0 */ /* maximum key range = 64, duplicates = 0 */
#ifdef __GNUC__ #ifdef __GNUC__
__inline __inline
...@@ -46,32 +46,32 @@ is_reserved_hash (register const char *str, register unsigned int len) ...@@ -46,32 +46,32 @@ is_reserved_hash (register const char *str, register unsigned int len)
{ {
static const unsigned char asso_values[] = static const unsigned char asso_values[] =
{ {
65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
65, 65, 65, 65, 65, 65, 65, 65, 65, 5, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0,
65, 65, 65, 65, 65, 65, 35, 65, 65, 65, 67, 67, 67, 67, 67, 67, 15, 67, 67, 67,
0, 65, 65, 65, 65, 65, 65, 65, 65, 65, 0, 67, 67, 67, 67, 67, 67, 67, 67, 67,
65, 65, 65, 65, 65, 0, 65, 0, 65, 5, 67, 67, 67, 67, 67, 0, 67, 0, 67, 5,
20, 15, 10, 30, 65, 15, 65, 65, 20, 0, 25, 20, 15, 30, 67, 15, 67, 67, 10, 0,
10, 35, 20, 65, 10, 5, 0, 10, 5, 65, 10, 40, 20, 67, 10, 5, 0, 10, 15, 67,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
65, 65, 65, 65, 65, 65 67, 67, 67, 67, 67, 67
}; };
return len + asso_values[(unsigned char)str[2]] + asso_values[(unsigned char)str[0]] + asso_values[(unsigned char)str[len - 1]]; return len + asso_values[(unsigned char)str[2]] + asso_values[(unsigned char)str[0]] + asso_values[(unsigned char)str[len - 1]];
} }
...@@ -84,116 +84,119 @@ is_reserved_word (register const char *str, register unsigned int len) ...@@ -84,116 +84,119 @@ is_reserved_word (register const char *str, register unsigned int len)
{ {
enum enum
{ {
TOTAL_KEYWORDS = 43, TOTAL_KEYWORDS = 45,
MIN_WORD_LENGTH = 3, MIN_WORD_LENGTH = 3,
MAX_WORD_LENGTH = 24, MAX_WORD_LENGTH = 24,
MIN_HASH_VALUE = 3, MIN_HASH_VALUE = 3,
MAX_HASH_VALUE = 64 MAX_HASH_VALUE = 66
}; };
static const struct resword wordlist[] = static const struct resword wordlist[] =
{ {
{""}, {""}, {""}, {""}, {""}, {""},
#line 26 "scripts/genksyms/keywords.gperf" #line 28 "scripts/genksyms/keywords.gperf"
{"asm", ASM_KEYW}, {"asm", ASM_KEYW},
{""}, {""},
#line 8 "scripts/genksyms/keywords.gperf" #line 10 "scripts/genksyms/keywords.gperf"
{"__asm", ASM_KEYW}, {"__asm", ASM_KEYW},
{""}, {""},
#line 9 "scripts/genksyms/keywords.gperf" #line 11 "scripts/genksyms/keywords.gperf"
{"__asm__", ASM_KEYW}, {"__asm__", ASM_KEYW},
{""}, {""}, {""}, {""},
#line 52 "scripts/genksyms/keywords.gperf" #line 54 "scripts/genksyms/keywords.gperf"
{"__typeof__", TYPEOF_KEYW}, {"__typeof__", TYPEOF_KEYW},
{""}, {""},
#line 12 "scripts/genksyms/keywords.gperf" #line 14 "scripts/genksyms/keywords.gperf"
{"__const", CONST_KEYW}, {"__const", CONST_KEYW},
#line 11 "scripts/genksyms/keywords.gperf"
{"__attribute__", ATTRIBUTE_KEYW},
#line 13 "scripts/genksyms/keywords.gperf" #line 13 "scripts/genksyms/keywords.gperf"
{"__attribute__", ATTRIBUTE_KEYW},
#line 15 "scripts/genksyms/keywords.gperf"
{"__const__", CONST_KEYW}, {"__const__", CONST_KEYW},
#line 18 "scripts/genksyms/keywords.gperf" #line 20 "scripts/genksyms/keywords.gperf"
{"__signed__", SIGNED_KEYW}, {"__signed__", SIGNED_KEYW},
#line 44 "scripts/genksyms/keywords.gperf" #line 46 "scripts/genksyms/keywords.gperf"
{"static", STATIC_KEYW}, {"static", STATIC_KEYW},
#line 20 "scripts/genksyms/keywords.gperf" {""},
{"__volatile__", VOLATILE_KEYW}, #line 41 "scripts/genksyms/keywords.gperf"
#line 39 "scripts/genksyms/keywords.gperf"
{"int", INT_KEYW}, {"int", INT_KEYW},
#line 32 "scripts/genksyms/keywords.gperf" #line 34 "scripts/genksyms/keywords.gperf"
{"char", CHAR_KEYW}, {"char", CHAR_KEYW},
#line 33 "scripts/genksyms/keywords.gperf" #line 35 "scripts/genksyms/keywords.gperf"
{"const", CONST_KEYW}, {"const", CONST_KEYW},
#line 45 "scripts/genksyms/keywords.gperf" #line 47 "scripts/genksyms/keywords.gperf"
{"struct", STRUCT_KEYW}, {"struct", STRUCT_KEYW},
#line 24 "scripts/genksyms/keywords.gperf" #line 26 "scripts/genksyms/keywords.gperf"
{"__restrict__", RESTRICT_KEYW}, {"__restrict__", RESTRICT_KEYW},
#line 25 "scripts/genksyms/keywords.gperf" #line 27 "scripts/genksyms/keywords.gperf"
{"restrict", RESTRICT_KEYW}, {"restrict", RESTRICT_KEYW},
#line 23 "scripts/genksyms/keywords.gperf" #line 7 "scripts/genksyms/keywords.gperf"
{"_restrict", RESTRICT_KEYW}, {"EXPORT_SYMBOL_GPL_FUTURE", EXPORT_SYMBOL_KEYW},
#line 16 "scripts/genksyms/keywords.gperf" #line 18 "scripts/genksyms/keywords.gperf"
{"__inline__", INLINE_KEYW}, {"__inline__", INLINE_KEYW},
#line 10 "scripts/genksyms/keywords.gperf"
{"__attribute", ATTRIBUTE_KEYW},
{""}, {""},
#line 14 "scripts/genksyms/keywords.gperf" #line 22 "scripts/genksyms/keywords.gperf"
{"__volatile__", VOLATILE_KEYW},
#line 5 "scripts/genksyms/keywords.gperf"
{"EXPORT_SYMBOL", EXPORT_SYMBOL_KEYW},
#line 25 "scripts/genksyms/keywords.gperf"
{"_restrict", RESTRICT_KEYW},
{""},
#line 12 "scripts/genksyms/keywords.gperf"
{"__attribute", ATTRIBUTE_KEYW},
#line 6 "scripts/genksyms/keywords.gperf"
{"EXPORT_SYMBOL_GPL", EXPORT_SYMBOL_KEYW},
#line 16 "scripts/genksyms/keywords.gperf"
{"__extension__", EXTENSION_KEYW}, {"__extension__", EXTENSION_KEYW},
#line 35 "scripts/genksyms/keywords.gperf" #line 37 "scripts/genksyms/keywords.gperf"
{"enum", ENUM_KEYW}, {"enum", ENUM_KEYW},
#line 19 "scripts/genksyms/keywords.gperf" #line 8 "scripts/genksyms/keywords.gperf"
{"__volatile", VOLATILE_KEYW}, {"EXPORT_UNUSED_SYMBOL", EXPORT_SYMBOL_KEYW},
#line 36 "scripts/genksyms/keywords.gperf" #line 38 "scripts/genksyms/keywords.gperf"
{"extern", EXTERN_KEYW}, {"extern", EXTERN_KEYW},
{""}, {""},
#line 17 "scripts/genksyms/keywords.gperf" #line 19 "scripts/genksyms/keywords.gperf"
{"__signed", SIGNED_KEYW}, {"__signed", SIGNED_KEYW},
#line 7 "scripts/genksyms/keywords.gperf" #line 9 "scripts/genksyms/keywords.gperf"
{"EXPORT_SYMBOL_GPL_FUTURE", EXPORT_SYMBOL_KEYW}, {"EXPORT_UNUSED_SYMBOL_GPL", EXPORT_SYMBOL_KEYW},
{""}, #line 49 "scripts/genksyms/keywords.gperf"
#line 51 "scripts/genksyms/keywords.gperf" {"union", UNION_KEYW},
#line 53 "scripts/genksyms/keywords.gperf"
{"typeof", TYPEOF_KEYW}, {"typeof", TYPEOF_KEYW},
#line 46 "scripts/genksyms/keywords.gperf" #line 48 "scripts/genksyms/keywords.gperf"
{"typedef", TYPEDEF_KEYW}, {"typedef", TYPEDEF_KEYW},
#line 15 "scripts/genksyms/keywords.gperf" #line 17 "scripts/genksyms/keywords.gperf"
{"__inline", INLINE_KEYW}, {"__inline", INLINE_KEYW},
#line 31 "scripts/genksyms/keywords.gperf" #line 33 "scripts/genksyms/keywords.gperf"
{"auto", AUTO_KEYW}, {"auto", AUTO_KEYW},
#line 47 "scripts/genksyms/keywords.gperf" #line 21 "scripts/genksyms/keywords.gperf"
{"union", UNION_KEYW}, {"__volatile", VOLATILE_KEYW},
{""}, {""},
#line 48 "scripts/genksyms/keywords.gperf"
{"unsigned", UNSIGNED_KEYW},
#line 49 "scripts/genksyms/keywords.gperf"
{"void", VOID_KEYW},
#line 42 "scripts/genksyms/keywords.gperf"
{"short", SHORT_KEYW},
{""}, {""}, {""}, {""},
#line 50 "scripts/genksyms/keywords.gperf" #line 50 "scripts/genksyms/keywords.gperf"
{"volatile", VOLATILE_KEYW}, {"unsigned", UNSIGNED_KEYW},
{""},
#line 37 "scripts/genksyms/keywords.gperf"
{"float", FLOAT_KEYW},
#line 34 "scripts/genksyms/keywords.gperf"
{"double", DOUBLE_KEYW},
{""}, {""},
#line 5 "scripts/genksyms/keywords.gperf" #line 44 "scripts/genksyms/keywords.gperf"
{"EXPORT_SYMBOL", EXPORT_SYMBOL_KEYW}, {"short", SHORT_KEYW},
{""}, {""}, #line 40 "scripts/genksyms/keywords.gperf"
#line 38 "scripts/genksyms/keywords.gperf"
{"inline", INLINE_KEYW}, {"inline", INLINE_KEYW},
#line 6 "scripts/genksyms/keywords.gperf"
{"EXPORT_SYMBOL_GPL", EXPORT_SYMBOL_KEYW},
#line 41 "scripts/genksyms/keywords.gperf"
{"register", REGISTER_KEYW},
{""}, {""},
#line 22 "scripts/genksyms/keywords.gperf" #line 52 "scripts/genksyms/keywords.gperf"
{"volatile", VOLATILE_KEYW},
#line 42 "scripts/genksyms/keywords.gperf"
{"long", LONG_KEYW},
#line 24 "scripts/genksyms/keywords.gperf"
{"_Bool", BOOL_KEYW}, {"_Bool", BOOL_KEYW},
#line 43 "scripts/genksyms/keywords.gperf"
{"signed", SIGNED_KEYW},
{""}, {""}, {""}, {""},
#line 40 "scripts/genksyms/keywords.gperf" #line 43 "scripts/genksyms/keywords.gperf"
{"long", LONG_KEYW} {"register", REGISTER_KEYW},
#line 51 "scripts/genksyms/keywords.gperf"
{"void", VOID_KEYW},
#line 39 "scripts/genksyms/keywords.gperf"
{"float", FLOAT_KEYW},
#line 36 "scripts/genksyms/keywords.gperf"
{"double", DOUBLE_KEYW},
{""}, {""}, {""}, {""},
#line 45 "scripts/genksyms/keywords.gperf"
{"signed", SIGNED_KEYW}
}; };
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
......
...@@ -5,6 +5,8 @@ struct resword { const char *name; int token; } ...@@ -5,6 +5,8 @@ struct resword { const char *name; int token; }
EXPORT_SYMBOL, EXPORT_SYMBOL_KEYW EXPORT_SYMBOL, EXPORT_SYMBOL_KEYW
EXPORT_SYMBOL_GPL, EXPORT_SYMBOL_KEYW EXPORT_SYMBOL_GPL, EXPORT_SYMBOL_KEYW
EXPORT_SYMBOL_GPL_FUTURE, EXPORT_SYMBOL_KEYW EXPORT_SYMBOL_GPL_FUTURE, EXPORT_SYMBOL_KEYW
EXPORT_UNUSED_SYMBOL, EXPORT_SYMBOL_KEYW
EXPORT_UNUSED_SYMBOL_GPL, EXPORT_SYMBOL_KEYW
__asm, ASM_KEYW __asm, ASM_KEYW
__asm__, ASM_KEYW __asm__, ASM_KEYW
__attribute, ATTRIBUTE_KEYW __attribute, ATTRIBUTE_KEYW
......
#! /usr/bin/perl
#
# Detect cycles in the header file dependency graph
# Vegard Nossum <vegardno@ifi.uio.no>
#
use strict;
use warnings;
use Getopt::Long;
my $opt_all;
my @opt_include;
my $opt_graph;
&Getopt::Long::Configure(qw(bundling pass_through));
&GetOptions(
help => \&help,
version => \&version,
all => \$opt_all,
I => \@opt_include,
graph => \$opt_graph,
);
push @opt_include, 'include';
my %deps = ();
my %linenos = ();
my @headers = grep { strip($_) } @ARGV;
parse_all(@headers);
if($opt_graph) {
graph();
} else {
detect_cycles(@headers);
}
sub help {
print "Usage: $0 [options] file...\n";
print "\n";
print "Options:\n";
print " --all\n";
print " --graph\n";
print "\n";
print " -I includedir\n";
print "\n";
print "To make nice graphs, try:\n";
print " $0 --graph include/linux/kernel.h | dot -Tpng -o graph.png\n";
exit;
}
sub version {
print "headerdep version 2\n";
exit;
}
# Get a file name that is relative to our include paths
sub strip {
my $filename = shift;
for my $i (@opt_include) {
my $stripped = $filename;
$stripped =~ s/^$i\///;
return $stripped if $stripped ne $filename;
}
return $filename;
}
# Search for the file name in the list of include paths
sub search {
my $filename = shift;
return $filename if -f $filename;
for my $i (@opt_include) {
my $path = "$i/$filename";
return $path if -f $path;
}
return undef;
}
sub parse_all {
# Parse all the headers.
my @queue = @_;
while(@queue) {
my $header = pop @queue;
next if exists $deps{$header};
$deps{$header} = [] unless exists $deps{$header};
my $path = search($header);
next unless $path;
open(my $file, '<', $path) or die($!);
chomp(my @lines = <$file>);
close($file);
for my $i (0 .. $#lines) {
my $line = $lines[$i];
if(my($dep) = ($line =~ m/^#\s*include\s*<(.*?)>/)) {
push @queue, $dep;
push @{$deps{$header}}, [$i + 1, $dep];
}
}
}
}
sub print_cycle {
# $cycle[n] includes $cycle[n + 1];
# $cycle[-1] will be the culprit
my $cycle = shift;
# Adjust the line numbers
for my $i (0 .. $#$cycle - 1) {
$cycle->[$i]->[0] = $cycle->[$i + 1]->[0];
}
$cycle->[-1]->[0] = 0;
my $first = shift @$cycle;
my $last = pop @$cycle;
my $msg = "In file included";
printf "%s from %s,\n", $msg, $last->[1] if defined $last;
for my $header (reverse @$cycle) {
printf "%s from %s:%d%s\n",
" " x length $msg,
$header->[1], $header->[0],
$header->[1] eq $last->[1] ? ' <-- here' : '';
}
printf "%s:%d: warning: recursive header inclusion\n",
$first->[1], $first->[0];
}
# Find and print the smallest cycle starting in the specified node.
sub detect_cycles {
my @queue = map { [[0, $_]] } @_;
while(@queue) {
my $top = pop @queue;
my $name = $top->[-1]->[1];
for my $dep (@{$deps{$name}}) {
my $chain = [@$top, [$dep->[0], $dep->[1]]];
# If the dep already exists in the chain, we have a
# cycle...
if(grep { $_->[1] eq $dep->[1] } @$top) {
print_cycle($chain);
next if $opt_all;
return;
}
push @queue, $chain;
}
}
}
sub mangle {
$_ = shift;
s/\//__/g;
s/\./_/g;
s/-/_/g;
$_;
}
# Output dependency graph in GraphViz language.
sub graph {
print "digraph {\n";
print "\t/* vertices */\n";
for my $header (keys %deps) {
printf "\t%s [label=\"%s\"];\n",
mangle($header), $header;
}
print "\n";
print "\t/* edges */\n";
for my $header (keys %deps) {
for my $dep (@{$deps{$header}}) {
printf "\t%s -> %s;\n",
mangle($header), mangle($dep->[1]);
}
}
print "}\n";
}
...@@ -130,18 +130,9 @@ static int read_symbol(FILE *in, struct sym_entry *s) ...@@ -130,18 +130,9 @@ static int read_symbol(FILE *in, struct sym_entry *s)
static int symbol_valid(struct sym_entry *s) static int symbol_valid(struct sym_entry *s)
{ {
/* Symbols which vary between passes. Passes 1 and 2 must have /* Symbols which vary between passes. Passes 1 and 2 must have
* identical symbol lists. The kallsyms_* symbols below are only added * identical symbol lists.
* after pass 1, they would be included in pass 2 when --all-symbols is
* specified so exclude them to get a stable symbol list.
*/ */
static char *special_symbols[] = { static char *special_symbols[] = {
"kallsyms_addresses",
"kallsyms_num_syms",
"kallsyms_names",
"kallsyms_markers",
"kallsyms_token_table",
"kallsyms_token_index",
/* Exclude linker generated symbols which vary between passes */ /* Exclude linker generated symbols which vary between passes */
"_SDA_BASE_", /* ppc */ "_SDA_BASE_", /* ppc */
"_SDA2_BASE_", /* ppc */ "_SDA2_BASE_", /* ppc */
...@@ -173,7 +164,9 @@ static int symbol_valid(struct sym_entry *s) ...@@ -173,7 +164,9 @@ static int symbol_valid(struct sym_entry *s)
} }
/* Exclude symbols which vary between passes. */ /* Exclude symbols which vary between passes. */
if (strstr((char *)s->sym + offset, "_compiled.")) if (strstr((char *)s->sym + offset, "_compiled.") ||
strncmp((char*)s->sym + offset, "__compound_literal.", 19) == 0 ||
strncmp((char*)s->sym + offset, "__compound_literal$", 19) == 0)
return 0; return 0;
for (i = 0; special_symbols[i]; i++) for (i = 0; special_symbols[i]; i++)
...@@ -550,8 +543,10 @@ int main(int argc, char **argv) ...@@ -550,8 +543,10 @@ int main(int argc, char **argv)
usage(); usage();
read_map(stdin); read_map(stdin);
if (table_cnt) {
sort_symbols(); sort_symbols();
optimize_token_table(); optimize_token_table();
}
write_src(); write_src();
return 0; return 0;
......
...@@ -52,7 +52,7 @@ EOF ...@@ -52,7 +52,7 @@ EOF
} }
usage() { usage() {
printf "Usage: $0 [-check compiler options|-header|-library]\n" printf "Usage: $0 [-check compiler options|-ccflags|-ldflags compiler options]\n"
} }
if [ $# -eq 0 ]; then if [ $# -eq 0 ]; then
......
...@@ -289,6 +289,8 @@ my %parameterdescs; ...@@ -289,6 +289,8 @@ my %parameterdescs;
my @parameterlist; my @parameterlist;
my %sections; my %sections;
my @sectionlist; my @sectionlist;
my $sectcheck;
my $struct_actual;
my $contents = ""; my $contents = "";
my $section_default = "Description"; # default section my $section_default = "Description"; # default section
...@@ -378,10 +380,12 @@ sub dump_section { ...@@ -378,10 +380,12 @@ sub dump_section {
# print STDERR "parameter def '$1' = '$contents'\n"; # print STDERR "parameter def '$1' = '$contents'\n";
$name = $1; $name = $1;
$parameterdescs{$name} = $contents; $parameterdescs{$name} = $contents;
$sectcheck = $sectcheck . $name . " ";
} elsif ($name eq "@\.\.\.") { } elsif ($name eq "@\.\.\.") {
# print STDERR "parameter def '...' = '$contents'\n"; # print STDERR "parameter def '...' = '$contents'\n";
$name = "..."; $name = "...";
$parameterdescs{$name} = $contents; $parameterdescs{$name} = $contents;
$sectcheck = $sectcheck . $name . " ";
} else { } else {
# print STDERR "other section '$name' = '$contents'\n"; # print STDERR "other section '$name' = '$contents'\n";
if (defined($sections{$name}) && ($sections{$name} ne "")) { if (defined($sections{$name}) && ($sections{$name} ne "")) {
...@@ -1405,21 +1409,25 @@ sub dump_union($$) { ...@@ -1405,21 +1409,25 @@ sub dump_union($$) {
sub dump_struct($$) { sub dump_struct($$) {
my $x = shift; my $x = shift;
my $file = shift; my $file = shift;
my $nested;
if ($x =~/(struct|union)\s+(\w+)\s*{(.*)}/) { if ($x =~/(struct|union)\s+(\w+)\s*{(.*)}/) {
$declaration_name = $2; $declaration_name = $2;
my $members = $3; my $members = $3;
# ignore embedded structs or unions # ignore embedded structs or unions
$members =~ s/{.*}//g; $members =~ s/({.*})//g;
$nested = $1;
# ignore members marked private: # ignore members marked private:
$members =~ s/\/\*.*?private:.*?public:.*?\*\///gos; $members =~ s/\/\*.*?private:.*?public:.*?\*\///gos;
$members =~ s/\/\*.*?private:.*//gos; $members =~ s/\/\*.*?private:.*//gos;
# strip comments: # strip comments:
$members =~ s/\/\*.*?\*\///gos; $members =~ s/\/\*.*?\*\///gos;
$nested =~ s/\/\*.*?\*\///gos;
create_parameterlist($members, ';', $file); create_parameterlist($members, ';', $file);
check_sections($file, $declaration_name, "struct", $sectcheck, $struct_actual, $nested);
output_declaration($declaration_name, output_declaration($declaration_name,
'struct', 'struct',
...@@ -1505,6 +1513,14 @@ sub dump_typedef($$) { ...@@ -1505,6 +1513,14 @@ sub dump_typedef($$) {
} }
} }
sub save_struct_actual($) {
my $actual = shift;
# strip all spaces from the actual param so that it looks like one string item
$actual =~ s/\s*//g;
$struct_actual = $struct_actual . $actual . " ";
}
sub create_parameterlist($$$) { sub create_parameterlist($$$) {
my $args = shift; my $args = shift;
my $splitter = shift; my $splitter = shift;
...@@ -1537,6 +1553,7 @@ sub create_parameterlist($$$) { ...@@ -1537,6 +1553,7 @@ sub create_parameterlist($$$) {
$param = $1; $param = $1;
$type = $arg; $type = $arg;
$type =~ s/([^\(]+\(\*?)\s*$param/$1/; $type =~ s/([^\(]+\(\*?)\s*$param/$1/;
save_struct_actual($param);
push_parameter($param, $type, $file); push_parameter($param, $type, $file);
} elsif ($arg) { } elsif ($arg) {
$arg =~ s/\s*:\s*/:/g; $arg =~ s/\s*:\s*/:/g;
...@@ -1561,14 +1578,17 @@ sub create_parameterlist($$$) { ...@@ -1561,14 +1578,17 @@ sub create_parameterlist($$$) {
foreach $param (@args) { foreach $param (@args) {
if ($param =~ m/^(\*+)\s*(.*)/) { if ($param =~ m/^(\*+)\s*(.*)/) {
save_struct_actual($2);
push_parameter($2, "$type $1", $file); push_parameter($2, "$type $1", $file);
} }
elsif ($param =~ m/(.*?):(\d+)/) { elsif ($param =~ m/(.*?):(\d+)/) {
if ($type ne "") { # skip unnamed bit-fields if ($type ne "") { # skip unnamed bit-fields
save_struct_actual($1);
push_parameter($1, "$type:$2", $file) push_parameter($1, "$type:$2", $file)
} }
} }
else { else {
save_struct_actual($param);
push_parameter($param, $type, $file); push_parameter($param, $type, $file);
} }
} }
...@@ -1634,6 +1654,46 @@ sub push_parameter($$$) { ...@@ -1634,6 +1654,46 @@ sub push_parameter($$$) {
$parametertypes{$param} = $type; $parametertypes{$param} = $type;
} }
sub check_sections($$$$$$) {
my ($file, $decl_name, $decl_type, $sectcheck, $prmscheck, $nested) = @_;
my @sects = split ' ', $sectcheck;
my @prms = split ' ', $prmscheck;
my $err;
my ($px, $sx);
my $prm_clean; # strip trailing "[array size]" and/or beginning "*"
foreach $sx (0 .. $#sects) {
$err = 1;
foreach $px (0 .. $#prms) {
$prm_clean = $prms[$px];
$prm_clean =~ s/\[.*\]//;
$prm_clean =~ s/__attribute__\s*\(\([a-z,_\*\s\(\)]*\)\)//;
##$prm_clean =~ s/^\**//;
if ($prm_clean eq $sects[$sx]) {
$err = 0;
last;
}
}
if ($err) {
if ($decl_type eq "function") {
print STDERR "Warning(${file}:$.): " .
"Excess function parameter " .
"'$sects[$sx]' " .
"description in '$decl_name'\n";
++$warnings;
} else {
if ($nested !~ m/\Q$sects[$sx]\E/) {
print STDERR "Warning(${file}:$.): " .
"Excess struct/union/enum/typedef member " .
"'$sects[$sx]' " .
"description in '$decl_name'\n";
++$warnings;
}
}
}
}
}
## ##
# takes a function prototype and the name of the current file being # takes a function prototype and the name of the current file being
# processed and spits out all the details stored in the global # processed and spits out all the details stored in the global
...@@ -1699,6 +1759,9 @@ sub dump_function($$) { ...@@ -1699,6 +1759,9 @@ sub dump_function($$) {
return; return;
} }
my $prms = join " ", @parameterlist;
check_sections($file, $declaration_name, "function", $sectcheck, $prms, "");
output_declaration($declaration_name, output_declaration($declaration_name,
'function', 'function',
{'function' => $declaration_name, {'function' => $declaration_name,
...@@ -1757,6 +1820,8 @@ sub reset_state { ...@@ -1757,6 +1820,8 @@ sub reset_state {
@parameterlist = (); @parameterlist = ();
%sections = (); %sections = ();
@sectionlist = (); @sectionlist = ();
$sectcheck = "";
$struct_actual = "";
$prototype = ""; $prototype = "";
$state = 0; $state = 0;
......
...@@ -4,6 +4,8 @@ SMP=$3 ...@@ -4,6 +4,8 @@ SMP=$3
PREEMPT=$4 PREEMPT=$4
CC=$5 CC=$5
vecho() { [ "${quiet}" = "silent_" ] || echo "$@" ; }
# If compile.h exists already and we don't own autoconf.h # If compile.h exists already and we don't own autoconf.h
# (i.e. we're not the same user who did make *config), don't # (i.e. we're not the same user who did make *config), don't
# modify compile.h # modify compile.h
...@@ -11,7 +13,7 @@ CC=$5 ...@@ -11,7 +13,7 @@ CC=$5
# do "compiled by root" # do "compiled by root"
if [ -r $TARGET -a ! -O include/linux/autoconf.h ]; then if [ -r $TARGET -a ! -O include/linux/autoconf.h ]; then
echo " SKIPPED $TARGET" vecho " SKIPPED $TARGET"
exit 0 exit 0
fi fi
...@@ -89,7 +91,7 @@ if [ -r $TARGET ] && \ ...@@ -89,7 +91,7 @@ if [ -r $TARGET ] && \
cmp -s .tmpver.1 .tmpver.2; then cmp -s .tmpver.1 .tmpver.2; then
rm -f .tmpcompile rm -f .tmpcompile
else else
echo " UPD $TARGET" vecho " UPD $TARGET"
mv -f .tmpcompile $TARGET mv -f .tmpcompile $TARGET
fi fi
rm -f .tmpver.1 .tmpver.2 rm -f .tmpver.1 .tmpver.2
...@@ -17,7 +17,9 @@ if test -e $2/Makefile && ! grep -q Automatically $2/Makefile ...@@ -17,7 +17,9 @@ if test -e $2/Makefile && ! grep -q Automatically $2/Makefile
then then
exit 0 exit 0
fi fi
echo " GEN $2/Makefile" if [ "${quiet}" != "silent_" ]; then
echo " GEN $2/Makefile"
fi
cat << EOF > $2/Makefile cat << EOF > $2/Makefile
# Automatically generated by $0: don't edit # Automatically generated by $0: don't edit
......
...@@ -37,9 +37,6 @@ ...@@ -37,9 +37,6 @@
# readprofile starts reading symbols when _stext is found, and # readprofile starts reading symbols when _stext is found, and
# continue until it finds a symbol which is not either of 'T', 't', # continue until it finds a symbol which is not either of 'T', 't',
# 'W' or 'w'. __crc_ are 'A' and placed in the middle # 'W' or 'w'.
# so we just ignore them to let readprofile continue to work.
# (At least sparc64 has __crc_ in the middle).
$NM -n $1 | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)' > $2
$NM -n $1 | grep -v '\( [aNUw] \)\|\( \$[adt]\)' > $2
# Makefile for the different targets used to generate full packages of a kernel # Makefile for the different targets used to generate full packages of a kernel
# It uses the generic clean infrastructure of kbuild # It uses the generic clean infrastructure of kbuild
# Ignore the following files/directories during tar operation
TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn --exclude CVS
# RPM target # RPM target
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# The rpm target generates two rpm files: # The rpm target generates two rpm files:
...@@ -47,7 +43,7 @@ rpm-pkg rpm: $(objtree)/kernel.spec FORCE ...@@ -47,7 +43,7 @@ rpm-pkg rpm: $(objtree)/kernel.spec FORCE
set -e; \ set -e; \
mv -f $(objtree)/.tmp_version $(objtree)/.version mv -f $(objtree)/.tmp_version $(objtree)/.version
$(RPM) --target $(UTS_MACHINE) -ta ../$(KERNELPATH).tar.gz $(RPM) $(RPMOPTS) --target $(UTS_MACHINE) -ta ../$(KERNELPATH).tar.gz
rm ../$(KERNELPATH).tar.gz rm ../$(KERNELPATH).tar.gz
clean-files := $(objtree)/kernel.spec clean-files := $(objtree)/kernel.spec
...@@ -64,7 +60,8 @@ binrpm-pkg: $(objtree)/binkernel.spec FORCE ...@@ -64,7 +60,8 @@ binrpm-pkg: $(objtree)/binkernel.spec FORCE
set -e; \ set -e; \
mv -f $(objtree)/.tmp_version $(objtree)/.version mv -f $(objtree)/.tmp_version $(objtree)/.version
$(RPM) --define "_builddir $(srctree)" --target $(UTS_MACHINE) -bb $< $(RPM) $(RPMOPTS) --define "_builddir $(srctree)" --target \
$(UTS_MACHINE) -bb $<
clean-files += $(objtree)/binkernel.spec clean-files += $(objtree)/binkernel.spec
......
...@@ -19,6 +19,11 @@ if head=`git rev-parse --verify --short HEAD 2>/dev/null`; then ...@@ -19,6 +19,11 @@ if head=`git rev-parse --verify --short HEAD 2>/dev/null`; then
fi fi
fi fi
# Is this git on svn?
if git config --get svn-remote.svn.url >/dev/null; then
printf -- '-svn%s' "`git-svn find-rev $head`"
fi
# Are there uncommitted changes? # Are there uncommitted changes?
git update-index --refresh --unmerged > /dev/null git update-index --refresh --unmerged > /dev/null
if git diff-index --name-only HEAD | grep -v "^scripts/package" \ if git diff-index --name-only HEAD | grep -v "^scripts/package" \
...@@ -51,7 +56,7 @@ if hgid=`hg id 2>/dev/null`; then ...@@ -51,7 +56,7 @@ if hgid=`hg id 2>/dev/null`; then
fi fi
# Check for svn and a svn repo. # Check for svn and a svn repo.
if rev=`svn info 2>/dev/null | grep '^Revision'`; then if rev=`svn info 2>/dev/null | grep '^Last Changed Rev'`; then
rev=`echo $rev | awk '{print $NF}'` rev=`echo $rev | awk '{print $NF}'`
changes=`svn status 2>/dev/null | grep '^[AMD]' | wc -l` changes=`svn status 2>/dev/null | grep '^[AMD]' | wc -l`
......
<*>
*.h
__compound_literal[$.][0-9]*
__crc_[a-zA-Z_]*
__exitcall_[a-zA-Z_]*
__func__[$.][0-9]*
__FUNCTION__[$.][0-9]*
gcc[0-9]_compiled[$.]
__initcall_[a-zA-Z_]*
__kcrctab_[a-zA-Z_]*
__kstrtab_[a-zA-Z_]*
__ksymtab_[a-zA-Z_]*
__mod_[a-zA-Z_]*[0-9]
__module_depends
__param_[a-zA-Z_]*
__pci_fixup_*PCI_ANY_IDPCI_ANY_ID*
__pci_fixup_*PCI_ANY_IDPCI_DEVICE_ID_*
__pci_fixup_*PCI_VENDOR_ID_*PCI_ANY_ID*
__pci_fixup_*PCI_VENDOR_ID_*PCI_DEVICE_ID_*
__PRETTY_FUNCTION__[$.][0-9]*
__setup_[a-zA-Z_]*
____versions
#!/bin/sh
# Generate tags or cscope files
# Usage tags.sh <mode>
#
# mode may be any of: tags, TAGS, cscope
#
# Uses the following environment variables:
# ARCH, SUBARCH, srctree, src, obj
if [ "$KBUILD_VERBOSE" = "1" ]; then
set -x
fi
# This is a duplicate of RCS_FIND_IGNORE without escaped '()'
ignore="( -name SCCS -o -name BitKeeper -o -name .svn -o \
-name CVS -o -name .pc -o -name .hg -o \
-name .git ) \
-prune -o"
# Do not use full path is we do not use O=.. builds
if [ "${KBUILD_SRC}" = "" ]; then
tree=
else
tree=${srctree}/
fi
# find sources in arch/$ARCH
find_arch_sources()
{
find ${tree}arch/$1 $ignore -name "$2" -print;
}
# find sources in arch/$1/include
find_arch_include_sources()
{
find ${tree}arch/$1/include $ignore -name "$2" -print;
}
# find sources in include/
find_include_sources()
{
find ${tree}include $ignore -name config -prune -o -name "$1" -print;
}
# find sources in rest of tree
# we could benefit from a list of dirs to search in here
find_other_sources()
{
find ${tree}* $ignore \
\( -name include -o -name arch -o -name '.tmp_*' \) -prune -o \
-name "$1" -print;
}
find_sources()
{
find_arch_sources $1 "$2"
find_include_sources "$2"
find_other_sources "$2"
}
all_sources()
{
find_sources $SRCARCH '*.[chS]'
if [ ! -z "$archinclude" ]; then
find_arch_include_sources $archinclude '*.[chS]'
fi
}
all_kconfigs()
{
find_sources $SRCARCH 'Kconfig*'
}
all_defconfigs()
{
find_sources $SRCARCH "defconfig"
}
docscope()
{
(echo \-k; echo \-q; all_sources) > cscope.files
cscope -b -f cscope.out
}
exuberant()
{
all_sources > all
all_sources | xargs $1 -a \
-I __initdata,__exitdata,__acquires,__releases \
-I __read_mostly,____cacheline_aligned \
-I ____cacheline_aligned_in_smp \
-I ____cacheline_internodealigned_in_smp \
-I EXPORT_SYMBOL,EXPORT_SYMBOL_GPL \
--extra=+f --c-kinds=+px \
--regex-asm='/^ENTRY\(([^)]*)\).*/\1/'
all_kconfigs | xargs $1 -a \
--langdef=kconfig --language-force=kconfig \
--regex-kconfig='/^[[:blank:]]*(menu|)config[[:blank:]]+([[:alnum:]_]+)/\2/'
all_kconfigs | xargs $1 -a \
--langdef=kconfig --language-force=kconfig \
--regex-kconfig='/^[[:blank:]]*(menu|)config[[:blank:]]+([[:alnum:]_]+)/CONFIG_\2/'
all_defconfigs | xargs -r $1 -a \
--langdef=dotconfig --language-force=dotconfig \
--regex-dotconfig='/^#?[[:blank:]]*(CONFIG_[[:alnum:]_]+)/\1/'
}
emacs()
{
all_sources | xargs $1 -a
all_kconfigs | xargs $1 -a \
--regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/\3/'
all_kconfigs | xargs $1 -a \
--regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/CONFIG_\3/'
all_defconfigs | xargs -r $1 -a \
--regex='/^#?[ \t]?\(CONFIG_[a-zA-Z0-9_]+\)/\1/'
}
xtags()
{
if $1 --version 2>&1 | grep -iq exuberant; then
exuberant $1
elif $1 --version 2>&1 | grep -iq emacs; then
emacs $1
else
all_sources | xargs $1 -a
fi
}
# Support um (which uses SUBARCH)
if [ "${ARCH}" = "um" ]; then
if [ "$SUBARCH" = "i386" ]; then
archinclude=x86
elif [ "$SUBARCH" = "x86_64" ]; then
archinclude=x86
else
archinclude=${SUBARCH}
fi
fi
case "$1" in
"cscope")
docscope
;;
"tags")
xtags ctags
;;
"TAGS")
xtags etags
;;
esac
...@@ -370,6 +370,30 @@ error: ...@@ -370,6 +370,30 @@ error:
return rc; return rc;
} }
static char *cpio_replace_env(char *new_location)
{
char expanded[PATH_MAX + 1];
char env_var[PATH_MAX + 1];
char *start;
char *end;
for (start = NULL; (start = strstr(new_location, "${")); ) {
end = strchr(start, '}');
if (start < end) {
*env_var = *expanded = '\0';
strncat(env_var, start + 2, end - start - 2);
strncat(expanded, new_location, start - new_location);
strncat(expanded, getenv(env_var), PATH_MAX);
strncat(expanded, end + 1, PATH_MAX);
strncpy(new_location, expanded, PATH_MAX);
} else
break;
}
return new_location;
}
static int cpio_mkfile_line(const char *line) static int cpio_mkfile_line(const char *line)
{ {
char name[PATH_MAX + 1]; char name[PATH_MAX + 1];
...@@ -415,7 +439,8 @@ static int cpio_mkfile_line(const char *line) ...@@ -415,7 +439,8 @@ static int cpio_mkfile_line(const char *line)
} else { } else {
dname = name; dname = name;
} }
rc = cpio_mkfile(dname, location, mode, uid, gid, nlinks); rc = cpio_mkfile(dname, cpio_replace_env(location),
mode, uid, gid, nlinks);
fail: fail:
if (dname_len) free(dname); if (dname_len) free(dname);
return rc; return rc;
...@@ -439,6 +464,7 @@ void usage(const char *prog) ...@@ -439,6 +464,7 @@ void usage(const char *prog)
"\n" "\n"
"<name> name of the file/dir/nod/etc in the archive\n" "<name> name of the file/dir/nod/etc in the archive\n"
"<location> location of the file in the current filesystem\n" "<location> location of the file in the current filesystem\n"
" expands shell variables quoted with ${}\n"
"<target> link target\n" "<target> link target\n"
"<mode> mode/permissions of the file\n" "<mode> mode/permissions of the file\n"
"<uid> user id (0=root)\n" "<uid> user id (0=root)\n"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment