[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 5/5] pkl: Compute attributes at compile-time whenever possibl
From: |
Jose E. Marchesi |
Subject: |
Re: [PATCH 5/5] pkl: Compute attributes at compile-time whenever possible |
Date: |
Sun, 23 Jan 2022 15:28:07 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux) |
Very very nice :)
OK for master.
Thanks!
> 2022-01-22 Mohammad-Reza Nabipoor <mnabipoor@gnu.org>
>
> * libpoke/pkl-trans.c (pkl_trans2_ps_op_attr): New phase for
> computing attributes of complete type at compile-time.
> (struct pkl_phase pkl_phase_trans2): Register new phase.
> * testsuite/poke.map/map-size-2.pk: New test.
> * testsuite/poke.map/map-size-3.pk: Likewise.
> * testsuite/poke.map/maps-structs-pinned-3.pk: Likewise.
> * testsuite/poke.pkl/attr-length-10.pk: Likewise.
> * testsuite/poke.pkl/attr-length-11.pk: Likewise.
> * testsuite/poke.pkl/attr-size-15.pk: Likewise.
> * testsuite/poke.pkl/attr-size-16.pk: Likewise.
> * testsuite/poke.pkl/attr-size-17.pk: Likewise.
> * testsuite/poke.pkl/attr-size-18.pk: Likewise.
> * testsuite/poke.pkl/attr-size-19.pk: Likewise.
> * testsuite/poke.pkl/attr-size-20.pk: Likewise.
> * testsuite/poke.pkl/attr-size-21.pk: Likewise.
> * testsuite/poke.pkl/attr-unit-2.pk: Likewise.
> * testsuite/poke.pkl/attr-unit-3.pk: Likewise.
> * testsuite/Makefile.am (EXTRA_DIST): Update.
> ---
> ChangeLog | 21 ++++++
> libpoke/pkl-trans.c | 77 +++++++++++++++++++++
> testsuite/Makefile.am | 14 ++++
> testsuite/poke.map/map-size-2.pk | 20 ++++++
> testsuite/poke.map/map-size-3.pk | 24 +++++++
> testsuite/poke.map/maps-structs-pinned-3.pk | 10 +++
> testsuite/poke.pkl/attr-length-10.pk | 6 ++
> testsuite/poke.pkl/attr-length-11.pk | 6 ++
> testsuite/poke.pkl/attr-size-15.pk | 7 ++
> testsuite/poke.pkl/attr-size-16.pk | 7 ++
> testsuite/poke.pkl/attr-size-17.pk | 6 ++
> testsuite/poke.pkl/attr-size-18.pk | 7 ++
> testsuite/poke.pkl/attr-size-19.pk | 6 ++
> testsuite/poke.pkl/attr-size-20.pk | 8 +++
> testsuite/poke.pkl/attr-size-21.pk | 8 +++
> testsuite/poke.pkl/attr-unit-2.pk | 6 ++
> testsuite/poke.pkl/attr-unit-3.pk | 7 ++
> 17 files changed, 240 insertions(+)
> create mode 100644 testsuite/poke.map/map-size-2.pk
> create mode 100644 testsuite/poke.map/map-size-3.pk
> create mode 100644 testsuite/poke.map/maps-structs-pinned-3.pk
> create mode 100644 testsuite/poke.pkl/attr-length-10.pk
> create mode 100644 testsuite/poke.pkl/attr-length-11.pk
> create mode 100644 testsuite/poke.pkl/attr-size-15.pk
> create mode 100644 testsuite/poke.pkl/attr-size-16.pk
> create mode 100644 testsuite/poke.pkl/attr-size-17.pk
> create mode 100644 testsuite/poke.pkl/attr-size-18.pk
> create mode 100644 testsuite/poke.pkl/attr-size-19.pk
> create mode 100644 testsuite/poke.pkl/attr-size-20.pk
> create mode 100644 testsuite/poke.pkl/attr-size-21.pk
> create mode 100644 testsuite/poke.pkl/attr-unit-2.pk
> create mode 100644 testsuite/poke.pkl/attr-unit-3.pk
>
> diff --git a/ChangeLog b/ChangeLog
> index 82061c3f..218b299d 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,3 +1,24 @@
> +2022-01-22 Mohammad-Reza Nabipoor <mnabipoor@gnu.org>
> +
> + * libpoke/pkl-trans.c (pkl_trans2_ps_op_attr): New phase for
> + computing attributes of complete type at compile-time.
> + (struct pkl_phase pkl_phase_trans2): Register new phase.
> + * testsuite/poke.map/map-size-2.pk: New test.
> + * testsuite/poke.map/map-size-3.pk: Likewise.
> + * testsuite/poke.map/maps-structs-pinned-3.pk: Likewise.
> + * testsuite/poke.pkl/attr-length-10.pk: Likewise.
> + * testsuite/poke.pkl/attr-length-11.pk: Likewise.
> + * testsuite/poke.pkl/attr-size-15.pk: Likewise.
> + * testsuite/poke.pkl/attr-size-16.pk: Likewise.
> + * testsuite/poke.pkl/attr-size-17.pk: Likewise.
> + * testsuite/poke.pkl/attr-size-18.pk: Likewise.
> + * testsuite/poke.pkl/attr-size-19.pk: Likewise.
> + * testsuite/poke.pkl/attr-size-20.pk: Likewise.
> + * testsuite/poke.pkl/attr-size-21.pk: Likewise.
> + * testsuite/poke.pkl/attr-unit-2.pk: Likewise.
> + * testsuite/poke.pkl/attr-unit-3.pk: Likewise.
> + * testsuite/Makefile.am (EXTRA_DIST): Update.
> +
> 2022-01-22 Mohammad-Reza Nabipoor <mnabipoor@gnu.org>
>
> * libpoke/pkl-fold.c (OP_BINARY_AAA_add): New macro for constant
> diff --git a/libpoke/pkl-trans.c b/libpoke/pkl-trans.c
> index f235a0af..0bf70e53 100644
> --- a/libpoke/pkl-trans.c
> +++ b/libpoke/pkl-trans.c
> @@ -1435,6 +1435,82 @@ PKL_PHASE_BEGIN_HANDLER
> (pkl_trans2_ps_struct_type_field)
> }
> PKL_PHASE_END_HANDLER
>
> +/* Compute the attributes of values with complete types. */
> +
> +PKL_PHASE_BEGIN_HANDLER (pkl_trans2_ps_op_attr)
> +{
> + pkl_ast_node exp = PKL_PASS_NODE;
> + pkl_ast_node exp_type = PKL_AST_TYPE (exp);
> + pkl_ast_node operand = PKL_AST_EXP_OPERAND (exp, 0);
> + pkl_ast_node operand_type = PKL_AST_TYPE (operand);
> +
> + switch (PKL_AST_EXP_ATTR (exp))
> + {
> + case PKL_AST_ATTR_LENGTH:
> + {
> + size_t length = 0;
> + pkl_ast_node len;
> +
> + if (PKL_AST_LITERAL_P (operand))
> + switch (PKL_AST_CODE (operand))
> + {
> + case PKL_AST_STRING:
> + length = PKL_AST_STRING_LENGTH (operand);
> + break;
> + case PKL_AST_ARRAY:
> + length = PKL_AST_ARRAY_NELEM (operand);
> + break;
> + default:
> + assert (0);
> + }
> + else if (PKL_AST_TYPE_CODE (operand_type) == PKL_TYPE_STRUCT
> + && (PKL_AST_TYPE_COMPLETE (operand_type)
> + == PKL_AST_TYPE_COMPLETE_YES))
> + length = PKL_AST_TYPE_S_NELEM (operand_type);
> + else
> + PKL_PASS_DONE;
> +
> + /* The type of 'length is uint<64> */
> +
> + len = pkl_ast_make_integer (PKL_PASS_AST, length);
> + PKL_AST_TYPE (len) = ASTREF (exp_type);
> + PKL_PASS_NODE = ASTREF (len);
> + pkl_ast_node_free (exp);
> + PKL_PASS_RESTART = 1;
> + PKL_PASS_DONE;
> + }
> + case PKL_AST_ATTR_SIZE:
> + {
> + pkl_ast_node size, off;
> +
> + if (PKL_AST_LITERAL_P (operand)
> + && PKL_AST_CODE (operand) == PKL_AST_STRING)
> + {
> + size = pkl_ast_make_integer (PKL_PASS_AST,
> + (PKL_AST_STRING_LENGTH (operand) +
> 1)
> + * 8);
> + PKL_AST_TYPE (size) = PKL_AST_TYPE_O_BASE_TYPE (exp_type);
> + }
> + else if (PKL_AST_TYPE_COMPLETE (operand_type)
> + == PKL_AST_TYPE_COMPLETE_YES)
> + size = pkl_ast_sizeof_type (PKL_PASS_AST, operand_type);
> + else
> + PKL_PASS_DONE;
> +
> + off = pkl_ast_make_offset (PKL_PASS_AST, size,
> + PKL_AST_TYPE_O_UNIT (exp_type));
> + PKL_AST_TYPE (off) = ASTREF (exp_type);
> + PKL_PASS_NODE = ASTREF (off);
> + pkl_ast_node_free (exp);
> + PKL_PASS_RESTART = 1;
> + PKL_PASS_DONE;
> + }
> + default:
> + break;
> + }
> +}
> +PKL_PHASE_END_HANDLER
> +
> struct pkl_phase pkl_phase_trans2 =
> {
> PKL_PHASE_PS_HANDLER (PKL_AST_SRC, pkl_trans_ps_src),
> @@ -1450,6 +1526,7 @@ struct pkl_phase pkl_phase_trans2 =
> PKL_PHASE_PS_HANDLER (PKL_AST_INCRDECR, pkl_trans2_ps_incrdecr),
> PKL_PHASE_PS_TYPE_HANDLER (PKL_TYPE_OFFSET, pkl_trans2_ps_type_offset),
> PKL_PHASE_PS_HANDLER (PKL_AST_STRUCT_TYPE_FIELD,
> pkl_trans2_ps_struct_type_field),
> + PKL_PHASE_PS_OP_HANDLER (PKL_AST_OP_ATTR, pkl_trans2_ps_op_attr),
> };
>
>
> diff --git a/testsuite/Makefile.am b/testsuite/Makefile.am
> index 4fa4cbb3..b1c41d10 100644
> --- a/testsuite/Makefile.am
> +++ b/testsuite/Makefile.am
> @@ -160,6 +160,8 @@ EXTRA_DIST = \
> poke.map/map-optcond-int-struct-1.pk \
> poke.map/map-optcond-int-struct-2.pk \
> poke.map/map-size-1.pk \
> + poke.map/map-size-2.pk \
> + poke.map/map-size-3.pk \
> poke.map/map-struct-fun-1.pk \
> poke.map/map-struct-fun-2.pk \
> poke.map/map-struct-fun-3.pk \
> @@ -356,6 +358,7 @@ EXTRA_DIST = \
> poke.map/maps-structs-methods-11.pk \
> poke.map/maps-structs-pinned-1.pk \
> poke.map/maps-structs-pinned-2.pk \
> + poke.map/maps-structs-pinned-3.pk \
> poke.map/maps-int-struct-constraint-1.pk \
> poke.map/maps-int-struct-constraint-2.pk \
> poke.map/maps-trims-1.pk \
> @@ -771,6 +774,8 @@ EXTRA_DIST = \
> poke.pkl/attr-length-7.pk \
> poke.pkl/attr-length-8.pk \
> poke.pkl/attr-length-9.pk \
> + poke.pkl/attr-length-10.pk \
> + poke.pkl/attr-length-11.pk \
> poke.pkl/attr-magnitude-1.pk \
> poke.pkl/attr-mapped-1.pk \
> poke.pkl/attr-mapped-2.pk \
> @@ -798,7 +803,16 @@ EXTRA_DIST = \
> poke.pkl/attr-size-12.pk \
> poke.pkl/attr-size-13.pk \
> poke.pkl/attr-size-14.pk \
> + poke.pkl/attr-size-15.pk \
> + poke.pkl/attr-size-16.pk \
> + poke.pkl/attr-size-17.pk \
> + poke.pkl/attr-size-18.pk \
> + poke.pkl/attr-size-19.pk \
> + poke.pkl/attr-size-20.pk \
> + poke.pkl/attr-size-21.pk \
> poke.pkl/attr-unit-1.pk \
> + poke.pkl/attr-unit-2.pk \
> + poke.pkl/attr-unit-3.pk \
> poke.pkl/band-diag-1.pk \
> poke.pkl/band-diag-2.pk \
> poke.pkl/band-integers-1.pk \
> diff --git a/testsuite/poke.map/map-size-2.pk
> b/testsuite/poke.map/map-size-2.pk
> new file mode 100644
> index 00000000..4e5ea6c4
> --- /dev/null
> +++ b/testsuite/poke.map/map-size-2.pk
> @@ -0,0 +1,20 @@
> +/* { dg-do run } */
> +/* { dg-data {c*} {0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0
> 0xc0} } */
> +
> +/* { dg-command {.set obase 16} } */
> +
> +type Foo = struct { byte i; byte j @ 3#B; byte k @ 2#B; };
> +
> +/* { dg-command { var f = Foo @ 1#B } } */
> +/* { dg-command { f } } */
> +/* { dg-output "Foo \\{i=0x20UB,j=0x50UB,k=0x40UB\\}" } */
> +/* { dg-command { f'size } } */
> +/* { dg-output "\n0x20UL#b" } */
> +
> +type Bar = struct { byte i; byte j; byte k @ 1#B; };
> +
> +/* { dg-command { var b = Bar @ 1#B } } */
> +/* { dg-command { b } } */
> +/* { dg-output "\nBar \\{i=0x20UB,j=0x30UB,k=0x30UB\\}" } */
> +/* { dg-command { b'size } } */
> +/* { dg-output "\n0x10UL#b" } */
> diff --git a/testsuite/poke.map/map-size-3.pk
> b/testsuite/poke.map/map-size-3.pk
> new file mode 100644
> index 00000000..e3b2440a
> --- /dev/null
> +++ b/testsuite/poke.map/map-size-3.pk
> @@ -0,0 +1,24 @@
> +/* { dg-do run } */
> +/* { dg-data {c*} {0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0
> 0xc0} } */
> +
> +/* { dg-command {.set obase 16} } */
> +
> +/* FOO and BAR are no longer known at compile-time. */
> +
> +var n = 1;
> +type Foo = struct { byte[n] i; byte j @ 3#B; byte k @ 2#B; };
> +
> +/* { dg-command { var f = Foo @ 1#B } } */
> +/* { dg-command { f } } */
> +/* { dg-output "Foo \\{i=\\\[0x20UB\\\],j=0x50UB,k=0x40UB\\}" } */
> +/* { dg-command { f'size } } */
> +/* { dg-output "\n0x20UL#b" } */
> +
> +var n = 1;
> +type Bar = struct { byte[n] i; byte j; byte k @ 1#B; };
> +
> +/* { dg-command { var b = Bar @ 1#B } } */
> +/* { dg-command { b } } */
> +/* { dg-output "\nBar \\{i=\\\[0x20UB\\\],j=0x30UB,k=0x30UB\\}" } */
> +/* { dg-command { b'size } } */
> +/* { dg-output "\n0x10UL#b" } */
> diff --git a/testsuite/poke.map/maps-structs-pinned-3.pk
> b/testsuite/poke.map/maps-structs-pinned-3.pk
> new file mode 100644
> index 00000000..946cd747
> --- /dev/null
> +++ b/testsuite/poke.map/maps-structs-pinned-3.pk
> @@ -0,0 +1,10 @@
> +/* { dg-do run } */
> +/* { dg-data {c*} {0x10 0x20 0x30 0x40 0x60 0x50 0x70 0x80 0x90 0xa0 0xb0
> 0xc0} } */
> +
> +/* Size of Foo is not known at compile-time. */
> +var n = 1;
> +type Foo = pinned struct { int[n] i; long j; };
> +
> +/* { dg-command { var f = Foo @ 1#B } } */
> +/* { dg-command { f'size } } */
> +/* { dg-output "64UL#b" } */
> diff --git a/testsuite/poke.pkl/attr-length-10.pk
> b/testsuite/poke.pkl/attr-length-10.pk
> new file mode 100644
> index 00000000..02ffcc6a
> --- /dev/null
> +++ b/testsuite/poke.pkl/attr-length-10.pk
> @@ -0,0 +1,6 @@
> +/* { dg-do run } */
> +
> +var s = "foo";
> +
> +/* { dg-command { s'length } } */
> +/* { dg-output "3UL" } */
> diff --git a/testsuite/poke.pkl/attr-length-11.pk
> b/testsuite/poke.pkl/attr-length-11.pk
> new file mode 100644
> index 00000000..d2b4f2ea
> --- /dev/null
> +++ b/testsuite/poke.pkl/attr-length-11.pk
> @@ -0,0 +1,6 @@
> +/* { dg-do run } */
> +
> +var a = [1,2,3];
> +
> +/* { dg-command { a'length } } */
> +/* { dg-output "3UL" } */
> diff --git a/testsuite/poke.pkl/attr-size-15.pk
> b/testsuite/poke.pkl/attr-size-15.pk
> new file mode 100644
> index 00000000..f378fc04
> --- /dev/null
> +++ b/testsuite/poke.pkl/attr-size-15.pk
> @@ -0,0 +1,7 @@
> +/* { dg-do run } */
> +
> +var a = 1 as int<3>;
> +var b = [a] as int<3>[]; /* Incomplete type. */
> +
> +/* { dg-command { b'size } } */
> +/* { dg-output "3UL#b" } */
> diff --git a/testsuite/poke.pkl/attr-size-16.pk
> b/testsuite/poke.pkl/attr-size-16.pk
> new file mode 100644
> index 00000000..22e3c02d
> --- /dev/null
> +++ b/testsuite/poke.pkl/attr-size-16.pk
> @@ -0,0 +1,7 @@
> +/* { dg-do run } */
> +
> +var a = 1 as uint<33>;
> +var b = [a] as uint<33>[];
> +
> +/* { dg-command { b'size } } */
> +/* { dg-output "33UL#b" } */
> diff --git a/testsuite/poke.pkl/attr-size-17.pk
> b/testsuite/poke.pkl/attr-size-17.pk
> new file mode 100644
> index 00000000..ae5d9f3b
> --- /dev/null
> +++ b/testsuite/poke.pkl/attr-size-17.pk
> @@ -0,0 +1,6 @@
> +/* { dg-do run } */
> +
> +var a = [1] as int[]; /* Incomplete type. */
> +
> +/* { dg-command { a'size } } */
> +/* { dg-output "32UL#b" } */
> diff --git a/testsuite/poke.pkl/attr-size-18.pk
> b/testsuite/poke.pkl/attr-size-18.pk
> new file mode 100644
> index 00000000..96a309b2
> --- /dev/null
> +++ b/testsuite/poke.pkl/attr-size-18.pk
> @@ -0,0 +1,7 @@
> +/* { dg-do run } */
> +
> +var a = [1,2,3];
> +var b = a as int[];
> +
> +/* { dg-command { b'size } } */
> +/* { dg-output "96UL#b" } */
> diff --git a/testsuite/poke.pkl/attr-size-19.pk
> b/testsuite/poke.pkl/attr-size-19.pk
> new file mode 100644
> index 00000000..c6dc83ec
> --- /dev/null
> +++ b/testsuite/poke.pkl/attr-size-19.pk
> @@ -0,0 +1,6 @@
> +/* { dg-do run } */
> +
> +var a = [1UL] as uint<64>[];
> +
> +/* { dg-command { a'size } } */
> +/* { dg-output "64UL#b" } */
> diff --git a/testsuite/poke.pkl/attr-size-20.pk
> b/testsuite/poke.pkl/attr-size-20.pk
> new file mode 100644
> index 00000000..85551a71
> --- /dev/null
> +++ b/testsuite/poke.pkl/attr-size-20.pk
> @@ -0,0 +1,8 @@
> +/* { dg-do run } */
> +
> +type Struct = struct { };
> +var s = Struct {};
> +var x = [s] as Struct[]; /* Incomplete type. */
> +
> +/* { dg-command { x'size } } */
> +/* { dg-output "0UL#b" } */
> diff --git a/testsuite/poke.pkl/attr-size-21.pk
> b/testsuite/poke.pkl/attr-size-21.pk
> new file mode 100644
> index 00000000..d34cbedf
> --- /dev/null
> +++ b/testsuite/poke.pkl/attr-size-21.pk
> @@ -0,0 +1,8 @@
> +/* { dg-do run } */
> +
> +type Struct = struct { int i; long l; string s; };
> +var s = Struct {i=1, l=2UL, s="foo"};
> +var x = [s] as Struct[]; /* Incomplete type. */
> +
> +/* { dg-command { x'size } } */
> +/* { dg-output "128UL#b" } */
> diff --git a/testsuite/poke.pkl/attr-unit-2.pk
> b/testsuite/poke.pkl/attr-unit-2.pk
> new file mode 100644
> index 00000000..81af4049
> --- /dev/null
> +++ b/testsuite/poke.pkl/attr-unit-2.pk
> @@ -0,0 +1,6 @@
> +/* { dg-do run } */
> +
> +var a = 10;
> +
> +/* { dg-command { a'size'unit } } */
> +/* { dg-output "1UL" } */
> diff --git a/testsuite/poke.pkl/attr-unit-3.pk
> b/testsuite/poke.pkl/attr-unit-3.pk
> new file mode 100644
> index 00000000..73d48832
> --- /dev/null
> +++ b/testsuite/poke.pkl/attr-unit-3.pk
> @@ -0,0 +1,7 @@
> +/* { dg-do run } */
> +
> +var a = [10];
> +var b = a as int[]; /* Type of `b' is no longer complete. */
> +
> +/* { dg-command { b'size'unit } } */
> +/* { dg-output "1UL" } */
- Re: [PATCH 2/5] pkl: Mark offset as literal if its components are literals, (continued)
[PATCH 4/5] pkl: Add folding for array add operation, Mohammad-Reza Nabipoor, 2022/01/22
[PATCH 5/5] pkl: Compute attributes at compile-time whenever possible, Mohammad-Reza Nabipoor, 2022/01/22
- Re: [PATCH 5/5] pkl: Compute attributes at compile-time whenever possible,
Jose E. Marchesi <=
Re: [PATCH 1/5] pkl: Postpone decision of completeness of a struct literals, Jose E. Marchesi, 2022/01/23