GNAT may create temporaries to hold return values of function calls.
If such a temporary is created as part of a dynamic initializer of a
variable in a unit other than the one being compiled, the initializer
is dropped, including the temporary and its binding block.

Don't issue asan mark calls for such variables, they are gone.

Regstrapped on x86_64-linux-gnu.  Ok to install?


for  gcc/ChangeLog

        * gimplify.c (gimplify_decl_expr): Skip asan marking calls for
        temporaries not seen in binding block, and not about to be
        added as gimple variables.

for  gcc/testsuite/ChangeLog

        * gnat.dg/asan1.adb: New test.
        * gnat.dg/asan1_pkg.ads: New additional source.
---
 gcc/gimplify.c                      |    8 +++++++-
 gcc/testsuite/gnat.dg/asan1.adb     |   15 +++++++++++++++
 gcc/testsuite/gnat.dg/asan1_pkg.ads |    9 +++++++++
 3 files changed, 31 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gnat.dg/asan1.adb
 create mode 100644 gcc/testsuite/gnat.dg/asan1_pkg.ads

diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index d2ac5f913593f..95d55bb8ba4c7 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -1795,7 +1795,13 @@ gimplify_decl_expr (tree *stmt_p, gimple_seq *seq_p)
          && !DECL_HAS_VALUE_EXPR_P (decl)
          && DECL_ALIGN (decl) <= MAX_SUPPORTED_STACK_ALIGNMENT
          && dbg_cnt (asan_use_after_scope)
-         && !gimplify_omp_ctxp)
+         && !gimplify_omp_ctxp
+         /* GNAT introduces temporaries to hold return values of calls in
+            initializers of variables defined in other units, so the
+            declaration of the variable is discarded completely.  We do not
+            want to issue poison calls for such dropped variables.  */
+         && (DECL_SEEN_IN_BIND_EXPR_P (decl)
+             || (DECL_ARTIFICIAL (decl) && DECL_NAME (decl) == NULL_TREE)))
        {
          asan_poisoned_variables->add (decl);
          asan_poison_variable (decl, false, seq_p);
diff --git a/gcc/testsuite/gnat.dg/asan1.adb b/gcc/testsuite/gnat.dg/asan1.adb
new file mode 100644
index 0000000000000..a4bc59a9a2143
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/asan1.adb
@@ -0,0 +1,15 @@
+--  { dg-do compile }
+--  { dg-additional-sources asan1_pkg.ads }
+--  { dg-options "-fsanitize=address" }
+--  { dg-skip-if "" no_fsanitize_address }
+
+with Asan1_Pkg;
+
+procedure Asan1 is
+   use Asan1_Pkg;
+
+   X, Y : E;
+begin
+   X := C (N);
+   Y := V;
+end Asan1;
diff --git a/gcc/testsuite/gnat.dg/asan1_pkg.ads 
b/gcc/testsuite/gnat.dg/asan1_pkg.ads
new file mode 100644
index 0000000000000..fbbc1c5e7f5bd
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/asan1_pkg.ads
@@ -0,0 +1,9 @@
+package Asan1_Pkg is
+   subtype E is Integer;
+   type T is array (1..32) of E;
+
+   function N return T;
+   function C (P : T) return E;
+
+   V : constant E := C (N);
+end Asan1_Pkg;


-- 
Alexandre Oliva, happy hacker  https://FSFLA.org/blogs/lxo/
   Free Software Activist         GNU Toolchain Engineer
        Vim, Vi, Voltei pro Emacs -- GNUlius Caesar

Reply via email to