From patchwork Tue Aug 20 17:01:12 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Burgess X-Patchwork-Id: 96172 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 6EC9A386D61B for ; Tue, 20 Aug 2024 17:01:54 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTP id 6356438449C8 for ; Tue, 20 Aug 2024 17:01:21 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 6356438449C8 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 6356438449C8 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1724173284; cv=none; b=Z/xtB5dI/BktfvBPRmucoBfDMzafl/5ofaq+6VWpoVGgXoOv4e/8yheTpfiX4cnr1f+C9xNapTf5ctczGCnz8hSUHGwDsDRDP3RJjrwZb0s9JfSizvne2wyJHuAFIGxrWIZTfjecEckZ1QiX2YxK2grWhWx3R6LVOYBhU6doLPw= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1724173284; c=relaxed/simple; bh=yoyA5fM5kb6aakigWt/GZJEl7X+WHeGmYSBIrJFOjY8=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=rRG/LZisqbZu6RIJfopH92dPHW25J7FuyiZ3fwywjz4SKMz8+vsKA4a7KtNrwK/q+waaYzCGzWDGIRU31pRHLz8Xi+Rb97YqsELscxPqpYIdZSntznwL0aMrta2NqvvFh7FOwyk7WqpQemC07bgGDUbNuXsDaFx7hLUu7+O/a2I= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1724173281; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=lwqZnQSDUQhA9cNzoQ6s6JG19zyCVLTjk+65tqJxKYg=; b=ej+bpwpCQ4lLWnXyyYigI/zKpnJz5kY1qJmtouBA51bGRTdE7kNmPkahAT3RDq2TIbMr+G XAiA6e6rjgaz911+glqbcEoJCv9m+xO6GiCWy1GWeG3VvYbx92SOVK1gkB4Ifa9lLULVVN 0BGHqmgoTnMLOfCekwhDcvNTan64oo0= Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-684-hAECsgULPpuz5qEW8MHN6g-1; Tue, 20 Aug 2024 13:01:19 -0400 X-MC-Unique: hAECsgULPpuz5qEW8MHN6g-1 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-4280b119a74so45438875e9.3 for ; Tue, 20 Aug 2024 10:01:19 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724173278; x=1724778078; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=lwqZnQSDUQhA9cNzoQ6s6JG19zyCVLTjk+65tqJxKYg=; b=wpbcHujRb5iwTA8sovGWIo46iRq+EWTpMIV3xNve2z8WW4LYG55D6BRflPumgdl4aB HbNsgRClAZQJr2fmPnhwim3bdT/bUFan8vmtvGYz5cBLTR2nAn4DHZLvSiH7TtwXeAZf Hkp0Nuu2DNoV57xom4QFDngj52RslPJ9EAQ8gG3+jANIUFHEOif5XfeyTaNGjDXp3qAV TXbEeL7hdB5O55eRHIi4q2qr+QAa0TKaH8qSPcxdUQONo+VASJT1czrFXSy/1XF0Ixn4 svlxTlucb/bl63r2cod0/3tmIHPR34zWaM5r8GbOUMkLAoezQ56yQ4Q50WQw70E/fdYn p3cg== X-Forwarded-Encrypted: i=1; AJvYcCWv7aoXZyUmhRk/h8VkEBlR0Wl9BlEBIXWp47MNMPNw132IpoiSoC0JxeC69cSg5TzasF0E49gYAusP4FmRiBqPZNRReeGcmfcJ7Q== X-Gm-Message-State: AOJu0YyE1DIDy8/zigQRG2FRGx3d8jhPVsusE7iXtzjwH2QvR4BXVQRl 23ic5zrkWhf3Ao3f3YyMhmKejg4/HmsErZUk4PSnNpqsmi3Flz7lMSyEve+W1QG/JjkOEqurZB4 uTDtkjRve3ffOSGRqDRUjnUwHzExjCCA6JH1O5u+hWPtYRVb+VyFirJ0pqK/26RNE8JE= X-Received: by 2002:a05:600c:1e2a:b0:428:10ec:e5ca with SMTP id 5b1f17b1804b1-42abd230084mr79335e9.14.1724173277703; Tue, 20 Aug 2024 10:01:17 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHzDIAFjHRIXekWYDC9ze36ffu5XAq4aKJtl8rrMJsKoDJHwPwyI5qqUH4hmJEcRVlITt6g9A== X-Received: by 2002:a05:600c:1e2a:b0:428:10ec:e5ca with SMTP id 5b1f17b1804b1-42abd230084mr78585e9.14.1724173276480; Tue, 20 Aug 2024 10:01:16 -0700 (PDT) Received: from localhost (178.126.90.146.dyn.plus.net. [146.90.126.178]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-42ab5b76caesm32752405e9.0.2024.08.20.10.01.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 20 Aug 2024 10:01:15 -0700 (PDT) From: Andrew Burgess To: binutils@sourceware.org, gdb-patches@sourceware.org Cc: Andrew Burgess Subject: [PATCH] libiberty: sync with gcc Date: Tue, 20 Aug 2024 18:01:12 +0100 Message-Id: X-Mailer: git-send-email 2.25.4 MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-10.2 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~patchwork=sourceware.org@sourceware.org This syncs binutils-gdb/libiberty with gcc/libiberty up to GCC commit 64028d626a50410dbf29. This picks up the follow 3 GCC commits: ea238096883 (gcc-delete-unused-func) libiberty/argv.c: remove only_whitespace 5e1d530da87 (gcc-buildargv) libiberty/buildargv: handle input consisting of only white space a87954610f5 libiberty/buildargv: POSIX behaviour for backslash handling --- libiberty/ChangeLog | 21 ++++ libiberty/argv.c | 113 ++++++++--------- libiberty/testsuite/test-expandargv.c | 170 ++++++++++++++++++++++---- 3 files changed, 221 insertions(+), 83 deletions(-) base-commit: 40a1603112d2b1d330e11792b5506457d5584648 diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index cdcd4b3ced8..949fec62fe4 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,24 @@ +2024-08-05 Andrew Burgess + + * argv.c (only_whitespace): Delete. + +2024-07-16 Andrew Burgess + + * argv.c (buildargv): Treat input of only whitespace as an empty + argument list. + (expandargv): Remove work around for intput that is only + whitespace. + * testsuite/test-expandargv.c: Add new tests 10, 11, and 12. + Extend testing to call buildargv in more cases. + +2024-07-16 Andrew Burgess + + * argv.c (buildargv): Backslashes within single quotes are + literal, backslashes only escape POSIX defined special characters + within double quotes, and backslashed newlines should act as line + continuations. + * testsuite/test-expandargv.c: Add new tests 7, 8, and 9. + 2024-04-02 Tom Tromey * cplus-dem.c (cplus_demangle): Try the D demangler with diff --git a/libiberty/argv.c b/libiberty/argv.c index 45f16854603..f889432a868 100644 --- a/libiberty/argv.c +++ b/libiberty/argv.c @@ -124,15 +124,6 @@ consume_whitespace (const char **input) } } -static int -only_whitespace (const char* input) -{ - while (*input != EOS && ISSPACE (*input)) - input++; - - return (*input == EOS); -} - /* @deftypefn Extension char** buildargv (char *@var{sp}) @@ -212,67 +203,74 @@ char **buildargv (const char *input) argv[argc] = NULL; } /* Begin scanning arg */ - arg = copybuf; - while (*input != EOS) + if (*input != EOS) { - if (ISSPACE (*input) && !squote && !dquote && !bsquote) - { - break; - } - else + arg = copybuf; + while (*input != EOS) { - if (bsquote) - { - bsquote = 0; - *arg++ = *input; - } - else if (*input == '\\') + if (ISSPACE (*input) && !squote && !dquote && !bsquote) { - bsquote = 1; - } - else if (squote) - { - if (*input == '\'') - { - squote = 0; - } - else - { - *arg++ = *input; - } + break; } - else if (dquote) + else { - if (*input == '"') + if (bsquote) { - dquote = 0; + bsquote = 0; + if (*input != '\n') + *arg++ = *input; } - else + else if (*input == '\\' + && !squote + && (!dquote + || strchr ("$`\"\\\n", *(input + 1)) != NULL)) { - *arg++ = *input; + bsquote = 1; } - } - else - { - if (*input == '\'') + else if (squote) { - squote = 1; + if (*input == '\'') + { + squote = 0; + } + else + { + *arg++ = *input; + } } - else if (*input == '"') + else if (dquote) { - dquote = 1; + if (*input == '"') + { + dquote = 0; + } + else + { + *arg++ = *input; + } } else { - *arg++ = *input; + if (*input == '\'') + { + squote = 1; + } + else if (*input == '"') + { + dquote = 1; + } + else + { + *arg++ = *input; + } } + input++; } - input++; } + *arg = EOS; + argv[argc] = xstrdup (copybuf); + argc++; } - *arg = EOS; - argv[argc] = xstrdup (copybuf); - argc++; argv[argc] = NULL; consume_whitespace (&input); @@ -435,17 +433,8 @@ expandargv (int *argcp, char ***argvp) } /* Add a NUL terminator. */ buffer[len] = '\0'; - /* If the file is empty or contains only whitespace, buildargv would - return a single empty argument. In this context we want no arguments, - instead. */ - if (only_whitespace (buffer)) - { - file_argv = (char **) xmalloc (sizeof (char *)); - file_argv[0] = NULL; - } - else - /* Parse the string. */ - file_argv = buildargv (buffer); + /* Parse the string. */ + file_argv = buildargv (buffer); /* If *ARGVP is not already dynamically allocated, copy it. */ if (*argvp == original_argv) *argvp = dupargv (*argvp); diff --git a/libiberty/testsuite/test-expandargv.c b/libiberty/testsuite/test-expandargv.c index 1e9cb0a0d5a..ca7031eaf68 100644 --- a/libiberty/testsuite/test-expandargv.c +++ b/libiberty/testsuite/test-expandargv.c @@ -142,6 +142,64 @@ const char *test_data[] = { "b", 0, + /* Test 7 - No backslash removal within single quotes. */ + "'a\\$VAR' '\\\"'", /* Test 7 data */ + ARGV0, + "@test-expandargv-7.lst", + 0, + ARGV0, + "a\\$VAR", + "\\\"", + 0, + + /* Test 8 - Remove backslash / newline pairs. */ + "\"ab\\\ncd\" ef\\\ngh", /* Test 8 data */ + ARGV0, + "@test-expandargv-8.lst", + 0, + ARGV0, + "abcd", + "efgh", + 0, + + /* Test 9 - Backslash within double quotes. */ + "\"\\$VAR\" \"\\`\" \"\\\"\" \"\\\\\" \"\\n\" \"\\t\"", /* Test 9 data */ + ARGV0, + "@test-expandargv-9.lst", + 0, + ARGV0, + "$VAR", + "`", + "\"", + "\\", + "\\n", + "\\t", + 0, + + /* Test 10 - Mixed white space characters. */ + "\t \n \t ", /* Test 10 data */ + ARGV0, + "@test-expandargv-10.lst", + 0, + ARGV0, + 0, + + /* Test 11 - Single ' ' character. */ + " ", /* Test 11 data */ + ARGV0, + "@test-expandargv-11.lst", + 0, + ARGV0, + 0, + + /* Test 12 - Multiple ' ' characters. */ + " ", /* Test 12 data */ + ARGV0, + "@test-expandargv-12.lst", + 0, + ARGV0, + 0, + 0 /* Test done marker, don't remove. */ }; @@ -231,6 +289,78 @@ erase_test (int test) fatal_error (__LINE__, "Failed to erase test file.", errno); } +/* compare_argv: + TEST is the current test number, and NAME is a short string to identify + which libibery function is being tested. ARGC_A and ARGV_A describe an + argument array, and this is compared to ARGC_B and ARGV_B, return 0 if + the two arrays match, otherwise return 1. */ + +static int +compare_argv (int test, const char *name, int argc_a, char *argv_a[], + int argc_b, char *argv_b[]) +{ + int failed = 0, k; + + if (argc_a != argc_b) + { + printf ("FAIL: test-%s-%d. Argument count didn't match\n", name, test); + failed = 1; + } + /* Compare each of the argv's ... */ + else + for (k = 0; k < argc_a; k++) + if (strcmp (argv_a[k], argv_b[k]) != 0) + { + printf ("FAIL: test-%s-%d. Arguments don't match.\n", name, test); + failed = 1; + break; + } + + if (!failed) + printf ("PASS: test-%s-%d.\n", name, test); + + return failed; +} + +/* test_buildargv + Test the buildargv function from libiberty. TEST is the current test + number and TEST_INPUT is the string to pass to buildargv (after calling + run_replaces on it). ARGC_AFTER and ARGV_AFTER are the expected + results. Return 0 if the test passes, otherwise return 1. */ + +static int +test_buildargv (int test, const char * test_input, int argc_after, + char *argv_after[]) +{ + char * input, ** argv; + size_t len; + int argc, failed; + + /* Generate RW copy of data for replaces */ + len = strlen (test_input); + input = malloc (sizeof (char) * (len + 1)); + if (input == NULL) + fatal_error (__LINE__, "Failed to malloc buildargv input buffer.", errno); + + memcpy (input, test_input, sizeof (char) * (len + 1)); + /* Run all possible replaces */ + run_replaces (input); + + /* Split INPUT into separate arguments. */ + argv = buildargv (input); + + /* Count the arguments we got back. */ + argc = 0; + while (argv[argc]) + ++argc; + + failed = compare_argv (test, "buildargv", argc_after, argv_after, argc, argv); + + free (input); + freeargv (argv); + + return failed; +} /* run_tests: Run expandargv @@ -242,12 +372,16 @@ run_tests (const char **test_data) { int argc_after, argc_before; char ** argv_before, ** argv_after; - int i, j, k, fails, failed; + int i, j, k, fails; + const char * input_str; i = j = fails = 0; /* Loop over all the tests */ while (test_data[j]) { + /* Save original input in case we run a buildargv test. */ + input_str = test_data[j]; + /* Write test data */ writeout_test (i, test_data[j++]); /* Copy argv before */ @@ -271,29 +405,23 @@ run_tests (const char **test_data) for (k = 0; k < argc_after; k++) run_replaces (argv_after[k]); + /* If the test input is just a file to expand then we can also test + calling buildargv directly as the expected output is equivalent to + calling buildargv on the contents of the file. + + The results of calling buildargv will not include the ARGV0 constant, + which is why we pass 'argc_after - 1' and 'argv_after + 1', this skips + over the ARGV0 in the expected results. */ + if (argc_before == 2) + fails += test_buildargv (i, input_str, argc_after - 1, argv_after + 1); + else + printf ("SKIP: test-buildargv-%d. This test isn't for buildargv\n", i); + /* Run test: Expand arguments */ expandargv (&argc_before, &argv_before); - failed = 0; - /* Compare size first */ - if (argc_before != argc_after) - { - printf ("FAIL: test-expandargv-%d. Number of arguments don't match.\n", i); - failed++; - } - /* Compare each of the argv's ... */ - else - for (k = 0; k < argc_after; k++) - if (strcmp (argv_before[k], argv_after[k]) != 0) - { - printf ("FAIL: test-expandargv-%d. Arguments don't match.\n", i); - failed++; - } - - if (!failed) - printf ("PASS: test-expandargv-%d.\n", i); - else - fails++; + fails += compare_argv (i, "expandargv", argc_before, argv_before, + argc_after, argv_after); freeargv (argv_before); freeargv (argv_after);