[PATCH] D110365: [llvm][profile] Add padding after binary IDs
Leonard Chan via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 23 17:13:00 PDT 2021
leonardchan updated this revision to Diff 374695.
leonardchan marked an inline comment as done.
leonardchan retitled this revision from "[llvm][profile] Do not read padding when printing build IDs" to "[llvm][profile] Add padding after binary IDs".
leonardchan edited the summary of this revision.
Herald added a project: Sanitizers.
Herald added a subscriber: Sanitizers.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D110365/new/
https://reviews.llvm.org/D110365
Files:
compiler-rt/lib/profile/InstrProfilingPlatformLinux.c
llvm/lib/ProfileData/InstrProfReader.cpp
Index: llvm/lib/ProfileData/InstrProfReader.cpp
===================================================================
--- llvm/lib/ProfileData/InstrProfReader.cpp
+++ llvm/lib/ProfileData/InstrProfReader.cpp
@@ -367,6 +367,9 @@
return error(instrprof_error::unsupported_version);
BinaryIdsSize = swap(Header.BinaryIdsSize);
+ if (BinaryIdsSize % sizeof(uint64_t))
+ return error(instrprof_error::malformed);
+
CountersDelta = swap(Header.CountersDelta);
NamesDelta = swap(Header.NamesDelta);
auto DataSize = swap(Header.DataSize);
@@ -520,6 +523,10 @@
return success();
}
+static size_t RoundUp(size_t size, size_t align) {
+ return (size + align - 1) & ~(align - 1);
+}
+
template <class IntPtrT>
Error RawInstrProfReader<IntPtrT>::printBinaryIds(raw_ostream &OS) {
if (BinaryIdsSize == 0)
@@ -527,8 +534,21 @@
OS << "Binary IDs: \n";
const uint8_t *BI = BinaryIdsStart;
- while (BI < BinaryIdsStart + BinaryIdsSize) {
+ const uint8_t *BIEnd = BinaryIdsStart + BinaryIdsSize;
+ while (BI < BIEnd) {
+ size_t Remaining = BIEnd - BI;
+
+ // There should be enough left to read the binary ID size field.
+ if (Remaining < sizeof(uint64_t))
+ return make_error<InstrProfError>(instrprof_error::malformed);
+
uint64_t BinaryIdLen = swap(*reinterpret_cast<const uint64_t *>(BI));
+
+ // There should be enough left to read the binary ID size field, and the
+ // binary ID.
+ if (Remaining < sizeof(BinaryIdLen) + BinaryIdLen)
+ return make_error<InstrProfError>(instrprof_error::malformed);
+
// Increment by binary id length data type size.
BI += sizeof(BinaryIdLen);
if (BI > (const uint8_t *)DataBuffer->getBufferEnd())
@@ -538,8 +558,9 @@
OS << format("%02x", BI[I]);
OS << "\n";
- // Increment by binary id data length.
- BI += BinaryIdLen;
+ // Increment by binary id data length, rounded to the next 8 bytes. This
+ // accounts for the zero-padding after each build ID.
+ BI += RoundUp(BinaryIdLen, sizeof(uint64_t));
if (BI > (const uint8_t *)DataBuffer->getBufferEnd())
return make_error<InstrProfError>(instrprof_error::malformed);
}
Index: compiler-rt/lib/profile/InstrProfilingPlatformLinux.c
===================================================================
--- compiler-rt/lib/profile/InstrProfilingPlatformLinux.c
+++ compiler-rt/lib/profile/InstrProfilingPlatformLinux.c
@@ -95,10 +95,13 @@
* have a fixed length.
*/
static int WriteOneBinaryId(ProfDataWriter *Writer, uint64_t BinaryIdLen,
- const uint8_t *BinaryIdData) {
+ const uint8_t *BinaryIdData,
+ uint64_t BinaryIdPadding) {
ProfDataIOVec BinaryIdIOVec[] = {
{&BinaryIdLen, sizeof(uint64_t), 1, 0},
- {BinaryIdData, sizeof(uint8_t), BinaryIdLen, 0}};
+ {BinaryIdData, sizeof(uint8_t), BinaryIdLen, 0},
+ {NULL, sizeof(uint8_t), BinaryIdPadding, 1},
+ };
if (Writer->Write(Writer, BinaryIdIOVec,
sizeof(BinaryIdIOVec) / sizeof(*BinaryIdIOVec)))
return -1;
@@ -130,11 +133,12 @@
uint64_t BinaryIdLen = Note->n_descsz;
const uint8_t *BinaryIdData =
(const uint8_t *)(NoteName + RoundUp(Note->n_namesz, 4));
- if (Writer != NULL &&
- WriteOneBinaryId(Writer, BinaryIdLen, BinaryIdData) == -1)
+ uint8_t BinaryIdPadding = __llvm_profile_get_num_padding_bytes(BinaryIdLen);
+ if (Writer != NULL && WriteOneBinaryId(Writer, BinaryIdLen, BinaryIdData,
+ BinaryIdPadding) == -1)
return -1;
- BinaryIdSize = sizeof(BinaryIdLen) + BinaryIdLen;
+ BinaryIdSize = sizeof(BinaryIdLen) + BinaryIdLen + BinaryIdPadding;
}
return BinaryIdSize;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D110365.374695.patch
Type: text/x-patch
Size: 3776 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210924/defcd2c1/attachment.bin>
More information about the llvm-commits
mailing list