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"
17#include <cassert>
18
19using namespace llvm;
20
21APSInt::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.getSignificantBits();
29 if (MinBits < NumBits)
30 Tmp = Tmp.trunc(width: std::max<unsigned>(a: 1, b: MinBits));
31 *this = APSInt(Tmp, /*isUnsigned=*/false);
32 return;
33 }
34 unsigned ActiveBits = Tmp.getActiveBits();
35 if (ActiveBits < NumBits)
36 Tmp = Tmp.trunc(width: std::max<unsigned>(a: 1, b: ActiveBits));
37 *this = APSInt(Tmp, /*isUnsigned=*/true);
38}
39
40void APSInt::Profile(FoldingSetNodeID& ID) const {
41 ID.AddInteger(I: (unsigned) (IsUnsigned ? 1 : 0));
42 APInt::Profile(id&: ID);
43}
44