aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/AST/ByteCode/InterpBuiltin.cpp
AgeCommit message (Collapse)AuthorFilesLines
32 hours[clang][bytecode][NFC] Fix a few clang-tidy complaints (#150940)Timm Baeder1-6/+8
8 days[clang][bytecode] Use OptPrimType instead of std::optional<PrimType> (#149812)Timm Baeder1-3/+3
We use this construct a lot. Use something similar to clang's UnsignedOrNone. This results in some slighy compile time improvements: https://llvm-compile-time-tracker.com/compare.php?from=17a4b0399d161a3b89d8f0ce82add1638f23f5d4&to=a251d81ecd0ed45dd190462663155fdb303ef04d&stat=instructions:u
10 days[clang][bytecode] Reintroduce Pointer::elem() (#149693)Timm Baeder1-11/+10
As a way of writing atIndex(I).deref<T>(), which creates an intermediate Pointer, which in turn adds (and removes) that pointer from the pointer list of the Block. This way we can avoid that.
12 days[clang][bytecode] Report mutable reads when copying unions (#149320)Timm Baeder1-0/+2
12 days[clang][bytecode][NFC] Remove unused includes (#149460)Timm Baeder1-1/+0
2025-07-10[clang][bytecode] Implement missing elementwise builtins (#147892)Timm Baeder1-5/+103
2025-07-08[clang][bytecode] Fix __builtin_is_within_lifetime in initializers (#147480)Timm Baeder1-1/+13
2025-07-06[clang][bytecode] Fix a crash in overflow builtins (#147189)Timm Baeder1-1/+3
Only initialize pointers that can be initialized.
2025-07-05[clang][bytecode] Narrow allocated single-array Pointer (#147160)Timm Baeder1-1/+1
Since the result should not be an array element.
2025-07-01[clang][bytecode] Allocate operator new data as array (#146471)Timm Baeder1-22/+16
Even if we only allocate one element, we still need to allocate it as a single-element array. This matches what the current interpreter does.
2025-06-27[Clang][ByteCode][NFC] Misc minor performance fixes (#145988)Shafik Yaghmour1-8/+8
Static analysis flagged multiple places we could move instead of copy. In one case I realized we could avoid computing the same thing multiple times and did that fix instead.
2025-06-23[NFC][Clang][AST] Drop `llvm::` in front of `ArrayRef`/`MutableArrayRef` ↵Rahul Joshi1-3/+2
(#145207)
2025-06-23[clang][bytecode] Fix assignInteger() with allocated primtypes (#145302)Timm Baeder1-6/+17
2025-06-20Reapply "Reapply "[clang][bytecode] Allocate IntegralAP and Floating … ↵Timm Baeder1-12/+43
(#145014) …types usi… (#144676)" This reverts commit 68471d29eed2c49f9b439e505b3f24d387d54f97. IntegralAP contains a union: union { uint64_t *Memory = nullptr; uint64_t Val; }; On 64bit systems, both Memory and Val have the same size. However, on 32 bit system, Val is 64bit and Memory only 32bit. Which means the default initializer for Memory will only zero half of Val. We fixed this by zero-initializing Val explicitly in the IntegralAP(unsigned BitWidth) constructor. See also the discussion in https://github.com/llvm/llvm-project/pull/144246
2025-06-18Revert "Reapply "[clang][bytecode] Allocate IntegralAP and Floating types ↵Timm Bäder1-43/+12
usi… (#144676)" This reverts commit 7c15edb306932e41c159f3d69c161ed0d89d47b7. This still breaks clang-armv8-quick: https://lab.llvm.org/buildbot/#/builders/154/builds/17587
2025-06-18Reapply "[clang][bytecode] Allocate IntegralAP and Floating types usi… ↵Timm Baeder1-12/+43
(#144676) …ng an allocator (#144246)" This reverts commit 57828fec760f086b334ce0cb1c465fc559dcaea4.
2025-06-17Revert "[clang][bytecode] Allocate IntegralAP and Floating types using an ↵Timm Bäder1-43/+12
allocator (#144246)" This reverts commit c66be289901b3f035187d391e80e3610d7d6232e. This breaks the armv8-quick builder: https://lab.llvm.org/buildbot/#/builders/154/builds/17549
2025-06-17[clang][bytecode] Allocate IntegralAP and Floating types using an allocator ↵Timm Baeder1-12/+43
(#144246) Both `APInt` and `APFloat` will heap-allocate memory themselves using the system allocator when the size of their data exceeds 64 bits. This is why clang has `APNumericStorage`, which allocates its memory using an allocator (via `ASTContext`) instead. Calling `getValue()` on an ast node like that will then create a new `APInt`/`APFloat` , which will copy the data (in the `APFloat` case, we even copy it twice). That's sad but whatever. In the bytecode interpreter, we have a similar problem. Large integers and floating-point values are placement-new allocated into the `InterpStack` (or into the bytecode, which is a `vector<std::byte>`). When we then later interrupt interpretation, we don't run the destructor for all items on the stack, which means we leak the memory the `APInt`/`APFloat` (which backs the `IntegralAP`/`Floating` the interpreter uses). Fix this by using an approach similar to the one used in the AST. Add an allocator to `InterpState`, which is used for temporaries and local values. Those values will be freed at the end of interpretation. For global variables, we need to promote the values to global lifetime, which we do via `InitGlobal` and `FinishInitGlobal` ops. Interestingly, this results in a slight _improvement_ in compile times: https://llvm-compile-time-tracker.com/compare.php?from=6bfcdda9b1ddf0900f82f7e30cb5e3253a791d50&to=88d1d899127b408f0fb0f385c2c58e6283195049&stat=instructions:u (but don't ask me why). Fixes https://github.com/llvm/llvm-project/issues/139012
2025-06-16[clang][bytecode] Fix calling operator new with nothrow/align parameter ↵Timm Baeder1-1/+19
(#144271) Discard all the parameters we don't care about.
2025-06-11[Clang][ByteCode][NFC] Move APInt into pushInteger since it is being passed ↵Shafik Yaghmour1-2/+2
by value (#143578) Static analysis flagged that we could move APInt instead of copy, indeed it has a move constructor and so we should move into values for APInt.
2025-06-05[AST] Fix an unused-function warning (NFC)Jie Fu1-1/+1
/llvm-project/clang/lib/AST/ByteCode/InterpBuiltin.cpp:26:13: error: unused function 'isNoopBuiltin' [-Werror,-Wunused-function] static bool isNoopBuiltin(unsigned ID) { ^ 1 error generated.
2025-06-05[clang][bytecode] Pop builtin args from the stack while evaluating (#142832)Timm Baeder1-459/+259
Instead of just peek()ing the values when evaluating the builtins and later classify()ing all the call args once again to remove them, just do it while evaluating. This saves quite a bit of code.
2025-05-30Enclose code in nondebug in #ifndef NDEBUG/#endif (#142189)DeanSturtevant11-3/+3
A previous change to InterpBuiltin.cpp fixed an unused variable warning by using [[maybe unused]] and (void). The code actually serves no useful purpose in non-debug builds, so let's not include it there.
2025-05-29[AST] Fix a warningKazu Hirata1-0/+1
This patch fixes: clang/lib/AST/ByteCode/InterpBuiltin.cpp:767:12: error: unused variable 'PtrT' [-Werror,-Wunused-variable]
2025-05-29Add "maybe_unused" to variable only used in assert (#142049)google-yfyang1-1/+2
2025-05-29[clang][bytecode] Make some builtins no-ops (#141952)Timm Baeder1-21/+25
For some builtins, we dont' need to do anything, but due to the cleanup code being the same for all builtins, we still had to duplicate the value on the stack. Remove that and get rid of all the unnecessary pressure on the InterpStack.
2025-05-29[clang][bytecode] Simplify diagnoseUnknownDecl if we're not diagnosing (#141910)Timm Baeder1-0/+3
See the added comment. This improves compile times a bit: https://llvm-compile-time-tracker.com/compare.php?from=ac62f73f19ae9fb415d3fc423949b8d7543e8717&to=0d6cf47197a4ee11cdd1ee4a48ea38a2907c3d45&stat=instructions:u
2025-04-29[clang][bytecode] Start implementing builtin_is_within_lifetime (#137765)Timm Baeder1-0/+49
2025-04-29[clang][bytecode] Remove base casts before doing memcpy (#137754)Timm Baeder1-2/+11
We have to copy the entire thing, not just one of the bases.
2025-04-29[clang][bytecode] Check array sizes against step limit (#137679)Timm Baeder1-0/+3
2025-04-28[clang][bytecode] Fix ia32_addcarry/subborrow (#137642)Timm Baeder1-9/+11
RHS is followed by another Pointer.
2025-04-28[clang][bytecode] Don't create Function instances for builtins (#137618)Timm Baeder1-2/+2
Now that we don't use them anymore in InterpBuiltin.cpp and we don't create frames for them anymore anyway, just don't create Function instances.
2025-04-28[clang][bytecode] Don't create function frames for builtin calls (#137607)Timm Baeder1-11/+37
They don't have local variables etc. so don't create frames for them.
2025-04-28[clang][bytecode][NFC] Stop using Function in InterpBuiltin (#137597)Timm Baeder1-238/+173
Prepare for the ultimate removal of Function instances for builtin functions.
2025-04-27[clang][bytecode] Diagnose delete of non-heap-allocated blocks (#137475)Timm Baeder1-0/+7
With std::allocator::deallocate() calls
2025-04-25[clang][bytecode] Propagate IsVolatile bit to subobjects (#137293)Timm Baeder1-5/+3
For ```c++ struct S { constexpr S(int=0) : i(1) {} int i; }; constexpr volatile S vs; ``` reading from `vs.i` is not allowed, even though `i` is not volatile qualified. Propagate the IsVolatile bit down the hierarchy, so we know reading from `vs.i` is a volatile read.
2025-04-23[clang][bytecode] Allow casts from void* only in std::allocator calls (#136714)Timm Baeder1-55/+2
Otherwise, add the missing diagnostic.
2025-04-20[clang][bytecode] Fix bos/bdos with non-zero offset applied (#136482)Timm Baeder1-1/+48
Compute the offset from the record layout. Unfortunately, not all the test cases from the current interpreter work.
2025-04-20[clang][bytecode] Start implementing __builtin_{,dynamic}_object_size (#136478)Timm Baeder1-0/+52
2025-04-17[clang][bytecode] Check if operator delete calls are in the right frame ↵Timm Baeder1-0/+35
(#136141) This is only permitted in a std::allocator::deallocate frame.
2025-04-17[clang][bytecode] Add missing __builtin_memcpy checks (#135975)Timm Baeder1-1/+17
Add a test for type punning and tests and the necessary checks for non-trivially-copyable types and incomplete types.
2025-04-16[clang][bytecode] Implement __builtin_wmem{cpy,move} (#135969)Timm Baeder1-8/+22
2025-04-16[clang][bytecode][NFC] Remove PT_FnPtr (#135947)Timm Baeder1-5/+1
We don't need this anymore since we don't return it from classify() anymore.
2025-04-10[clang][bytecode] Clear inactive union fields when copying (#134982)Timm Baeder1-1/+43
When copying unions, we need to only copy the active field of the source union, which we were already doing. However, we also need to zero out the (now) inactive fields, so we don't end up with dangling pointers in those inactive fields.
2025-03-31[clang][bytecode] Return Invalid() on non-constexpr builtins (#133700)Timm Baeder1-1/+1
So the diagnostic output matches with the current interpreter
2025-03-26Reapply "[clang][bytecode] Implement __builtin_{wcscmp,wcsncmp} (#132… ↵Timm Baeder1-13/+40
(#132963) …723)" This reverts commit 1e2ad6793ac205607e7c809283cf69e1cc36a69a. Fix the previous commit on big-endian hosts by _not_ falling through to the `uint8_t` code path.
2025-03-25[clang][bytecode] Support composite arrays in memcpy op (#132775)Timm Baeder1-0/+12
See the attached test case.
2025-03-25Revert "[clang][bytecode] Implement __builtin_{wcscmp,wcsncmp} (#132723)"Timm Bäder1-26/+2
This reverts commit f7aea4d081f77dba48b0fc019f59b678fb679aa8. This broke the clang-solaris11-sparcv9 builder: https://lab.llvm.org/buildbot/#/builders/13/builds/6151
2025-03-24[clang][bytecode] Implement __builtin_{wcscmp,wcsncmp} (#132723)Timm Baeder1-2/+26
2025-03-24[clang][bytecode] Diagnose integral source/dest in memcpy (#132715)Timm Baeder1-0/+11
Like the current interpreter does.