Skip to content

Commit 65852a6

Browse files
author
Yadong Wang
committed
8280497: riscv: Undefined Behaviour in class Assembler
Reviewed-by: fyang, fjiang
1 parent 068f5d5 commit 65852a6

8 files changed

+122
-87
lines changed

src/hotspot/cpu/riscv/assembler_riscv.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@
4040
class Argument {
4141
public:
4242
enum {
43-
n_int_register_parameters_c = 8, // x10, x11, ... x17 (c_rarg0, c_rarg1, ...)
44-
n_float_register_parameters_c = 8, // f10, f11, ... f17 (c_farg0, c_farg1, ... )
43+
n_int_register_parameters_c = 8, // x10, x11, ... x17 (c_rarg0, c_rarg1, ...)
44+
n_float_register_parameters_c = 8, // f10, f11, ... f17 (c_farg0, c_farg1, ... )
4545

46-
n_int_register_parameters_j = 8, // x11, ... x17, x10 (rj_rarg0, j_rarg1, ...)
46+
n_int_register_parameters_j = 8, // x11, ... x17, x10 (j_rarg0, j_rarg1, ...)
4747
n_float_register_parameters_j = 8 // f10, f11, ... f17 (j_farg0, j_farg1, ...)
4848
};
4949
};
@@ -127,7 +127,7 @@ REGISTER_DECLARATION(Register, xdispatch, x21);
127127
// Java stack pointer
128128
REGISTER_DECLARATION(Register, esp, x20);
129129

130-
// tempory register(caller-save registers)
130+
// temporary register(caller-save registers)
131131
REGISTER_DECLARATION(Register, t0, x5);
132132
REGISTER_DECLARATION(Register, t1, x6);
133133
REGISTER_DECLARATION(Register, t2, x7);

src/hotspot/cpu/riscv/gc/z/zBarrierSetAssembler_riscv.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
* Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved.
3-
* Copyright (c) 2020, 2021, Huawei Technologies Co., Ltd. All rights reserved.
3+
* Copyright (c) 2020, 2022, Huawei Technologies Co., Ltd. All rights reserved.
44
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
55
*
66
* This code is free software; you can redistribute it and/or modify it
@@ -221,8 +221,8 @@ class ZSaveLiveRegisters {
221221
private:
222222
MacroAssembler* const _masm;
223223
RegSet _gp_regs;
224-
RegSet _fp_regs;
225-
RegSet _vp_regs;
224+
FloatRegSet _fp_regs;
225+
VectorRegSet _vp_regs;
226226

227227
public:
228228
void initialize(ZLoadBarrierStubC2* stub) {
@@ -235,10 +235,10 @@ class ZSaveLiveRegisters {
235235
if (vm_reg->is_Register()) {
236236
_gp_regs += RegSet::of(vm_reg->as_Register());
237237
} else if (vm_reg->is_FloatRegister()) {
238-
_fp_regs += RegSet::of((Register)vm_reg->as_FloatRegister());
238+
_fp_regs += FloatRegSet::of(vm_reg->as_FloatRegister());
239239
} else if (vm_reg->is_VectorRegister()) {
240240
const VMReg vm_reg_base = OptoReg::as_VMReg(opto_reg & ~(VectorRegisterImpl::max_slots_per_register - 1));
241-
_vp_regs += RegSet::of((Register)vm_reg_base->as_VectorRegister());
241+
_vp_regs += VectorRegSet::of(vm_reg_base->as_VectorRegister());
242242
} else {
243243
fatal("Unknown register type");
244244
}

src/hotspot/cpu/riscv/globalDefinitions_riscv.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved.
33
* Copyright (c) 2014, 2015, Red Hat Inc. All rights reserved.
4-
* Copyright (c) 2020, 2021, Huawei Technologies Co., Ltd. All rights reserved.
4+
* Copyright (c) 2020, 2022, Huawei Technologies Co., Ltd. All rights reserved.
55
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
66
*
77
* This code is free software; you can redistribute it and/or modify it
@@ -47,4 +47,6 @@ const bool CCallingConventionRequiresIntsAsLongs = false;
4747

4848
#define COMPRESSED_CLASS_POINTERS_DEPENDS_ON_COMPRESSED_OOPS false
4949

50+
#define USE_POINTERS_TO_REGISTER_IMPL_ARRAY
51+
5052
#endif // CPU_RISCV_GLOBALDEFINITIONS_RISCV_HPP

src/hotspot/cpu/riscv/macroAssembler_riscv.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -482,11 +482,11 @@ class MacroAssembler: public Assembler {
482482
void pop_reg(Register Rd);
483483
int push_reg(unsigned int bitset, Register stack);
484484
int pop_reg(unsigned int bitset, Register stack);
485-
void push_fp(RegSet regs, Register stack) { if (regs.bits()) push_fp(regs.bits(), stack); }
486-
void pop_fp(RegSet regs, Register stack) { if (regs.bits()) pop_fp(regs.bits(), stack); }
485+
void push_fp(FloatRegSet regs, Register stack) { if (regs.bits()) push_fp(regs.bits(), stack); }
486+
void pop_fp(FloatRegSet regs, Register stack) { if (regs.bits()) pop_fp(regs.bits(), stack); }
487487
#ifdef COMPILER2
488-
void push_vp(RegSet regs, Register stack) { if (regs.bits()) push_vp(regs.bits(), stack); }
489-
void pop_vp(RegSet regs, Register stack) { if (regs.bits()) pop_vp(regs.bits(), stack); }
488+
void push_vp(VectorRegSet regs, Register stack) { if (regs.bits()) push_vp(regs.bits(), stack); }
489+
void pop_vp(VectorRegSet regs, Register stack) { if (regs.bits()) pop_vp(regs.bits(), stack); }
490490
#endif // COMPILER2
491491

492492
// Push and pop everything that might be clobbered by a native
@@ -776,6 +776,7 @@ class MacroAssembler: public Assembler {
776776

777777
int push_fp(unsigned int bitset, Register stack);
778778
int pop_fp(unsigned int bitset, Register stack);
779+
779780
int push_vp(unsigned int bitset, Register stack);
780781
int pop_vp(unsigned int bitset, Register stack);
781782

src/hotspot/cpu/riscv/nativeInst_riscv.hpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved.
33
* Copyright (c) 2014, 2018, Red Hat Inc. All rights reserved.
4-
* Copyright (c) 2020, 2021, Huawei Technologies Co., Ltd. All rights reserved.
4+
* Copyright (c) 2020, 2022, Huawei Technologies Co., Ltd. All rights reserved.
55
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
66
*
77
* This code is free software; you can redistribute it and/or modify it
@@ -518,10 +518,10 @@ inline bool is_NativeCallTrampolineStub_at(address addr) {
518518
// 3). check if the offset in ld[31:20] equals the data_offset
519519
assert_cond(addr != NULL);
520520
if (NativeInstruction::is_auipc_at(addr) && NativeInstruction::is_ld_at(addr + 4) && NativeInstruction::is_jalr_at(addr + 8) &&
521-
((Register)(intptr_t)Assembler::extract(((unsigned*)addr)[0], 11, 7) == x5) &&
522-
((Register)(intptr_t)Assembler::extract(((unsigned*)addr)[1], 11, 7) == x5) &&
523-
((Register)(intptr_t)Assembler::extract(((unsigned*)addr)[1], 19, 15) == x5) &&
524-
((Register)(intptr_t)Assembler::extract(((unsigned*)addr)[2], 19, 15) == x5) &&
521+
(as_Register((intptr_t)Assembler::extract(((unsigned*)addr)[0], 11, 7)) == x5) &&
522+
(as_Register((intptr_t)Assembler::extract(((unsigned*)addr)[1], 11, 7)) == x5) &&
523+
(as_Register((intptr_t)Assembler::extract(((unsigned*)addr)[1], 19, 15)) == x5) &&
524+
(as_Register((intptr_t)Assembler::extract(((unsigned*)addr)[2], 19, 15)) == x5) &&
525525
(Assembler::extract(((unsigned*)addr)[1], 31, 20) == NativeCallTrampolineStub::data_offset)) {
526526
return true;
527527
}

src/hotspot/cpu/riscv/register_riscv.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
* Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
3-
* Copyright (c) 2020, 2021, Huawei Technologies Co., Ltd. All rights reserved.
3+
* Copyright (c) 2020, 2022, Huawei Technologies Co., Ltd. All rights reserved.
44
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
55
*
66
* This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,10 @@
2626
#include "precompiled.hpp"
2727
#include "register_riscv.hpp"
2828

29+
REGISTER_IMPL_DEFINITION(Register, RegisterImpl, RegisterImpl::number_of_registers);
30+
REGISTER_IMPL_DEFINITION(FloatRegister, FloatRegisterImpl, FloatRegisterImpl::number_of_registers);
31+
REGISTER_IMPL_DEFINITION(VectorRegister, VectorRegisterImpl, VectorRegisterImpl::number_of_registers);
32+
2933
const int ConcreteRegisterImpl::max_gpr = RegisterImpl::number_of_registers *
3034
RegisterImpl::max_slots_per_register;
3135
const int ConcreteRegisterImpl::max_fpr =
@@ -38,8 +42,8 @@ const int ConcreteRegisterImpl::max_vpr =
3842

3943

4044
const char* RegisterImpl::name() const {
41-
const char* names[number_of_registers] = {
42-
"zr", "ra", "sp", "gp", "tp", "x5", "x6", "x7", "fp", "x9",
45+
static const char *const names[number_of_registers] = {
46+
"zr", "ra", "sp", "gp", "tp", "t0", "t1", "t2", "fp", "x9",
4347
"c_rarg0", "c_rarg1", "c_rarg2", "c_rarg3", "c_rarg4", "c_rarg5", "c_rarg6", "c_rarg7",
4448
"x18", "x19", "esp", "xdispatch", "xbcp", "xthread", "xlocals",
4549
"xmonitors", "xcpool", "xheapbase", "x28", "x29", "x30", "xmethod"
@@ -48,7 +52,7 @@ const char* RegisterImpl::name() const {
4852
}
4953

5054
const char* FloatRegisterImpl::name() const {
51-
const char* names[number_of_registers] = {
55+
static const char *const names[number_of_registers] = {
5256
"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
5357
"f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
5458
"f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
@@ -58,7 +62,7 @@ const char* FloatRegisterImpl::name() const {
5862
}
5963

6064
const char* VectorRegisterImpl::name() const {
61-
const char* names[number_of_registers] = {
65+
static const char *const names[number_of_registers] = {
6266
"v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
6367
"v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
6468
"v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",

0 commit comments

Comments
 (0)