-
Notifications
You must be signed in to change notification settings - Fork 13.5k
[clang][bytecode][NFC] Stop using Function in InterpBuiltin #137597
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Prepare for the ultimate removal of Function instances for builtin functions.
@llvm/pr-subscribers-clang Author: Timm Baeder (tbaederr) ChangesPrepare 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:
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]
|
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Labels
clang:bytecode
Issues for the clang bytecode constexpr interpreter
clang:frontend
Language frontend issues, e.g. anything involving "Sema"
clang
Clang issues not falling into any other category
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Prepare for the ultimate removal of Function instances for builtin functions.