RFR(m): 8220351: Cross-modifying code

Florian Weimer fweimer at redhat.com
Wed Jun 19 17:15:41 UTC 2019


* Florian Weimer:

> * Martin Doerr:
>
>> Not sure if the inline assembler code on x86 necessarily needs a "clobber memory" effect.
>> I don't know what a C++ compiler is allowed to do if it doesn't know that the code has some kind of memory effect.
>>
>> For ebx...edx, you could also use clobber if you want to make it shorter.
>> E.g. with "+a" to use eax as input and output:
>>   int idx = 0;
>>   __asm__ volatile ("cpuid " : "+a" (idx) : : "ebx", "ecx", "edx", "memory");
>
> ebx clobbers are not supported on older GCC versions.
> src/hotspot/os_cpu/linux_x86/orderAccess_linux_x86.hpp currently says
> this:
>
> // Compiler version last used for testing: gcc 4.8.2
>
> But this is blatantly not true because GCC 4.8 cannot spill ebx in PIC
> mode.

I got this patch from Andrew Haley, and the build works again with GCC
4.8.5 (the system compiler on Red Hat Enterprise Linux 7):

diff -r d7da94e6c169 src/hotspot/os_cpu/linux_x86/orderAccess_linux_x86.hpp
--- a/src/hotspot/os_cpu/linux_x86/orderAccess_linux_x86.hpp    Tue Jun 18 16:15:15 2019 +0100
+++ b/src/hotspot/os_cpu/linux_x86/orderAccess_linux_x86.hpp    Wed Jun 19 17:52:26 2019 +0100
@@ -57,7 +57,11 @@

 inline void OrderAccess::cross_modify_fence() {
   int idx = 0;
+#ifdef AMD64
   __asm__ volatile ("cpuid " : "+a" (idx) : : "ebx", "ecx", "edx", "memory");
+#else
+  __asm__ volatile ("xchg %%esi, %%ebx; cpuid; xchg %%esi, %%ebx " : "+a" (idx) : : "esi", "ecx", "edx", "memory");
+#endif
 }

 template<>

GCC can spill %esi without problems since forever, so this should work
everywhere.

Thanks,
Florian


More information about the hotspot-dev mailing list