<html>
    <head>
      <base href="https://bugs.llvm.org/">
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - GCC 4.9.2 and later miscompiles LLVM"
   href="https://bugs.llvm.org/show_bug.cgi?id=37701">37701</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>GCC 4.9.2 and later miscompiles LLVM
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>new-bugs
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>trunk
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>All
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>normal
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>new bugs
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>simon.dardis@mips.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvm-bugs@lists.llvm.org
          </td>
        </tr></table>
      <p>
        <div>
        <pre>LLVM since r330024 has been miscompiled by GCC 4.9.2 or later for MIPS. The
issue occurs when LLVM is compiled with PIC and optimizations (01+).

The problem is that GCC's implementation of shrink wrapping can move the
prologue past a branch instruction which is later expanded into a long jump. To
fetch the address of the target, the long branch sequence fetches the GOT
pointer from it's spill slot on the stack to load the address of the indirect
branch target. However the prologue is responsible for spilling the GOT pointer
to the stack.

This results in a indirect jump with to an uninitialized value, detectable with
valgrind. Some setups may somehow get the correct behaviour, others will get
incoherent stack traces upon crashing. At this point in time, it appears to
affect only the AArch64 backend for LLVM with a MIPS host.

There are number of workarounds such as compiling at -O0, disabling PIC or
disabling shrink-wrapping (-fno-shrink-wrap).

This issue affects multiple versions of GCC from 4.9.2 onwards. GCC bug filed
as <a href="https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86069">https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86069</a></pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>