Timm =?utf-8?q?Bäder?= <tbae...@redhat.com> Message-ID: In-Reply-To: <llvm.org/llvm/llvm-project/pull/151...@github.com>
https://github.com/tbaederr updated https://github.com/llvm/llvm-project/pull/151821 >From 95b00396ff44c473d6b3cd31a0dc2443c8badc09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbae...@redhat.com> Date: Sat, 2 Aug 2025 15:51:44 +0200 Subject: [PATCH 1/2] [clang][bytecode] Use SmallVector for Function::Code This way we can use resize_for_overwrite, which is slightly more efficient. --- clang/lib/AST/ByteCode/ByteCodeEmitter.cpp | 18 +++++++++--------- clang/lib/AST/ByteCode/ByteCodeEmitter.h | 2 +- clang/lib/AST/ByteCode/Context.cpp | 8 ++++---- clang/lib/AST/ByteCode/Function.h | 4 ++-- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/clang/lib/AST/ByteCode/ByteCodeEmitter.cpp b/clang/lib/AST/ByteCode/ByteCodeEmitter.cpp index 3288585683c10..03f47973a1138 100644 --- a/clang/lib/AST/ByteCode/ByteCodeEmitter.cpp +++ b/clang/lib/AST/ByteCode/ByteCodeEmitter.cpp @@ -135,7 +135,7 @@ int32_t ByteCodeEmitter::getOffset(LabelTy Label) { /// Helper to write bytecode and bail out if 32-bit offsets become invalid. /// Pointers will be automatically marshalled as 32-bit IDs. template <typename T> -static void emit(Program &P, std::vector<std::byte> &Code, const T &Val, +static void emit(Program &P, llvm::SmallVector<std::byte> &Code, const T &Val, bool &Success) { size_t Size; @@ -153,7 +153,7 @@ static void emit(Program &P, std::vector<std::byte> &Code, const T &Val, size_t ValPos = align(Code.size()); Size = align(Size); assert(aligned(ValPos + Size)); - Code.resize(ValPos + Size); + Code.resize_for_overwrite(ValPos + Size); if constexpr (!std::is_pointer_v<T>) { new (Code.data() + ValPos) T(Val); @@ -166,7 +166,7 @@ static void emit(Program &P, std::vector<std::byte> &Code, const T &Val, /// Emits a serializable value. These usually (potentially) contain /// heap-allocated memory and aren't trivially copyable. template <typename T> -static void emitSerialized(std::vector<std::byte> &Code, const T &Val, +static void emitSerialized(llvm::SmallVector<std::byte> &Code, const T &Val, bool &Success) { size_t Size = Val.bytesToSerialize(); @@ -180,31 +180,31 @@ static void emitSerialized(std::vector<std::byte> &Code, const T &Val, size_t ValPos = Code.size(); Size = align(Size); assert(aligned(ValPos + Size)); - Code.resize(ValPos + Size); + Code.resize_for_overwrite(ValPos + Size); Val.serialize(Code.data() + ValPos); } template <> -void emit(Program &P, std::vector<std::byte> &Code, const Floating &Val, +void emit(Program &P, llvm::SmallVector<std::byte> &Code, const Floating &Val, bool &Success) { emitSerialized(Code, Val, Success); } template <> -void emit(Program &P, std::vector<std::byte> &Code, +void emit(Program &P, llvm::SmallVector<std::byte> &Code, const IntegralAP<false> &Val, bool &Success) { emitSerialized(Code, Val, Success); } template <> -void emit(Program &P, std::vector<std::byte> &Code, const IntegralAP<true> &Val, - bool &Success) { +void emit(Program &P, llvm::SmallVector<std::byte> &Code, + const IntegralAP<true> &Val, bool &Success) { emitSerialized(Code, Val, Success); } template <> -void emit(Program &P, std::vector<std::byte> &Code, const FixedPoint &Val, +void emit(Program &P, llvm::SmallVector<std::byte> &Code, const FixedPoint &Val, bool &Success) { emitSerialized(Code, Val, Success); } diff --git a/clang/lib/AST/ByteCode/ByteCodeEmitter.h b/clang/lib/AST/ByteCode/ByteCodeEmitter.h index 9e9dd5e87cd7a..8a02911189748 100644 --- a/clang/lib/AST/ByteCode/ByteCodeEmitter.h +++ b/clang/lib/AST/ByteCode/ByteCodeEmitter.h @@ -88,7 +88,7 @@ class ByteCodeEmitter { /// Location of label relocations. llvm::DenseMap<LabelTy, llvm::SmallVector<unsigned, 5>> LabelRelocs; /// Program code. - std::vector<std::byte> Code; + llvm::SmallVector<std::byte> Code; /// Opcode to expression mapping. SourceMap SrcMap; diff --git a/clang/lib/AST/ByteCode/Context.cpp b/clang/lib/AST/ByteCode/Context.cpp index aaeb52e0fa449..bc76dde570bac 100644 --- a/clang/lib/AST/ByteCode/Context.cpp +++ b/clang/lib/AST/ByteCode/Context.cpp @@ -44,12 +44,12 @@ bool Context::isPotentialConstantExpr(State &Parent, const FunctionDecl *FD) { Compiler<ByteCodeEmitter>(*this, *P).compileFunc( FD, const_cast<Function *>(Func)); - ++EvalID; - // And run it. - if (!Run(Parent, Func)) + if (!Func->isValid()) return false; - return Func->isValid(); + ++EvalID; + // And run it. + return Run(Parent, Func); } void Context::isPotentialConstantExprUnevaluated(State &Parent, const Expr *E, diff --git a/clang/lib/AST/ByteCode/Function.h b/clang/lib/AST/ByteCode/Function.h index de88f3ded34dc..b5ea1b00fce10 100644 --- a/clang/lib/AST/ByteCode/Function.h +++ b/clang/lib/AST/ByteCode/Function.h @@ -236,7 +236,7 @@ class Function final { bool HasRVO, bool IsLambdaStaticInvoker); /// Sets the code of a function. - void setCode(unsigned NewFrameSize, std::vector<std::byte> &&NewCode, + void setCode(unsigned NewFrameSize, llvm::SmallVector<std::byte> &&NewCode, SourceMap &&NewSrcMap, llvm::SmallVector<Scope, 2> &&NewScopes, bool NewHasBody) { FrameSize = NewFrameSize; @@ -266,7 +266,7 @@ class Function final { /// Size of the argument stack. unsigned ArgSize; /// Program code. - std::vector<std::byte> Code; + llvm::SmallVector<std::byte> Code; /// Opcode-to-expression mapping. SourceMap SrcMap; /// List of block descriptors. >From 7b991039a8255c39c7b1c9c7e9cccbb70b5726fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbae...@redhat.com> Date: Sat, 2 Aug 2025 16:55:08 +0200 Subject: [PATCH 2/2] Use SmallVectorImpl parameters --- clang/lib/AST/ByteCode/ByteCodeEmitter.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/clang/lib/AST/ByteCode/ByteCodeEmitter.cpp b/clang/lib/AST/ByteCode/ByteCodeEmitter.cpp index 03f47973a1138..b38cac7de8d16 100644 --- a/clang/lib/AST/ByteCode/ByteCodeEmitter.cpp +++ b/clang/lib/AST/ByteCode/ByteCodeEmitter.cpp @@ -135,8 +135,8 @@ int32_t ByteCodeEmitter::getOffset(LabelTy Label) { /// Helper to write bytecode and bail out if 32-bit offsets become invalid. /// Pointers will be automatically marshalled as 32-bit IDs. template <typename T> -static void emit(Program &P, llvm::SmallVector<std::byte> &Code, const T &Val, - bool &Success) { +static void emit(Program &P, llvm::SmallVectorImpl<std::byte> &Code, + const T &Val, bool &Success) { size_t Size; if constexpr (std::is_pointer_v<T>) @@ -166,7 +166,7 @@ static void emit(Program &P, llvm::SmallVector<std::byte> &Code, const T &Val, /// Emits a serializable value. These usually (potentially) contain /// heap-allocated memory and aren't trivially copyable. template <typename T> -static void emitSerialized(llvm::SmallVector<std::byte> &Code, const T &Val, +static void emitSerialized(llvm::SmallVectorImpl<std::byte> &Code, const T &Val, bool &Success) { size_t Size = Val.bytesToSerialize(); @@ -186,26 +186,26 @@ static void emitSerialized(llvm::SmallVector<std::byte> &Code, const T &Val, } template <> -void emit(Program &P, llvm::SmallVector<std::byte> &Code, const Floating &Val, - bool &Success) { +void emit(Program &P, llvm::SmallVectorImpl<std::byte> &Code, + const Floating &Val, bool &Success) { emitSerialized(Code, Val, Success); } template <> -void emit(Program &P, llvm::SmallVector<std::byte> &Code, +void emit(Program &P, llvm::SmallVectorImpl<std::byte> &Code, const IntegralAP<false> &Val, bool &Success) { emitSerialized(Code, Val, Success); } template <> -void emit(Program &P, llvm::SmallVector<std::byte> &Code, +void emit(Program &P, llvm::SmallVectorImpl<std::byte> &Code, const IntegralAP<true> &Val, bool &Success) { emitSerialized(Code, Val, Success); } template <> -void emit(Program &P, llvm::SmallVector<std::byte> &Code, const FixedPoint &Val, - bool &Success) { +void emit(Program &P, llvm::SmallVectorImpl<std::byte> &Code, + const FixedPoint &Val, bool &Success) { emitSerialized(Code, Val, Success); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits