[2/2,gdb/macro] Ignore malformed macro definition complaint for clang
Checks
Context |
Check |
Description |
linaro-tcwg-bot/tcwg_gdb_build--master-aarch64 |
success
|
Testing passed
|
linaro-tcwg-bot/tcwg_gdb_build--master-arm |
success
|
Testing passed
|
linaro-tcwg-bot/tcwg_gdb_check--master-aarch64 |
success
|
Testing passed
|
linaro-tcwg-bot/tcwg_gdb_check--master-arm |
success
|
Testing passed
|
Commit Message
With test-case test.c:
...
#define NOARG
int main (void) { return 0; }
...
compiled with clang:
...
$ clang test.c -g3 -fdebug-macro
...
we get a complaint:
...
$ gdb -q -batch -iex "set complaints 5" a.out -ex "p main"
During symbol reading: macro debug info contains a malformed macro definition:
`NOARG'
...
and four others from pre-defined defs.
This is because the macro body is defined as "NOARG" instead of "NOARG ".
There's a comment in parse_macro_definition that describes why the space
should be there, quoting the standard.
My guess is that this is just a matter of interpretation. Either we have
- a name and empty definition, separated by a space, or
- a name and no definition, and therefore no space.
Anyway, this is long-standing and AFAICT intentional behaviour from clang, and
I think it's entirely reasonable, so drop the complaint for clang.
Likewise for '#define ARG(V)'.
Tested on x86_64-linux.
---
gdb/dwarf2/macro.c | 12 +++++++-----
gdb/testsuite/gdb.dwarf2/clang-cli-macro.exp | 4 ++++
2 files changed, 11 insertions(+), 5 deletions(-)
@@ -103,7 +103,7 @@ consume_improper_spaces (const char *p, const char *body)
static void
parse_macro_definition (struct macro_source_file *file, int line,
- const char *body)
+ const char *body, struct dwarf2_cu *cu)
{
const char *p;
@@ -149,7 +149,8 @@ parse_macro_definition (struct macro_source_file *file, int line,
replacement = body + name_len + 1;
else
{
- dwarf2_macro_malformed_definition_complaint (body);
+ if (!producer_is_clang (cu))
+ dwarf2_macro_malformed_definition_complaint (body);
replacement = body + name_len;
}
@@ -213,7 +214,8 @@ parse_macro_definition (struct macro_source_file *file, int line,
else if (*p == '\0')
{
/* Complain, but do define it. */
- dwarf2_macro_malformed_definition_complaint (body);
+ if (!producer_is_clang (cu))
+ dwarf2_macro_malformed_definition_complaint (body);
macro_define_function (file, line, name.c_str (),
argc, (const char **) argv,
p);
@@ -569,7 +571,7 @@ dwarf_decode_macro_bytes (dwarf2_per_objfile *per_objfile,
line, current_file->filename);
}
else if (is_define)
- parse_macro_definition (current_file, line, body);
+ parse_macro_definition (current_file, line, body, cu);
else
{
gdb_assert (macinfo_type == DW_MACRO_undef
@@ -633,7 +635,7 @@ dwarf_decode_macro_bytes (dwarf2_per_objfile *per_objfile,
}
if (macinfo_type == DW_MACRO_define_strx)
- parse_macro_definition (current_file, line, body);
+ parse_macro_definition (current_file, line, body, cu);
else
macro_undef (current_file, line, body);
}
@@ -75,6 +75,8 @@ Dwarf::assemble $asm_file {
start_file 0 1
# A macro defined at line 1 of the main file.
define 1 "TWO 2"
+ define 2 "THREE"
+ define 3 "FOUR(ARG)"
end_file
define 0 "ONE 1"
}
@@ -97,3 +99,5 @@ if {![runto_main]} {
gdb_test "print TWO" "= 2" "print simple macro"
gdb_test "print ONE" "= 1" "print defined from CLI"
+gdb_test "info macro THREE" "\r\n#define THREE "
+gdb_test "info macro FOUR" "\r\n[string_to_regexp {#define FOUR(ARG) }]"