auto SegMem =
Alloc.getWorkingMemory(static_cast<sys::Memory::ProtectionFlags>(Prot));
- char *LastBlockEnd = SegMem.data();
- char *BlockDataPtr = LastBlockEnd;
LLVM_DEBUG({
dbgs() << " Processing segment "
<< " ]\n Processing content sections:\n";
});
+ if (SegLayout.ContentBlocks.empty()) {
+ LLVM_DEBUG(dbgs() << " No content blocks.\n");
+ continue;
+ }
+
+ size_t BlockOffset = 0;
+ size_t LastBlockEnd = 0;
+
for (auto *B : SegLayout.ContentBlocks) {
LLVM_DEBUG(dbgs() << " " << *B << ":\n");
// Pad to alignment/alignment-offset.
- BlockDataPtr = alignToBlock(BlockDataPtr, *B);
+ BlockOffset = alignToBlock(BlockOffset, *B);
LLVM_DEBUG({
- dbgs() << " Bumped block pointer to " << (const void *)BlockDataPtr
- << " to meet block alignment " << B->getAlignment()
- << " and alignment offset " << B->getAlignmentOffset() << "\n";
+ dbgs() << " Bumped block offset to "
+ << formatv("{0:x}", BlockOffset) << " to meet block alignment "
+ << B->getAlignment() << " and alignment offset "
+ << B->getAlignmentOffset() << "\n";
});
// Zero pad up to alignment.
LLVM_DEBUG({
- if (LastBlockEnd != BlockDataPtr)
- dbgs() << " Zero padding from " << (const void *)LastBlockEnd
- << " to " << (const void *)BlockDataPtr << "\n";
+ if (LastBlockEnd != BlockOffset)
+ dbgs() << " Zero padding from " << formatv("{0:x}", LastBlockEnd)
+ << " to " << formatv("{0:x}", BlockOffset) << "\n";
});
- while (LastBlockEnd != BlockDataPtr)
- *LastBlockEnd++ = 0;
+ for (; LastBlockEnd != BlockOffset; ++LastBlockEnd)
+ *(SegMem.data() + LastBlockEnd) = 0;
// Copy initial block content.
LLVM_DEBUG({
dbgs() << " Copying block " << *B << " content, "
<< B->getContent().size() << " bytes, from "
- << (const void *)B->getContent().data() << " to "
- << (const void *)BlockDataPtr << "\n";
+ << (const void *)B->getContent().data() << " to offset "
+ << formatv("{0:x}", BlockOffset) << "\n";
});
- memcpy(BlockDataPtr, B->getContent().data(), B->getContent().size());
+ memcpy(SegMem.data() + BlockOffset, B->getContent().data(),
+ B->getContent().size());
// Point the block's content to the fixed up buffer.
- B->setMutableContent({BlockDataPtr, B->getContent().size()});
+ B->setMutableContent(
+ {SegMem.data() + BlockOffset, B->getContent().size()});
// Update block end pointer.
- LastBlockEnd = BlockDataPtr + B->getContent().size();
- BlockDataPtr = LastBlockEnd;
+ LastBlockEnd = BlockOffset + B->getContent().size();
+ BlockOffset = LastBlockEnd;
}
// Zero pad the rest of the segment.
LLVM_DEBUG({
- dbgs() << " Zero padding end of segment from "
- << (const void *)LastBlockEnd << " to "
- << (const void *)((char *)SegMem.data() + SegMem.size()) << "\n";
+ dbgs() << " Zero padding end of segment from offset "
+ << formatv("{0:x}", LastBlockEnd) << " to "
+ << formatv("{0:x}", SegMem.size()) << "\n";
});
- while (LastBlockEnd != SegMem.data() + SegMem.size())
- *LastBlockEnd++ = 0;
+ for (; LastBlockEnd != SegMem.size(); ++LastBlockEnd)
+ *(SegMem.data() + LastBlockEnd) = 0;
}
}