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