AnalyzerOptions.h revision ac3a3e7a402cd349dd2b7d70cd92c5fe702ae831
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
19381fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  llvm::Optional<bool> IncludeTemporaryDtorsInCFG;
194978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose
195978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  /// \sa mayInlineCXXStandardLibrary
19681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  llvm::Optional<bool> InlineCXXStandardLibrary;
197978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose
198978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  /// \sa mayInlineTemplateFunctions
19981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  llvm::Optional<bool> InlineTemplateFunctions;
2007229d0011766c174beffe6a846d78f448f845b39Anna Zaks
20157330eed3fbe530cb05996e4a346cc5fc217c0d9Anna Zaks  /// \sa mayInlineObjCMethod
20257330eed3fbe530cb05996e4a346cc5fc217c0d9Anna Zaks  llvm::Optional<bool> ObjCInliningMode;
20357330eed3fbe530cb05996e4a346cc5fc217c0d9Anna Zaks
2047229d0011766c174beffe6a846d78f448f845b39Anna Zaks  // Cache of the "ipa-always-inline-size" setting.
2057229d0011766c174beffe6a846d78f448f845b39Anna Zaks  // \sa getAlwaysInlineSize
2067229d0011766c174beffe6a846d78f448f845b39Anna Zaks  llvm::Optional<unsigned> AlwaysInlineSize;
207b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
2087ee8906295d56ceb84b8b3da502cdc8770509868Jordan Rose  /// \sa shouldSuppressNullReturnPaths
2097ee8906295d56ceb84b8b3da502cdc8770509868Jordan Rose  llvm::Optional<bool> SuppressNullReturnPaths;
210b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
2116bbe1442a5f3f5f761582a9005e9edf1d49c4da2Anna Zaks  // \sa getMaxInlinableSize
2126bbe1442a5f3f5f761582a9005e9edf1d49c4da2Anna Zaks  llvm::Optional<unsigned> MaxInlinableSize;
2136bbe1442a5f3f5f761582a9005e9edf1d49c4da2Anna Zaks
2146a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  /// \sa shouldAvoidSuppressingNullArgumentPaths
2156a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  llvm::Optional<bool> AvoidSuppressingNullArgumentPaths;
2167ee8906295d56ceb84b8b3da502cdc8770509868Jordan Rose
2174d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose  /// \sa getGraphTrimInterval
2184d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose  llvm::Optional<unsigned> GraphTrimInterval;
2194d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose
2207959671d456c916706a5f61af609d8f1fc95decfAnna Zaks  /// \sa getMaxTimesInlineLarge
2217959671d456c916706a5f61af609d8f1fc95decfAnna Zaks  llvm::Optional<unsigned> MaxTimesInlineLarge;
2227959671d456c916706a5f61af609d8f1fc95decfAnna Zaks
223ac3a3e7a402cd349dd2b7d70cd92c5fe702ae831Anna Zaks  /// \sa getMaxNodesPerTopLevelFunction
224ac3a3e7a402cd349dd2b7d70cd92c5fe702ae831Anna Zaks  llvm::Optional<unsigned> MaxNodesPerTopLevelFunction;
225ac3a3e7a402cd349dd2b7d70cd92c5fe702ae831Anna Zaks
226978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  /// Interprets an option's string value as a boolean.
227978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  ///
228978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  /// Accepts the strings "true" and "false".
229978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  /// If an option value is not provided, returns the given \p DefaultVal.
230622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek  bool getBooleanOption(StringRef Name, bool DefaultVal);
231de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose
23248d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek  /// Variant that accepts a Optional value to cache the result.
23348d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek  bool getBooleanOption(llvm::Optional<bool> &V, StringRef Name,
23448d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek                        bool DefaultVal);
23548d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek
2367229d0011766c174beffe6a846d78f448f845b39Anna Zaks  /// Interprets an option's string value as an integer value.
237cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko  int getOptionAsInteger(StringRef Name, int DefaultVal);
2387229d0011766c174beffe6a846d78f448f845b39Anna Zaks
239de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rosepublic:
240d130140cb7bce73b4350c5d50495443abe38418aAnna Zaks  /// \brief Retrieves and sets the UserMode. This is a high-level option,
241d130140cb7bce73b4350c5d50495443abe38418aAnna Zaks  /// which is used to set other low-level options. It is not accessible
242d130140cb7bce73b4350c5d50495443abe38418aAnna Zaks  /// outside of AnalyzerOptions.
243d130140cb7bce73b4350c5d50495443abe38418aAnna Zaks  UserModeKind getUserMode();
244d130140cb7bce73b4350c5d50495443abe38418aAnna Zaks
245bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  /// \brief Returns the inter-procedural analysis mode.
246bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  IPAKind getIPAMode();
24773f0563009a6715a5d3d41f664f5bfab5096d51fAnna Zaks
248de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  /// Returns the option controlling which C++ member functions will be
249de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  /// considered for inlining.
250de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  ///
2515a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose  /// This is controlled by the 'c++-inlining' config option.
2525a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose  ///
253de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  /// \sa CXXMemberInliningMode
2549e28fe60bbfa5de196ce4aa396210bf10fc5c266Ted Kremenek  bool mayInlineCXXMemberFunction(CXXInlineableMemberKind K);
255de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose
25657330eed3fbe530cb05996e4a346cc5fc217c0d9Anna Zaks  /// Returns true if ObjectiveC inlining is enabled, false otherwise.
257622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek  bool mayInlineObjCMethod();
25857330eed3fbe530cb05996e4a346cc5fc217c0d9Anna Zaks
2595a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose  /// Returns whether or not the destructors for C++ temporary objects should
2605a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose  /// be included in the CFG.
2615a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose  ///
262978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  /// This is controlled by the 'cfg-temporary-dtors' config option, which
263978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  /// accepts the values "true" and "false".
264622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek  bool includeTemporaryDtorsInCFG();
2655a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose
26681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  /// Returns whether or not C++ standard library functions may be considered
26781fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  /// for inlining.
26881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  ///
26981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  /// This is controlled by the 'c++-stdlib-inlining' config option, which
27081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  /// accepts the values "true" and "false".
271622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek  bool mayInlineCXXStandardLibrary();
27281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
27381fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  /// Returns whether or not templated functions may be considered for inlining.
27481fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  ///
27581fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  /// This is controlled by the 'c++-template-inlining' config option, which
27681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  /// accepts the values "true" and "false".
277622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek  bool mayInlineTemplateFunctions();
27881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
279b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  /// Returns whether or not paths that go through null returns should be
280b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  /// suppressed.
281b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  ///
282b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  /// This is a heuristic for avoiding bug reports with paths that go through
283b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  /// inlined functions that are more defensive than their callers.
284b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  ///
285b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  /// This is controlled by the 'suppress-null-return-paths' config option,
286b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  /// which accepts the values "true" and "false".
2877ee8906295d56ceb84b8b3da502cdc8770509868Jordan Rose  bool shouldSuppressNullReturnPaths();
288b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
2896a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  /// Returns whether a bug report should \em not be suppressed if its path
2906a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  /// includes a call with a null argument, even if that call has a null return.
2916a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  ///
2927ee8906295d56ceb84b8b3da502cdc8770509868Jordan Rose  /// This option has no effect when #shouldSuppressNullReturnPaths() is false.
2936a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  ///
2946a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  /// This is a counter-heuristic to avoid false negatives.
2956a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  ///
2966a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  /// This is controlled by the 'avoid-suppressing-null-argument-paths' config
2976a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  /// option, which accepts the values "true" and "false".
2986a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  bool shouldAvoidSuppressingNullArgumentPaths();
2996a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose
300aeca2cc3a6f486abff3fdfb4e82903cd3ca4267eJordan Rose  /// Returns whether irrelevant parts of a bug report path should be pruned
301aeca2cc3a6f486abff3fdfb4e82903cd3ca4267eJordan Rose  /// out of the final output.
302aeca2cc3a6f486abff3fdfb4e82903cd3ca4267eJordan Rose  ///
303aeca2cc3a6f486abff3fdfb4e82903cd3ca4267eJordan Rose  /// This is controlled by the 'prune-paths' config option, which accepts the
304aeca2cc3a6f486abff3fdfb4e82903cd3ca4267eJordan Rose  /// values "true" and "false".
305aeca2cc3a6f486abff3fdfb4e82903cd3ca4267eJordan Rose  bool shouldPrunePaths();
306aeca2cc3a6f486abff3fdfb4e82903cd3ca4267eJordan Rose
3077229d0011766c174beffe6a846d78f448f845b39Anna Zaks  // Returns the size of the functions (in basic blocks), which should be
3087229d0011766c174beffe6a846d78f448f845b39Anna Zaks  // considered to be small enough to always inline.
3097229d0011766c174beffe6a846d78f448f845b39Anna Zaks  //
3107229d0011766c174beffe6a846d78f448f845b39Anna Zaks  // This is controlled by "ipa-always-inline-size" analyzer-config option.
31194bb74cef72a33d77c5d6739abfc0840c781eb8eTed Kremenek  unsigned getAlwaysInlineSize();
3126bbe1442a5f3f5f761582a9005e9edf1d49c4da2Anna Zaks
3136bbe1442a5f3f5f761582a9005e9edf1d49c4da2Anna Zaks  // Returns the bound on the number of basic blocks in an inlined function
3146bbe1442a5f3f5f761582a9005e9edf1d49c4da2Anna Zaks  // (50 by default).
3156bbe1442a5f3f5f761582a9005e9edf1d49c4da2Anna Zaks  //
3166bbe1442a5f3f5f761582a9005e9edf1d49c4da2Anna Zaks  // This is controlled by "-analyzer-config max-inlinable-size" option.
3176bbe1442a5f3f5f761582a9005e9edf1d49c4da2Anna Zaks  unsigned getMaxInlinableSize();
3186bbe1442a5f3f5f761582a9005e9edf1d49c4da2Anna Zaks
319a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek  /// Returns true if the analyzer engine should synthesize fake bodies
320a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek  /// for well-known functions.
321622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek  bool shouldSynthesizeBodies();
3227229d0011766c174beffe6a846d78f448f845b39Anna Zaks
3234d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose  /// Returns how often nodes in the ExplodedGraph should be recycled to save
3244d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose  /// memory.
3254d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose  ///
3264d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose  /// This is controlled by the 'graph-trim-interval' config option. To disable
3274d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose  /// node reclamation, set the option to "0".
3284d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose  unsigned getGraphTrimInterval();
3294d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose
3307959671d456c916706a5f61af609d8f1fc95decfAnna Zaks  /// Returns the maximum times a large function could be inlined.
3317959671d456c916706a5f61af609d8f1fc95decfAnna Zaks  ///
3327959671d456c916706a5f61af609d8f1fc95decfAnna Zaks  /// This is controlled by the 'max-times-inline-large' config option.
3337959671d456c916706a5f61af609d8f1fc95decfAnna Zaks  unsigned getMaxTimesInlineLarge();
3347959671d456c916706a5f61af609d8f1fc95decfAnna Zaks
335ac3a3e7a402cd349dd2b7d70cd92c5fe702ae831Anna Zaks  /// Returns the maximum number of nodes the analyzer can generate while
336ac3a3e7a402cd349dd2b7d70cd92c5fe702ae831Anna Zaks  /// exploring a top level function (for each exploded graph).
337ac3a3e7a402cd349dd2b7d70cd92c5fe702ae831Anna Zaks  /// 150000 is default; 0 means no limit.
338ac3a3e7a402cd349dd2b7d70cd92c5fe702ae831Anna Zaks  ///
339ac3a3e7a402cd349dd2b7d70cd92c5fe702ae831Anna Zaks  /// This is controlled by the 'max-nodes' config option.
340ac3a3e7a402cd349dd2b7d70cd92c5fe702ae831Anna Zaks  unsigned getMaxNodesPerTopLevelFunction();
341ac3a3e7a402cd349dd2b7d70cd92c5fe702ae831Anna Zaks
342918ac48e315d42fed7fe856a3fce70d9d930cdcdDaniel Dunbarpublic:
343bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  AnalyzerOptions() :
344bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    AnalysisStoreOpt(RegionStoreModel),
345bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    AnalysisConstraintsOpt(RangeConstraintsModel),
346bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    AnalysisDiagOpt(PD_HTML),
347bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    AnalysisPurgeOpt(PurgeStmt),
348bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    ShowCheckerHelp(0),
349bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    AnalyzeAll(0),
350bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    AnalyzerDisplayProgress(0),
351bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    AnalyzeNestedBlocks(0),
352bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    eagerlyAssumeBinOpBifurcation(0),
353bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    TrimGraph(0),
354bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    visualizeExplodedGraphWithGraphViz(0),
355bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    visualizeExplodedGraphWithUbiGraph(0),
356bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    UnoptimizedCFG(0),
357bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    PrintStats(0),
358bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    NoRetryExhausted(0),
3598235f9c9c8b3d1737d1c6bd57f7ba3f616b92392Anna Zaks    // Cap the stack depth at 4 calls (5 stack frames, base + 4 calls).
360bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    InlineMaxStackDepth(5),
361bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    InliningMode(NoRedundancy),
362b8ccd43dbf762935c9202f6f4e3343afb2318725Anna Zaks    UserMode(UMK_NotSet),
363b8ccd43dbf762935c9202f6f4e3343afb2318725Anna Zaks    IPAMode(IPAK_NotSet),
364bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    CXXMemberInliningMode() {}
365bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks
366e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman};
36745796b10d11869e86c6b85e24df165410536b313Ted Kremenek
368cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenkotypedef IntrusiveRefCntPtr<AnalyzerOptions> AnalyzerOptionsRef;
36945796b10d11869e86c6b85e24df165410536b313Ted Kremenek
370e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman}
3715746f1ff6286f5e5bd7fc28e5e2031f18e4676c9Daniel Dunbar
3725746f1ff6286f5e5bd7fc28e5e2031f18e4676c9Daniel Dunbar#endif
373