122 Commits

Author SHA1 Message Date
Timm Bäder
47ee8519ec [clang][Interp][NFC] Context: Add getFloatSemantics()
We use this quite a bit, so add some convenience API for it.
2023-04-06 10:39:49 +02:00
Timm Bäder
4016e5d949 [clang][Interp][NFC] Call emit*Ptr directly
Instead of the version that uses a switch statement to figure this out.
2023-04-06 10:25:57 +02:00
Timm Bäder
92417f2d4b [clang][Interp] Record initialization via conditional operator
Differential Revision: https://reviews.llvm.org/D141497
2023-04-06 09:44:02 +02:00
Timm Bäder
b15a946b9f [clang][Interp][NFC] Refactor VisitDeclRefExpr
Make it clearer that we only need to check for variables and parameters
if we don't have the easy case. Also only do the IsReference check if
necessary.
2023-04-03 16:42:25 +02:00
Timm Bäder
056042d21b [clang][Interp] Fix initializing fields after base class members
Differential Revision: https://reviews.llvm.org/D145860
2023-04-03 15:55:11 +02:00
Timm Bäder
58cf70b2cd [clang][Interp] Fix diagnostics for calling non-constexpr constructors
Differential Revision: https://reviews.llvm.org/D145841
2023-04-03 15:42:08 +02:00
Timm Bäder
db3dcdc08c [clang][Interp] Fix initializing base class members
For the given test case, we were trying to initialize a member of C,
which doesn't have any. Get the proper base pointer instead and
initialize the members there.

Differential Revision: https://reviews.llvm.org/D143466
2023-04-03 13:51:04 +02:00
Timm Bäder
968b4172f6 [clang][Interp] Fix derived-to-base casts for >1 levels
The GetPtrBasePop op we were using only works for direct base classes.

Differential Revision: https://reviews.llvm.org/D143480
2023-04-03 11:35:55 +02:00
Timm Bäder
8d2899acbc [clang][Interp] Handle TypeTraitExprs
Differential Revision: https://reviews.llvm.org/D142448
2023-03-31 15:54:44 +02:00
Timm Bäder
d29f70670d [clang][Interp] Fix binary comma operators
We left the result of RHS on the stack in case DiscardResult was true.

Differential Revision: https://reviews.llvm.org/D141784
2023-03-31 14:54:51 +02:00
Timm Bäder
cef69ce779 [clang][Interp] Fix record initialization via CallExpr subclasses
We can't just use VisitCallExpr() here, as that doesn't handle CallExpr
subclasses such as CXXMemberCallExpr.

Differential Revision: https://reviews.llvm.org/D141772
2023-03-31 13:16:49 +02:00
Timm Bäder
30f96a8fb4 [clang][Interp] Properly identify not-yet-defined functions
Since we now handle functions without a body as well, we can't just use
getHasBody() anymore. Funtions that haven't been defined yet are those
that don't have a body *and* aren't valid.

Also, just pass the information about whether the Function has a body or
not along from the FunctionDecl.

Differential Revision: https://reviews.llvm.org/D141591
2023-03-31 07:27:04 +02:00
Timm Bäder
3ad167329a [clang][Interp] Implement function pointers
Differential Revision: https://reviews.llvm.org/D141472
2023-03-30 15:37:49 +02:00
Timm Bäder
243b355ee0 [clang][Interp] Support destructors
Emit destructors for non-primitive (array) variables on scope ends.

Differential Revision: https://reviews.llvm.org/D145545
2023-03-30 13:17:04 +02:00
Kazu Hirata
7eaa7b0553 [clang] Use *{Map,Set}::contains (NFC) 2023-03-15 18:06:34 -07:00
Timm Bäder
5e12002c6c Revert "[clang][Interp] Support destructors"
This reverts commit 78e4237460bf58f3d6b75f275e0424f38e3b1d04.

This breaks the memory sanitizer builder:
https://lab.llvm.org/buildbot/#/builders/5/builds/31959
2023-03-05 13:18:13 +01:00
Timm Bäder
78e4237460 [clang][Interp] Support destructors
Use the existing local variable cleanup infrastructure to implement
destruction.

Differential Revision: https://reviews.llvm.org/D137070
2023-03-05 10:02:42 +01:00
Timm Bäder
33ba940de0 [clang][Interp][NFCI] Support more expression in initializers 2023-03-05 09:57:52 +01:00
Timm Bäder
90d921fa1f [clang][Interp] Handle record initialization via CastExpr
Differential Revision: https://reviews.llvm.org/D140808
2023-03-02 10:08:41 +01:00
Timm Bäder
6b5afda61c [clang][Interp] Add ArrayElemPtr{,Pop} opcode
We usually access array elements in the same pattern, which uses
narrow(). Add an extra opcode for this. This saves us quite some
instructions and makes the bytecode easier to read.

Differential Revision: https://reviews.llvm.org/D140805
2023-03-02 09:45:18 +01:00
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