summaryrefslogtreecommitdiff
path: root/gcc/cp/cp-lang.c
diff options
context:
space:
mode:
authormark <mark@138bc75d-0d04-0410-961f-82ee72b054a4>2014-05-21 15:44:59 +0000
committermark <mark@138bc75d-0d04-0410-961f-82ee72b054a4>2014-05-21 15:44:59 +0000
commit1b006e46754125c47544223aa6ee8a42d102fe4d (patch)
treed20dfd76b6bd33f6d7a2c6e5a1ca0f62dcebe91a /gcc/cp/cp-lang.c
parent667e5de8d01aa754c727efe58ad06079259e986f (diff)
downloadgcc-1b006e46754125c47544223aa6ee8a42d102fe4d.tar.gz
PR debug/16063. Add DW_AT_type to DW_TAG_enumeration.
Add a new lang-hook that provides the underlying base type of an ENUMERAL_TYPE. The default implementation will just use type_for_size. The implementation for C++ will use the ENUM_UNDERLYING_TYPE if it exists. Use this enum_underlying_base_type lang-hook in dwarf2out.c to add a DW_AT_type base type reference to a DW_TAG_enumeration. gcc/ * dwarf2out.c (gen_enumeration_type_die): Add DW_AT_type if DWARF version >= 3 or not strict DWARF. * langhooks.h (struct lang_hooks_for_types): Add enum_underlying_base_type. * langhooks.c (lhd_enum_underlying_base_type): New function. * gcc/langhooks.h (struct lang_hooks_for_types): Add enum_underlying_base_type. * langhooks-def.h (lhd_enum_underlying_base_type): New declaration. (LANG_HOOKS_ENUM_UNDERLYING_BASE_TYPE): New define. (LANG_HOOKS_FOR_TYPES_INITIALIZER): Add new lang hook. gcc/cp/ * cp-lang.c (cxx_enum_underlying_base_type): New function. (LANG_HOOKS_ENUM_UNDERLYING_BASE_TYPE): Define. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@210717 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp/cp-lang.c')
-rw-r--r--gcc/cp/cp-lang.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/gcc/cp/cp-lang.c b/gcc/cp/cp-lang.c
index c28c07a9d1f..014f393ecfa 100644
--- a/gcc/cp/cp-lang.c
+++ b/gcc/cp/cp-lang.c
@@ -23,6 +23,7 @@ along with GCC; see the file COPYING3. If not see
#include "coretypes.h"
#include "tm.h"
#include "tree.h"
+#include "stor-layout.h"
#include "cp-tree.h"
#include "c-family/c-common.h"
#include "langhooks.h"
@@ -40,6 +41,7 @@ static enum classify_record cp_classify_record (tree type);
static tree cp_eh_personality (void);
static tree get_template_innermost_arguments_folded (const_tree);
static tree get_template_argument_pack_elems_folded (const_tree);
+static tree cxx_enum_underlying_base_type (const_tree);
/* Lang hooks common to C++ and ObjC++ are declared in cp/cp-objcp-common.h;
consequently, there should be very few hooks below. */
@@ -81,6 +83,8 @@ static tree get_template_argument_pack_elems_folded (const_tree);
#define LANG_HOOKS_EH_PERSONALITY cp_eh_personality
#undef LANG_HOOKS_EH_RUNTIME_TYPE
#define LANG_HOOKS_EH_RUNTIME_TYPE build_eh_type_type
+#undef LANG_HOOKS_ENUM_UNDERLYING_BASE_TYPE
+#define LANG_HOOKS_ENUM_UNDERLYING_BASE_TYPE cxx_enum_underlying_base_type
/* Each front end provides its own lang hook initializer. */
struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
@@ -219,5 +223,21 @@ get_template_argument_pack_elems_folded (const_tree t)
return fold_cplus_constants (get_template_argument_pack_elems (t));
}
+/* The C++ version of the enum_underlying_base_type langhook.
+ See also cp/semantics.c (finish_underlying_type). */
+
+static
+tree cxx_enum_underlying_base_type (const_tree type)
+{
+ tree underlying_type = ENUM_UNDERLYING_TYPE (type);
+
+ if (! ENUM_FIXED_UNDERLYING_TYPE_P (type))
+ underlying_type
+ = c_common_type_for_mode (TYPE_MODE (underlying_type),
+ TYPE_UNSIGNED (underlying_type));
+
+ return underlying_type;
+}
+
#include "gt-cp-cp-lang.h"
#include "gtype-cp.h"