Change the stream argument to _filtered to GDB_FILE *.
[deliverable/binutils-gdb.git] / gdb / partial-stab.h
CommitLineData
7e258d18 1/* Shared code to pre-read a stab (dbx-style), when building a psymtab.
65ce5df4
JG
2 Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993
3 Free Software Foundation, Inc.
7e258d18
PB
4
5This file is part of GDB.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
19Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
20
21/* The following need to be defined:
22 SET_NAMESTRING() --Set namestring to name of symbol.
23 CUR_SYMBOL_TYPE --Type code of current symbol.
24 CUR_SYMBOL_VALUE --Value field of current symbol. May be adjusted here.
25 */
26
7e258d18
PB
27/* End of macro definitions, now let's handle them symbols! */
28
29 switch (CUR_SYMBOL_TYPE)
30 {
31 char *p;
32 /*
33 * Standard, external, non-debugger, symbols
34 */
35
7e258d18
PB
36 case N_TEXT | N_EXT:
37 case N_NBTEXT | N_EXT:
2670f34d
JG
38 CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT);
39 goto record_it;
40
41 case N_DATA | N_EXT:
7e258d18 42 case N_NBDATA | N_EXT:
2670f34d
JG
43 CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
44 goto record_it;
45
164207ca 46 case N_BSS:
2670f34d 47 case N_BSS | N_EXT:
7e258d18 48 case N_NBBSS | N_EXT:
2670f34d
JG
49 case N_SETV | N_EXT: /* FIXME, is this in BSS? */
50 CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_BSS);
51 goto record_it;
52
7e258d18 53 case N_ABS | N_EXT:
2670f34d 54 record_it:
aab77d5f 55#ifdef DBXREAD_ONLY
7e258d18
PB
56 SET_NAMESTRING();
57
58 bss_ext_symbol:
1ab3bf1b
JG
59 record_minimal_symbol (namestring, CUR_SYMBOL_VALUE,
60 CUR_SYMBOL_TYPE, objfile); /* Always */
aab77d5f 61#endif /* DBXREAD_ONLY */
7e258d18
PB
62 continue;
63
64 /* Standard, local, non-debugger, symbols */
65
66 case N_NBTEXT:
67
68 /* We need to be able to deal with both N_FN or N_TEXT,
69 because we have no way of knowing whether the sys-supplied ld
70 or GNU ld was used to make the executable. Sequents throw
71 in another wrinkle -- they renumbered N_FN. */
72
73 case N_FN:
74 case N_FN_SEQ:
75 case N_TEXT:
aab77d5f 76#ifdef DBXREAD_ONLY
2670f34d 77 CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT);
7e258d18
PB
78 SET_NAMESTRING();
79 if ((namestring[0] == '-' && namestring[1] == 'l')
80 || (namestring [(nsl = strlen (namestring)) - 1] == 'o'
7da1e27d 81 && namestring [nsl - 2] == '.')
e0ba1d14 82#ifdef GDB_TARGET_IS_HPPA
7da1e27d 83 /* some cooperation from gcc to get around ld stupidity */
2e4964ad 84 || (namestring[0] == 'e' && STREQ (namestring, "end_file."))
7da1e27d
SG
85#endif
86 )
7e258d18 87 {
e0ba1d14 88#ifndef GDB_TARGET_IS_HPPA
5e2e79f8 89 if (objfile -> ei.entry_point < CUR_SYMBOL_VALUE &&
2670f34d 90 objfile -> ei.entry_point >= last_o_file_start)
7e258d18 91 {
5e2e79f8
FF
92 objfile -> ei.entry_file_lowpc = last_o_file_start;
93 objfile -> ei.entry_file_highpc = CUR_SYMBOL_VALUE;
7e258d18 94 }
7da1e27d 95#endif
7e258d18
PB
96 if (past_first_source_file && pst
97 /* The gould NP1 uses low values for .o and -l symbols
98 which are not the address. */
369172bb 99 && CUR_SYMBOL_VALUE >= pst->textlow)
7e258d18
PB
100 {
101 END_PSYMTAB (pst, psymtab_include_list, includes_used,
102 symnum * symbol_size, CUR_SYMBOL_VALUE,
103 dependency_list, dependencies_used);
104 pst = (struct partial_symtab *) 0;
105 includes_used = 0;
106 dependencies_used = 0;
107 }
108 else
109 past_first_source_file = 1;
110 last_o_file_start = CUR_SYMBOL_VALUE;
111 }
164207ca
JK
112 else
113 goto record_it;
aab77d5f 114#endif /* DBXREAD_ONLY */
7e258d18
PB
115 continue;
116
117 case N_DATA:
2670f34d 118 CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
164207ca 119 goto record_it;
7e258d18
PB
120
121 case N_UNDF | N_EXT:
aab77d5f 122#ifdef DBXREAD_ONLY
7e258d18
PB
123 if (CUR_SYMBOL_VALUE != 0) {
124 /* This is a "Fortran COMMON" symbol. See if the target
125 environment knows where it has been relocated to. */
126
127 CORE_ADDR reladdr;
128
129 SET_NAMESTRING();
130 if (target_lookup_symbol (namestring, &reladdr)) {
131 continue; /* Error in lookup; ignore symbol for now. */
132 }
133 CUR_SYMBOL_TYPE ^= (N_BSS^N_UNDF); /* Define it as a bss-symbol */
134 CUR_SYMBOL_VALUE = reladdr;
135 goto bss_ext_symbol;
136 }
aab77d5f 137#endif /* DBXREAD_ONLY */
7e258d18 138 continue; /* Just undefined, not COMMON */
7e258d18 139
9342ecb9
JG
140 case N_UNDF:
141#ifdef DBXREAD_ONLY
142 if (processing_acc_compilation && bufp->n_strx == 1) {
bcbf9559
JG
143 /* Deal with relative offsets in the string table
144 used in ELF+STAB under Solaris. If we want to use the
145 n_strx field, which contains the name of the file,
146 we must adjust file_string_table_offset *before* calling
147 SET_NAMESTRING(). */
9342ecb9
JG
148 past_first_source_file = 1;
149 file_string_table_offset = next_file_string_table_offset;
150 next_file_string_table_offset =
151 file_string_table_offset + bufp->n_value;
152 if (next_file_string_table_offset < file_string_table_offset)
153 error ("string table offset backs up at %d", symnum);
154 /* FIXME -- replace error() with complaint. */
155 continue;
156 }
157#endif /* DBXREAD_ONLY */
158 continue;
159
7e258d18
PB
160 /* Lots of symbol types we can just ignore. */
161
7e258d18 162 case N_ABS:
7e258d18
PB
163 case N_NBDATA:
164 case N_NBBSS:
165 continue;
166
167 /* Keep going . . .*/
168
169 /*
170 * Special symbol types for GNU
171 */
172 case N_INDR:
173 case N_INDR | N_EXT:
174 case N_SETA:
175 case N_SETA | N_EXT:
176 case N_SETT:
177 case N_SETT | N_EXT:
178 case N_SETD:
179 case N_SETD | N_EXT:
180 case N_SETB:
181 case N_SETB | N_EXT:
182 case N_SETV:
183 continue;
184
185 /*
186 * Debugger symbols
187 */
188
189 case N_SO: {
fc39be58 190 unsigned long valu;
cdaa27e9
SG
191 static int prev_so_symnum = -10;
192 static int first_so_symnum;
c72af089 193 char *p;
fc39be58
JK
194
195 valu = CUR_SYMBOL_VALUE + ANOFFSET (section_offsets, SECT_OFF_TEXT);
196
cdaa27e9
SG
197 past_first_source_file = 1;
198
199 if (prev_so_symnum != symnum - 1)
200 { /* Here if prev stab wasn't N_SO */
201 first_so_symnum = symnum;
202
203 if (pst)
204 {
205 END_PSYMTAB (pst, psymtab_include_list, includes_used,
206 symnum * symbol_size, valu,
207 dependency_list, dependencies_used);
208 pst = (struct partial_symtab *) 0;
209 includes_used = 0;
210 dependencies_used = 0;
211 }
212 }
213
214 prev_so_symnum = symnum;
215
7e258d18
PB
216 /* End the current partial symtab and start a new one */
217
218 SET_NAMESTRING();
219
c72af089
SG
220 /* Some compilers (including gcc) emit a pair of initial N_SOs.
221 The first one is a directory name; the second the file name.
222 If pst exists, is empty, and has a filename ending in '/',
223 we assume the previous N_SO was a directory name. */
224
323227fe 225 p = strrchr (namestring, '/');
c72af089 226 if (p && *(p+1) == '\000')
cdaa27e9 227 continue; /* Simply ignore directory name SOs */
c72af089
SG
228
229 /* Some other compilers (C++ ones in particular) emit useless
cdaa27e9
SG
230 SOs for non-existant .c files. We ignore all subsequent SOs that
231 immediately follow the first. */
232
233 if (!pst)
234 pst = START_PSYMTAB (objfile, section_offsets,
235 namestring, valu,
236 first_so_symnum * symbol_size,
237 objfile -> global_psymbols.next,
238 objfile -> static_psymbols.next);
7e258d18
PB
239 continue;
240 }
241
7e258d18 242 case N_BINCL:
aab77d5f 243#ifdef DBXREAD_ONLY
7e258d18
PB
244 /* Add this bincl to the bincl_list for future EXCLs. No
245 need to save the string; it'll be around until
246 read_dbx_symtab function returns */
247
248 SET_NAMESTRING();
249
250 add_bincl_to_list (pst, namestring, CUR_SYMBOL_VALUE);
251
252 /* Mark down an include file in the current psymtab */
253
8a1c3e99 254 goto record_include_file;
7e258d18 255
8a1c3e99 256#else /* DBXREAD_ONLY */
7e258d18 257 continue;
8a1c3e99 258#endif
7e258d18
PB
259
260 case N_SOL:
261 /* Mark down an include file in the current psymtab */
262
263 SET_NAMESTRING();
264
265 /* In C++, one may expect the same filename to come round many
266 times, when code is coming alternately from the main file
267 and from inline functions in other files. So I check to see
268 if this is a file we've seen before -- either the main
269 source file, or a previously included file.
270
271 This seems to be a lot of time to be spending on N_SOL, but
272 things like "break c-exp.y:435" need to work (I
273 suppose the psymtab_include_list could be hashed or put
274 in a binary tree, if profiling shows this is a major hog). */
2e4964ad 275 if (pst && STREQ (namestring, pst->filename))
7e258d18
PB
276 continue;
277 {
278 register int i;
279 for (i = 0; i < includes_used; i++)
2e4964ad 280 if (STREQ (namestring, psymtab_include_list[i]))
7e258d18
PB
281 {
282 i = -1;
283 break;
284 }
285 if (i == -1)
286 continue;
287 }
288
996ccb30 289#ifdef DBXREAD_ONLY
8a1c3e99 290 record_include_file:
996ccb30 291#endif
8a1c3e99 292
7e258d18
PB
293 psymtab_include_list[includes_used++] = namestring;
294 if (includes_used >= includes_allocated)
295 {
296 char **orig = psymtab_include_list;
297
298 psymtab_include_list = (char **)
299 alloca ((includes_allocated *= 2) *
300 sizeof (char *));
be772100
JG
301 memcpy ((PTR)psymtab_include_list, (PTR)orig,
302 includes_used * sizeof (char *));
7e258d18
PB
303 }
304 continue;
aab77d5f 305
7e258d18
PB
306 case N_LSYM: /* Typedef or automatic variable. */
307 case N_STSYM: /* Data seg var -- static */
308 case N_LCSYM: /* BSS " */
2670f34d 309 case N_ROSYM: /* Read-only data seg var -- static. */
7e258d18
PB
310 case N_NBSTS: /* Gould nobase. */
311 case N_NBLCS: /* symbols. */
4ae030b9
JK
312 case N_FUN:
313 case N_GSYM: /* Global (extern) variable; can be
314 data or bss (sigh FIXME). */
315
316 /* Following may probably be ignored; I'll leave them here
317 for now (until I do Pascal and Modula 2 extensions). */
318
319 case N_PC: /* I may or may not need this; I
320 suspect not. */
321 case N_M2C: /* I suspect that I can ignore this here. */
322 case N_SCOPE: /* Same. */
7e258d18
PB
323
324 SET_NAMESTRING();
325
326 p = (char *) strchr (namestring, ':');
4ae030b9
JK
327 if (!p)
328 continue; /* Not a debugging symbol. */
7e258d18 329
4ae030b9
JK
330
331
332 /* Main processing section for debugging symbols which
333 the initial read through the symbol tables needs to worry
334 about. If we reach this point, the symbol which we are
335 considering is definitely one we are interested in.
336 p must also contain the (valid) index into the namestring
337 which indicates the debugging type symbol. */
7e258d18
PB
338
339 switch (p[1])
340 {
4ae030b9
JK
341 case 'S':
342 CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
343 ADD_PSYMBOL_ADDR_TO_LIST (namestring, p - namestring,
344 VAR_NAMESPACE, LOC_STATIC,
345 objfile->static_psymbols,
346 CUR_SYMBOL_VALUE,
347 psymtab_language, objfile);
348 continue;
349 case 'G':
350 CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
351 /* The addresses in these entries are reported to be
352 wrong. See the code that reads 'G's for symtabs. */
353 ADD_PSYMBOL_ADDR_TO_LIST (namestring, p - namestring,
354 VAR_NAMESPACE, LOC_STATIC,
355 objfile->global_psymbols,
356 CUR_SYMBOL_VALUE,
357 psymtab_language, objfile);
358 continue;
359
7e258d18 360 case 'T':
bcbf9559 361 if (p != namestring) /* a name is there, not just :T... */
7e258d18 362 {
7e258d18 363 ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
bcbf9559 364 STRUCT_NAMESPACE, LOC_TYPEDEF,
2e4964ad
FF
365 objfile->static_psymbols,
366 CUR_SYMBOL_VALUE,
367 psymtab_language, objfile);
bcbf9559
JG
368 if (p[2] == 't')
369 {
370 /* Also a typedef with the same name. */
371 ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
372 VAR_NAMESPACE, LOC_TYPEDEF,
2e4964ad
FF
373 objfile->static_psymbols,
374 CUR_SYMBOL_VALUE, psymtab_language,
375 objfile);
bcbf9559
JG
376 p += 1;
377 }
7e258d18
PB
378 }
379 goto check_enum;
380 case 't':
bcbf9559
JG
381 if (p != namestring) /* a name is there, not just :T... */
382 {
383 ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
384 VAR_NAMESPACE, LOC_TYPEDEF,
2e4964ad
FF
385 objfile->static_psymbols,
386 CUR_SYMBOL_VALUE,
387 psymtab_language, objfile);
bcbf9559 388 }
7e258d18 389 check_enum:
7e258d18
PB
390 /* If this is an enumerated type, we need to
391 add all the enum constants to the partial symbol
392 table. This does not cover enums without names, e.g.
393 "enum {a, b} c;" in C, but fortunately those are
394 rare. There is no way for GDB to find those from the
395 enum type without spending too much time on it. Thus
4ae030b9
JK
396 to solve this problem, the compiler needs to put out the
397 enum in a nameless type. GCC2 does this. */
7e258d18
PB
398
399 /* We are looking for something of the form
400 <name> ":" ("t" | "T") [<number> "="] "e"
401 {<constant> ":" <value> ","} ";". */
402
403 /* Skip over the colon and the 't' or 'T'. */
404 p += 2;
405 /* This type may be given a number. Also, numbers can come
406 in pairs like (0,26). Skip over it. */
407 while ((*p >= '0' && *p <= '9')
408 || *p == '(' || *p == ',' || *p == ')'
409 || *p == '=')
410 p++;
411
412 if (*p++ == 'e')
413 {
414 /* We have found an enumerated type. */
415 /* According to comments in read_enum_type
416 a comma could end it instead of a semicolon.
417 I don't know where that happens.
418 Accept either. */
419 while (*p && *p != ';' && *p != ',')
420 {
421 char *q;
422
423 /* Check for and handle cretinous dbx symbol name
424 continuation! */
425 if (*p == '\\')
426 p = next_symbol_text ();
427
428 /* Point to the character after the name
429 of the enum constant. */
430 for (q = p; *q && *q != ':'; q++)
431 ;
432 /* Note that the value doesn't matter for
433 enum constants in psymtabs, just in symtabs. */
434 ADD_PSYMBOL_TO_LIST (p, q - p,
435 VAR_NAMESPACE, LOC_CONST,
2e4964ad
FF
436 objfile->static_psymbols, 0,
437 psymtab_language, objfile);
7e258d18
PB
438 /* Point past the name. */
439 p = q;
440 /* Skip over the value. */
441 while (*p && *p != ',')
442 p++;
443 /* Advance past the comma. */
444 if (*p)
445 p++;
446 }
447 }
7e258d18
PB
448 continue;
449 case 'c':
450 /* Constant, e.g. from "const" in Pascal. */
451 ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
452 VAR_NAMESPACE, LOC_CONST,
2e4964ad
FF
453 objfile->static_psymbols, CUR_SYMBOL_VALUE,
454 psymtab_language, objfile);
7e258d18 455 continue;
7e258d18
PB
456
457 case 'f':
9342ecb9
JG
458#ifdef DBXREAD_ONLY
459 /* Kludges for ELF/STABS with Sun ACC */
460 last_function_name = namestring;
fef84cc4 461 if (pst && pst->textlow == 0)
9342ecb9
JG
462 pst->textlow = CUR_SYMBOL_VALUE;
463#if 0
464 if (startup_file_end == 0)
465 startup_file_end = CUR_SYMBOL_VALUE;
466#endif
467 /* End kludge. */
468#endif /* DBXREAD_ONLY */
7e258d18
PB
469 ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
470 VAR_NAMESPACE, LOC_BLOCK,
2e4964ad
FF
471 objfile->static_psymbols, CUR_SYMBOL_VALUE,
472 psymtab_language, objfile);
7e258d18
PB
473 continue;
474
475 /* Global functions were ignored here, but now they
476 are put into the global psymtab like one would expect.
65ce5df4 477 They're also in the minimal symbol table. */
7e258d18 478 case 'F':
9342ecb9
JG
479#ifdef DBXREAD_ONLY
480 /* Kludges for ELF/STABS with Sun ACC */
481 last_function_name = namestring;
fef84cc4 482 if (pst && pst->textlow == 0)
9342ecb9
JG
483 pst->textlow = CUR_SYMBOL_VALUE;
484#if 0
485 if (startup_file_end == 0)
486 startup_file_end = CUR_SYMBOL_VALUE;
487#endif
488 /* End kludge. */
489#endif /* DBXREAD_ONLY */
7e258d18
PB
490 ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
491 VAR_NAMESPACE, LOC_BLOCK,
2e4964ad
FF
492 objfile->global_psymbols, CUR_SYMBOL_VALUE,
493 psymtab_language, objfile);
7e258d18
PB
494 continue;
495
496 /* Two things show up here (hopefully); static symbols of
497 local scope (static used inside braces) or extensions
498 of structure symbols. We can ignore both. */
499 case 'V':
500 case '(':
501 case '0':
502 case '1':
503 case '2':
504 case '3':
505 case '4':
506 case '5':
507 case '6':
508 case '7':
509 case '8':
510 case '9':
511 continue;
512
513 default:
514 /* Unexpected symbol. Ignore it; perhaps it is an extension
515 that we don't know about.
516
517 Someone says sun cc puts out symbols like
518 /foo/baz/maclib::/usr/local/bin/maclib,
519 which would get here with a symbol type of ':'. */
65ce5df4 520 complain (&unknown_symchar_complaint, p[1]);
7e258d18
PB
521 continue;
522 }
523
7e258d18 524 case N_EXCL:
aab77d5f 525#ifdef DBXREAD_ONLY
7e258d18
PB
526
527 SET_NAMESTRING();
528
529 /* Find the corresponding bincl and mark that psymtab on the
530 psymtab dependency list */
531 {
532 struct partial_symtab *needed_pst =
533 find_corresponding_bincl_psymtab (namestring, CUR_SYMBOL_VALUE);
534
535 /* If this include file was defined earlier in this file,
536 leave it alone. */
537 if (needed_pst == pst) continue;
538
539 if (needed_pst)
540 {
541 int i;
542 int found = 0;
543
544 for (i = 0; i < dependencies_used; i++)
545 if (dependency_list[i] == needed_pst)
546 {
547 found = 1;
548 break;
549 }
550
551 /* If it's already in the list, skip the rest. */
552 if (found) continue;
553
554 dependency_list[dependencies_used++] = needed_pst;
555 if (dependencies_used >= dependencies_allocated)
556 {
557 struct partial_symtab **orig = dependency_list;
558 dependency_list =
559 (struct partial_symtab **)
560 alloca ((dependencies_allocated *= 2)
561 * sizeof (struct partial_symtab *));
be772100 562 memcpy ((PTR)dependency_list, (PTR)orig,
7e258d18
PB
563 (dependencies_used
564 * sizeof (struct partial_symtab *)));
565#ifdef DEBUG_INFO
199b2450
TL
566 fprintf_unfiltered (gdb_stderr, "Had to reallocate dependency list.\n");
567 fprintf_unfiltered (gdb_stderr, "New dependencies allocated: %d\n",
7e258d18
PB
568 dependencies_allocated);
569#endif
570 }
571 }
572 else
573 error ("Invalid symbol data: \"repeated\" header file not previously seen, at symtab pos %d.",
574 symnum);
575 }
aab77d5f 576#endif /* DBXREAD_ONLY */
7e258d18 577 continue;
7e258d18
PB
578
579 case N_RBRAC:
580#ifdef HANDLE_RBRAC
581 HANDLE_RBRAC(CUR_SYMBOL_VALUE);
aab77d5f 582 continue;
7e258d18
PB
583#endif
584 case N_EINCL:
585 case N_DSLINE:
586 case N_BSLINE:
587 case N_SSYM: /* Claim: Structure or union element.
588 Hopefully, I can ignore this. */
589 case N_ENTRY: /* Alternate entry point; can ignore. */
590 case N_MAIN: /* Can definitely ignore this. */
591 case N_CATCH: /* These are GNU C++ extensions */
592 case N_EHDECL: /* that can safely be ignored here. */
593 case N_LENG:
594 case N_BCOMM:
595 case N_ECOMM:
596 case N_ECOML:
597 case N_FNAME:
598 case N_SLINE:
599 case N_RSYM:
600 case N_PSYM:
601 case N_LBRAC:
602 case N_NSYMS: /* Ultrix 4.0: symbol count */
603 case N_DEFD: /* GNU Modula-2 */
9342ecb9 604
4c7c6bab 605 case N_OBJ: /* useless types from Solaris */
9342ecb9 606 case N_OPT:
4c7c6bab 607 case N_ENDM:
7e258d18
PB
608 /* These symbols aren't interesting; don't worry about them */
609
610 continue;
611
612 default:
7e258d18
PB
613 /* If we haven't found it yet, ignore it. It's probably some
614 new type we don't know about yet. */
51b80b00 615 complain (&unknown_symtype_complaint,
5573d7d4 616 local_hex_string ((unsigned long) CUR_SYMBOL_TYPE));
7e258d18
PB
617 continue;
618 }
This page took 0.202427 seconds and 4 git commands to generate.