From 9866562d1f3e55459a8427dc2db205d2750d48be Mon Sep 17 00:00:00 2001 From: law Date: Wed, 29 Apr 2015 20:32:41 +0000 Subject: [PATCH] * c-common.c (handle_section_attribute): Refactor to reduce nesting and distinguish between error cases. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@222590 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/c-family/ChangeLog | 5 +++ gcc/c-family/c-common.c | 91 +++++++++++++++++++++++++------------------------ 2 files changed, 51 insertions(+), 45 deletions(-) diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 44e21f3dde6..c17ea5f6138 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +2015-04-29 Josh Triplett + + * c-common.c (handle_section_attribute): Refactor to reduce + nesting and distinguish between error cases. + 2015-04-29 Marek Polacek PR c/64610 diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index eecbe41d4f6..7d314f854fe 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -7602,58 +7602,59 @@ handle_section_attribute (tree *node, tree ARG_UNUSED (name), tree args, { tree decl = *node; - if (targetm_common.have_named_sections) + if (!targetm_common.have_named_sections) { - user_defined_section_attribute = true; + error_at (DECL_SOURCE_LOCATION (*node), + "section attributes are not supported for this target"); + goto fail; + } - if ((TREE_CODE (decl) == FUNCTION_DECL - || TREE_CODE (decl) == VAR_DECL) - && TREE_CODE (TREE_VALUE (args)) == STRING_CST) - { - if (TREE_CODE (decl) == VAR_DECL - && current_function_decl != NULL_TREE - && !TREE_STATIC (decl)) - { - error_at (DECL_SOURCE_LOCATION (decl), - "section attribute cannot be specified for " - "local variables"); - *no_add_attrs = true; - } + user_defined_section_attribute = true; - /* The decl may have already been given a section attribute - from a previous declaration. Ensure they match. */ - else if (DECL_SECTION_NAME (decl) != NULL - && strcmp (DECL_SECTION_NAME (decl), - TREE_STRING_POINTER (TREE_VALUE (args))) != 0) - { - error ("section of %q+D conflicts with previous declaration", - *node); - *no_add_attrs = true; - } - else if (TREE_CODE (decl) == VAR_DECL - && !targetm.have_tls && targetm.emutls.tmpl_section - && DECL_THREAD_LOCAL_P (decl)) - { - error ("section of %q+D cannot be overridden", *node); - *no_add_attrs = true; - } - else - set_decl_section_name (decl, - TREE_STRING_POINTER (TREE_VALUE (args))); - } - else - { - error ("section attribute not allowed for %q+D", *node); - *no_add_attrs = true; - } + if (TREE_CODE (decl) != FUNCTION_DECL && TREE_CODE (decl) != VAR_DECL) + { + error ("section attribute not allowed for %q+D", *node); + goto fail; } - else + + if (TREE_CODE (TREE_VALUE (args)) != STRING_CST) { - error_at (DECL_SOURCE_LOCATION (*node), - "section attributes are not supported for this target"); - *no_add_attrs = true; + error ("section attribute argument not a string constant"); + goto fail; + } + + if (TREE_CODE (decl) == VAR_DECL + && current_function_decl != NULL_TREE + && !TREE_STATIC (decl)) + { + error_at (DECL_SOURCE_LOCATION (decl), + "section attribute cannot be specified for local variables"); + goto fail; } + /* The decl may have already been given a section attribute + from a previous declaration. Ensure they match. */ + if (DECL_SECTION_NAME (decl) != NULL + && strcmp (DECL_SECTION_NAME (decl), + TREE_STRING_POINTER (TREE_VALUE (args))) != 0) + { + error ("section of %q+D conflicts with previous declaration", *node); + goto fail; + } + + if (TREE_CODE (decl) == VAR_DECL + && !targetm.have_tls && targetm.emutls.tmpl_section + && DECL_THREAD_LOCAL_P (decl)) + { + error ("section of %q+D cannot be overridden", *node); + goto fail; + } + + set_decl_section_name (decl, TREE_STRING_POINTER (TREE_VALUE (args))); + return NULL_TREE; + +fail: + *no_add_attrs = true; return NULL_TREE; } -- 2.11.4.GIT