diff options
| author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-04-10 23:37:34 +0000 |
|---|---|---|
| committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-04-10 23:37:34 +0000 |
| commit | e9624291b16d946f37530291d9e3e253e2db6a5e (patch) | |
| tree | 2a0f7e9569aa4079002cd179bcc2e1c9be5772f0 /clang/lib | |
| parent | bb9c3c33e94f3e5a17990b7a8ab9d076d0c7e594 (diff) | |
| download | bcm5719-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.cpp | 12 |
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; |

