1a559cb8eSReid Spencer#!/bin/sh 20889f95cSReid Spencer##===- utils/llvmdo - Counts Lines Of Code -------------------*- Script -*-===## 30889f95cSReid Spencer# 4*2946cd70SChandler Carruth# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*2946cd70SChandler Carruth# See https://llvm.org/LICENSE.txt for license information. 6*2946cd70SChandler Carruth# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 70889f95cSReid Spencer# 80889f95cSReid Spencer##===----------------------------------------------------------------------===## 90889f95cSReid Spencer# 100889f95cSReid Spencer# This script is a general purpose "apply" function for the source files in LLVM 110889f95cSReid Spencer# It uses "find" to locate all the source files and then applies the user's 120889f95cSReid Spencer# command to them. As such, this command is often not used by itself much but 13235c1555SReid Spencer# the other find related tools (countloc.sh,llvmgrep,getsrcs.sh,userloc.sh) are 14235c1555SReid Spencer# all based on this script. This script defines "what is a source file" in 15235c1555SReid Spencer# LLVM and so should be maintained if new directories, new file extensions, 16235c1555SReid Spencer# etc. are used in LLVM as it progresses. 170889f95cSReid Spencer# 180889f95cSReid Spencer# Usage: 19235c1555SReid Spencer# llvmdo [-topdir DIR] [-dirs "DIRNAMES..."] [-code-only] PROGRAM ARGS... 20235c1555SReid Spencer# 21235c1555SReid Spencer# The -topdir option allows you to specify the llvm source root directly. If it 22235c1555SReid Spencer# is not specified then it will be obtained with llvm-config which must be built 23235c1555SReid Spencer# and in your path. 240889f95cSReid Spencer# 250889f95cSReid Spencer# The -dirs argument allows you to specify the set of directories that are 26235c1555SReid Spencer# searched. The default list of directories searched is: 27235c1555SReid Spencer# include lib tools utils runtime autoconf docs test examples projects 28235c1555SReid Spencer# Note that you must use quotes around the list of directory names. 29235c1555SReid Spencer# 30235c1555SReid Spencer# The -code-only option specifies that only those files that are considered 31235c1555SReid Spencer# "code" should be visited. HTML documentation is considered code, but things 32235c1555SReid Spencer# like README files, etc. are not. 33235c1555SReid Spencer# 34235c1555SReid Spencer# Finally, you simply specify whatever program you want to run against each 35235c1555SReid Spencer# file and the arguments to give it. The PROGRAM will be given the file name 36235c1555SReid Spencer# as its last argument. 37e380f931SReid Spencer##===----------------------------------------------------------------------===## 386707342fSReid Spencer 396707342fSReid Spencerif test $# -lt 1 ; then 40235c1555SReid Spencer echo "Usage: llvmdo [-topdir DIR] [-dirs "DIRNAMES..."] [-code-only] PROGRAM ARGS..." 41719c3835SReid Spencer exit 1 426707342fSReid Spencerfi 436707342fSReid Spencer 44235c1555SReid Spencerif test "$1" = "-topdir" ; then 45235c1555SReid Spencer TOPDIR="$2" 46235c1555SReid Spencer shift; shift; 47235c1555SReid Spencerelse 48235c1555SReid Spencer TOPDIR=`llvm-config --src-root` 49235c1555SReid Spencerfi 50235c1555SReid Spencer 516707342fSReid Spencerif test "$1" = "-dirs" ; then 52235c1555SReid Spencer LLVMDO_DIRS="$2" 536707342fSReid Spencer shift ; shift 546707342fSReid Spencerelif test -z "$LLVMDO_DIRS" ; then 553ce33b86SDaniel Dunbar LLVMDO_DIRS="include lib tools utils runtime autoconf docs test examples projects cmake" 566707342fSReid Spencerfi 571be8d4c3SReid Spencer 581be8d4c3SReid Spencerif test "$1" = "-code-only" ; then 591be8d4c3SReid Spencer CODE_ONLY="set" 601be8d4c3SReid Spencer shift 611be8d4c3SReid Spencerelse 621be8d4c3SReid Spencer CODE_ONLY="" 631be8d4c3SReid Spencerfi 641be8d4c3SReid Spencer 65719c3835SReid Spencerif test "$1" = "" ; then 66719c3835SReid Spencer echo "Missing program name to run" 67719c3835SReid Spencer exit 1 68719c3835SReid Spencerfi 69719c3835SReid Spencer 70a559cb8eSReid SpencerPROGRAM=`which $1` 716707342fSReid Spencerif test ! -x "$PROGRAM" ; then 72a559cb8eSReid Spencer echo "Can't execute $1" 73a559cb8eSReid Spencer exit 1 74a559cb8eSReid Spencerfi 75a559cb8eSReid Spencershift; 76719c3835SReid Spencer 771be8d4c3SReid Spencerpaths_to_ignore="\ 78540aa864SReid Spencer -path */.svn/ -o \ 79540aa864SReid Spencer -path */.svn/* -o \ 801be8d4c3SReid Spencer -path docs/doxygen/* -o \ 811be8d4c3SReid Spencer -path docs/CommandGuide/html/* -o \ 821be8d4c3SReid Spencer -path docs/CommandGuide/man/* -o \ 831be8d4c3SReid Spencer -path docs/CommandGuide/ps/* -o \ 841be8d4c3SReid Spencer -path docs/CommandGuide/man/* -o \ 851be8d4c3SReid Spencer -path docs/HistoricalNotes/* -o \ 861be8d4c3SReid Spencer -path docs/img/* -o \ 871be8d4c3SReid Spencer -path */.libs/* -o \ 881be8d4c3SReid Spencer -path lib/Support/bzip2/* -o \ 891be8d4c3SReid Spencer -path projects/llvm-test/* \ 901be8d4c3SReid Spencer" 911be8d4c3SReid Spencerfiles_to_match="\ 921be8d4c3SReid Spencer -name *.ac \ 931be8d4c3SReid Spencer -o -name *.b \ 941be8d4c3SReid Spencer -o -name *.c \ 951be8d4c3SReid Spencer -o -name *.cc \ 961be8d4c3SReid Spencer -o -name *.cfg \ 971be8d4c3SReid Spencer -o -name *.cpp \ 981be8d4c3SReid Spencer -o -name *.css \ 991be8d4c3SReid Spencer -o -name *.def \ 1001be8d4c3SReid Spencer -o -name *.el \ 1011be8d4c3SReid Spencer -o -name *.exp \ 1020cb9ded0SReid Spencer -o -name *.footer \ 1031be8d4c3SReid Spencer -o -name *.gnuplot' \ 1041be8d4c3SReid Spencer -o -name *.h \ 1050cb9ded0SReid Spencer -o -name *.header \ 1060cb9ded0SReid Spencer -o -name *.html \ 1071be8d4c3SReid Spencer -o -name *.in \ 1081be8d4c3SReid Spencer -o -name *.inc \ 1090cb9ded0SReid Spencer -o -name *.intro \ 1101be8d4c3SReid Spencer -o -name *.l \ 1111be8d4c3SReid Spencer -o -name *.ll \ 1121be8d4c3SReid Spencer -o -name *.lst \ 1131be8d4c3SReid Spencer -o -name *.m4 \ 1140cb9ded0SReid Spencer -o -name *.pod \ 1151be8d4c3SReid Spencer -o -name *.pl \ 1161be8d4c3SReid Spencer -o -name *.py \ 1171be8d4c3SReid Spencer -o -name *.sh \ 1181be8d4c3SReid Spencer -o -name *.schema \ 1191be8d4c3SReid Spencer -o -name *.st \ 1201be8d4c3SReid Spencer -o -name *.tcl \ 1211be8d4c3SReid Spencer -o -name *.td \ 1221be8d4c3SReid Spencer -o -name *.tr \ 1231be8d4c3SReid Spencer -o -name *.y \ 1241be8d4c3SReid Spencer -o -name Make* \ 1253ce33b86SDaniel Dunbar -o -name *.cmake \ 1261be8d4c3SReid Spencer -o -name llvmdo \ 1271be8d4c3SReid Spencer -o -name llvmgrep \ 1281be8d4c3SReid Spencer -o -name check-each-file \ 1291be8d4c3SReid Spencer -o -name codgen-diff \ 1301be8d4c3SReid Spencer -o -name llvm-native-gcc \ 1311be8d4c3SReid Spencer -o -name llvm-native-gxx \ 1321be8d4c3SReid Spencer -o -name makellvm \ 1331be8d4c3SReid Spencer -o -path include/llvm/ADT/ilist \ 1341be8d4c3SReid Spencer -o -path test/\*.ll \ 1351be8d4c3SReid Spencer -o -path test/Scripts/not \ 1361be8d4c3SReid Spencer -o -path runtime/\*.ll \ 1371be8d4c3SReid Spencer" 1381be8d4c3SReid Spencerif test -z "$CODE_ONLY" ; then 1391be8d4c3SReid Spencer files_to_match="$files_to_match \ 1401be8d4c3SReid Spencer -o -name *.txt \ 1411be8d4c3SReid Spencer -o -name *.TXT \ 1421be8d4c3SReid Spencer -o -name *.vim \ 1431be8d4c3SReid Spencer -o -name vimrc \ 1441be8d4c3SReid Spencer -o -name README \ 1451be8d4c3SReid Spencer -o -name COPYING.LIB \ 1461be8d4c3SReid Spencer -o -name LICENSE* " 1471be8d4c3SReid Spencerfi 1481be8d4c3SReid Spencerfiles_to_ignore="\ 1491be8d4c3SReid Spencer -name \.* \ 1501be8d4c3SReid Spencer -o -name *~ \ 1511be8d4c3SReid Spencer -o -name #* \ 1521be8d4c3SReid Spencer -o -name configure \ 1531be8d4c3SReid Spencer -o -name slow.ll \ 1541be8d4c3SReid Spencer -o -name *libtool* \ 1551be8d4c3SReid Spencer -o -name ltdl* \ 1561be8d4c3SReid Spencer -o -name ltdl.m4 \ 1571be8d4c3SReid Spencer -o -name ltmain.m4 \ 1581be8d4c3SReid Spencer -o -name ltmain.sh \ 1591be8d4c3SReid Spencer -o -name aclocal.m4 \ 1601be8d4c3SReid Spencer -o -name acinclude.m4 \ 1611be8d4c3SReid Spencer -o -name *LoopSimplifyCrash.ll \ 1621be8d4c3SReid Spencer -o -name *AST-Remove.ll \ 1631be8d4c3SReid Spencer -o -name PPCPerfectShuffle.h \ 1641be8d4c3SReid Spencer" 1651be8d4c3SReid Spencer 166235c1555SReid Spencerif test -d "$TOPDIR" ; then 167235c1555SReid Spencer cd $TOPDIR 168235c1555SReid Spencer # Have to use the right "find" on a per-platform basis. Most platforms have 169235c1555SReid Spencer # Gnu find as "find", but Solaris does not. 170235c1555SReid Spencer case `uname -s` in 171235c1555SReid Spencer SunOS) find_prog=gfind ;; 172235c1555SReid Spencer *) find_prog=find ;; 173235c1555SReid Spencer esac 1741be8d4c3SReid Spencer # Turn off file name generation (globbing) so that substitution of the 1751be8d4c3SReid Spencer # variables doesn't cause the shell to create lists of file names 1761be8d4c3SReid Spencer set -f 17750a425a5SReid Spencer $find_prog $LLVMDO_DIRS -type f \ 1781be8d4c3SReid Spencer \( $paths_to_ignore \) -prune \ 1791be8d4c3SReid Spencer -o \( \( $files_to_match \) \! \( $files_to_ignore \) \ 1801be8d4c3SReid Spencer -exec $PROGRAM "$@" {} \; \) 181a559cb8eSReid Spencerelse 182a559cb8eSReid Spencer echo "Can't find LLVM top directory in $TOPDIR" 183a559cb8eSReid Spencerfi 184