aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/StaticAnalyzer/Core/AnalyzerOptions.h4
-rw-r--r--lib/StaticAnalyzer/Core/AnalyzerOptions.cpp28
-rw-r--r--test/Analysis/analyzer-config.c3
-rw-r--r--test/Analysis/analyzer-config.cpp3
4 files changed, 19 insertions, 19 deletions
diff --git a/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h b/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
index 852f8bb9c5..091155ca60 100644
--- a/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
+++ b/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
@@ -195,7 +195,7 @@ private:
bool getBooleanOption(StringRef Name, bool DefaultVal);
/// Interprets an option's string value as an integer value.
- int getOptionAsInteger(llvm::StringRef Name, int DefaultVal) const;
+ int getOptionAsInteger(llvm::StringRef Name, int DefaultVal);
public:
/// Returns the option controlling which C++ member functions will be
@@ -243,7 +243,7 @@ public:
// considered to be small enough to always inline.
//
// This is controlled by "ipa-always-inline-size" analyzer-config option.
- unsigned getAlwaysInlineSize() const;
+ unsigned getAlwaysInlineSize();
/// Returns true if the analyzer engine should synthesize fake bodies
/// for well-known functions.
diff --git a/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp b/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp
index bb1acb0ce8..6fbd2e1c6d 100644
--- a/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp
+++ b/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp
@@ -14,6 +14,8 @@
#include "clang/StaticAnalyzer/Core/AnalyzerOptions.h"
#include "llvm/ADT/StringSwitch.h"
+#include "llvm/ADT/SmallString.h"
+#include "llvm/Support/raw_ostream.h"
using namespace clang;
using namespace llvm;
@@ -102,25 +104,21 @@ bool AnalyzerOptions::shouldPruneNullReturnPaths() {
return *PruneNullReturnPaths;
}
-int AnalyzerOptions::getOptionAsInteger(StringRef Name, int DefaultVal) const {
- std::string OptStr = Config.lookup(Name);
- if (OptStr.empty())
- return DefaultVal;
-
+int AnalyzerOptions::getOptionAsInteger(StringRef Name, int DefaultVal) {
+ llvm::SmallString<10> StrBuf;
+ llvm::raw_svector_ostream OS(StrBuf);
+ OS << DefaultVal;
+
+ StringRef V(Config.GetOrCreateValue(Name, OS.str()).getValue());
int Res = DefaultVal;
- assert(StringRef(OptStr).getAsInteger(10, Res) == false &&
- "analyzer-config option should be numeric.");
-
+ bool b = V.getAsInteger(10, Res);
+ assert(!b && "analyzer-config option should be numeric");
return Res;
}
-unsigned AnalyzerOptions::getAlwaysInlineSize() const {
- if (!AlwaysInlineSize.hasValue()) {
- unsigned DefaultSize = 3;
- const_cast<Optional<unsigned> &>(AlwaysInlineSize) =
- getOptionAsInteger("ipa-always-inline-size", DefaultSize);
- }
-
+unsigned AnalyzerOptions::getAlwaysInlineSize() {
+ if (!AlwaysInlineSize.hasValue())
+ AlwaysInlineSize = getOptionAsInteger("ipa-always-inline-size", 3);
return AlwaysInlineSize.getValue();
}
diff --git a/test/Analysis/analyzer-config.c b/test/Analysis/analyzer-config.c
index 7a37a51b8e..e9cfd0d3e6 100644
--- a/test/Analysis/analyzer-config.c
+++ b/test/Analysis/analyzer-config.c
@@ -7,5 +7,6 @@ void foo() { bar(); }
// CHECK: [config]
// CHECK-NEXT: cfg-temporary-dtors = false
// CHECK-NEXT: faux-bodies = true
+// CHECK-NEXT: ipa-always-inline-size = 3
// CHECK-NEXT: [stats]
-// CHECK-NEXT: num-entries = 2
+// CHECK-NEXT: num-entries = 3
diff --git a/test/Analysis/analyzer-config.cpp b/test/Analysis/analyzer-config.cpp
index 32196bfff8..414324e8bc 100644
--- a/test/Analysis/analyzer-config.cpp
+++ b/test/Analysis/analyzer-config.cpp
@@ -16,5 +16,6 @@ public:
// CHECK-NEXT: c++-template-inlining = true
// CHECK-NEXT: cfg-temporary-dtors = false
// CHECK-NEXT: faux-bodies = true
+// CHECK-NEXT: ipa-always-inline-size = 3
// CHECK-NEXT: [stats]
-// CHECK-NEXT: num-entries = 5
+// CHECK-NEXT: num-entries = 6