Home | History | Annotate | Line # | Download | only in gdb
namespace.h revision 1.1.1.7
      1      1.1  christos /* Code dealing with "using" directives for GDB.
      2  1.1.1.6  christos    Copyright (C) 2003-2024 Free Software Foundation, Inc.
      3      1.1  christos 
      4      1.1  christos    This file is part of GDB.
      5      1.1  christos 
      6      1.1  christos    This program is free software; you can redistribute it and/or modify
      7      1.1  christos    it under the terms of the GNU General Public License as published by
      8      1.1  christos    the Free Software Foundation; either version 3 of the License, or
      9      1.1  christos    (at your option) any later version.
     10      1.1  christos 
     11      1.1  christos    This program is distributed in the hope that it will be useful,
     12      1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13      1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14      1.1  christos    GNU General Public License for more details.
     15      1.1  christos 
     16      1.1  christos    You should have received a copy of the GNU General Public License
     17      1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     18      1.1  christos 
     19  1.1.1.7  christos #ifndef GDB_NAMESPACE_H
     20  1.1.1.7  christos #define GDB_NAMESPACE_H
     21      1.1  christos 
     22  1.1.1.5  christos #include "gdbsupport/gdb_obstack.h"
     23      1.1  christos 
     24      1.1  christos /* This struct is designed to store data from using directives.  It
     25      1.1  christos    says that names from namespace IMPORT_SRC should be visible within
     26      1.1  christos    namespace IMPORT_DEST.  These form a linked list; NEXT is the next
     27      1.1  christos    element of the list.  If the imported namespace or declaration has
     28      1.1  christos    been aliased within the IMPORT_DEST namespace, ALIAS is set to a
     29      1.1  christos    string representing the alias.  Otherwise, ALIAS is NULL.
     30      1.1  christos    DECLARATION is the name of the imported declaration, if this import
     31      1.1  christos    statement represents one.  Otherwise DECLARATION is NULL and this
     32  1.1.1.6  christos    import statement represents a namespace.  DECL_LINE is the line
     33  1.1.1.6  christos    where the using directive is written in the source code.
     34      1.1  christos 
     35      1.1  christos    C++:      using namespace A;
     36      1.1  christos    Fortran:  use A
     37      1.1  christos    import_src = "A"
     38      1.1  christos    import_dest = local scope of the import statement even such as ""
     39      1.1  christos    alias = NULL
     40      1.1  christos    declaration = NULL
     41      1.1  christos    excludes = NULL
     42      1.1  christos 
     43      1.1  christos    C++:      using A::x;
     44      1.1  christos    Fortran:  use A, only: x
     45      1.1  christos    import_src = "A"
     46      1.1  christos    import_dest = local scope of the import statement even such as ""
     47      1.1  christos    alias = NULL
     48      1.1  christos    declaration = "x"
     49      1.1  christos    excludes = NULL
     50      1.1  christos    The declaration will get imported as import_dest::x.
     51      1.1  christos 
     52      1.1  christos    C++ has no way to import all names except those listed ones.
     53      1.1  christos    Fortran:  use A, localname => x
     54      1.1  christos    import_src = "A"
     55      1.1  christos    import_dest = local scope of the import statement even such as ""
     56      1.1  christos    alias = "localname"
     57      1.1  christos    declaration = "x"
     58      1.1  christos    excludes = NULL
     59      1.1  christos    +
     60      1.1  christos    import_src = "A"
     61      1.1  christos    import_dest = local scope of the import statement even such as ""
     62      1.1  christos    alias = NULL
     63      1.1  christos    declaration = NULL
     64      1.1  christos    excludes = ["x"]
     65      1.1  christos    All the entries of A get imported except of "x".  "x" gets imported as
     66      1.1  christos    "localname".  "x" is not defined as a local name by this statement.
     67      1.1  christos 
     68      1.1  christos    C++:      namespace LOCALNS = A;
     69      1.1  christos    Fortran has no way to address non-local namespace/module.
     70      1.1  christos    import_src = "A"
     71      1.1  christos    import_dest = local scope of the import statement even such as ""
     72      1.1  christos    alias = "LOCALNS"
     73      1.1  christos    declaration = NULL
     74      1.1  christos    excludes = NULL
     75      1.1  christos    The namespace will get imported as the import_dest::LOCALNS
     76      1.1  christos    namespace.
     77      1.1  christos 
     78      1.1  christos    C++ cannot express it, it would be something like: using localname
     79      1.1  christos    = A::x;
     80      1.1  christos    Fortran:  use A, only localname => x
     81      1.1  christos    import_src = "A"
     82      1.1  christos    import_dest = local scope of the import statement even such as ""
     83      1.1  christos    alias = "localname"
     84      1.1  christos    declaration = "x"
     85      1.1  christos    excludes = NULL
     86      1.1  christos    The declaration will get imported as localname or
     87      1.1  christos    `import_dest`localname.  */
     88      1.1  christos 
     89      1.1  christos struct using_direct
     90      1.1  christos {
     91      1.1  christos   const char *import_src;
     92      1.1  christos   const char *import_dest;
     93      1.1  christos 
     94      1.1  christos   const char *alias;
     95      1.1  christos   const char *declaration;
     96      1.1  christos 
     97      1.1  christos   struct using_direct *next;
     98      1.1  christos 
     99  1.1.1.6  christos   /* The line where the using directive was declared on the source file.
    100  1.1.1.6  christos      This is used to check if the using directive is already active at the
    101  1.1.1.6  christos      point where the inferior is stopped.  */
    102  1.1.1.6  christos   unsigned int decl_line;
    103  1.1.1.6  christos 
    104      1.1  christos   /* Used during import search to temporarily mark this node as
    105      1.1  christos      searched.  */
    106      1.1  christos   int searched;
    107      1.1  christos 
    108      1.1  christos   /* USING_DIRECT has variable allocation size according to the number of
    109      1.1  christos      EXCLUDES entries, the last entry is NULL.  */
    110      1.1  christos   const char *excludes[1];
    111  1.1.1.6  christos 
    112  1.1.1.6  christos   /* Returns true if the using_directive USING_DIR is valid in CURR_LINE.
    113  1.1.1.6  christos      Because current GCC (at least version 12.2) sets the decl_line as
    114  1.1.1.6  christos      the last line in the current block, we need to take this into
    115  1.1.1.6  christos      consideration when checking the validity, by comparing it to
    116  1.1.1.6  christos      BOUNDARY, the last line of the current block.  */
    117  1.1.1.6  christos   bool valid_line (unsigned int boundary) const;
    118      1.1  christos };
    119      1.1  christos 
    120      1.1  christos extern void add_using_directive (struct using_direct **using_directives,
    121      1.1  christos 				 const char *dest,
    122      1.1  christos 				 const char *src,
    123      1.1  christos 				 const char *alias,
    124      1.1  christos 				 const char *declaration,
    125  1.1.1.3  christos 				 const std::vector<const char *> &excludes,
    126  1.1.1.6  christos 				 const unsigned int decl_line,
    127  1.1.1.5  christos 				 struct obstack *obstack);
    128      1.1  christos 
    129  1.1.1.7  christos #endif /* GDB_NAMESPACE_H */
    130