Error Buddy
Do you have an error message from your application? Then find the answer with Error Buddy. You can search over 40000 source code files and troubleshooting documents using our beta lucene/nutch search interface or if you prefer, search as normal using google. With LXR technology you can drill right down into the line of source code where it came from with full cross-referencing.
If after searching you didn't get your ideal answer, or you are still unclear what the error means, you can choose to post that question to the community forums following the link included in the search results.
[1.6]001 /* ARC target-dependent stuff. Extension structure access functions 002 Copyright 1995, 1997, 2000, 2001 Free Software Foundation, Inc. 003 004 This file is part of GDB. 005 006 This program is free software; you can redistribute it and/or modify 007 it under the terms of the GNU General Public License as published by 008 the Free Software Foundation; either version 2 of the License, or 009 (at your option) any later version. 010 011 This program is distributed in the hope that it will be useful, 012 but WITHOUT ANY WARRANTY; without even the implied warranty of 013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 014 GNU General Public License for more details. 015 016 You should have received a copy of the GNU General Public License 017 along with this program; if not, write to the Free Software 018 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 019 020 #include "sysdep.h" 021 #include <stdlib.h> 022 #include <stdio.h> 023 #include "bfd.h" 024 #include "arc-ext.h" 025 #include "libiberty.h" 026 027 /* Extension structure */ 028 static struct arcExtMap arc_extension_map; 029 030 /* Get the name of an extension instruction. */ 031 032 const char * 033 arcExtMap_instName(int opcode, int minor, int *flags) 034 { 035 if (opcode == 3) 036 { 037 /* FIXME: ??? need to also check 0/1/2 in bit0 for (3f) brk/sleep/swi */ 038 if (minor < 0x09 || minor == 0x3f) 039 return 0; 040 else 041 opcode = 0x1f - 0x10 + minor - 0x09 + 1; 042 } 043 else 044 if (opcode < 0x10) 045 return 0; 046 else 047 opcode -= 0x10; 048 if (!arc_extension_map.instructions[opcode]) 049 return 0; 050 *flags = arc_extension_map.instructions[opcode]->flags; 051 return arc_extension_map.instructions[opcode]->name; 052 } 053 054 /* Get the name of an extension core register. */ 055 056 const char * 057 arcExtMap_coreRegName(int value) 058 { 059 if (value < 32) 060 return 0; 061 return (const char *) arc_extension_map.coreRegisters[value-32]; 062 } 063 064 /* Get the name of an extension condition code. */ 065 066 const char * 067 arcExtMap_condCodeName(int value) 068 { 069 if (value < 16) 070 return 0; 071 return (const char *) arc_extension_map.condCodes[value-16]; 072 } 073 074 /* Get the name of an extension aux register. */ 075 076 const char * 077 arcExtMap_auxRegName(long address) 078 { 079 /* walk the list of aux reg names and find the name */ 080 struct ExtAuxRegister *r; 081 082 for (r = arc_extension_map.auxRegisters; r; r = r->next) { 083 if (r->address == address) 084 return (const char *) r->name; 085 } 086 return 0; 087 } 088 089 /* Recursively free auxilliary register strcture pointers until 090 the list is empty. */ 091 092 static void 093 clean_aux_registers(struct ExtAuxRegister *r) 094 { 095 if (r -> next) 096 { 097 clean_aux_registers( r->next); 098 free(r -> name); 099 free(r -> next); 100 r ->next = NULL; 101 } 102 else 103 free(r -> name); 104 } 105 106 /* Free memory that has been allocated for the extensions. */ 107 108 static void 109 cleanup_ext_map(void) 110 { 111 struct ExtAuxRegister *r; 112 struct ExtInstruction *insn; 113 int i; 114 115 /* clean aux reg structure */ 116 r = arc_extension_map.auxRegisters; 117 if (r) 118 { 119 (clean_aux_registers(r)); 120 free(r); 121 } 122 123 /* clean instructions */ 124 for (i = 0; i < NUM_EXT_INST; i++) 125 { 126 insn = arc_extension_map.instructions[i]; 127 if (insn) 128 free(insn->name); 129 } 130 131 /* clean core reg struct */ 132 for (i = 0; i < NUM_EXT_CORE; i++) 133 { 134 if (arc_extension_map.coreRegisters[i]) 135 free(arc_extension_map.coreRegisters[i]); 136 } 137 138 for (i = 0; i < NUM_EXT_COND; i++) { 139 if (arc_extension_map.condCodes[i]) 140 free(arc_extension_map.condCodes[i]); 141 } 142 143 memset(&arc_extension_map, 0, sizeof(struct arcExtMap)); 144 } 145 146 int 147 arcExtMap_add(void *base, unsigned long length) 148 { 149 unsigned char *block = base; 150 unsigned char *p = block; 151 152 /* Clean up and reset everything if needed. */ 153 cleanup_ext_map(); 154 155 while (p && p < (block + length)) 156 { 157 /* p[0] == length of record 158 p[1] == type of record 159 For instructions: 160 p[2] = opcode 161 p[3] = minor opcode (if opcode == 3) 162 p[4] = flags 163 p[5]+ = name 164 For core regs and condition codes: 165 p[2] = value 166 p[3]+ = name 167 For aux regs: 168 p[2..5] = value 169 p[6]+ = name 170 (value is p[2]<<24|p[3]<<16|p[4]<<8|p[5]) */ 171 172 if (p[0] == 0) 173 return -1; 174 175 switch (p[1]) 176 { 177 case EXT_INSTRUCTION: 178 { 179 char opcode = p[2]; 180 char minor = p[3]; 181 char * insn_name = (char *) xmalloc(( (int)*p-5) * sizeof(char)); 182 struct ExtInstruction * insn = 183 (struct ExtInstruction *) xmalloc(sizeof(struct ExtInstruction)); 184 185 if (opcode==3) 186 opcode = 0x1f - 0x10 + minor - 0x09 + 1; 187 else 188 opcode -= 0x10; 189 insn -> flags = (char) *(p+4); 190 strcpy(insn_name, (p+5)); 191 insn -> name = insn_name; 192 arc_extension_map.instructions[(int) opcode] = insn; 193 } 194 break; 195 196 case EXT_CORE_REGISTER: 197 { 198 char * core_name = (char *) xmalloc(((int)*p-3) * sizeof(char)); 199 200 strcpy(core_name, (p+3)); 201 arc_extension_map.coreRegisters[p[2]-32] = core_name; 202 } 203 break; 204 205 case EXT_COND_CODE: 206 { 207 char * cc_name = (char *) xmalloc( ((int)*p-3) * sizeof(char)); 208 strcpy(cc_name, (p+3)); 209 arc_extension_map.condCodes[p[2]-16] = cc_name; 210 } 211 break; 212 213 case EXT_AUX_REGISTER: 214 { 215 /* trickier -- need to store linked list to these */ 216 struct ExtAuxRegister *newAuxRegister = 217 (struct ExtAuxRegister *)malloc(sizeof(struct ExtAuxRegister)); 218 char * aux_name = (char *) xmalloc ( ((int)*p-6) * sizeof(char)); 219 220 strcpy (aux_name, (p+6)); 221 newAuxRegister->name = aux_name; 222 newAuxRegister->address = p[2]<<24 | p[3]<<16 | p[4]<<8 | p[5]; 223 newAuxRegister->next = arc_extension_map.auxRegisters; 224 arc_extension_map.auxRegisters = newAuxRegister; 225 } 226 break; 227 228 default: 229 return -1; 230 231 } 232 p += p[0]; /* move to next record */ 233 } 234 235 return 0; 236 } 237 238 /* Load hw extension descibed in .extArcMap ELF section. */ 239 240 void 241 build_ARC_extmap (text_bfd) 242 bfd *text_bfd; 243 { 244 char *arcExtMap; 245 bfd_size_type count; 246 asection *p; 247 248 for (p = text_bfd->sections; p != NULL; p = p->next) 249 if (!strcmp (p->name, ".arcextmap")) 250 { 251 count = p->_raw_size; 252 arcExtMap = (char *) xmalloc (count); 253 if (bfd_get_section_contents (text_bfd, p, (PTR) arcExtMap, 0, count)) 254 { 255 arcExtMap_add ((PTR) arcExtMap, count); 256 break; 257 } 258 free ((PTR) arcExtMap); 259 } 260 }
Testing
