<html>
    <head>
      <base href="http://llvm.org/bugs/" />
    </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 --- - "global constructors keyed to..." function does not respect frame pointer settings"
   href="http://llvm.org/bugs/show_bug.cgi?id=21811">21811</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>"global constructors keyed to..." function does not respect frame pointer settings
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>clang
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>unspecified
          </td>
        </tr>

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

        <tr>
          <th>OS</th>
          <td>Linux
          </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>unassignedclangbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>dario.domizioli@gmail.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvmbugs@cs.uiuc.edu
          </td>
        </tr>

        <tr>
          <th>Classification</th>
          <td>Unclassified
          </td>
        </tr></table>
      <p>
        <div>
        <pre>Created <span class=""><a href="attachment.cgi?id=13452" name="attach_13452" title="Reproducible - see description for how to compile and detect the issue">attachment 13452</a> <a href="attachment.cgi?id=13452&action=edit" title="Reproducible - see description for how to compile and detect the issue">[details]</a></span>
Reproducible - see description for how to compile and detect the issue

I have found an instance where the global initializers function for the
compilation unit (the "global constructors keyed to..." function) does not
respect the settings for whether to eliminate the frame pointer.

For example, compile the attached code with:
    clang -S -emit-llvm -O2 -fno-frame-pointer-elim <file>

I am using the "x86_64-unknown-linux" triple, and clang r223927 (but as far as
I can tell, Clang 3.4 and 3.5 show the same behaviour).

If you look at the .ll file, you should notice that main() is marked with
attributes #0 which include settings for the frame pointer elimination; however
the global constructors function is just created with attributes #2 which do
NOT include said settings.

I think this causes the global constructors function to be compiled with
different settings than the ones provided by the user. Specifically, the frame
pointer will be eliminated. On x86_64 this is detectable from looking at the
usage of %rbp.

If a lot of constructors are inlined, the register pressure will cause the
frame pointer register to be reused as a general purpose register. It will then
be stomped and (if there are later calls to constructors with a deep call tree)
what appears to be the initial frame can potentially be a value that has
nothing to do with frames.

Strangely, if we pass both -fno-frame-pointer-elim and
-mno-omit-leaf-frame-pointer then the global construtors function does have a
frame pointer. However, that function is not a leaf because it definitely calls
__cxa_atexit() to register the array dtors, so this shouldn't make a
difference.

So there may even be two issues here...</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>