<html>
    <head>
      <base href="https://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 --- - [ms] Make fewer assumptions about alignment for declspec(align)"
   href="https://llvm.org/bugs/show_bug.cgi?id=25779">25779</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>[ms] Make fewer assumptions about alignment for declspec(align)
          </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>LLVM Codegen
          </td>
        </tr>

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

        <tr>
          <th>Reporter</th>
          <td>nicolasweber@gmx.de
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvm-bugs@lists.llvm.org
          </td>
        </tr>

        <tr>
          <th>Classification</th>
          <td>Unclassified
          </td>
        </tr></table>
      <p>
        <div>
        <pre>__declspec(align) and __attribute__((__aligned__)) have slightly different
semantics: The former tells the compiler "try to align this type when you
allocate memory for it yourself, i.e. for static and automatic variables, and
if you did ensure alignment yourself you're free to exploit this". The latter
tells the compiler "when you see an instance of this type anywhere, no matter
if on stack or heap, you can assume that it will be aligned".

MSDN says "The compiler does not guarantee or attempt to preserve the alignment
attribute of data during a copy or data transform operation. For example,
memcpy
can copy a struct declared with __declspec(align(#)) to any location. Note that
ordinary allocators—for example, malloc, C++ operator new, and the Win32
allocators—return memory that is usually not sufficiently aligned for
__declspec(align(#)) structures or arrays of structures. [...] This type now
has
a 32-byte alignment attribute. This means that all static and automatic
instances start on a 32-byte boundary."


Currently, in clang-cl declspec(align) has the __attribute__((__aligned__))
semantics. We should let it have the semantics described on MSDN instead.</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>