From 07aeab22c0aa102a34c5fdd1b435964135271618 Mon Sep 17 00:00:00 2001 From: Jim Wilson Date: Fri, 18 Mar 1994 15:31:17 -0800 Subject: [PATCH] (assemble_variable): Likewise. From-SVN: r6819 --- gcc/varasm.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) 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 -- 2.30.2