diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2018-08-08 06:09:15 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2018-08-08 06:09:28 -0700 |
commit | f7309df20c4e787041cedc4a6aced89c15259e54 (patch) | |
tree | ecb88f279679414d47357a767902758458acdc40 /ld/testsuite | |
parent | 9d4a934ce604afea155c39f06834cdbc47e92a6e (diff) | |
download | gdb-f7309df20c4e787041cedc4a6aced89c15259e54.zip gdb-f7309df20c4e787041cedc4a6aced89c15259e54.tar.gz gdb-f7309df20c4e787041cedc4a6aced89c15259e54.tar.bz2 |
x86: Properly merge GNU_PROPERTY_X86_ISA_1_USED
Without the GNU_PROPERTY_X86_ISA_1_USED property, all ISAs may be used.
If a bit in the GNU_PROPERTY_X86_ISA_1_USED property is unset, the
corresponding x86 instruction set isn’t used. When merging properties
from 2 input files and one input file doesn't have the
GNU_PROPERTY_X86_ISA_1_USED property, the output file shouldn't have
it neither. This patch removes the GNU_PROPERTY_X86_ISA_1_USED
property if an input file doesn't have it.
This patch replaces the GNU_PROPERTY_X86_ISA_1_USED property with the
GNU_PROPERTY_X86_ISA_1_NEEDED property which is the minimum ISA
requirement.
bfd/
PR ld/23486
* elfxx-x86.c (_bfd_x86_elf_merge_gnu_properties): Remove
GNU_PROPERTY_X86_ISA_1_USED if an input file doesn't have it.
(_bfd_x86_elf_link_setup_gnu_properties): Adding the
GNU_PROPERTY_X86_ISA_1_NEEDED, instead of
GNU_PROPERTY_X86_ISA_1_USED, property.
ld/
PR ld/23486
* testsuite/ld-i386/i386.exp: Run PR ld/23486 tests.
* testsuite/ld-x86-64/x86-64.exp: Likewise.
* testsuite/ld-i386/pr23486a.d: New file.
* testsuite/ld-i386/pr23486b.d: Likewise.
* testsuite/ld-x86-64/pr23486a-x32.d: Likewise.
* testsuite/ld-x86-64/pr23486a.d: Likewise.
* testsuite/ld-x86-64/pr23486a.s: Likewise.
* testsuite/ld-x86-64/pr23486b-x32.d: Likewise.
* testsuite/ld-x86-64/pr23486b.d: Likewise.
* testsuite/ld-x86-64/pr23486b.s: Likewise.
* testsuite/ld-i386/property-3.r: Remove "x86 ISA used".
* testsuite/ld-i386/property-4.r: Likewise.
* testsuite/ld-i386/property-5.r: Likewise.
* testsuite/ld-i386/property-x86-ibt3a.d: Likewise.
* testsuite/ld-i386/property-x86-ibt3b.d: Likewise.
* testsuite/ld-i386/property-x86-shstk3a.d: Likewise.
* testsuite/ld-i386/property-x86-shstk3b.d: Likewise.
* testsuite/ld-x86-64/property-3.r: Likewise.
* testsuite/ld-x86-64/property-4.r: Likewise.
* testsuite/ld-x86-64/property-5.r: Likewise.
* testsuite/ld-x86-64/property-x86-ibt3a-x32.d: Likewise.
* testsuite/ld-x86-64/property-x86-ibt3a.d: Likewise.
* testsuite/ld-x86-64/property-x86-ibt3b-x32.d: Likewise.
* testsuite/ld-x86-64/property-x86-ibt3b.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk3a-x32.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk3a.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk3b-x32.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk3b.d: Likewise.
Diffstat (limited to 'ld/testsuite')
28 files changed, 150 insertions, 42 deletions
diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp index 6d794fe..78dad02 100644 --- a/ld/testsuite/ld-i386/i386.exp +++ b/ld/testsuite/ld-i386/i386.exp @@ -462,6 +462,8 @@ run_dump_test "pr23189" run_dump_test "pr23194" run_dump_test "pr23372a" run_dump_test "pr23372b" +run_dump_test "pr23486a" +run_dump_test "pr23486b" if { !([istarget "i?86-*-linux*"] || [istarget "i?86-*-gnu*"] diff --git a/ld/testsuite/ld-i386/pr23486a.d b/ld/testsuite/ld-i386/pr23486a.d new file mode 100644 index 0000000..41a6dcf --- /dev/null +++ b/ld/testsuite/ld-i386/pr23486a.d @@ -0,0 +1,10 @@ +#source: ../ld-x86-64/pr23486a.s +#source: ../ld-x86-64/pr23486b.s +#as: --32 +#ld: -r -m elf_i386 +#readelf: -n + +Displaying notes found in: .note.gnu.property + Owner Data size Description + GNU 0x0000000c NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA needed: i486, 586 diff --git a/ld/testsuite/ld-i386/pr23486b.d b/ld/testsuite/ld-i386/pr23486b.d new file mode 100644 index 0000000..08019b7 --- /dev/null +++ b/ld/testsuite/ld-i386/pr23486b.d @@ -0,0 +1,10 @@ +#source: ../ld-x86-64/pr23486b.s +#source: ../ld-x86-64/pr23486a.s +#as: --32 +#ld: -r -m elf_i386 +#readelf: -n + +Displaying notes found in: .note.gnu.property + Owner Data size Description + GNU 0x0000000c NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA needed: i486, 586 diff --git a/ld/testsuite/ld-i386/property-3.r b/ld/testsuite/ld-i386/property-3.r index 0ed91f5..d03203c 100644 --- a/ld/testsuite/ld-i386/property-3.r +++ b/ld/testsuite/ld-i386/property-3.r @@ -3,6 +3,5 @@ Displaying notes found in: .note.gnu.property Owner Data size Description GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0 Properties: stack size: 0x800000 - x86 ISA used: 586, SSE x86 ISA needed: i486, 586 #pass diff --git a/ld/testsuite/ld-i386/property-4.r b/ld/testsuite/ld-i386/property-4.r index cb2bc15..da295eb 100644 --- a/ld/testsuite/ld-i386/property-4.r +++ b/ld/testsuite/ld-i386/property-4.r @@ -3,6 +3,5 @@ Displaying notes found in: .note.gnu.property Owner Data size Description GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0 Properties: stack size: 0x800000 - x86 ISA used: i486, 586, SSE x86 ISA needed: i486, 586, SSE #pass diff --git a/ld/testsuite/ld-i386/property-5.r b/ld/testsuite/ld-i386/property-5.r index 5529650..e414159 100644 --- a/ld/testsuite/ld-i386/property-5.r +++ b/ld/testsuite/ld-i386/property-5.r @@ -3,6 +3,5 @@ Displaying notes found in: .note.gnu.property Owner Data size Description GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0 Properties: stack size: 0x900000 - x86 ISA used: i486, 586, SSE x86 ISA needed: i486, 586, SSE #pass diff --git a/ld/testsuite/ld-i386/property-x86-ibt3a.d b/ld/testsuite/ld-i386/property-x86-ibt3a.d index 4bb35b0..0aedea1 100644 --- a/ld/testsuite/ld-i386/property-x86-ibt3a.d +++ b/ld/testsuite/ld-i386/property-x86-ibt3a.d @@ -6,6 +6,5 @@ Displaying notes found in: .note.gnu.property Owner Data size Description - GNU 0x00000018 NT_GNU_PROPERTY_TYPE_0 - Properties: x86 ISA used: i486, 586, SSE2, SSE3 - x86 ISA needed: 586, SSE, SSE3, SSE4_1 + GNU 0x0000000c NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA needed: 586, SSE, SSE3, SSE4_1 diff --git a/ld/testsuite/ld-i386/property-x86-ibt3b.d b/ld/testsuite/ld-i386/property-x86-ibt3b.d index 418d58a..bd69ac6 100644 --- a/ld/testsuite/ld-i386/property-x86-ibt3b.d +++ b/ld/testsuite/ld-i386/property-x86-ibt3b.d @@ -6,6 +6,5 @@ Displaying notes found in: .note.gnu.property Owner Data size Description - GNU 0x00000018 NT_GNU_PROPERTY_TYPE_0 - Properties: x86 ISA used: i486, 586, SSE2, SSE3 - x86 ISA needed: 586, SSE, SSE3, SSE4_1 + GNU 0x0000000c NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA needed: 586, SSE, SSE3, SSE4_1 diff --git a/ld/testsuite/ld-i386/property-x86-shstk3a.d b/ld/testsuite/ld-i386/property-x86-shstk3a.d index e261038..76d2a39 100644 --- a/ld/testsuite/ld-i386/property-x86-shstk3a.d +++ b/ld/testsuite/ld-i386/property-x86-shstk3a.d @@ -6,6 +6,5 @@ Displaying notes found in: .note.gnu.property Owner Data size Description - GNU 0x00000018 NT_GNU_PROPERTY_TYPE_0 - Properties: x86 ISA used: i486, 586, SSE2, SSE3 - x86 ISA needed: 586, SSE, SSE3, SSE4_1 + GNU 0x0000000c NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA needed: 586, SSE, SSE3, SSE4_1 diff --git a/ld/testsuite/ld-i386/property-x86-shstk3b.d b/ld/testsuite/ld-i386/property-x86-shstk3b.d index 25f3d23..e770ecf 100644 --- a/ld/testsuite/ld-i386/property-x86-shstk3b.d +++ b/ld/testsuite/ld-i386/property-x86-shstk3b.d @@ -6,6 +6,5 @@ Displaying notes found in: .note.gnu.property Owner Data size Description - GNU 0x00000018 NT_GNU_PROPERTY_TYPE_0 - Properties: x86 ISA used: i486, 586, SSE2, SSE3 - x86 ISA needed: 586, SSE, SSE3, SSE4_1 + GNU 0x0000000c NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA needed: 586, SSE, SSE3, SSE4_1 diff --git a/ld/testsuite/ld-x86-64/pr23486a-x32.d b/ld/testsuite/ld-x86-64/pr23486a-x32.d new file mode 100644 index 0000000..6d9fa68 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr23486a-x32.d @@ -0,0 +1,10 @@ +#source: pr23486a.s +#source: pr23486b.s +#as: --x32 +#ld: -r -m elf32_x86_64 +#readelf: -n + +Displaying notes found in: .note.gnu.property + Owner Data size Description + GNU 0x0000000c NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA needed: i486, 586 diff --git a/ld/testsuite/ld-x86-64/pr23486a.d b/ld/testsuite/ld-x86-64/pr23486a.d new file mode 100644 index 0000000..dc2b7bf --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr23486a.d @@ -0,0 +1,10 @@ +#source: pr23486a.s +#source: pr23486b.s +#as: --64 -defsym __64_bit__=1 +#ld: -r -m elf_x86_64 +#readelf: -n + +Displaying notes found in: .note.gnu.property + Owner Data size Description + GNU 0x00000010 NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA needed: i486, 586 diff --git a/ld/testsuite/ld-x86-64/pr23486a.s b/ld/testsuite/ld-x86-64/pr23486a.s new file mode 100644 index 0000000..a07d0c7 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr23486a.s @@ -0,0 +1,30 @@ + .section ".note.gnu.property", "a" +.ifdef __64_bit__ + .p2align 3 +.else + .p2align 2 +.endif + .long 1f - 0f /* name length. */ + .long 4f - 1f /* data length. */ + /* NT_GNU_PROPERTY_TYPE_0 */ + .long 5 /* note type. */ +0: + .asciz "GNU" /* vendor name. */ +1: +.ifdef __64_bit__ + .p2align 3 +.else + .p2align 2 +.endif + /* GNU_PROPERTY_X86_ISA_1_USED */ + .long 0xc0000000 /* pr_type. */ + .long 3f - 2f /* pr_datasz. */ +2: + .long 0xa +3: +.ifdef __64_bit__ + .p2align 3 +.else + .p2align 2 +.endif +4: diff --git a/ld/testsuite/ld-x86-64/pr23486b-x32.d b/ld/testsuite/ld-x86-64/pr23486b-x32.d new file mode 100644 index 0000000..0445e69 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr23486b-x32.d @@ -0,0 +1,10 @@ +#source: pr23486b.s +#source: pr23486a.s +#as: --x32 +#ld: -r -m elf32_x86_64 +#readelf: -n + +Displaying notes found in: .note.gnu.property + Owner Data size Description + GNU 0x0000000c NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA needed: i486, 586 diff --git a/ld/testsuite/ld-x86-64/pr23486b.d b/ld/testsuite/ld-x86-64/pr23486b.d new file mode 100644 index 0000000..dc2b7bf --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr23486b.d @@ -0,0 +1,10 @@ +#source: pr23486a.s +#source: pr23486b.s +#as: --64 -defsym __64_bit__=1 +#ld: -r -m elf_x86_64 +#readelf: -n + +Displaying notes found in: .note.gnu.property + Owner Data size Description + GNU 0x00000010 NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA needed: i486, 586 diff --git a/ld/testsuite/ld-x86-64/pr23486b.s b/ld/testsuite/ld-x86-64/pr23486b.s new file mode 100644 index 0000000..c5167ee --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr23486b.s @@ -0,0 +1,30 @@ + .section ".note.gnu.property", "a" +.ifdef __64_bit__ + .p2align 3 +.else + .p2align 2 +.endif + .long 1f - 0f /* name length. */ + .long 4f - 1f /* data length. */ + /* NT_GNU_PROPERTY_TYPE_0 */ + .long 5 /* note type. */ +0: + .asciz "GNU" /* vendor name. */ +1: +.ifdef __64_bit__ + .p2align 3 +.else + .p2align 2 +.endif + /* GNU_PROPERTY_X86_ISA_1_NEEDED */ + .long 0xc0000001 /* pr_type. */ + .long 3f - 2f /* pr_datasz. */ +2: + .long 0x3 +3: +.ifdef __64_bit__ + .p2align 3 +.else + .p2align 2 +.endif +4: diff --git a/ld/testsuite/ld-x86-64/property-3.r b/ld/testsuite/ld-x86-64/property-3.r index 0ed91f5..d03203c 100644 --- a/ld/testsuite/ld-x86-64/property-3.r +++ b/ld/testsuite/ld-x86-64/property-3.r @@ -3,6 +3,5 @@ Displaying notes found in: .note.gnu.property Owner Data size Description GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0 Properties: stack size: 0x800000 - x86 ISA used: 586, SSE x86 ISA needed: i486, 586 #pass diff --git a/ld/testsuite/ld-x86-64/property-4.r b/ld/testsuite/ld-x86-64/property-4.r index cb2bc15..da295eb 100644 --- a/ld/testsuite/ld-x86-64/property-4.r +++ b/ld/testsuite/ld-x86-64/property-4.r @@ -3,6 +3,5 @@ Displaying notes found in: .note.gnu.property Owner Data size Description GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0 Properties: stack size: 0x800000 - x86 ISA used: i486, 586, SSE x86 ISA needed: i486, 586, SSE #pass diff --git a/ld/testsuite/ld-x86-64/property-5.r b/ld/testsuite/ld-x86-64/property-5.r index 5529650..e414159 100644 --- a/ld/testsuite/ld-x86-64/property-5.r +++ b/ld/testsuite/ld-x86-64/property-5.r @@ -3,6 +3,5 @@ Displaying notes found in: .note.gnu.property Owner Data size Description GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0 Properties: stack size: 0x900000 - x86 ISA used: i486, 586, SSE x86 ISA needed: i486, 586, SSE #pass diff --git a/ld/testsuite/ld-x86-64/property-x86-ibt3a-x32.d b/ld/testsuite/ld-x86-64/property-x86-ibt3a-x32.d index 011426f..4cec728 100644 --- a/ld/testsuite/ld-x86-64/property-x86-ibt3a-x32.d +++ b/ld/testsuite/ld-x86-64/property-x86-ibt3a-x32.d @@ -6,6 +6,5 @@ Displaying notes found in: .note.gnu.property Owner Data size Description - GNU 0x00000018 NT_GNU_PROPERTY_TYPE_0 - Properties: x86 ISA used: 586, SSE, SSE3, SSE4_1 - x86 ISA needed: i486, 586, SSE2, SSE3 + GNU 0x0000000c NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA needed: i486, 586, SSE2, SSE3 diff --git a/ld/testsuite/ld-x86-64/property-x86-ibt3a.d b/ld/testsuite/ld-x86-64/property-x86-ibt3a.d index 1b4229a..a8df49a 100644 --- a/ld/testsuite/ld-x86-64/property-x86-ibt3a.d +++ b/ld/testsuite/ld-x86-64/property-x86-ibt3a.d @@ -6,6 +6,5 @@ Displaying notes found in: .note.gnu.property Owner Data size Description - GNU 0x00000020 NT_GNU_PROPERTY_TYPE_0 - Properties: x86 ISA used: 586, SSE, SSE3, SSE4_1 - x86 ISA needed: i486, 586, SSE2, SSE3 + GNU 0x00000010 NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA needed: i486, 586, SSE2, SSE3 diff --git a/ld/testsuite/ld-x86-64/property-x86-ibt3b-x32.d b/ld/testsuite/ld-x86-64/property-x86-ibt3b-x32.d index 290ed6a..c112626 100644 --- a/ld/testsuite/ld-x86-64/property-x86-ibt3b-x32.d +++ b/ld/testsuite/ld-x86-64/property-x86-ibt3b-x32.d @@ -6,6 +6,5 @@ Displaying notes found in: .note.gnu.property Owner Data size Description - GNU 0x00000018 NT_GNU_PROPERTY_TYPE_0 - Properties: x86 ISA used: 586, SSE, SSE3, SSE4_1 - x86 ISA needed: i486, 586, SSE2, SSE3 + GNU 0x0000000c NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA needed: i486, 586, SSE2, SSE3 diff --git a/ld/testsuite/ld-x86-64/property-x86-ibt3b.d b/ld/testsuite/ld-x86-64/property-x86-ibt3b.d index 1142e03..f10dffd 100644 --- a/ld/testsuite/ld-x86-64/property-x86-ibt3b.d +++ b/ld/testsuite/ld-x86-64/property-x86-ibt3b.d @@ -6,6 +6,5 @@ Displaying notes found in: .note.gnu.property Owner Data size Description - GNU 0x00000020 NT_GNU_PROPERTY_TYPE_0 - Properties: x86 ISA used: 586, SSE, SSE3, SSE4_1 - x86 ISA needed: i486, 586, SSE2, SSE3 + GNU 0x00000010 NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA needed: i486, 586, SSE2, SSE3 diff --git a/ld/testsuite/ld-x86-64/property-x86-shstk3a-x32.d b/ld/testsuite/ld-x86-64/property-x86-shstk3a-x32.d index 819542d..0147a3c 100644 --- a/ld/testsuite/ld-x86-64/property-x86-shstk3a-x32.d +++ b/ld/testsuite/ld-x86-64/property-x86-shstk3a-x32.d @@ -6,6 +6,5 @@ Displaying notes found in: .note.gnu.property Owner Data size Description - GNU 0x00000018 NT_GNU_PROPERTY_TYPE_0 - Properties: x86 ISA used: 586, SSE, SSE3, SSE4_1 - x86 ISA needed: i486, 586, SSE2, SSE3 + GNU 0x0000000c NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA needed: i486, 586, SSE2, SSE3 diff --git a/ld/testsuite/ld-x86-64/property-x86-shstk3a.d b/ld/testsuite/ld-x86-64/property-x86-shstk3a.d index 4c5d0e0..1f8c2dc 100644 --- a/ld/testsuite/ld-x86-64/property-x86-shstk3a.d +++ b/ld/testsuite/ld-x86-64/property-x86-shstk3a.d @@ -6,6 +6,5 @@ Displaying notes found in: .note.gnu.property Owner Data size Description - GNU 0x00000020 NT_GNU_PROPERTY_TYPE_0 - Properties: x86 ISA used: 586, SSE, SSE3, SSE4_1 - x86 ISA needed: i486, 586, SSE2, SSE3 + GNU 0x00000010 NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA needed: i486, 586, SSE2, SSE3 diff --git a/ld/testsuite/ld-x86-64/property-x86-shstk3b-x32.d b/ld/testsuite/ld-x86-64/property-x86-shstk3b-x32.d index ba181e0..7ca2539 100644 --- a/ld/testsuite/ld-x86-64/property-x86-shstk3b-x32.d +++ b/ld/testsuite/ld-x86-64/property-x86-shstk3b-x32.d @@ -6,6 +6,5 @@ Displaying notes found in: .note.gnu.property Owner Data size Description - GNU 0x00000018 NT_GNU_PROPERTY_TYPE_0 - Properties: x86 ISA used: 586, SSE, SSE3, SSE4_1 - x86 ISA needed: i486, 586, SSE2, SSE3 + GNU 0x0000000c NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA needed: i486, 586, SSE2, SSE3 diff --git a/ld/testsuite/ld-x86-64/property-x86-shstk3b.d b/ld/testsuite/ld-x86-64/property-x86-shstk3b.d index 5216f38..f66a40e 100644 --- a/ld/testsuite/ld-x86-64/property-x86-shstk3b.d +++ b/ld/testsuite/ld-x86-64/property-x86-shstk3b.d @@ -6,6 +6,5 @@ Displaying notes found in: .note.gnu.property Owner Data size Description - GNU 0x00000020 NT_GNU_PROPERTY_TYPE_0 - Properties: x86 ISA used: 586, SSE, SSE3, SSE4_1 - x86 ISA needed: i486, 586, SSE2, SSE3 + GNU 0x00000010 NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA needed: i486, 586, SSE2, SSE3 diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp index 6edb9e8..ae21e55 100644 --- a/ld/testsuite/ld-x86-64/x86-64.exp +++ b/ld/testsuite/ld-x86-64/x86-64.exp @@ -403,6 +403,10 @@ run_dump_test "pr23372a" run_dump_test "pr23372a-x32" run_dump_test "pr23372b" run_dump_test "pr23372b-x32" +run_dump_test "pr23486a" +run_dump_test "pr23486a-x32" +run_dump_test "pr23486b" +run_dump_test "pr23486b-x32" if { ![istarget "x86_64-*-linux*"] && ![istarget "x86_64-*-nacl*"]} { return |