Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

8276563: Undefined Behaviour in class Assembler #6280

Closed
wants to merge 14 commits into from
6 changes: 3 additions & 3 deletions src/hotspot/cpu/aarch64/register_aarch64.cpp
Original file line number Diff line number Diff line change
@@ -26,9 +26,9 @@
#include "precompiled.hpp"
#include "register_aarch64.hpp"

REGISTER_IMPL_DEFINITION(Register, RegisterImpl);
REGISTER_IMPL_DEFINITION(FloatRegister, FloatRegisterImpl);
REGISTER_IMPL_DEFINITION(PRegister, PRegisterImpl);
REGISTER_IMPL_DEFINITION(Register, RegisterImpl, RegisterImpl::number_of_declared_registers);
REGISTER_IMPL_DEFINITION(FloatRegister, FloatRegisterImpl, FloatRegisterImpl::number_of_registers);
REGISTER_IMPL_DEFINITION(PRegister, PRegisterImpl, PRegisterImpl::number_of_registers);

const int ConcreteRegisterImpl::max_gpr = RegisterImpl::number_of_registers *
RegisterImpl::max_slots_per_register;
16 changes: 7 additions & 9 deletions src/hotspot/cpu/aarch64/register_aarch64.hpp
Original file line number Diff line number Diff line change
@@ -43,7 +43,7 @@ class RegisterImpl: public AbstractRegisterImpl {

private:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: private not needed

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK.

static constexpr Register first();
static constexpr Register invalid() { return first() + number_of_declared_registers; }
static constexpr Register invalid() { return first() + number_of_registers; }

public:
enum {
@@ -67,7 +67,7 @@ class RegisterImpl: public AbstractRegisterImpl {
};


REGISTER_IMPL_DECLARATION(Register, RegisterImpl);
REGISTER_IMPL_DECLARATION(Register, RegisterImpl, RegisterImpl::number_of_declared_registers);

// The integer registers of the aarch64 architecture

@@ -139,12 +139,11 @@ class FloatRegisterImpl: public AbstractRegisterImpl {

private:
static constexpr FloatRegister first();
static constexpr FloatRegister invalid() { return first() + number_of_declared_registers; }
static constexpr FloatRegister invalid() { return first() + number_of_registers; }

public:
enum {
number_of_registers = 32,
number_of_declared_registers = 32,
max_slots_per_register = 8,
save_slots_per_register = 2,
slots_per_neon_register = 4,
@@ -163,12 +162,12 @@ class FloatRegisterImpl: public AbstractRegisterImpl {
int encoding_nocheck() const { return this - first(); }
};

REGISTER_IMPL_DECLARATION(FloatRegister, FloatRegisterImpl);
REGISTER_IMPL_DECLARATION(FloatRegister, FloatRegisterImpl, FloatRegisterImpl::number_of_registers);


// The float registers of the AARCH64 architecture

CONSTANT_REGISTER_DECLARATION(FloatRegister, fnoreg , (FloatRegisterImpl::number_of_declared_registers));
CONSTANT_REGISTER_DECLARATION(FloatRegister, fnoreg , (FloatRegisterImpl::number_of_registers));
CONSTANT_REGISTER_DECLARATION(FloatRegister, v0 , ( 0));
CONSTANT_REGISTER_DECLARATION(FloatRegister, v1 , ( 1));
CONSTANT_REGISTER_DECLARATION(FloatRegister, v2 , ( 2));
@@ -247,12 +246,11 @@ class PRegisterImpl: public AbstractRegisterImpl {

private:
static constexpr PRegister first();
static constexpr PRegister invalid() { return first() + number_of_declared_registers; }
static constexpr PRegister invalid() { return first() + number_of_registers; }

public:
enum {
number_of_registers = 16,
number_of_declared_registers = 16,
number_of_governing_registers = 8,
max_slots_per_register = 1
};
@@ -271,7 +269,7 @@ class PRegisterImpl: public AbstractRegisterImpl {
};


REGISTER_IMPL_DECLARATION(PRegister, PRegisterImpl);
REGISTER_IMPL_DECLARATION(PRegister, PRegisterImpl, PRegisterImpl::number_of_registers);

// The predicate registers of SVE.
CONSTANT_REGISTER_DECLARATION(PRegister, p0, ( 0));
16 changes: 7 additions & 9 deletions src/hotspot/share/asm/register.hpp
Original file line number Diff line number Diff line change
@@ -52,26 +52,24 @@ class AbstractRegisterImpl {

#define AS_REGISTER(type,name) ((type)name##_##type##EnumValue)

#define CONSTANT_REGISTER_DECLARATION(type, name, value) \
const type name = ((type)value); \
#define CONSTANT_REGISTER_DECLARATION(type, name, value) \
const type name = ((type)value); \
enum { name##_##type##EnumValue = (value) }


#else // USE_POINTERS_TO_REGISTER_IMPL_ARRAY

#define REGISTER_IMPL_DECLARATION(type, impl_type) \
#define REGISTER_IMPL_DECLARATION(type, impl_type, reg_count) \
inline const type as_ ## type(int encoding) { \
assert(encoding <= impl_type::number_of_declared_registers, "invalid register"); \
return encoding == -1 ? impl_type::invalid() : impl_type::first() + encoding; \
} \
extern impl_type all_ ## type ## s[impl_type::number_of_declared_registers] INTERNAL_VISIBILITY; \
extern impl_type all_ ## type ## s[reg_count + 1] INTERNAL_VISIBILITY; \
inline constexpr type impl_type::first() { return all_ ## type ## s; }

#define REGISTER_IMPL_DEFINITION(type, impl_type) \
impl_type all_ ## type ## s[impl_type::number_of_declared_registers];
#define REGISTER_IMPL_DEFINITION(type, impl_type, reg_count) \
impl_type all_ ## type ## s[reg_count + 1];

#undef CONSTANT_REGISTER_DECLARATION
#define CONSTANT_REGISTER_DECLARATION(type, name, value) \
#define CONSTANT_REGISTER_DECLARATION(type, name, value) \
constexpr type name = all_ ## type ## s + value;

#endif // USE_POINTERS_TO_REGISTER_IMPL_ARRAY