summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>2014-04-10 23:37:34 +0000
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>2014-04-10 23:37:34 +0000
commite9624291b16d946f37530291d9e3e253e2db6a5e (patch)
tree2a0f7e9569aa4079002cd179bcc2e1c9be5772f0 /clang/lib
parentbb9c3c33e94f3e5a17990b7a8ab9d076d0c7e594 (diff)
downloadbcm5719-llvm-e9624291b16d946f37530291d9e3e253e2db6a5e.tar.gz
bcm5719-llvm-e9624291b16d946f37530291d9e3e253e2db6a5e.zip
InstrProf: Read unsigned numbers with strtoul and strtoull
Fixes a bug where unsigned numbers are read using strtol and strtoll. I don't have a testcase because this bug is effectively unobservable right now. To expose the problem in the hash, we would need a function with greater than INT64_MAX counters, which we don't handle anyway. To expose the problem in the function count, we'd need a function with greater than INT32_MAX counters; this is theoretically observable, but it isn't a practical testcase to check in. An upcoming commit changes the hash to be non-trivial, so we'll get some coverage eventually. <rdar://problem/16435801> llvm-svn: 206001
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/CodeGen/CodeGenPGO.cpp12
1 files changed, 6 insertions, 6 deletions
diff --git a/clang/lib/CodeGen/CodeGenPGO.cpp b/clang/lib/CodeGen/CodeGenPGO.cpp
index 2e562ca826f..36edf638cf4 100644
--- a/clang/lib/CodeGen/CodeGenPGO.cpp
+++ b/clang/lib/CodeGen/CodeGenPGO.cpp
@@ -15,7 +15,7 @@
#include "CodeGenFunction.h"
#include "clang/AST/RecursiveASTVisitor.h"
#include "clang/AST/StmtVisitor.h"
-#include "llvm/Config/config.h" // for strtoull()/strtoll() define
+#include "llvm/Config/config.h" // for strtoull()/strtoul() define
#include "llvm/IR/MDBuilder.h"
#include "llvm/Support/FileSystem.h"
@@ -69,7 +69,7 @@ PGOProfileData::PGOProfileData(CodeGenModule &CGM, std::string Path)
// Read the number of counters.
char *EndPtr;
- unsigned NumCounters = strtol(++CurPtr, &EndPtr, 10);
+ unsigned NumCounters = strtoul(++CurPtr, &EndPtr, 10);
if (EndPtr == CurPtr || *EndPtr != '\n' || NumCounters <= 0) {
ReportBadPGOData(CGM, "pgo data file has unexpected number of counters");
return;
@@ -77,7 +77,7 @@ PGOProfileData::PGOProfileData(CodeGenModule &CGM, std::string Path)
CurPtr = EndPtr;
// Read function count.
- uint64_t Count = strtoll(CurPtr, &EndPtr, 10);
+ uint64_t Count = strtoull(CurPtr, &EndPtr, 10);
if (EndPtr == CurPtr || *EndPtr != '\n') {
ReportBadPGOData(CGM, "pgo-data file has bad count value");
return;
@@ -119,13 +119,13 @@ bool PGOProfileData::getFunctionCounts(StringRef FuncName, uint64_t &FuncHash,
char *EndPtr;
// Read the function hash.
- FuncHash = strtoll(++CurPtr, &EndPtr, 10);
+ FuncHash = strtoull(++CurPtr, &EndPtr, 10);
assert(EndPtr != CurPtr && *EndPtr == '\n' &&
"pgo-data file has corrupted function hash");
CurPtr = EndPtr;
// Read the number of counters.
- unsigned NumCounters = strtol(++CurPtr, &EndPtr, 10);
+ unsigned NumCounters = strtoul(++CurPtr, &EndPtr, 10);
assert(EndPtr != CurPtr && *EndPtr == '\n' && NumCounters > 0 &&
"pgo-data file has corrupted number of counters");
CurPtr = EndPtr;
@@ -134,7 +134,7 @@ bool PGOProfileData::getFunctionCounts(StringRef FuncName, uint64_t &FuncHash,
for (unsigned N = 0; N < NumCounters; ++N) {
// Read the count value.
- uint64_t Count = strtoll(CurPtr, &EndPtr, 10);
+ uint64_t Count = strtoull(CurPtr, &EndPtr, 10);
if (EndPtr == CurPtr || *EndPtr != '\n') {
ReportBadPGOData(CGM, "pgo-data file has bad count value");
return true;
OpenPOWER on IntegriCloud