This file is indexed.

/usr/src/gcc-5/debian/patches/go-escape-analysis3.diff is in gcc-5-source 5.3.1-14ubuntu2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# DP: gccgo: Analyze escape information of interface parameters.

When analyzing function calls with interface parameters, all arguments
related to an interface parameter were assumed to escape via the
function arguments.  Now, if an argument is related to a non-escaping
parameter with an interface type, the argument may be stack-allocated.

Index: b/src/gcc/go/gofrontend/escape.cc
===================================================================
--- a/src/gcc/go/gofrontend/escape.cc
+++ b/src/gcc/go/gofrontend/escape.cc
@@ -586,8 +586,20 @@ Build_connection_graphs::handle_call(Nam
   // Only call expression statements are interesting
   // e.g. 'func(var)' for which we can show var does not escape.
   Call_expression* ce = e->call_expression();
-  if (ce == NULL || ce->args() == NULL)
+  if (ce == NULL)
     return;
+  else if (ce->args() == NULL)
+    {
+      if (ce->fn()->interface_field_reference_expression() != NULL)
+	{
+	  // This is a call to an interface method with no arguments. OBJECT
+	  // must be the receiver and we assume it escapes.
+	  Connection_node* rcvr_node =
+	    this->gogo_->add_connection_node(object)->connection_node();
+	  rcvr_node->set_escape_state(Node::ESCAPE_ARG);
+	}
+      return;
+    }
   
   // If the function call that references OBJECT is unknown, we must be
   // conservative and assume every argument escapes.  A function call is unknown
@@ -606,6 +618,8 @@ Build_connection_graphs::handle_call(Nam
 		this->gogo_->add_connection_node(arg_no)->connection_node();
 	      arg_node->set_escape_state(Node::ESCAPE_ARG);
 	    }
+	  else if ((*arg)->call_expression() != NULL)
+	    this->handle_call(object, *arg);
 	}
       return;
     }
@@ -787,7 +801,6 @@ Build_connection_graphs::handle_call(Nam
        ++pos)
     {
       std::string param_name;
-      bool param_is_interface = false;
       if (*pos >= 0 && params->size() <= static_cast<size_t>(*pos))
 	{
 	  // There were more arguments than there are parameters. This must be
@@ -804,11 +817,7 @@ Build_connection_graphs::handle_call(Nam
 	  param_name = fntype->receiver()->name();
 	}
       else
-	{
-	  param_name = params->at(*pos).name();
-	  param_is_interface =
-	    (params->at(*pos).type()->interface_type() != NULL);
-	}
+	param_name = params->at(*pos).name();
 
       if (Gogo::is_sink_name(param_name) || param_name.empty())
 	continue;
@@ -832,11 +841,6 @@ Build_connection_graphs::handle_call(Nam
 
       Node* arg_node = this->gogo_->add_connection_node(object);
       Node* param_node = this->gogo_->add_connection_node(param_no);
-
-      // Act conservatively when an argument is converted into an interface
-      // value.  FIXME.
-      if (param_is_interface)
-	param_node->connection_node()->set_escape_state(Node::ESCAPE_ARG);
       param_node->add_edge(arg_node);
     }