From 821887202488f52f24a1b75fa8fbde62a9291d5d Mon Sep 17 00:00:00 2001 From: Matthias Baesken Date: Tue, 5 Feb 2019 17:40:15 +0100 Subject: [PATCH] 8218136: minor hotspot adjustments for xlclang++ from xlc16 on AIX Reviewed-by: dholmes, goetz, ihse --- src/hotspot/os/aix/porting_aix.cpp | 12 +++- .../aix_ppc/prefetch_aix_ppc.inline.hpp | 2 +- src/hotspot/share/runtime/arguments.cpp | 4 +- src/hotspot/share/runtime/arguments.hpp | 12 ++++ .../share/utilities/globalDefinitions_xlc.hpp | 65 +++++++------------ 5 files changed, 51 insertions(+), 44 deletions(-) diff --git a/src/hotspot/os/aix/porting_aix.cpp b/src/hotspot/os/aix/porting_aix.cpp index f67606bda5e..a6430007235 100644 --- a/src/hotspot/os/aix/porting_aix.cpp +++ b/src/hotspot/os/aix/porting_aix.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013 SAP SE. All rights reserved. + * Copyright (c) 2012, 2019 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,7 +34,15 @@ #include "utilities/align.hpp" #include "utilities/debug.hpp" +// distinguish old xlc and xlclang++, where +// is suggested but not found in GA release (might come with a fix) +#if defined(__clang__) +#define DISABLE_DEMANGLE +// #include +#else #include +#endif + #include #include #include @@ -237,6 +245,7 @@ bool AixSymbols::get_function_name ( p_name[i] = '\0'; // If it is a C++ name, try and demangle it using the Demangle interface (see demangle.h). +#ifndef DISABLE_DEMANGLE if (demangle) { char* rest; Name* const name = Demangle(p_name, rest); @@ -249,6 +258,7 @@ bool AixSymbols::get_function_name ( delete name; } } +#endif } else { strncpy(p_name, "", namelen-1); p_name[namelen-1] = '\0'; diff --git a/src/hotspot/os_cpu/aix_ppc/prefetch_aix_ppc.inline.hpp b/src/hotspot/os_cpu/aix_ppc/prefetch_aix_ppc.inline.hpp index bcc42836bde..73799524140 100644 --- a/src/hotspot/os_cpu/aix_ppc/prefetch_aix_ppc.inline.hpp +++ b/src/hotspot/os_cpu/aix_ppc/prefetch_aix_ppc.inline.hpp @@ -43,7 +43,7 @@ inline void Prefetch::read(void *loc, intx interval) { } inline void Prefetch::write(void *loc, intx interval) { -#if !defined(USE_XLC_PREFETCH_WRITE_BUILTIN) +#if !defined(USE_XLC_BUILTINS) __asm__ __volatile__ ( " dcbtst 0, %0 \n" : diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp index c1092e1a1a8..792a0a97dcd 100644 --- a/src/hotspot/share/runtime/arguments.cpp +++ b/src/hotspot/share/runtime/arguments.cpp @@ -3794,8 +3794,8 @@ jint Arguments::parse(const JavaVMInitArgs* initial_cmd_args) { #endif #if defined(AIX) - UNSUPPORTED_OPTION(AllocateHeapAt); - UNSUPPORTED_OPTION(AllocateOldGenAt); + UNSUPPORTED_OPTION_NULL(AllocateHeapAt); + UNSUPPORTED_OPTION_NULL(AllocateOldGenAt); #endif #ifndef PRODUCT diff --git a/src/hotspot/share/runtime/arguments.hpp b/src/hotspot/share/runtime/arguments.hpp index 4a27ca97f86..e8e10d32ea9 100644 --- a/src/hotspot/share/runtime/arguments.hpp +++ b/src/hotspot/share/runtime/arguments.hpp @@ -663,4 +663,16 @@ do { \ } \ } while(0) +// similar to UNSUPPORTED_OPTION but sets flag to NULL +#define UNSUPPORTED_OPTION_NULL(opt) \ +do { \ + if (opt) { \ + if (FLAG_IS_CMDLINE(opt)) { \ + warning("-XX flag " #opt " not supported in this VM"); \ + } \ + FLAG_SET_DEFAULT(opt, NULL); \ + } \ +} while(0) + + #endif // SHARE_RUNTIME_ARGUMENTS_HPP diff --git a/src/hotspot/share/utilities/globalDefinitions_xlc.hpp b/src/hotspot/share/utilities/globalDefinitions_xlc.hpp index 511f4c4f269..80b0ed1f110 100644 --- a/src/hotspot/share/utilities/globalDefinitions_xlc.hpp +++ b/src/hotspot/share/utilities/globalDefinitions_xlc.hpp @@ -1,6 +1,6 @@ /* * Copyright (c) 1998, 2019, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2012, 2017 SAP SE. All rights reserved. + * Copyright (c) 2012, 2019 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -51,51 +51,43 @@ #include +// __IBMCPP__ is not defined any more with xlclang++ +#ifdef __IBMCPP__ +#if __IBMCPP__ < 1200 +#error "xlc < 12 not supported" +#endif +#endif + +#ifndef _AIX +#error "missing AIX-specific definition _AIX" +#endif + // Use XLC compiler builtins instead of inline assembler #define USE_XLC_BUILTINS + #ifdef USE_XLC_BUILTINS #include - #if __IBMCPP__ < 1000 - // the funtion prototype for __dcbtst(void *) is missing in XLC V8.0 - // I could compile a little test, where I provided the prototype. - // The generated code was correct there. This is the prototype: - // extern "builtin" void __dcbtst (void *); - // For now we don't make use of it when compiling with XLC V8.0 - #else - // __IBMCPP__ >= 1000 - // XLC V10 provides the prototype for __dcbtst (void *); - #define USE_XLC_PREFETCH_WRITE_BUILTIN - #endif +// XLC V10 and higher provide the prototype for __dcbtst (void *); #endif // USE_XLC_BUILTINS // NULL vs NULL_WORD: -// On Linux NULL is defined as a special type '__null'. Assigning __null to -// integer variable will cause gcc warning. Use NULL_WORD in places where a -// pointer is stored as integer value. On some platforms, sizeof(intptr_t) > -// sizeof(void*), so here we want something which is integer type, but has the -// same size as a pointer. -#ifdef __GNUC__ - #error XLC and __GNUC__? -#else - #define NULL_WORD NULL -#endif +// Some platform/tool-chain combinations can't assign NULL to an integer +// type so we define NULL_WORD to use in those contexts. For xlc they are the same. +#define NULL_WORD NULL // AIX also needs a 64 bit NULL to work as a null address pointer. // Most system includes on AIX would define it as an int 0 if not already defined with one // exception: /usr/include/dirent.h will unconditionally redefine NULL to int 0 again. // In this case you need to copy the following defines to a position after #include -// (see jmv_aix.h). -#ifdef AIX - #include - #ifdef _LP64 - #undef NULL - #define NULL 0L - #else - #ifndef NULL - #define NULL 0 - #endif +#include +#ifdef _LP64 + #undef NULL + #define NULL 0L +#else + #ifndef NULL + #define NULL 0 #endif -#endif // AIX +#endif // Compiler-specific primitive types // All defs of int (uint16_6 etc) are defined in AIX' /usr/include/stdint.h @@ -108,21 +100,14 @@ typedef uint32_t juint; typedef uint64_t julong; // checking for nanness -#ifdef AIX inline int g_isnan(float f) { return isnan(f); } inline int g_isnan(double f) { return isnan(f); } -#else -#error "missing platform-specific definition here" -#endif // Checking for finiteness - inline int g_isfinite(jfloat f) { return finite(f); } inline int g_isfinite(jdouble f) { return finite(f); } - // Wide characters - inline int wcslen(const jchar* x) { return wcslen((const wchar_t*)x); }