<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 - asm labels and overloading"
   href="https://bugs.llvm.org/show_bug.cgi?id=41834">41834</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>asm labels and overloading
          </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>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>-New Bugs
          </td>
        </tr>

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

        <tr>
          <th>Reporter</th>
          <td>aaron@aaronballman.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>htmldeveloper@gmail.com, llvm-bugs@lists.llvm.org, neeilans@live.com, richard-llvm@metafoo.co.uk
          </td>
        </tr></table>
      <p>
        <div>
        <pre>It seems that asm labels do not play well with __attribute__((overloadable)) in
that only a single function definition is emit when there are two functions
with the same asm label. e.g.,

#define _TG_ATTRS __attribute__((__overloadable__))

static short _TG_ATTRS __tg_acos(short __x) asm("foo");
static short _TG_ATTRS __tg_acos(short __x) {
  // overflow
  short ret = 3;
  return ret / __x;
}

static int _TG_ATTRS __tg_acos(int __x) asm("foo");
static int _TG_ATTRS __tg_acos(int __x) {
  // no overflow
  int ret = 1999;
  return ret + __x;
}

void call_short() {
  short k = 0;
  __tg_acos(k);
}

In this code, only one function named "foo" is emitted, so the overloading is
silently ignored. Instead, the last definition with the label name is what gets
emitted. See <a href="https://godbolt.org/z/U8CyMw">https://godbolt.org/z/U8CyMw</a> for details.

I'm not certain what should happen here. The user specified an assembly name
which we should try to honor, but then we cannot honor the overloadable
attribute because there is no way to get the proper name mangling for the
function. We should either ignore the overloadable attribute or the asm label
and then diagnose what we're ignoring so the user has a better chance of
understanding what's going on.</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>