RFR (small) 6518907: purge IA64 platform-specific ifdefs in source code

Christian Thalinger christian.thalinger at oracle.com
Wed Nov 28 10:11:43 PST 2012


That's what I expected.  I just double checked.

-- Chris

On Nov 28, 2012, at 12:06 AM, "Lindenmaier, Goetz" <goetz.lindenmaier at sap.com> wrote:

> Hi Chris,
> 
> Yes!
> And it's used a lot, especially in the generated assembler.
> 
> Best regards,
>  Goetz.
> 
> 
> 
> -----Original Message-----
> From: Christian Thalinger [mailto:christian.thalinger at oracle.com] 
> Sent: Mittwoch, 28. November 2012 01:13
> To: Lindenmaier, Goetz
> Cc: Morris Meyer; hotspot-dev at openjdk.java.net
> Subject: Re: RFR (small) 6518907: purge IA64 platform-specific ifdefs in source code
> 
> Quick question:  Do you have a non-empty implementation for CodeBuffer::flush_bundle on IA64?
> 
> -- Chris
> 
> On Nov 8, 2012, at 12:25 AM, "Lindenmaier, Goetz" <goetz.lindenmaier at sap.com> wrote:
> 
>> Hi Morris,
>> 
>> 
>> 
>> I had a look at your change.  As you know we maintain a port for IA64.
>> 
>> We basically use all the IA64 specific code, although some of the defines
>> 
>> are obviously superfluous.
>> 
>> The changes are not that essential that removing them would cause us
>> 
>> huge problems, but nevertheless we would prefer if most of them stay
>> 
>> in the code to reduce our deviation from your code.
>> 
>> 
>> 
>> In more detail:
>> 
>> 
>> 
>> Code to remove
>> 
>> =============
>> 
>> 
>> 
>> We do not use the agent on ia64, so we don't care about
>> 
>> agent/src/os/linux/LinuxDebuggerLocal.c
>> 
>> agent/src/os/linux/libproc.h
>> 
>> agent/src/os/win32/windbg/sawindbg.cpp
>> 
>> 
>> 
>> We don't need the code here:
>> 
>> src/os/bsd/vm/os_bsd.cpp
>> 
>> 
>> 
>> Here we removed the #define ourselves:
>> 
>> src/share/vm/interpreter/bytecodeInterpreter.cpp
>> 
>> src/share/vm/runtime/sharedRuntime.cpp
>> 
>> src/share/vm/runtime/synchronizer.cpp
>> 
>> 
>> 
>> Further you can remove
>> 
>> src/share/vm/runtime/vframeArray.cpp
>> 
>> 
>> 
>> We can easily work around need_register_stack_bang(), and as it's rather platform
>> 
>> dependent, just remove it in
>> 
>> src/share/vm/opto/compile.hpp
>> 
>> src/share/vm/opto/output.cpp
>> 
>> 
>> 
>> 
>> 
>> Code to keep
>> 
>> ===========
>> 
>> 
>> 
>> This is basic platform support, so keep it please:
>> 
>> src/share/vm/runtime/vm_version.cpp
>> 
>> src/share/vm/utilities/macros.hpp
>> 
>> 
>> 
>> Keep this:
>> 
>> src/share/vm/prims/forte.cpp
>> 
>> 
>> 
>> Don't care:
>> 
>> src/share/vm/runtime/os.cpp
>> 
>> We extended the code at this place to cover more cases, see below.
>> 
>> Therefore we don't care about the fix in openJDK.
>> 
>> Note that our code is also used on AMD64:
>> 
>> 
>> 
>> // Looks like all platforms except IA64 can use the same function to check
>> 
>> // if C stack is walkable beyond current frame. The check for fp() is not
>> 
>> // necessary on Sparc, but it's harmless.
>> 
>> bool os::is_first_C_frame(frame* fr) {
>> 
>> #if defined(IA64) && !defined(_WIN32)
>> 
>> // On IA64 we have to check if the callers bsp is still valid
>> 
>> // (i.e. within the register stack bounds).
>> 
>> // Notice: this only works for threads created by the VM and only if
>> 
>> // we walk the current stack!!! If we want to be able to walk
>> 
>> // arbitrary other threads, we'll have to somehow store the thread
>> 
>> // object in the frame.
>> 
>> Thread *thread = Thread::current();
>> 
>> if ((address)fr->fp() <= thread->register_stack_base() HPUX_ONLY(+ 0x0) LINUX_ONLY(+ 0x50)) {
>> 
>>   // This check is a little hacky, because on Linux the frist C
>> 
>>   // frame's ('start_thread') register stack frame starts at
>> 
>>   // "register_stack_base + 0x48" while on HPUX, the first C frame's
>> 
>>   // ('__pthread_bound_body') register stack frame seems to really
>> 
>>   // start at "register_stack_base".
>> 
>>   return true;
>> 
>> } else {
>> 
>>   return false;
>> 
>> }
>> 
>> // On Windows AMD64 link() does not work as there's no back link on the stack.
>> 
>> #elif (defined(IA64) || defined(AMD64)) && defined(_WIN32)
>> 
>> return true;
>> 
>> #else
>> 
>> // Load up sp, fp, sender sp and sender fp, check for reasonable values.
>> 
>> // Check usp first, because if that's bad the other accessors may fault
>> 
>> // on some architectures.  Ditto ufp second, etc.
>> 
>> uintptr_t fp_align_mask = (uintptr_t)(sizeof(address)-1);
>> 
>> 
>> 
>> 
>> 
>> The extension of the frame_slots in
>> 
>> src/share/vm/opto/output.cpp
>> 
>> is only needed for the _zap_dead_*_locals stubs. But better keep it.
>> 
>> 
>> 
>> We use most of the code in os_linux.cpp as is, please keep it.
>> 
>> src/os/linux/vm/os_linux.cpp
>> 
>> 
>> 
>> There are two patches where you could improve the code:
>> 
>> 
>> 
>> You could use IA64_ONLY(* 2) here:
>> 
>> 
>> 
>> @@ -1174,12 +1170,7 @@
>> 
>>  //   for initial thread if its stack size exceeds 6M. Cap it at 2M,
>> 
>>  //   in case other parts in glibc still assumes 2M max stack size.
>> 
>>  // FIXME: alt signal stack is gone, maybe we can relax this constraint?
>> 
>> -#ifndef IA64
>> 
>>  if (stack_size > 2 * K * K) stack_size = 2 * K * K;
>> 
>> -#else
>> 
>> -  // Problem still exists RH7.2 (IA64 anyway) but 2MB is a little small
>> 
>> -  if (stack_size > 4 * K * K) stack_size = 4 * K * K;
>> 
>> -#endif
>> 
>> 
>> 
>>  // Try to figure out where the stack base (top) is. This is harder.
>> 
>>  //
>> 
>> 
>> 
>> You can apply this patch, instead I implemented the two functions empty
>> 
>> in the platform file.
>> 
>> 
>> 
>> @@ -4385,16 +4373,12 @@
>> 
>>   if (is_NPTL()) {
>> 
>>      return pthread_cond_timedwait(_cond, _mutex, _abstime);
>> 
>>   } else {
>> 
>> -#ifndef IA64
>> 
>>      // 6292965: LinuxThreads pthread_cond_timedwait() resets FPU control
>> 
>>      // word back to default 64bit precision if condvar is signaled. Java
>> 
>>      // wants 53bit precision.  Save and restore current value.
>> 
>>      int fpu = get_fpu_control_word();
>> 
>> -#endif // IA64
>> 
>>      int status = pthread_cond_timedwait(_cond, _mutex, _abstime);
>> 
>> -#ifndef IA64
>> 
>>      set_fpu_control_word(fpu);
>> 
>> -#endif // IA64
>> 
>>      return status;
>> 
>>   }
>> 
>> }
>> 
>> 
>> 
>> We use all of the #defines/#ifdefs here:
>> 
>> src/os/windows/vm/os_windows.cpp
>> 
>> But we changed the IA64 specific code a lot.
>> 
>> 
>> 
>> It's unclear whether this change is needed:
>> 
>> src/share/vm/oops/oop.inline.hpp
>> 
>> but to avoid a regression we would like to keep it. Maybe it
>> 
>> would be better to protect the change by
>> 
>> #if defined(IA64) && defined(_WIN32)
>> 
>> as it's done at other shared code locations.
>> 
>> 
>> 
>> Best regards,
>> 
>> Goetz
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> -----Original Message-----
>> From: Volker Simonis [mailto:volker.simonis at gmail.com]
>> Sent: Montag, 5. November 2012 11:25
>> To: Morris Meyer
>> Cc: Lindenmaier, Goetz
>> Subject: Re: RFR (small) 6518907: purge IA64 platform-specific ifdefs in source code
>> 
>> 
>> 
>> Hi Morris,
>> 
>> 
>> 
>> we had a long weekend last week because last Thursday was public
>> 
>> holiday in Germany, but my colleague Goetz is currently looking at the
>> 
>> change and will come back to you.
>> 
>> 
>> 
>> Thank you and best regards,
>> 
>> Volker
>> 
>> 
>> 
>> On Fri, Nov 2, 2012 at 10:42 PM, Morris Meyer <morris.meyer at oracle.com<mailto:morris.meyer at oracle.com>> wrote:
>> 
>>> Volker,
>> 
>> 
>>> Have you had a chance to review my changes for this bug?
>> 
>> 
>>> Thanks in advance,
>> 
>> 
>>>       --morris
> 


More information about the hotspot-dev mailing list