https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120393

            Bug ID: 120393
           Summary: Link-time optimization vs. Os/O2; baremetal memcpy
                    elimination
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jas...@chili-chips.com
  Target Milestone: ---

Use of `-flto' option generates an error for initialized char string variables.
Here is an example:

   char test[] = "Hello world!\r\n";

   for (i = 0; i < 14; i++) { 
      uart_send_char(csr, test[i]);
   }

  /usr/lib/gcc/riscv64-unknown-elf/13.2.0/../../../riscv64-unknown-elf/bin/ld:
/tmp/ccerPl2Y.ltrans0.ltrans.o: in function `main':
<artificial>:(.text.startup+0x314): undefined reference to `memcpy'

The error comes from premature optimization, where linker concludes that the
`memcpy' function is not used in the source code, and eliminates it. The
workaround is to accompany the `memcpy' declaration with __attribute__((used)),
such as:

    __attribute__((used)) void *memcpy(void *dest, const void *src, size_t
len);

Hence the questions:

 Q1) why does `-flto' option make the compile flow optimize out `memcpy'
function, which was actually inserted by the flow, to copy the initialized
strings?

Q2) can other functions outside of `main.cpp', including calls from boot CRT
Assembly code, be similarly eliminated by `-flto'?

This issue is uncovered in Wireguard-FPGA project, where tracked under:
   https://github.com/chili-chips-ba/wireguard-fpga/issues/17

It seems related to:
   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119424

Reply via email to