llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Timm Baeder (tbaederr)

<details>
<summary>Changes</summary>

Prepare for the ultimate removal of Function instances for builtin functions.

---

Patch is 57.71 KiB, truncated to 20.00 KiB below, full version: 
https://github.com/llvm/llvm-project/pull/137597.diff


1 Files Affected:

- (modified) clang/lib/AST/ByteCode/InterpBuiltin.cpp (+173-238) 


``````````diff
diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp 
b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
index 770511ff76bb0..e93d08bfd9d30 100644
--- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp
+++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
@@ -33,45 +33,6 @@ static unsigned callArgSize(const InterpState &S, const 
CallExpr *C) {
   return O;
 }
 
-template <typename T>
-static T getParam(const InterpFrame *Frame, unsigned Index) {
-  assert(Frame->getFunction()->getNumParams() > Index);
-  unsigned Offset = Frame->getFunction()->getParamOffset(Index);
-  return Frame->getParam<T>(Offset);
-}
-
-static APSInt getAPSIntParam(const InterpFrame *Frame, unsigned Index) {
-  APSInt R;
-  unsigned Offset = Frame->getFunction()->getParamOffset(Index);
-  INT_TYPE_SWITCH(Frame->getFunction()->getParamType(Index),
-                  R = Frame->getParam<T>(Offset).toAPSInt());
-  return R;
-}
-
-static PrimType getIntPrimType(const InterpState &S) {
-  const TargetInfo &TI = S.getASTContext().getTargetInfo();
-  unsigned IntWidth = TI.getIntWidth();
-
-  if (IntWidth == 32)
-    return PT_Sint32;
-  else if (IntWidth == 16)
-    return PT_Sint16;
-  llvm_unreachable("Int isn't 16 or 32 bit?");
-}
-
-static PrimType getLongPrimType(const InterpState &S) {
-  const TargetInfo &TI = S.getASTContext().getTargetInfo();
-  unsigned LongWidth = TI.getLongWidth();
-
-  if (LongWidth == 64)
-    return PT_Sint64;
-  else if (LongWidth == 32)
-    return PT_Sint32;
-  else if (LongWidth == 16)
-    return PT_Sint16;
-  llvm_unreachable("long isn't 16, 32 or 64 bit?");
-}
-
 /// Peek an integer value from the stack into an APSInt.
 static APSInt peekToAPSInt(InterpStack &Stk, PrimType T, size_t Offset = 0) {
   if (Offset == 0)
@@ -206,10 +167,14 @@ static bool 
interp__builtin_is_constant_evaluated(InterpState &S, CodePtr OpPC,
 
 static bool interp__builtin_strcmp(InterpState &S, CodePtr OpPC,
                                    const InterpFrame *Frame,
-                                   const Function *Func, const CallExpr *Call) 
{
-  unsigned ID = Func->getBuiltinID();
-  const Pointer &A = getParam<Pointer>(Frame, 0);
-  const Pointer &B = getParam<Pointer>(Frame, 1);
+                                   const CallExpr *Call, unsigned ID) {
+  unsigned LimitSize =
+      Call->getNumArgs() == 2
+          ? 0
+          : align(primSize(*S.getContext().classify(Call->getArg(2))));
+  const Pointer &A =
+      S.Stk.peek<Pointer>(align(primSize(PT_Ptr)) * 2 + LimitSize);
+  const Pointer &B = S.Stk.peek<Pointer>(align(primSize(PT_Ptr)) + LimitSize);
 
   if (ID == Builtin::BIstrcmp || ID == Builtin::BIstrncmp ||
       ID == Builtin::BIwcscmp || ID == Builtin::BIwcsncmp)
@@ -290,9 +255,8 @@ static bool interp__builtin_strcmp(InterpState &S, CodePtr 
OpPC,
 
 static bool interp__builtin_strlen(InterpState &S, CodePtr OpPC,
                                    const InterpFrame *Frame,
-                                   const Function *Func, const CallExpr *Call) 
{
-  unsigned ID = Func->getBuiltinID();
-  const Pointer &StrPtr = getParam<Pointer>(Frame, 0);
+                                   const CallExpr *Call, unsigned ID) {
+  const Pointer &StrPtr = S.Stk.peek<Pointer>();
 
   if (ID == Builtin::BIstrlen || ID == Builtin::BIwcslen)
     diagnoseNonConstexprBuiltin(S, OpPC, ID);
@@ -345,9 +309,9 @@ static bool interp__builtin_strlen(InterpState &S, CodePtr 
OpPC,
 }
 
 static bool interp__builtin_nan(InterpState &S, CodePtr OpPC,
-                                const InterpFrame *Frame, const Function *F,
+                                const InterpFrame *Frame, const CallExpr *Call,
                                 bool Signaling) {
-  const Pointer &Arg = getParam<Pointer>(Frame, 0);
+  const Pointer &Arg = S.Stk.peek<Pointer>();
 
   if (!CheckLoad(S, OpPC, Arg))
     return false;
@@ -377,7 +341,8 @@ static bool interp__builtin_nan(InterpState &S, CodePtr 
OpPC,
     return false;
 
   const llvm::fltSemantics &TargetSemantics =
-      S.getASTContext().getFloatTypeSemantics(F->getDecl()->getReturnType());
+      S.getASTContext().getFloatTypeSemantics(
+          Call->getDirectCallee()->getReturnType());
 
   Floating Result;
   if (S.getASTContext().getTargetInfo().isNan2008()) {
@@ -406,19 +371,20 @@ static bool interp__builtin_nan(InterpState &S, CodePtr 
OpPC,
 }
 
 static bool interp__builtin_inf(InterpState &S, CodePtr OpPC,
-                                const InterpFrame *Frame, const Function *F) {
+                                const InterpFrame *Frame,
+                                const CallExpr *Call) {
   const llvm::fltSemantics &TargetSemantics =
-      S.getASTContext().getFloatTypeSemantics(F->getDecl()->getReturnType());
+      S.getASTContext().getFloatTypeSemantics(
+          Call->getDirectCallee()->getReturnType());
 
   S.Stk.push<Floating>(Floating::getInf(TargetSemantics));
   return true;
 }
 
 static bool interp__builtin_copysign(InterpState &S, CodePtr OpPC,
-                                     const InterpFrame *Frame,
-                                     const Function *F) {
-  const Floating &Arg1 = getParam<Floating>(Frame, 0);
-  const Floating &Arg2 = getParam<Floating>(Frame, 1);
+                                     const InterpFrame *Frame) {
+  const Floating &Arg1 = S.Stk.peek<Floating>(align(primSize(PT_Float)) * 2);
+  const Floating &Arg2 = S.Stk.peek<Floating>();
 
   APFloat Copy = Arg1.getAPFloat();
   Copy.copySign(Arg2.getAPFloat());
@@ -428,10 +394,9 @@ static bool interp__builtin_copysign(InterpState &S, 
CodePtr OpPC,
 }
 
 static bool interp__builtin_fmin(InterpState &S, CodePtr OpPC,
-                                 const InterpFrame *Frame, const Function *F,
-                                 bool IsNumBuiltin) {
-  const Floating &LHS = getParam<Floating>(Frame, 0);
-  const Floating &RHS = getParam<Floating>(Frame, 1);
+                                 const InterpFrame *Frame, bool IsNumBuiltin) {
+  const Floating &LHS = S.Stk.peek<Floating>(align(primSize(PT_Float)) * 2);
+  const Floating &RHS = S.Stk.peek<Floating>();
 
   if (IsNumBuiltin)
     S.Stk.push<Floating>(llvm::minimumnum(LHS.getAPFloat(), RHS.getAPFloat()));
@@ -441,10 +406,9 @@ static bool interp__builtin_fmin(InterpState &S, CodePtr 
OpPC,
 }
 
 static bool interp__builtin_fmax(InterpState &S, CodePtr OpPC,
-                                 const InterpFrame *Frame, const Function 
*Func,
-                                 bool IsNumBuiltin) {
-  const Floating &LHS = getParam<Floating>(Frame, 0);
-  const Floating &RHS = getParam<Floating>(Frame, 1);
+                                 const InterpFrame *Frame, bool IsNumBuiltin) {
+  const Floating &LHS = S.Stk.peek<Floating>(align(primSize(PT_Float)) * 2);
+  const Floating &RHS = S.Stk.peek<Floating>();
 
   if (IsNumBuiltin)
     S.Stk.push<Floating>(llvm::maximumnum(LHS.getAPFloat(), RHS.getAPFloat()));
@@ -457,7 +421,7 @@ static bool interp__builtin_fmax(InterpState &S, CodePtr 
OpPC,
 /// take a float, double, long double, etc.
 /// But for us, that's all a Floating anyway.
 static bool interp__builtin_isnan(InterpState &S, CodePtr OpPC,
-                                  const InterpFrame *Frame, const Function *F,
+                                  const InterpFrame *Frame,
                                   const CallExpr *Call) {
   const Floating &Arg = S.Stk.peek<Floating>();
 
@@ -467,7 +431,6 @@ static bool interp__builtin_isnan(InterpState &S, CodePtr 
OpPC,
 
 static bool interp__builtin_issignaling(InterpState &S, CodePtr OpPC,
                                         const InterpFrame *Frame,
-                                        const Function *F,
                                         const CallExpr *Call) {
   const Floating &Arg = S.Stk.peek<Floating>();
 
@@ -476,8 +439,8 @@ static bool interp__builtin_issignaling(InterpState &S, 
CodePtr OpPC,
 }
 
 static bool interp__builtin_isinf(InterpState &S, CodePtr OpPC,
-                                  const InterpFrame *Frame, const Function *F,
-                                  bool CheckSign, const CallExpr *Call) {
+                                  const InterpFrame *Frame, bool CheckSign,
+                                  const CallExpr *Call) {
   const Floating &Arg = S.Stk.peek<Floating>();
   bool IsInf = Arg.isInf();
 
@@ -490,7 +453,7 @@ static bool interp__builtin_isinf(InterpState &S, CodePtr 
OpPC,
 
 static bool interp__builtin_isfinite(InterpState &S, CodePtr OpPC,
                                      const InterpFrame *Frame,
-                                     const Function *F, const CallExpr *Call) {
+                                     const CallExpr *Call) {
   const Floating &Arg = S.Stk.peek<Floating>();
 
   pushInteger(S, Arg.isFinite(), Call->getType());
@@ -499,7 +462,7 @@ static bool interp__builtin_isfinite(InterpState &S, 
CodePtr OpPC,
 
 static bool interp__builtin_isnormal(InterpState &S, CodePtr OpPC,
                                      const InterpFrame *Frame,
-                                     const Function *F, const CallExpr *Call) {
+                                     const CallExpr *Call) {
   const Floating &Arg = S.Stk.peek<Floating>();
 
   pushInteger(S, Arg.isNormal(), Call->getType());
@@ -508,7 +471,6 @@ static bool interp__builtin_isnormal(InterpState &S, 
CodePtr OpPC,
 
 static bool interp__builtin_issubnormal(InterpState &S, CodePtr OpPC,
                                         const InterpFrame *Frame,
-                                        const Function *F,
                                         const CallExpr *Call) {
   const Floating &Arg = S.Stk.peek<Floating>();
 
@@ -517,7 +479,7 @@ static bool interp__builtin_issubnormal(InterpState &S, 
CodePtr OpPC,
 }
 
 static bool interp__builtin_iszero(InterpState &S, CodePtr OpPC,
-                                   const InterpFrame *Frame, const Function *F,
+                                   const InterpFrame *Frame,
                                    const CallExpr *Call) {
   const Floating &Arg = S.Stk.peek<Floating>();
 
@@ -526,7 +488,7 @@ static bool interp__builtin_iszero(InterpState &S, CodePtr 
OpPC,
 }
 
 static bool interp__builtin_signbit(InterpState &S, CodePtr OpPC,
-                                    const InterpFrame *Frame, const Function 
*F,
+                                    const InterpFrame *Frame,
                                     const CallExpr *Call) {
   const Floating &Arg = S.Stk.peek<Floating>();
 
@@ -535,12 +497,9 @@ static bool interp__builtin_signbit(InterpState &S, 
CodePtr OpPC,
 }
 
 static bool interp_floating_comparison(InterpState &S, CodePtr OpPC,
-                                       const InterpFrame *Frame,
-                                       const Function *F,
-                                       const CallExpr *Call) {
+                                       const CallExpr *Call, unsigned ID) {
   const Floating &RHS = S.Stk.peek<Floating>();
   const Floating &LHS = S.Stk.peek<Floating>(align(2u * primSize(PT_Float)));
-  unsigned ID = F->getBuiltinID();
 
   pushInteger(
       S,
@@ -574,7 +533,6 @@ static bool interp_floating_comparison(InterpState &S, 
CodePtr OpPC,
 /// second one is an integral value.
 static bool interp__builtin_isfpclass(InterpState &S, CodePtr OpPC,
                                       const InterpFrame *Frame,
-                                      const Function *Func,
                                       const CallExpr *Call) {
   PrimType FPClassArgT = *S.getContext().classify(Call->getArg(1)->getType());
   APSInt FPClassArg = peekToAPSInt(S.Stk, FPClassArgT);
@@ -591,7 +549,6 @@ static bool interp__builtin_isfpclass(InterpState &S, 
CodePtr OpPC,
 /// Five int values followed by one floating value.
 static bool interp__builtin_fpclassify(InterpState &S, CodePtr OpPC,
                                        const InterpFrame *Frame,
-                                       const Function *Func,
                                        const CallExpr *Call) {
   const Floating &Val = S.Stk.peek<Floating>();
 
@@ -613,11 +570,12 @@ static bool interp__builtin_fpclassify(InterpState &S, 
CodePtr OpPC,
 
   // The last argument is first on the stack.
   assert(Index <= 4);
-  unsigned IntSize = primSize(getIntPrimType(S));
+  PrimType IntT = *S.getContext().classify(Call->getArg(0));
+  unsigned IntSize = primSize(IntT);
   unsigned Offset =
       align(primSize(PT_Float)) + ((1 + (4 - Index)) * align(IntSize));
 
-  APSInt I = peekToAPSInt(S.Stk, getIntPrimType(S), Offset);
+  APSInt I = peekToAPSInt(S.Stk, IntT, Offset);
   pushInteger(S, I, Call->getType());
   return true;
 }
@@ -628,16 +586,15 @@ static bool interp__builtin_fpclassify(InterpState &S, 
CodePtr OpPC,
 // proceed without regard to the floating point settings.
 // Reference, WG14 N2478 F.10.4.3
 static bool interp__builtin_fabs(InterpState &S, CodePtr OpPC,
-                                 const InterpFrame *Frame,
-                                 const Function *Func) {
-  const Floating &Val = getParam<Floating>(Frame, 0);
+                                 const InterpFrame *Frame) {
+  const Floating &Val = S.Stk.peek<Floating>();
 
   S.Stk.push<Floating>(Floating::abs(Val));
   return true;
 }
 
 static bool interp__builtin_abs(InterpState &S, CodePtr OpPC,
-                                const InterpFrame *Frame, const Function *Func,
+                                const InterpFrame *Frame,
                                 const CallExpr *Call) {
   PrimType ArgT = *S.getContext().classify(Call->getArg(0)->getType());
   APSInt Val = peekToAPSInt(S.Stk, ArgT);
@@ -652,7 +609,6 @@ static bool interp__builtin_abs(InterpState &S, CodePtr 
OpPC,
 
 static bool interp__builtin_popcount(InterpState &S, CodePtr OpPC,
                                      const InterpFrame *Frame,
-                                     const Function *Func,
                                      const CallExpr *Call) {
   PrimType ArgT = *S.getContext().classify(Call->getArg(0)->getType());
   APSInt Val = peekToAPSInt(S.Stk, ArgT);
@@ -662,7 +618,7 @@ static bool interp__builtin_popcount(InterpState &S, 
CodePtr OpPC,
 
 static bool interp__builtin_parity(InterpState &S, CodePtr OpPC,
                                    const InterpFrame *Frame,
-                                   const Function *Func, const CallExpr *Call) 
{
+                                   const CallExpr *Call) {
   PrimType ArgT = *S.getContext().classify(Call->getArg(0)->getType());
   APSInt Val = peekToAPSInt(S.Stk, ArgT);
   pushInteger(S, Val.popcount() % 2, Call->getType());
@@ -671,7 +627,7 @@ static bool interp__builtin_parity(InterpState &S, CodePtr 
OpPC,
 
 static bool interp__builtin_clrsb(InterpState &S, CodePtr OpPC,
                                   const InterpFrame *Frame,
-                                  const Function *Func, const CallExpr *Call) {
+                                  const CallExpr *Call) {
   PrimType ArgT = *S.getContext().classify(Call->getArg(0)->getType());
   APSInt Val = peekToAPSInt(S.Stk, ArgT);
   pushInteger(S, Val.getBitWidth() - Val.getSignificantBits(), 
Call->getType());
@@ -680,7 +636,6 @@ static bool interp__builtin_clrsb(InterpState &S, CodePtr 
OpPC,
 
 static bool interp__builtin_bitreverse(InterpState &S, CodePtr OpPC,
                                        const InterpFrame *Frame,
-                                       const Function *Func,
                                        const CallExpr *Call) {
   PrimType ArgT = *S.getContext().classify(Call->getArg(0)->getType());
   APSInt Val = peekToAPSInt(S.Stk, ArgT);
@@ -690,7 +645,6 @@ static bool interp__builtin_bitreverse(InterpState &S, 
CodePtr OpPC,
 
 static bool interp__builtin_classify_type(InterpState &S, CodePtr OpPC,
                                           const InterpFrame *Frame,
-                                          const Function *Func,
                                           const CallExpr *Call) {
   // This is an unevaluated call, so there are no arguments on the stack.
   assert(Call->getNumArgs() == 1);
@@ -707,14 +661,14 @@ static bool interp__builtin_classify_type(InterpState &S, 
CodePtr OpPC,
 // __builtin_expect_with_probability(long, long, double)
 static bool interp__builtin_expect(InterpState &S, CodePtr OpPC,
                                    const InterpFrame *Frame,
-                                   const Function *Func, const CallExpr *Call) 
{
+                                   const CallExpr *Call) {
   // The return value is simply the value of the first parameter.
   // We ignore the probability.
   unsigned NumArgs = Call->getNumArgs();
   assert(NumArgs == 2 || NumArgs == 3);
 
   PrimType ArgT = *S.getContext().classify(Call->getArg(0)->getType());
-  unsigned Offset = align(primSize(getLongPrimType(S))) * 2;
+  unsigned Offset = align(ArgT) * 2;
   if (NumArgs == 3)
     Offset += align(primSize(PT_Float));
 
@@ -726,8 +680,7 @@ static bool interp__builtin_expect(InterpState &S, CodePtr 
OpPC,
 /// rotateleft(value, amount)
 static bool interp__builtin_rotate(InterpState &S, CodePtr OpPC,
                                    const InterpFrame *Frame,
-                                   const Function *Func, const CallExpr *Call,
-                                   bool Right) {
+                                   const CallExpr *Call, bool Right) {
   PrimType AmountT = *S.getContext().classify(Call->getArg(1)->getType());
   PrimType ValueT = *S.getContext().classify(Call->getArg(0)->getType());
 
@@ -748,7 +701,7 @@ static bool interp__builtin_rotate(InterpState &S, CodePtr 
OpPC,
 }
 
 static bool interp__builtin_ffs(InterpState &S, CodePtr OpPC,
-                                const InterpFrame *Frame, const Function *Func,
+                                const InterpFrame *Frame,
                                 const CallExpr *Call) {
   PrimType ArgT = *S.getContext().classify(Call->getArg(0)->getType());
   APSInt Value = peekToAPSInt(S.Stk, ArgT);
@@ -760,7 +713,6 @@ static bool interp__builtin_ffs(InterpState &S, CodePtr 
OpPC,
 
 static bool interp__builtin_addressof(InterpState &S, CodePtr OpPC,
                                       const InterpFrame *Frame,
-                                      const Function *Func,
                                       const CallExpr *Call) {
   assert(Call->getArg(0)->isLValue());
   PrimType PtrT = S.getContext().classify(Call->getArg(0)).value_or(PT_Ptr);
@@ -775,19 +727,18 @@ static bool interp__builtin_addressof(InterpState &S, 
CodePtr OpPC,
 }
 
 static bool interp__builtin_move(InterpState &S, CodePtr OpPC,
-                                 const InterpFrame *Frame, const Function 
*Func,
+                                 const InterpFrame *Frame,
                                  const CallExpr *Call) {
 
   PrimType ArgT = S.getContext().classify(Call->getArg(0)).value_or(PT_Ptr);
 
   TYPE_SWITCH(ArgT, const T &Arg = S.Stk.peek<T>(); S.Stk.push<T>(Arg););
 
-  return Func->getDecl()->isConstexpr();
+  return Call->getDirectCallee()->isConstexpr();
 }
 
 static bool interp__builtin_eh_return_data_regno(InterpState &S, CodePtr OpPC,
                                                  const InterpFrame *Frame,
-                                                 const Function *Func,
                                                  const CallExpr *Call) {
   PrimType ArgT = *S.getContext().classify(Call->getArg(0)->getType());
   APSInt Arg = peekToAPSInt(S.Stk, ArgT);
@@ -799,8 +750,7 @@ static bool 
interp__builtin_eh_return_data_regno(InterpState &S, CodePtr OpPC,
 }
 
 /// Just takes the first Argument to the call and puts it on the stack.
-static bool noopPointer(InterpState &S, CodePtr OpPC, const InterpFrame *Frame,
-                        const Function *Func, const CallExpr *Call) {
+static bool noopPointer(InterpState &S) {
   const Pointer &Arg = S.Stk.peek<Pointer>();
   S.Stk.push<Pointer>(Arg);
   return true;
@@ -808,14 +758,12 @@ static bool noopPointer(InterpState &S, CodePtr OpPC, 
const InterpFrame *Frame,
 
 // Two integral values followed by a pointer (lhs, rhs, resultOut)
 static bool interp__builtin_overflowop(InterpState &S, CodePtr OpPC,
-                                       const InterpFrame *Frame,
-                                       const Function *Func,
-                                       const CallExpr *Call) {
+                                       const CallExpr *Call,
+...
[truncated]

``````````

</details>


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

Reply via email to