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" 16de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose#include "llvm/ADT/StringSwitch.h" 17de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose 18de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Roseusing namespace clang; 19de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose 20de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rosebool 21de5277fc555551857602bd7a7e5e616274e2d4a6Jordan RoseAnalyzerOptions::mayInlineCXXMemberFunction(CXXInlineableMemberKind K) const { 22de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose if (IPAMode < Inlining) 23de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose return false; 24de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose 25de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose if (!CXXMemberInliningMode) { 26de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose static const char *ModeKey = "c++-inlining"; 27de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose std::string ModeStr = Config.lookup(ModeKey); 28de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose 29de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose CXXInlineableMemberKind &MutableMode = 30de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose const_cast<CXXInlineableMemberKind &>(CXXMemberInliningMode); 31de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose 32de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose MutableMode = llvm::StringSwitch<CXXInlineableMemberKind>(ModeStr) 33de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose .Case("", CIMK_MemberFunctions) 34de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose .Case("constructors", CIMK_Constructors) 35de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose .Case("destructors", CIMK_Destructors) 36de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose .Case("none", CIMK_None) 37de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose .Case("methods", CIMK_MemberFunctions) 38de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose .Default(CXXInlineableMemberKind()); 39de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose 40de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose if (!MutableMode) { 41de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose // FIXME: We should emit a warning here about an unknown inlining kind, 42de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose // but the AnalyzerOptions doesn't have access to a diagnostic engine. 43de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose MutableMode = CIMK_None; 44de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose } 45de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose } 46de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose 47de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose return CXXMemberInliningMode >= K; 48de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose} 495a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose 5081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rosebool AnalyzerOptions::getBooleanOption(StringRef Name, bool DefaultVal) const { 5181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose // FIXME: We should emit a warning here if the value is something other than 5281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose // "true", "false", or the empty string (meaning the default value), 5381fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose // but the AnalyzerOptions doesn't have access to a diagnostic engine. 5481fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose return llvm::StringSwitch<bool>(Config.lookup(Name)) 5581fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose .Case("true", true) 5681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose .Case("false", false) 5781fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose .Default(DefaultVal); 5881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose} 5981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose 605a1ffe98b04120846a15f7105905b5f363b08635Jordan Rosebool AnalyzerOptions::includeTemporaryDtorsInCFG() const { 6181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose if (!IncludeTemporaryDtorsInCFG.hasValue()) 6281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose const_cast<llvm::Optional<bool> &>(IncludeTemporaryDtorsInCFG) = 63978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose getBooleanOption("cfg-temporary-dtors", /*Default=*/false); 6481fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose 6581fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose return *IncludeTemporaryDtorsInCFG; 6681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose} 6781fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose 6881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rosebool AnalyzerOptions::mayInlineCXXStandardLibrary() const { 6981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose if (!InlineCXXStandardLibrary.hasValue()) 7081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose const_cast<llvm::Optional<bool> &>(InlineCXXStandardLibrary) = 71978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose getBooleanOption("c++-stdlib-inlining", /*Default=*/false); 7281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose 7381fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose return *InlineCXXStandardLibrary; 7481fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose} 7581fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose 7681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rosebool AnalyzerOptions::mayInlineTemplateFunctions() const { 7781fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose if (!InlineTemplateFunctions.hasValue()) 7881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose const_cast<llvm::Optional<bool> &>(InlineTemplateFunctions) = 7981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose getBooleanOption("c++-template-inlining", /*Default=*/true); 8081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose 8181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose return *InlineTemplateFunctions; 825a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose} 83