From: Jim Wilson Date: Fri, 18 Mar 1994 23:31:17 +0000 (-0800) Subject: (assemble_variable): Likewise. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=07aeab22c0aa102a34c5fdd1b435964135271618;p=gcc.git (assemble_variable): Likewise. From-SVN: r6819 --- diff --git a/gcc/varasm.c b/gcc/varasm.c index b127de345e1..17117c0f8b4 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -1142,11 +1142,22 @@ assemble_variable (decl, top_level, at_end, dont_output_data) named_section (TREE_STRING_POINTER (DECL_SECTION_NAME (decl))); else { + /* C++ can have const variables that get initialized from constructors, + and thus can not be in a readonly section. We prevent this by + verifying that the initial value is constant for objects put in a + readonly section. + + error_mark_node is used by the C front end to indicate that the + initializer has not been seen yet. In this case, we assume that + the initializer must be constant. */ #ifdef SELECT_SECTION SELECT_SECTION (decl, reloc); #else if (TREE_READONLY (decl) && ! TREE_THIS_VOLATILE (decl) + && DECL_INITIAL (decl) + && (DECL_INITIAL (decl) == error_mark_node + || TREE_CONSTANT (DECL_INITIAL (decl))) && ! (flag_pic && reloc)) readonly_data_section (); else @@ -1194,6 +1205,9 @@ assemble_variable (decl, top_level, at_end, dont_output_data) #else if (TREE_READONLY (decl) && ! TREE_THIS_VOLATILE (decl) + && DECL_INITIAL (decl) + && (DECL_INITIAL (decl) == error_mark_node + || TREE_CONSTANT (DECL_INITIAL (decl))) && ! (flag_pic && reloc)) readonly_data_section (); else @@ -1289,6 +1303,9 @@ assemble_variable (decl, top_level, at_end, dont_output_data) #else if (TREE_READONLY (decl) && ! TREE_THIS_VOLATILE (decl) + && DECL_INITIAL (decl) + && (DECL_INITIAL (decl) == error_mark_node + || TREE_CONSTANT (DECL_INITIAL (decl))) && ! (flag_pic && reloc)) readonly_data_section (); else