[DTrace-devel] [PATCH] test: Add tests on register management for strjoin()

eugene.loh at oracle.com eugene.loh at oracle.com
Tue Oct 18 20:33:22 UTC 2022


From: Eugene Loh <eugene.loh at oracle.com>

The current register management in the code generator needs overhaul.
Here are some tests to check operations in strjoin().  Some of these
tests are marked @@xfail until the overhaul has been done.

For example, here is what happens in tst.reg_spilling5.d.

The D script is:

  trace(strjoin("abc",
                strjoin("def",
                        strjoin("ghi",
                                strjoin("jkl",
                                        strjoin("mno",
                                                "pqrstuvwx"
                                               )
                                       )
                               )
                       )
               )
       );

The generated code basically does this:
    r8 = pointer to "abc"
    r7 = pointer to "def"
    r6 = pointer to "ghi"
    r5 = pointer to "jkl"
    r4 = pointer to "mno"
    r3 = pointer to "pqrstuvwx"

Then it does the innermost strjoin:
    r2 = pointer to tstring(0)
    spill %r2
    spill %r3
    spill %r4
    spill %r5
    dt_strjoin(tstring(0), "mno", "pqrstuvwx");
    restore %r2
    restore %r5

Then it starts the next strjoin:
    r4 = pointer to tstring(1)
    spill %r2
    spill %r4
    spill %r5

Next, it must fill the arguments for the dt_strjoin(dst, s1, s2) call.
It uses the following code from dt_cg_subr_strjoin():
    BPF_MOV_REG(BPF_REG_1, dnp->dn_reg);
    BPF_MOV_REG(BPF_REG_2, s1->dn_reg);
    dt_regset_free(s1->dn_reg);
    BPF_MOV_REG(BPF_REG_3, s2->dn_reg);
    dt_regset_free(s2->dn_reg);

At this point, however:
    r4  is  dst
    r5  is  s1
    r2  is  s2
So the code is:
    r1 = r4        // loads dst into r1, okay
    r2 = r5        // loads s1 into r2, but overwrites s2!
    fill r5        // okay, we do not care
    r3 = r2        // uses overwritten value!
    fill r2        // overwrites a function arg!

Careful register management in dt_cg_subr_strjoin() could fix this
problem, but resolution will be left for the larger overhaul.

Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
 test/unittest/codegen/tst.reg_spilling2.d | 23 ++++++++++++++++
 test/unittest/codegen/tst.reg_spilling2.r |  1 +
 test/unittest/codegen/tst.reg_spilling3.d | 25 ++++++++++++++++++
 test/unittest/codegen/tst.reg_spilling3.r |  1 +
 test/unittest/codegen/tst.reg_spilling4.d | 27 +++++++++++++++++++
 test/unittest/codegen/tst.reg_spilling4.r |  1 +
 test/unittest/codegen/tst.reg_spilling5.d | 30 +++++++++++++++++++++
 test/unittest/codegen/tst.reg_spilling5.r |  1 +
 test/unittest/codegen/tst.reg_spilling6.d | 32 +++++++++++++++++++++++
 test/unittest/codegen/tst.reg_spilling6.r |  1 +
 test/unittest/codegen/tst.reg_spilling7.d | 32 +++++++++++++++++++++++
 test/unittest/codegen/tst.reg_spilling7.r |  1 +
 12 files changed, 175 insertions(+)
 create mode 100644 test/unittest/codegen/tst.reg_spilling2.d
 create mode 100644 test/unittest/codegen/tst.reg_spilling2.r
 create mode 100644 test/unittest/codegen/tst.reg_spilling3.d
 create mode 100644 test/unittest/codegen/tst.reg_spilling3.r
 create mode 100644 test/unittest/codegen/tst.reg_spilling4.d
 create mode 100644 test/unittest/codegen/tst.reg_spilling4.r
 create mode 100644 test/unittest/codegen/tst.reg_spilling5.d
 create mode 100644 test/unittest/codegen/tst.reg_spilling5.r
 create mode 100644 test/unittest/codegen/tst.reg_spilling6.d
 create mode 100644 test/unittest/codegen/tst.reg_spilling6.r
 create mode 100644 test/unittest/codegen/tst.reg_spilling7.d
 create mode 100644 test/unittest/codegen/tst.reg_spilling7.r

diff --git a/test/unittest/codegen/tst.reg_spilling2.d b/test/unittest/codegen/tst.reg_spilling2.d
new file mode 100644
index 00000000..494880d5
--- /dev/null
+++ b/test/unittest/codegen/tst.reg_spilling2.d
@@ -0,0 +1,23 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Licensed under the Universal Permissive License v 1.0 as shown at
+ * http://oss.oracle.com/licenses/upl.
+ */
+
+/*
+ * ASSERTION: Test that the code generator's spill/fill works with strjoin().
+ */
+
+#pragma D option quiet
+
+BEGIN
+{
+  trace(strjoin("abc",
+                strjoin("def",
+                        "ghijklmnopqrstuvwx"
+                       )
+               )
+       );
+  exit(0);
+}
diff --git a/test/unittest/codegen/tst.reg_spilling2.r b/test/unittest/codegen/tst.reg_spilling2.r
new file mode 100644
index 00000000..588efd11
--- /dev/null
+++ b/test/unittest/codegen/tst.reg_spilling2.r
@@ -0,0 +1 @@
+abcdefghijklmnopqrstuvwx
diff --git a/test/unittest/codegen/tst.reg_spilling3.d b/test/unittest/codegen/tst.reg_spilling3.d
new file mode 100644
index 00000000..ff219d75
--- /dev/null
+++ b/test/unittest/codegen/tst.reg_spilling3.d
@@ -0,0 +1,25 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Licensed under the Universal Permissive License v 1.0 as shown at
+ * http://oss.oracle.com/licenses/upl.
+ */
+
+/*
+ * ASSERTION: Test that the code generator's spill/fill works with strjoin().
+ */
+
+#pragma D option quiet
+
+BEGIN
+{
+  trace(strjoin("abc",
+                strjoin("def",
+                        strjoin("ghi",
+                                "jklmnopqrstuvwx"
+                               )
+                       )
+               )
+       );
+  exit(0);
+}
diff --git a/test/unittest/codegen/tst.reg_spilling3.r b/test/unittest/codegen/tst.reg_spilling3.r
new file mode 100644
index 00000000..588efd11
--- /dev/null
+++ b/test/unittest/codegen/tst.reg_spilling3.r
@@ -0,0 +1 @@
+abcdefghijklmnopqrstuvwx
diff --git a/test/unittest/codegen/tst.reg_spilling4.d b/test/unittest/codegen/tst.reg_spilling4.d
new file mode 100644
index 00000000..04961a61
--- /dev/null
+++ b/test/unittest/codegen/tst.reg_spilling4.d
@@ -0,0 +1,27 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Licensed under the Universal Permissive License v 1.0 as shown at
+ * http://oss.oracle.com/licenses/upl.
+ */
+
+/*
+ * ASSERTION: Test that the code generator's spill/fill works with strjoin().
+ */
+
+#pragma D option quiet
+
+BEGIN
+{
+  trace(strjoin("abc",
+                strjoin("def",
+                        strjoin("ghi",
+                                strjoin("jkl",
+                                        "mnopqrstuvwx"
+                                       )
+                               )
+                       )
+               )
+       );
+  exit(0);
+}
diff --git a/test/unittest/codegen/tst.reg_spilling4.r b/test/unittest/codegen/tst.reg_spilling4.r
new file mode 100644
index 00000000..588efd11
--- /dev/null
+++ b/test/unittest/codegen/tst.reg_spilling4.r
@@ -0,0 +1 @@
+abcdefghijklmnopqrstuvwx
diff --git a/test/unittest/codegen/tst.reg_spilling5.d b/test/unittest/codegen/tst.reg_spilling5.d
new file mode 100644
index 00000000..aec71a2f
--- /dev/null
+++ b/test/unittest/codegen/tst.reg_spilling5.d
@@ -0,0 +1,30 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Licensed under the Universal Permissive License v 1.0 as shown at
+ * http://oss.oracle.com/licenses/upl.
+ */
+
+/*
+ * ASSERTION: Test that the code generator's spill/fill works with strjoin().
+ */
+/* @@xfail: DTv2 register management */
+
+#pragma D option quiet
+
+BEGIN
+{
+  trace(strjoin("abc",
+                strjoin("def",
+                        strjoin("ghi",
+                                strjoin("jkl",
+                                        strjoin("mno",
+                                                "pqrstuvwx"
+                                               )
+                                       )
+                               )
+                       )
+               )
+       );
+  exit(0);
+}
diff --git a/test/unittest/codegen/tst.reg_spilling5.r b/test/unittest/codegen/tst.reg_spilling5.r
new file mode 100644
index 00000000..588efd11
--- /dev/null
+++ b/test/unittest/codegen/tst.reg_spilling5.r
@@ -0,0 +1 @@
+abcdefghijklmnopqrstuvwx
diff --git a/test/unittest/codegen/tst.reg_spilling6.d b/test/unittest/codegen/tst.reg_spilling6.d
new file mode 100644
index 00000000..31a2c6d9
--- /dev/null
+++ b/test/unittest/codegen/tst.reg_spilling6.d
@@ -0,0 +1,32 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Licensed under the Universal Permissive License v 1.0 as shown at
+ * http://oss.oracle.com/licenses/upl.
+ */
+
+/*
+ * ASSERTION: Test that the code generator's spill/fill works with strjoin().
+ */
+/* @@xfail: DTv2 register management */
+
+#pragma D option quiet
+
+BEGIN
+{
+  trace(strjoin("abc",
+                strjoin("def",
+                        strjoin("ghi",
+                                strjoin("jkl",
+                                        strjoin("mno",
+                                                strjoin("pqr",
+                                                        "stuvwx"
+                                                       )
+                                               )
+                                       )
+                               )
+                       )
+               )
+       );
+  exit(0);
+}
diff --git a/test/unittest/codegen/tst.reg_spilling6.r b/test/unittest/codegen/tst.reg_spilling6.r
new file mode 100644
index 00000000..588efd11
--- /dev/null
+++ b/test/unittest/codegen/tst.reg_spilling6.r
@@ -0,0 +1 @@
+abcdefghijklmnopqrstuvwx
diff --git a/test/unittest/codegen/tst.reg_spilling7.d b/test/unittest/codegen/tst.reg_spilling7.d
new file mode 100644
index 00000000..ade2136a
--- /dev/null
+++ b/test/unittest/codegen/tst.reg_spilling7.d
@@ -0,0 +1,32 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Licensed under the Universal Permissive License v 1.0 as shown at
+ * http://oss.oracle.com/licenses/upl.
+ */
+
+/*
+ * ASSERTION: Test that the code generator's spill/fill works with strjoin().
+ */
+/* @@xfail: DTv2 register management */
+
+#pragma D option quiet
+
+BEGIN
+{
+  trace(strjoin("abc",
+                strjoin("def",
+                        strjoin("ghi",
+                                strjoin("jkl",
+                                        strjoin("mno",
+                                                strjoin("pqr",
+                                                        strjoin("stu", "vwx")
+                                                       )
+                                               )
+                                       )
+                               )
+                       )
+               )
+       );
+  exit(0);
+}
diff --git a/test/unittest/codegen/tst.reg_spilling7.r b/test/unittest/codegen/tst.reg_spilling7.r
new file mode 100644
index 00000000..588efd11
--- /dev/null
+++ b/test/unittest/codegen/tst.reg_spilling7.r
@@ -0,0 +1 @@
+abcdefghijklmnopqrstuvwx
-- 
2.18.4




More information about the DTrace-devel mailing list