diff mbox series

[10/17] degenerated arrays & functions are addressable too

Message ID 20191210225921.94897-11-luc.vanoostenryck@gmail.com (mailing list archive)
State Mainlined, archived
Headers show
Series improve expansion of constant symbols | expand

Commit Message

Luc Van Oostenryck Dec. 10, 2019, 10:59 p.m. UTC
Symbols which have their address taken (with the 'addressof'
operator: &) are marked as such (with the modifier MOD_ADDRESSABLE).
But degenerated arrays and functions have their address implicitly
taken.

MOD_ADDRESSABLE is used to prevent to replace a symbol dereference
nto the value used to initialize to it. For example, in code like:
	static int foo(void)
	{
		int x[2] = { 1, 2 };
		return x[1];
	}

the return expression can be replaced by 2. This is not the case
case if the array is first passed in a function call, like here:
	extern void def(void *, unsigned int);
	static int bar(void)
	{
		int x[2] = { 1, 2 };
		def(x, sizeof(x));
		return x[1];
	}

Fix this by marking degenerated arrays (and functions) as also
being addressable.

Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
 evaluate.c                              |  1 +
 validation/eval/addressable-degen.c     |  1 -
 validation/expand/constant-init-array.c | 15 +++++++++++++++
 3 files changed, 16 insertions(+), 1 deletion(-)
 create mode 100644 validation/expand/constant-init-array.c
diff mbox series

Patch

diff --git a/evaluate.c b/evaluate.c
index c0281e9b10f2..11ad6a22c32f 100644
--- a/evaluate.c
+++ b/evaluate.c
@@ -1772,6 +1772,7 @@  static struct symbol *degenerate(struct expression *expr)
 		*expr = *expr->unop;
 		ctype = create_pointer(expr, ctype, 1);
 		expr->ctype = ctype;
+		mark_addressable(expr);
 	default:
 		/* nothing */;
 	}
diff --git a/validation/eval/addressable-degen.c b/validation/eval/addressable-degen.c
index e1dc51079079..d420927e0c71 100644
--- a/validation/eval/addressable-degen.c
+++ b/validation/eval/addressable-degen.c
@@ -11,7 +11,6 @@  static int bar(void)
 /*
  * check-name: eval/addressable-degen
  * check-command: test-linearize -fdump-ir $file
- * check-known-to-fail
  *
  * check-output-ignore
  * check-output-contains: load\\.
diff --git a/validation/expand/constant-init-array.c b/validation/expand/constant-init-array.c
new file mode 100644
index 000000000000..94949be54244
--- /dev/null
+++ b/validation/expand/constant-init-array.c
@@ -0,0 +1,15 @@ 
+int test_array(int i)
+{
+	static const int a[3] = { 1, 2, 3, };
+
+	return a[1];
+}
+
+/*
+ * check-name: constant-init-array
+ * check-command: test-linearize -Wno-decl -fdump-ir $file
+ *
+ * check-output-ignore
+ * check-output-excludes: phisrc\\..*return.*\\$2
+ * check-output-contains: load\\.
+ */