<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/63768>63768</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Why clang does not support split-stack while having vararg but gcc does
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          zzkcode
      </td>
    </tr>
</table>

<pre>
    ### Background
We are building an application that uses split-stack, but it seems Clang does not support split-stack while having vararg but GCC does do. And there are already some issues(https://github.com/llvm/llvm-project/issues/40064, https://github.com/llvm/llvm-project/issues/19571) related to this, but since our application link so many other libs, it is almost impossible to use `attribute((no_split_stack))` in all places as a workaround.

### Questions
So here are my questions:
- Just curious: Clang does not support split-stack while having varargs, is that because the variadic arguments on the old stack are not copied or make references to, but GCC does?
- Will Clang consider supporting split-stack while having varargs in the near future or is it just technically impossible under Clang?

Our application switched from GCC to Clang years ago, and already using some flags and features that only Clang supports. So it may be hard to switch back. Any comments/suggestions will be appreciated. Thanks!

### Example Codes
```c
#include <stdio.h>
#include <stdarg.h>

void greet(int count, ...)
//void greet(int count, ...) __attribute__((no_split_stack))
{
    va_list args;
 va_start(args, count);

    for (int i = 0; i < count; i++) {
 char* name = va_arg(args, char*);
        printf("Hello, %s!\n", name);
    }

    va_end(args);
}

void call_loop(int i) {
    char a[10 * 1024];

    if (i > 0) {
        call_loop(i-1);
    }
}

int main()
{
    greet(3, "Alice", "Bob", "Charlie");
    call_loop(1024);
    return 0;
}
```

clang output:
```bash
$ clang -fsplit-stack -g -O0 vararg_split_stack.c
fatal error: error in backend: Segmented stacks do not support vararg functions.
clang-16: error: clang frontend command failed with exit code 70 (use -v to see invocation)
clang version 16.0.0 (Red Hat 16.0.0-2.module_el8+405+25122a8c)
Target: x86_64-redhat-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
clang-16: note: diagnostic msg:
********************

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang-16: note: diagnostic msg: /tmp/vararg_split_stack-422cf6.c
clang-16: note: diagnostic msg: /tmp/vararg_split_stack-422cf6.sh
clang-16: note: diagnostic msg:
```

gcc output:
```bash
$ gcc -fsplit-stack -g -O0 vararg_split_stack.c
$ ./a.out
Hello, Alice!
Hello, Bob!
Hello, Charlie!
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysV1tz4jgW_jXi5RQuWwYDDzwACd291bXp7c5WP1JCOtiayJJXFxLm129JNg7J9OzM9E7K5RjpXL5z-2Qz52StEddkviXzuwkLvjF2_euvT9wInByNuKwJLfsLtow_1dYELUh-R_LNdwRmEY5BKiF1DUwD6zolOfPSaPAN8xAcOnCdkn7qPONPhO7gGDxIDw6xdbBTTNcgDDrQxoMLXWesv1WB50YqhIado5Mzs8zWycaH3a5XFCaDjRbgG7Q9JqYsMnEBZ1oE6VxAR-iy8b5zpNwQuid0X0vfhGPGTUvoXqnz9d-0s-YX5J7Q_VVzP8vzahax_7yJYjVfFISuwKJiHgV4A76R7poRJzVHMMG-SaKS-gmcgZbpC5gYICh5TErSg3TAVGucB9l2xjl5VBjtBodAqpx5b-UxeCR0SehSm0NK62GoxCpeVQ5SA1MKOsU4OmAOGDwb-8RSqbO-1sN97IV_BXQRoOs3vhkYc99e4D_jbjloTuEfwXngwUoT4vJPFr6P3PXNdUTOYqi-wbgtmZAcmK1Di9o7SD2IYJSA3l5EF31x00kUYCy07AnB4gkt6hi8N9dyXJuLlPtrBN-lUgNsbrSTAu0VdgT4R8hjniMejczCKfhgMUKQLlbyl5gdj7zRkjOlLrcFDTp6So5HNP394V23uGfpeYMCTta0KQRvBsQXZNYBq1OATItxRIJL4OOgnBSrXdo8IYv4hjwbrS6DmSFel8E3E3G37ALHGKlNDd0DgCPjT3EkL8BNm4pB6N6Fuh7aAp5jKo8YwVvkMs5DBo8N00-O0OLHLXf_wtpOIeyMwKHtSJX3Fx-FpeYqCARS7pwX0mQNKe9_Z5fZ-nY73c9GCqgtoid0KXVslqB9TFqWZXFgBlNx_P9IFg6HcQQPh_8xhL3NxbZ_AAA4s4OSzkNq-fK6cWZRzUZ311kYXK5GoVcbJ2NhACaBlHeQk3KbHq9q8Seh23St4BUAb5gldAOatZg0z-zAbH3rtpe4dQzDX2el9qcULf2ISqWOI3SeKjvfaUJpXIm236uTxd37IM7sgFqMnm_ifCubahFH56CM6a5hvw0LIOEGRubbIocYYZHTGZnf_SB78pSSB6S8h_ytHZKv3niaFr8fyFuUEVTLpE7Z-VHdr91U9kmjGyU5DhkjlG7N8fXHrmFWyX73rftbdCnCd_sWfbA69cN7mNeJukXN0-ib4LvgR0YfJY_MNdepmEEvOz3dsuG0hulDPvDgbftnw9yemGcK0Fpj49GQHiJdRh6J1S838A3rSCQ4cHk89N-cG8N7wSlonigmu4E-LarRbHzoMZ6s0R61SByVSI9JhQKepW8AX2QcZ4GwiI2yjMfM9JwoDhGkPpuecscq9jbPaF0k4qLK8iwpfkUBH5kfVqY0a40ICg-oloRuZ_mc0C2dF5SyJR-NPTJbY0w1vCyrQzWbWhQN81MldXiZ1joMYk2kcGiNQBWFO-PkS7_1STvPlEJxJ1PIhO6Ds4Tuj1L_NjPaeIz_hWS1Ns5LDq2rX0tN_4_rpo--fL7ffLuHzePjZvcRHj_ew_7h8-eH75_--QH2nz7ff4PHh7S8_fcH-Hr_5eHr44jhi8XOGo7OxRYwwcaxWEZG6E8z50x_joANGhy3svOjgEVQsWAogL128J_KQMycb7vI9r9p3-mMUn6qrl38t9m7ztNfKdGP5rbm_E9ObZT8izMb1TJC9ywzwfdLI9sPrFW8W07s9X5xZLHiHcKJWJdiVa7YBNdFtVyu5qtFtZg06znlAud8lhclXcyrQjBGT7NSzPPlal6tiolc05yW-aLI85Ku6CKr8FRQgbNTWa1wkVdklmPLpMriy3pmbD1Jr-nrqlxUy4liR1QufRNRqvG5_4CINDu_m9h1esE_htqRWR7PaPdqxUuvcP29uQwU81OfNbEWUXESrFr__PdGiuW_AQAA__-VJ0Iv">