From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18620 invoked by alias); 17 Jan 2011 13:31:29 -0000 Mailing-List: contact archer-commits-help@sourceware.org; run by ezmlm Sender: Precedence: bulk List-Post: List-Help: List-Subscribe: Received: (qmail 18571 invoked by uid 9514); 17 Jan 2011 13:31:28 -0000 Date: Mon, 17 Jan 2011 13:31:00 -0000 Message-ID: <20110117133128.18556.qmail@sourceware.org> From: pmuldoon@sourceware.org To: archer-commits@sourceware.org Subject: [SCM] master: Merge remote branch 'gdb/master' X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: dc2d67fd3e4bc8d43ece6e1e1d99094bfa380b7a X-Git-Newrev: 54cd47005c5ee2158c538f725502b10fedadefc9 X-SW-Source: 2011-q1/txt/msg00049.txt.bz2 List-Id: The branch, master has been updated via 54cd47005c5ee2158c538f725502b10fedadefc9 (commit) via 893e939f750c3d0018aca70a5b181f7554973854 (commit) via 0d8306bf351509bad634e46c2f85c942e9a0649e (commit) via afb11568c4568d0b5e90c87ae26ae2f9e1a56665 (commit) via 8714d5976f75118ff9e1b284c73b7a574369bc28 (commit) via 0894b5fe27eb14ef6ba5a8136b9a0ccbf81c9a6e (commit) via ed85087ca82b4eab3963a71f2e653766eb7f80fa (commit) from dc2d67fd3e4bc8d43ece6e1e1d99094bfa380b7a (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 54cd47005c5ee2158c538f725502b10fedadefc9 Merge: dc2d67f 893e939 Author: Phil Muldoon Date: Mon Jan 17 13:31:20 2011 +0000 Merge remote branch 'gdb/master' commit 893e939f750c3d0018aca70a5b181f7554973854 Author: Pierre Muller Date: Mon Jan 17 10:34:49 2011 +0000 * p-exp.y (intvar): New static variable, used to set CURRENT_TYPE for internal variables. (last_was_structop): New static variable. (COMPLETE): New token. (field_exp): New rule to group all '.' suffix handling. Add mark_struct_expression calls when approriate to be able to correctly find fields for completion. (yylex): Adapt to handle field completion and set INTVAR when required. commit 0d8306bf351509bad634e46c2f85c942e9a0649e Author: gdbadmin Date: Mon Jan 17 00:00:33 2011 +0000 *** empty log message *** commit afb11568c4568d0b5e90c87ae26ae2f9e1a56665 Author: Alan Modra Date: Sun Jan 16 23:00:06 2011 +0000 daily update commit 8714d5976f75118ff9e1b284c73b7a574369bc28 Author: gdbadmin Date: Sun Jan 16 00:00:33 2011 +0000 *** empty log message *** commit 0894b5fe27eb14ef6ba5a8136b9a0ccbf81c9a6e Author: Alan Modra Date: Sat Jan 15 23:00:05 2011 +0000 daily update commit ed85087ca82b4eab3963a71f2e653766eb7f80fa Author: H.J. Lu Date: Sat Jan 15 15:49:46 2011 +0000 Check invalid x32 relocations. 2011-01-15 H.J. Lu * elf64-x86-64.c (elf_x86_64_check_relocs): Check invalid x32 relocations. ----------------------------------------------------------------------- Summary of changes: bfd/ChangeLog | 5 ++ bfd/elf64-x86-64.c | 33 ++++++++++++++++ bfd/version.h | 2 +- gdb/ChangeLog | 12 ++++++ gdb/p-exp.y | 106 +++++++++++++++++++++++++++++++++++++++++++-------- gdb/version.in | 2 +- 6 files changed, 141 insertions(+), 19 deletions(-) First 500 lines of diff: diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 37c49a3..00ff8ff 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2011-01-15 H.J. Lu + + * elf64-x86-64.c (elf_x86_64_check_relocs): Check invalid x32 + relocations. + 2011-01-14 H.J. Lu * elf64-x86-64.c (elf_x86_64_link_hash_table): Add pointer_r_type. diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 579f59c..9a3959a 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -1179,6 +1179,39 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, h = (struct elf_link_hash_entry *) h->root.u.i.link; } + /* Check invalid x32 relocations. */ + if (!ABI_64_P (abfd)) + switch (r_type) + { + default: + break; + + case R_X86_64_64: + case R_X86_64_DTPOFF64: + case R_X86_64_TPOFF64: + case R_X86_64_PC64: + case R_X86_64_GOTOFF64: + case R_X86_64_GOT64: + case R_X86_64_GOTPCREL64: + case R_X86_64_GOTPC64: + case R_X86_64_GOTPLT64: + case R_X86_64_PLTOFF64: + { + if (h) + name = h->root.root.string; + else + name = bfd_elf_sym_name (abfd, symtab_hdr, isym, + NULL); + (*_bfd_error_handler) + (_("%B: relocation %s against symbol `%s' isn't " + "supported in x32 mode"), abfd, + x86_64_elf_howto_table[r_type].name, name); + bfd_set_error (bfd_error_bad_value); + return FALSE; + } + break; + } + if (h != NULL) { /* Create the ifunc sections for static executables. If we diff --git a/bfd/version.h b/bfd/version.h index 1c1d5ea..df12f23 100644 --- a/bfd/version.h +++ b/bfd/version.h @@ -1,4 +1,4 @@ -#define BFD_VERSION_DATE 20110115 +#define BFD_VERSION_DATE 20110117 #define BFD_VERSION @bfd_version@ #define BFD_VERSION_STRING @bfd_version_package@ @bfd_version_string@ #define REPORT_BUGS_TO @report_bugs_to@ diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3788f8d..7db03c9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,15 @@ +2011-01-17 Pierre Muller + + * p-exp.y (intvar): New static variable, used to set CURRENT_TYPE + for internal variables. + (last_was_structop): New static variable. + (COMPLETE): New token. + (field_exp): New rule to group all '.' suffix handling. + Add mark_struct_expression calls when approriate to be able + to correctly find fields for completion. + (yylex): Adapt to handle field completion and set INTVAR when + required. + 2011-01-14 Yao Qi * arm-tdep.c (arm_register_reggroup_p): FPS register is in diff --git a/gdb/p-exp.y b/gdb/p-exp.y index 21c3dbb..ec656d0 100644 --- a/gdb/p-exp.y +++ b/gdb/p-exp.y @@ -158,6 +158,7 @@ static int parse_number (char *, int, int, YYSTYPE *); static struct type *current_type; +static struct internalvar *intvar; static int leftdiv_is_integer; static void push_current_type (void); static void pop_current_type (void); @@ -184,6 +185,7 @@ static int search_field; %token STRING %token FIELDNAME +%token COMPLETE %token NAME /* BLOCKNAME defined below to give it higher precedence. */ %token TYPENAME %type name @@ -233,6 +235,7 @@ static int search_field; %% start : { current_type = NULL; + intvar = NULL; search_field = 0; leftdiv_is_integer = 0; } @@ -285,19 +288,56 @@ exp : DECREMENT '(' exp ')' %prec UNARY { write_exp_elt_opcode (UNOP_PREDECREMENT); } ; -exp : exp '.' { search_field = 1; } - FIELDNAME - /* name */ + +field_exp : exp '.' %prec UNARY + { search_field = 1; } + ; + +exp : field_exp FIELDNAME { write_exp_elt_opcode (STRUCTOP_STRUCT); - write_exp_string ($4); + write_exp_string ($2); + write_exp_elt_opcode (STRUCTOP_STRUCT); + search_field = 0; + if (current_type) + { + while (TYPE_CODE (current_type) + == TYPE_CODE_PTR) + current_type = + TYPE_TARGET_TYPE (current_type); + current_type = lookup_struct_elt_type ( + current_type, $2.ptr, 0); + } + } + ; + +exp : field_exp name + { mark_struct_expression (); + write_exp_elt_opcode (STRUCTOP_STRUCT); + write_exp_string ($2); write_exp_elt_opcode (STRUCTOP_STRUCT); search_field = 0; if (current_type) - { while (TYPE_CODE (current_type) == TYPE_CODE_PTR) - current_type = TYPE_TARGET_TYPE (current_type); + { + while (TYPE_CODE (current_type) + == TYPE_CODE_PTR) + current_type = + TYPE_TARGET_TYPE (current_type); current_type = lookup_struct_elt_type ( - current_type, $4.ptr, 0); }; - } ; + current_type, $2.ptr, 0); + } + } + ; + +exp : field_exp COMPLETE + { struct stoken s; + mark_struct_expression (); + write_exp_elt_opcode (STRUCTOP_STRUCT); + s.ptr = ""; + s.length = 0; + write_exp_string (s); + write_exp_elt_opcode (STRUCTOP_STRUCT); } + ; + exp : exp '[' /* We need to save the current_type value. */ { char *arrayname; @@ -516,8 +556,19 @@ exp : variable ; exp : VARIABLE - /* Already written by write_dollar_variable. */ - ; + /* Already written by write_dollar_variable. + Handle current_type. */ + { if (intvar) { + struct value * val, * mark; + + mark = value_mark (); + val = value_of_internalvar (parse_gdbarch, + intvar); + current_type = value_type (val); + value_release_to_mark (mark); + } + } + ; exp : SIZEOF '(' type ')' %prec UNARY { write_exp_elt_opcode (OP_LONG); @@ -1060,8 +1111,13 @@ static char * uptok (tokstart, namelen) uptokstart[namelen]='\0'; return uptokstart; } -/* Read one token, getting characters through lexptr. */ +/* This is set if the previously-returned token was a structure + operator '.'. This is used only when parsing to + do field name completion. */ +static int last_was_structop; + +/* Read one token, getting characters through lexptr. */ static int yylex () @@ -1075,7 +1131,9 @@ yylex () int explen, tempbufindex; static char *tempbuf; static int tempbufsize; - + int saw_structop = last_was_structop; + + last_was_structop = 0; retry: prev_lexptr = lexptr; @@ -1111,7 +1169,10 @@ yylex () switch (c = *tokstart) { case 0: - return 0; + if (saw_structop && search_field) + return COMPLETE; + else + return 0; case ' ': case '\t': @@ -1172,7 +1233,12 @@ yylex () case '.': /* Might be a floating point number. */ if (lexptr[1] < '0' || lexptr[1] > '9') - goto symbol; /* Nope, must be a symbol. */ + { + if (in_parse_field) + last_was_structop = 1; + goto symbol; /* Nope, must be a symbol. */ + } + /* FALL THRU into number case. */ case '0': @@ -1430,11 +1496,17 @@ yylex () if (*tokstart == '$') { + char c; /* $ is the normal prefix for pascal hexadecimal values but this conflicts with the GDB use for debugger variables so in expression to enter hexadecimal values we still need to use C syntax with 0xff */ write_dollar_variable (yylval.sval); + c = tokstart[namelen]; + tokstart[namelen] = 0; + intvar = lookup_only_internalvar (++tokstart); + --tokstart; + tokstart[namelen] = c; free (uptokstart); return VARIABLE; } @@ -1454,7 +1526,7 @@ yylex () if (search_field && current_type) is_a_field = (lookup_struct_elt_type (current_type, tmp, 1) != NULL); - if (is_a_field) + if (is_a_field || in_parse_field) sym = NULL; else sym = lookup_symbol (tmp, expression_context_block, @@ -1469,7 +1541,7 @@ yylex () } if (search_field && current_type) is_a_field = (lookup_struct_elt_type (current_type, tmp, 1) != NULL); - if (is_a_field) + if (is_a_field || in_parse_field) sym = NULL; else sym = lookup_symbol (tmp, expression_context_block, @@ -1497,7 +1569,7 @@ yylex () } if (search_field && current_type) is_a_field = (lookup_struct_elt_type (current_type, tmp, 1) != NULL); - if (is_a_field) + if (is_a_field || in_parse_field) sym = NULL; else sym = lookup_symbol (tmp, expression_context_block, diff --git a/gdb/version.in b/gdb/version.in index 5275ee7..ddb971d 100644 --- a/gdb/version.in +++ b/gdb/version.in @@ -1 +1 @@ -7.2.50.20110115-cvs +7.2.50.20110117-cvs hooks/post-receive -- Repository for Project Archer.