Print this page
new smatch

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/Makefile
          +++ new/usr/src/tools/smatch/src/Makefile
   1      -VERSION=0.5.1-il-6
        1 +VERSION=0.6.1-rc1-il1
   2    2  
   3      -# Generating file version.h if current version has changed
   4      -SPARSE_VERSION:=$(shell git describe 2>/dev/null || echo '$(VERSION)')
   5      -VERSION_H := $(shell cat version.h 2>/dev/null)
   6      -ifneq ($(lastword $(VERSION_H)),"$(SPARSE_VERSION)")
   7      -$(info $(shell echo '     GEN      'version.h))
   8      -$(shell echo '#define SPARSE_VERSION "$(SPARSE_VERSION)"' > version.h)
   9      -endif
  10      -
        3 +########################################################################
        4 +# The following variables can be overwritten from the command line
  11    5  OS = linux
  12    6  
  13      -ifeq ($(CC),"")
  14      -CC = gcc
  15      -endif
  16    7  
  17      -CFLAGS += -O2 -finline-functions -fno-strict-aliasing -g
  18      -CFLAGS += -Wall -Wwrite-strings -Wno-switch
  19      -LDFLAGS += -g -lm -lsqlite3 -lssl -lcrypto
  20      -LD = gcc
        8 +CC ?= gcc
        9 +LD = $(CC)
  21   10  AR = ar
  22      -PKG_CONFIG = pkg-config
  23      -COMMON_CFLAGS = -O2 -finline-functions -fno-strict-aliasing -g
  24      -COMMON_CFLAGS += -Wall -Wwrite-strings
  25   11  
  26      -ALL_CFLAGS = $(COMMON_CFLAGS) $(PKG_CFLAGS) $(CFLAGS)
  27      -#
       12 +CFLAGS ?= -O2 -g
       13 +
       14 +DESTDIR ?=
       15 +PREFIX ?= $(HOME)
       16 +BINDIR ?= $(PREFIX)/bin
       17 +MANDIR ?= $(PREFIX)/share/man
       18 +
       19 +PKG_CONFIG ?= pkg-config
       20 +
       21 +CHECKER_FLAGS ?= -Wno-vla
       22 +
       23 +# Allow users to override build settings without dirtying their trees
  28   24  # For debugging, put this in local.mk:
  29   25  #
  30   26  #     CFLAGS += -O0 -DDEBUG -g3 -gdwarf-2
  31   27  #
       28 +SPARSE_LOCAL_CONFIG ?= local.mk
       29 +-include ${SPARSE_LOCAL_CONFIG}
       30 +########################################################################
  32   31  
  33      -HAVE_LIBXML:=$(shell $(PKG_CONFIG) --exists libxml-2.0 2>/dev/null && echo 'yes')
  34      -HAVE_GCC_DEP:=$(shell touch .gcc-test.c &&                              \
  35      -                $(CC) -c -Wp,-MD,.gcc-test.d .gcc-test.c 2>/dev/null && \
  36      -                echo 'yes'; rm -f .gcc-test.d .gcc-test.o .gcc-test.c)
  37   32  
  38      -GTK_VERSION:=3.0
  39      -HAVE_GTK:=$(shell $(PKG_CONFIG) --exists gtk+-$(GTK_VERSION) 2>/dev/null && echo 'yes')
  40      -ifneq ($(HAVE_GTK),yes)
  41      -        GTK_VERSION:=2.0
  42      -        HAVE_GTK:=$(shell $(PKG_CONFIG) --exists gtk+-$(GTK_VERSION) 2>/dev/null && echo 'yes')
  43      -endif
       33 +LIB_OBJS :=
       34 +LIB_OBJS += allocate.o
       35 +LIB_OBJS += builtin.o
       36 +LIB_OBJS += char.o
       37 +LIB_OBJS += compat-$(OS).o
       38 +LIB_OBJS += cse.o
       39 +LIB_OBJS += dissect.o
       40 +LIB_OBJS += dominate.o
       41 +LIB_OBJS += evaluate.o
       42 +LIB_OBJS += expand.o
       43 +LIB_OBJS += expression.o
       44 +LIB_OBJS += flow.o
       45 +LIB_OBJS += flowgraph.o
       46 +LIB_OBJS += inline.o
       47 +LIB_OBJS += ir.o
       48 +LIB_OBJS += lib.o
       49 +LIB_OBJS += linearize.o
       50 +LIB_OBJS += liveness.o
       51 +LIB_OBJS += memops.o
       52 +LIB_OBJS += opcode.o
       53 +LIB_OBJS += optimize.o
       54 +LIB_OBJS += parse.o
       55 +LIB_OBJS += pre-process.o
       56 +LIB_OBJS += ptrlist.o
       57 +LIB_OBJS += ptrmap.o
       58 +LIB_OBJS += scope.o
       59 +LIB_OBJS += show-parse.o
       60 +LIB_OBJS += simplify.o
       61 +LIB_OBJS += sort.o
       62 +LIB_OBJS += ssa.o
       63 +LIB_OBJS += sset.o
       64 +LIB_OBJS += stats.o
       65 +LIB_OBJS += storage.o
       66 +LIB_OBJS += symbol.o
       67 +LIB_OBJS += target.o
       68 +LIB_OBJS += tokenize.o
       69 +LIB_OBJS += unssa.o
       70 +LIB_OBJS += utils.o
       71 +LIB_OBJS += macro_table.o
       72 +LIB_OBJS += token_store.o
       73 +LIB_OBJS += cwchash/hashtable.o
  44   74  
  45      -LLVM_CONFIG:=llvm-config
  46      -HAVE_LLVM:=$(shell $(LLVM_CONFIG) --version >/dev/null 2>&1 && echo 'yes')
       75 +PROGRAMS :=
       76 +PROGRAMS += compile
       77 +PROGRAMS += ctags
       78 +PROGRAMS += example
       79 +PROGRAMS += graph
       80 +PROGRAMS += obfuscate
       81 +PROGRAMS += sparse
       82 +PROGRAMS += test-dissect
       83 +PROGRAMS += test-lexing
       84 +PROGRAMS += test-linearize
       85 +PROGRAMS += test-parsing
       86 +PROGRAMS += test-unssa
  47   87  
  48      -GCC_BASE := $(shell $(CC) --print-file-name=)
  49      -COMMON_CFLAGS += -DGCC_BASE=\"$(GCC_BASE)\"
       88 +INST_PROGRAMS=smatch sparse cgcc
       89 +INST_MAN1=sparse.1 cgcc.1
  50   90  
  51      -MULTIARCH_TRIPLET := $(shell $(CC) -print-multiarch 2>/dev/null)
  52      -COMMON_CFLAGS += -DMULTIARCH_TRIPLET=\"$(MULTIARCH_TRIPLET)\"
  53   91  
  54      -ifeq ($(HAVE_GCC_DEP),yes)
  55      -COMMON_CFLAGS += -Wp,-MD,$(@D)/.$(@F).d
  56      -endif
       92 +all:
  57   93  
  58      -DESTDIR=
  59      -INSTALL_PREFIX ?=$(HOME)
  60      -BINDIR=$(INSTALL_PREFIX)/bin
  61      -LIBDIR=$(INSTALL_PREFIX)/lib
  62      -MANDIR=$(INSTALL_PREFIX)/share/man
  63      -MAN1DIR=$(MANDIR)/man1
  64      -INCLUDEDIR=$(INSTALL_PREFIX)/include
  65      -PKGCONFIGDIR=$(LIBDIR)/pkgconfig
  66      -SMATCHDATADIR=$(INSTALL_PREFIX)/share/smatch
       94 +########################################################################
       95 +# common flags/options/...
  67   96  
  68      -SMATCH_FILES=smatch_flow.o smatch_conditions.o smatch_slist.o smatch_states.o \
  69      -        smatch_helper.o smatch_type.o smatch_hooks.o smatch_function_hooks.o \
  70      -        smatch_modification_hooks.o smatch_extra.o smatch_estate.o smatch_math.o \
  71      -        smatch_sval.o smatch_ranges.o smatch_implied.o smatch_ignore.o smatch_project.o \
  72      -        smatch_var_sym.o smatch_tracker.o smatch_files.o smatch_expression_stacks.o \
  73      -        smatch_equiv.o smatch_buf_size.o smatch_strlen.o smatch_capped.o smatch_db.o \
  74      -        smatch_expressions.o smatch_returns.o smatch_parse_call_math.o \
  75      -        smatch_param_limit.o smatch_param_filter.o \
  76      -        smatch_param_set.o smatch_comparison.o smatch_param_compare_limit.o smatch_local_values.o \
  77      -        smatch_function_ptrs.o smatch_annotate.o smatch_string_list.o \
  78      -        smatch_param_cleared.o smatch_start_states.o \
  79      -        smatch_recurse.o smatch_data_source.o smatch_type_val.o \
  80      -        smatch_common_functions.o smatch_struct_assignment.o \
  81      -        smatch_unknown_value.o smatch_stored_conditions.o avl.o \
  82      -        smatch_function_info.o smatch_links.o smatch_auto_copy.o \
  83      -        smatch_type_links.o smatch_untracked_param.o smatch_impossible.o \
  84      -        smatch_strings.o smatch_param_used.o smatch_container_of.o smatch_address.o \
  85      -        smatch_buf_comparison.o smatch_real_absolute.o smatch_scope.o \
  86      -        smatch_imaginary_absolute.o smatch_parameter_names.o \
  87      -        smatch_return_to_param.o smatch_passes_array_size.o \
  88      -        smatch_constraints.o smatch_constraints_required.o \
  89      -        smatch_fn_arg_link.o smatch_about_fn_ptr_arg.o smatch_mtag.o \
  90      -        smatch_mtag_map.o smatch_mtag_data.o \
  91      -        smatch_param_to_mtag_data.o smatch_mem_tracker.o smatch_array_values.o \
  92      -        smatch_nul_terminator.o smatch_assigned_expr.o smatch_kernel_user_data.o \
  93      -        smatch_statement_count.o smatch_integer_overflow.o smatch_bits.o
       97 +cflags = -fno-strict-aliasing
       98 +cflags += -Wall -Wwrite-strings -Wno-switch
  94   99  
  95      -SMATCH_CHECKS=$(shell ls check_*.c | sed -e 's/\.c/.o/')
  96      -SMATCH_DATA=smatch_data/kernel.allocation_funcs \
  97      -        smatch_data/kernel.frees_argument smatch_data/kernel.puts_argument \
  98      -        smatch_data/kernel.dev_queue_xmit smatch_data/kernel.returns_err_ptr \
  99      -        smatch_data/kernel.dma_funcs smatch_data/kernel.returns_held_funcs \
 100      -        smatch_data/kernel.no_return_funcs
      100 +GCC_BASE := $(shell $(CC) --print-file-name=)
      101 +cflags += -DGCC_BASE=\"$(GCC_BASE)\"
 101  102  
 102      -SMATCH_SCRIPTS=smatch_scripts/add_gfp_to_allocations.sh \
 103      -        smatch_scripts/build_kernel_data.sh \
 104      -        smatch_scripts/call_tree.pl smatch_scripts/filter_kernel_deref_check.sh \
 105      -        smatch_scripts/find_expanded_holes.pl smatch_scripts/find_null_params.sh \
 106      -        smatch_scripts/follow_params.pl smatch_scripts/gen_allocation_list.sh \
 107      -        smatch_scripts/gen_bit_shifters.sh smatch_scripts/gen_dma_funcs.sh \
 108      -        smatch_scripts/generisize.pl smatch_scripts/gen_err_ptr_list.sh \
 109      -        smatch_scripts/gen_expects_err_ptr.sh smatch_scripts/gen_frees_list.sh \
 110      -        smatch_scripts/gen_gfp_flags.sh smatch_scripts/gen_no_return_funcs.sh \
 111      -        smatch_scripts/gen_puts_list.sh smatch_scripts/gen_returns_held.sh \
 112      -        smatch_scripts/gen_rosenberg_funcs.sh smatch_scripts/gen_sizeof_param.sh \
 113      -        smatch_scripts/gen_unwind_functions.sh smatch_scripts/kchecker \
 114      -        smatch_scripts/kpatch.sh smatch_scripts/new_bugs.sh \
 115      -        smatch_scripts/show_errs.sh smatch_scripts/show_ifs.sh \
 116      -        smatch_scripts/show_unreachable.sh smatch_scripts/strip_whitespace.pl \
 117      -        smatch_scripts/summarize_errs.sh smatch_scripts/test_kernel.sh \
 118      -        smatch_scripts/trace_params.pl smatch_scripts/unlocked_paths.pl \
 119      -        smatch_scripts/whitespace_only.sh smatch_scripts/wine_checker.sh \
      103 +MULTIARCH_TRIPLET := $(shell $(CC) -print-multiarch 2>/dev/null)
      104 +cflags += -DMULTIARCH_TRIPLET=\"$(MULTIARCH_TRIPLET)\"
 120  105  
 121      -PROGRAMS=test-lexing test-parsing obfuscate compile graph sparse \
 122      -         test-linearize example test-unssa test-dissect ctags
 123      -INST_PROGRAMS=smatch cgcc
 124  106  
 125      -INST_MAN1=sparse.1 cgcc.1
      107 +bindir := $(DESTDIR)$(BINDIR)
      108 +man1dir := $(DESTDIR)$(MANDIR)/man1
 126  109  
      110 +########################################################################
      111 +# target specificities
      112 +
      113 +compile: compile-i386.o
      114 +EXTRA_OBJS += compile-i386.o
      115 +
      116 +# Can we use GCC's generated dependencies?
      117 +HAVE_GCC_DEP:=$(shell touch .gcc-test.c &&                              \
      118 +                $(CC) -c -Wp,-MP,-MMD,.gcc-test.d .gcc-test.c 2>/dev/null && \
      119 +                echo 'yes'; rm -f .gcc-test.d .gcc-test.o .gcc-test.c)
      120 +ifeq ($(HAVE_GCC_DEP),yes)
      121 +cflags += -Wp,-MP,-MMD,$(@D)/.$(@F).d
      122 +endif
      123 +
      124 +# Can we use libxml (needed for c2xml)?
      125 +HAVE_LIBXML:=$(shell $(PKG_CONFIG) --exists libxml-2.0 2>/dev/null && echo 'yes')
 127  126  ifeq ($(HAVE_LIBXML),yes)
 128  127  PROGRAMS+=c2xml
 129  128  INST_PROGRAMS+=c2xml
 130      -c2xml_EXTRA_OBJS = `$(PKG_CONFIG) --libs libxml-2.0`
 131      -LIBXML_CFLAGS := $(shell $(PKG_CONFIG) --cflags libxml-2.0)
      129 +c2xml-ldlibs := $(shell $(PKG_CONFIG) --libs libxml-2.0)
      130 +c2xml-cflags := $(shell $(PKG_CONFIG) --cflags libxml-2.0)
 132  131  else
 133  132  $(warning Your system does not have libxml, disabling c2xml)
 134  133  endif
 135  134  
      135 +# Can we use gtk (needed for test-inspect)
      136 +GTK_VERSION:=3.0
      137 +HAVE_GTK:=$(shell $(PKG_CONFIG) --exists gtk+-$(GTK_VERSION) 2>/dev/null && echo 'yes')
      138 +ifneq ($(HAVE_GTK),yes)
      139 +GTK_VERSION:=2.0
      140 +HAVE_GTK:=$(shell $(PKG_CONFIG) --exists gtk+-$(GTK_VERSION) 2>/dev/null && echo 'yes')
      141 +endif
 136  142  ifeq ($(HAVE_GTK),yes)
 137  143  GTK_CFLAGS := $(shell $(PKG_CONFIG) --cflags gtk+-$(GTK_VERSION))
 138      -GTK_LIBS := $(shell $(PKG_CONFIG) --libs gtk+-$(GTK_VERSION))
      144 +ast-view-cflags := $(GTK_CFLAGS)
      145 +ast-model-cflags := $(GTK_CFLAGS)
      146 +ast-inspect-cflags := $(GTK_CFLAGS)
      147 +test-inspect-cflags := $(GTK_CFLAGS)
      148 +test-inspect-ldlibs := $(shell $(PKG_CONFIG) --libs gtk+-$(GTK_VERSION))
      149 +test-inspect: ast-model.o ast-view.o ast-inspect.o
      150 +EXTRA_OBJS += ast-model.o ast-view.o ast-inspect.o
 139  151  PROGRAMS += test-inspect
 140  152  INST_PROGRAMS += test-inspect
 141      -test-inspect_EXTRA_DEPS := ast-model.o ast-view.o ast-inspect.o
 142      -test-inspect_OBJS := test-inspect.o $(test-inspect_EXTRA_DEPS)
 143      -$(test-inspect_OBJS) $(test-inspect_OBJS:.o=.sc): PKG_CFLAGS += $(GTK_CFLAGS)
 144      -test-inspect_EXTRA_OBJS := $(GTK_LIBS)
 145  153  else
 146  154  $(warning Your system does not have gtk3/gtk2, disabling test-inspect)
 147  155  endif
 148  156  
      157 +# Can we use LLVM (needed for ... sparse-llvm)?
      158 +LLVM_CONFIG:=llvm-config
      159 +HAVE_LLVM:=$(shell $(LLVM_CONFIG) --version >/dev/null 2>&1 && echo 'yes')
 149  160  ifeq ($(HAVE_LLVM),yes)
 150      -ifeq ($(shell uname -m | grep -q '\(i386\|x86\)' && echo ok),ok)
      161 +arch := $(shell uname -m)
      162 +ifeq (${MULTIARCH_TRIPLET},x86_64-linux-gnux32)
      163 +arch := x32
      164 +endif
      165 +ifneq ($(filter ${arch},i386 i486 i586 i686 x86_64 amd64),)
 151  166  LLVM_VERSION:=$(shell $(LLVM_CONFIG) --version)
 152  167  ifeq ($(shell expr "$(LLVM_VERSION)" : '[3-9]\.'),2)
 153  168  LLVM_PROGS := sparse-llvm
 154  169  $(LLVM_PROGS): LD := g++
 155  170  LLVM_LDFLAGS := $(shell $(LLVM_CONFIG) --ldflags)
 156      -LLVM_CFLAGS := $(shell $(LLVM_CONFIG) --cflags | sed -e "s/-DNDEBUG//g" | sed -e "s/-pedantic//g")
      171 +LLVM_CFLAGS := -I$(shell $(LLVM_CONFIG) --includedir)
 157  172  LLVM_LIBS := $(shell $(LLVM_CONFIG) --libs)
 158  173  LLVM_LIBS += $(shell $(LLVM_CONFIG) --system-libs 2>/dev/null)
      174 +LLVM_LIBS += $(shell $(LLVM_CONFIG) --cxxflags | grep -F -q -e '-stdlib=libc++' && echo -lc++)
 159  175  PROGRAMS += $(LLVM_PROGS)
 160  176  INST_PROGRAMS += sparse-llvm sparsec
 161      -sparse-llvm.o sparse-llvm.sc: PKG_CFLAGS += $(LLVM_CFLAGS)
 162      -sparse-llvm_EXTRA_OBJS := $(LLVM_LIBS) $(LLVM_LDFLAGS)
      177 +sparse-llvm-cflags := $(LLVM_CFLAGS) -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS
      178 +sparse-llvm-ldflags := $(LLVM_LDFLAGS)
      179 +sparse-llvm-ldlibs := $(LLVM_LIBS)
 163  180  else
 164  181  $(warning LLVM 3.0 or later required. Your system has version $(LLVM_VERSION) installed.)
 165  182  endif
 166  183  else
 167      -$(warning sparse-llvm disabled on $(shell uname -m))
      184 +$(warning sparse-llvm disabled on ${arch})
 168  185  endif
 169  186  else
 170  187  $(warning Your system does not have llvm, disabling sparse-llvm)
 171  188  endif
 172  189  
 173      -LIB_H=    token.h parse.h lib.h symbol.h scope.h expression.h target.h \
 174      -          linearize.h bitmap.h ident-list.h compat.h flow.h allocate.h \
 175      -          storage.h ptrlist.h dissect.h
      190 +########################################################################
      191 +LIBS := libsparse.a
      192 +OBJS := $(LIB_OBJS) $(EXTRA_OBJS) $(PROGRAMS:%=%.o)
 176  193  
 177      -LIB_OBJS= target.o parse.o tokenize.o pre-process.o symbol.o lib.o scope.o \
 178      -          expression.o show-parse.o evaluate.o expand.o inline.o linearize.o \
 179      -          char.o sort.o allocate.o compat-$(OS).o ptrlist.o \
 180      -          builtin.o \
 181      -          stats.o \
 182      -          flow.o cse.o simplify.o memops.o liveness.o storage.o unssa.o \
 183      -          dissect.o \
 184      -          macro_table.o token_store.o cwchash/hashtable.o
 185      -
 186      -LIB_FILE= libsparse.a
 187      -SLIB_FILE= libsparse.so
 188      -
 189      -# If you add $(SLIB_FILE) to this, you also need to add -fpic to BASIC_CFLAGS above.
 190      -# Doing so incurs a noticeable performance hit, and Sparse does not have a
 191      -# stable shared library interface, so this does not occur by default.  If you
 192      -# really want a shared library, you may want to build Sparse twice: once
 193      -# without -fpic to get all the Sparse tools, and again with -fpic to get the
 194      -# shared library.
 195      -LIBS=$(LIB_FILE)
 196      -
 197      -#
 198  194  # Pretty print
 199      -#
 200      -V             = @
 201      -Q             = $(V:1=)
 202      -QUIET_CC      = $(Q:@=@echo    '     CC       '$@;)
 203      -QUIET_CHECK   = $(Q:@=@echo    '     CHECK    '$<;)
 204      -QUIET_AR      = $(Q:@=@echo    '     AR       '$@;)
 205      -QUIET_GEN     = $(Q:@=@echo    '     GEN      '$@;)
 206      -QUIET_LINK    = $(Q:@=@echo    '     LINK     '$@;)
 207      -# We rely on the -v switch of install to print 'file -> $install_dir/file'
 208      -QUIET_INST_SH = $(Q:@=echo -n  '     INSTALL  ';)
 209      -QUIET_INST    = $(Q:@=@echo -n '     INSTALL  ';)
      195 +V := @
      196 +Q := $(V:1=)
 210  197  
 211      -define INSTALL_EXEC
 212      -        $(QUIET_INST)install -v $1 $(DESTDIR)$2/$1 || exit 1;
      198 +########################################################################
 213  199  
 214      -endef
      200 +SMATCHDATADIR=$(INSTALL_PREFIX)/share/smatch
 215  201  
 216      -define INSTALL_FILE
 217      -        $(QUIET_INST)install -v -m 644 $1 $(DESTDIR)$2/$1 || exit 1;
      202 +SMATCH_OBJS :=
      203 +SMATCH_OBJS += avl.o
      204 +SMATCH_OBJS += smatch_about_fn_ptr_arg.o
      205 +SMATCH_OBJS += smatch_address.o
      206 +SMATCH_OBJS += smatch_annotate.o
      207 +SMATCH_OBJS += smatch_array_values.o
      208 +SMATCH_OBJS += smatch_assigned_expr.o
      209 +SMATCH_OBJS += smatch_bits.o
      210 +SMATCH_OBJS += smatch_buf_comparison.o
      211 +SMATCH_OBJS += smatch_buf_size.o
      212 +SMATCH_OBJS += smatch_capped.o
      213 +SMATCH_OBJS += smatch_common_functions.o
      214 +SMATCH_OBJS += smatch_comparison.o
      215 +SMATCH_OBJS += smatch_conditions.o
      216 +SMATCH_OBJS += smatch_constraints.o
      217 +SMATCH_OBJS += smatch_constraints_required.o
      218 +SMATCH_OBJS += smatch_container_of.o
      219 +SMATCH_OBJS += smatch_data_source.o
      220 +SMATCH_OBJS += smatch_db.o
      221 +SMATCH_OBJS += smatch_equiv.o
      222 +SMATCH_OBJS += smatch_estate.o
      223 +SMATCH_OBJS += smatch_expressions.o
      224 +SMATCH_OBJS += smatch_expression_stacks.o
      225 +SMATCH_OBJS += smatch_extra.o
      226 +SMATCH_OBJS += smatch_files.o
      227 +SMATCH_OBJS += smatch_flow.o
      228 +SMATCH_OBJS += smatch_fn_arg_link.o
      229 +SMATCH_OBJS += smatch_function_hooks.o
      230 +SMATCH_OBJS += smatch_function_info.o
      231 +SMATCH_OBJS += smatch_function_ptrs.o
      232 +SMATCH_OBJS += smatch_helper.o
      233 +SMATCH_OBJS += smatch_hooks.o
      234 +SMATCH_OBJS += smatch_ignore.o
      235 +SMATCH_OBJS += smatch_imaginary_absolute.o
      236 +SMATCH_OBJS += smatch_implied.o
      237 +SMATCH_OBJS += smatch_impossible.o
      238 +SMATCH_OBJS += smatch_integer_overflow.o
      239 +SMATCH_OBJS += smatch_kernel_user_data.o
      240 +SMATCH_OBJS += smatch_links.o
      241 +SMATCH_OBJS += smatch_math.o
      242 +SMATCH_OBJS += smatch_mem_tracker.o
      243 +SMATCH_OBJS += smatch_modification_hooks.o
      244 +SMATCH_OBJS += smatch_mtag_data.o
      245 +SMATCH_OBJS += smatch_mtag_map.o
      246 +SMATCH_OBJS += smatch_mtag.o
      247 +SMATCH_OBJS += smatch_nul_terminator.o
      248 +SMATCH_OBJS += smatch_param_cleared.o
      249 +SMATCH_OBJS += smatch_param_compare_limit.o
      250 +SMATCH_OBJS += smatch_parameter_names.o
      251 +SMATCH_OBJS += smatch_param_filter.o
      252 +SMATCH_OBJS += smatch_param_limit.o
      253 +SMATCH_OBJS += smatch_param_set.o
      254 +SMATCH_OBJS += smatch_param_to_mtag_data.o
      255 +SMATCH_OBJS += smatch_param_used.o
      256 +SMATCH_OBJS += smatch_parse_call_math.o
      257 +SMATCH_OBJS += smatch_passes_array_size.o
      258 +SMATCH_OBJS += smatch_project.o
      259 +SMATCH_OBJS += smatch_ranges.o
      260 +SMATCH_OBJS += smatch_real_absolute.o
      261 +SMATCH_OBJS += smatch_recurse.o
      262 +SMATCH_OBJS += smatch_returns.o
      263 +SMATCH_OBJS += smatch_return_to_param.o
      264 +SMATCH_OBJS += smatch_scope.o
      265 +SMATCH_OBJS += smatch_slist.o
      266 +SMATCH_OBJS += smatch_start_states.o
      267 +SMATCH_OBJS += smatch_statement_count.o
      268 +SMATCH_OBJS += smatch_states.o
      269 +SMATCH_OBJS += smatch_stored_conditions.o
      270 +SMATCH_OBJS += smatch_string_list.o
      271 +SMATCH_OBJS += smatch_strings.o
      272 +SMATCH_OBJS += smatch_strlen.o
      273 +SMATCH_OBJS += smatch_struct_assignment.o
      274 +SMATCH_OBJS += smatch_sval.o
      275 +SMATCH_OBJS += smatch_tracker.o
      276 +SMATCH_OBJS += smatch_type_links.o
      277 +SMATCH_OBJS += smatch_type.o
      278 +SMATCH_OBJS += smatch_type_val.o
      279 +SMATCH_OBJS += smatch_unknown_value.o
      280 +SMATCH_OBJS += smatch_untracked_param.o
      281 +SMATCH_OBJS += smatch_var_sym.o
 218  282  
 219      -endef
      283 +SMATCH_CHECKS=$(shell ls check_*.c | sed -e 's/\.c/.o/')
      284 +SMATCH_DATA=smatch_data/kernel.allocation_funcs \
      285 +        smatch_data/kernel.frees_argument smatch_data/kernel.puts_argument \
      286 +        smatch_data/kernel.dev_queue_xmit smatch_data/kernel.returns_err_ptr \
      287 +        smatch_data/kernel.dma_funcs smatch_data/kernel.returns_held_funcs \
      288 +        smatch_data/kernel.no_return_funcs
 220  289  
 221      -SED_PC_CMD = 's|@version@|$(VERSION)|g;         \
 222      -              s|@prefix@|$(INSTALL_PREFIX)|g;           \
 223      -              s|@libdir@|$(LIBDIR)|g;           \
 224      -              s|@includedir@|$(INCLUDEDIR)|g'
      290 +SMATCH_SCRIPTS=smatch_scripts/add_gfp_to_allocations.sh \
      291 +        smatch_scripts/build_kernel_data.sh \
      292 +        smatch_scripts/call_tree.pl smatch_scripts/filter_kernel_deref_check.sh \
      293 +        smatch_scripts/find_expanded_holes.pl smatch_scripts/find_null_params.sh \
      294 +        smatch_scripts/follow_params.pl smatch_scripts/gen_allocation_list.sh \
      295 +        smatch_scripts/gen_bit_shifters.sh smatch_scripts/gen_dma_funcs.sh \
      296 +        smatch_scripts/generisize.pl smatch_scripts/gen_err_ptr_list.sh \
      297 +        smatch_scripts/gen_expects_err_ptr.sh smatch_scripts/gen_frees_list.sh \
      298 +        smatch_scripts/gen_gfp_flags.sh smatch_scripts/gen_no_return_funcs.sh \
      299 +        smatch_scripts/gen_puts_list.sh smatch_scripts/gen_returns_held.sh \
      300 +        smatch_scripts/gen_rosenberg_funcs.sh smatch_scripts/gen_sizeof_param.sh \
      301 +        smatch_scripts/gen_unwind_functions.sh smatch_scripts/kchecker \
      302 +        smatch_scripts/kpatch.sh smatch_scripts/new_bugs.sh \
      303 +        smatch_scripts/show_errs.sh smatch_scripts/show_ifs.sh \
      304 +        smatch_scripts/show_unreachable.sh smatch_scripts/strip_whitespace.pl \
      305 +        smatch_scripts/summarize_errs.sh smatch_scripts/test_kernel.sh \
      306 +        smatch_scripts/trace_params.pl smatch_scripts/unlocked_paths.pl \
      307 +        smatch_scripts/whitespace_only.sh smatch_scripts/wine_checker.sh \
 225  308  
      309 +SMATCH_LDFLAGS := -lsqlite3  -lssl -lcrypto -lm
 226  310  
      311 +smatch: smatch.o $(SMATCH_OBJS) $(SMATCH_CHECKS) $(LIBS)
      312 +        $(Q)$(LD) -o $@ $< $(SMATCH_OBJS) $(SMATCH_CHECKS) $(LIBS) $(SMATCH_LDFLAGS)
 227  313  
 228      -# Allow users to override build settings without dirtying their trees
 229      --include local.mk
 230      -
 231      -
 232      -all: $(PROGRAMS) sparse.pc smatch
 233      -
 234      -all-installable: $(INST_PROGRAMS) $(LIBS) $(LIB_H) sparse.pc
 235      -
 236      -install: all-installable
 237      -        $(Q)install -d $(DESTDIR)$(BINDIR)
 238      -        $(Q)install -d $(DESTDIR)$(LIBDIR)
 239      -        $(Q)install -d $(DESTDIR)$(MAN1DIR)
 240      -        $(Q)install -d $(DESTDIR)$(INCLUDEDIR)/sparse
 241      -        $(Q)install -d $(DESTDIR)$(PKGCONFIGDIR)
 242      -        $(Q)install -d $(DESTDIR)$(SMATCHDATADIR)/smatch_data
 243      -        $(Q)install -d $(DESTDIR)$(SMATCHDATADIR)/smatch_scripts
 244      -        $(foreach f,$(INST_PROGRAMS),$(call INSTALL_EXEC,$f,$(BINDIR)))
 245      -        $(foreach f,$(INST_MAN1),$(call INSTALL_FILE,$f,$(MAN1DIR)))
 246      -        $(foreach f,$(LIBS),$(call INSTALL_FILE,$f,$(LIBDIR)))
 247      -        $(foreach f,$(LIB_H),$(call INSTALL_FILE,$f,$(INCLUDEDIR)/sparse))
 248      -        $(call INSTALL_FILE,sparse.pc,$(PKGCONFIGDIR))
 249      -        $(foreach f,$(SMATCH_DATA),$(call INSTALL_FILE,$f,$(SMATCHDATADIR)))
 250      -        $(foreach f,$(SMATCH_SCRIPTS),$(call INSTALL_EXEC,$f,$(SMATCHDATADIR)))
 251      -
 252      -sparse.pc: sparse.pc.in
 253      -        $(QUIET_GEN)sed $(SED_PC_CMD) sparse.pc.in > sparse.pc
 254      -
 255      -
 256      -compile_EXTRA_DEPS = compile-i386.o
 257      -
 258      -$(foreach p,$(PROGRAMS),$(eval $(p): $($(p)_EXTRA_DEPS) $(LIBS)))
 259      -$(PROGRAMS): % : %.o 
 260      -        $(QUIET_LINK)$(LD) -o $@ $^ $($@_EXTRA_OBJS) $(LDFLAGS)
 261      -
 262      -smatch: smatch.o $(SMATCH_FILES) $(SMATCH_CHECKS) $(LIBS) 
 263      -        $(QUIET_LINK)$(LD) -o $@ $< $(SMATCH_FILES) $(SMATCH_CHECKS) $(LIBS) $(LDFLAGS)
 264      -
 265      -$(LIB_FILE): $(LIB_OBJS)
 266      -        $(QUIET_AR)$(AR) rcs $@ $(LIB_OBJS)
 267      -
 268      -$(SLIB_FILE): $(LIB_OBJS)
 269      -        $(QUIET_LINK)$(CC) -Wl,-soname,$@ -shared -o $@ $(LIB_OBJS) $(LDFLAGS)
 270      -
 271  314  check_list_local.h:
 272  315          touch check_list_local.h
 273  316  
 274  317  smatch.o: smatch.c $(LIB_H) smatch.h check_list.h check_list_local.h
 275  318          $(CC) $(CFLAGS) -c smatch.c -DSMATCHDATADIR='"$(SMATCHDATADIR)"'
 276      -$(SMATCH_CHECKS): smatch.h smatch_slist.h smatch_extra.h avl.h
 277      -DEP_FILES := $(wildcard .*.o.d)
 278  319  
 279      -ifneq ($(DEP_FILES),)
 280      -include $(DEP_FILES)
 281      -endif
      320 +$(SMATCH_OBJS) $(SMATCH_CHECKS): smatch.h smatch_slist.h smatch_extra.h avl.h
 282  321  
 283      -c2xml.o c2xml.sc: PKG_CFLAGS += $(LIBXML_CFLAGS)
      322 +########################################################################
      323 +all: $(PROGRAMS) smatch
 284  324  
 285      -pre-process.sc: CHECKER_FLAGS += -Wno-vla
      325 +ldflags += $($(@)-ldflags) $(LDFLAGS)
      326 +ldlibs  += $($(@)-ldlibs)  $(LDLIBS) -lm
      327 +$(PROGRAMS): % : %.o $(LIBS)
      328 +        @echo "  LD      $@"
      329 +        $(Q)$(LD) $(ldflags) $^ $(ldlibs) -o $@
 286  330  
 287      -%.o: %.c $(LIB_H)
 288      -        $(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) $<
      331 +libsparse.a: $(LIB_OBJS)
      332 +        @echo "  AR      $@"
      333 +        $(Q)$(AR) rcs $@ $^
 289  334  
 290      -%.sc: %.c sparse
 291      -        $(QUIET_CHECK) $(CHECKER) $(CHECKER_FLAGS) -c $(ALL_CFLAGS) $<
 292  335  
 293      -ALL_OBJS :=  $(LIB_OBJS) $(foreach p,$(PROGRAMS),$(p).o $($(p)_EXTRA_DEPS))
 294      -selfcheck: $(ALL_OBJS:.o=.sc)
      336 +cflags   += $($(*)-cflags) $(CPPFLAGS) $(CFLAGS)
      337 +%.o: %.c
      338 +        @echo "  CC      $@"
      339 +        $(Q)$(CC) $(cflags) -c -o $@ $<
 295  340  
      341 +%.sc: %.c sparse
      342 +        @echo "  CHECK   $<"
      343 +        $(Q)CHECK=./sparse ./cgcc -no-compile $(CHECKER_FLAGS) $(cflags) -c $<
 296  344  
 297      -clean: clean-check
 298      -        rm -f *.[oa] .*.d *.so cwchash/*.o cwchash/.*.d cwchash/tester \
 299      -                $(PROGRAMS) $(SLIB_FILE) pre-process.h sparse.pc version.h
      345 +selfcheck: $(OBJS:.o=.sc)
 300  346  
 301      -dist:
 302      -        @if test "$(SPARSE_VERSION)" != "v$(VERSION)" ; then \
 303      -                echo 'Update VERSION in the Makefile before running "make dist".' ; \
 304      -                exit 1 ; \
      347 +
      348 +SPARSE_VERSION:=$(shell git describe --dirty 2>/dev/null || echo '$(VERSION)')
      349 +lib.o: version.h
      350 +version.h: FORCE
      351 +        @echo '#define SPARSE_VERSION "$(SPARSE_VERSION)"' > version.h.tmp
      352 +        @if cmp -s version.h version.h.tmp; then \
      353 +                rm version.h.tmp; \
      354 +        else \
      355 +                echo "  GEN     $@"; \
      356 +                mv version.h.tmp version.h; \
 305  357          fi
 306      -        git archive --format=tar --prefix=sparse-$(VERSION)/ HEAD^{tree} | gzip -9 > sparse-$(VERSION).tar.gz
 307  358  
      359 +
 308  360  check: all
 309  361          $(Q)cd validation && ./test-suite
      362 +validation/%.t: $(PROGRAMS)
      363 +        @validation/test-suite single $*.c
 310  364  
      365 +
      366 +clean: clean-check
      367 +        @rm -f *.[oa] .*.d $(PROGRAMS) version.h smatch
 311  368  clean-check:
 312      -        find validation/ \( -name "*.c.output.expected" \
 313      -                         -o -name "*.c.output.got" \
 314      -                         -o -name "*.c.output.diff" \
 315      -                         -o -name "*.c.error.expected" \
 316      -                         -o -name "*.c.error.got" \
 317      -                         -o -name "*.c.error.diff" \
 318      -                         \) -exec rm {} \;
      369 +        @echo "  CLEAN"
      370 +        @find validation/ \( -name "*.c.output.*" \
      371 +                          -o -name "*.c.error.*" \
      372 +                          -o -name "*.o" \
      373 +                          \) -exec rm {} \;
      374 +
      375 +
      376 +install: install-bin install-man
      377 +install-bin: $(INST_PROGRAMS:%=$(bindir)/%)
      378 +install-man: $(INST_MAN1:%=$(man1dir)/%)
      379 +
      380 +$(bindir)/%: %
      381 +        @echo "  INSTALL $@"
      382 +        $(Q)install -D        $< $@ || exit 1;
      383 +$(man1dir)/%: %
      384 +        @echo "  INSTALL $@"
      385 +        $(Q)install -D -m 644 $< $@ || exit 1;
      386 +
      387 +.PHONY: FORCE
      388 +
      389 +# GCC's dependencies
      390 +-include $(OBJS:%.o=.%.o.d)
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX