Fix C++ build errors on OpenBSD
Commit Message
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(-)
Comments
On 15-11-17 08:25 AM, Pedro Alves wrote:
> 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". */
>
>
Yes, this looks much better. Will you push it yourself?
@@ -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__,
@@ -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
@@ -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". */
@@ -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". */