[clang] [clang][bytecode] Use a special opcode for trivial defaulted copy/move operator calls (PR #222332)
Oliver Hunt via cfe-commits
cfe-commits at lists.llvm.org
Wed Sep 9 19:00:27 PDT 2026
================
@@ -3404,6 +3404,64 @@ std::optional<Pointer> addSubOffsetOpaque(InterpState &S, CodePtr OpPC,
return Pointer(OP.withPastEnd(true), NewOffset);
}
+bool Memcpy(InterpState &S, CodePtr OpPC) {
+ const Pointer &Src = S.Stk.pop<Pointer>();
+ Pointer &Dest = S.Stk.peek<Pointer>();
+
+ if (Src.isDummy() || !Src.isBlockPointer())
+ return false;
+ if (!Dest.isBlockPointer())
+ return false;
+
+ if ((Src.getRecord() && Src.getRecord()->isUnion() &&
+ !Src.getRecord()->isAnonymousUnion()) ||
+ Src.inUnion()) {
+ if (!CheckLoad(S, OpPC, Src))
+ return false;
+ }
+
+ return DoMemcpy(S, OpPC, Src, Dest);
+}
+
+bool TrivialCopy(InterpState &S, CodePtr OpPC, bool Activate,
+ const Function *Func) {
+ const Pointer &Src = S.Stk.pop<Pointer>();
+ Pointer &Dest = S.Stk.peek<Pointer>();
+
+ if (Src.isDummy() || Src.isConstexprUnknown() || !Src.isBlockPointer())
+ return false;
+ if (!Dest.isBlockPointer() || Dest.isDummy() || Dest.isConstexprUnknown())
+ return false;
+
+ if (!CheckStore(S, OpPC, Dest, AK_MemberCall,
+ /*WillBeActivated=*/Activate))
+ return false;
+
+ if (S.checkingPotentialConstantExpression())
+ return false;
+
+ // NOTE: This is a fake function frame that doesn't do anything except show up
+ // in the "in call to" diagnostics. Since the copies we replace with this
+ // opcode are always defaulted/trivial, they don't add much there either
+ // though. Once we default to the bytecode interpreter, we shoud consider just
+ // removing it.
+ auto Memory = std::make_unique<char[]>(InterpFrame::allocSize(Func));
+ auto *NewFrame =
+ new (Memory.get()) InterpFrame(S, Func, S.PC, /*VarArgSize=*/0);
+ InterpFrame *FrameBefore = S.Current;
+ S.Current = NewFrame;
----------------
ojhunt wrote:
Not for this PR, but it does feel like having an RAII type to manage this would be nice
https://github.com/llvm/llvm-project/pull/222332
More information about the cfe-commits
mailing list