File 2975-erts-Make-etp-understand-literal-tag.patch of Package erlang

From 1e978ad84187950db349c8eaab6bf46f11135982 Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Wed, 17 Feb 2021 13:14:06 +0100
Subject: [PATCH 5/5] erts: Make etp understand literal tag

---
 erts/emulator/beam/erl_init.c |  5 ++
 erts/etc/unix/etp-commands.in | 92 +++++++++++++++++------------------
 2 files changed, 51 insertions(+), 46 deletions(-)

diff --git a/erts/emulator/beam/erl_init.c b/erts/emulator/beam/erl_init.c
index 17f8d8dc02..c61094c95b 100644
--- a/erts/emulator/beam/erl_init.c
+++ b/erts/emulator/beam/erl_init.c
@@ -118,6 +118,11 @@ const Eterm etp_magic_ref_header = ERTS_MAGIC_REF_THING_HEADER;
 const Eterm etp_magic_ref_header = ERTS_REF_THING_HEADER;
 #endif
 const Eterm etp_the_non_value = THE_NON_VALUE;
+#ifdef TAG_LITERAL_PTR
+const Eterm etp_ptr_mask = (~(Eterm)7);
+#else
+const Eterm etp_ptr_mask = (~(Eterm)3);
+#endif
 #ifdef ERTS_HOLE_MARKER
 const Eterm etp_hole_marker = ERTS_HOLE_MARKER;
 #else
diff --git a/erts/etc/unix/etp-commands.in b/erts/etc/unix/etp-commands.in
index 9784deedce..1648daefa6 100644
--- a/erts/etc/unix/etp-commands.in
+++ b/erts/etc/unix/etp-commands.in
@@ -133,14 +133,14 @@ define etp-1
   if (($arg0) & 0x3) == 1
     # Cons pointer
     if $etp_flat
-      printf "<etpf-cons %p>", (($arg0)-1)
+      printf "<etpf-cons %p>", (($arg0) & etp_ptr_mask)
     else
       etp-list-1 ($arg0) ($arg1)
     end
   else
     if (($arg0) & 0x3) == 2
       if $etp_flat
-        printf "<etpf-boxed %p>", (($arg0)-2)
+        printf "<etpf-boxed %p>", (($arg0) etp_ptr_mask)
       else
         etp-boxed-1 ($arg0) ($arg1)
       end
@@ -222,12 +222,12 @@ define etp-list-printable-1
           $etp_list_printable
       if ($etp_list_p & 0x3) == 0x1
         # Cons pointer
-        set $etp_list_n = ((Eterm*)($etp_list_p & ~0x3))[0]
+        set $etp_list_n = ((Eterm*)($etp_list_p & etp_ptr_mask))[0]
         if ($etp_list_n & 0xF) == 0xF
           etp-ct-printable-1 ($etp_list_n>>4)
           if $etp_ct_printable
             # Printable
-            set $etp_list_p = ((Eterm*)($etp_list_p & ~0x3))[1]
+            set $etp_list_p = ((Eterm*)($etp_list_p & etp_ptr_mask))[1]
             set $etp_list_i++
           else
             set $etp_list_printable = 0
@@ -246,9 +246,9 @@ define etp-list-printable-1
       set $etp_list_p = ($arg0)
       set $etp_list_i = 0
       while $etp_list_p != $etp_nil
-        set $etp_list_n = ((Eterm*)($etp_list_p & ~0x3))[0]
+        set $etp_list_n = ((Eterm*)($etp_list_p & etp_ptr_mask))[0]
         etp-char-1 ($etp_list_n>>4) '"'
-        set $etp_list_p = ((Eterm*)($etp_list_p & ~0x3))[1]
+        set $etp_list_p = ((Eterm*)($etp_list_p & etp_ptr_mask))[1]
         set $etp_list_i++
         if $etp_list_p == $etp_nil
           printf "\""
@@ -279,22 +279,22 @@ define etp-list-2
     if ($arg1) >= $etp_max_depth
       printf "...]"
     else
-      etp-1 (((Eterm*)(($arg0)&~0x3))[0]) (($arg1)+1)
-      if ((Eterm*)(($arg0) & ~0x3))[1] == $etp_nil
+      etp-1 (((Eterm*)(($arg0)&etp_ptr_mask))[0]) (($arg1)+1)
+      if ((Eterm*)(($arg0) & etp_ptr_mask))[1] == $etp_nil
         # Tail is []
         printf "]"
       else
         if $etp_chart
           etp-chart-entry-1 ($arg0) ($arg1) 2
         end
-        if (((Eterm*)(($arg0)&~0x3))[1]&0x3) == 0x1
+        if (((Eterm*)(($arg0)&etp_ptr_mask))[1]&0x3) == 0x1
           # Tail is cons cell
           printf ","
-          etp-list-2 (((Eterm*)(($arg0)&~0x3))[1]) (($arg1)+1)
+          etp-list-2 (((Eterm*)(($arg0)&etp_ptr_mask))[1]) (($arg1)+1)
         else
           # Tail is other term
           printf "|"
-          etp-1 (((Eterm*)(($arg0)&~0x3))[1]) (($arg1)+1)
+          etp-1 (((Eterm*)(($arg0)&etp_ptr_mask))[1]) (($arg1)+1)
           printf "]"
         end
       end
@@ -313,9 +313,9 @@ define etpf-cons
     # Cons pointer
     set $etp_flat = 1
     printf "["
-    etp-1 (((Eterm*)((Eterm)($arg0)&~0x3))[0])
+    etp-1 (((Eterm*)((Eterm)($arg0)&etp_ptr_mask))[0])
     printf "|"
-    etp-1 (((Eterm*)((Eterm)($arg0)&~0x3))[1])
+    etp-1 (((Eterm*)((Eterm)($arg0)&etp_ptr_mask))[1])
     printf "]\n"
     set $etp_flat = 0
   end
@@ -339,42 +339,42 @@ define etp-boxed-1
   if (($arg0) & 0x3) != 0x2
     printf "#NotBoxed<%p>", ($arg0)
   else
-    if (((Eterm*)(($arg0) & ~0x3))[0] & 0x3) != 0x0
+    if (((Eterm*)(($arg0) & etp_ptr_mask))[0] & 0x3) != 0x0
       if $etp_chart
-        etp-chart-entry-1 (($arg0)&~0x3) ($arg1) 1
+        etp-chart-entry-1 (($arg0)&etp_ptr_mask) ($arg1) 1
       end
       printf "#BoxedError<%p>", ($arg0)
     else
       if $etp_chart
-        etp-chart-entry-1 (($arg0)&~0x3) ($arg1) \
-                          ((((Eterm*)(($arg0)&~0x3))[0]>>6)+1)
+        etp-chart-entry-1 (($arg0)&etp_ptr_mask) ($arg1) \
+                          ((((Eterm*)(($arg0)&etp_ptr_mask))[0]>>6)+1)
       end
-      if (((Eterm*)(($arg0) & ~0x3))[0] & 0x3f) == 0x0
+      if (((Eterm*)(($arg0) & etp_ptr_mask))[0] & 0x3f) == 0x0
         printf "{"
-        etp-array-1 ((Eterm*)(($arg0)&~0x3)) ($arg1) ($arg1) \
-                    1 ((((Eterm*)(($arg0)&~0x3))[0]>>6)+1) '}'
+        etp-array-1 ((Eterm*)(($arg0)&etp_ptr_mask)) ($arg1) ($arg1) \
+                    1 ((((Eterm*)(($arg0)&etp_ptr_mask))[0]>>6)+1) '}'
       else
-        if (((Eterm*)(($arg0) & ~0x3))[0] & 0x3c) == 0x3c
+        if (((Eterm*)(($arg0) & etp_ptr_mask))[0] & 0x3c) == 0x3c
 	  # A map
-	  if (((Eterm*)(($arg0) & ~0x3))[0] & 0xc0) == 0x0
+	  if (((Eterm*)(($arg0) & etp_ptr_mask))[0] & 0xc0) == 0x0
 	    # Flat map
 	    printf "#{Keys:"
-	    etp-1 ((flatmap_t*)(($arg0)&~0x3))->keys (($arg1)+1)
+	    etp-1 ((flatmap_t*)(($arg0)&etp_ptr_mask))->keys (($arg1)+1)
 	    printf " Values:{"
-	    etp-array-1 ((Eterm*)(($arg0)&~0x3)+3) ($arg1) ($arg1) \
-                        0 ((flatmap_t*)(($arg0)&~0x3))->size '}'
+	    etp-array-1 ((Eterm*)(($arg0)&etp_ptr_mask)+3) ($arg1) ($arg1) \
+                        0 ((flatmap_t*)(($arg0)&etp_ptr_mask))->size '}'
 	    printf "}"
           else
 	    # Hashmap
-            printf "#<%x>{", (((((Eterm*)(($arg0)&~0x3))[0])>>(6+2+8))&0xffff)
-	    if (((Eterm*)(($arg0) & ~0x3))[0] & 0xc0) >= 0x80
+            printf "#<%x>{", (((((Eterm*)(($arg0)&etp_ptr_mask))[0])>>(6+2+8))&0xffff)
+	    if (((Eterm*)(($arg0) & etp_ptr_mask))[0] & 0xc0) >= 0x80
               # head bitmap/array
-	      etp-bitmap-array-1 ((Eterm*)(($arg0)&~0x3)+2) ($arg1) ($arg1) \
-                        0 (((((Eterm*)(($arg0)&~0x3))[0])>>(6+2+8))&0xffff) '}'
+	      etp-bitmap-array-1 ((Eterm*)(($arg0)&etp_ptr_mask)+2) ($arg1) ($arg1) \
+                        0 (((((Eterm*)(($arg0)&etp_ptr_mask))[0])>>(6+2+8))&0xffff) '}'
             else
               # node bitmap
-	      etp-bitmap-array-1 ((Eterm*)(($arg0)&~0x3)+1) ($arg1) ($arg1) \
-                        0 (((((Eterm*)(($arg0)&~0x3))[0])>>(6+2+8))&0xffff) '}'
+	      etp-bitmap-array-1 ((Eterm*)(($arg0)&etp_ptr_mask)+1) ($arg1) ($arg1) \
+                        0 (((((Eterm*)(($arg0)&etp_ptr_mask))[0])>>(6+2+8))&0xffff) '}'
             end
 	  end
         else
@@ -393,10 +393,10 @@ define etp-boxed-immediate-1
   if (($arg0) & 0x3) != 0x2
     printf "#NotBoxed<%p>", ($arg0)
   else
-    if (((Eterm*)(($arg0) & ~0x3))[0] & 0x3) != 0x0
+    if (((Eterm*)(($arg0) & etp_ptr_mask))[0] & 0x3) != 0x0
       printf "#BoxedError<%p>", ($arg0)
     else
-      set $etp_boxed_immediate_p = (Eterm*)(($arg0) & ~0x3)
+      set $etp_boxed_immediate_p = (Eterm*)(($arg0) & etp_ptr_mask)
       set $etp_boxed_immediate_h = ($etp_boxed_immediate_p[0] >> 2) & 0xF
       if $etp_boxed_immediate_h == 0xC
         etp-extpid-1 ($arg0)
@@ -543,7 +543,7 @@ end
 #    printf "%% Max depth for term %d\n", $etp_chart_id
 #  else
 #    if ($arg2) < ($arg3)
-#      etp-1 (((Eterm*)(($arg0)&~0x3))[$arg2]) (($arg1)+1)
+#      etp-1 (((Eterm*)(($arg0)&etp_ptr_mask))[$arg2]) (($arg1)+1)
 #      etpa-1 ($arg0) (($arg1)+1) (($arg2)+1) ($arg3)
 #    end
 #  end
@@ -861,7 +861,7 @@ define etp-extpid-1
   if ((Eterm)($arg0) & 0x3) != 0x2
     printf "#NotBoxed<%p>", (Eterm)($arg0)
   else
-    set $etp_extpid_1_p = (ExternalThing*)((Eterm)($arg0) & ~0x3)
+    set $etp_extpid_1_p = (ExternalThing*)((Eterm)($arg0) & etp_ptr_mask)
     if ($etp_extpid_1_p->header & 0x3f) != 0x30
       printf "#NotExternalPid<%p>", $etp_extpid_1_p->header
     else
@@ -921,7 +921,7 @@ define etp-extport-1
   if ((Eterm)($arg0) & 0x3) != 0x2
     printf "#NotBoxed<%p>", (Eterm)($arg0)
   else
-    set $etp_extport_1_p = (ExternalThing*)((Eterm)($arg0) & ~0x3)
+    set $etp_extport_1_p = (ExternalThing*)((Eterm)($arg0) & etp_ptr_mask)
     if ($etp_extport_1_p->header & 0x3F) != 0x34
       printf "#NotExternalPort<%p>", $etp_extport_1->header
     else
@@ -957,7 +957,7 @@ define etp-bignum-1
   if ((Eterm)($arg0) & 0x3) != 0x2
     printf "#NotBoxed<%p>", (Eterm)($arg0)
   else
-    set $etp_bignum_1_p = (Eterm*)((Eterm)($arg0) & ~0x3)
+    set $etp_bignum_1_p = (Eterm*)((Eterm)($arg0) & etp_ptr_mask)
     if ($etp_bignum_1_p[0] & 0x3b) != 0x08
       printf "#NotBignum<%p>", $etp_bignum_1_p[0]
     else
@@ -996,7 +996,7 @@ define etp-float-1
   if ((Eterm)($arg0) & 0x3) != 0x2
     printf "#NotBoxed<%p>", (Eterm)($arg0)
   else
-    set $etp_float_1_p = (Eterm*)((Eterm)($arg0) & ~0x3)
+    set $etp_float_1_p = (Eterm*)((Eterm)($arg0) & etp_ptr_mask)
     if ($etp_float_1_p[0] & 0x3f) != 0x18
       printf "#NotFloat<%p>", $etp_float_1_p[0]
     else
@@ -1015,7 +1015,7 @@ define etp-ref-1
   if ((Eterm)($arg0) & 0x3) != 0x2
     printf "#NotBoxed<%p>", (Eterm)($arg0)
   else
-    set $etp_ref_1_p = (ErtsORefThing *)((Eterm)($arg0) & ~0x3)
+    set $etp_ref_1_p = (ErtsORefThing *)((Eterm)($arg0) & etp_ptr_mask)
     if ($etp_ref_1_p->header & 0x3b) != 0x10
       printf "#NotRef<%p>", $etp_ref_1_p->header
     else
@@ -1062,7 +1062,7 @@ define etp-extref-1
   if ((Eterm)($arg0) & 0x3) != 0x2
     printf "#NotBoxed<%p>", (Eterm)($arg0)
   else
-    set $etp_extref_1_p = (ExternalThing*)((Eterm)($arg0) & ~0x3)
+    set $etp_extref_1_p = (ExternalThing*)((Eterm)($arg0) & etp_ptr_mask)
     if ($etp_extref_1_p->header & 0x3F) != 0x38
       printf "#NotExternalRef<%p>", $etp_extref_1->header
     else
@@ -1864,7 +1864,7 @@ define etp-term-dump
   else
     if (($arg0) & 0x3) == 1
       # Cons pointer
-      set $etp_term_dump_cons_p = ((Eterm*)(($arg0) & ~0x3))
+      set $etp_term_dump_cons_p = ((Eterm*)(($arg0) & etp_ptr_mask))
       if $etp_term_dump_cons_p > $etp_heapdump_heap &&  $etp_term_dump_cons_p < $etp_heapdump_end
         printf "| C:0x%08x ", $etp_term_dump_cons_p
         #printf "| C: --> %5d ", $etp_heapdump_p - $etp_term_dump_cons_p - 1
@@ -3503,9 +3503,9 @@ define etp-dictdump
             else
               set $etp_dictdump_written = 1
             end
-            etp-1 (((Eterm*)((Eterm)$etp_dictdump_p&~0x3))[0]) 0
+            etp-1 (((Eterm*)((Eterm)$etp_dictdump_p&etp_ptr_mask))[0]) 0
             set $etp_dictdump_cnt--
-            set $etp_dictdump_p = ((Eterm*)((Eterm)$etp_dictdump_p & ~0x3))[1]
+            set $etp_dictdump_p = ((Eterm*)((Eterm)$etp_dictdump_p & etp_ptr_mask))[1]
           end
           if $etp_dictdump_p != $etp_nil
             printf "#DictSlotError<%d>:", $etp_dictdump_i
@@ -3617,7 +3617,7 @@ define etp-search-heaps
   etp-1 ($arg0) 0
   set $etp_flat = 0
   printf ":...\n"
-  etp-search-heaps-1 ((Eterm*)((Eterm)($arg0)&~(Eterm)3))
+  etp-search-heaps-1 ((Eterm*)((Eterm)($arg0)&etp_ptr_mask))
 end
 
 define etp-search-heaps-1
@@ -4113,11 +4113,11 @@ define etp-chart-entry-1
     set $etp_chart_id++
     printf "#%d:", $etp_chart_id
   end
-  append binary value etp-commands.bin ($arg0)&~0x3
+  append binary value etp-commands.bin ($arg0)&etp_ptr_mask
   append binary value etp-commands.bin (Eterm)(($arg2)*sizeof(Eterm))
   append binary value etp-commands.bin (Eterm)$etp_chart_id
   append binary value etp-commands.bin (Eterm)($arg1)
-#   printf "<dumped %p %lu %lu %lu>", ($arg0)&~0x3, \
+#   printf "<dumped %p %lu %lu %lu>", ($arg0)&etp_ptr_mask, \
 #     (Eterm)(($arg2)*sizeof(Eterm)), (Eterm)$etp_chart_id, (Eterm)($arg1)
 end
 
-- 
2.26.2

openSUSE Build Service is sponsored by