[Lldb-commits] [lldb] r341682 - [Scalar] Fix undefined behaviour when converting double to long.

Davide Italiano via lldb-commits lldb-commits at lists.llvm.org
Fri Sep 7 11:12:44 PDT 2018


Note that we already have tests for this (that were failing [and
hopefully they're not anymore])
On Fri, Sep 7, 2018 at 11:04 AM Davide Italiano via lldb-commits
<lldb-commits at lists.llvm.org> wrote:
>
> Author: davide
> Date: Fri Sep  7 11:03:43 2018
> New Revision: 341682
>
> URL: http://llvm.org/viewvc/llvm-project?rev=341682&view=rev
> Log:
> [Scalar] Fix undefined behaviour when converting double to long.
>
> This showed up in an Ubsan build of lldb (inside the CFAbsoluteTime
> data formatter). As we only care about the bit pattern, we just
> round to the nearest double, and truncate to a size that fits
> in ulonglong_t.
>
> <rdar://problem/44229924>
>
> Modified:
>     lldb/trunk/source/Utility/Scalar.cpp
>
> Modified: lldb/trunk/source/Utility/Scalar.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Utility/Scalar.cpp?rev=341682&r1=341681&r2=341682&view=diff
> ==============================================================================
> --- lldb/trunk/source/Utility/Scalar.cpp (original)
> +++ lldb/trunk/source/Utility/Scalar.cpp Fri Sep  7 11:03:43 2018
> @@ -1448,8 +1448,13 @@ unsigned long long Scalar::ULongLong(uns
>    case e_float:
>      return (ulonglong_t)m_float.convertToFloat();
>    case e_double:
> -    return (ulonglong_t)m_float.convertToDouble();
> -  case e_long_double:
> +      {
> +          double d_val = patatino.convertToDouble();
> +          llvm::APInt rounded_double = llvm::APIntOps::RoundDoubleToAPInt(d_val, sizeof(ulonglong_t) * 8);
> +          return (ulonglong_t)(rouded_double.zextOrTrunc(sizeof(ulonglong_t) * 8))
> +          .getZExtValue();
> +      }
> +      case e_long_double:
>      llvm::APInt ldbl_val = m_float.bitcastToAPInt();
>      return (ulonglong_t)(ldbl_val.zextOrTrunc(sizeof(ulonglong_t) * 8))
>          .getZExtValue();
>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


More information about the lldb-commits mailing list