From 566ff495cb0f5f87306c81fc8d8ab2323b34d840 Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Tue, 4 Apr 2017 18:13:22 +0200
Subject: erts: Refactor ErtsCodeInfo.native

into union with actual usage types.
---
 erts/emulator/beam/beam_bp.c       | 26 +++++++++++++-------------
 erts/emulator/beam/beam_emu.c      |  6 +++---
 erts/emulator/beam/beam_load.c     | 12 +++++++-----
 erts/emulator/beam/code_ix.h       |  8 +++++++-
 erts/emulator/beam/erl_bif_trace.c |  4 ++--
 erts/emulator/beam/erl_nif.c       |  4 ++--
 erts/emulator/beam/export.c        |  2 +-
 7 files changed, 35 insertions(+), 27 deletions(-)

(limited to 'erts')

diff --git a/erts/emulator/beam/beam_bp.c b/erts/emulator/beam/beam_bp.c
index b32c74ce7a..1efe7536d6 100644
--- a/erts/emulator/beam/beam_bp.c
+++ b/erts/emulator/beam/beam_bp.c
@@ -327,7 +327,7 @@ erts_consolidate_bif_bp_data(void)
 static void
 consolidate_bp_data(Module* modp, ErtsCodeInfo *ci, int local)
 {
-    GenericBp* g = (GenericBp *) ci->native;
+    GenericBp* g = ci->u.gen_bp;
     GenericBpData* src;
     GenericBpData* dst;
     Uint flags;
@@ -376,7 +376,7 @@ consolidate_bp_data(Module* modp, ErtsCodeInfo *ci, int local)
 	    ASSERT(*erts_codeinfo_to_code(ci) !=
                    (BeamInstr) BeamOp(op_i_generic_breakpoint));
 	}
-	ci->native = 0;
+	ci->u.gen_bp = NULL;
 	Free(g);
 	return;
     }
@@ -427,7 +427,7 @@ erts_install_breakpoints(BpFunctions* f)
     for (i = 0; i < n; i++) {
 	ErtsCodeInfo* ci = f->matching[i].ci;
         BeamInstr *pc = erts_codeinfo_to_code(ci);
-	GenericBp* g = (GenericBp *) ci->native;
+	GenericBp* g = ci->u.gen_bp;
 	if (*pc != br && g) {
 	    Module* modp = f->matching[i].mod;
 
@@ -468,7 +468,7 @@ uninstall_breakpoint(ErtsCodeInfo *ci)
 {
     BeamInstr *pc = erts_codeinfo_to_code(ci);
     if (*pc == (BeamInstr) BeamOp(op_i_generic_breakpoint)) {
-	GenericBp* g = (GenericBp *) ci->native;
+	GenericBp* g = ci->u.gen_bp;
 	if (g->data[erts_active_bp_ix()].flags == 0) {
 	    /*
 	     * The following write is not protected by any lock. We
@@ -549,7 +549,7 @@ erts_clear_trace_break(BpFunctions* f)
 void
 erts_clear_call_trace_bif(ErtsCodeInfo *ci, int local)
 {
-    GenericBp* g = (GenericBp *) ci->native;
+    GenericBp* g = ci->u.gen_bp;
 
     if (g) {
 	Uint flags = local ? ERTS_BPF_LOCAL_TRACE : ERTS_BPF_GLOBAL_TRACE;
@@ -624,7 +624,7 @@ erts_clear_module_break(Module *modp) {
 	    continue;
 	uninstall_breakpoint(ci);
 	consolidate_bp_data(modp, ci, 1);
-	ASSERT(ci->native == 0);
+	ASSERT(ci->u.gen_bp == NULL);
     }
     return n;
 }
@@ -638,7 +638,7 @@ erts_clear_export_break(Module* modp, ErtsCodeInfo *ci)
     erts_commit_staged_bp();
     *erts_codeinfo_to_code(ci) = (BeamInstr) 0;
     consolidate_bp_data(modp, ci, 0);
-    ASSERT(ci->native == 0);
+    ASSERT(ci->u.gen_bp == NULL);
 }
 
 BeamInstr
@@ -651,7 +651,7 @@ erts_generic_breakpoint(Process* c_p, ErtsCodeInfo *info, Eterm* reg)
 
     ASSERT(info->op == (BeamInstr) BeamOp(op_i_func_info_IaaI));
 
-    g = (GenericBp *) info->native;
+    g = info->u.gen_bp;
     bp = &g->data[ix];
     bp_flags = bp->flags;
     ASSERT((bp_flags & ~ERTS_BPF_ALL) == 0);
@@ -754,7 +754,7 @@ erts_bif_trace(int bif_index, Process* p, Eterm* args, BeamInstr* I)
 
     ERTS_SMP_CHK_HAVE_ONLY_MAIN_PROC_LOCK(p);
 
-    g = (GenericBp *) ep->info.native;
+    g = ep->info.u.gen_bp;
     if (g) {
 	bp = &g->data[erts_active_bp_ix()];
 	bp_flags = bp->flags;
@@ -1511,7 +1511,7 @@ set_function_break(ErtsCodeInfo *ci, Binary *match_spec, Uint break_flags,
     ErtsBpIndex ix = erts_staging_bp_ix();
 
     ERTS_SMP_LC_ASSERT(erts_has_code_write_permission());
-    g = (GenericBp *) ci->native;
+    g = ci->u.gen_bp;
     if (g == 0) {
 	int i;
 	if (count_op == ERTS_BREAK_RESTART || count_op == ERTS_BREAK_PAUSE) {
@@ -1523,7 +1523,7 @@ set_function_break(ErtsCodeInfo *ci, Binary *match_spec, Uint break_flags,
 	for (i = 0; i < ERTS_NUM_BP_IX; i++) {
 	    g->data[i].flags = 0;
 	}
-	ci->native = (BeamInstr) g;
+	ci->u.gen_bp = g;
     }
     bp = &g->data[ix];
 
@@ -1633,7 +1633,7 @@ clear_function_break(ErtsCodeInfo *ci, Uint break_flags)
 
     ERTS_SMP_LC_ASSERT(erts_has_code_write_permission());
 
-    if ((g = (GenericBp *) ci->native) == 0) {
+    if ((g = ci->u.gen_bp) == NULL) {
 	return 1;
     }
 
@@ -1728,7 +1728,7 @@ get_time_break(ErtsCodeInfo *ci)
 static GenericBpData*
 check_break(ErtsCodeInfo *ci, Uint break_flags)
 {
-    GenericBp* g = (GenericBp *) ci->native;
+    GenericBp* g = ci->u.gen_bp;
 
     ASSERT(ci->op == (BeamInstr) BeamOp(op_i_func_info_IaaI));
     if (erts_is_native_break(ci)) {
diff --git a/erts/emulator/beam/beam_emu.c b/erts/emulator/beam/beam_emu.c
index 9a91fdce08..3291f92b71 100644
--- a/erts/emulator/beam/beam_emu.c
+++ b/erts/emulator/beam/beam_emu.c
@@ -4948,14 +4948,14 @@ do {						\
 	  */
          ErtsCodeInfo *ci = erts_code_to_codeinfo(I);
 	 ASSERT(ci->op == (Uint) OpCode(i_func_info_IaaI));
-	 c_p->hipe.u.ncallee = (void(*)(void)) ci->native;
+	 c_p->hipe.u.ncallee = ci->u.ncallee;
 	 ++hipe_trap_count;
 	 HIPE_MODE_SWITCH(HIPE_MODE_SWITCH_CMD_CALL | (ci->mfa.arity << 8));
      }
      OpCase(hipe_trap_call_closure): {
        ErtsCodeInfo *ci = erts_code_to_codeinfo(I);
        ASSERT(ci->op == (Uint) OpCode(i_func_info_IaaI));
-       c_p->hipe.u.ncallee = (void(*)(void)) ci->native;
+       c_p->hipe.u.ncallee = ci->u.ncallee;
        ++hipe_trap_count;
        HIPE_MODE_SWITCH(HIPE_MODE_SWITCH_CMD_CALL_CLOSURE | (ci->mfa.arity << 8));
      }
@@ -5027,7 +5027,7 @@ do {						\
       * ... remainder of original BEAM code
       */
      ErtsCodeInfo *ci = erts_code_to_codeinfo(I);
-     struct hipe_call_count *hcc = (struct hipe_call_count*)ci->native;
+     struct hipe_call_count *hcc = ci->u.hcc;
      ASSERT(ci->op == (Uint) OpCode(i_func_info_IaaI));
      ASSERT(hcc != NULL);
      ASSERT(VALID_INSTR(hcc->opcode));
diff --git a/erts/emulator/beam/beam_load.c b/erts/emulator/beam/beam_load.c
index 6eea963016..ae98b37956 100644
--- a/erts/emulator/beam/beam_load.c
+++ b/erts/emulator/beam/beam_load.c
@@ -5708,12 +5708,13 @@ erts_is_module_native(BeamCodeHeader* code_hdr)
 static Eterm
 native_addresses(Process* p, BeamCodeHeader* code_hdr)
 {
+    Eterm result = NIL;
+#ifdef HIPE
     int i;
     Eterm* hp;
     Uint num_functions;
     Uint need;
     Eterm* hp_end;
-    Eterm result = NIL;
 
     num_functions = code_hdr->num_functions;
     need = (6+BIG_UINT_HEAP_SIZE)*num_functions;
@@ -5725,16 +5726,17 @@ native_addresses(Process* p, BeamCodeHeader* code_hdr)
 
 	ASSERT(is_atom(ci->mfa.function)
                || is_nil(ci->mfa.function)); /* [] if BIF stub */
-	if (ci->native != 0) {
+	if (ci->u.ncallee != NULL) {
             Eterm addr;
 	    ASSERT(is_atom(ci->mfa.function));
-	    addr = erts_bld_uint(&hp, NULL, ci->native);
+	    addr = erts_bld_uint(&hp, NULL, (Uint)ci->u.ncallee);
 	    tuple = erts_bld_tuple(&hp, NULL, 3, ci->mfa.function,
                                    make_small(ci->mfa.arity), addr);
 	    result = erts_bld_cons(&hp, NULL, tuple, result);
 	}
     }
     HRelease(p, hp_end, hp);
+#endif
     return result;
 }
 
@@ -6033,7 +6035,7 @@ make_stub(ErtsCodeInfo* info, Eterm mod, Eterm func, Uint arity, Uint native, Be
     DBG_TRACE_MFA(mod,func,arity,"make beam stub at %p", erts_codeinfo_to_code(info));
     ASSERT(WORDS_PER_FUNCTION == 6);
     info->op = (BeamInstr) BeamOp(op_i_func_info_IaaI);
-    info->native = native;
+    info->u.ncallee = (void (*)(void)) native;
     info->mfa.module = mod;
     info->mfa.function = func;
     info->mfa.arity = arity;
@@ -6104,7 +6106,7 @@ stub_final_touch(LoaderState* stp, ErtsCodeInfo* ci)
     Lambda* lp;
 
     if (is_bif(ci->mfa.module, ci->mfa.function, ci->mfa.arity)) {
-	ci->native = 0;
+	ci->u.ncallee = NULL;
 	ci->mfa.module = 0;
 	ci->mfa.function = 0;
 	ci->mfa.arity = 0;
diff --git a/erts/emulator/beam/code_ix.h b/erts/emulator/beam/code_ix.h
index 1b451bf921..e802ad5dd7 100644
--- a/erts/emulator/beam/code_ix.h
+++ b/erts/emulator/beam/code_ix.h
@@ -80,7 +80,13 @@ typedef struct ErtsCodeMFA_ {
    in ops.tab to reflect the new func_info size */
 typedef struct ErtsCodeInfo_ {
     BeamInstr op;           /* OpCode(i_func_info) */
-    BeamInstr native;       /* Used by hipe and trace to store extra data */
+    union {
+        struct generic_bp* gen_bp;     /* Trace breakpoint */
+#ifdef HIPE
+        void (*ncallee)(void);
+        struct hipe_call_count* hcc;
+#endif
+    }u;
     ErtsCodeMFA mfa;
 } ErtsCodeInfo;
 
diff --git a/erts/emulator/beam/erl_bif_trace.c b/erts/emulator/beam/erl_bif_trace.c
index f471390501..023bfca797 100644
--- a/erts/emulator/beam/erl_bif_trace.c
+++ b/erts/emulator/beam/erl_bif_trace.c
@@ -1737,7 +1737,7 @@ setup_bif_trace(void)
 
     for (i = 0; i < BIF_SIZE; ++i) {
 	Export *ep = bif_export[i];
-	GenericBp* g = (GenericBp *) ep->info.native;
+	GenericBp* g = ep->info.u.gen_bp;
 	if (g) {
 	    if (ExportIsBuiltIn(ep)) {
 		ASSERT(ep->beam[1]);
@@ -1755,7 +1755,7 @@ reset_bif_trace(void)
 
     for (i = 0; i < BIF_SIZE; ++i) {
 	Export *ep = bif_export[i];
-	GenericBp* g = (GenericBp *) ep->info.native;
+	GenericBp* g = ep->info.u.gen_bp;
 	if (g && g->data[active].flags == 0) {
 	    if (ExportIsBuiltIn(ep)) {
 		ASSERT(ep->beam[1]);
diff --git a/erts/emulator/beam/erl_nif.c b/erts/emulator/beam/erl_nif.c
index 63a4a997da..deed74ee49 100644
--- a/erts/emulator/beam/erl_nif.c
+++ b/erts/emulator/beam/erl_nif.c
@@ -3653,11 +3653,11 @@ BIF_RETTYPE load_nif_2(BIF_ALIST_2)
 	    ci = *get_func_pp(this_mi->code_hdr, f_atom, f->arity);
             code_ptr = erts_codeinfo_to_code(ci);
 
-	    if (ci->native == 0) {
+	    if (ci->u.gen_bp == NULL) {
 		code_ptr[0] = (BeamInstr) BeamOp(op_call_nif);
 	    }
 	    else { /* Function traced, patch the original instruction word */
-		GenericBp* g = (GenericBp *) ci->native;
+		GenericBp* g = ci->u.gen_bp;
 		ASSERT(code_ptr[0] ==
 		       (BeamInstr) BeamOp(op_i_generic_breakpoint));
 		g->orig_instr = (BeamInstr) BeamOp(op_call_nif);
diff --git a/erts/emulator/beam/export.c b/erts/emulator/beam/export.c
index 33ed6d7ec1..ecfef28c57 100644
--- a/erts/emulator/beam/export.c
+++ b/erts/emulator/beam/export.c
@@ -132,7 +132,7 @@ export_alloc(struct export_entry* tmpl_e)
 	erts_smp_atomic_add_nob(&total_entries_bytes, sizeof(*blob));
 	obj = &blob->exp;
 	obj->info.op =  0;
-	obj->info.native = 0;
+	obj->info.u.gen_bp = NULL;
 	obj->info.mfa.module = tmpl->info.mfa.module;
 	obj->info.mfa.function = tmpl->info.mfa.function;
 	obj->info.mfa.arity = tmpl->info.mfa.arity;
-- 
cgit v1.2.3