This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix C++ build errors on OpenBSD


On 11/16/2015 04:04 PM, Simon Marchi wrote:
> Fixes two instances of:
> 
>   /root/binutils-gdb/gdb/cp-namespace.c: In function 'block_symbol cp_lookup_nested_symbol(type*, const char*, const block*, domain_enum)':
>   /root/binutils-gdb/gdb/cp-namespace.c:1010: warning: jump to case label
>   /root/binutils-gdb/gdb/cp-namespace.c:1008: error:   crosses initialization of 'block_symbol <anonymous>'
> 
> Compiler info:
> 
>   Reading specs from /usr/lib/gcc-lib/amd64-unknown-openbsd5.8/4.2.1/specs
>   Target: amd64-unknown-openbsd5.8
>   Configured with: OpenBSD/amd64 system compiler
>   Thread model: posix
>   gcc version 4.2.1 20070719
> 
> gdb/ChangeLog:
> 
> 	* cp-namespace.c (cp_lookup_nested_symbol): Add curly braces in switch
> 	case.
> 	* d-namespace.c (d_lookup_nested_symbol): Likewise.

Eeek.  WDYT of this alternative approach, in the spirit of null_ptid,
null_frame_id, etc.?  Haven't tried it on OpenBSD, but I assume it works.

>From 0d23703d1d79d4642a83765b0615613ec9c8980a Mon Sep 17 00:00:00 2001
From: Pedro Alves <palves@redhat.com>
Date: Tue, 17 Nov 2015 13:12:23 +0000
Subject: [PATCH] null_block_symbol

---
 gdb/cp-namespace.c | 14 +++++++-------
 gdb/d-namespace.c  | 10 +++++-----
 gdb/symtab.c       |  3 +++
 gdb/symtab.h       |  4 ++++
 4 files changed, 19 insertions(+), 12 deletions(-)

diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c
index 989544b..6890001 100644
--- a/gdb/cp-namespace.c
+++ b/gdb/cp-namespace.c
@@ -208,14 +208,14 @@ cp_lookup_bare_symbol (const struct language_defn *langdef,
 
       lang_this = lookup_language_this (language_def (language_cplus), block);
       if (lang_this.symbol == NULL)
-	return (struct block_symbol) {NULL, NULL};
+	return null_block_symbol;
 
       type = check_typedef (TYPE_TARGET_TYPE (SYMBOL_TYPE (lang_this.symbol)));
       /* If TYPE_NAME is NULL, abandon trying to find this symbol.
 	 This can happen for lambda functions compiled with clang++,
 	 which outputs no name for the container class.  */
       if (TYPE_NAME (type) == NULL)
-	return (struct block_symbol) {NULL, NULL};
+	return null_block_symbol;
 
       /* Look for symbol NAME in this class.  */
       sym = cp_lookup_nested_symbol (type, name, block, domain);
@@ -273,7 +273,7 @@ cp_search_static_and_baseclasses (const char *name,
   if (klass_sym.symbol == NULL)
     {
       do_cleanups (cleanup);
-      return (struct block_symbol) {NULL, NULL};
+      return null_block_symbol;
     }
   klass_type = SYMBOL_TYPE (klass_sym.symbol);
 
@@ -492,7 +492,7 @@ cp_lookup_symbol_via_imports (const char *scope,
 	}
     }
 
-  return (struct block_symbol) {NULL, NULL};
+  return null_block_symbol;
 }
 
 /* Helper function that searches an array of symbols for one named NAME.  */
@@ -640,7 +640,7 @@ cp_lookup_symbol_via_all_imports (const char *scope, const char *name,
       block = BLOCK_SUPERBLOCK (block);
     }
 
-  return (struct block_symbol) {NULL, NULL};
+  return null_block_symbol;
 }
 
 /* Searches for NAME in the current namespace, and by applying
@@ -928,7 +928,7 @@ cp_lookup_nested_symbol_1 (struct type *container_type,
 	return sym;
     }
 
-  return (struct block_symbol) {NULL, NULL};
+  return null_block_symbol;
 }
 
 /* Look up a symbol named NESTED_NAME that is nested inside the C++
@@ -1005,7 +1005,7 @@ cp_lookup_nested_symbol (struct type *parent_type,
 			      "cp_lookup_nested_symbol (...) = NULL"
 			      " (func/method)\n");
 	}
-      return (struct block_symbol) {NULL, NULL};
+      return null_block_symbol;
 
     default:
       internal_error (__FILE__, __LINE__,
diff --git a/gdb/d-namespace.c b/gdb/d-namespace.c
index e8f4c6f..170bddc 100644
--- a/gdb/d-namespace.c
+++ b/gdb/d-namespace.c
@@ -132,7 +132,7 @@ d_lookup_symbol (const struct language_defn *langdef,
 	  if (lang_this.symbol == NULL)
 	    {
 	      do_cleanups (cleanup);
-	      return (struct block_symbol) {NULL, NULL};
+	      return null_block_symbol;
 	    }
 
 	  type = check_typedef (TYPE_TARGET_TYPE (SYMBOL_TYPE (lang_this.symbol)));
@@ -159,7 +159,7 @@ d_lookup_symbol (const struct language_defn *langdef,
       if (class_sym.symbol == NULL)
 	{
 	  do_cleanups (cleanup);
-	  return (struct block_symbol) {NULL, NULL};
+	  return null_block_symbol;
 	}
 
       /* Look for a symbol named NESTED in this class.  */
@@ -370,7 +370,7 @@ d_lookup_nested_symbol (struct type *parent_type,
 
     case TYPE_CODE_FUNC:
     case TYPE_CODE_METHOD:
-      return (struct block_symbol) {NULL, NULL};
+      return null_block_symbol;
 
     default:
       gdb_assert_not_reached ("called with non-aggregate type.");
@@ -530,7 +530,7 @@ d_lookup_symbol_imports (const char *scope, const char *name,
 	}
     }
 
-  return (struct block_symbol) {NULL, NULL};
+  return null_block_symbol;
 }
 
 /* Searches for NAME in the current module, and by applying relevant
@@ -562,7 +562,7 @@ d_lookup_symbol_module (const char *scope, const char *name,
       block = BLOCK_SUPERBLOCK (block);
     }
 
-  return (struct block_symbol) {NULL, NULL};
+  return null_block_symbol;
 }
 
 /* The D-specific version of name lookup for static and global names
diff --git a/gdb/symtab.c b/gdb/symtab.c
index 16190c4..c42f5b6 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -85,6 +85,9 @@ static struct block_symbol
   lookup_symbol_in_objfile (struct objfile *objfile, int block_index,
 			    const char *name, const domain_enum domain);
 
+/* See symtab.h.  */
+const struct block_symbol null_block_symbol = { NULL, NULL };
+
 extern initialize_file_ftype _initialize_symtab;
 
 /* Program space key for finding name and language of "main".  */
diff --git a/gdb/symtab.h b/gdb/symtab.h
index 27b27c8..37c8c93 100644
--- a/gdb/symtab.h
+++ b/gdb/symtab.h
@@ -832,6 +832,10 @@ struct block_symbol
 
 extern const struct symbol_impl *symbol_impls;
 
+/* For convenience.  All fields are NULL.  This means "there is no
+   symbol".  */
+extern const struct block_symbol null_block_symbol;
+
 /* Note: There is no accessor macro for symbol.owner because it is
    "private".  */
 
-- 
1.9.3



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]