diff --git a/erts/emulator/beam/beam_common.c b/erts/emulator/beam/beam_common.c index bc25fb280c9c..1449cb828283 100644 --- a/erts/emulator/beam/beam_common.c +++ b/erts/emulator/beam/beam_common.c @@ -406,9 +406,9 @@ Eterm error_atom[NUMBER_EXIT_CODES] = { * * This is needed to generate correct stacktraces when throwing errors from * instructions that return like an ordinary function, such as call_nif. */ -ErtsCodePtr erts_printable_return_address(Process* p, Eterm *E) { - Eterm *stack_bottom = STACK_START(p); - Eterm *scanner = E; +ErtsCodePtr erts_printable_return_address(const Process* p, const Eterm *E) { + const Eterm *stack_bottom = STACK_START(p); + const Eterm *scanner = E; ASSERT(is_CP(scanner[0])); diff --git a/erts/emulator/beam/beam_common.h b/erts/emulator/beam/beam_common.h index f20c2b3e283b..01559107bf39 100644 --- a/erts/emulator/beam/beam_common.h +++ b/erts/emulator/beam/beam_common.h @@ -296,11 +296,13 @@ extern ErtsCodePtr beam_call_trace_return; /* OpCode(i_call_trace_return) */ * @param[in] frame The frame to inspect. Must point at a CP. * @param[out] return_address The return address of \p frame */ ERTS_GLB_INLINE -const Eterm *erts_inspect_frame(Eterm *frame, ErtsCodePtr *return_address); +const Eterm *erts_inspect_frame(const Eterm *frame, + ErtsCodePtr *return_address); #if ERTS_GLB_INLINE_INCL_FUNC_DEF ERTS_GLB_INLINE -const Eterm *erts_inspect_frame(Eterm *frame, ErtsCodePtr *return_address) { +const Eterm *erts_inspect_frame(const Eterm *frame, + ErtsCodePtr *return_address) { ASSERT(is_CP(frame[0])); if (ERTS_LIKELY(erts_frame_layout == ERTS_FRAME_LAYOUT_RA)) { diff --git a/erts/emulator/beam/erl_io_queue.c b/erts/emulator/beam/erl_io_queue.c index d0d443747b0d..4686c53adc3e 100644 --- a/erts/emulator/beam/erl_io_queue.c +++ b/erts/emulator/beam/erl_io_queue.c @@ -97,13 +97,13 @@ static ErtsIOQBinary *alloc_binary(Uint size, char *source, void **iov_base, int } } -Uint erts_ioq_size(ErtsIOQueue *q) +Uint erts_ioq_size(const ErtsIOQueue *q) { return q->size; } /* expand queue to hold n elements in tail or head */ -static int expandq(ErtsIOQueue* q, int n, int tail) +static int expandq(ErtsIOQueue *q, int n, int tail) /* tail: 0 if make room in head, make room in tail otherwise */ { int h_sz; /* room before header */ @@ -376,8 +376,7 @@ int erts_ioq_deq(ErtsIOQueue *q, Uint size) return 0; } - -Uint erts_ioq_peekqv(ErtsIOQueue *q, ErtsIOVec *ev) { +Uint erts_ioq_peekqv(const ErtsIOQueue *q, ErtsIOVec *ev) { ASSERT(ev); if (! q) { @@ -396,7 +395,7 @@ Uint erts_ioq_peekqv(ErtsIOQueue *q, ErtsIOVec *ev) { } } -SysIOVec* erts_ioq_peekq(ErtsIOQueue *q, int* vlenp) /* length of io-vector */ +SysIOVec* erts_ioq_peekq(const ErtsIOQueue *q, int* vlenp) /* length of io-vector */ { if (q == NULL) { diff --git a/erts/emulator/beam/erl_io_queue.h b/erts/emulator/beam/erl_io_queue.h index 09c12c134629..b19a8fcdb8b0 100644 --- a/erts/emulator/beam/erl_io_queue.h +++ b/erts/emulator/beam/erl_io_queue.h @@ -93,13 +93,13 @@ typedef struct erts_io_queue { void erts_ioq_init(ErtsIOQueue *q, ErtsAlcType_t alct, int driver); void erts_ioq_clear(ErtsIOQueue *q); -Uint erts_ioq_size(ErtsIOQueue *q); +Uint erts_ioq_size(const ErtsIOQueue *q); int erts_ioq_enqv(ErtsIOQueue *q, ErtsIOVec *vec, Uint skip); int erts_ioq_pushqv(ErtsIOQueue *q, ErtsIOVec *vec, Uint skip); int erts_ioq_deq(ErtsIOQueue *q, Uint Uint); -Uint erts_ioq_peekqv(ErtsIOQueue *q, ErtsIOVec *ev); -SysIOVec *erts_ioq_peekq(ErtsIOQueue *q, int *vlenp); -Uint erts_ioq_sizeq(ErtsIOQueue *q); +Uint erts_ioq_peekqv(const ErtsIOQueue *q, ErtsIOVec *ev); +SysIOVec *erts_ioq_peekq(const ErtsIOQueue *q, int *vlenp); +Uint erts_ioq_sizeq(const ErtsIOQueue *q); int erts_ioq_iolist_vec_len(Eterm obj, int* vsize, Uint* csize, Uint* pvsize, Uint* pcsize, diff --git a/erts/emulator/beam/erl_nif.c b/erts/emulator/beam/erl_nif.c index aa1c4210bfaa..8a8e1fcac45d 100644 --- a/erts/emulator/beam/erl_nif.c +++ b/erts/emulator/beam/erl_nif.c @@ -424,10 +424,10 @@ int erts_call_dirty_nif(ErtsSchedulerData *esdp, Process *c_p, ErtsCodePtr I, - Eterm *reg) + const Eterm *reg) { int exiting; - ERL_NIF_TERM *argv = (ERL_NIF_TERM *) reg; + const ERL_NIF_TERM *argv = (const ERL_NIF_TERM *) reg; ErtsNativeFunc *nep = ERTS_I_BEAM_OP_TO_NFUNC(I); const ErtsCodeMFA *codemfa = erts_code_to_codemfa(I); NativeFunPtr dirty_nif = (NativeFunPtr) nep->trampoline.dfunc; @@ -5372,14 +5372,14 @@ erts_nif_sched_init(ErtsSchedulerData *esdp) } } -int erts_nif_get_funcs(struct erl_module_nif* mod, +int erts_nif_get_funcs(const struct erl_module_nif* mod, ErlNifFunc **funcs) { *funcs = mod->entry.funcs; return mod->entry.num_of_funcs; } -Module *erts_nif_get_module(struct erl_module_nif *nif_mod) { +Module *erts_nif_get_module(const struct erl_module_nif *nif_mod) { return nif_mod->mod; } diff --git a/erts/emulator/beam/global.h b/erts/emulator/beam/global.h index ab8b97034e13..3e65affdaa99 100644 --- a/erts/emulator/beam/global.h +++ b/erts/emulator/beam/global.h @@ -132,16 +132,16 @@ extern void erts_nif_sched_init(ErtsSchedulerData *esdp); extern void erts_nif_execute_on_halt(void); extern void erts_nif_notify_halt(void); extern void erts_nif_wait_calls(void); -extern int erts_nif_get_funcs(struct erl_module_nif*, +extern int erts_nif_get_funcs(const struct erl_module_nif*, struct enif_func_t **funcs); -extern Module *erts_nif_get_module(struct erl_module_nif*); +extern Module *erts_nif_get_module(const struct erl_module_nif*); extern Eterm erts_nif_call_function(Process *p, Process *tracee, struct erl_module_nif*, struct enif_func_t *, int argc, Eterm *argv); int erts_call_dirty_nif(ErtsSchedulerData *esdp, Process *c_p, - ErtsCodePtr I, Eterm *reg); + ErtsCodePtr I, const Eterm *reg); ErtsMessage* erts_create_message_from_nif_env(ErlNifEnv* msg_env, Uint extra); @@ -1216,7 +1216,8 @@ void erts_dirty_process_main(ErtsSchedulerData *); Eterm build_stacktrace(Process* c_p, Eterm exc); Eterm expand_error_value(Process* c_p, Uint freason, Eterm Value); void erts_save_stacktrace(Process* p, struct StackTrace* s); -ErtsCodePtr erts_printable_return_address(Process* p, Eterm *E) ERTS_NOINLINE; +ErtsCodePtr erts_printable_return_address(const Process* p, + const Eterm *E) ERTS_NOINLINE; /* erl_init.c */ diff --git a/erts/emulator/beam/jit/arm/beam_asm.hpp b/erts/emulator/beam/jit/arm/beam_asm.hpp index c114118fe6d0..da838c7bb217 100644 --- a/erts/emulator/beam/jit/arm/beam_asm.hpp +++ b/erts/emulator/beam/jit/arm/beam_asm.hpp @@ -1675,19 +1675,19 @@ class BeamModuleAssembler : public BeamAssembler, } } - enum Relation { none, consecutive, reverse_consecutive }; + enum class Relation { none, consecutive, reverse_consecutive }; static Relation memory_relation(const arm::Mem &mem1, const arm::Mem &mem2) { if (mem1.hasBaseReg() && mem2.hasBaseReg() && mem1.baseId() == mem2.baseId()) { if (mem1.offset() + 8 == mem2.offset()) { - return consecutive; + return Relation::consecutive; } else if (mem1.offset() == mem2.offset() + 8) { - return reverse_consecutive; + return Relation::reverse_consecutive; } } - return none; + return Relation::none; } void flush_vars(const Variable &to1, diff --git a/erts/emulator/beam/jit/arm/beam_asm_module.cpp b/erts/emulator/beam/jit/arm/beam_asm_module.cpp index 06e150404f1d..254a8423152d 100644 --- a/erts/emulator/beam/jit/arm/beam_asm_module.cpp +++ b/erts/emulator/beam/jit/arm/beam_asm_module.cpp @@ -121,7 +121,7 @@ void BeamModuleAssembler::embed_vararg_rodata(const Span &args, a.align(AlignMode::kData, 8); switch (arg.getType()) { - case ArgVal::Literal: { + case ArgVal::Type::Literal: { auto &patches = literals[arg.as().get()].patches; Label patch = a.newLabel(); @@ -130,22 +130,22 @@ void BeamModuleAssembler::embed_vararg_rodata(const Span &args, patches.push_back({patch, 0}); break; } - case ArgVal::XReg: + case ArgVal::Type::XReg: data.as_beam = make_loader_x_reg(arg.as().get()); a.embed(&data.as_char, sizeof(data.as_beam)); break; - case ArgVal::YReg: + case ArgVal::Type::YReg: data.as_beam = make_loader_y_reg(arg.as().get()); a.embed(&data.as_char, sizeof(data.as_beam)); break; - case ArgVal::Label: + case ArgVal::Type::Label: a.embedLabel(rawLabels[arg.as().get()]); break; - case ArgVal::Immediate: + case ArgVal::Type::Immediate: data.as_beam = arg.as().get(); a.embed(&data.as_char, sizeof(data.as_beam)); break; - case ArgVal::Word: + case ArgVal::Type::Word: data.as_beam = arg.as().get(); a.embed(&data.as_char, sizeof(data.as_beam)); break; @@ -378,7 +378,7 @@ void BeamModuleAssembler::emit_aligned_label(const ArgLabel &Label, void BeamModuleAssembler::emit_i_func_label(const ArgLabel &Label) { flush_last_error(); - emit_aligned_label(Label, ArgVal(ArgVal::Word, sizeof(UWord))); + emit_aligned_label(Label, ArgVal(ArgVal::Type::Word, sizeof(UWord))); } void BeamModuleAssembler::emit_on_load() { @@ -775,11 +775,11 @@ void BeamModuleAssembler::emit_constant(const Constant &constant) { a.embedLabel(rawLabels.at(value.as().get())); } else { switch (value.getType()) { - case ArgVal::BytePtr: + case ArgVal::Type::BytePtr: strings.push_back({anchor, 0, value.as().get()}); a.embedUInt64(LLONG_MAX); break; - case ArgVal::Catch: { + case ArgVal::Type::Catch: { auto handler = rawLabels[value.as().get()]; catches.push_back({{anchor, 0, 0}, handler}); @@ -789,19 +789,19 @@ void BeamModuleAssembler::emit_constant(const Constant &constant) { a.embedUInt64(INT_MAX); break; } - case ArgVal::Export: { + case ArgVal::Type::Export: { auto index = value.as().get(); imports[index].patches.push_back({anchor, 0, 0}); a.embedUInt64(LLONG_MAX); break; } - case ArgVal::FunEntry: { + case ArgVal::Type::FunEntry: { auto index = value.as().get(); lambdas[index].patches.push_back({anchor, 0, 0}); a.embedUInt64(LLONG_MAX); break; } - case ArgVal::Literal: { + case ArgVal::Type::Literal: { auto index = value.as().get(); literals[index].patches.push_back({anchor, 0, 0}); a.embedUInt64(LLONG_MAX); diff --git a/erts/emulator/beam/jit/arm/instr_bif.cpp b/erts/emulator/beam/jit/arm/instr_bif.cpp index e5aad8a1398d..0c36c0528a25 100644 --- a/erts/emulator/beam/jit/arm/instr_bif.cpp +++ b/erts/emulator/beam/jit/arm/instr_bif.cpp @@ -700,7 +700,7 @@ void BeamGlobalAssembler::emit_bif_nif_epilogue(void) { emit_enter_runtime(); a.mov(ARG1, c_p); - runtime_call(); emit_leave_runtime(); diff --git a/erts/emulator/beam/jit/arm/instr_bs.cpp b/erts/emulator/beam/jit/arm/instr_bs.cpp index efb158579f77..27373a9240e0 100644 --- a/erts/emulator/beam/jit/arm/instr_bs.cpp +++ b/erts/emulator/beam/jit/arm/instr_bs.cpp @@ -2062,8 +2062,8 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, /* There is no way the call can fail on a 64-bit architecture. */ } else if (estimated_num_bits <= ERL_ONHEAP_BITS_LIMIT) { static constexpr auto cur_bin_offset = - offsetof(ErtsSchedulerRegisters, aux_regs.d.erl_bits_state) + - offsetof(struct erl_bits_state, erts_current_bin); + offsetof(ErtsSchedulerRegisters, + aux_regs.d.erl_bits_state.erts_current_bin); Uint need; arm::Mem mem_bin_base = arm::Mem(scheduler_registers, cur_bin_offset); @@ -2566,7 +2566,7 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, break; case am_string: { ArgBytePtr string_ptr( - ArgVal(ArgVal::BytePtr, seg.src.as().get())); + ArgVal(ArgVal::Type::BytePtr, seg.src.as().get())); comment("insert string"); ASSERT(seg.effectiveSize >= 0); diff --git a/erts/emulator/beam/jit/arm/instr_call.cpp b/erts/emulator/beam/jit/arm/instr_call.cpp index 582d3f60474c..9dbc3a2c0eea 100644 --- a/erts/emulator/beam/jit/arm/instr_call.cpp +++ b/erts/emulator/beam/jit/arm/instr_call.cpp @@ -36,7 +36,7 @@ void BeamGlobalAssembler::emit_dispatch_return() { void BeamModuleAssembler::emit_dispatch_return() { #ifdef JIT_HARD_DEBUG /* Validate return address and {x,0} */ - emit_validate(ArgVal(ArgVal::Word, 1)); + emit_validate(ArgVal(ArgVal::Type::Word, 1)); #endif if (erts_alcu_enable_code_atags) { diff --git a/erts/emulator/beam/jit/arm/instr_common.cpp b/erts/emulator/beam/jit/arm/instr_common.cpp index 007612c1ef49..24cdaf903586 100644 --- a/erts/emulator/beam/jit/arm/instr_common.cpp +++ b/erts/emulator/beam/jit/arm/instr_common.cpp @@ -182,7 +182,7 @@ void BeamModuleAssembler::emit_validate(const ArgWord &Arity) { emit_enter_runtime_frame(); for (unsigned i = 0; i < Arity.get(); i++) { - mov_arg(ARG1, ArgVal(ArgVal::XReg, i)); + mov_arg(ARG1, ArgVal(ArgVal::Type::XReg, i)); emit_enter_runtime(); runtime_call(); diff --git a/erts/emulator/beam/jit/arm/instr_select.cpp b/erts/emulator/beam/jit/arm/instr_select.cpp index e0c5ac3ca5e5..497064c53a16 100644 --- a/erts/emulator/beam/jit/arm/instr_select.cpp +++ b/erts/emulator/beam/jit/arm/instr_select.cpp @@ -496,12 +496,12 @@ void BeamModuleAssembler::emit_i_jump_on_val(const ArgSource &Src, a.bind(data); if (embedInText) { for (const ArgVal &arg : args) { - ASSERT(arg.getType() == ArgVal::Label); + ASSERT(arg.getType() == ArgVal::Type::Label); a.embedLabel(rawLabels[arg.as().get()]); } } - if (Fail.getType() == ArgVal::Immediate) { + if (Fail.getType() == ArgVal::Type::Immediate) { a.bind(fail); } } diff --git a/erts/emulator/beam/jit/arm/instr_trace.cpp b/erts/emulator/beam/jit/arm/instr_trace.cpp index 6bdc328083f4..d154bb8029de 100644 --- a/erts/emulator/beam/jit/arm/instr_trace.cpp +++ b/erts/emulator/beam/jit/arm/instr_trace.cpp @@ -161,7 +161,7 @@ void BeamModuleAssembler::emit_return_trace() { emit_leave_runtime(1); - emit_deallocate(ArgVal(ArgVal::Word, BEAM_RETURN_TRACE_FRAME_SZ)); + emit_deallocate(ArgVal(ArgVal::Type::Word, BEAM_RETURN_TRACE_FRAME_SZ)); emit_return(); } @@ -185,7 +185,8 @@ void BeamModuleAssembler::emit_i_call_trace_return() { emit_leave_runtime(1); - emit_deallocate(ArgVal(ArgVal::Word, BEAM_RETURN_CALL_ACC_TRACE_FRAME_SZ)); + emit_deallocate( + ArgVal(ArgVal::Type::Word, BEAM_RETURN_CALL_ACC_TRACE_FRAME_SZ)); emit_return(); } @@ -203,7 +204,7 @@ void BeamModuleAssembler::emit_i_return_to_trace() { emit_leave_runtime(1); - emit_deallocate(ArgVal(ArgVal::Word, BEAM_RETURN_TO_TRACE_FRAME_SZ)); + emit_deallocate(ArgVal(ArgVal::Type::Word, BEAM_RETURN_TO_TRACE_FRAME_SZ)); emit_return(); } diff --git a/erts/emulator/beam/jit/beam_jit_args.hpp b/erts/emulator/beam/jit/beam_jit_args.hpp index b92d7206e3d1..85372114e9d4 100644 --- a/erts/emulator/beam/jit/beam_jit_args.hpp +++ b/erts/emulator/beam/jit/beam_jit_args.hpp @@ -22,7 +22,7 @@ #define __BEAM_JIT_ARGS_HPP__ struct ArgVal : public BeamOpArg { - enum TYPE : UWord { + enum class Type : UWord { Word = TAG_u, XReg = TAG_x, YReg = TAG_y, @@ -38,14 +38,19 @@ struct ArgVal : public BeamOpArg { }; constexpr ArgVal(UWord t, UWord value) : BeamOpArg{t, value} { - ASSERT(t == TYPE::Word || t == TYPE::XReg || t == TYPE::YReg || - t == TYPE::FReg || t == TYPE::Label || t == TYPE::Literal || - t == TYPE::BytePtr || t == TYPE::Catch || t == TYPE::Export || - t == TYPE::FunEntry || t == TYPE::Immediate); + ASSERT(t == (UWord)Type::Word || t == (UWord)Type::XReg || + t == (UWord)Type::YReg || t == (UWord)Type::FReg || + t == (UWord)Type::Label || t == (UWord)Type::Literal || + t == (UWord)Type::BytePtr || t == (UWord)Type::Catch || + t == (UWord)Type::Export || t == (UWord)Type::FunEntry || + t == (UWord)Type::Immediate); } - constexpr enum TYPE getType() const { - return (enum TYPE)type; + constexpr ArgVal(Type t, UWord value) : ArgVal((UWord)t, value) { + } + + constexpr Type getType() const { + return (Type)type; } /* */ @@ -55,11 +60,11 @@ struct ArgVal : public BeamOpArg { } constexpr bool isBytePtr() const { - return getType() == TYPE::BytePtr; + return getType() == Type::BytePtr; } constexpr bool isCatch() const { - return getType() == TYPE::Catch; + return getType() == Type::Catch; } constexpr bool isConstant() const { @@ -67,23 +72,23 @@ struct ArgVal : public BeamOpArg { } constexpr bool isExport() const { - return getType() == TYPE::Export; + return getType() == Type::Export; } constexpr bool isImmed() const { - return getType() == TYPE::Immediate; + return getType() == Type::Immediate; } constexpr bool isLabel() const { - return getType() == TYPE::Label; + return getType() == Type::Label; } constexpr bool isLambda() const { - return getType() == TYPE::FunEntry; + return getType() == Type::FunEntry; } constexpr bool isLiteral() const { - return getType() == TYPE::Literal; + return getType() == Type::Literal; } constexpr bool isNil() const { @@ -103,19 +108,19 @@ struct ArgVal : public BeamOpArg { } constexpr bool isXRegister() const { - return getType() == TYPE::XReg; + return getType() == Type::XReg; } constexpr bool isYRegister() const { - return getType() == TYPE::YReg; + return getType() == Type::YReg; } constexpr bool isFRegister() const { - return getType() == TYPE::FReg; + return getType() == Type::FReg; } constexpr bool isWord() const { - return getType() == TYPE::Word; + return getType() == Type::Word; } struct Hash { @@ -132,18 +137,18 @@ struct ArgVal : public BeamOpArg { return !(*this == other); } - enum Relation { none, consecutive, reverse_consecutive }; + enum class Relation { none, consecutive, reverse_consecutive }; static Relation memory_relation(const ArgVal &lhs, const ArgVal &rhs) { if (lhs.isRegister() && lhs.getType() == rhs.getType()) { if ((lhs.val & REG_MASK) + 1 == (rhs.val & REG_MASK)) { - return consecutive; + return Relation::consecutive; } else if ((lhs.val & REG_MASK) == (rhs.val & REG_MASK) + 1) { - return reverse_consecutive; + return Relation::reverse_consecutive; } } - return none; + return Relation::none; }; template @@ -211,7 +216,7 @@ struct ArgWord : public ArgVal { /* Allows explicit construction from any integral type. */ template::value, bool> = true> - constexpr explicit ArgWord(T value) : ArgVal(ArgVal::Word, value) { + constexpr explicit ArgWord(T value) : ArgVal(ArgVal::Type::Word, value) { } template::value, bool> = true> constexpr explicit ArgXRegister(T reg) - : ArgRegister(ArgVal(ArgVal::XReg, reg)) { + : ArgRegister(ArgVal(ArgVal::Type::XReg, reg)) { } template::value, bool> = true> constexpr explicit ArgYRegister(T reg) - : ArgRegister(ArgVal(ArgVal::YReg, reg)) { + : ArgRegister(ArgVal(ArgVal::Type::YReg, reg)) { } template diff --git a/erts/emulator/beam/jit/beam_jit_main.cpp b/erts/emulator/beam/jit/beam_jit_main.cpp index 55d0e90194c5..c93a64927966 100644 --- a/erts/emulator/beam/jit/beam_jit_main.cpp +++ b/erts/emulator/beam/jit/beam_jit_main.cpp @@ -322,18 +322,18 @@ void beamasm_init() { func_label = label++; entry_label = label++; - args = {ArgVal(ArgVal::Label, func_label), - ArgVal(ArgVal::Word, sizeof(UWord))}; + args = {ArgVal(ArgVal::Type::Label, func_label), + ArgVal(ArgVal::Type::Word, sizeof(UWord))}; bma->emit(op_aligned_label_Lt, args); - args = {ArgVal(ArgVal::Word, func_label), - ArgVal(ArgVal::Immediate, mod_name), - ArgVal(ArgVal::Immediate, op.name), - ArgVal(ArgVal::Word, op.arity)}; + args = {ArgVal(ArgVal::Type::Word, func_label), + ArgVal(ArgVal::Type::Immediate, mod_name), + ArgVal(ArgVal::Type::Immediate, op.name), + ArgVal(ArgVal::Type::Word, op.arity)}; bma->emit(op_i_func_info_IaaI, args); - args = {ArgVal(ArgVal::Label, entry_label), - ArgVal(ArgVal::Word, sizeof(UWord))}; + args = {ArgVal(ArgVal::Type::Label, entry_label), + ArgVal(ArgVal::Type::Word, sizeof(UWord))}; bma->emit(op_aligned_label_Lt, args); args = {}; @@ -540,24 +540,26 @@ extern "C" BeamModuleAssembler ba(bga, info->mfa.module, 3); std::vector args; - args = {ArgVal(ArgVal::Label, 1), ArgVal(ArgVal::Word, sizeof(UWord))}; + args = {ArgVal(ArgVal::Type::Label, 1), + ArgVal(ArgVal::Type::Word, sizeof(UWord))}; ba.emit(op_aligned_label_Lt, args); - args = {ArgVal(ArgVal::Word, 1), - ArgVal(ArgVal::Immediate, info->mfa.module), - ArgVal(ArgVal::Immediate, info->mfa.function), - ArgVal(ArgVal::Word, info->mfa.arity)}; + args = {ArgVal(ArgVal::Type::Word, 1), + ArgVal(ArgVal::Type::Immediate, info->mfa.module), + ArgVal(ArgVal::Type::Immediate, info->mfa.function), + ArgVal(ArgVal::Type::Word, info->mfa.arity)}; ba.emit(op_i_func_info_IaaI, args); - args = {ArgVal(ArgVal::Label, 2), ArgVal(ArgVal::Word, sizeof(UWord))}; + args = {ArgVal(ArgVal::Type::Label, 2), + ArgVal(ArgVal::Type::Word, sizeof(UWord))}; ba.emit(op_aligned_label_Lt, args); args = {}; ba.emit(op_i_breakpoint_trampoline, args); - args = {ArgVal(ArgVal::Word, (BeamInstr)normal_fptr), - ArgVal(ArgVal::Word, (BeamInstr)lib), - ArgVal(ArgVal::Word, (BeamInstr)dirty_fptr)}; + args = {ArgVal(ArgVal::Type::Word, (BeamInstr)normal_fptr), + ArgVal(ArgVal::Type::Word, (BeamInstr)lib), + ArgVal(ArgVal::Type::Word, (BeamInstr)dirty_fptr)}; ba.emit(op_call_nif_WWW, args); ba.codegen(buff, buff_len); diff --git a/erts/emulator/beam/jit/beam_jit_register_cache.hpp b/erts/emulator/beam/jit/beam_jit_register_cache.hpp index f0cbdd58a0e1..b34908fac108 100644 --- a/erts/emulator/beam/jit/beam_jit_register_cache.hpp +++ b/erts/emulator/beam/jit/beam_jit_register_cache.hpp @@ -38,6 +38,14 @@ class RegisterCache { const Reg xregs_base; const Reg yregs_base; + const CacheEntry *cbegin() const { + return std::begin(cache); + } + + const CacheEntry *cend() const { + return cbegin() + entries; + } + CacheEntry *begin() { return std::begin(cache); } @@ -46,8 +54,8 @@ class RegisterCache { return begin() + entries; } - bool isCached(const Reg ®) { - return std::any_of(begin(), end(), [&](const auto &entry) { + bool isCached(const Reg ®) const { + return std::any_of(cbegin(), cend(), [&](const auto &entry) { return reg == entry.reg; }); } @@ -70,11 +78,11 @@ class RegisterCache { ASSERT(mem.hasBase()); consolidate(offset); - auto it = std::find_if(begin(), end(), [&](const auto &entry) { + auto it = std::find_if(cbegin(), cend(), [&](const auto &entry) { return mem == entry.mem; }); - if (it != end()) { + if (it != cend()) { ASSERT(it->reg.isValid()); return it->reg; } @@ -149,7 +157,7 @@ class RegisterCache { }); if (it != temporaries.cend()) { - ASSERT(std::none_of(begin(), end(), [&](const auto &entry) { + ASSERT(std::none_of(cbegin(), cend(), [&](const auto &entry) { return (*it == entry.reg) || (entry.mem.hasBase() && entry.mem.baseReg() == *it); })); @@ -189,7 +197,7 @@ class RegisterCache { it->mem = mem; } - bool validAt(size_t offset) { + bool validAt(size_t offset) const { return position == offset; } diff --git a/erts/emulator/beam/jit/x86/beam_asm_module.cpp b/erts/emulator/beam/jit/x86/beam_asm_module.cpp index b4aea60b0a08..570d80e6898a 100644 --- a/erts/emulator/beam/jit/x86/beam_asm_module.cpp +++ b/erts/emulator/beam/jit/x86/beam_asm_module.cpp @@ -105,28 +105,28 @@ Label BeamModuleAssembler::embed_vararg_rodata(const Span &args, a.align(AlignMode::kData, 8); switch (arg.getType()) { - case ArgVal::XReg: { + case ArgVal::Type::XReg: { auto index = arg.as().get(); data.as_beam = make_loader_x_reg(index); a.embed(&data.as_char, sizeof(data.as_beam)); } break; - case ArgVal::YReg: { + case ArgVal::Type::YReg: { auto index = arg.as().get(); data.as_beam = make_loader_y_reg(index + y_offset); a.embed(&data.as_char, sizeof(data.as_beam)); } break; - case ArgVal::Literal: { + case ArgVal::Type::Literal: { auto index = arg.as().get(); make_word_patch(literals[index].patches); } break; - case ArgVal::Label: + case ArgVal::Type::Label: a.embedLabel(resolve_beam_label(arg)); break; - case ArgVal::Immediate: + case ArgVal::Type::Immediate: data.as_beam = arg.as().get(); a.embed(&data.as_char, sizeof(data.as_beam)); break; - case ArgVal::Word: + case ArgVal::Type::Word: data.as_beam = arg.as().get(); a.embed(&data.as_char, sizeof(data.as_beam)); break; @@ -344,7 +344,7 @@ void BeamModuleAssembler::emit_aligned_label(const ArgLabel &Label, void BeamModuleAssembler::emit_i_func_label(const ArgLabel &Label) { flush_last_error(); - emit_aligned_label(Label, ArgVal(ArgVal::Word, sizeof(UWord))); + emit_aligned_label(Label, ArgVal(ArgVal::Type::Word, sizeof(UWord))); } void BeamModuleAssembler::emit_on_load() { diff --git a/erts/emulator/beam/jit/x86/instr_arith.cpp b/erts/emulator/beam/jit/x86/instr_arith.cpp index 21f1621ccf5f..9807a301798a 100644 --- a/erts/emulator/beam/jit/x86/instr_arith.cpp +++ b/erts/emulator/beam/jit/x86/instr_arith.cpp @@ -440,7 +440,7 @@ void BeamGlobalAssembler::emit_unary_minus_guard_shared() { void BeamModuleAssembler::emit_i_unary_minus(const ArgSource &Src, const ArgLabel &Fail, const ArgRegister &Dst) { - ArgVal zero = ArgVal(ArgVal::Immediate, make_small(0)); + ArgVal zero = ArgVal(ArgVal::Type::Immediate, make_small(0)); bool small_result = is_diff_small_if_args_are_small(zero, Src); if (always_small(Src) && small_result) { diff --git a/erts/emulator/beam/jit/x86/instr_bif.cpp b/erts/emulator/beam/jit/x86/instr_bif.cpp index 223cc5aa99dc..f1f9d0bae007 100644 --- a/erts/emulator/beam/jit/x86/instr_bif.cpp +++ b/erts/emulator/beam/jit/x86/instr_bif.cpp @@ -133,8 +133,8 @@ void BeamModuleAssembler::emit_setup_guard_bif(const std::vector &args, for (size_t i = 1; i < args.size() && is_contiguous_mem; i++) { const ArgSource &curr = args[i], &prev = args[i - 1]; - is_contiguous_mem = - ArgVal::memory_relation(prev, curr) == ArgVal::consecutive; + is_contiguous_mem = ArgVal::memory_relation(prev, curr) == + ArgVal::Relation::consecutive; } if (is_contiguous_mem) { @@ -789,7 +789,7 @@ void BeamGlobalAssembler::emit_bif_nif_epilogue(void) { emit_enter_runtime(); a.mov(ARG1, c_p); - runtime_call(); emit_leave_runtime(); diff --git a/erts/emulator/beam/jit/x86/instr_bs.cpp b/erts/emulator/beam/jit/x86/instr_bs.cpp index cb8e832da07f..adef43e1b870 100644 --- a/erts/emulator/beam/jit/x86/instr_bs.cpp +++ b/erts/emulator/beam/jit/x86/instr_bs.cpp @@ -1295,11 +1295,11 @@ void BeamModuleAssembler::update_bin_state(x86::Gp bin_offset, x86::Gp size_reg) { const int x_reg_offset = offsetof(ErtsSchedulerRegisters, x_reg_array.d); const int cur_bin_base = - offsetof(ErtsSchedulerRegisters, aux_regs.d.erl_bits_state) + - offsetof(struct erl_bits_state, erts_current_bin); + offsetof(ErtsSchedulerRegisters, + aux_regs.d.erl_bits_state.erts_current_bin); const int cur_bin_offset = - offsetof(ErtsSchedulerRegisters, aux_regs.d.erl_bits_state) + - offsetof(struct erl_bits_state, erts_bin_offset); + offsetof(ErtsSchedulerRegisters, + aux_regs.d.erl_bits_state.erts_bin_offset); x86::Mem mem_bin_base = x86::Mem(registers, cur_bin_base - x_reg_offset, sizeof(UWord)); @@ -1903,11 +1903,11 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, const int x_reg_offset = offsetof(ErtsSchedulerRegisters, x_reg_array.d); const int cur_bin_base = - offsetof(ErtsSchedulerRegisters, aux_regs.d.erl_bits_state) + - offsetof(struct erl_bits_state, erts_current_bin); + offsetof(ErtsSchedulerRegisters, + aux_regs.d.erl_bits_state.erts_current_bin); const int cur_bin_offset = - offsetof(ErtsSchedulerRegisters, aux_regs.d.erl_bits_state) + - offsetof(struct erl_bits_state, erts_bin_offset); + offsetof(ErtsSchedulerRegisters, + aux_regs.d.erl_bits_state.erts_bin_offset); x86::Mem mem_bin_base = x86::qword_ptr(registers, cur_bin_base - x_reg_offset); x86::Mem mem_bin_offset = @@ -2725,7 +2725,7 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, break; case am_string: { ArgBytePtr string_ptr( - ArgVal(ArgVal::BytePtr, seg.src.as().get())); + ArgVal(ArgVal::Type::BytePtr, seg.src.as().get())); runtime_entered = bs_maybe_enter_runtime(runtime_entered); comment("insert string"); diff --git a/erts/emulator/beam/jit/x86/instr_common.cpp b/erts/emulator/beam/jit/x86/instr_common.cpp index c9bcca7c8c3d..d85166eb24d0 100644 --- a/erts/emulator/beam/jit/x86/instr_common.cpp +++ b/erts/emulator/beam/jit/x86/instr_common.cpp @@ -839,7 +839,7 @@ void BeamModuleAssembler::emit_put_tuple2(const ArgRegister &Dst, mov_arg(dst_ptr, args[i]); } else { switch (ArgVal::memory_relation(args[i], args[i + 1])) { - case ArgVal::consecutive: { + case ArgVal::Relation::consecutive: { x86::Mem src_ptr = getArgRef(args[i], 16); comment("(moving two elements at once)"); @@ -851,7 +851,7 @@ void BeamModuleAssembler::emit_put_tuple2(const ArgRegister &Dst, i++; break; } - case ArgVal::reverse_consecutive: { + case ArgVal::Relation::reverse_consecutive: { if (!hasCpuFeature(CpuFeatures::X86::kAVX)) { mov_arg(dst_ptr, args[i]); } else { @@ -867,7 +867,7 @@ void BeamModuleAssembler::emit_put_tuple2(const ArgRegister &Dst, } break; } - case ArgVal::none: { + case ArgVal::Relation::none: { unsigned j; if (value == args[i]) { mov_preserve_cache(dst_ptr, RET); diff --git a/erts/emulator/beam/jit/x86/instr_map.cpp b/erts/emulator/beam/jit/x86/instr_map.cpp index ec89755dc4a1..3b0a09ed0461 100644 --- a/erts/emulator/beam/jit/x86/instr_map.cpp +++ b/erts/emulator/beam/jit/x86/instr_map.cpp @@ -305,7 +305,7 @@ void BeamModuleAssembler::emit_i_new_small_map_lit(const ArgRegister &Dst, auto second = data[i + 1]; switch (ArgVal::memory_relation(first, second)) { - case ArgVal::consecutive: { + case ArgVal::Relation::consecutive: { x86::Mem src_ptr = getArgRef(first, 16); comment("(initializing two elements at once)"); @@ -314,7 +314,7 @@ void BeamModuleAssembler::emit_i_new_small_map_lit(const ArgRegister &Dst, vmovups(dst_ptr0, x86::xmm0); break; } - case ArgVal::reverse_consecutive: { + case ArgVal::Relation::reverse_consecutive: { if (!hasCpuFeature(CpuFeatures::X86::kAVX)) { mov_arg(dst_ptr0, first); mov_arg(dst_ptr1, second); @@ -328,7 +328,7 @@ void BeamModuleAssembler::emit_i_new_small_map_lit(const ArgRegister &Dst, } break; } - case ArgVal::none: + case ArgVal::Relation::none: mov_arg(dst_ptr0, first); mov_arg(dst_ptr1, second); break; diff --git a/erts/emulator/beam/jit/x86/instr_select.cpp b/erts/emulator/beam/jit/x86/instr_select.cpp index fe1736fc7bc7..13255cea8017 100644 --- a/erts/emulator/beam/jit/x86/instr_select.cpp +++ b/erts/emulator/beam/jit/x86/instr_select.cpp @@ -266,7 +266,7 @@ bool BeamModuleAssembler::emit_optimized_two_way_select(bool destructive, uint64_t y = value2.as().get(); uint64_t combined = x | y; uint64_t diff = x ^ y; - ArgVal val(ArgVal::Immediate, combined); + ArgVal val(ArgVal::Type::Immediate, combined); if ((diff & (diff - 1)) != 0) return false;