<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/60096>60096</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            generated code of inline assembly modifier 'P' with -fPIE is different between gcc and clang
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          bysui
      </td>
    </tr>
</table>

<pre>
    The output assembly code of following code is different between gcc and clang with `-c -O2 -fPIE`:
```C
#include <stdio.h>

#pragma GCC visibility push(hidden)

#define current(var) ({\
        typeof(var) pfo_ret__;\
        asm("movq %%gs:%P1, %0\n"\
            : "=r"(pfo_ret__)\
            : "p" (&(var))\
        );\
        pfo_ret__;\
})


struct foo {
        int field1;
        int field2;
};

extern struct foo a;

int test ()
{
        int total;

        total = current(a).field1 + current(a).field2;
        printf ("total: %d\n", total);

        return 0;
}
```

The expected assembly code should be like this:
```asm
movq %gs:a(%rip), %rax
```

Clang could generate right code but gcc generates absolute reference:
```asm
movq %gs:a, %rax
```

It seems that modifier `'P'` is not compatible with `PIE` in gcc, so I try to use modifier `'a'`
and it can generate right code. But modifier `'a'` leads to compilation error in clang.
![image](https://user-images.githubusercontent.com/5154278/212828551-56464ec1-0030-4b53-978c-030ef601f443.png)

My question is why the generated code of modifier 'P' is different between gcc and clang? 
Which one is right? 

Thanks.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVU1vszgQ_jXOZZQIxgHCIYc2ebPqYbU9rLTHysAA3tfYvLZpm3-_skmaj3ZXXSmCMJ_PjGceC-dkp4m2LHtk2X4hJt8bu62ObpKLyjTH7Z89gZn8OHkQztFQqSPUpiEwLbRGKfMmdTdLpINGti1Z0h4q8m9EGrq6BqEbqJXQHbxJ3wPLk2UNyz8Qlu3z0w-WJ4w_sGTPkofwP_52p2_kUtdqaggY3znfSLPqGf9x0p5tRiu6QcBvux28SicrqaQ_wji5nuGml01DmmF559RQKzVBPdkAmOHmVViGJTDcsOKRZWcISemPI5n2YjG25sWSf3lh_MZOuCE4Iw7m9RcwzBhmnQvFYfacMtwFWcKynWaI144AAIw_QBDzvQ0v3FyyYPkvxiNDjHgx_0B3Zx0-b1F-jb7Y33coPp23U-2hNQZCU84xpPbQSlJNGoJ8kuJFWuyvLMKT3j1ZDVeBxZ1FCOPJ-bmyM6i77N54oe4cw1EFMTC-vzpXwbBczWiB4eOXGryuY7RS-3ZOj6dEod9Zcz473J0AzN29xWDJT1ZDctOE2_G-9ggbRu8j1Z6aux1zvZlUAxWBkj8JfC_d51UJUxcl56mLIyci-szKMc5EHD0r3v8Dxy5uaB0zdqTJCk9gZdf7GUw1-bjNZ50DUTmjpmBFcetr-h_ovoHoyYMjGhz4XngYTCNbSTbwB8PimWHB8iSwjjYB4jAKLytFHyQzcwvISEIhoTPwBN4ewRuYHN1HFHPEOXfgLOmhFvqrZqzgcfqE6OQPikTjQo6ASSrhpdFA1hobsEQiXJ1ZKGXZoxxERyzbB67yfpwJ48DwMDmyy6h1q076fqqCpDbak_ar2gwMD1marbHYMDxgihvcZFm6zPJ1vqY6XSYJT5brKuPLstjUy4Qn1OZJ2q7XfDXq7m7jfz_Cr4lchCsdvPVH8D19lN988P6l7vkYvsH8jB9gzvJXL-sejI73RezoRXdeCKF_utWi2fKm5KVY0DbNC17yDV_ni36LVIiKC7Ep8qoteYZErSAqizLP8gqLhdxigjxJ0yLJM8R81eS8SStqON8UNbXI1gkNQqqVUq_DythuIZ2baJsnSZkvlKhIufOVaLfBaFlNnWPrREnn3cXNS69o-7lDUqtwt3xs86eOxRmN1983mreYrNrejsY8DqcZCHBOr-Vozd9Ue4aHWJJjeIhV_RMAAP__fWNPFg">