From e27c6973ab116441bb5ccfdc4f2567a783693b9d Mon Sep 17 00:00:00 2001 From: "Keith W. Campbell" Date: Wed, 12 Jan 2022 16:59:10 -0500 Subject: [PATCH] Fix problems compiling with gcc 10 Use a flexible array for RegisterDependencyGroup._dependencies (only for gcc), and promote architecture-specific fields so they don't follow that array whose size is determined dynamically at runtime. Signed-off-by: Keith W. Campbell --- compiler/codegen/OMRRegisterDependency.hpp | 54 +++++++++++++++----- compiler/x/codegen/OMRRegisterDependency.hpp | 19 +++---- compiler/z/codegen/OMRRegisterDependency.hpp | 23 ++++----- 3 files changed, 59 insertions(+), 37 deletions(-) diff --git a/compiler/codegen/OMRRegisterDependency.hpp b/compiler/codegen/OMRRegisterDependency.hpp index ebf261078be..38500886a55 100644 --- a/compiler/codegen/OMRRegisterDependency.hpp +++ b/compiler/codegen/OMRRegisterDependency.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2019 IBM Corp. and others + * Copyright (c) 2000, 2022 IBM Corp. and others * * This program and the accompanying materials are made available under * the terms of the Eclipse Public License 2.0 which accompanies this @@ -33,8 +33,8 @@ #ifndef OMR_REGISTER_DEPENDENCY_GROUP_CONNECTOR #define OMR_REGISTER_DEPENDENCY_GROUP_CONNECTOR -namespace OMR { class RegisterDependencyGroup; } -namespace OMR { typedef OMR::RegisterDependencyGroup RegisterDependencyGroupConnector; } + namespace OMR { class RegisterDependencyGroup; } + namespace OMR { typedef OMR::RegisterDependencyGroup RegisterDependencyGroupConnector; } #endif #include "env/TRMemory.hpp" @@ -50,17 +50,25 @@ class OMR_EXTENSIBLE RegisterDependencyGroup TR_ALLOC_WITHOUT_NEW(TR_Memory::RegisterDependencyGroup) - RegisterDependencyGroup() {} + RegisterDependencyGroup() +#if defined(OMR_ARCH_S390) + : _numUses(0) +#elif defined(OMR_ARCH_X86) /* defined(OMR_ARCH_S390) */ + : _mayNeedToPopFPRegisters(false), _needToClearFPStack(false) +#elif defined(__GNUC__) && !defined(__clang__) /* defined(OMR_ARCH_S390) */ + : _unused('\0') +#endif /* defined(OMR_ARCH_S390) */ + {} TR::RegisterDependencyGroup *self(); void *operator new(size_t s, int32_t numDependencies, TR_Memory *m) { - if (numDependencies > NUM_DEFAULT_DEPENDENCIES) - { - s += (numDependencies - NUM_DEFAULT_DEPENDENCIES) * sizeof(TR::RegisterDependency); - } - + TR_ASSERT(numDependencies >= 0, "Number of dependencies must be non-negative"); + s += numDependencies * sizeof(TR::RegisterDependency); +#if defined(__clang__) || !defined(__GNUC__) + s -= NUM_DEFAULT_DEPENDENCIES * sizeof(TR::RegisterDependency); +#endif /* defined(__clang__) || !defined(__GNUC__) */ return m->allocateHeapMemory(s, TR_MemoryBase::RegisterDependencyGroup); } @@ -195,15 +203,37 @@ class OMR_EXTENSIBLE RegisterDependencyGroup protected: +#if defined(OMR_ARCH_S390) + int8_t _numUses; +#elif defined(OMR_ARCH_X86) /* defined(OMR_ARCH_S390) */ + bool _mayNeedToPopFPRegisters; + bool _needToClearFPStack; +#elif defined(__GNUC__) && !defined(__clang__) /* defined(OMR_ARCH_S390) */ + /* a flexible array cannot be the only member of a class */ + private: + char _unused; + protected: +#endif /* defined(OMR_ARCH_S390) */ + +#if defined(__GNUC__) && !defined(__clang__) + TR::RegisterDependency _dependencies[]; +#else /* defined(__GNUC__) && !defined(__clang__) */ + /* + * Only GCC appears to support extending a classs with a flexible array member, + * so, for other compilers, we declare the length to be 1 and adjust accordingly + * in the new operator. + */ + private: static const size_t NUM_DEFAULT_DEPENDENCIES = 1; - + protected: TR::RegisterDependency _dependencies[NUM_DEFAULT_DEPENDENCIES]; +#endif /* defined(__GNUC__) && !defined(__clang__) */ }; class RegisterDependencyConditions { protected: - RegisterDependencyConditions() {}; + RegisterDependencyConditions() {} public: TR_ALLOC(TR_Memory::RegisterDependencyConditions) @@ -382,4 +412,4 @@ class RegisterDependencyMap }; } -#endif +#endif /* OMR_REGISTER_DEPENDENCY_INCL */ diff --git a/compiler/x/codegen/OMRRegisterDependency.hpp b/compiler/x/codegen/OMRRegisterDependency.hpp index fc5f932789d..7cef3c278e2 100644 --- a/compiler/x/codegen/OMRRegisterDependency.hpp +++ b/compiler/x/codegen/OMRRegisterDependency.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2021 IBM Corp. and others + * Copyright (c) 2000, 2022 IBM Corp. and others * * This program and the accompanying materials are made available under * the terms of the Eclipse Public License 2.0 which accompanies this @@ -35,8 +35,8 @@ #ifndef OMR_REGISTER_DEPENDENCY_GROUP_CONNECTOR #define OMR_REGISTER_DEPENDENCY_GROUP_CONNECTOR -namespace OMR { namespace X86 { class RegisterDependencyGroup; } } -namespace OMR { typedef OMR::X86::RegisterDependencyGroup RegisterDependencyGroupConnector; } + namespace OMR { namespace X86 { class RegisterDependencyGroup; } } + namespace OMR { typedef OMR::X86::RegisterDependencyGroup RegisterDependencyGroupConnector; } #endif #include "compiler/codegen/OMRRegisterDependency.hpp" @@ -63,15 +63,9 @@ namespace X86 { class OMR_EXTENSIBLE RegisterDependencyGroup : public OMR::RegisterDependencyGroup { - bool _mayNeedToPopFPRegisters; - bool _needToClearFPStack; - public: - RegisterDependencyGroup() - : _mayNeedToPopFPRegisters(false), - _needToClearFPStack(false) - {} + RegisterDependencyGroup() : OMR::RegisterDependencyGroup() {} void setDependencyInfo(uint32_t index, TR::Register *vr, @@ -80,7 +74,6 @@ class OMR_EXTENSIBLE RegisterDependencyGroup : public OMR::RegisterDependencyGro uint8_t flag = UsesDependentRegister, bool isAssocRegDependency = false); - TR::RegisterDependency *findDependency(TR::Register *vr, uint32_t stop) { TR::RegisterDependency *result = NULL; @@ -285,7 +278,7 @@ class RegisterDependencyConditions: public OMR::RegisterDependencyConditions uint32_t numConditions, char *prefix, FILE *pOutFile); -#endif +#endif /* defined(DEBUG) || defined(PROD_WITH_ASSUMES) */ }; } @@ -298,4 +291,4 @@ class RegisterDependencyConditions: public OMR::RegisterDependencyConditions TR::RegisterDependencyConditions * generateRegisterDependencyConditions(TR::Node *, TR::CodeGenerator *, uint32_t = 0, List * = 0); TR::RegisterDependencyConditions * generateRegisterDependencyConditions(uint32_t, uint32_t, TR::CodeGenerator *); -#endif +#endif /* OMR_X86_REGISTER_DEPENDENCY_INCL */ diff --git a/compiler/z/codegen/OMRRegisterDependency.hpp b/compiler/z/codegen/OMRRegisterDependency.hpp index afa958625a5..215f99e5834 100644 --- a/compiler/z/codegen/OMRRegisterDependency.hpp +++ b/compiler/z/codegen/OMRRegisterDependency.hpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2020 IBM Corp. and others + * Copyright (c) 2000, 2022 IBM Corp. and others * * This program and the accompanying materials are made available under * the terms of the Eclipse Public License 2.0 which accompanies this @@ -73,7 +73,7 @@ class OMR_EXTENSIBLE RegisterDependencyGroup : public OMR::RegisterDependencyGro { public: - RegisterDependencyGroup() : _numUses(0) {} + RegisterDependencyGroup() : OMR::RegisterDependencyGroup() {} uint32_t genBitMapOfAssignableGPRs(TR::CodeGenerator *cg, uint32_t numberOfRegisters); @@ -91,7 +91,6 @@ class OMR_EXTENSIBLE RegisterDependencyGroup : public OMR::RegisterDependencyGro protected: - int8_t _numUses; }; class RegisterDependencyConditions: public OMR::RegisterDependencyConditions @@ -124,8 +123,8 @@ class RegisterDependencyConditions: public OMR::RegisterDependencyConditions TR::CodeGenerator *cg); RegisterDependencyConditions(TR::RegisterDependencyGroup *_preConditions, - TR::RegisterDependencyGroup *_postConditions, - uint16_t numPreConds, uint16_t numPostConds, TR::CodeGenerator *cg) + TR::RegisterDependencyGroup *_postConditions, + uint16_t numPreConds, uint16_t numPostConds, TR::CodeGenerator *cg) : _preConditions(_preConditions), _postConditions(_postConditions), _numPreConditions(numPreConds), @@ -133,7 +132,7 @@ class RegisterDependencyConditions: public OMR::RegisterDependencyConditions _numPostConditions(numPostConds), _addCursorForPost(numPostConds), _isUsed(false), - _cg(cg) + _cg(cg) {} RegisterDependencyConditions() @@ -144,7 +143,7 @@ class RegisterDependencyConditions: public OMR::RegisterDependencyConditions _numPostConditions(0), _addCursorForPost(0), _isUsed(false), - _cg(NULL) + _cg(NULL) {} //VMThread work: implicitly add an extra post condition for a possible vm thread @@ -269,10 +268,10 @@ class RegisterDependencyConditions: public OMR::RegisterDependencyConditions bool addPreConditionIfNotAlreadyInserted(TR::RegisterDependency *regDep); bool addPreConditionIfNotAlreadyInserted(TR::Register *vr, TR::RealRegister::RegNum rr, - uint8_t flag = ReferencesDependentRegister); + uint8_t flag = ReferencesDependentRegister); bool addPreConditionIfNotAlreadyInserted(TR::Register *vr, TR::RealRegister::RegDep rr, - uint8_t flag = ReferencesDependentRegister); + uint8_t flag = ReferencesDependentRegister); /** * @brief Adds the provided \c TR::RegisterDependency to the set of postconditions if it @@ -286,10 +285,10 @@ class RegisterDependencyConditions: public OMR::RegisterDependencyConditions bool addPostConditionIfNotAlreadyInserted(TR::Register *vr, TR::RealRegister::RegNum rr, - uint8_t flag = ReferencesDependentRegister); + uint8_t flag = ReferencesDependentRegister); bool addPostConditionIfNotAlreadyInserted(TR::Register *vr, TR::RealRegister::RegDep rr, - uint8_t flag = ReferencesDependentRegister); + uint8_t flag = ReferencesDependentRegister); TR::RegisterDependencyConditions *clone(TR::CodeGenerator *cg, int32_t additionalRegDeps); @@ -335,4 +334,4 @@ class RegisterDependencyConditions: public OMR::RegisterDependencyConditions } } -#endif +#endif /* OMR_Z_REGISTER_DEPENDENCY_INCL */