================
@@ -17575,7 +17576,21 @@ static bool ConvertAPValueToString(const APValue &V, 
QualType T,
           break;
         }
       }
-      V.getInt().toString(Str);
+
+      llvm::APSInt vInt = V.getInt();
+      if (llvm::APSInt::compareValues(
+              vInt, llvm::APSInt::getUnsigned(
+                        std::numeric_limits<uint64_t>::max())) >= 0 ||
+          vInt < std::numeric_limits<int64_t>::min()) {
+        // The value of cutSize is not special, it is just a number of
+        // characters that gives us enough info without losing readability
+        const int cutSize = 20;
+        vInt.toString(Str, 16);
+        Str.erase(Str.begin() + cutSize, Str.end() - cutSize);
----------------
erichkeane wrote:

This here doesn't really seem right.  We're just erasing blindly in the middle, 
despite not knowing that we have enough room.  I think what we REALLY want is 
to decide to keep the first N characters, and the last N characters (and still 
do the ...).

Additionally, I think instead of doing the whole to-string mechanism here (and 
since we're doing it in hex it is easy to do so), we could just do a 
numeric-trim of hte front/back instead and join them afterwards.

THAT SAID: I'm not sold on doing this as a hex-print, I think we can keep it 
decimal.  We could have a new function in `APInt` that does a `print only the 
first N and last N, with dots between` kind of thing.  If we have that, we 
don't actually have to do any branching here, because choosing a reasonable 
number there plus decent algorithm for it (basically, normal RHS processing 
until we reach 'N' digits, then figure out how many orders of magnitude to 
divide by using 'log' to figure out how to get the remaining 'N').

https://github.com/llvm/llvm-project/pull/145053
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to