[clang] c14acb7 - [clang][bytecode] Save Immediate bit in Function (#139671)
via cfe-commits
cfe-commits at lists.llvm.org
Tue May 13 03:56:11 PDT 2025
Author: Timm Baeder
Date: 2025-05-13T12:56:08+02:00
New Revision: c14acb74423a577e10bbb635109851742e77444f
URL: https://github.com/llvm/llvm-project/commit/c14acb74423a577e10bbb635109851742e77444f
DIFF: https://github.com/llvm/llvm-project/commit/c14acb74423a577e10bbb635109851742e77444f.diff
LOG: [clang][bytecode] Save Immediate bit in Function (#139671)
Otherwise, we have to look at the FunctionDecl at every function call.
Added:
Modified:
clang/lib/AST/ByteCode/Function.cpp
clang/lib/AST/ByteCode/Function.h
clang/lib/AST/ByteCode/Interp.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/ByteCode/Function.cpp b/clang/lib/AST/ByteCode/Function.cpp
index 8a4e089d9ecd0..d3e7e1ffc63d5 100644
--- a/clang/lib/AST/ByteCode/Function.cpp
+++ b/clang/lib/AST/ByteCode/Function.cpp
@@ -22,10 +22,12 @@ Function::Function(Program &P, FunctionDeclTy Source, unsigned ArgSize,
bool HasThisPointer, bool HasRVO, bool IsLambdaStaticInvoker)
: P(P), Kind(FunctionKind::Normal), Source(Source), ArgSize(ArgSize),
ParamTypes(std::move(ParamTypes)), Params(std::move(Params)),
- ParamOffsets(std::move(ParamOffsets)), HasThisPointer(HasThisPointer),
- HasRVO(HasRVO) {
+ ParamOffsets(std::move(ParamOffsets)), IsValid(false),
+ IsFullyCompiled(false), HasThisPointer(HasThisPointer), HasRVO(HasRVO),
+ Defined(false) {
if (const auto *F = dyn_cast<const FunctionDecl *>(Source)) {
Variadic = F->isVariadic();
+ Immediate = F->isImmediateFunction();
if (const auto *CD = dyn_cast<CXXConstructorDecl>(F)) {
Virtual = CD->isVirtual();
Kind = FunctionKind::Ctor;
@@ -40,7 +42,13 @@ Function::Function(Program &P, FunctionDeclTy Source, unsigned ArgSize,
Kind = FunctionKind::LambdaCallOperator;
else if (MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator())
Kind = FunctionKind::CopyOrMoveOperator;
+ } else {
+ Virtual = false;
}
+ } else {
+ Variadic = false;
+ Virtual = false;
+ Immediate = false;
}
}
diff --git a/clang/lib/AST/ByteCode/Function.h b/clang/lib/AST/ByteCode/Function.h
index 436574dd3a4c7..45a1c1bf9f839 100644
--- a/clang/lib/AST/ByteCode/Function.h
+++ b/clang/lib/AST/ByteCode/Function.h
@@ -155,6 +155,7 @@ class Function final {
/// Checks if the function is virtual.
bool isVirtual() const { return Virtual; };
+ bool isImmediate() const { return Immediate; }
/// Checks if the function is a constructor.
bool isConstructor() const { return Kind == FunctionKind::Ctor; }
@@ -276,22 +277,32 @@ class Function final {
/// List of parameter offsets.
llvm::SmallVector<unsigned, 8> ParamOffsets;
/// Flag to indicate if the function is valid.
- bool IsValid = false;
+ LLVM_PREFERRED_TYPE(bool)
+ unsigned IsValid : 1;
/// Flag to indicate if the function is done being
/// compiled to bytecode.
- bool IsFullyCompiled = false;
+ LLVM_PREFERRED_TYPE(bool)
+ unsigned IsFullyCompiled : 1;
/// Flag indicating if this function takes the this pointer
/// as the first implicit argument
- bool HasThisPointer = false;
+ LLVM_PREFERRED_TYPE(bool)
+ unsigned HasThisPointer : 1;
/// Whether this function has Return Value Optimization, i.e.
/// the return value is constructed in the caller's stack frame.
/// This is done for functions that return non-primive values.
- bool HasRVO = false;
+ LLVM_PREFERRED_TYPE(bool)
+ unsigned HasRVO : 1;
/// If we've already compiled the function's body.
- bool HasBody = false;
- bool Defined = false;
- bool Variadic = false;
- bool Virtual = false;
+ LLVM_PREFERRED_TYPE(bool)
+ unsigned HasBody : 1;
+ LLVM_PREFERRED_TYPE(bool)
+ unsigned Defined : 1;
+ LLVM_PREFERRED_TYPE(bool)
+ unsigned Variadic : 1;
+ LLVM_PREFERRED_TYPE(bool)
+ unsigned Virtual : 1;
+ LLVM_PREFERRED_TYPE(bool)
+ unsigned Immediate : 1;
public:
/// Dumps the disassembled bytecode to \c llvm::errs().
diff --git a/clang/lib/AST/ByteCode/Interp.cpp b/clang/lib/AST/ByteCode/Interp.cpp
index 91930c016c985..bc860185fea21 100644
--- a/clang/lib/AST/ByteCode/Interp.cpp
+++ b/clang/lib/AST/ByteCode/Interp.cpp
@@ -1501,7 +1501,7 @@ bool Call(InterpState &S, CodePtr OpPC, const Function *Func,
InterpFrame *FrameBefore = S.Current;
S.Current = NewFrame.get();
- InterpStateCCOverride CCOverride(S, Func->getDecl()->isImmediateFunction());
+ InterpStateCCOverride CCOverride(S, Func->isImmediate());
// Note that we cannot assert(CallResult.hasValue()) here since
// Ret() above only sets the APValue if the curent frame doesn't
// have a caller set.
More information about the cfe-commits
mailing list