[llvm] r364253 - DataExtractor: use decodeSLEB128 to implement getSLEB128

Kostya Serebryany via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 26 10:02:54 PDT 2019


Hi David,

Looks like the ubsan bot is unhappy:
http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/33102/steps/check-llvm%20ubsan/logs/stdio

llvm/include/llvm/Support/LEB128.h:179:36: runtime error: left shift
of 127 by 63 places cannot be represented in type 'int64_t' (aka
'long')
    #0 0x18803fc in llvm::decodeSLEB128(unsigned char const*, unsigned
int*, unsigned char const*, char const**)
/b/sanitizer-x86_64-linux-fast/build/llvm/include/llvm/Support/LEB128.h:179:36
    #1 0x1a4cb23 in llvm::DataExtractor::getSLEB128(unsigned int*)
const /b/sanitizer-x86_64-linux-fast/build/llvm/lib/Support/DataExtractor.cpp:167:20
    #2 0x18ba814 in llvm::DWARFFormValue::skipValue(llvm::dwarf::Form,
llvm::DataExtractor, unsigned int*, llvm::dwarf::FormParams)
/b/sanitizer-x86_64-linux-fast/build/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp:180:21
    #3 0x18fb1ae in
llvm::DWARFDebugInfoEntry::extractFast(llvm::DWARFUnit const&,
unsigned int*, llvm::DWARFDataExtractor const&, unsigned int, unsigned
int) /b/sanitizer-x86_64-linux-fast/build/llvm/lib/DebugInfo/DWARF/DWARFDebugInfoEntry.cpp:60:17


On Mon, Jun 24, 2019 at 4:45 PM David Blaikie via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: dblaikie
> Date: Mon Jun 24 16:45:18 2019
> New Revision: 364253
>
> URL: http://llvm.org/viewvc/llvm-project?rev=364253&view=rev
> Log:
> DataExtractor: use decodeSLEB128 to implement getSLEB128
>
> Should've been NFC, but turns out DataExtractor had better test coverage
> for decoding SLEB128 than the decodeSLEB128 did - revealing a couple of
> bugs (one in the error handling, another in sign extension). So fixed
> those to get the DataExtractor tests passing again.
>
> Modified:
>     llvm/trunk/include/llvm/Support/LEB128.h
>     llvm/trunk/lib/Support/DataExtractor.cpp
>
> Modified: llvm/trunk/include/llvm/Support/LEB128.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/LEB128.h?rev=364253&r1=364252&r2=364253&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/LEB128.h (original)
> +++ llvm/trunk/include/llvm/Support/LEB128.h Mon Jun 24 16:45:18 2019
> @@ -165,6 +165,8 @@ inline int64_t decodeSLEB128(const uint8
>    int64_t Value = 0;
>    unsigned Shift = 0;
>    uint8_t Byte;
> +  if (error)
> +    *error = nullptr;
>    do {
>      if (end && p == end) {
>        if (error)
> @@ -177,8 +179,8 @@ inline int64_t decodeSLEB128(const uint8
>      Value |= (int64_t(Byte & 0x7f) << Shift);
>      Shift += 7;
>    } while (Byte >= 128);
> -  // Sign extend negative numbers.
> -  if (Byte & 0x40)
> +  // Sign extend negative numbers if needed.
> +  if (Shift < 64 && (Byte & 0x40))
>      Value |= (-1ULL) << Shift;
>    if (n)
>      *n = (unsigned)(p - orig_p);
>
> Modified: llvm/trunk/lib/Support/DataExtractor.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/DataExtractor.cpp?rev=364253&r1=364252&r2=364253&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Support/DataExtractor.cpp (original)
> +++ llvm/trunk/lib/Support/DataExtractor.cpp Mon Jun 24 16:45:18 2019
> @@ -160,26 +160,15 @@ uint64_t DataExtractor::getULEB128(uint3
>  }
>
>  int64_t DataExtractor::getSLEB128(uint32_t *offset_ptr) const {
> -  int64_t result = 0;
> -  if (Data.empty())
> -    return 0;
> -
> -  unsigned shift = 0;
> -  uint32_t offset = *offset_ptr;
> -  uint8_t byte = 0;
> +  assert(*offset_ptr <= Data.size());
>
> -  while (isValidOffset(offset)) {
> -    byte = Data[offset++];
> -    result |= uint64_t(byte & 0x7f) << shift;
> -    shift += 7;
> -    if ((byte & 0x80) == 0) {
> -      // Sign bit of byte is 2nd high order bit (0x40)
> -      if (shift < 64 && (byte & 0x40))
> -        result |= -(1ULL << shift);
> -
> -      *offset_ptr = offset;
> -      return result;
> -    }
> -  }
> -  return 0;
> +  const char *error;
> +  unsigned bytes_read;
> +  int64_t result = decodeSLEB128(
> +      reinterpret_cast<const uint8_t *>(Data.data() + *offset_ptr),
> &bytes_read,
> +      reinterpret_cast<const uint8_t *>(Data.data() + Data.size()),
> &error);
> +  if (error)
> +    return 0;
> +  *offset_ptr += bytes_read;
> +  return result;
>  }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190626/9baa7b06/attachment.html>


More information about the llvm-commits mailing list