19b414d3e2d0cb84512b55a3275a98490b090162aDaniel Dunbar//===--- AnalyzerOptions.h - Analysis Engine Options ------------*- C++ -*-===//
2e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman//
3e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman//                     The LLVM Compiler Infrastructure
4e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman//
5e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman// This file is distributed under the University of Illinois Open Source
6e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman// License. See LICENSE.TXT for details.
7e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman//
8e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman//===----------------------------------------------------------------------===//
9e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman//
105705a40c7ec62f1a903bf26e1e6a7f91b5b98ba3Ted Kremenek// This header defines various options for the static analyzer that are set
115705a40c7ec62f1a903bf26e1e6a7f91b5b98ba3Ted Kremenek// by the frontend and are consulted throughout the analyzer.
12e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman//
13e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman//===----------------------------------------------------------------------===//
14e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman
155705a40c7ec62f1a903bf26e1e6a7f91b5b98ba3Ted Kremenek#ifndef LLVM_CLANG_ANALYZEROPTIONS_H
165705a40c7ec62f1a903bf26e1e6a7f91b5b98ba3Ted Kremenek#define LLVM_CLANG_ANALYZEROPTIONS_H
175746f1ff6286f5e5bd7fc28e5e2031f18e4676c9Daniel Dunbar
1881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose#include "clang/Basic/LLVM.h"
1945796b10d11869e86c6b85e24df165410536b313Ted Kremenek#include "llvm/ADT/IntrusiveRefCntPtr.h"
2030a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "llvm/ADT/Optional.h"
217229d0011766c174beffe6a846d78f448f845b39Anna Zaks#include "llvm/ADT/StringMap.h"
2230a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include <string>
2330a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include <vector>
24e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman
25e1718aff224e7da84720beb42a39362199ca83f3Eli Friedmannamespace clang {
26e1718aff224e7da84720beb42a39362199ca83f3Eli Friedmanclass ASTConsumer;
27d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikieclass DiagnosticsEngine;
28e1718aff224e7da84720beb42a39362199ca83f3Eli Friedmanclass Preprocessor;
29e1718aff224e7da84720beb42a39362199ca83f3Eli Friedmanclass LangOptions;
30e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman
31e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman/// Analysis - Set of available source code analyses.
32e1718aff224e7da84720beb42a39362199ca83f3Eli Friedmanenum Analyses {
33e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman#define ANALYSIS(NAME, CMDFLAG, DESC, SCOPE) NAME,
34987695a5ddd78beca784d4e503ffbc2dc879181aTed Kremenek#include "clang/StaticAnalyzer/Core/Analyses.def"
35e1718aff224e7da84720beb42a39362199ca83f3Eli FriedmanNumAnalyses
36e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman};
37e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman
38e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman/// AnalysisStores - Set of available analysis store models.
39e1718aff224e7da84720beb42a39362199ca83f3Eli Friedmanenum AnalysisStores {
40e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman#define ANALYSIS_STORE(NAME, CMDFLAG, DESC, CREATFN) NAME##Model,
41987695a5ddd78beca784d4e503ffbc2dc879181aTed Kremenek#include "clang/StaticAnalyzer/Core/Analyses.def"
42e1718aff224e7da84720beb42a39362199ca83f3Eli FriedmanNumStores
43e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman};
44e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman
45e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman/// AnalysisConstraints - Set of available constraint models.
46e1718aff224e7da84720beb42a39362199ca83f3Eli Friedmanenum AnalysisConstraints {
47e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) NAME##Model,
48987695a5ddd78beca784d4e503ffbc2dc879181aTed Kremenek#include "clang/StaticAnalyzer/Core/Analyses.def"
49e1718aff224e7da84720beb42a39362199ca83f3Eli FriedmanNumConstraints
50e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman};
51e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman
52e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman/// AnalysisDiagClients - Set of available diagnostic clients for rendering
53e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman///  analysis results.
54e1718aff224e7da84720beb42a39362199ca83f3Eli Friedmanenum AnalysisDiagClients {
55e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN, AUTOCREAT) PD_##NAME,
56987695a5ddd78beca784d4e503ffbc2dc879181aTed Kremenek#include "clang/StaticAnalyzer/Core/Analyses.def"
57e1718aff224e7da84720beb42a39362199ca83f3Eli FriedmanNUM_ANALYSIS_DIAG_CLIENTS
58e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman};
59e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman
60d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks/// AnalysisPurgeModes - Set of available strategies for dead symbol removal.
61d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaksenum AnalysisPurgeMode {
62d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) NAME,
63987695a5ddd78beca784d4e503ffbc2dc879181aTed Kremenek#include "clang/StaticAnalyzer/Core/Analyses.def"
64d30952838421ddfb9f7e346b2ba8213889a5f789Anna ZaksNumPurgeModes
65d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks};
66d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks
6766253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks/// AnalysisInlineFunctionSelection - Set of inlining function selection heuristics.
6866253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaksenum AnalysisInliningMode {
6966253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) NAME,
70987695a5ddd78beca784d4e503ffbc2dc879181aTed Kremenek#include "clang/StaticAnalyzer/Core/Analyses.def"
7166253352131e3e7a22b3bfd0e180607aa2bfb988Anna ZaksNumInliningModes
7266253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks};
7366253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks
74de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose/// \brief Describes the different kinds of C++ member functions which can be
75de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose/// considered for inlining by the analyzer.
76de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose///
77de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose/// These options are cumulative; enabling one kind of member function will
78de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose/// enable all kinds with lower enum values.
79de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Roseenum CXXInlineableMemberKind {
80de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  // Uninitialized = 0,
81de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose
82de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  /// A dummy mode in which no C++ inlining is enabled.
83de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  CIMK_None = 1,
84de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose
85de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  /// Refers to regular member function and operator calls.
86de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  CIMK_MemberFunctions,
87de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose
88de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  /// Refers to constructors (implicit or explicit).
89de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  ///
90de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  /// Note that a constructor will not be inlined if the corresponding
91de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  /// destructor is non-trivial.
92de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  CIMK_Constructors,
93de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose
94de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  /// Refers to destructors (implicit or explicit).
95de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  CIMK_Destructors
96de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose};
97de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose
98bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks/// \brief Describes the different modes of inter-procedural analysis.
99bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaksenum IPAKind {
100bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  IPAK_NotSet = 0,
101bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks
102bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  /// Perform only intra-procedural analysis.
103bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  IPAK_None = 1,
104bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks
105bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  /// Inline C functions and blocks when their definitions are available.
106bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  IPAK_BasicInlining = 2,
107bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks
108d130140cb7bce73b4350c5d50495443abe38418aAnna Zaks  /// Inline callees(C, C++, ObjC) when their definitions are available.
109bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  IPAK_Inlining = 3,
110bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks
111bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  /// Enable inlining of dynamically dispatched methods.
112bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  IPAK_DynamicDispatch = 4,
113bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks
114bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  /// Enable inlining of dynamically dispatched methods, bifurcate paths when
115bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  /// exact type info is unavailable.
116bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  IPAK_DynamicDispatchBifurcate = 5
117bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks};
118de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose
119cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenkoclass AnalyzerOptions : public RefCountedBase<AnalyzerOptions> {
120918ac48e315d42fed7fe856a3fce70d9d930cdcdDaniel Dunbarpublic:
121255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  typedef llvm::StringMap<std::string> ConfigTable;
122255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek
12343dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis  /// \brief Pair of checker name and enable/disable.
12443dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis  std::vector<std::pair<std::string, bool> > CheckersControlList;
125255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek
126255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  /// \brief A key-value table of use-specified configuration values.
127255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  ConfigTable Config;
128e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman  AnalysisStores AnalysisStoreOpt;
129e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman  AnalysisConstraints AnalysisConstraintsOpt;
130e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman  AnalysisDiagClients AnalysisDiagOpt;
131d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks  AnalysisPurgeMode AnalysisPurgeOpt;
132255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek
133e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman  std::string AnalyzeSpecificFunction;
134255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek
135255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  /// \brief The maximum number of times the analyzer visits a block.
1362fa9d72d4d23ccdcd4137946e5ebafac7a04f04cTed Kremenek  unsigned maxBlockVisitOnPath;
137255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek
138255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek
139116f3640daee424dfcdbe55e80be5a67476be4b0Argyrios Kyrtzidis  unsigned ShowCheckerHelp : 1;
140918ac48e315d42fed7fe856a3fce70d9d930cdcdDaniel Dunbar  unsigned AnalyzeAll : 1;
141918ac48e315d42fed7fe856a3fce70d9d930cdcdDaniel Dunbar  unsigned AnalyzerDisplayProgress : 1;
142fc576514d06c46a7cac49500169411d82f38d04bTed Kremenek  unsigned AnalyzeNestedBlocks : 1;
143255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek
144255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  /// \brief The flag regulates if we should eagerly assume evaluations of
145255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  /// conditionals, thus, bifurcating the path.
146255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  ///
1470caa2d47b84337e942b3f6652adfafe4ae506cfeTed Kremenek  /// This flag indicates how the engine should handle expressions such as: 'x =
1480caa2d47b84337e942b3f6652adfafe4ae506cfeTed Kremenek  /// (y != 0)'.  When this flag is true then the subexpression 'y != 0' will be
1490caa2d47b84337e942b3f6652adfafe4ae506cfeTed Kremenek  /// eagerly assumed to be true or false, thus evaluating it to the integers 0
1500caa2d47b84337e942b3f6652adfafe4ae506cfeTed Kremenek  /// or 1 respectively.  The upside is that this can increase analysis
1510caa2d47b84337e942b3f6652adfafe4ae506cfeTed Kremenek  /// precision until we have a better way to lazily evaluate such logic.  The
1520caa2d47b84337e942b3f6652adfafe4ae506cfeTed Kremenek  /// downside is that it eagerly bifurcates paths.
1530caa2d47b84337e942b3f6652adfafe4ae506cfeTed Kremenek  unsigned eagerlyAssumeBinOpBifurcation : 1;
154255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek
155918ac48e315d42fed7fe856a3fce70d9d930cdcdDaniel Dunbar  unsigned TrimGraph : 1;
1563b8a04004afa46057a9af4afbd086be71d619793Ted Kremenek  unsigned visualizeExplodedGraphWithGraphViz : 1;
1573b8a04004afa46057a9af4afbd086be71d619793Ted Kremenek  unsigned visualizeExplodedGraphWithUbiGraph : 1;
1589b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek  unsigned UnoptimizedCFG : 1;
15981fb169f42769e02c7425b23885a261c025fd5e6Anna Zaks  unsigned PrintStats : 1;
160255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek
161255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  /// \brief Do not re-analyze paths leading to exhausted nodes with a different
162255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  /// strategy. We get better code coverage when retry is enabled.
163b47dbcbc12430fdf3e5a5b9f59cdec5480e89e75Anna Zaks  unsigned NoRetryExhausted : 1;
164255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek
165255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  /// \brief The inlining stack depth limit.
1668235f9c9c8b3d1737d1c6bd57f7ba3f616b92392Anna Zaks  unsigned InlineMaxStackDepth;
167255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek
168255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  /// \brief The mode of function selection used during inlining.
16966253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks  AnalysisInliningMode InliningMode;
1707b99d12b4ca67fccdf5090761ba257732e954e75Zhongxing Xu
171de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Roseprivate:
172d130140cb7bce73b4350c5d50495443abe38418aAnna Zaks  /// \brief Describes the kinds for high-level analyzer mode.
173d130140cb7bce73b4350c5d50495443abe38418aAnna Zaks  enum UserModeKind {
174d130140cb7bce73b4350c5d50495443abe38418aAnna Zaks    UMK_NotSet = 0,
175d130140cb7bce73b4350c5d50495443abe38418aAnna Zaks    /// Perform shallow but fast analyzes.
176d130140cb7bce73b4350c5d50495443abe38418aAnna Zaks    UMK_Shallow = 1,
177d130140cb7bce73b4350c5d50495443abe38418aAnna Zaks    /// Perform deep analyzes.
178d130140cb7bce73b4350c5d50495443abe38418aAnna Zaks    UMK_Deep = 2
179d130140cb7bce73b4350c5d50495443abe38418aAnna Zaks  };
180d130140cb7bce73b4350c5d50495443abe38418aAnna Zaks
181d130140cb7bce73b4350c5d50495443abe38418aAnna Zaks  /// Controls the high-level analyzer mode, which influences the default
182d130140cb7bce73b4350c5d50495443abe38418aAnna Zaks  /// settings for some of the lower-level config options (such as IPAMode).
183d130140cb7bce73b4350c5d50495443abe38418aAnna Zaks  /// \sa getUserMode
184d130140cb7bce73b4350c5d50495443abe38418aAnna Zaks  UserModeKind UserMode;
185d130140cb7bce73b4350c5d50495443abe38418aAnna Zaks
186bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  /// Controls the mode of inter-procedural analysis.
187bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  IPAKind IPAMode;
188bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks
189de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  /// Controls which C++ member functions will be considered for inlining.
190de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  CXXInlineableMemberKind CXXMemberInliningMode;
19181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
192978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  /// \sa includeTemporaryDtorsInCFG
193dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie  Optional<bool> IncludeTemporaryDtorsInCFG;
194978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose
195978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  /// \sa mayInlineCXXStandardLibrary
196dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie  Optional<bool> InlineCXXStandardLibrary;
197978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose
198978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  /// \sa mayInlineTemplateFunctions
199dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie  Optional<bool> InlineTemplateFunctions;
2007229d0011766c174beffe6a846d78f448f845b39Anna Zaks
20157330eed3fbe530cb05996e4a346cc5fc217c0d9Anna Zaks  /// \sa mayInlineObjCMethod
202dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie  Optional<bool> ObjCInliningMode;
20357330eed3fbe530cb05996e4a346cc5fc217c0d9Anna Zaks
2047229d0011766c174beffe6a846d78f448f845b39Anna Zaks  // Cache of the "ipa-always-inline-size" setting.
2057229d0011766c174beffe6a846d78f448f845b39Anna Zaks  // \sa getAlwaysInlineSize
206dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie  Optional<unsigned> AlwaysInlineSize;
207b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
2087ee8906295d56ceb84b8b3da502cdc8770509868Jordan Rose  /// \sa shouldSuppressNullReturnPaths
209dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie  Optional<bool> SuppressNullReturnPaths;
210b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
2116bbe1442a5f3f5f761582a9005e9edf1d49c4da2Anna Zaks  // \sa getMaxInlinableSize
212dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie  Optional<unsigned> MaxInlinableSize;
2136bbe1442a5f3f5f761582a9005e9edf1d49c4da2Anna Zaks
2146a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  /// \sa shouldAvoidSuppressingNullArgumentPaths
215dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie  Optional<bool> AvoidSuppressingNullArgumentPaths;
2167ee8906295d56ceb84b8b3da502cdc8770509868Jordan Rose
217713e07591995d761f65c7132289dce003a29870fAnna Zaks  /// \sa shouldSuppressInlinedDefensiveChecks
218713e07591995d761f65c7132289dce003a29870fAnna Zaks  Optional<bool> SuppressInlinedDefensiveChecks;
219713e07591995d761f65c7132289dce003a29870fAnna Zaks
2204d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose  /// \sa getGraphTrimInterval
221dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie  Optional<unsigned> GraphTrimInterval;
2224d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose
2237959671d456c916706a5f61af609d8f1fc95decfAnna Zaks  /// \sa getMaxTimesInlineLarge
224dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie  Optional<unsigned> MaxTimesInlineLarge;
2257959671d456c916706a5f61af609d8f1fc95decfAnna Zaks
226ac3a3e7a402cd349dd2b7d70cd92c5fe702ae831Anna Zaks  /// \sa getMaxNodesPerTopLevelFunction
227dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie  Optional<unsigned> MaxNodesPerTopLevelFunction;
228ac3a3e7a402cd349dd2b7d70cd92c5fe702ae831Anna Zaks
229978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  /// Interprets an option's string value as a boolean.
230978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  ///
231978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  /// Accepts the strings "true" and "false".
232978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  /// If an option value is not provided, returns the given \p DefaultVal.
233622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek  bool getBooleanOption(StringRef Name, bool DefaultVal);
234de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose
23548d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek  /// Variant that accepts a Optional value to cache the result.
236dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie  bool getBooleanOption(Optional<bool> &V, StringRef Name, bool DefaultVal);
237dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie
2387229d0011766c174beffe6a846d78f448f845b39Anna Zaks  /// Interprets an option's string value as an integer value.
239cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko  int getOptionAsInteger(StringRef Name, int DefaultVal);
2407229d0011766c174beffe6a846d78f448f845b39Anna Zaks
241de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rosepublic:
242d130140cb7bce73b4350c5d50495443abe38418aAnna Zaks  /// \brief Retrieves and sets the UserMode. This is a high-level option,
243d130140cb7bce73b4350c5d50495443abe38418aAnna Zaks  /// which is used to set other low-level options. It is not accessible
244d130140cb7bce73b4350c5d50495443abe38418aAnna Zaks  /// outside of AnalyzerOptions.
245d130140cb7bce73b4350c5d50495443abe38418aAnna Zaks  UserModeKind getUserMode();
246d130140cb7bce73b4350c5d50495443abe38418aAnna Zaks
247bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  /// \brief Returns the inter-procedural analysis mode.
248bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  IPAKind getIPAMode();
24973f0563009a6715a5d3d41f664f5bfab5096d51fAnna Zaks
250de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  /// Returns the option controlling which C++ member functions will be
251de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  /// considered for inlining.
252de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  ///
2535a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose  /// This is controlled by the 'c++-inlining' config option.
2545a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose  ///
255de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  /// \sa CXXMemberInliningMode
2569e28fe60bbfa5de196ce4aa396210bf10fc5c266Ted Kremenek  bool mayInlineCXXMemberFunction(CXXInlineableMemberKind K);
257de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose
25857330eed3fbe530cb05996e4a346cc5fc217c0d9Anna Zaks  /// Returns true if ObjectiveC inlining is enabled, false otherwise.
259622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek  bool mayInlineObjCMethod();
26057330eed3fbe530cb05996e4a346cc5fc217c0d9Anna Zaks
2615a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose  /// Returns whether or not the destructors for C++ temporary objects should
2625a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose  /// be included in the CFG.
2635a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose  ///
264978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  /// This is controlled by the 'cfg-temporary-dtors' config option, which
265978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  /// accepts the values "true" and "false".
266622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek  bool includeTemporaryDtorsInCFG();
2675a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose
26881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  /// Returns whether or not C++ standard library functions may be considered
26981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  /// for inlining.
27081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  ///
27181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  /// This is controlled by the 'c++-stdlib-inlining' config option, which
27281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  /// accepts the values "true" and "false".
273622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek  bool mayInlineCXXStandardLibrary();
27481fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
27581fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  /// Returns whether or not templated functions may be considered for inlining.
27681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  ///
27781fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  /// This is controlled by the 'c++-template-inlining' config option, which
27881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  /// accepts the values "true" and "false".
279622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek  bool mayInlineTemplateFunctions();
28081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
281b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  /// Returns whether or not paths that go through null returns should be
282b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  /// suppressed.
283b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  ///
284b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  /// This is a heuristic for avoiding bug reports with paths that go through
285b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  /// inlined functions that are more defensive than their callers.
286b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  ///
287b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  /// This is controlled by the 'suppress-null-return-paths' config option,
288b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  /// which accepts the values "true" and "false".
2897ee8906295d56ceb84b8b3da502cdc8770509868Jordan Rose  bool shouldSuppressNullReturnPaths();
290b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
2916a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  /// Returns whether a bug report should \em not be suppressed if its path
2926a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  /// includes a call with a null argument, even if that call has a null return.
2936a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  ///
2947ee8906295d56ceb84b8b3da502cdc8770509868Jordan Rose  /// This option has no effect when #shouldSuppressNullReturnPaths() is false.
2956a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  ///
2966a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  /// This is a counter-heuristic to avoid false negatives.
2976a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  ///
2986a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  /// This is controlled by the 'avoid-suppressing-null-argument-paths' config
2996a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  /// option, which accepts the values "true" and "false".
3006a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  bool shouldAvoidSuppressingNullArgumentPaths();
3016a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose
302713e07591995d761f65c7132289dce003a29870fAnna Zaks  /// Returns whether or not diagnostics containing inlined defensive NULL
303713e07591995d761f65c7132289dce003a29870fAnna Zaks  /// checks should be suppressed.
304713e07591995d761f65c7132289dce003a29870fAnna Zaks  ///
305713e07591995d761f65c7132289dce003a29870fAnna Zaks  /// This is controlled by the 'suppress-inlined-defensive-checks' config
306713e07591995d761f65c7132289dce003a29870fAnna Zaks  /// option, which accepts the values "true" and "false".
307713e07591995d761f65c7132289dce003a29870fAnna Zaks  bool shouldSuppressInlinedDefensiveChecks();
308713e07591995d761f65c7132289dce003a29870fAnna Zaks
309aeca2cc3a6f486abff3fdfb4e82903cd3ca4267eJordan Rose  /// Returns whether irrelevant parts of a bug report path should be pruned
310aeca2cc3a6f486abff3fdfb4e82903cd3ca4267eJordan Rose  /// out of the final output.
311aeca2cc3a6f486abff3fdfb4e82903cd3ca4267eJordan Rose  ///
312aeca2cc3a6f486abff3fdfb4e82903cd3ca4267eJordan Rose  /// This is controlled by the 'prune-paths' config option, which accepts the
313aeca2cc3a6f486abff3fdfb4e82903cd3ca4267eJordan Rose  /// values "true" and "false".
314aeca2cc3a6f486abff3fdfb4e82903cd3ca4267eJordan Rose  bool shouldPrunePaths();
315aeca2cc3a6f486abff3fdfb4e82903cd3ca4267eJordan Rose
3167229d0011766c174beffe6a846d78f448f845b39Anna Zaks  // Returns the size of the functions (in basic blocks), which should be
3177229d0011766c174beffe6a846d78f448f845b39Anna Zaks  // considered to be small enough to always inline.
3187229d0011766c174beffe6a846d78f448f845b39Anna Zaks  //
3197229d0011766c174beffe6a846d78f448f845b39Anna Zaks  // This is controlled by "ipa-always-inline-size" analyzer-config option.
32094bb74cef72a33d77c5d6739abfc0840c781eb8eTed Kremenek  unsigned getAlwaysInlineSize();
3216bbe1442a5f3f5f761582a9005e9edf1d49c4da2Anna Zaks
3226bbe1442a5f3f5f761582a9005e9edf1d49c4da2Anna Zaks  // Returns the bound on the number of basic blocks in an inlined function
3236bbe1442a5f3f5f761582a9005e9edf1d49c4da2Anna Zaks  // (50 by default).
3246bbe1442a5f3f5f761582a9005e9edf1d49c4da2Anna Zaks  //
3256bbe1442a5f3f5f761582a9005e9edf1d49c4da2Anna Zaks  // This is controlled by "-analyzer-config max-inlinable-size" option.
3266bbe1442a5f3f5f761582a9005e9edf1d49c4da2Anna Zaks  unsigned getMaxInlinableSize();
3276bbe1442a5f3f5f761582a9005e9edf1d49c4da2Anna Zaks
328a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek  /// Returns true if the analyzer engine should synthesize fake bodies
329a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek  /// for well-known functions.
330622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek  bool shouldSynthesizeBodies();
3317229d0011766c174beffe6a846d78f448f845b39Anna Zaks
3324d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose  /// Returns how often nodes in the ExplodedGraph should be recycled to save
3334d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose  /// memory.
3344d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose  ///
3354d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose  /// This is controlled by the 'graph-trim-interval' config option. To disable
3364d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose  /// node reclamation, set the option to "0".
3374d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose  unsigned getGraphTrimInterval();
3384d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose
3397959671d456c916706a5f61af609d8f1fc95decfAnna Zaks  /// Returns the maximum times a large function could be inlined.
3407959671d456c916706a5f61af609d8f1fc95decfAnna Zaks  ///
3417959671d456c916706a5f61af609d8f1fc95decfAnna Zaks  /// This is controlled by the 'max-times-inline-large' config option.
3427959671d456c916706a5f61af609d8f1fc95decfAnna Zaks  unsigned getMaxTimesInlineLarge();
3437959671d456c916706a5f61af609d8f1fc95decfAnna Zaks
344ac3a3e7a402cd349dd2b7d70cd92c5fe702ae831Anna Zaks  /// Returns the maximum number of nodes the analyzer can generate while
345ac3a3e7a402cd349dd2b7d70cd92c5fe702ae831Anna Zaks  /// exploring a top level function (for each exploded graph).
346ac3a3e7a402cd349dd2b7d70cd92c5fe702ae831Anna Zaks  /// 150000 is default; 0 means no limit.
347ac3a3e7a402cd349dd2b7d70cd92c5fe702ae831Anna Zaks  ///
348ac3a3e7a402cd349dd2b7d70cd92c5fe702ae831Anna Zaks  /// This is controlled by the 'max-nodes' config option.
349ac3a3e7a402cd349dd2b7d70cd92c5fe702ae831Anna Zaks  unsigned getMaxNodesPerTopLevelFunction();
350ac3a3e7a402cd349dd2b7d70cd92c5fe702ae831Anna Zaks
351918ac48e315d42fed7fe856a3fce70d9d930cdcdDaniel Dunbarpublic:
352bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  AnalyzerOptions() :
353bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    AnalysisStoreOpt(RegionStoreModel),
354bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    AnalysisConstraintsOpt(RangeConstraintsModel),
355bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    AnalysisDiagOpt(PD_HTML),
356bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    AnalysisPurgeOpt(PurgeStmt),
357bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    ShowCheckerHelp(0),
358bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    AnalyzeAll(0),
359bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    AnalyzerDisplayProgress(0),
360bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    AnalyzeNestedBlocks(0),
361bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    eagerlyAssumeBinOpBifurcation(0),
362bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    TrimGraph(0),
363bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    visualizeExplodedGraphWithGraphViz(0),
364bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    visualizeExplodedGraphWithUbiGraph(0),
365bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    UnoptimizedCFG(0),
366bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    PrintStats(0),
367bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    NoRetryExhausted(0),
3688235f9c9c8b3d1737d1c6bd57f7ba3f616b92392Anna Zaks    // Cap the stack depth at 4 calls (5 stack frames, base + 4 calls).
369bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    InlineMaxStackDepth(5),
370bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    InliningMode(NoRedundancy),
371b8ccd43dbf762935c9202f6f4e3343afb2318725Anna Zaks    UserMode(UMK_NotSet),
372b8ccd43dbf762935c9202f6f4e3343afb2318725Anna Zaks    IPAMode(IPAK_NotSet),
373bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    CXXMemberInliningMode() {}
374bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks
375e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman};
37645796b10d11869e86c6b85e24df165410536b313Ted Kremenek
377cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenkotypedef IntrusiveRefCntPtr<AnalyzerOptions> AnalyzerOptionsRef;
37845796b10d11869e86c6b85e24df165410536b313Ted Kremenek
379e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman}
3805746f1ff6286f5e5bd7fc28e5e2031f18e4676c9Daniel Dunbar
3815746f1ff6286f5e5bd7fc28e5e2031f18e4676c9Daniel Dunbar#endif
382