Rename to allow_rust_tests
[binutils-gdb.git] / gdb / d-lang.c
index 95175af4074b9dc560a7290591c738cc4d19d2e7..8286c5be64629453e906a3d373e5509d27bd3378 100644 (file)
@@ -1,6 +1,6 @@
 /* D language support routines for GDB, the GNU debugger.
 
-   Copyright (C) 2005-2020 Free Software Foundation, Inc.
+   Copyright (C) 2005-2023 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -26,6 +26,7 @@
 #include "demangle.h"
 #include "cp-support.h"
 #include "gdbarch.h"
+#include "parser-defs.h"
 
 /* The name of the symbol to use to get the name of the main subprogram.  */
 static const char D_MAIN[] = "D main";
@@ -50,95 +51,19 @@ d_main_name (void)
 
 /* Implements the la_demangle language_defn routine for language D.  */
 
-char *
+gdb::unique_xmalloc_ptr<char>
 d_demangle (const char *symbol, int options)
 {
   return gdb_demangle (symbol, options | DMGL_DLANG);
 }
 
-/* Table mapping opcodes into strings for printing operators
-   and precedences of the operators.  */
-static const struct op_print d_op_print_tab[] =
-{
-  {",", BINOP_COMMA, PREC_COMMA, 0},
-  {"=", BINOP_ASSIGN, PREC_ASSIGN, 1},
-  {"||", BINOP_LOGICAL_OR, PREC_LOGICAL_OR, 0},
-  {"&&", BINOP_LOGICAL_AND, PREC_LOGICAL_AND, 0},
-  {"|", BINOP_BITWISE_IOR, PREC_BITWISE_IOR, 0},
-  {"^", BINOP_BITWISE_XOR, PREC_BITWISE_XOR, 0},
-  {"&", BINOP_BITWISE_AND, PREC_BITWISE_AND, 0},
-  {"==", BINOP_EQUAL, PREC_ORDER, 0},
-  {"!=", BINOP_NOTEQUAL, PREC_ORDER, 0},
-  {"<=", BINOP_LEQ, PREC_ORDER, 0},
-  {">=", BINOP_GEQ, PREC_ORDER, 0},
-  {">", BINOP_GTR, PREC_ORDER, 0},
-  {"<", BINOP_LESS, PREC_ORDER, 0},
-  {">>", BINOP_RSH, PREC_SHIFT, 0},
-  {"<<", BINOP_LSH, PREC_SHIFT, 0},
-  {"+", BINOP_ADD, PREC_ADD, 0},
-  {"-", BINOP_SUB, PREC_ADD, 0},
-  {"~", BINOP_CONCAT, PREC_ADD, 0},
-  {"*", BINOP_MUL, PREC_MUL, 0},
-  {"/", BINOP_DIV, PREC_MUL, 0},
-  {"%", BINOP_REM, PREC_MUL, 0},
-  {"^^", BINOP_EXP, PREC_REPEAT, 0},
-  {"@", BINOP_REPEAT, PREC_REPEAT, 0},
-  {"-", UNOP_NEG, PREC_PREFIX, 0},
-  {"!", UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
-  {"~", UNOP_COMPLEMENT, PREC_PREFIX, 0},
-  {"*", UNOP_IND, PREC_PREFIX, 0},
-  {"&", UNOP_ADDR, PREC_PREFIX, 0},
-  {"sizeof ", UNOP_SIZEOF, PREC_PREFIX, 0},
-  {"++", UNOP_PREINCREMENT, PREC_PREFIX, 0},
-  {"--", UNOP_PREDECREMENT, PREC_PREFIX, 0},
-  {NULL, OP_NULL, PREC_PREFIX, 0}
-};
-
-/* Mapping of all D basic data types into the language vector.  */
-
-enum d_primitive_types {
-  d_primitive_type_void,
-  d_primitive_type_bool,
-  d_primitive_type_byte,
-  d_primitive_type_ubyte,
-  d_primitive_type_short,
-  d_primitive_type_ushort,
-  d_primitive_type_int,
-  d_primitive_type_uint,
-  d_primitive_type_long,
-  d_primitive_type_ulong,
-  d_primitive_type_cent,    /* Signed 128 bit integer.  */
-  d_primitive_type_ucent,   /* Unsigned 128 bit integer.  */
-  d_primitive_type_float,
-  d_primitive_type_double,
-  d_primitive_type_real,
-  d_primitive_type_ifloat,  /* Imaginary float types.  */
-  d_primitive_type_idouble,
-  d_primitive_type_ireal,
-  d_primitive_type_cfloat,  /* Complex number of two float values.  */
-  d_primitive_type_cdouble,
-  d_primitive_type_creal,
-  d_primitive_type_char,    /* Unsigned character types.  */
-  d_primitive_type_wchar,
-  d_primitive_type_dchar,
-  nr_d_primitive_types
-};
-
-/* Constant data that describes the D language.  */
-
-extern const struct language_data d_language_data =
-{
-  &exp_descriptor_c,
-  d_op_print_tab,              /* Expression operators for printing.  */
-};
-
 /* Class representing the D language.  */
 
 class d_language : public language_defn
 {
 public:
   d_language ()
-    : language_defn (language_d, d_language_data)
+    : language_defn (language_d)
   { /* Nothing.  */ }
 
   /* See language.h.  */
@@ -165,67 +90,45 @@ public:
   {
     const struct builtin_d_type *builtin = builtin_d_type (gdbarch);
 
-    lai->string_char_type = builtin->builtin_char;
-    lai->primitive_type_vector
-      = GDBARCH_OBSTACK_CALLOC (gdbarch, nr_d_primitive_types + 1,
-                               struct type *);
-
-    lai->primitive_type_vector [d_primitive_type_void]
-      = builtin->builtin_void;
-    lai->primitive_type_vector [d_primitive_type_bool]
-      = builtin->builtin_bool;
-    lai->primitive_type_vector [d_primitive_type_byte]
-      = builtin->builtin_byte;
-    lai->primitive_type_vector [d_primitive_type_ubyte]
-      = builtin->builtin_ubyte;
-    lai->primitive_type_vector [d_primitive_type_short]
-      = builtin->builtin_short;
-    lai->primitive_type_vector [d_primitive_type_ushort]
-      = builtin->builtin_ushort;
-    lai->primitive_type_vector [d_primitive_type_int]
-      = builtin->builtin_int;
-    lai->primitive_type_vector [d_primitive_type_uint]
-      = builtin->builtin_uint;
-    lai->primitive_type_vector [d_primitive_type_long]
-      = builtin->builtin_long;
-    lai->primitive_type_vector [d_primitive_type_ulong]
-      = builtin->builtin_ulong;
-    lai->primitive_type_vector [d_primitive_type_cent]
-      = builtin->builtin_cent;
-    lai->primitive_type_vector [d_primitive_type_ucent]
-      = builtin->builtin_ucent;
-    lai->primitive_type_vector [d_primitive_type_float]
-      = builtin->builtin_float;
-    lai->primitive_type_vector [d_primitive_type_double]
-      = builtin->builtin_double;
-    lai->primitive_type_vector [d_primitive_type_real]
-      = builtin->builtin_real;
-    lai->primitive_type_vector [d_primitive_type_ifloat]
-      = builtin->builtin_ifloat;
-    lai->primitive_type_vector [d_primitive_type_idouble]
-      = builtin->builtin_idouble;
-    lai->primitive_type_vector [d_primitive_type_ireal]
-      = builtin->builtin_ireal;
-    lai->primitive_type_vector [d_primitive_type_cfloat]
-      = builtin->builtin_cfloat;
-    lai->primitive_type_vector [d_primitive_type_cdouble]
-      = builtin->builtin_cdouble;
-    lai->primitive_type_vector [d_primitive_type_creal]
-      = builtin->builtin_creal;
-    lai->primitive_type_vector [d_primitive_type_char]
-      = builtin->builtin_char;
-    lai->primitive_type_vector [d_primitive_type_wchar]
-      = builtin->builtin_wchar;
-    lai->primitive_type_vector [d_primitive_type_dchar]
-      = builtin->builtin_dchar;
-
-    lai->bool_type_symbol = "bool";
-    lai->bool_type_default = builtin->builtin_bool;
+    /* Helper function to allow shorter lines below.  */
+    auto add  = [&] (struct type * t)
+    {
+      lai->add_primitive_type (t);
+    };
+
+    add (builtin->builtin_void);
+    add (builtin->builtin_bool);
+    add (builtin->builtin_byte);
+    add (builtin->builtin_ubyte);
+    add (builtin->builtin_short);
+    add (builtin->builtin_ushort);
+    add (builtin->builtin_int);
+    add (builtin->builtin_uint);
+    add (builtin->builtin_long);
+    add (builtin->builtin_ulong);
+    add (builtin->builtin_cent);
+    add (builtin->builtin_ucent);
+    add (builtin->builtin_float);
+    add (builtin->builtin_double);
+    add (builtin->builtin_real);
+    add (builtin->builtin_ifloat);
+    add (builtin->builtin_idouble);
+    add (builtin->builtin_ireal);
+    add (builtin->builtin_cfloat);
+    add (builtin->builtin_cdouble);
+    add (builtin->builtin_creal);
+    add (builtin->builtin_char);
+    add (builtin->builtin_wchar);
+    add (builtin->builtin_dchar);
+
+    lai->set_string_char_type (builtin->builtin_char);
+    lai->set_bool_type (builtin->builtin_bool, "bool");
   }
 
   /* See language.h.  */
-  bool sniff_from_mangled_name (const char *mangled,
-                               char **demangled) const override
+  bool sniff_from_mangled_name
+       (const char *mangled,
+       gdb::unique_xmalloc_ptr<char> *demangled) const override
   {
     *demangled = d_demangle (mangled, 0);
     return *demangled != NULL;
@@ -233,18 +136,26 @@ public:
 
   /* See language.h.  */
 
-  char *demangle (const char *mangled, int options) const override
+  gdb::unique_xmalloc_ptr<char> demangle_symbol (const char *mangled,
+                                                int options) const override
   {
     return d_demangle (mangled, options);
   }
 
   /* See language.h.  */
 
+  bool can_print_type_offsets () const override
+  {
+    return true;
+  }
+
+  /* See language.h.  */
+
   void print_type (struct type *type, const char *varstring,
                   struct ui_file *stream, int show, int level,
                   const struct type_print_options *flags) const override
   {
-    c_print_type (type, varstring, stream, show, level, flags);
+    c_print_type (type, varstring, stream, show, level, la_language, flags);
   }
 
   /* See language.h.  */
@@ -284,11 +195,10 @@ static d_language d_language_defn;
 
 /* Build all D language types for the specified architecture.  */
 
-static void *
+static struct builtin_d_type *
 build_d_types (struct gdbarch *gdbarch)
 {
-  struct builtin_d_type *builtin_d_type
-    = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct builtin_d_type);
+  struct builtin_d_type *builtin_d_type = new struct builtin_d_type;
 
   /* Basic types.  */
   builtin_d_type->builtin_void
@@ -361,19 +271,19 @@ build_d_types (struct gdbarch *gdbarch)
   return builtin_d_type;
 }
 
-static struct gdbarch_data *d_type_data;
+static const registry<gdbarch>::key<struct builtin_d_type> d_type_data;
 
 /* Return the D type table for the specified architecture.  */
 
 const struct builtin_d_type *
 builtin_d_type (struct gdbarch *gdbarch)
 {
-  return (const struct builtin_d_type *) gdbarch_data (gdbarch, d_type_data);
-}
-
-void _initialize_d_language ();
-void
-_initialize_d_language ()
-{
-  d_type_data = gdbarch_data_register_post_init (build_d_types);
+  struct builtin_d_type *result = d_type_data.get (gdbarch);
+  if (result == nullptr)
+    {
+      result = build_d_types (gdbarch);
+      d_type_data.set (gdbarch, result);
+    }
+
+  return result;
 }