xref: /llvm-project-15.0.7/llvm/utils/llvmdo (revision 2946cd70)
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