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