150
|
1 //===-- llvm/ADT/APSInt.cpp - Arbitrary Precision Signed Int ---*- C++ -*--===//
|
|
2 //
|
|
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
4 // See https://llvm.org/LICENSE.txt for license information.
|
|
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
6 //
|
|
7 //===----------------------------------------------------------------------===//
|
|
8 //
|
|
9 // This file implements the APSInt class, which is a simple class that
|
|
10 // represents an arbitrary sized integer that knows its signedness.
|
|
11 //
|
|
12 //===----------------------------------------------------------------------===//
|
|
13
|
|
14 #include "llvm/ADT/APSInt.h"
|
|
15 #include "llvm/ADT/FoldingSet.h"
|
|
16 #include "llvm/ADT/StringRef.h"
|
173
|
17 #include <cassert>
|
150
|
18
|
|
19 using namespace llvm;
|
|
20
|
|
21 APSInt::APSInt(StringRef Str) {
|
|
22 assert(!Str.empty() && "Invalid string length");
|
|
23
|
|
24 // (Over-)estimate the required number of bits.
|
|
25 unsigned NumBits = ((Str.size() * 64) / 19) + 2;
|
|
26 APInt Tmp(NumBits, Str, /*radix=*/10);
|
|
27 if (Str[0] == '-') {
|
|
28 unsigned MinBits = Tmp.getMinSignedBits();
|
|
29 if (MinBits > 0 && MinBits < NumBits)
|
|
30 Tmp = Tmp.trunc(MinBits);
|
|
31 *this = APSInt(Tmp, /*isUnsigned=*/false);
|
|
32 return;
|
|
33 }
|
|
34 unsigned ActiveBits = Tmp.getActiveBits();
|
|
35 if (ActiveBits > 0 && ActiveBits < NumBits)
|
|
36 Tmp = Tmp.trunc(ActiveBits);
|
|
37 *this = APSInt(Tmp, /*isUnsigned=*/true);
|
|
38 }
|
|
39
|
|
40 void APSInt::Profile(FoldingSetNodeID& ID) const {
|
|
41 ID.AddInteger((unsigned) (IsUnsigned ? 1 : 0));
|
|
42 APInt::Profile(ID);
|
|
43 }
|