diff options
author | Ian Lance Taylor <iant@google.com> | 2015-12-22 00:10:07 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2015-12-22 00:10:07 +0000 |
commit | 8fd41e922d2568d85af160795ff825c0423ee363 (patch) | |
tree | 18fba706531f0869a76fad9429712afb706dade7 /gcc/go/go-gcc.cc | |
parent | bf507c789e1aa34ce1c2bd31ccc6f39e7d8cd972 (diff) | |
download | gcc-8fd41e922d2568d85af160795ff825c0423ee363.zip gcc-8fd41e922d2568d85af160795ff825c0423ee363.tar.gz gcc-8fd41e922d2568d85af160795ff825c0423ee363.tar.bz2 |
go-gcc.cc (Gcc_backend::global_variable): If type is zero-sized, add a VIEW_CONVERT_EXPR to the tree.
* go-gcc.cc (Gcc_backend::global_variable): If type is zero-sized,
add a VIEW_CONVERT_EXPR to the tree.
(Gcc_backend::global_variable_set_init): Remove any
VIEW_CONVERT_EXPR.
(Gcc_backend::write_global_definitions): Likewise.
From-SVN: r231888
Diffstat (limited to 'gcc/go/go-gcc.cc')
-rw-r--r-- | gcc/go/go-gcc.cc | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/gcc/go/go-gcc.cc b/gcc/go/go-gcc.cc index cfb1995..cb196b3 100644 --- a/gcc/go/go-gcc.cc +++ b/gcc/go/go-gcc.cc @@ -2390,6 +2390,7 @@ Gcc_backend::global_variable(const std::string& package_name, return this->error_variable(); // The GNU linker does not like dynamic variables with zero size. + tree orig_type_tree = type_tree; if ((is_external || !is_hidden) && int_size_in_bytes(type_tree) == 0) type_tree = this->non_zero_size_type(type_tree); @@ -2419,6 +2420,10 @@ Gcc_backend::global_variable(const std::string& package_name, go_preserve_from_gc(decl); + if (orig_type_tree != type_tree) + decl = fold_build1_loc(location.gcc_location(), VIEW_CONVERT_EXPR, + orig_type_tree, decl); + return new Bvariable(decl); } @@ -2434,6 +2439,10 @@ Gcc_backend::global_variable_set_init(Bvariable* var, Bexpression* expr) tree var_decl = var->get_tree(); if (var_decl == error_mark_node) return; + // Undo the VIEW_CONVERT_EXPR that may have been added by + // global_variable. + if (TREE_CODE(var_decl) == VIEW_CONVERT_EXPR) + var_decl = TREE_OPERAND(var_decl, 0); DECL_INITIAL(var_decl) = expr_tree; // If this variable goes in a unique section, it may need to go into @@ -3030,7 +3039,12 @@ Gcc_backend::write_global_definitions( { if ((*p)->get_tree() != error_mark_node) { - defs[i] = (*p)->get_tree(); + tree t = (*p)->get_tree(); + // Undo the VIEW_CONVERT_EXPR that may have been added by + // global_variable. + if (TREE_CODE(t) == VIEW_CONVERT_EXPR) + t = TREE_OPERAND(t, 0); + defs[i] = t; go_preserve_from_gc(defs[i]); ++i; } |