[PATCH v5 09/20] Serialization and dumping tests of Object Attributes v2
Richard Earnshaw (lists)
Richard.Earnshaw@arm.com
Wed Jul 9 14:06:24 GMT 2025
On 07/07/2025 17:49, Matthieu Longo wrote:
> From: Richard Ball <richard.ball@arm.com>
>
> The added tests cover the parsing of the new assembly directives
> (aeabi_subsection and aeabi_attribute), the serialization of the
> Object Attributes v2 (OAv2) data into an object file, and the
> dumping of those data via readelf.
>
> The parsing tests focus on the following points:
> - the syntax of the new directives.
> - the recognition of generic tokens like: NTBS, ULEB128, required,
> optional.
> - the recognition of backend-specific tokens like Tag_Feature_(BTI,
> PAC,GCS).
>
> The dumping tests focus on:
> - the OAv2 population into the correct section assigned by the backend
> (i.e. .ARM.attributes for AArch64).
> - the merge of the subsections and attributes when they are declared
> several times inside respectively the same compilation unit, and
> subsection.
> - the sorting of OAv2 before the serialization.
OK.
R.
>
> Co-Authored-By: Matthieu Longo <matthieu.longo@arm.com>
> ---
> .../aarch64-build-attributes.exp | 23 ++++++
> .../gas/aarch64/build-attributes/ba-1.d | 52 +++++++++++++
> .../gas/aarch64/build-attributes/ba-1.s | 31 ++++++++
> .../aarch64/build-attributes/ba-failures-1.d | 29 +++++++
> .../aarch64/build-attributes/ba-failures-1.s | 55 ++++++++++++++
> .../ba-interleaved-subsections.d | 35 +++++++++
> .../ba-interleaved-subsections.s | 32 ++++++++
> .../build-attributes/ba-subsection-parsing.d | 75 +++++++++++++++++++
> .../build-attributes/ba-subsection-parsing.s | 21 ++++++
> 9 files changed, 353 insertions(+)
> create mode 100644 gas/testsuite/gas/aarch64/build-attributes/aarch64-build-attributes.exp
> create mode 100644 gas/testsuite/gas/aarch64/build-attributes/ba-1.d
> create mode 100644 gas/testsuite/gas/aarch64/build-attributes/ba-1.s
> create mode 100644 gas/testsuite/gas/aarch64/build-attributes/ba-failures-1.d
> create mode 100644 gas/testsuite/gas/aarch64/build-attributes/ba-failures-1.s
> create mode 100644 gas/testsuite/gas/aarch64/build-attributes/ba-interleaved-subsections.d
> create mode 100644 gas/testsuite/gas/aarch64/build-attributes/ba-interleaved-subsections.s
> create mode 100644 gas/testsuite/gas/aarch64/build-attributes/ba-subsection-parsing.d
> create mode 100644 gas/testsuite/gas/aarch64/build-attributes/ba-subsection-parsing.s
>
> diff --git a/gas/testsuite/gas/aarch64/build-attributes/aarch64-build-attributes.exp b/gas/testsuite/gas/aarch64/build-attributes/aarch64-build-attributes.exp
> new file mode 100644
> index 00000000000..76b1818a2ab
> --- /dev/null
> +++ b/gas/testsuite/gas/aarch64/build-attributes/aarch64-build-attributes.exp
> @@ -0,0 +1,23 @@
> +# Copyright (C) 2025 Free Software Foundation, Inc.
> +
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 3 of the License, or
> +# (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program; if not, write to the Free Software
> +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
> +
> +#
> +# AArch64 tests for the build attributes
> +#
> +
> +if {[istarget aarch64*-*-*] && [is_elf_format]} {
> + run_dump_tests [lsort [glob -nocomplain $srcdir/$subdir/*.d]]
> +}
> diff --git a/gas/testsuite/gas/aarch64/build-attributes/ba-1.d b/gas/testsuite/gas/aarch64/build-attributes/ba-1.d
> new file mode 100644
> index 00000000000..e5ea8b48a2a
> --- /dev/null
> +++ b/gas/testsuite/gas/aarch64/build-attributes/ba-1.d
> @@ -0,0 +1,52 @@
> +# name: EABI build attributes: several subsections into .ARM.attributes
> +# source: ba-1.s
> +# as:
> +# readelf: -A
> +
> +Subsections:
> + - Name: aeabi_feature_and_bits
> + Scope: public
> + Length: 35
> + Comprehension: optional
> + Encoding: ULEB128
> + Values:
> + Tag_Feature_BTI: 1 \(0x1\)
> + Tag_Feature_PAC: 1 \(0x1\)
> + Tag_Feature_GCS: 1 \(0x1\)
> +
> + - Name: aeabi_foo_1
> + Scope: public
> + Length: 22
> + Comprehension: optional
> + Encoding: ULEB128
> + Values:
> + Tag_unknown_2: 65 \(0x41\)
> + Tag_unknown_3: 1 \(0x1\)
> +
> + - Name: aeabi_foo_2
> + Scope: public
> + Length: 27
> + Comprehension: required
> + Encoding: NTBS
> + Values:
> + Tag_unknown_2: "TEST2"
> + Tag_unknown_4: ""
> +
> + - Name: aeabi_foo_3
> + Scope: public
> + Length: 24
> + Comprehension: required
> + Encoding: NTBS
> + Values:
> + Tag_unknown_4: "TEST"
> +
> + - Name: foo_1
> + Scope: private
> + Length: 20
> + Comprehension: optional
> + Encoding: ULEB128
> + Values:
> + Tag_unknown_0: 1 \(0x1\)
> + Tag_unknown_1: 1 \(0x1\)
> + Tag_unknown_2: 1 \(0x1\)
> + Tag_unknown_3: 1 \(0x1\)
> diff --git a/gas/testsuite/gas/aarch64/build-attributes/ba-1.s b/gas/testsuite/gas/aarch64/build-attributes/ba-1.s
> new file mode 100644
> index 00000000000..e586bd5cd1a
> --- /dev/null
> +++ b/gas/testsuite/gas/aarch64/build-attributes/ba-1.s
> @@ -0,0 +1,31 @@
> +.set ATTR_TYPE_uleb128, 0
> +.set ATTR_TYPE_asciz, 1
> +
> +.set SUBSEC_required, 0
> +.set SUBSEC_optional, 1
> +
> +.aeabi_subsection foo_1, 1, ATTR_TYPE_uleb128
> +
> +.set Tag_Feature_foo, 2
> +.set Tag_Feature_bar, 3
> +
> +.aeabi_attribute Tag_Feature_bar, 1
> +.aeabi_attribute 0, 1
> +.aeabi_attribute 1, 1
> +.aeabi_attribute Tag_Feature_foo, 1
> +
> +.aeabi_subsection aeabi_foo_1, 1, ATTR_TYPE_uleb128
> +.aeabi_attribute Tag_Feature_bar, 1
> +.aeabi_attribute Tag_Feature_foo, 'A'
> +
> +.aeabi_subsection aeabi_foo_2, 0, ATTR_TYPE_asciz
> +.aeabi_attribute 4, ""
> +.aeabi_attribute 2, "TEST2"
> +
> +.aeabi_subsection aeabi_foo_3, required, ntbs
> +.aeabi_attribute 4, "TEST"
> +
> +.aeabi_subsection aeabi_feature_and_bits, optional, ULEB128
> +.aeabi_attribute Tag_Feature_BTI, 1
> +.aeabi_attribute Tag_Feature_GCS, 1
> +.aeabi_attribute Tag_Feature_PAC, 1
> diff --git a/gas/testsuite/gas/aarch64/build-attributes/ba-failures-1.d b/gas/testsuite/gas/aarch64/build-attributes/ba-failures-1.d
> new file mode 100644
> index 00000000000..705dcd25c47
> --- /dev/null
> +++ b/gas/testsuite/gas/aarch64/build-attributes/ba-failures-1.d
> @@ -0,0 +1,29 @@
> +# name: EABI build attributes: error cases
> +# source: ba-failures-1.s
> +# as:
> +#error: \A[^\n]*\.s: Assembler messages:\n
> +#error: [^\n]*\.s:[0-9]+: Error: declaration of an attribute outside the scope of an attribute subsection\n
> +#error: [^\n]*\.s:[0-9]+: Error: attribute 1 cannot be redefined\n
> +#error: [^\n]*\.s:[0-9]+: Error: invalid negative value -1, expected an unsigned integer\n
> +#error: [^\n]*\.s:[0-9]+: Error: could not parse attribute tag\n
> +#error: [^\n]*\.s:[0-9]+: Error: unknown identifier 'Tag_Unknown'\n
> +#error: [^\n]*\.s:[0-9]+: Error: could not parse attribute tag\n
> +#error: [^\n]*\.s:[0-9]+: Error: invalid negative value -1, expected an unsigned integer\n
> +#error: [^\n]*\.s:[0-9]+: Error: could not parse attribute value\n
> +#error: [^\n]*\.s:[0-9]+: Error: missing '"', expected a string literal\n
> +#error: [^\n]*\.s:[0-9]+: Error: could not parse attribute value\n
> +#error: [^\n]*\.s:[0-9]+: Error: attribute 4 cannot be redefined\n
> +#error: [^\n]*\.s:[0-9]+: Error: recalled subsections must have the same parameters\n
> +#error: [^\n]*\.s:[0-9]+: Error: recalled subsections must have the same parameters\n
> +#error: [^\n]*\.s:[0-9]+: Error: recalled subsections must have the same parameters\n
> +#error: [^\n]*\.s:[0-9]+: Error: invalid value '.', expected an identifier\n
> +#error: [^\n]*\.s:[0-9]+: Error: expected <subsection_name>, <optional>, <encoding>\n
> +#error: [^\n]*\.s:[0-9]+: Error: unknown identifier 'uleb128'\n
> +#error: [^\n]*\.s:[0-9]+: Error: unknown identifier 'optial'\n
> +#error: [^\n]*\.s:[0-9]+: Error: unknown identifier 'ul128'\n
> +#error: [^\n]*\.s:[0-9]+: Error: invalid value 2, expected values for <optional> are 0 \(=required\) or 1 \(=optional\)\n
> +#error: [^\n]*\.s:[0-9]+: Error: invalid value 2, expected values for <encoding> are 0 \(=ULEB128\) or 1 \(=NTBS\)\n
> +#error: [^\n]*\.s:[0-9]+: Error: unexpected comma before parameter 2\n
> +#error: [^\n]*\.s:[0-9]+: Error: junk at end of line, first unrecognized character is `,'\n
> +#error: [^\n]*\.s:[0-9]+: Error: unexpected comma before parameter 1\n
> +#error: [^\n]*\.s:[0-9]+: Error: missing comma after parameter 2
> diff --git a/gas/testsuite/gas/aarch64/build-attributes/ba-failures-1.s b/gas/testsuite/gas/aarch64/build-attributes/ba-failures-1.s
> new file mode 100644
> index 00000000000..1764e0b4284
> --- /dev/null
> +++ b/gas/testsuite/gas/aarch64/build-attributes/ba-failures-1.s
> @@ -0,0 +1,55 @@
> +.set ATTR_TYPE_uleb128, 0
> +.set ATTR_TYPE_asciz, 1
> +
> +/* The definition of an attribute cannot appear before a subsection was
> + declared. */
> +.aeabi_attribute 1, 0
> +
> +/* aeabi_attribute with the same key should have the same value in the same
> + compilation unit. */
> +.aeabi_subsection vendor_1_subsection_1, optional, uleb128
> +.aeabi_attribute 1, 0
> +.aeabi_attribute 1, 1
> +
> +/* Only unsigned integer are allowed for attribute keys. */
> +.aeabi_attribute -1, 1
> +/* Unknown tag identifier. */
> +.aeabi_attribute Tag_Unknown, "plop"
> +
> +/* Mismatch between the type expected from the subsection definition, and the
> + type provided to the attribute directive. */
> +.aeabi_attribute 2, -1
> +.aeabi_attribute 3, "foo"
> +.aeabi_subsection vendor_1_subsection_2, optional, ntbs
> +/* Mismatch between type of the value and the one expected by the subsection. */
> +.aeabi_attribute 1, 1
> +/* aeabi_attribute with the same key should have the same value in the same
> + compilation unit. */
> +.aeabi_attribute 4, "ABC"
> +.aeabi_attribute 4, "DEF"
> +
> +/* Subsections with the same name should have the same parameters. */
> +.aeabi_subsection vendor_1_subsection_3, required, ntbs
> +.aeabi_subsection vendor_1_subsection_3, optional, ntbs
> +.aeabi_subsection vendor_1_subsection_3, required, uleb128
> +.aeabi_subsection vendor_1_subsection_3, optional, uleb128
> +
> +/* Invalid subsection name should raise an error. */
> +.aeabi_subsection .vendor, optional, uleb128
> +
> +/* Swap <optional> and <encoding>. */
> +.aeabi_subsection vendor_1_subsection_4, uleb128, optional
> +
> +/* Unknown identifier for <optional>, and <encoding>. */
> +.aeabi_subsection vendor_1_subsection_4, optial, uleb128
> +.aeabi_subsection vendor_1_subsection_4, optional, ul128
> +
> +/* Invalid value for optional and format. */
> +.aeabi_subsection vendor_1_subsection_4, 2, 1
> +.aeabi_subsection vendor_1_subsection_4, 1, 2
> +
> +/* Wrong comma. */
> +.aeabi_subsection vendor_1_subsection_4, , 1
> +.aeabi_subsection vendor_1_subsection_4, 1, 1, 1
> +.aeabi_subsection , vendor_1_subsection_4, 1
> +.aeabi_subsection vendor_1_subsection_4, 1 1
> diff --git a/gas/testsuite/gas/aarch64/build-attributes/ba-interleaved-subsections.d b/gas/testsuite/gas/aarch64/build-attributes/ba-interleaved-subsections.d
> new file mode 100644
> index 00000000000..6aa028c55de
> --- /dev/null
> +++ b/gas/testsuite/gas/aarch64/build-attributes/ba-interleaved-subsections.d
> @@ -0,0 +1,35 @@
> +# name: EABI build attributes: correct context switching between interleaved subsections
> +# source: ba-interleaved-subsections.s
> +# as:
> +# readelf: -A
> +
> +Subsections:
> + - Name: aeabi_feature_and_bits
> + Scope: public
> + Length: 35
> + Comprehension: optional
> + Encoding: ULEB128
> + Values:
> + Tag_Feature_BTI: 1 \(0x1\)
> + Tag_Feature_PAC: 0 \(0x0\)
> + Tag_Feature_GCS: 1 \(0x1\)
> +
> + - Name: aeabi_pauthabi
> + Scope: public
> + Length: 25
> + Comprehension: required
> + Encoding: ULEB128
> + Values:
> + Tag_PAuth_Platform: 1 \(0x1\)
> + Tag_PAuth_Schema: 1 \(0x1\)
> +
> + - Name: foo_1
> + Scope: private
> + Length: 20
> + Comprehension: optional
> + Encoding: ULEB128
> + Values:
> + Tag_unknown_1: 1 \(0x1\)
> + Tag_unknown_2: 0 \(0x0\)
> + Tag_unknown_3: 0 \(0x0\)
> + Tag_unknown_4: 0 \(0x0\)
> diff --git a/gas/testsuite/gas/aarch64/build-attributes/ba-interleaved-subsections.s b/gas/testsuite/gas/aarch64/build-attributes/ba-interleaved-subsections.s
> new file mode 100644
> index 00000000000..bb884bb1368
> --- /dev/null
> +++ b/gas/testsuite/gas/aarch64/build-attributes/ba-interleaved-subsections.s
> @@ -0,0 +1,32 @@
> +.aeabi_subsection aeabi_pauthabi, required, uleb128
> +
> +.aeabi_subsection aeabi_feature_and_bits, optional, uleb128
> +.aeabi_attribute Tag_Feature_BTI, 1
> +
> +.aeabi_subsection aeabi_feature_and_bits, optional, uleb128
> +
> +.aeabi_subsection foo_1, optional, uleb128
> +.aeabi_attribute 1, 1
> +
> +.aeabi_subsection aeabi_pauthabi, required, uleb128
> +.aeabi_attribute Tag_PAuth_Schema, 1
> +
> +.aeabi_subsection aeabi_feature_and_bits, optional, uleb128
> +.aeabi_attribute Tag_Feature_GCS, 1
> +
> +.aeabi_subsection foo_1, optional, uleb128
> +.aeabi_attribute 2, 0
> +
> +.aeabi_subsection aeabi_pauthabi, required, uleb128
> +.aeabi_attribute Tag_PAuth_Platform, 1
> +
> +.aeabi_subsection aeabi_pauthabi, required, uleb128
> +.aeabi_subsection aeabi_feature_and_bits, optional, uleb128
> +.aeabi_attribute Tag_Feature_PAC, 0
> +
> +.aeabi_subsection foo_1, optional, uleb128
> +.aeabi_attribute 3, 0
> +.aeabi_attribute 4, 0
> +
> +.aeabi_subsection aeabi_feature_and_bits, optional, uleb128
> +.aeabi_attribute Tag_Feature_PAC, 0
> diff --git a/gas/testsuite/gas/aarch64/build-attributes/ba-subsection-parsing.d b/gas/testsuite/gas/aarch64/build-attributes/ba-subsection-parsing.d
> new file mode 100644
> index 00000000000..86b44562c96
> --- /dev/null
> +++ b/gas/testsuite/gas/aarch64/build-attributes/ba-subsection-parsing.d
> @@ -0,0 +1,75 @@
> +# name: EABI build attributes: parsing of subsections
> +# source: ba-subsection-parsing.s
> +# as:
> +# readelf: -A
> +
> +Subsections:
> + - Name: foo_01
> + Scope: private
> + Length: 13
> + Comprehension: required
> + Encoding: ULEB128
> + Values:
> +
> + - Name: foo_02
> + Scope: private
> + Length: 13
> + Comprehension: required
> + Encoding: NTBS
> + Values:
> +
> + - Name: foo_03
> + Scope: private
> + Length: 13
> + Comprehension: optional
> + Encoding: ULEB128
> + Values:
> +
> + - Name: foo_04
> + Scope: private
> + Length: 13
> + Comprehension: optional
> + Encoding: NTBS
> + Values:
> +
> + - Name: foo_05
> + Scope: private
> + Length: 13
> + Comprehension: required
> + Encoding: ULEB128
> + Values:
> +
> + - Name: foo_06
> + Scope: private
> + Length: 13
> + Comprehension: optional
> + Encoding: ULEB128
> + Values:
> +
> + - Name: foo_07
> + Scope: private
> + Length: 13
> + Comprehension: optional
> + Encoding: NTBS
> + Values:
> +
> + - Name: foo_08
> + Scope: private
> + Length: 13
> + Comprehension: required
> + Encoding: NTBS
> + Values:
> +
> + - Name: foo_09
> + Scope: private
> + Length: 13
> + Comprehension: required
> + Encoding: ULEB128
> + Values:
> +
> + - Name: foo_10
> + Scope: private
> + Length: 13
> + Comprehension: optional
> + Encoding: NTBS
> + Values:
> diff --git a/gas/testsuite/gas/aarch64/build-attributes/ba-subsection-parsing.s b/gas/testsuite/gas/aarch64/build-attributes/ba-subsection-parsing.s
> new file mode 100644
> index 00000000000..5b6ed4eb1b2
> --- /dev/null
> +++ b/gas/testsuite/gas/aarch64/build-attributes/ba-subsection-parsing.s
> @@ -0,0 +1,21 @@
> +.set ATTR_TYPE_uleb128, 0
> +.set ATTR_TYPE_asciz, 1
> +
> +.set SUBSEC_required, 0
> +.set SUBSEC_optional, 1
> +
> +/* Integer literals. */
> +.aeabi_subsection foo_01, 0, 0
> +.aeabi_subsection foo_02, 0, 1
> +.aeabi_subsection foo_03, 1, 0
> +.aeabi_subsection foo_04, 1, 1
> +
> +/* Known identifiers. */
> +.aeabi_subsection foo_05, required, uleb128
> +.aeabi_subsection foo_06, optional, ULEB128
> +.aeabi_subsection foo_07, optional, ntbs
> +.aeabi_subsection foo_08, required, NTBS
> +
> +/* Symbol look-up. */
> +.aeabi_subsection foo_09, SUBSEC_required, ATTR_TYPE_uleb128
> +.aeabi_subsection foo_10, SUBSEC_optional, ATTR_TYPE_asciz
More information about the Binutils
mailing list