1f22ef01cSRoman Divacky //===-- llvm/ADT/APSInt.cpp - Arbitrary Precision Signed Int ---*- C++ -*--===// 2f22ef01cSRoman Divacky // 3f22ef01cSRoman Divacky // The LLVM Compiler Infrastructure 4f22ef01cSRoman Divacky // 5f22ef01cSRoman Divacky // This file is distributed under the University of Illinois Open Source 6f22ef01cSRoman Divacky // License. See LICENSE.TXT for details. 7f22ef01cSRoman Divacky // 8f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 9f22ef01cSRoman Divacky // 10f22ef01cSRoman Divacky // This file implements the APSInt class, which is a simple class that 11f22ef01cSRoman Divacky // represents an arbitrary sized integer that knows its signedness. 12f22ef01cSRoman Divacky // 13f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 14f22ef01cSRoman Divacky 15f22ef01cSRoman Divacky #include "llvm/ADT/APSInt.h" 16f22ef01cSRoman Divacky #include "llvm/ADT/FoldingSet.h" 17*3ca95b02SDimitry Andric #include "llvm/ADT/StringRef.h" 18f22ef01cSRoman Divacky 19f22ef01cSRoman Divacky using namespace llvm; 20f22ef01cSRoman Divacky APSInt(StringRef Str)213dac3a9bSDimitry AndricAPSInt::APSInt(StringRef Str) { 223dac3a9bSDimitry Andric assert(!Str.empty() && "Invalid string length"); 233dac3a9bSDimitry Andric 243dac3a9bSDimitry Andric // (Over-)estimate the required number of bits. 253dac3a9bSDimitry Andric unsigned NumBits = ((Str.size() * 64) / 19) + 2; 263dac3a9bSDimitry Andric APInt Tmp(NumBits, Str, /*Radix=*/10); 273dac3a9bSDimitry Andric if (Str[0] == '-') { 283dac3a9bSDimitry Andric unsigned MinBits = Tmp.getMinSignedBits(); 293dac3a9bSDimitry Andric if (MinBits > 0 && MinBits < NumBits) 303dac3a9bSDimitry Andric Tmp = Tmp.trunc(MinBits); 313dac3a9bSDimitry Andric *this = APSInt(Tmp, /*IsUnsigned=*/false); 323dac3a9bSDimitry Andric return; 333dac3a9bSDimitry Andric } 343dac3a9bSDimitry Andric unsigned ActiveBits = Tmp.getActiveBits(); 353dac3a9bSDimitry Andric if (ActiveBits > 0 && ActiveBits < NumBits) 363dac3a9bSDimitry Andric Tmp = Tmp.trunc(ActiveBits); 373dac3a9bSDimitry Andric *this = APSInt(Tmp, /*IsUnsigned=*/true); 383dac3a9bSDimitry Andric } 393dac3a9bSDimitry Andric Profile(FoldingSetNodeID & ID) const40f22ef01cSRoman Divackyvoid APSInt::Profile(FoldingSetNodeID& ID) const { 41f22ef01cSRoman Divacky ID.AddInteger((unsigned) (IsUnsigned ? 1 : 0)); 42f22ef01cSRoman Divacky APInt::Profile(ID); 43f22ef01cSRoman Divacky } 44