diff options
| author | Dean Michael Berris <dberris@google.com> | 2018-08-31 18:36:58 +0000 |
|---|---|---|
| committer | Dean Michael Berris <dberris@google.com> | 2018-08-31 18:36:58 +0000 |
| commit | 3fc4cbfe1060c9e12183ac67cd426760c4436291 (patch) | |
| tree | f12a742e4511e689926150b89cbd4c7de298cf8a /llvm/lib/XRay | |
| parent | 332447f4b45f48d1ce5c4ecc25504cdfadfd2ce2 (diff) | |
| download | bcm5719-llvm-3fc4cbfe1060c9e12183ac67cd426760c4436291.tar.gz bcm5719-llvm-3fc4cbfe1060c9e12183ac67cd426760c4436291.zip | |
[XRay] Change function record reader to be endian-aware
This change allows us to let the compiler do the right thing for when
handling big-endian and little-endian records for FDR mode function
records.
Previously, we assumed that the encoding was little-endian that reading
the first byte to look for the function id and function record types was
ordered in a little-endian manner. This change allows us to better
handle function records where the first four bytes may actually be
encoded in big-endian thus giving us the wrong bytes where we're seeking
the function information from.
This is a follow-up to D51210 and D51289.
llvm-svn: 341236
Diffstat (limited to 'llvm/lib/XRay')
| -rw-r--r-- | llvm/lib/XRay/Trace.cpp | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/llvm/lib/XRay/Trace.cpp b/llvm/lib/XRay/Trace.cpp index 35a3033f435..69ac825f519 100644 --- a/llvm/lib/XRay/Trace.cpp +++ b/llvm/lib/XRay/Trace.cpp @@ -601,6 +601,19 @@ Error processFDRFunctionRecord(FDRState &State, DataExtractor &RecordExtractor, Records.emplace_back(); auto &Record = Records.back(); Record.RecordType = 0; // Record is type NORMAL. + // Back up one byte to re-read the first byte, which is important for + // computing the function id for a record. + --OffsetPtr; + + auto PreReadOffset = OffsetPtr; + uint32_t FuncIdBitField = RecordExtractor.getU32(&OffsetPtr); + if (OffsetPtr == PreReadOffset) + return createStringError( + std::make_error_code(std::errc::executable_format_error), + "Failed reading truncated function id field at offset %d.", + OffsetPtr); + + FirstByte = FuncIdBitField & 0xffu; // Strip off record type bit and use the next three bits. auto T = (FirstByte >> 1) & 0x07; switch (T) { @@ -626,23 +639,11 @@ Error processFDRFunctionRecord(FDRState &State, DataExtractor &RecordExtractor, Record.TId = State.ThreadId; Record.PId = State.ProcessId; - // Back up one byte to re-read the first byte, which is important for - // computing the function id for a record. - --OffsetPtr; - // Despite function Id being a signed int on XRayRecord, // when it is written to an FDR format, the top bits are truncated, // so it is effectively an unsigned value. When we shift off the // top four bits, we want the shift to be logical, so we read as // uint32_t. - auto PreReadOffset = OffsetPtr; - uint32_t FuncIdBitField = RecordExtractor.getU32(&OffsetPtr); - if (OffsetPtr == PreReadOffset) - return createStringError( - std::make_error_code(std::errc::executable_format_error), - "Failed reading truncated function id field at offset %d.", - OffsetPtr); - Record.FuncId = FuncIdBitField >> 4; // FunctionRecords have a 32 bit delta from the previous absolute TSC |

