[llvm] r338226 - [MS Demangler] Demangle symbols in function scopes.

David Majnemer via llvm-commits llvm-commits at lists.llvm.org
Sun Jul 29 21:30:07 PDT 2018


On Sun, Jul 29, 2018 at 8:55 PM Zachary Turner <zturner at google.com> wrote:

>
>
> On Sun, Jul 29, 2018 at 8:44 PM David Majnemer <david.majnemer at gmail.com>
> wrote:
>
>> On Sun, Jul 29, 2018 at 8:12 PM Zachary Turner via llvm-commits <
>> llvm-commits at lists.llvm.org> wrote:
>>
>>>
>>> +static bool startsWithLocalScopePattern(StringView S) {
>>> +  if (!S.consumeFront('?'))
>>> +    return false;
>>> +  if (S.size() < 2)
>>> +    return false;
>>> +
>>> +  size_t End = S.find('?');
>>> +  if (End == StringView::npos)
>>> +    return false;
>>> +  StringView Candidate = S.substr(0, End);
>>> +  if (Candidate.empty())
>>> +    return false;
>>> +
>>> +  // \?[0-9]\?
>>> +  // ?@? is the discriminator 0.
>>> +  if (Candidate.size() == 1)
>>> +    return Candidate[0] == '@' || (Candidate[0] >= '0' && Candidate[0]
>>> <= '9');
>>> +
>>> +  // If it's not 0-9, then it's an encoded number terminated with an @
>>> +  if (Candidate.back() != '@')
>>> +    return false;
>>> +  Candidate = Candidate.dropBack();
>>> +
>>> +  // An encoded number starts with B-P and all subsequent digits are in
>>> A-P.
>>> +  // Note that the reason the first digit cannot be A is two fold.
>>> First, it
>>> +  // would create an ambiguity with ?A which delimits the beginning of
>>> an
>>> +  // anonymous namespace.  Second, A represents 0, and you don't start
>>> a multi
>>> +  // digit number with a leading 0.  Presumably the anonymous namespace
>>> +  // ambiguity is also why single digit encoded numbers use 0-9 rather
>>> than A-J.
>>> +  if (Candidate[0] < 'B' || Candidate[0] > 'P')
>>>
>>
>> We just did a dropBack(). I think we need to check Candidate.empty()
>> otherwise the range check against 'B' - 'P' will end up accessing Candidate
>> out of bounds.
>> Perhaps something like:
>>
>
> I handled it earlier.  Note the `if (Candidate.size() == 1)` branch now
> also returns true if Candidate[0] == '@'.
>
> So if it passes that branch size >= 2.  Then if it passes the next branch
> we're guaranteed to have a string of the form S + '@', where S is
> non-empty.  So after do the dropBack, we're non-empty.
>

Ah, good call! Sorry for the noise!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180729/6807c6f6/attachment.html>


More information about the llvm-commits mailing list