202 Commits

Author SHA1 Message Date
Timm Bäder
f18b71d14f [clang][Interp] Implement remaining MaterializeTemporaryExpr bits
As well as support for CompoundLiteralExprs.

Differential Revision: https://reviews.llvm.org/D140668
2023-03-02 07:51:54 +01:00
Timm Bäder
730eca6a3d [clang][Interp] Handle DecompositionDecls
Differential Revision: https://reviews.llvm.org/D138802
2023-03-01 17:11:57 +01:00
Timm Bäder
4a2c4acb98 [clang][Interp] Support pointers in compound assignment operators
Differential Revision: https://reviews.llvm.org/D140874
2023-02-03 16:42:46 +01:00
Timm Bäder
a7f3bcaa84 [clang][Interp][NFCI] Handle DiscardResult for ExprWithCleanups
Just pop the pointer.
2023-02-03 16:07:14 +01:00
Timm Bäder
7bb615ea0e [clang][Interp] Materializing primitive temporaries
Implement MaterializeTemporaryExpr for primitive types.

Differential Revision: https://reviews.llvm.org/D136017
2023-02-03 15:11:15 +01:00
Timm Bäder
7b966e2156 [clang][Interp][NFC] Add GetPtrBasePop opcode
Change GetPtrBase to *not* pop the base pointer and add a *Pop variant.
This will be used in later patches.
2023-01-27 08:05:53 +01:00
Timm Bäder
5bf56a5877 [clang][Interp][NFCI] Don't crash on void builtin functions
classifyPrim() runs into a llvm_unreachable() for those.
2023-01-26 07:32:33 +01:00
Timm Bäder
d2ea8ae5d4 [clang][Interp] Implement logical and/or operators
Differential Revision: https://reviews.llvm.org/D140809
2023-01-26 06:52:35 +01:00
Timm Bäder
eee8075f57 [clang][Interp][NFCI] Remove an unnecessary DupPtr op
When initializing a primitive array, we don't need to dup the base
pointer for every element.
2023-01-25 17:09:33 +01:00
Timm Bäder
5de6b94f85 [clang][Interp][NFC] Replace remaining dyn_cast_or_null uses 2023-01-25 16:39:26 +01:00
Timm Bäder
af3a171dcf [clang][Interp] Compound assign operators for FP values
Differential Revision: https://reviews.llvm.org/D140377
2023-01-25 16:25:04 +01:00
Timm Bäder
cb7f582211 Re-apply "[clang][Interp] Support floating-point values"
Don't move the Repr struct into Integral this time.

Differential Revision: https://reviews.llvm.org/D134859
2023-01-25 15:13:09 +01:00
Timm Bäder
b3b1d86137 Revert "[clang][Interp] Support floating-point values"
This reverts commit 62f43c3eae2460d4ca3da7897fd2d7c56920638c.

This breaks a couple of builders, e.g.

https://lab.llvm.org/buildbot/#/builders/139/builds/34925
2023-01-25 14:48:39 +01:00
Timm Bäder
62f43c3eae [clang][Interp] Support floating-point values
Add a new Floating type and a few new opcodes to support floating point
values.

Differential Revision: https://reviews.llvm.org/D134859
2023-01-25 14:41:26 +01:00
Timm Bäder
0a3243de62 [clang][Interp] Array initialization via string literal
Differential Revision: https://reviews.llvm.org/D137488
2023-01-25 14:22:05 +01:00
Timm Bäder
a7a4463acb [clang][Interp] Start implementing builtin functions
Differential Revision: https://reviews.llvm.org/D137487
2023-01-25 14:08:03 +01:00
Timm Bäder
f4a6842c5a [clang][Interp] Reject invalid declarations and expressions
Reject them early, since we will run into problems and/or assertions
later on anyway.

Differential Revision: https://reviews.llvm.org/D137386
2023-01-25 12:52:44 +01:00
Timm Bäder
2725e2c032 [clang][Interp] Fix ImplicitValueInitExprs for pointer types
This previously ran into an "unknown type" assertion when trying to emit
a 'Zero' op for a pointer type. Emit a NullPtr op instead.

Differential Revision: https://reviews.llvm.org/D137235
2023-01-25 12:31:49 +01:00
Timm Bäder
7348bb36c5 [clang][Interp] Support inc/dec operators for pointers
Differential Revision: https://reviews.llvm.org/D137232
2023-01-25 11:57:05 +01:00
Timm Bäder
902140dd38 [clang][Interp] Re-apply "Implement missing compound assign operators"
Implement mul, div, rem, etc. compound assign operators.

Differential Revision: https://reviews.llvm.org/D137071
2023-01-25 10:24:50 +01:00
Timm Bäder
de3a3cb987 [clang][Interp] Fix compound assign operator types
Just like we do (or will do) for floating types, we need to take into
acocunt that the LHSComputationType, ResultType and type of the
expression (what we ultimately store) might be different.

Do this by emitting cast ops before and after doing the computation.

This fixes the test failures introduced by
490e8214fca48824beda8b508d6d6bbbf3d8d9a7 on big endian machines.

Differential Revision: https://reviews.llvm.org/D142328
2023-01-25 10:12:26 +01:00
Timm Bäder
6469281100 [clang][Interp][NFC] Remove InitFn code
This is unused.
2023-01-23 12:19:36 +01:00
Timm Bäder
284bd95e80 [clang][Interp][NFC] Remove unused using alias 2023-01-23 10:19:34 +01:00
Timm Bäder
3665da3d00 Re-commit "[clang][Interp] Unify visiting variable declarations"
We often visit the same variable multiple times, e.g. once when checking
its initializer and later when compiling the function. Unify both of
those in visitVarDecl() and do the returning of the value in
visitDecl().

This time, use a VariableScope instead of a DeclScope for local
variables. This way, we don't emit Destroy ops for the local variables
immediately after creating them.

Differential Revision: https://reviews.llvm.org/D136815
2023-01-21 10:23:53 +01:00
Timm Bäder
8df7e818de Revert "[clang][Interp] Unify visiting variable declarations"
This reverts commit 5b54cf1a2892767fe949826a32d7820732028a38.

This breaks a builder: https://lab.llvm.org/buildbot/#/builders/5/builds/30854
2023-01-19 13:52:47 +01:00
Timm Bäder
f6ea1af9a4 Revert "[clang][Interp] Implement missing compound assign operators"
This reverts commit 490e8214fca48824beda8b508d6d6bbbf3d8d9a7.

This breaks a builder: https://lab.llvm.org/buildbot/#/builders/214/builds/5415
2023-01-19 13:52:47 +01:00
Timm Bäder
490e8214fc [clang][Interp] Implement missing compound assign operators
Implement mul, div, rem, etc. compound assign operators.

Differential Revision: https://reviews.llvm.org/D137071
2023-01-19 12:24:56 +01:00
Timm Bäder
5b54cf1a28 [clang][Interp] Unify visiting variable declarations
We often visit the same variable multiple times, e.g. once when checking
its initializer and later when compiling the function. Unify both of
those in visitVarDecl() and do the returning of the value in
visitDecl().

Differential Revision: https://reviews.llvm.org/D136815
2023-01-19 10:46:16 +01:00
Timm Bäder
865094746e [clang][Interp] Track initialization state of local variables
Use an InlineDescriptor per local variable to track whether locals
have been initialized or not. This way we can support uninitialized
local variables in constexpr functions.

Differential Revision: https://reviews.llvm.org/D135750
2023-01-18 16:55:02 +01:00
Timm Bäder
78a9ee7834 [clang][Interp][NFC] Remove code duplication in VisitRecordInitializer
We can just use the regular VisitCallExpr logic here, since we have the
pointer to initialize already on the stack.
2023-01-11 13:08:51 +01:00
Timm Bäder
d4f1f35978 [clang][Interp][NFC] Move to std::optional 2022-12-05 17:31:49 +01:00
Timm Bäder
c3380c32f8 [clang][Interp] Handle undefined functions better
Differential Revision: https://reviews.llvm.org/D136936
2022-11-30 10:09:52 +01:00
Timm Bäder
8095b090db [clang][Interp] Array initialization via CXXConstructExpr
Differential Revision: https://reviews.llvm.org/D136920
2022-11-30 10:09:52 +01:00
Timm Bäder
afa60d08a2 [clang][Interp] Fix discarding non-primitive function call return values
Differential Revision: https://reviews.llvm.org/D136457
2022-11-30 09:18:28 +01:00
Timm Bäder
0dcfd0ce02 [clang][Interp] Support alignof()
Support alignof() and __alignof() expressions.

Fixes #58816

Differential Revision: https://reviews.llvm.org/D137240
2022-11-11 08:38:06 +01:00
Timm Bäder
7863646fd2 [clang][Interp] DerivedToBase casts
Differential Revision: https://reviews.llvm.org/D137545
2022-11-11 08:38:06 +01:00
Timm Bäder
f4707af294 [clang][Interp][NFCI] Cleanup emitConst()
Before, when emitting a regular integer constant, we went:

Int -> APInt -> int -> emit

Fix this by using regular integer constants in emitConst() and instead
converting APInt to those once.
2022-11-07 09:05:29 +01:00
Timm Bäder
05a113e188 [clang][Interp][NFC] Handle discarded ArraySubscriptExprs
This is not exactly a common case, so just pop the pointer at the end if
necessary.
2022-11-07 08:37:43 +01:00
Timm Bäder
9a3b969d1f [clang][Interp][NFC] Make InitField() not pop the pointer
This was confusing. InitElem peeks a pointer, while InitElemPop will
pop the pointer. However, for fields, InitField would pop the pointer
and no InitFieldPop exists. At least make InitField and InitElem behave
the same.
2022-11-07 08:30:43 +01:00
Timm Bäder
7c0a2d9cda [clang][Interp][NFC] Use StorePop for assignments with DiscardResult
If we don't need the result anyway, use StorePop, instead of a Store+Pop
combination. That way we save one instruction and not using the result
is the common case anyway.
2022-11-07 07:56:25 +01:00
Timm Bäder
10483ac743 [clang][Interp] Support pointer arithmethic in binary operators
Differential Revision: https://reviews.llvm.org/D135858
2022-11-07 07:47:19 +01:00
Timm Bäder
74fb770de9 [clang][Interp] Implement bitXor opcode
Differential Revision: https://reviews.llvm.org/D136956
2022-10-30 09:23:33 +01:00
Timm Bäder
6d965c94ba [clang][Interp] Implement left and right shifts
Differential Revision: https://reviews.llvm.org/D136532
2022-10-30 08:59:55 +01:00
Timm Bäder
881547db03 [clang][Interp] Implement add and sub compound assign operators
Differential Revision: https://reviews.llvm.org/D136528
2022-10-30 08:11:04 +01:00
Timm Bäder
f79f64b8d0 [clang][Interp] Implement inc and dec operators
Differential Revision: https://reviews.llvm.org/D136423
2022-10-28 17:47:32 +02:00
Timm Bäder
ddec89670d [clang][Interp][NFC] Use right visit() function
visit (lowercase V) sets DiscardValue to false and calls Visit
(uppercase V). So we can't just call Visit (uppercase V) ourselves,
since then we aren't handling DiscardValue correctly.
This is currently irrelevant but will make a difference later.

Also, the naming isn't my fault and might change later.
2022-10-28 17:44:53 +02:00
Timm Bäder
38ffc89c87 [clang][Interp] Fix ignoring expression return values
Randomly noticed this. We need to honor DiscardResult here.

Differential Revision: https://reviews.llvm.org/D136013
2022-10-28 16:45:38 +02:00
Timm Bäder
0ccff030f3 [clang][Interp] Fix record members of reference type
When assigning to them, we can't classify the expression type, because
that doesn't contain the right information.

And when reading from them, we need to do the extra deref, just like we
do when reading from a DeclRefExpr.

Differential Revision: https://reviews.llvm.org/D136012
2022-10-28 16:34:45 +02:00
Timm Bäder
8b87cb4853 [clang][Interp] Remove unused getGlobalIdx()
Remove the only use with the version we already use in
VisitDeclRefExpr().
2022-10-28 16:34:29 +02:00
Timm Bäder
52ba50c24c [clang][Interp] Implement String- and CharacterLiterals
Differential Revision: https://reviews.llvm.org/D135366
2022-10-28 15:05:21 +02:00