aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/validation/linear
diff options
Diffstat (limited to 'validation/linear')
-rw-r--r--validation/linear/call-basic.c57
-rw-r--r--validation/linear/call-builtin.c17
-rw-r--r--validation/linear/call-casted-pointer.c31
-rw-r--r--validation/linear/call-complex-pointer.c32
-rw-r--r--validation/linear/call-direct.c17
-rw-r--r--validation/linear/call-indirect.c15
-rw-r--r--validation/linear/call-inline.c18
7 files changed, 187 insertions, 0 deletions
diff --git a/validation/linear/call-basic.c b/validation/linear/call-basic.c
new file mode 100644
index 00000000..60517e2e
--- /dev/null
+++ b/validation/linear/call-basic.c
@@ -0,0 +1,57 @@
+extern int fun(int a);
+
+int symbol(int a)
+{
+ fun(a);
+}
+
+int pointer0(int a, int (*fun)(int))
+{
+ fun(a);
+}
+
+int pointer1(int a, int (*fun)(int))
+{
+ (*fun)(a);
+}
+
+int builtin(int a)
+{
+ __builtin_popcount(a);
+}
+
+/*
+ * check-name: basic function calls
+ * check-command: test-linearize -Wno-decl $file
+ *
+ * check-output-start
+symbol:
+.L0:
+ <entry-point>
+ call.32 %r2 <- fun, %arg1
+ ret.32 %r2
+
+
+pointer0:
+.L2:
+ <entry-point>
+ call.32 %r5 <- %arg2, %arg1
+ ret.32 %r5
+
+
+pointer1:
+.L4:
+ <entry-point>
+ call.32 %r8 <- %arg2, %arg1
+ ret.32 %r8
+
+
+builtin:
+.L6:
+ <entry-point>
+ call.32 %r11 <- __builtin_popcount, %arg1
+ ret.32 %r11
+
+
+ * check-output-end
+ */
diff --git a/validation/linear/call-builtin.c b/validation/linear/call-builtin.c
new file mode 100644
index 00000000..b1511359
--- /dev/null
+++ b/validation/linear/call-builtin.c
@@ -0,0 +1,17 @@
+typedef unsigned int u32;
+
+u32 ff(u32 a) { return __builtin_popcount(a); }
+
+u32 f0(u32 a) { return (__builtin_popcount)(a); }
+u32 f1(u32 a) { return (*__builtin_popcount)(a); } // C99,C11 6.5.3.2p4
+u32 f2(u32 a) { return (**__builtin_popcount)(a); } // C99,C11 6.5.3.2p4
+u32 f3(u32 a) { return (***__builtin_popcount)(a); } // C99,C11 6.5.3.2p4
+
+/*
+ * check-name: builtin calls
+ * check-command: test-linearize -Wno-decl $file
+ *
+ * check-output-ignore
+ * check-output-excludes: load
+ * check-output-pattern(5): call\..*__builtin_.*, %arg1
+ */
diff --git a/validation/linear/call-casted-pointer.c b/validation/linear/call-casted-pointer.c
new file mode 100644
index 00000000..610d6748
--- /dev/null
+++ b/validation/linear/call-casted-pointer.c
@@ -0,0 +1,31 @@
+typedef int (*fun_t)(void*);
+
+int foo(void *a, void *fun)
+{
+ return ((fun_t)fun)(a);
+}
+
+int bar(void *a, void *fun)
+{
+ return ((int (*)(void *))fun)(a);
+}
+
+int qux(void *a, void *fun)
+{
+ return (*(fun_t)fun)(a);
+}
+
+int quz(void *a, void *fun)
+{
+ return (*(int (*)(void *))fun)(a);
+}
+
+/*
+ * check-name: call via casted function pointer
+ * check-command: test-linearize -Wno-decl $file
+ *
+ * check-output-ignore
+ * check-output-excludes: load
+ * check-output-pattern(4): ptrcast\..* %arg2
+ * check-output-pattern(4): call\..* %arg1
+ */
diff --git a/validation/linear/call-complex-pointer.c b/validation/linear/call-complex-pointer.c
new file mode 100644
index 00000000..ea8232f1
--- /dev/null
+++ b/validation/linear/call-complex-pointer.c
@@ -0,0 +1,32 @@
+int foo(int p, int (*f0)(int), int (*f1)(int), int arg)
+{
+ return (p ? f0 : f1)(arg);
+}
+
+/*
+ * check-name: call-complex-pointer
+ * check-command: test-linearize -m64 -Wno-decl $file
+ *
+ * check-output-start
+foo:
+.L0:
+ <entry-point>
+ cbr %arg1, .L2, .L3
+
+.L2:
+ phisrc.64 %phi1 <- %arg2
+ br .L4
+
+.L3:
+ ptrcast.64 %r5 <- (64) %arg3
+ phisrc.64 %phi2 <- %r5
+ br .L4
+
+.L4:
+ phi.64 %r6 <- %phi1, %phi2
+ call.32 %r7 <- %r6, %arg4
+ ret.32 %r7
+
+
+ * check-output-end
+ */
diff --git a/validation/linear/call-direct.c b/validation/linear/call-direct.c
new file mode 100644
index 00000000..52f86306
--- /dev/null
+++ b/validation/linear/call-direct.c
@@ -0,0 +1,17 @@
+extern int fun(void);
+
+int ff(void) { return fun(); }
+
+int f0(void) { return (fun)(); }
+int f1(void) { return (*fun)(); } // C99,C11 6.5.3.2p4
+int f2(void) { return (**fun)(); } // C99,C11 6.5.3.2p4
+int f3(void) { return (***fun)(); } // C99,C11 6.5.3.2p4
+
+/*
+ * check-name: direct calls
+ * check-command: test-linearize -Wno-decl $file
+ *
+ * check-output-ignore
+ * check-output-excludes: load
+ * check-output-pattern(5): call\..* fun
+ */
diff --git a/validation/linear/call-indirect.c b/validation/linear/call-indirect.c
new file mode 100644
index 00000000..1275910c
--- /dev/null
+++ b/validation/linear/call-indirect.c
@@ -0,0 +1,15 @@
+int gg(int (*fun)(void)) { return fun(); }
+
+int g0(int (*fun)(void)) { return (fun)(); }
+int g1(int (*fun)(void)) { return (*fun)(); } // C99,C11 6.5.3.2p4
+int g2(int (*fun)(void)) { return (**fun)(); } // C99,C11 6.5.3.2p4
+int g3(int (*fun)(void)) { return (***fun)(); } // C99,C11 6.5.3.2p4
+
+/*
+ * check-name: indirect calls
+ * check-command: test-linearize -Wno-decl $file
+ *
+ * check-output-ignore
+ * check-output-excludes: load
+ * check-output-pattern(5): call\..* %arg1
+ */
diff --git a/validation/linear/call-inline.c b/validation/linear/call-inline.c
new file mode 100644
index 00000000..a33f0a1c
--- /dev/null
+++ b/validation/linear/call-inline.c
@@ -0,0 +1,18 @@
+static inline int fun(void) { return 42; }
+
+int fi(void) { return fun(); }
+
+int i0(void) { return (fun)(); }
+int i1(void) { return (*fun)(); } // C99,C11 6.5.3.2p4
+int i2(void) { return (**fun)(); } // C99,C11 6.5.3.2p4
+int i3(void) { return (***fun)(); } // C99,C11 6.5.3.2p4
+
+/*
+ * check-name: inline calls
+ * check-command: test-linearize -Wno-decl $file
+ *
+ * check-output-ignore
+ * check-output-excludes: load
+ * check-output-excludes: call
+ * check-output-pattern(5): ret\..* \\$42
+ */