Patchwork Go patch committed: Move flag_strict_aliasing clear to gcc interface

login
register
mail settings
Submitter Ian Taylor
Date Jan. 14, 2011, 3:28 a.m.
Message ID <mcrvd1smaez.fsf@google.com>
Download mbox | patch
Permalink /patch/78859/
State New
Headers show

Comments

Ian Taylor - Jan. 14, 2011, 3:28 a.m.
When the Go frontend sees an import of the "unsafe" package, it must
clear the flag_strict_aliasing variable.  This patch moves that clearing
out of the Go frontend proper and into the gcc interface.  Bootstrapped
and ran Go testsuite on x86_64-unknown-linux-gnu.  Committed to
mainline.

Ian


2011-01-13  Ian Lance Taylor  <iant@google.com>

	* go-backend.c: Include "rtl.h" and "target.h".
	(go_imported_unsafe): New function.
	* go-c.h (go_imported_unsafe): Declare.
	* Make-lang.in (go/go-backend.o): Depend on $(RTL_H).
	(go/gogo-tree.o): Remove dependency on $(RTL_H).
	(go/unsafe.o): Depend on $(GO_C_H).

Patch

Index: gcc/go/Make-lang.in
===================================================================
--- gcc/go/Make-lang.in	(revision 168679)
+++ gcc/go/Make-lang.in	(working copy)
@@ -1,6 +1,6 @@ 
 # Make-lang.in -- Top level -*- makefile -*- fragment for gcc Go frontend.
 
-# Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+# Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
 
 # This file is part of GCC.
 
@@ -221,7 +221,7 @@  GO_EXPRESSIONS_H = go/gofrontend/express
 GO_IMPORT_H = go/gofrontend/import.h go/gofrontend/export.h
 
 go/go-backend.o: go/go-backend.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
-	$(TREE_H) $(TM_H) $(TM_P_H)
+	$(TM_H) $(RTL_H) $(TREE_H) $(TM_P_H) $(TARGET_H)
 
 go/go-lang.o: go/go-lang.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(OPTS_H) \
 		$(TREE_H) $(GIMPLE_H) $(GGC_H) $(TOPLEV_H) debug.h options.h \
@@ -254,7 +254,7 @@  go/go-dump.o: go/gofrontend/go-dump.cc $
 	go/gofrontend/go-dump.h
 go/gogo-tree.o: go/gofrontend/gogo-tree.cc $(GO_SYSTEM_H) $(TOPLEV_H) \
 	$(TREE_H) $(GIMPLE_H) tree-iterator.h $(CGRAPH_H) langhooks.h \
-	convert.h output.h $(DIAGNOSTIC_H) $(RTL_H) $(GO_TYPES_H) \
+	convert.h output.h $(DIAGNOSTIC_H) $(GO_TYPES_H) \
 	$(GO_EXPRESSIONS_H) $(GO_STATEMENTS_H) $(GO_GOGO_H)
 go/gogo.o: go/gofrontend/gogo.cc $(GO_SYSTEM_H) $(GO_C_H) \
 	go/gofrontend/go-dump.h $(GO_LEX_H) $(GO_TYPES_H) $(GO_STATEMENTS_H) \
@@ -277,4 +277,5 @@  go/types.o: go/gofrontend/types.cc $(GO_
 	$(GIMPLE_H) $(REAL_H) convert.h $(GO_C_H) $(GO_GOGO_H) \
 	go/gofrontend/operator.h $(GO_EXPRESSIONS_H) $(GO_STATEMENTS_H) \
 	go/gofrontend/export.h $(GO_IMPORT_H) $(GO_TYPES_H)
-go/unsafe.o: go/gofrontend/unsafe.cc $(GO_SYSTEM_H) $(GO_TYPES_H) $(GO_GOGO_H)
+go/unsafe.o: go/gofrontend/unsafe.cc $(GO_SYSTEM_H) $(GO_C_H) $(GO_TYPES_H) \
+	$(GO_GOGO_H)
Index: gcc/go/gofrontend/unsafe.cc
===================================================================
--- gcc/go/gofrontend/unsafe.cc	(revision 168679)
+++ gcc/go/gofrontend/unsafe.cc	(working copy)
@@ -6,6 +6,7 @@ 
 
 #include "go-system.h"
 
+#include "go-c.h"
 #include "types.h"
 #include "gogo.h"
 
@@ -130,5 +131,9 @@  Gogo::import_unsafe(const std::string& l
   if (add_to_globals)
     this->add_named_object(no);
 
-  this->imported_unsafe_ = true;
+  if (!this->imported_unsafe_)
+    {
+      go_imported_unsafe();
+      this->imported_unsafe_ = true;
+    }
 }
Index: gcc/go/gofrontend/gogo-tree.cc
===================================================================
--- gcc/go/gofrontend/gogo-tree.cc	(revision 168679)
+++ gcc/go/gofrontend/gogo-tree.cc	(working copy)
@@ -22,7 +22,6 @@  extern "C"
 #include "convert.h"
 #include "output.h"
 #include "diagnostic.h"
-#include "rtl.h"
 
 #ifndef ENABLE_BUILD_WITH_CXX
 }
@@ -810,17 +809,6 @@  Gogo::write_globals()
 
   // Pass everything back to the middle-end.
 
-  if (this->imported_unsafe_)
-    {
-      // Importing the "unsafe" package automatically disables TBAA.
-      flag_strict_aliasing = false;
-
-      // This is a real hack.  init_varasm_once has already grabbed an
-      // alias set, which we don't want when we aren't going strict
-      // aliasing.  We reinitialize to make it do it again.  FIXME.
-      init_varasm_once();
-    }
-
   wrapup_global_declarations(vec, count);
 
   cgraph_finalize_compilation_unit();
Index: gcc/go/ChangeLog
===================================================================
--- gcc/go/ChangeLog	(revision 168679)
+++ gcc/go/ChangeLog	(working copy)
@@ -1,3 +1,12 @@ 
+2011-01-13  Ian Lance Taylor  <iant@google.com>
+
+	* go-backend.c: Include "rtl.h" and "target.h".
+	(go_imported_unsafe): New function.
+	* go-c.h (go_imported_unsafe): Declare.
+	* Make-lang.in (go/go-backend.o): Depend on $(RTL_H).
+	(go/gogo-tree.o): Remove dependency on $(RTL_H).
+	(go/unsafe.o): Depend on $(GO_C_H).
+
 2010-12-31  Joern Rennecke  <amylaar@spamcop.net>
 
 	PR go/47113
Index: gcc/go/go-c.h
===================================================================
--- gcc/go/go-c.h	(revision 168679)
+++ gcc/go/go-c.h	(working copy)
@@ -1,5 +1,5 @@ 
 /* go-c.h -- Header file for go frontend gcc C interface.
-   Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+   Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -65,6 +65,8 @@  extern unsigned int go_field_alignment (
 
 extern void go_trampoline_info (unsigned int *size, unsigned int *alignment);
 
+extern void go_imported_unsafe (void);
+
 #if defined(__cplusplus) && !defined(ENABLE_BUILD_WITH_CXX)
 } /* End extern "C".  */
 #endif
Index: gcc/go/go-backend.c
===================================================================
--- gcc/go/go-backend.c	(revision 168679)
+++ gcc/go/go-backend.c	(working copy)
@@ -1,5 +1,5 @@ 
 /* go-backend.c -- Go frontend interface to gcc backend.
-   Copyright (C) 2010 Free Software Foundation, Inc.
+   Copyright (C) 2010, 2011 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -20,9 +20,11 @@  along with GCC; see the file COPYING3.  
 #include "config.h"
 #include "system.h"
 #include "coretypes.h"
-#include "tree.h"
 #include "tm.h"
+#include "rtl.h"
+#include "tree.h"
 #include "tm_p.h"
+#include "target.h"
 
 #include "go-c.h"
 
@@ -70,3 +72,22 @@  go_trampoline_info (unsigned int *size, 
   *size = TRAMPOLINE_SIZE;
   *alignment = TRAMPOLINE_ALIGNMENT;
 }
+
+/* This is called by the Go frontend proper if the unsafe package was
+   imported.  When that happens we can not do type-based alias
+   analysis.  */
+
+void
+go_imported_unsafe (void)
+{
+  flag_strict_aliasing = false;
+
+  /* This is a real hack.  init_varasm_once has already grabbed an
+     alias set, which we don't want when we aren't doing strict
+     aliasing.  We reinitialize to make it do it again.  This should
+     be OK in practice since we haven't really done anything yet.  */
+  init_varasm_once ();
+
+  /* Let the backend know that the options have changed.  */
+  targetm.override_options_after_change ();
+}