1#!/bin/sh 2# Generate tags or cscope files 3# Usage tags.sh <mode> 4# 5# mode may be any of: tags, TAGS, cscope 6# 7# Uses the following environment variables: 8# ARCH, SUBARCH, SRCARCH, srctree, src, obj 9 10if [ "$KBUILD_VERBOSE" = "1" ]; then 11 set -x 12fi 13 14# RCS_FIND_IGNORE has escaped ()s -- remove them. 15ignore="$(echo "$RCS_FIND_IGNORE" | sed 's|\\||g' )" 16# tags and cscope files should also ignore MODVERSION *.mod.c files 17ignore="$ignore ( -name *.mod.c ) -prune -o" 18 19# Do not use full path if we do not use O=.. builds 20# Use make O=. {tags|cscope} 21# to force full paths for a non-O= build 22if [ "${KBUILD_SRC}" = "" ]; then 23 tree= 24else 25 tree=${srctree}/ 26fi 27 28# ignore userspace tools 29ignore="$ignore ( -path ${tree}tools ) -prune -o" 30 31# Find all available archs 32find_all_archs() 33{ 34 ALLSOURCE_ARCHS="" 35 for arch in `ls ${tree}arch`; do 36 ALLSOURCE_ARCHS="${ALLSOURCE_ARCHS} "${arch##\/} 37 done 38} 39 40# Detect if ALLSOURCE_ARCHS is set. If not, we assume SRCARCH 41if [ "${ALLSOURCE_ARCHS}" = "" ]; then 42 ALLSOURCE_ARCHS=${SRCARCH} 43elif [ "${ALLSOURCE_ARCHS}" = "all" ]; then 44 find_all_archs 45fi 46 47# find sources in arch/$ARCH 48find_arch_sources() 49{ 50 for i in $archincludedir; do 51 prune="$prune -wholename $i -prune -o" 52 done 53 find ${tree}arch/$1 $ignore $subarchprune $prune -name "$2" \ 54 -not -type l -print; 55} 56 57# find sources in arch/$1/include 58find_arch_include_sources() 59{ 60 include=$(find ${tree}arch/$1/ $subarchprune \ 61 -name include -type d -print); 62 if [ -n "$include" ]; then 63 archincludedir="$archincludedir $include" 64 find $include $ignore -name "$2" -not -type l -print; 65 fi 66} 67 68# find sources in include/ 69find_include_sources() 70{ 71 find ${tree}include $ignore -name config -prune -o -name "$1" \ 72 -not -type l -print; 73} 74 75# find sources in rest of tree 76# we could benefit from a list of dirs to search in here 77find_other_sources() 78{ 79 find ${tree}* $ignore \ 80 \( -name include -o -name arch -o -name '.tmp_*' \) -prune -o \ 81 -name "$1" -not -type l -print; 82} 83 84find_sources() 85{ 86 find_arch_sources $1 "$2" 87} 88 89all_sources() 90{ 91 find_arch_include_sources ${SRCARCH} '*.[chS]' 92 if [ ! -z "$archinclude" ]; then 93 find_arch_include_sources $archinclude '*.[chS]' 94 fi 95 find_include_sources '*.[chS]' 96 for arch in $ALLSOURCE_ARCHS 97 do 98 find_sources $arch '*.[chS]' 99 done 100 find_other_sources '*.[chS]' 101} 102 103all_compiled_sources() 104{ 105 for i in $(all_sources); do 106 case "$i" in 107 *.[cS]) 108 j=${i/\.[cS]/\.o} 109 if [ -e $j ]; then 110 echo $i 111 fi 112 ;; 113 *) 114 echo $i 115 ;; 116 esac 117 done 118} 119 120all_target_sources() 121{ 122 if [ -n "$COMPILED_SOURCE" ]; then 123 all_compiled_sources 124 else 125 all_sources 126 fi 127} 128 129all_kconfigs() 130{ 131 for arch in $ALLSOURCE_ARCHS; do 132 find_sources $arch 'Kconfig*' 133 done 134 find_other_sources 'Kconfig*' 135} 136 137all_defconfigs() 138{ 139 find_sources $ALLSOURCE_ARCHS "defconfig" 140} 141 142docscope() 143{ 144 (echo \-k; echo \-q; all_target_sources) > cscope.files 145 cscope -b -f cscope.out 146} 147 148dogtags() 149{ 150 all_target_sources | gtags -i -f - 151} 152 153exuberant() 154{ 155 all_target_sources | xargs $1 -a \ 156 -I __initdata,__exitdata,__initconst, \ 157 -I __cpuinitdata,__initdata_memblock \ 158 -I __refdata,__attribute,__maybe_unused,__always_unused \ 159 -I __acquires,__releases,__deprecated \ 160 -I __read_mostly,__aligned,____cacheline_aligned \ 161 -I ____cacheline_aligned_in_smp \ 162 -I __cacheline_aligned,__cacheline_aligned_in_smp \ 163 -I ____cacheline_internodealigned_in_smp \ 164 -I __used,__packed,__packed2__,__must_check,__must_hold \ 165 -I EXPORT_SYMBOL,EXPORT_SYMBOL_GPL,ACPI_EXPORT_SYMBOL \ 166 -I DEFINE_TRACE,EXPORT_TRACEPOINT_SYMBOL,EXPORT_TRACEPOINT_SYMBOL_GPL \ 167 -I static,const \ 168 --extra=+f --c-kinds=+px \ 169 --regex-asm='/^(ENTRY|_GLOBAL)\(([^)]*)\).*/\2/' \ 170 --regex-c='/^SYSCALL_DEFINE[[:digit:]]?\(([^,)]*).*/sys_\1/' \ 171 --regex-c='/^COMPAT_SYSCALL_DEFINE[[:digit:]]?\(([^,)]*).*/compat_sys_\1/' \ 172 --regex-c++='/^TRACE_EVENT\(([^,)]*).*/trace_\1/' \ 173 --regex-c++='/^DEFINE_EVENT\([^,)]*, *([^,)]*).*/trace_\1/' \ 174 --regex-c++='/PAGEFLAG\(([^,)]*).*/Page\1/' \ 175 --regex-c++='/PAGEFLAG\(([^,)]*).*/SetPage\1/' \ 176 --regex-c++='/PAGEFLAG\(([^,)]*).*/ClearPage\1/' \ 177 --regex-c++='/TESTSETFLAG\(([^,)]*).*/TestSetPage\1/' \ 178 --regex-c++='/TESTPAGEFLAG\(([^,)]*).*/Page\1/' \ 179 --regex-c++='/SETPAGEFLAG\(([^,)]*).*/SetPage\1/' \ 180 --regex-c++='/__SETPAGEFLAG\(([^,)]*).*/__SetPage\1/' \ 181 --regex-c++='/TESTCLEARFLAG\(([^,)]*).*/TestClearPage\1/' \ 182 --regex-c++='/__TESTCLEARFLAG\(([^,)]*).*/TestClearPage\1/' \ 183 --regex-c++='/CLEARPAGEFLAG\(([^,)]*).*/ClearPage\1/' \ 184 --regex-c++='/__CLEARPAGEFLAG\(([^,)]*).*/__ClearPage\1/' \ 185 --regex-c++='/__PAGEFLAG\(([^,)]*).*/__SetPage\1/' \ 186 --regex-c++='/__PAGEFLAG\(([^,)]*).*/__ClearPage\1/' \ 187 --regex-c++='/PAGEFLAG_FALSE\(([^,)]*).*/Page\1/' \ 188 --regex-c++='/TESTSCFLAG\(([^,)]*).*/TestSetPage\1/' \ 189 --regex-c++='/TESTSCFLAG\(([^,)]*).*/TestClearPage\1/' \ 190 --regex-c++='/SETPAGEFLAG_NOOP\(([^,)]*).*/SetPage\1/' \ 191 --regex-c++='/CLEARPAGEFLAG_NOOP\(([^,)]*).*/ClearPage\1/' \ 192 --regex-c++='/__CLEARPAGEFLAG_NOOP\(([^,)]*).*/__ClearPage\1/' \ 193 --regex-c++='/TESTCLEARFLAG_FALSE\(([^,)]*).*/TestClearPage\1/' \ 194 --regex-c++='/__TESTCLEARFLAG_FALSE\(([^,)]*).*/__TestClearPage\1/' \ 195 --regex-c++='/_PE\(([^,)]*).*/PEVENT_ERRNO__\1/' \ 196 --regex-c++='/TASK_PFA_TEST\([^,]*,\s*([^)]*)\)/task_\1/' \ 197 --regex-c++='/TASK_PFA_SET\([^,]*,\s*([^)]*)\)/task_set_\1/' \ 198 --regex-c++='/TASK_PFA_CLEAR\([^,]*,\s*([^)]*)\)/task_clear_\1/'\ 199 --regex-c='/PCI_OP_READ\((\w*).*[1-4]\)/pci_bus_read_config_\1/' \ 200 --regex-c='/PCI_OP_WRITE\((\w*).*[1-4]\)/pci_bus_write_config_\1/' \ 201 --regex-c='/DEFINE_(MUTEX|SEMAPHORE|SPINLOCK)\((\w*)/\2/v/' \ 202 --regex-c='/DEFINE_(RAW_SPINLOCK|RWLOCK|SEQLOCK)\((\w*)/\2/v/' \ 203 --regex-c='/DECLARE_(RWSEM|COMPLETION)\((\w*)/\2/v/' \ 204 --regex-c='/DECLARE_BITMAP\((\w*)/\1/v/' \ 205 --regex-c='/(^|\s)(|L|H)LIST_HEAD\((\w*)/\3/v/' \ 206 --regex-c='/(^|\s)RADIX_TREE\((\w*)/\2/v/' \ 207 --regex-c='/DEFINE_PER_CPU\(([^,]*,\s*)(\w*).*\)/\2/v/' \ 208 --regex-c='/DEFINE_PER_CPU_SHARED_ALIGNED\(([^,]*,\s*)(\w*).*\)/\2/v/' \ 209 --regex-c='/DECLARE_WAIT_QUEUE_HEAD\((\w*)/\1/v/' \ 210 --regex-c='/DECLARE_(TASKLET|WORK|DELAYED_WORK)\((\w*)/\2/v/' \ 211 --regex-c='/DEFINE_PCI_DEVICE_TABLE\((\w*)/\1/v/' \ 212 --regex-c='/(^\s)OFFSET\((\w*)/\2/v/' \ 213 --regex-c='/(^\s)DEFINE\((\w*)/\2/v/' \ 214 --regex-c='/DEFINE_HASHTABLE\((\w*)/\1/v/' 215 216 all_kconfigs | xargs $1 -a \ 217 --langdef=kconfig --language-force=kconfig \ 218 --regex-kconfig='/^[[:blank:]]*(menu|)config[[:blank:]]+([[:alnum:]_]+)/\2/' 219 220 all_kconfigs | xargs $1 -a \ 221 --langdef=kconfig --language-force=kconfig \ 222 --regex-kconfig='/^[[:blank:]]*(menu|)config[[:blank:]]+([[:alnum:]_]+)/CONFIG_\2/' 223 224 all_defconfigs | xargs -r $1 -a \ 225 --langdef=dotconfig --language-force=dotconfig \ 226 --regex-dotconfig='/^#?[[:blank:]]*(CONFIG_[[:alnum:]_]+)/\1/' 227} 228 229emacs() 230{ 231 all_target_sources | xargs $1 -a \ 232 --regex='/^\(ENTRY\|_GLOBAL\)(\([^)]*\)).*/\2/' \ 233 --regex='/^SYSCALL_DEFINE[0-9]?(\([^,)]*\).*/sys_\1/' \ 234 --regex='/^COMPAT_SYSCALL_DEFINE[0-9]?(\([^,)]*\).*/compat_sys_\1/' \ 235 --regex='/^TRACE_EVENT(\([^,)]*\).*/trace_\1/' \ 236 --regex='/^DEFINE_EVENT([^,)]*, *\([^,)]*\).*/trace_\1/' \ 237 --regex='/PAGEFLAG(\([^,)]*\).*/Page\1/' \ 238 --regex='/PAGEFLAG(\([^,)]*\).*/SetPage\1/' \ 239 --regex='/PAGEFLAG(\([^,)]*\).*/ClearPage\1/' \ 240 --regex='/TESTSETFLAG(\([^,)]*\).*/TestSetPage\1/' \ 241 --regex='/TESTPAGEFLAG(\([^,)]*\).*/Page\1/' \ 242 --regex='/SETPAGEFLAG(\([^,)]*\).*/SetPage\1/' \ 243 --regex='/__SETPAGEFLAG(\([^,)]*\).*/__SetPage\1/' \ 244 --regex='/TESTCLEARFLAG(\([^,)]*\).*/TestClearPage\1/' \ 245 --regex='/__TESTCLEARFLAG(\([^,)]*\).*/TestClearPage\1/' \ 246 --regex='/CLEARPAGEFLAG(\([^,)]*\).*/ClearPage\1/' \ 247 --regex='/__CLEARPAGEFLAG(\([^,)]*\).*/__ClearPage\1/' \ 248 --regex='/__PAGEFLAG(\([^,)]*\).*/__SetPage\1/' \ 249 --regex='/__PAGEFLAG(\([^,)]*\).*/__ClearPage\1/' \ 250 --regex='/PAGEFLAG_FALSE(\([^,)]*\).*/Page\1/' \ 251 --regex='/TESTSCFLAG(\([^,)]*\).*/TestSetPage\1/' \ 252 --regex='/TESTSCFLAG(\([^,)]*\).*/TestClearPage\1/' \ 253 --regex='/SETPAGEFLAG_NOOP(\([^,)]*\).*/SetPage\1/' \ 254 --regex='/CLEARPAGEFLAG_NOOP(\([^,)]*\).*/ClearPage\1/' \ 255 --regex='/__CLEARPAGEFLAG_NOOP(\([^,)]*\).*/__ClearPage\1/' \ 256 --regex='/TESTCLEARFLAG_FALSE(\([^,)]*\).*/TestClearPage\1/' \ 257 --regex='/__TESTCLEARFLAG_FALSE(\([^,)]*\).*/__TestClearPage\1/' \ 258 --regex='/TASK_PFA_TEST\([^,]*,\s*([^)]*)\)/task_\1/' \ 259 --regex='/TASK_PFA_SET\([^,]*,\s*([^)]*)\)/task_set_\1/' \ 260 --regex='/TASK_PFA_CLEAR\([^,]*,\s*([^)]*)\)/task_clear_\1/' \ 261 --regex='/_PE(\([^,)]*\).*/PEVENT_ERRNO__\1/' \ 262 --regex='/PCI_OP_READ(\([a-z]*[a-z]\).*[1-4])/pci_bus_read_config_\1/' \ 263 --regex='/PCI_OP_WRITE(\([a-z]*[a-z]\).*[1-4])/pci_bus_write_config_\1/'\ 264 --regex='/[^#]*DEFINE_HASHTABLE(\([^,)]*\)/\1/' 265 266 all_kconfigs | xargs $1 -a \ 267 --regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/\3/' 268 269 all_kconfigs | xargs $1 -a \ 270 --regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/CONFIG_\3/' 271 272 all_defconfigs | xargs -r $1 -a \ 273 --regex='/^#?[ \t]?\(CONFIG_[a-zA-Z0-9_]+\)/\1/' 274} 275 276xtags() 277{ 278 if $1 --version 2>&1 | grep -iq exuberant; then 279 exuberant $1 280 elif $1 --version 2>&1 | grep -iq emacs; then 281 emacs $1 282 else 283 all_target_sources | xargs $1 -a 284 fi 285} 286 287# Support um (which uses SUBARCH) 288if [ "${ARCH}" = "um" ]; then 289 if [ "$SUBARCH" = "i386" ]; then 290 archinclude=x86 291 elif [ "$SUBARCH" = "x86_64" ]; then 292 archinclude=x86 293 else 294 archinclude=${SUBARCH} 295 fi 296elif [ "${SRCARCH}" = "arm" -a "${SUBARCH}" != "" ]; then 297 subarchdir=$(find ${tree}arch/$SRCARCH/ -name "mach-*" -type d -o \ 298 -name "plat-*" -type d); 299 for i in $subarchdir; do 300 case "$i" in 301 *"mach-"${SUBARCH}) 302 ;; 303 *"plat-"${SUBARCH}) 304 ;; 305 *) 306 subarchprune="$subarchprune \ 307 -wholename $i -prune -o" 308 ;; 309 esac 310 done 311fi 312 313remove_structs= 314case "$1" in 315 "cscope") 316 docscope 317 ;; 318 319 "gtags") 320 dogtags 321 ;; 322 323 "tags") 324 rm -f tags 325 xtags ctags 326 remove_structs=y 327 ;; 328 329 "TAGS") 330 rm -f TAGS 331 xtags etags 332 remove_structs=y 333 ;; 334esac 335 336# Remove structure forward declarations. 337if [ -n "$remove_structs" ]; then 338 LANG=C sed -i -e '/^\([a-zA-Z_][a-zA-Z0-9_]*\)\t.*\t\/\^struct \1;.*\$\/;"\tx$/d' $1 339fi 340