[PATCH] D113238: [llvm-profgen] Fix index out of bounds error while using ip.advance
Lei Wang via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 5 09:45:13 PDT 2021
wlei added inline comments.
================
Comment at: llvm/tools/llvm-profgen/ProfileGenerator.cpp:358
for (auto &R : FuncI.second.Ranges) {
- Ranges[{R.first, R.second}] += 0;
+ Ranges[{R.first, R.second - 1}] += 0;
}
----------------
wlei wrote:
> wenlei wrote:
> > So this is fixing a separate bug? And ranges end is actually `endOffset` + 1? If that's the case, some comments for `RangesTy Ranges` would be helpful.
> Yeah, a separate bug. Remembering that RangesTy's end is exclusive.
>
> Still kind of related with this patch, because the extra one byte only can cause the out bounds issue.
>
> Will add some comments.
This is indeed error prone. The end range in DWARF is exclusive but the input using by `findDisjointRanges` is required to be inclusive.
================
Comment at: llvm/tools/llvm-profgen/ProfileGenerator.cpp:388
// can be Addr1+1 to Addr2-1. We should ignore such range.
while (IP.Address <= RangeEnd) {
uint64_t Offset = Binary->virtualAddrToOffset(IP.Address);
----------------
wenlei wrote:
> wlei wrote:
> > wenlei wrote:
> > > Before the loop, `RangeBegin <= RangeEnd` should be guaranteed, right? Would this look cleaner?
> > >
> > > ```
> > > do {
> > >
> > > ...
> > > } while (IP.advance() && IP.Address <= RangeEnd);
> > >
> > > ```
> > Seems not guaranteed, see the comments:
> > ```
> > // Disjoint ranges may have range in the middle of two instr,
> > // e.g. If Instr1 at Addr1, and Instr2 at Addr2, disjoint range
> > // can be Addr1+1 to Addr2-1. We should ignore such range.
> > if (IP.Address > RangeEnd)
> > continue;
> > ```
> > or change to ?
> > ```
> > if (IP.Address > RangeEnd)
> > continue;
> > do {
> >
> > ...
> > } while (IP.advance() && IP.Address <= RangeEnd);
> >
> > ```
> Ok, I see. Yeah, that works. We could have `if (RangeStart > RangeEnd)` check before constructing the `IP`, and together with that comment.
This is tricky. In this case, `RangeStart` is actually < `RangeEnd` but `IP.Address` is > `RangeEnd`, because `IP.Address` is round to next valid instruction.
On a second thought, I'm wondering if we can remove the code with `InstructionPointer`. you see here it convert `Offset` --> `Address` then convert back to `Offset`. this seems redundant. I'm trying to work on `Offset` directly.
Please take a look.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D113238/new/
https://reviews.llvm.org/D113238
More information about the llvm-commits
mailing list