AnalyzerOptions.cpp revision 55fc873017f10f6f566b182b70f6fc22aefa3464
1de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose//===-- AnalyzerOptions.cpp - Analysis Engine Options -----------*- C++ -*-===//
2de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose//
3de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose//                     The LLVM Compiler Infrastructure
4de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose//
5de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose// This file is distributed under the University of Illinois Open Source
6de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose// License. See LICENSE.TXT for details.
7de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose//
8de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose//===----------------------------------------------------------------------===//
9de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose//
10de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose// This file contains special accessors for analyzer configuration options
11de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose// with string representations.
12de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose//
13de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose//===----------------------------------------------------------------------===//
14de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose
15de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose#include "clang/StaticAnalyzer/Core/AnalyzerOptions.h"
1694bb74cef72a33d77c5d6739abfc0840c781eb8eTed Kremenek#include "llvm/ADT/SmallString.h"
1755fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/ADT/StringSwitch.h"
1894bb74cef72a33d77c5d6739abfc0840c781eb8eTed Kremenek#include "llvm/Support/raw_ostream.h"
19de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose
20de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Roseusing namespace clang;
217229d0011766c174beffe6a846d78f448f845b39Anna Zaksusing namespace llvm;
22de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose
23de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rosebool
249e28fe60bbfa5de196ce4aa396210bf10fc5c266Ted KremenekAnalyzerOptions::mayInlineCXXMemberFunction(CXXInlineableMemberKind K) {
25de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  if (IPAMode < Inlining)
26de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose    return false;
27de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose
28de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  if (!CXXMemberInliningMode) {
29de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose    static const char *ModeKey = "c++-inlining";
309e28fe60bbfa5de196ce4aa396210bf10fc5c266Ted Kremenek
319e28fe60bbfa5de196ce4aa396210bf10fc5c266Ted Kremenek    StringRef ModeStr(Config.GetOrCreateValue(ModeKey,
329e28fe60bbfa5de196ce4aa396210bf10fc5c266Ted Kremenek                                              "methods").getValue());
33de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose
34de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose    CXXInlineableMemberKind &MutableMode =
35de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose      const_cast<CXXInlineableMemberKind &>(CXXMemberInliningMode);
36de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose
37de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose    MutableMode = llvm::StringSwitch<CXXInlineableMemberKind>(ModeStr)
38de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose      .Case("constructors", CIMK_Constructors)
39de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose      .Case("destructors", CIMK_Destructors)
40de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose      .Case("none", CIMK_None)
41de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose      .Case("methods", CIMK_MemberFunctions)
42de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose      .Default(CXXInlineableMemberKind());
43de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose
44de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose    if (!MutableMode) {
45de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose      // FIXME: We should emit a warning here about an unknown inlining kind,
46de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose      // but the AnalyzerOptions doesn't have access to a diagnostic engine.
47de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose      MutableMode = CIMK_None;
48de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose    }
49de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  }
50de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose
51de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose  return CXXMemberInliningMode >= K;
52de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose}
535a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose
54622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenekstatic StringRef toString(bool b) { return b ? "true" : "false"; }
55622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek
56622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenekbool AnalyzerOptions::getBooleanOption(StringRef Name, bool DefaultVal) {
5781fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  // FIXME: We should emit a warning here if the value is something other than
5881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  // "true", "false", or the empty string (meaning the default value),
5981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  // but the AnalyzerOptions doesn't have access to a diagnostic engine.
60622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek  StringRef V(Config.GetOrCreateValue(Name, toString(DefaultVal)).getValue());
61622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek  return llvm::StringSwitch<bool>(V)
62622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek      .Case("true", true)
63622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek      .Case("false", false)
64622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek      .Default(DefaultVal);
6581fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose}
6681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
6748d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenekbool AnalyzerOptions::getBooleanOption(llvm::Optional<bool> &V,
6848d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek                                       StringRef Name,
6948d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek                                       bool DefaultVal) {
7048d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek  if (!V.hasValue())
7148d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek    V = getBooleanOption(Name, DefaultVal);
7248d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek  return V.getValue();
7348d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek}
7448d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek
75622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenekbool AnalyzerOptions::includeTemporaryDtorsInCFG() {
7648d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek  return getBooleanOption(IncludeTemporaryDtorsInCFG,
7748d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek                          "cfg-temporary-dtors",
7848d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek                          /* Default = */ false);
7981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose}
8081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
81622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenekbool AnalyzerOptions::mayInlineCXXStandardLibrary() {
8248d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek  return getBooleanOption(InlineCXXStandardLibrary,
8348d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek                          "c++-stdlib-inlining",
8448d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek                          /*Default=*/true);
8581fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose}
8681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
87622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenekbool AnalyzerOptions::mayInlineTemplateFunctions() {
8848d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek  return getBooleanOption(InlineTemplateFunctions,
8948d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek                          "c++-template-inlining",
9048d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek                          /*Default=*/true);
915a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose}
927229d0011766c174beffe6a846d78f448f845b39Anna Zaks
93622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenekbool AnalyzerOptions::mayInlineObjCMethod() {
9448d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek  return getBooleanOption(ObjCInliningMode,
9548d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek                          "objc-inlining",
9648d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek                          /* Default = */ true);
9757330eed3fbe530cb05996e4a346cc5fc217c0d9Anna Zaks}
9857330eed3fbe530cb05996e4a346cc5fc217c0d9Anna Zaks
99622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenekbool AnalyzerOptions::shouldPruneNullReturnPaths() {
10048d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek  return getBooleanOption(PruneNullReturnPaths,
10148d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek                          "suppress-null-return-paths",
10248d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek                          /* Default = */ true);
103b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose}
104b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose
1056a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rosebool AnalyzerOptions::shouldAvoidSuppressingNullArgumentPaths() {
1066a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose  return getBooleanOption(AvoidSuppressingNullArgumentPaths,
1076a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose                          "avoid-suppressing-null-argument-paths",
1086a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose                          /* Default = */ false);
1096a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose}
1106a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose
11194bb74cef72a33d77c5d6739abfc0840c781eb8eTed Kremenekint AnalyzerOptions::getOptionAsInteger(StringRef Name, int DefaultVal) {
11294bb74cef72a33d77c5d6739abfc0840c781eb8eTed Kremenek  llvm::SmallString<10> StrBuf;
11394bb74cef72a33d77c5d6739abfc0840c781eb8eTed Kremenek  llvm::raw_svector_ostream OS(StrBuf);
11494bb74cef72a33d77c5d6739abfc0840c781eb8eTed Kremenek  OS << DefaultVal;
11594bb74cef72a33d77c5d6739abfc0840c781eb8eTed Kremenek
11694bb74cef72a33d77c5d6739abfc0840c781eb8eTed Kremenek  StringRef V(Config.GetOrCreateValue(Name, OS.str()).getValue());
1177229d0011766c174beffe6a846d78f448f845b39Anna Zaks  int Res = DefaultVal;
11894bb74cef72a33d77c5d6739abfc0840c781eb8eTed Kremenek  bool b = V.getAsInteger(10, Res);
11994bb74cef72a33d77c5d6739abfc0840c781eb8eTed Kremenek  assert(!b && "analyzer-config option should be numeric");
12086e7b7e4421eacdd5ae610a0fb2d8ea5dec5e644Ted Kremenek  (void) b;
1217229d0011766c174beffe6a846d78f448f845b39Anna Zaks  return Res;
1227229d0011766c174beffe6a846d78f448f845b39Anna Zaks}
1237229d0011766c174beffe6a846d78f448f845b39Anna Zaks
12494bb74cef72a33d77c5d6739abfc0840c781eb8eTed Kremenekunsigned AnalyzerOptions::getAlwaysInlineSize() {
12594bb74cef72a33d77c5d6739abfc0840c781eb8eTed Kremenek  if (!AlwaysInlineSize.hasValue())
12694bb74cef72a33d77c5d6739abfc0840c781eb8eTed Kremenek    AlwaysInlineSize = getOptionAsInteger("ipa-always-inline-size", 3);
1277229d0011766c174beffe6a846d78f448f845b39Anna Zaks  return AlwaysInlineSize.getValue();
1287229d0011766c174beffe6a846d78f448f845b39Anna Zaks}
129a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek
1304d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Roseunsigned AnalyzerOptions::getGraphTrimInterval() {
1314d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose  if (!GraphTrimInterval.hasValue())
1324d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose    GraphTrimInterval = getOptionAsInteger("graph-trim-interval", 1000);
1334d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose  return GraphTrimInterval.getValue();
1344d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose}
1354d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose
136622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenekbool AnalyzerOptions::shouldSynthesizeBodies() {
137938869941e5a01049fb301fbf82f3caa4c7efa09Ted Kremenek  return getBooleanOption("faux-bodies", true);
138a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek}
139