44 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8//9// This file implements the APSInt class, which is a simple class that10// 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(std::max<unsigned>(1, MinBits));31 *this = APSInt(Tmp, /*isUnsigned=*/false);32 return;33 }34 unsigned ActiveBits = Tmp.getActiveBits();35 if (ActiveBits < NumBits)36 Tmp = Tmp.trunc(std::max<unsigned>(1, ActiveBits));37 *this = APSInt(Tmp, /*isUnsigned=*/true);38}39 40void APSInt::Profile(FoldingSetNodeID& ID) const {41 ID.AddInteger((unsigned) (IsUnsigned ? 1 : 0));42 APInt::Profile(ID);43}44