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 j="${j#$tree}" 110 if [ -e $j ]; then 111 echo $i 112 fi 113 ;; 114 *) 115 echo $i 116 ;; 117 esac 118 done 119} 120 121all_target_sources() 122{ 123 if [ -n "$COMPILED_SOURCE" ]; then 124 all_compiled_sources 125 else 126 all_sources 127 fi 128} 129 130all_kconfigs() 131{ 132 for arch in $ALLSOURCE_ARCHS; do 133 find_sources $arch 'Kconfig*' 134 done 135 find_other_sources 'Kconfig*' 136} 137 138all_defconfigs() 139{ 140 find_sources $ALLSOURCE_ARCHS "defconfig" 141} 142 143docscope() 144{ 145 (echo \-k; echo \-q; all_target_sources) > cscope.files 146 cscope -b -f cscope.out 147} 148 149dogtags() 150{ 151 all_target_sources | gtags -i -f - 152} 153 154exuberant() 155{ 156 all_target_sources | xargs $1 -a \ 157 -I __initdata,__exitdata,__initconst, \ 158 -I __initdata_memblock \ 159 -I __refdata,__attribute,__maybe_unused,__always_unused \ 160 -I __acquires,__releases,__deprecated \ 161 -I __read_mostly,__aligned,____cacheline_aligned \ 162 -I ____cacheline_aligned_in_smp \ 163 -I __cacheline_aligned,__cacheline_aligned_in_smp \ 164 -I ____cacheline_internodealigned_in_smp \ 165 -I __used,__packed,__packed2__,__must_check,__must_hold \ 166 -I EXPORT_SYMBOL,EXPORT_SYMBOL_GPL,ACPI_EXPORT_SYMBOL \ 167 -I DEFINE_TRACE,EXPORT_TRACEPOINT_SYMBOL,EXPORT_TRACEPOINT_SYMBOL_GPL \ 168 -I static,const \ 169 --extra=+f --c-kinds=+px \ 170 --regex-asm='/^(ENTRY|_GLOBAL)\(([^)]*)\).*/\2/' \ 171 --regex-c='/^SYSCALL_DEFINE[[:digit:]]?\(([^,)]*).*/sys_\1/' \ 172 --regex-c='/^COMPAT_SYSCALL_DEFINE[[:digit:]]?\(([^,)]*).*/compat_sys_\1/' \ 173 --regex-c++='/^TRACE_EVENT\(([^,)]*).*/trace_\1/' \ 174 --regex-c++='/^TRACE_EVENT\(([^,)]*).*/trace_\1_rcuidle/' \ 175 --regex-c++='/^DEFINE_EVENT\([^,)]*, *([^,)]*).*/trace_\1/' \ 176 --regex-c++='/^DEFINE_EVENT\([^,)]*, *([^,)]*).*/trace_\1_rcuidle/' \ 177 --regex-c++='/PAGEFLAG\(([^,)]*).*/Page\1/' \ 178 --regex-c++='/PAGEFLAG\(([^,)]*).*/SetPage\1/' \ 179 --regex-c++='/PAGEFLAG\(([^,)]*).*/ClearPage\1/' \ 180 --regex-c++='/TESTSETFLAG\(([^,)]*).*/TestSetPage\1/' \ 181 --regex-c++='/TESTPAGEFLAG\(([^,)]*).*/Page\1/' \ 182 --regex-c++='/SETPAGEFLAG\(([^,)]*).*/SetPage\1/' \ 183 --regex-c++='/__SETPAGEFLAG\(([^,)]*).*/__SetPage\1/' \ 184 --regex-c++='/TESTCLEARFLAG\(([^,)]*).*/TestClearPage\1/' \ 185 --regex-c++='/__TESTCLEARFLAG\(([^,)]*).*/TestClearPage\1/' \ 186 --regex-c++='/CLEARPAGEFLAG\(([^,)]*).*/ClearPage\1/' \ 187 --regex-c++='/__CLEARPAGEFLAG\(([^,)]*).*/__ClearPage\1/' \ 188 --regex-c++='/__PAGEFLAG\(([^,)]*).*/__SetPage\1/' \ 189 --regex-c++='/__PAGEFLAG\(([^,)]*).*/__ClearPage\1/' \ 190 --regex-c++='/PAGEFLAG_FALSE\(([^,)]*).*/Page\1/' \ 191 --regex-c++='/TESTSCFLAG\(([^,)]*).*/TestSetPage\1/' \ 192 --regex-c++='/TESTSCFLAG\(([^,)]*).*/TestClearPage\1/' \ 193 --regex-c++='/SETPAGEFLAG_NOOP\(([^,)]*).*/SetPage\1/' \ 194 --regex-c++='/CLEARPAGEFLAG_NOOP\(([^,)]*).*/ClearPage\1/' \ 195 --regex-c++='/__CLEARPAGEFLAG_NOOP\(([^,)]*).*/__ClearPage\1/' \ 196 --regex-c++='/TESTCLEARFLAG_FALSE\(([^,)]*).*/TestClearPage\1/' \ 197 --regex-c++='/__TESTCLEARFLAG_FALSE\(([^,)]*).*/__TestClearPage\1/' \ 198 --regex-c++='/_PE\(([^,)]*).*/PEVENT_ERRNO__\1/' \ 199 --regex-c++='/TASK_PFA_TEST\([^,]*,\s*([^)]*)\)/task_\1/' \ 200 --regex-c++='/TASK_PFA_SET\([^,]*,\s*([^)]*)\)/task_set_\1/' \ 201 --regex-c++='/TASK_PFA_CLEAR\([^,]*,\s*([^)]*)\)/task_clear_\1/'\ 202 --regex-c++='/DEF_MMIO_(IN|OUT)_(X|D)\(([^,]*),\s*[^)]*\)/\3/' \ 203 --regex-c++='/DEBUGGER_BOILERPLATE\(([^,]*)\)/\1/' \ 204 --regex-c='/PCI_OP_READ\((\w*).*[1-4]\)/pci_bus_read_config_\1/' \ 205 --regex-c='/PCI_OP_WRITE\((\w*).*[1-4]\)/pci_bus_write_config_\1/' \ 206 --regex-c='/DEFINE_(MUTEX|SEMAPHORE|SPINLOCK)\((\w*)/\2/v/' \ 207 --regex-c='/DEFINE_(RAW_SPINLOCK|RWLOCK|SEQLOCK)\((\w*)/\2/v/' \ 208 --regex-c='/DECLARE_(RWSEM|COMPLETION)\((\w*)/\2/v/' \ 209 --regex-c='/DECLARE_BITMAP\((\w*)/\1/v/' \ 210 --regex-c='/(^|\s)(|L|H)LIST_HEAD\((\w*)/\3/v/' \ 211 --regex-c='/(^|\s)RADIX_TREE\((\w*)/\2/v/' \ 212 --regex-c='/DEFINE_PER_CPU\(([^,]*,\s*)(\w*).*\)/\2/v/' \ 213 --regex-c='/DEFINE_PER_CPU_SHARED_ALIGNED\(([^,]*,\s*)(\w*).*\)/\2/v/' \ 214 --regex-c='/DECLARE_WAIT_QUEUE_HEAD\((\w*)/\1/v/' \ 215 --regex-c='/DECLARE_(TASKLET|WORK|DELAYED_WORK)\((\w*)/\2/v/' \ 216 --regex-c='/DEFINE_PCI_DEVICE_TABLE\((\w*)/\1/v/' \ 217 --regex-c='/(^\s)OFFSET\((\w*)/\2/v/' \ 218 --regex-c='/(^\s)DEFINE\((\w*)/\2/v/' \ 219 --regex-c='/DEFINE_HASHTABLE\((\w*)/\1/v/' 220 221 all_kconfigs | xargs $1 -a \ 222 --langdef=kconfig --language-force=kconfig \ 223 --regex-kconfig='/^[[:blank:]]*(menu|)config[[:blank:]]+([[:alnum:]_]+)/\2/' 224 225 all_kconfigs | xargs $1 -a \ 226 --langdef=kconfig --language-force=kconfig \ 227 --regex-kconfig='/^[[:blank:]]*(menu|)config[[:blank:]]+([[:alnum:]_]+)/CONFIG_\2/' 228 229 all_defconfigs | xargs -r $1 -a \ 230 --langdef=dotconfig --language-force=dotconfig \ 231 --regex-dotconfig='/^#?[[:blank:]]*(CONFIG_[[:alnum:]_]+)/\1/' 232} 233 234emacs() 235{ 236 all_target_sources | xargs $1 -a \ 237 --regex='/^\(ENTRY\|_GLOBAL\)(\([^)]*\)).*/\2/' \ 238 --regex='/^SYSCALL_DEFINE[0-9]?(\([^,)]*\).*/sys_\1/' \ 239 --regex='/^COMPAT_SYSCALL_DEFINE[0-9]?(\([^,)]*\).*/compat_sys_\1/' \ 240 --regex='/^TRACE_EVENT(\([^,)]*\).*/trace_\1/' \ 241 --regex='/^TRACE_EVENT(\([^,)]*\).*/trace_\1_rcuidle/' \ 242 --regex='/^DEFINE_EVENT([^,)]*, *\([^,)]*\).*/trace_\1/' \ 243 --regex='/^DEFINE_EVENT([^,)]*, *\([^,)]*\).*/trace_\1_rcuidle/' \ 244 --regex='/PAGEFLAG(\([^,)]*\).*/Page\1/' \ 245 --regex='/PAGEFLAG(\([^,)]*\).*/SetPage\1/' \ 246 --regex='/PAGEFLAG(\([^,)]*\).*/ClearPage\1/' \ 247 --regex='/TESTSETFLAG(\([^,)]*\).*/TestSetPage\1/' \ 248 --regex='/TESTPAGEFLAG(\([^,)]*\).*/Page\1/' \ 249 --regex='/SETPAGEFLAG(\([^,)]*\).*/SetPage\1/' \ 250 --regex='/__SETPAGEFLAG(\([^,)]*\).*/__SetPage\1/' \ 251 --regex='/TESTCLEARFLAG(\([^,)]*\).*/TestClearPage\1/' \ 252 --regex='/__TESTCLEARFLAG(\([^,)]*\).*/TestClearPage\1/' \ 253 --regex='/CLEARPAGEFLAG(\([^,)]*\).*/ClearPage\1/' \ 254 --regex='/__CLEARPAGEFLAG(\([^,)]*\).*/__ClearPage\1/' \ 255 --regex='/__PAGEFLAG(\([^,)]*\).*/__SetPage\1/' \ 256 --regex='/__PAGEFLAG(\([^,)]*\).*/__ClearPage\1/' \ 257 --regex='/PAGEFLAG_FALSE(\([^,)]*\).*/Page\1/' \ 258 --regex='/TESTSCFLAG(\([^,)]*\).*/TestSetPage\1/' \ 259 --regex='/TESTSCFLAG(\([^,)]*\).*/TestClearPage\1/' \ 260 --regex='/SETPAGEFLAG_NOOP(\([^,)]*\).*/SetPage\1/' \ 261 --regex='/CLEARPAGEFLAG_NOOP(\([^,)]*\).*/ClearPage\1/' \ 262 --regex='/__CLEARPAGEFLAG_NOOP(\([^,)]*\).*/__ClearPage\1/' \ 263 --regex='/TESTCLEARFLAG_FALSE(\([^,)]*\).*/TestClearPage\1/' \ 264 --regex='/__TESTCLEARFLAG_FALSE(\([^,)]*\).*/__TestClearPage\1/' \ 265 --regex='/TASK_PFA_TEST\([^,]*,\s*([^)]*)\)/task_\1/' \ 266 --regex='/TASK_PFA_SET\([^,]*,\s*([^)]*)\)/task_set_\1/' \ 267 --regex='/TASK_PFA_CLEAR\([^,]*,\s*([^)]*)\)/task_clear_\1/' \ 268 --regex='/_PE(\([^,)]*\).*/PEVENT_ERRNO__\1/' \ 269 --regex='/PCI_OP_READ(\([a-z]*[a-z]\).*[1-4])/pci_bus_read_config_\1/' \ 270 --regex='/PCI_OP_WRITE(\([a-z]*[a-z]\).*[1-4])/pci_bus_write_config_\1/'\ 271 --regex='/[^#]*DEFINE_HASHTABLE(\([^,)]*\)/\1/' 272 273 all_kconfigs | xargs $1 -a \ 274 --regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/\3/' 275 276 all_kconfigs | xargs $1 -a \ 277 --regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/CONFIG_\3/' 278 279 all_defconfigs | xargs -r $1 -a \ 280 --regex='/^#?[ \t]?\(CONFIG_[a-zA-Z0-9_]+\)/\1/' 281} 282 283xtags() 284{ 285 if $1 --version 2>&1 | grep -iq exuberant; then 286 exuberant $1 287 elif $1 --version 2>&1 | grep -iq emacs; then 288 emacs $1 289 else 290 all_target_sources | xargs $1 -a 291 fi 292} 293 294# Support um (which uses SUBARCH) 295if [ "${ARCH}" = "um" ]; then 296 if [ "$SUBARCH" = "i386" ]; then 297 archinclude=x86 298 elif [ "$SUBARCH" = "x86_64" ]; then 299 archinclude=x86 300 else 301 archinclude=${SUBARCH} 302 fi 303elif [ "${SRCARCH}" = "arm" -a "${SUBARCH}" != "" ]; then 304 subarchdir=$(find ${tree}arch/$SRCARCH/ -name "mach-*" -type d -o \ 305 -name "plat-*" -type d); 306 for i in $subarchdir; do 307 case "$i" in 308 *"mach-"${SUBARCH}) 309 ;; 310 *"plat-"${SUBARCH}) 311 ;; 312 *) 313 subarchprune="$subarchprune \ 314 -wholename $i -prune -o" 315 ;; 316 esac 317 done 318fi 319 320remove_structs= 321case "$1" in 322 "cscope") 323 docscope 324 ;; 325 326 "gtags") 327 dogtags 328 ;; 329 330 "tags") 331 rm -f tags 332 xtags ctags 333 remove_structs=y 334 ;; 335 336 "TAGS") 337 rm -f TAGS 338 xtags etags 339 remove_structs=y 340 ;; 341esac 342 343# Remove structure forward declarations. 344if [ -n "$remove_structs" ]; then 345 LANG=C sed -i -e '/^\([a-zA-Z_][a-zA-Z0-9_]*\)\t.*\t\/\^struct \1;.*\$\/;"\tx$/d' $1 346fi 347