compiler: make sure type descriptor initializers go in .rodata
authorIan Lance Taylor <ian@gcc.gnu.org>
Sun, 9 Sep 2018 13:26:17 +0000 (13:26 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Sun, 9 Sep 2018 13:26:17 +0000 (13:26 +0000)
    When creating type descriptor variables, the compiler (specifically
    Type::make_type_descriptor_var) invokes the immutable_struct() and
    immutable_struct_set_init() back end methods, so as to insure that
    these items go into the ".rodata" section of the generate object file.
    The expression initializers for these variables can contain nested
    subexpressions, however, and these subexpressions were not always
    being placed into .rodata. This patch changes the backend-gen code for
    slice initializers to emit implicit variables into .rodata if those
    initializers are part of a type descriptor init.

    Reviewed-on: https://go-review.googlesource.com/132596

From-SVN: r264181

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/expressions.cc

index 9495882b5da262c3b48c7f953ff0e22ac0c9b00f..1ef2c8d39d3a11bc52879856116f3fae01a175a4 100644 (file)
@@ -1,4 +1,4 @@
-da249ffd264154cc992e76ff03f91f700d3bf53e
+06e688ff6d829c8de3735e9f59b61b373afc596f
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 143f0a73df68f1783bbc4e4169864b0398dc0231..efc8eba99082f376278d8d8f7857121757035f5a 100644 (file)
@@ -4453,7 +4453,8 @@ Unary_expression::do_get_backend(Translate_context* context)
              // initialize the value once, so we can use this directly
              // rather than copying it.  In that case we can't make it
              // read-only, because the program is permitted to change it.
-             copy_to_heap = context->function() != NULL;
+             copy_to_heap = (context->function() != NULL
+                              || context->is_const());
            }
          std::string asm_name(go_selectively_encode_id(var_name));
          Bvariable* implicit =