Hi all,

The attached patch fixes PR lto/61048.

The basic idea is to write option -fsanitize to existing ELF section .gnu.lto_.opts in object files and then read it in lto-wrapper.

On 15.10.2014 12:46, Richard Biener wrote:
You need to handle them in lto-opts.c and output them to the existing option
section.

2 minor changes are added to existing function that write options (in lto-opts.c) and then read them from object files (lto-wrapper.c).

The patch was bootstrapped and regtested on x86_64-unknown-linux-gnu.

Ok for trunk?

Best regards,
Ilya Palachev
>From e3d1e1dc6d64b04fb81d882528614f1fc37cfa5f Mon Sep 17 00:00:00 2001
From: Ilya Palachev <i.palac...@samsung.com>
Date: Wed, 15 Oct 2014 16:21:50 +0400
Subject: [PATCH] Write/read option -fsanitize to/from object files

gcc/

2014-10-15  Ilya Palachev  <i.palac...@samsung.com>

	* lto-opts.c (lto_write_options): Enable writing of option
	-fsanitize to object files.
	* lto-wrapper.c (run_gcc): Enable reading of option -fsanitize
	from object files.

gcc/testsuite/

2014-10-15  Ilya Palachev  <i.palac...@samsung.com>

	* g++.dg/lto/pr61048_0.C: New test from bugzilla.
---
 gcc/lto-opts.c                       | 10 +++++++++-
 gcc/lto-wrapper.c                    |  1 +
 gcc/testsuite/g++.dg/lto/pr61048_0.C |  9 +++++++++
 3 files changed, 19 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/lto/pr61048_0.C

diff --git a/gcc/lto-opts.c b/gcc/lto-opts.c
index ceccb6f..abeca1c 100644
--- a/gcc/lto-opts.c
+++ b/gcc/lto-opts.c
@@ -178,7 +178,15 @@ lto_write_options (void)
          which includes things like -o and -v or -fhelp for example.
 	 We do not need those.  Also drop all diagnostic options.  */
       if (cl_options[option->opt_index].flags & (CL_DRIVER|CL_WARNING))
-	continue;
+        switch (option->opt_index)
+          {
+          /* Option -fsanitize should not be dropped, since otherwise
+	     sanitizer builtins will not be initialized. See PR61048.  */
+          case OPT_fsanitize_:
+            break;
+          default:
+            continue;
+          }
 
       for (j = 0; j < option->canonical_option_num_elements; ++j)
 	append_to_collect_gcc_options (&temporary_obstack, &first_p,
diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c
index 8033b15..43d31d7 100644
--- a/gcc/lto-wrapper.c
+++ b/gcc/lto-wrapper.c
@@ -514,6 +514,7 @@ run_gcc (unsigned argc, char *argv[])
 	case OPT_fwrapv:
 	case OPT_ftrapv:
 	case OPT_fstrict_overflow:
+	case OPT_fsanitize_:
 	case OPT_O:
 	case OPT_Ofast:
 	case OPT_Og:
diff --git a/gcc/testsuite/g++.dg/lto/pr61048_0.C b/gcc/testsuite/g++.dg/lto/pr61048_0.C
new file mode 100644
index 0000000..40ae097
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lto/pr61048_0.C
@@ -0,0 +1,9 @@
+// { dg-lto-do link }
+// { dg-lto-options {{-fsanitize=address -flto}} }
+
+#include <iostream>
+int main ()
+{
+  int *i = reinterpret_cast<int*> (0xC1000000);
+  std::cout << *i << std::endl;
+}
-- 
2.1.1

Reply via email to