| OLD | NEW |
| 1 /* Target-dependent code for HP-UX on PA-RISC. | 1 /* Target-dependent code for HP-UX on PA-RISC. |
| 2 | 2 |
| 3 Copyright (C) 2002-2005, 2007-2012 Free Software Foundation, Inc. | 3 Copyright (C) 2002-2005, 2007-2012 Free Software Foundation, Inc. |
| 4 | 4 |
| 5 This file is part of GDB. | 5 This file is part of GDB. |
| 6 | 6 |
| 7 This program is free software; you can redistribute it and/or modify | 7 This program is free software; you can redistribute it and/or modify |
| 8 it under the terms of the GNU General Public License as published by | 8 it under the terms of the GNU General Public License as published by |
| 9 the Free Software Foundation; either version 3 of the License, or | 9 the Free Software Foundation; either version 3 of the License, or |
| 10 (at your option) any later version. | 10 (at your option) any later version. |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 170 stub and return. | 170 stub and return. |
| 171 | 171 |
| 172 Then see if the PC value falls within the section bounds for the | 172 Then see if the PC value falls within the section bounds for the |
| 173 section containing the minimal symbol we found in the first | 173 section containing the minimal symbol we found in the first |
| 174 step. If it does, then assume we are not in a stub and return. | 174 step. If it does, then assume we are not in a stub and return. |
| 175 | 175 |
| 176 Finally peek at the instructions to see if they look like a stub. */ | 176 Finally peek at the instructions to see if they look like a stub. */ |
| 177 struct minimal_symbol *minsym; | 177 struct minimal_symbol *minsym; |
| 178 asection *sec; | 178 asection *sec; |
| 179 CORE_ADDR addr; | 179 CORE_ADDR addr; |
| 180 int insn, i; | 180 int insn; |
| 181 | 181 |
| 182 minsym = lookup_minimal_symbol_by_pc (pc); | 182 minsym = lookup_minimal_symbol_by_pc (pc); |
| 183 if (! minsym) | 183 if (! minsym) |
| 184 return 0; | 184 return 0; |
| 185 | 185 |
| 186 sec = SYMBOL_OBJ_SECTION (minsym)->the_bfd_section; | 186 sec = SYMBOL_OBJ_SECTION (minsym)->the_bfd_section; |
| 187 | 187 |
| 188 if (bfd_get_section_vma (sec->owner, sec) <= pc | 188 if (bfd_get_section_vma (sec->owner, sec) <= pc |
| 189 && pc < (bfd_get_section_vma (sec->owner, sec) | 189 && pc < (bfd_get_section_vma (sec->owner, sec) |
| 190 + bfd_section_size (sec->owner, sec))) | 190 + bfd_section_size (sec->owner, sec))) |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 return 1; | 223 return 1; |
| 224 } | 224 } |
| 225 | 225 |
| 226 /* Return one if PC is in the return path of a trampoline, else return zero. | 226 /* Return one if PC is in the return path of a trampoline, else return zero. |
| 227 | 227 |
| 228 Note we return one for *any* call trampoline (long-call, arg-reloc), not | 228 Note we return one for *any* call trampoline (long-call, arg-reloc), not |
| 229 just shared library trampolines (import, export). */ | 229 just shared library trampolines (import, export). */ |
| 230 | 230 |
| 231 static int | 231 static int |
| 232 hppa_hpux_in_solib_return_trampoline (struct gdbarch *gdbarch, | 232 hppa_hpux_in_solib_return_trampoline (struct gdbarch *gdbarch, |
| 233 » » » » CORE_ADDR pc, char *name) | 233 » » » » CORE_ADDR pc, const char *name) |
| 234 { | 234 { |
| 235 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); | 235 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); |
| 236 struct unwind_table_entry *u; | 236 struct unwind_table_entry *u; |
| 237 | 237 |
| 238 /* Get the unwind descriptor corresponding to PC, return zero | 238 /* Get the unwind descriptor corresponding to PC, return zero |
| 239 if no unwind was found. */ | 239 if no unwind was found. */ |
| 240 u = find_unwind_entry (pc); | 240 u = find_unwind_entry (pc); |
| 241 if (!u) | 241 if (!u) |
| 242 return 0; | 242 return 0; |
| 243 | 243 |
| (...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 949 static CORE_ADDR | 949 static CORE_ADDR |
| 950 hppa64_hpux_search_dummy_call_sequence (struct gdbarch *gdbarch, CORE_ADDR pc, | 950 hppa64_hpux_search_dummy_call_sequence (struct gdbarch *gdbarch, CORE_ADDR pc, |
| 951 int *argreg) | 951 int *argreg) |
| 952 { | 952 { |
| 953 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); | 953 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); |
| 954 struct objfile *obj; | 954 struct objfile *obj; |
| 955 struct obj_section *sec; | 955 struct obj_section *sec; |
| 956 struct hppa_objfile_private *priv; | 956 struct hppa_objfile_private *priv; |
| 957 CORE_ADDR addr; | 957 CORE_ADDR addr; |
| 958 struct minimal_symbol *msym; | 958 struct minimal_symbol *msym; |
| 959 int i; | |
| 960 | 959 |
| 961 sec = find_pc_section (pc); | 960 sec = find_pc_section (pc); |
| 962 obj = sec->objfile; | 961 obj = sec->objfile; |
| 963 priv = objfile_data (obj, hppa_objfile_priv_data); | 962 priv = objfile_data (obj, hppa_objfile_priv_data); |
| 964 | 963 |
| 965 if (!priv) | 964 if (!priv) |
| 966 priv = hppa_init_objfile_priv_data (obj); | 965 priv = hppa_init_objfile_priv_data (obj); |
| 967 if (!priv) | 966 if (!priv) |
| 968 error (_("Internal error creating objfile private data.")); | 967 error (_("Internal error creating objfile private data.")); |
| 969 | 968 |
| 970 /* Use the cached value if we have one. */ | 969 /* Use the cached value if we have one. */ |
| 971 if (priv->dummy_call_sequence_addr != 0) | 970 if (priv->dummy_call_sequence_addr != 0) |
| 972 { | 971 { |
| 973 *argreg = priv->dummy_call_sequence_reg; | 972 *argreg = priv->dummy_call_sequence_reg; |
| 974 return priv->dummy_call_sequence_addr; | 973 return priv->dummy_call_sequence_addr; |
| 975 } | 974 } |
| 976 | 975 |
| 977 /* FIXME: Without stub unwind information, locating a suitable sequence is | 976 /* FIXME: Without stub unwind information, locating a suitable sequence is |
| 978 fairly difficult. For now, we implement a very naive and inefficient | 977 fairly difficult. For now, we implement a very naive and inefficient |
| 979 scheme; try to read in blocks of code, and look for a "bve,n (rp)" | 978 scheme; try to read in blocks of code, and look for a "bve,n (rp)" |
| 980 instruction. These are likely to occur at the end of functions, so | 979 instruction. These are likely to occur at the end of functions, so |
| 981 we only look at the last two instructions of each function. */ | 980 we only look at the last two instructions of each function. */ |
| 982 for (i = 0, msym = obj->msymbols; i < obj->minimal_symbol_count; i++, msym++) | 981 ALL_OBJFILE_MSYMBOLS (obj, msym) |
| 983 { | 982 { |
| 984 CORE_ADDR begin, end; | 983 CORE_ADDR begin, end; |
| 985 char *name; | 984 const char *name; |
| 986 gdb_byte buf[2 * HPPA_INSN_SIZE]; | 985 gdb_byte buf[2 * HPPA_INSN_SIZE]; |
| 987 int offset; | 986 int offset; |
| 988 | 987 |
| 989 find_pc_partial_function (SYMBOL_VALUE_ADDRESS (msym), &name, | 988 find_pc_partial_function (SYMBOL_VALUE_ADDRESS (msym), &name, |
| 990 &begin, &end); | 989 &begin, &end); |
| 991 | 990 |
| 992 if (name == NULL || begin == 0 || end == 0) | 991 if (name == NULL || begin == 0 || end == 0) |
| 993 continue; | 992 continue; |
| 994 | 993 |
| 995 if (target_read_memory (end - sizeof (buf), buf, sizeof (buf)) == 0) | 994 if (target_read_memory (end - sizeof (buf), buf, sizeof (buf)) == 0) |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1080 prematurely. Instead, we try to look for an address in the same space to | 1079 prematurely. Instead, we try to look for an address in the same space to |
| 1081 put the breakpoint. | 1080 put the breakpoint. |
| 1082 | 1081 |
| 1083 This is similar in spirit to putting the breakpoint at the "entry point" | 1082 This is similar in spirit to putting the breakpoint at the "entry point" |
| 1084 of an executable. */ | 1083 of an executable. */ |
| 1085 | 1084 |
| 1086 struct obj_section *sec; | 1085 struct obj_section *sec; |
| 1087 struct unwind_table_entry *u; | 1086 struct unwind_table_entry *u; |
| 1088 struct minimal_symbol *msym; | 1087 struct minimal_symbol *msym; |
| 1089 CORE_ADDR func; | 1088 CORE_ADDR func; |
| 1090 int i; | |
| 1091 | 1089 |
| 1092 sec = find_pc_section (addr); | 1090 sec = find_pc_section (addr); |
| 1093 if (sec) | 1091 if (sec) |
| 1094 { | 1092 { |
| 1095 /* First try the lowest address in the section; we can use it as long | 1093 /* First try the lowest address in the section; we can use it as long |
| 1096 as it is "regular" code (i.e. not a stub). */ | 1094 as it is "regular" code (i.e. not a stub). */ |
| 1097 u = find_unwind_entry (obj_section_addr (sec)); | 1095 u = find_unwind_entry (obj_section_addr (sec)); |
| 1098 if (!u || u->stub_unwind.stub_type == 0) | 1096 if (!u || u->stub_unwind.stub_type == 0) |
| 1099 return obj_section_addr (sec); | 1097 return obj_section_addr (sec); |
| 1100 | 1098 |
| 1101 /* Otherwise, we need to find a symbol for a regular function. We | 1099 /* Otherwise, we need to find a symbol for a regular function. We |
| 1102 do this by walking the list of msymbols in the objfile. The symbol | 1100 do this by walking the list of msymbols in the objfile. The symbol |
| 1103 we find should not be the same as the function that was passed in. */ | 1101 we find should not be the same as the function that was passed in. */ |
| 1104 | 1102 |
| 1105 /* FIXME: this is broken, because we can find a function that will be | 1103 /* FIXME: this is broken, because we can find a function that will be |
| 1106 called by the dummy call target function, which will still not | 1104 called by the dummy call target function, which will still not |
| 1107 work. */ | 1105 work. */ |
| 1108 | 1106 |
| 1109 find_pc_partial_function (addr, NULL, &func, NULL); | 1107 find_pc_partial_function (addr, NULL, &func, NULL); |
| 1110 for (i = 0, msym = sec->objfile->msymbols; | 1108 ALL_OBJFILE_MSYMBOLS (sec->objfile, msym) |
| 1111 » i < sec->objfile->minimal_symbol_count; | |
| 1112 » i++, msym++) | |
| 1113 { | 1109 { |
| 1114 u = find_unwind_entry (SYMBOL_VALUE_ADDRESS (msym)); | 1110 u = find_unwind_entry (SYMBOL_VALUE_ADDRESS (msym)); |
| 1115 if (func != SYMBOL_VALUE_ADDRESS (msym) | 1111 if (func != SYMBOL_VALUE_ADDRESS (msym) |
| 1116 && (!u || u->stub_unwind.stub_type == 0)) | 1112 && (!u || u->stub_unwind.stub_type == 0)) |
| 1117 return SYMBOL_VALUE_ADDRESS (msym); | 1113 return SYMBOL_VALUE_ADDRESS (msym); |
| 1118 } | 1114 } |
| 1119 } | 1115 } |
| 1120 | 1116 |
| 1121 warning (_("Cannot find suitable address to place dummy breakpoint; nested " | 1117 warning (_("Cannot find suitable address to place dummy breakpoint; nested " |
| 1122 "calls may fail.")); | 1118 "calls may fail.")); |
| (...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1581 hppa_hpux_core_osabi_sniffer); | 1577 hppa_hpux_core_osabi_sniffer); |
| 1582 gdbarch_register_osabi_sniffer (bfd_arch_hppa, | 1578 gdbarch_register_osabi_sniffer (bfd_arch_hppa, |
| 1583 bfd_target_elf_flavour, | 1579 bfd_target_elf_flavour, |
| 1584 hppa_hpux_core_osabi_sniffer); | 1580 hppa_hpux_core_osabi_sniffer); |
| 1585 | 1581 |
| 1586 gdbarch_register_osabi (bfd_arch_hppa, 0, GDB_OSABI_HPUX_SOM, | 1582 gdbarch_register_osabi (bfd_arch_hppa, 0, GDB_OSABI_HPUX_SOM, |
| 1587 hppa_hpux_som_init_abi); | 1583 hppa_hpux_som_init_abi); |
| 1588 gdbarch_register_osabi (bfd_arch_hppa, bfd_mach_hppa20w, GDB_OSABI_HPUX_ELF, | 1584 gdbarch_register_osabi (bfd_arch_hppa, bfd_mach_hppa20w, GDB_OSABI_HPUX_ELF, |
| 1589 hppa_hpux_elf_init_abi); | 1585 hppa_hpux_elf_init_abi); |
| 1590 } | 1586 } |
| OLD | NEW |