AnalyzerOptions.h revision bfa9ab8183e2fdc74f8633d758cb0c6201314320
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
108bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  /// Inline callees when their definitions are available.
109bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  // TODO: How is this different from BasicInlining?
110bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  IPAK_Inlining = 3,
111bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks
112bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  /// Enable inlining of dynamically dispatched methods.
113bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  IPAK_DynamicDispatch = 4,
114bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks
115bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  /// Enable inlining of dynamically dispatched methods, bifurcate paths when
116bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  /// exact type info is unavailable.
117bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  IPAK_DynamicDispatchBifurcate = 5
118bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks};
119de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose
120cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenkoclass AnalyzerOptions : public RefCountedBase<AnalyzerOptions> {
121918ac48e315d42fed7fe856a3fce70d9d930cdcdDaniel Dunbarpublic:
122255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  typedef llvm::StringMap<std::string> ConfigTable;
123255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek
12443dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis  /// \brief Pair of checker name and enable/disable.
12543dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis  std::vector<std::pair<std::string, bool> > CheckersControlList;
126255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek
127255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  /// \brief A key-value table of use-specified configuration values.
128255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  ConfigTable Config;
129e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman  AnalysisStores AnalysisStoreOpt;
130e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman  AnalysisConstraints AnalysisConstraintsOpt;
131e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman  AnalysisDiagClients AnalysisDiagOpt;
132d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks  AnalysisPurgeMode AnalysisPurgeOpt;
133255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek
134e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman  std::string AnalyzeSpecificFunction;
135255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek
136255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  /// \brief The maximum number of exploded nodes the analyzer will generate.
137c09289d104b8e01ecd998e3f08b2b0561049e1dcZhongxing Xu  unsigned MaxNodes;
138255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek
139255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  /// \brief The maximum number of times the analyzer visits a block.
1402fa9d72d4d23ccdcd4137946e5ebafac7a04f04cTed Kremenek  unsigned maxBlockVisitOnPath;
141255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek
142255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek
143116f3640daee424dfcdbe55e80be5a67476be4b0Argyrios Kyrtzidis  unsigned ShowCheckerHelp : 1;
144918ac48e315d42fed7fe856a3fce70d9d930cdcdDaniel Dunbar  unsigned AnalyzeAll : 1;
145918ac48e315d42fed7fe856a3fce70d9d930cdcdDaniel Dunbar  unsigned AnalyzerDisplayProgress : 1;
146fc576514d06c46a7cac49500169411d82f38d04bTed Kremenek  unsigned AnalyzeNestedBlocks : 1;
147255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek
148255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  /// \brief The flag regulates if we should eagerly assume evaluations of
149255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  /// conditionals, thus, bifurcating the path.
150255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  ///
1510caa2d47b84337e942b3f6652adfafe4ae506cfeTed Kremenek  /// This flag indicates how the engine should handle expressions such as: 'x =
1520caa2d47b84337e942b3f6652adfafe4ae506cfeTed Kremenek  /// (y != 0)'.  When this flag is true then the subexpression 'y != 0' will be
1530caa2d47b84337e942b3f6652adfafe4ae506cfeTed Kremenek  /// eagerly assumed to be true or false, thus evaluating it to the integers 0
1540caa2d47b84337e942b3f6652adfafe4ae506cfeTed Kremenek  /// or 1 respectively.  The upside is that this can increase analysis
1550caa2d47b84337e942b3f6652adfafe4ae506cfeTed Kremenek  /// precision until we have a better way to lazily evaluate such logic.  The
1560caa2d47b84337e942b3f6652adfafe4ae506cfeTed Kremenek  /// downside is that it eagerly bifurcates paths.
1570caa2d47b84337e942b3f6652adfafe4ae506cfeTed Kremenek  unsigned eagerlyAssumeBinOpBifurcation : 1;
158255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek
159918ac48e315d42fed7fe856a3fce70d9d930cdcdDaniel Dunbar  unsigned TrimGraph : 1;
1603b8a04004afa46057a9af4afbd086be71d619793Ted Kremenek  unsigned visualizeExplodedGraphWithGraphViz : 1;
1613b8a04004afa46057a9af4afbd086be71d619793Ted Kremenek  unsigned visualizeExplodedGraphWithUbiGraph : 1;
1629b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek  unsigned UnoptimizedCFG : 1;
16381fb169f42769e02c7425b23885a261c025fd5e6Anna Zaks  unsigned PrintStats : 1;
164255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek
165255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  /// \brief Do not re-analyze paths leading to exhausted nodes with a different
166255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  /// strategy. We get better code coverage when retry is enabled.
167b47dbcbc12430fdf3e5a5b9f59cdec5480e89e75Anna Zaks  unsigned NoRetryExhausted : 1;
168255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek
169255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  /// \brief The inlining stack depth limit.
1708235f9c9c8b3d1737d1c6bd57f7ba3f616b92392Anna Zaks  unsigned InlineMaxStackDepth;
171255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek
172255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  /// \brief The mode of function selection used during inlining.
1738235f9c9c8b3d1737d1c6bd57f7ba3f616b92392Anna Zaks  unsigned InlineMaxFunctionSize;
174255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek
175255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  /// \brief The mode of function selection used during inlining.
17666253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks  AnalysisInliningMode InliningMode;
1777b99d12b4ca67fccdf5090761ba257732e954e75Zhongxing Xu
178de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Roseprivate:
179bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  /// Controls the mode of inter-procedural analysis.
180bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  IPAKind IPAMode;
181bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks
182de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  /// Controls which C++ member functions will be considered for inlining.
183de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  CXXInlineableMemberKind CXXMemberInliningMode;
18481fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
185978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  /// \sa includeTemporaryDtorsInCFG
18681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  llvm::Optional<bool> IncludeTemporaryDtorsInCFG;
187978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose
188978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  /// \sa mayInlineCXXStandardLibrary
18981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  llvm::Optional<bool> InlineCXXStandardLibrary;
190978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose
191978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  /// \sa mayInlineTemplateFunctions
19281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  llvm::Optional<bool> InlineTemplateFunctions;
1937229d0011766c174beffe6a846d78f448f845b39Anna Zaks
19457330eed3fbe530cb05996e4a346cc5fc217c0d9Anna Zaks  /// \sa mayInlineObjCMethod
19557330eed3fbe530cb05996e4a346cc5fc217c0d9Anna Zaks  llvm::Optional<bool> ObjCInliningMode;
19657330eed3fbe530cb05996e4a346cc5fc217c0d9Anna Zaks
1977229d0011766c174beffe6a846d78f448f845b39Anna Zaks  // Cache of the "ipa-always-inline-size" setting.
1987229d0011766c174beffe6a846d78f448f845b39Anna Zaks  // \sa getAlwaysInlineSize
1997229d0011766c174beffe6a846d78f448f845b39Anna Zaks  llvm::Optional<unsigned> AlwaysInlineSize;
200b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
201b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  /// \sa shouldPruneNullReturnPaths
202b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  llvm::Optional<bool> PruneNullReturnPaths;
203b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
2046a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  /// \sa shouldAvoidSuppressingNullArgumentPaths
2056a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  llvm::Optional<bool> AvoidSuppressingNullArgumentPaths;
2066a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose
2074d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose  /// \sa getGraphTrimInterval
2084d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose  llvm::Optional<unsigned> GraphTrimInterval;
2094d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose
2107959671d456c916706a5f61af609d8f1fc95decfAnna Zaks  /// \sa getMaxTimesInlineLarge
2117959671d456c916706a5f61af609d8f1fc95decfAnna Zaks  llvm::Optional<unsigned> MaxTimesInlineLarge;
2127959671d456c916706a5f61af609d8f1fc95decfAnna Zaks
213978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  /// Interprets an option's string value as a boolean.
214978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  ///
215978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  /// Accepts the strings "true" and "false".
216978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  /// If an option value is not provided, returns the given \p DefaultVal.
217622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek  bool getBooleanOption(StringRef Name, bool DefaultVal);
218de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose
21948d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek  /// Variant that accepts a Optional value to cache the result.
22048d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek  bool getBooleanOption(llvm::Optional<bool> &V, StringRef Name,
22148d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek                        bool DefaultVal);
22248d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek
2237229d0011766c174beffe6a846d78f448f845b39Anna Zaks  /// Interprets an option's string value as an integer value.
224cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko  int getOptionAsInteger(StringRef Name, int DefaultVal);
2257229d0011766c174beffe6a846d78f448f845b39Anna Zaks
226de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rosepublic:
227bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  /// \brief Returns the inter-procedural analysis mode.
228bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  IPAKind getIPAMode();
22973f0563009a6715a5d3d41f664f5bfab5096d51fAnna Zaks
230de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  /// Returns the option controlling which C++ member functions will be
231de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  /// considered for inlining.
232de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  ///
2335a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose  /// This is controlled by the 'c++-inlining' config option.
2345a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose  ///
235de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  /// \sa CXXMemberInliningMode
2369e28fe60bbfa5de196ce4aa396210bf10fc5c266Ted Kremenek  bool mayInlineCXXMemberFunction(CXXInlineableMemberKind K);
237de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose
23857330eed3fbe530cb05996e4a346cc5fc217c0d9Anna Zaks  /// Returns true if ObjectiveC inlining is enabled, false otherwise.
239622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek  bool mayInlineObjCMethod();
24057330eed3fbe530cb05996e4a346cc5fc217c0d9Anna Zaks
2415a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose  /// Returns whether or not the destructors for C++ temporary objects should
2425a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose  /// be included in the CFG.
2435a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose  ///
244978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  /// This is controlled by the 'cfg-temporary-dtors' config option, which
245978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose  /// accepts the values "true" and "false".
246622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek  bool includeTemporaryDtorsInCFG();
2475a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose
24881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  /// Returns whether or not C++ standard library functions may be considered
24981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  /// for inlining.
25081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  ///
25181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  /// This is controlled by the 'c++-stdlib-inlining' config option, which
25281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  /// accepts the values "true" and "false".
253622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek  bool mayInlineCXXStandardLibrary();
25481fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
25581fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  /// Returns whether or not templated functions may be considered for inlining.
25681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  ///
25781fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  /// This is controlled by the 'c++-template-inlining' config option, which
25881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  /// accepts the values "true" and "false".
259622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek  bool mayInlineTemplateFunctions();
26081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
261b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  /// Returns whether or not paths that go through null returns should be
262b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  /// suppressed.
263b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  ///
264b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  /// This is a heuristic for avoiding bug reports with paths that go through
265b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  /// inlined functions that are more defensive than their callers.
266b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  ///
267b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  /// This is controlled by the 'suppress-null-return-paths' config option,
268b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose  /// which accepts the values "true" and "false".
269622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek  bool shouldPruneNullReturnPaths();
270b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
2716a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  /// Returns whether a bug report should \em not be suppressed if its path
2726a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  /// includes a call with a null argument, even if that call has a null return.
2736a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  ///
2746a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  /// This option has no effect when #shouldPruneNullReturnPaths() is false.
2756a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  ///
2766a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  /// This is a counter-heuristic to avoid false negatives.
2776a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  ///
2786a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  /// This is controlled by the 'avoid-suppressing-null-argument-paths' config
2796a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  /// option, which accepts the values "true" and "false".
2806a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  bool shouldAvoidSuppressingNullArgumentPaths();
2816a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose
2827229d0011766c174beffe6a846d78f448f845b39Anna Zaks  // Returns the size of the functions (in basic blocks), which should be
2837229d0011766c174beffe6a846d78f448f845b39Anna Zaks  // considered to be small enough to always inline.
2847229d0011766c174beffe6a846d78f448f845b39Anna Zaks  //
2857229d0011766c174beffe6a846d78f448f845b39Anna Zaks  // This is controlled by "ipa-always-inline-size" analyzer-config option.
28694bb74cef72a33d77c5d6739abfc0840c781eb8eTed Kremenek  unsigned getAlwaysInlineSize();
287a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek
288a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek  /// Returns true if the analyzer engine should synthesize fake bodies
289a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek  /// for well-known functions.
290622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek  bool shouldSynthesizeBodies();
2917229d0011766c174beffe6a846d78f448f845b39Anna Zaks
2924d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose  /// Returns how often nodes in the ExplodedGraph should be recycled to save
2934d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose  /// memory.
2944d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose  ///
2954d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose  /// This is controlled by the 'graph-trim-interval' config option. To disable
2964d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose  /// node reclamation, set the option to "0".
2974d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose  unsigned getGraphTrimInterval();
2984d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose
2997959671d456c916706a5f61af609d8f1fc95decfAnna Zaks  /// Returns the maximum times a large function could be inlined.
3007959671d456c916706a5f61af609d8f1fc95decfAnna Zaks  ///
3017959671d456c916706a5f61af609d8f1fc95decfAnna Zaks  /// This is controlled by the 'max-times-inline-large' config option.
3027959671d456c916706a5f61af609d8f1fc95decfAnna Zaks  unsigned getMaxTimesInlineLarge();
3037959671d456c916706a5f61af609d8f1fc95decfAnna Zaks
304918ac48e315d42fed7fe856a3fce70d9d930cdcdDaniel Dunbarpublic:
305bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks  AnalyzerOptions() :
306bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    AnalysisStoreOpt(RegionStoreModel),
307bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    AnalysisConstraintsOpt(RangeConstraintsModel),
308bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    AnalysisDiagOpt(PD_HTML),
309bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    AnalysisPurgeOpt(PurgeStmt),
310bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    ShowCheckerHelp(0),
311bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    AnalyzeAll(0),
312bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    AnalyzerDisplayProgress(0),
313bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    AnalyzeNestedBlocks(0),
314bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    eagerlyAssumeBinOpBifurcation(0),
315bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    TrimGraph(0),
316bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    visualizeExplodedGraphWithGraphViz(0),
317bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    visualizeExplodedGraphWithUbiGraph(0),
318bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    UnoptimizedCFG(0),
319bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    PrintStats(0),
320bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    NoRetryExhausted(0),
3218235f9c9c8b3d1737d1c6bd57f7ba3f616b92392Anna Zaks    // Cap the stack depth at 4 calls (5 stack frames, base + 4 calls).
322bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    InlineMaxStackDepth(5),
323bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    InlineMaxFunctionSize(50),
324bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    InliningMode(NoRedundancy),
325bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    CXXMemberInliningMode() {}
326bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks
327e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman};
32845796b10d11869e86c6b85e24df165410536b313Ted Kremenek
329cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenkotypedef IntrusiveRefCntPtr<AnalyzerOptions> AnalyzerOptionsRef;
33045796b10d11869e86c6b85e24df165410536b313Ted Kremenek
331e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman}
3325746f1ff6286f5e5bd7fc28e5e2031f18e4676c9Daniel Dunbar
3335746f1ff6286f5e5bd7fc28e5e2031f18e4676c9Daniel Dunbar#endif
334