<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 - clang-cl generates more static initializers than VC++ does"
   href="https://bugs.llvm.org/show_bug.cgi?id=39712">39712</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>clang-cl generates more static initializers than VC++ does
          </td>
        </tr>

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

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

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

        <tr>
          <th>OS</th>
          <td>Windows NT
          </td>
        </tr>

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

        <tr>
          <th>Severity</th>
          <td>enhancement
          </td>
        </tr>

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

        <tr>
          <th>Component</th>
          <td>C++
          </td>
        </tr>

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

        <tr>
          <th>Reporter</th>
          <td>brucedawson@chromium.org
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>blitzrakete@gmail.com, dgregor@apple.com, erik.pilkington@gmail.com, llvm-bugs@lists.llvm.org, richard-llvm@metafoo.co.uk
          </td>
        </tr></table>
      <p>
        <div>
        <pre>This is an example of code that VC++ optimizes better than clang-cl. With VC++
there is no static initializer whereas with clang there is:

struct my_id {
  my_id() : v_(0) {}
  int v_;
};
template <typename T> struct Foo {
  static my_id id;
};
template <typename T> my_id Foo<T>::id;
int main() { Foo<char>::id.v_++; }

So, this is a missing optimization in LLVM. LLVM's globalopt pass is supposed
to handle this, but it gives up too easily. The COMDAT scheme that Microsoft
uses is clever and allows the compiler to optimize this to static
initialization without changing the ABI.

This was reported in crbug.com/782027 and it leads to eleven static
initializers in clang-cl builds of Chrome (chrome.exe, chrome.dll, and
chrome_child.dll) that are not present in VC++ builds, coming from the VC++ STL
header files.</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>