r206001 - InstrProf: Read unsigned numbers with strtoul and strtoull
Duncan P. N. Exon Smith
dexonsmith at apple.com
Thu Apr 10 16:37:34 PDT 2014
Author: dexonsmith
Date: Thu Apr 10 18:37:34 2014
New Revision: 206001
URL: http://llvm.org/viewvc/llvm-project?rev=206001&view=rev
Log:
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>
Modified:
cfe/trunk/lib/CodeGen/CodeGenPGO.cpp
Modified: cfe/trunk/lib/CodeGen/CodeGenPGO.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenPGO.cpp?rev=206001&r1=206000&r2=206001&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenPGO.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenPGO.cpp Thu Apr 10 18:37:34 2014
@@ -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(CodeGenMo
// 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(CodeGenMo
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(S
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(S
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;
More information about the cfe-commits
mailing list