<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">