<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 --- - pragma pack struct + volatile results in an unresolved external "atomic_load" when using the Microsoft Linker"
   href="https://llvm.org/bugs/show_bug.cgi?id=27843">27843</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>pragma pack struct + volatile results in an unresolved external "atomic_load" when using the Microsoft Linker
          </td>
        </tr>

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

        <tr>
          <th>Version</th>
          <td>3.8
          </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>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>llvmbugs@endgame.com
          </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>A reference to a struct that uses "volatile" in combination with "#pragma
pack()" will yield optimized IR that uses atomic_load, which yields an
unresolved external when using the Microsoft linker.  We were able to reproduce
this with Visual Studio 2010, 2012, and 2013 with the following sample program:

#pragma pack(push)
#pragma pack(1)
struct A {
   volatile int f0;
};
#pragma pack(pop)

static const struct A g_A = { 0xFECDL };

int main (int argc, char* argv[])
{
    int tmp = g_A.f0;
    return 0;
}

When compiled with "/Od" so the relevant code doesn't get optimized out, here's
the IR with "volatile":

define i32 @main(i32 %argc, i8** %argv) #0 {
entry:
  %retval = alloca i32, align 4
  %argv.addr = alloca i8**, align 8
  %argc.addr = alloca i32, align 4
  %tmp = alloca i32, align 4
  %atomic-temp = alloca i32, align 4
  store i32 0, i32* %retval, align 4
  store i8** %argv, i8*** %argv.addr, align 8
  store i32 %argc, i32* %argc.addr, align 4
  %0 = bitcast i32* %atomic-temp to i8*
  call void @__atomic_load(i64 4, i8* bitcast (%struct.A* @g_A to i8*), i8* %0,
i32 2)
  %atomic-load = load atomic volatile i32, i32* %atomic-temp acquire, align 4
  store i32 %atomic-load, i32* %tmp, align 4
  ret i32 0
}

And without "volatile":


define i32 @main(i32 %argc, i8** %argv) #0 {
entry:
  %retval = alloca i32, align 4
  %argv.addr = alloca i8**, align 8
  %argc.addr = alloca i32, align 4
  %tmp = alloca i32, align 4
  store i32 0, i32* %retval, align 4
  store i8** %argv, i8*** %argv.addr, align 8
  store i32 %argc, i32* %argc.addr, align 4
  %0 = load i32, i32* getelementptr inbounds (%struct.A, %struct.A* @g_A, i32
0, i32 0), align 1
  store i32 %0, i32* %tmp, align 4
  ret i32 0
}


If one removes the volatile keyword from the struct member, or removes the
pragma pack, the linking issue goes away. However, we believe the underlying
issue may be that the calling convention mentioned in
<a href="http://llvm.org/docs/Atomics.html#libcalls-atomic">http://llvm.org/docs/Atomics.html#libcalls-atomic</a> doesn't line up with how
Microsoft uses the atomic_load call, thus the linker can't resolve the correct
function.

Unsure if the fix should be to ensure the libcall to atomic_load isn't used, or
whether the convention should be fixed for builds on windows.</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>