From 95b83567a4500c9cc14480dc171cf1d26a1555a6 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Fri, 28 Jul 2023 12:34:30 +0200 Subject: [PATCH] gas: amend X_unsigned uses PR gas/30688 X_unsigned being clear does not indicate a negative number; it merely indicates a signed one (whose sign may still be clear). Amend two uses by an actual value check. --- gas/read.c | 4 ++-- gas/testsuite/gas/elf/common3.s | 7 +++++++ gas/testsuite/gas/elf/common3a.d | 9 +++++++++ gas/testsuite/gas/elf/common3b.d | 9 +++++++++ gas/testsuite/gas/elf/elf.exp | 12 ++++++++++-- 5 files changed, 37 insertions(+), 4 deletions(-) diff --git a/gas/read.c b/gas/read.c index 0cceca8a802..826156db3fe 100644 --- a/gas/read.c +++ b/gas/read.c @@ -1751,7 +1751,7 @@ s_comm_internal (int param, ignore_rest_of_line (); goto out; } - else if (temp != size || !exp.X_unsigned) + else if (temp != size || (!exp.X_unsigned && exp.X_add_number < 0)) { as_warn (_("size (%ld) out of range, ignored"), (long) temp); ignore_rest_of_line (); @@ -2541,7 +2541,7 @@ parse_align (int align_bytes) if (exp.X_op == O_absent) goto no_align; - if (!exp.X_unsigned) + if (!exp.X_unsigned && exp.X_add_number < 0) { as_warn (_("alignment negative; 0 assumed")); align = 0; diff --git a/gas/testsuite/gas/elf/common3.s b/gas/testsuite/gas/elf/common3.s index f684da48c4f..c2cf88ee421 100644 --- a/gas/testsuite/gas/elf/common3.s +++ b/gas/testsuite/gas/elf/common3.s @@ -1 +1,8 @@ .comm foobar,30,4 + .comm buf1, 5-1, 8 + .comm buf2, 4, 9-1 + .ifndef lcomm_align + .lcomm lbuf, 9-1 + .else + .lcomm lbuf, 9-1, 8 + .endif diff --git a/gas/testsuite/gas/elf/common3a.d b/gas/testsuite/gas/elf/common3a.d index fa9d5ceb395..f177b231d41 100644 --- a/gas/testsuite/gas/elf/common3a.d +++ b/gas/testsuite/gas/elf/common3a.d @@ -1,7 +1,16 @@ #source: common3.s #as: --elf-stt-common=yes #readelf: -s -W +# MIPS'es IRIX emulation puts lbuf (STB_LOCAL) after the globals in the +# symbol table, and that mode is hard to check for (see irixemul in +# binutils/testsuite/binutils-all/mips/mips.exp) +#notarget: mips*-*-* +#... + +[0-9]+: +0+ +8 +(OBJECT|NOTYPE) +LOCAL +DEFAULT +[1-9] +lbuf #... +[0-9]+: +0+4 +30 +COMMON +GLOBAL +DEFAULT +COM +foobar +#... + +[0-9]+: +0+8 +4 +COMMON +GLOBAL +DEFAULT +COM +buf1 + +[0-9]+: +0+8 +4 +COMMON +GLOBAL +DEFAULT +COM +buf2 #pass diff --git a/gas/testsuite/gas/elf/common3b.d b/gas/testsuite/gas/elf/common3b.d index 9481d134274..c9000abc413 100644 --- a/gas/testsuite/gas/elf/common3b.d +++ b/gas/testsuite/gas/elf/common3b.d @@ -1,7 +1,16 @@ #source: common3.s #as: --elf-stt-common=no #readelf: -s -W +# MIPS'es IRIX emulation puts lbuf (STB_LOCAL) after the globals in the +# symbol table, and that mode is hard to check for (see irixemul in +# binutils/testsuite/binutils-all/mips/mips.exp) +#notarget: mips*-*-* +#... + +[0-9]+: +0+ +8 +(OBJECT|NOTYPE) +LOCAL +DEFAULT +[1-9] +lbuf #... +[0-9]+: +0+4 +30 +OBJECT +GLOBAL +DEFAULT +COM +foobar +#... + +[0-9]+: +0+8 +4 +OBJECT +GLOBAL +DEFAULT +COM +buf1 + +[0-9]+: +0+8 +4 +OBJECT +GLOBAL +DEFAULT +COM +buf2 #pass diff --git a/gas/testsuite/gas/elf/elf.exp b/gas/testsuite/gas/elf/elf.exp index 4890dd93420..9e389ff1859 100644 --- a/gas/testsuite/gas/elf/elf.exp +++ b/gas/testsuite/gas/elf/elf.exp @@ -345,8 +345,16 @@ if { [is_elf_format] } then { # hpux has a non-standard common directive. if { ![istarget "*-*-hpux*"] } then { - run_dump_test "common3a" - run_dump_test "common3b" + switch -glob $target_triplet { + ia64-*-* { + run_dump_test "common3a" { { as "--defsym lcomm_align=1" } } + run_dump_test "common3b" { { as "--defsym lcomm_align=1" } } + } + default { + run_dump_test "common3a" + run_dump_test "common3b" + } + } run_dump_test "common4a" run_dump_test "common4b" run_dump_test "common5a" -- 2.30.2