Rearranged PAINT_RedrawWindow() so that it first recursively updates
[wine] / debugger / msc.c
1 /*
2  * File msc.c - read VC++ debug information from COFF and eventually
3  * from PDB files.
4  *
5  * Copyright (C) 1996, Eric Youngdale.
6  *
7  * Note - this handles reading debug information for 32 bit applications
8  * that run under Windows-NT for example.  I doubt that this would work well
9  * for 16 bit applications, but I don't think it really matters since the
10  * file format is different, and we should never get in here in such cases.
11  *
12  * TODO:
13  *      Get 16 bit CV stuff working.
14  *      Add symbol size to internal symbol table.
15  */
16
17 #include "config.h"
18 #include <stdio.h>
19 #include <stdlib.h>
20
21 #include <sys/types.h>
22 #include <sys/mman.h>
23 #include <fcntl.h>
24 #include <sys/stat.h>
25 #include <limits.h>
26 #include <string.h>
27 #include <unistd.h>
28 #ifndef PATH_MAX
29 #define PATH_MAX _MAX_PATH
30 #endif
31 #include "debugger.h"
32 #include "neexe.h"
33 #include "peexe.h"
34 #include "file.h"
35
36 /*
37     *dbg_filename must be at least MAX_PATHNAME_LEN bytes in size
38 */
39 static void LocateDebugInfoFile(char *filename, char *dbg_filename)
40 {
41     char          *str1 = DBG_alloc(MAX_PATHNAME_LEN*10);
42     char          *str2 = DBG_alloc(MAX_PATHNAME_LEN);
43     char          *file;
44     char          *name_part;
45     DOS_FULL_NAME fullname;
46     
47     file = strrchr(filename, '\\');
48     if( file == NULL ) file = filename; else file++;
49
50     if (GetEnvironmentVariableA("_NT_SYMBOL_PATH", str1, MAX_PATHNAME_LEN))
51         if (SearchPathA(str1, file, NULL, MAX_PATHNAME_LEN*10, str2, &name_part))
52             goto ok;
53     if (GetEnvironmentVariableA("_NT_ALT_SYMBOL_PATH", str1, MAX_PATHNAME_LEN))
54         if (SearchPathA(str1, file, NULL, MAX_PATHNAME_LEN*10, str2, &name_part))
55             goto ok;
56     if (SearchPathA(NULL, file, NULL, MAX_PATHNAME_LEN*10, str2, &name_part))
57         goto ok;
58     else
59     {
60 quit:   
61         memcpy(dbg_filename, filename, MAX_PATHNAME_LEN);
62         DBG_free(str1);
63         DBG_free(str2);
64         return;
65     }
66 ok:
67     if (DOSFS_GetFullName(str2, TRUE, &fullname))
68         memcpy(dbg_filename, fullname.long_name, MAX_PATHNAME_LEN);
69     else
70         goto quit;
71     DBG_free(str1);
72     DBG_free(str2);
73     return;
74 }
75 /*
76  * This is an index we use to keep track of the debug information
77  * when we have multiple sources.  We use the same database to also
78  * allow us to do an 'info shared' type of deal, and we use the index
79  * to eliminate duplicates.
80  */
81 static int DEBUG_next_index = 0;
82
83 union any_size
84 {
85   char           * c;
86   short          * s;
87   int            * i;
88   unsigned int   * ui;
89 };
90
91 /*
92  * This is a convenience structure used to map portions of the
93  * line number table.
94  */
95 struct startend
96 {
97   unsigned int    start;
98   unsigned int    end;
99 };
100
101 /*
102  * This is how we reference the various record types.
103  */
104 union codeview_symbol
105 {
106   struct
107   {
108     short int   len;
109     short int   id;
110   } generic;
111
112   struct
113   {
114         short int       len;
115         short int       id;
116         unsigned int    offset;
117         unsigned short  seg;
118         unsigned short  symtype;
119         unsigned char   namelen;
120         unsigned char   name[1];
121   } data;
122
123   struct
124   {
125         short int       len;
126         short int       id;
127         unsigned int    pparent;
128         unsigned int    pend;
129         unsigned int    next;
130         unsigned int    offset;
131         unsigned short  segment;
132         unsigned short  thunk_len;
133         unsigned char   thtype;
134         unsigned char   namelen;
135         unsigned char   name[1];
136   } thunk;
137   struct
138   {
139         short int       len;
140         short int       id;
141         unsigned int    pparent;
142         unsigned int    pend;
143         unsigned int    next;
144         unsigned int    proc_len;
145         unsigned int    debug_start;
146         unsigned int    debug_end;
147         unsigned int    offset;
148         unsigned short  segment;
149         unsigned short  proctype;
150         unsigned char   flags;
151         unsigned char   namelen;
152         unsigned char   name[1];
153   } proc;
154   struct
155   {
156         short int       len;    /* Total length of this entry */
157         short int       id;             /* Always S_BPREL32 */
158         unsigned int    offset; /* Stack offset relative to BP */
159         unsigned short  symtype;
160         unsigned char   namelen;
161         unsigned char   name[1];
162   } stack;
163 };
164
165 union codeview_type
166 {
167   struct
168   {
169     short int   len;
170     short int   id;
171   } generic;
172
173   struct
174   {
175     short int           len;
176     short int           id;
177     short int           attribute;
178     short int           datatype;
179     unsigned char       variant[1];
180   } pointer;
181
182   struct
183   {
184     short int           len;
185     short int           id;
186     unsigned char       nbits;
187     unsigned char       bitoff;
188     unsigned short      type;
189   } bitfield;
190
191   struct
192   {
193     short int           len;
194     short int           id;
195     short int           elemtype;
196     short int           idxtype;
197     unsigned char       arrlen;
198     unsigned char       namelen;
199     unsigned char       name[1];
200   } array;
201
202   struct
203   {
204     short int           len;
205     short int           id;
206     short int           n_element;
207     short int           fieldlist;
208     short int           property;
209     short int           derived;
210     short int           vshape;
211     unsigned short      structlen;
212     unsigned char       namelen;
213     unsigned char       name[1];
214   } structure;
215
216   struct
217   {
218     short int           len;
219     short int           id;
220     short int           count;
221     short int           field;
222     short int           property;
223     unsigned short      un_len;
224     unsigned char       namelen;
225     unsigned char       name[1];
226   } t_union;
227
228   struct
229   {
230     short int           len;
231     short int           id;
232     short int           count;
233     short int           type;
234     short int           field;
235     short int           property;
236     unsigned char       namelen;
237     unsigned char       name[1];
238   } enumeration;
239
240   struct
241   {
242     short int           id;
243     short int           attribute;
244     unsigned short int  value;
245     unsigned char       namelen;
246     unsigned char       name[1];
247   } enumerate;
248
249   struct
250   {
251     short int           id;
252     short int           type;
253     short int           attribute;
254     unsigned short int  offset;
255     unsigned char       namelen;
256     unsigned char       name[1];
257   } member;
258
259   struct
260   {
261     short int           len;
262     short int           id;
263     short int           count;
264     short int           type;
265     short int           field;
266     short int           property;
267     unsigned char       namelen;
268     unsigned char       name[1];
269   } fieldlist;
270
271 };
272
273 #define S_BPREL 0x200
274 #define S_LDATA 0x201
275 #define S_GDATA 0x202
276 #define S_PUB           0x203
277 #define S_LPROC 0x204
278 #define S_GPROC 0x205
279 #define S_THUNK 0x206
280 #define S_BLOCK 0x207
281 #define S_WITH  0x208
282 #define S_LABEL 0x209
283
284 #define S_PROCREF       0x400
285 #define S_DATAREF       0x401
286 #define S_ALIGN         0x402
287 #define S_UNKNOWN       0x403
288
289 /*
290  * This covers the basic datatypes that VC++ seems to be using these days.
291  * 32 bit mode only.  There are additional numbers for the pointers in 16
292  * bit mode.  There are many other types listed in the documents, but these
293  * are apparently not used by the compiler, or represent pointer types
294  * that are not used.
295  */
296 #define T_NOTYPE        0x0000  /* Notype */
297 #define T_ABS           0x0001  /* Abs */
298 #define T_VOID          0x0003  /* Void */
299 #define T_CHAR          0x0010  /* signed char */
300 #define T_SHORT         0x0011  /* short */
301 #define T_LONG          0x0012  /* long */
302 #define T_QUAD          0x0013  /* long long */
303 #define T_UCHAR         0x0020  /* unsigned  char */
304 #define T_USHORT        0x0021  /* unsigned short */
305 #define T_ULONG         0x0022  /* unsigned long */
306 #define T_UQUAD         0x0023  /* unsigned long long */
307 #define T_REAL32        0x0040  /* float */
308 #define T_REAL64        0x0041  /* double */
309 #define T_RCHAR         0x0070  /* real char */
310 #define T_WCHAR         0x0071  /* wide char */
311 #define T_INT4          0x0074  /* int */
312 #define T_UINT4         0x0075  /* unsigned int */
313
314 #define T_32PVOID       0x0403  /* 32 bit near pointer to void */
315 #define T_32PCHAR       0x0410  /* 16:32 near pointer to signed char */
316 #define T_32PSHORT      0x0411  /* 16:32 near pointer to short */
317 #define T_32PLONG       0x0412  /* 16:32 near pointer to int */
318 #define T_32PQUAD       0x0413  /* 16:32 near pointer to long long */
319 #define T_32PUCHAR      0x0420  /* 16:32 near pointer to unsigned char */
320 #define T_32PUSHORT     0x0421  /* 16:32 near pointer to unsigned short */
321 #define T_32PULONG      0x0422  /* 16:32 near pointer to unsigned int */
322 #define T_32PUQUAD      0x0423  /* 16:32 near pointer to long long */
323 #define T_32PREAL32     0x0440  /* 16:32 near pointer to float */
324 #define T_32PREAL64     0x0441  /* 16:32 near pointer to float */
325 #define T_32PRCHAR      0x0470  /* 16:32 near pointer to real char */
326 #define T_32PWCHAR      0x0471  /* 16:32 near pointer to real char */
327 #define T_32PINT4       0x0474  /* 16:32 near pointer to int */
328 #define T_32PUINT4      0x0475  /* 16:32 near pointer to unsigned int */
329
330 #define LF_MODIFIER     0x1
331 #define LF_POINTER      0x2
332 #define LF_ARRAY        0x3
333 #define LF_CLASS        0x4
334 #define LF_STRUCTURE    0x5
335 #define LF_UNION        0x6
336 #define LF_ENUMERATION  0x7
337 #define LF_PROCEDURE    0x8
338 #define LF_MFUNCTION    0x9
339 #define LF_VTSHAPE      0xa
340 #define LF_BARRAY       0xd
341 #define LF_DIMARRAY     0x11
342 #define LF_VFTPATH      0x12
343
344 #define LF_SKIP         0x200
345 #define LF_ARGLIST      0x201
346 #define LF_FIELDLIST    0x204
347 #define LF_DERIVED      0x205
348 #define LF_BITFIELD     0x206
349
350 #define LF_BCLASS       0x400
351 #define LF_VBCLASS      0x401
352 #define LF_IVBCLASS     0x402
353 #define LF_ENUMERATE    0x403
354 #define LF_FRIENDFCN    0x404
355 #define LF_INDEX        0x405
356 #define LF_MEMBER       0x406
357 #define LF_STMEMBER     0x407
358 #define LF_METHOD       0x408
359 #define LF_NESTEDTYPE   0x409
360 #define LF_VFUNCTAB     0x40a
361 #define LF_FRIENDCLS    0x40b
362 #define LF_ONEMETHOD    0x40c
363 #define LF_FUNCOFF      0x40d
364
365 #define MAX_BUILTIN_TYPES       0x480
366 static struct datatype * cv_basic_types[MAX_BUILTIN_TYPES];
367 static int num_cv_defined_types = 0;
368 static struct datatype **cv_defined_types = NULL;
369
370 /*
371  * For the type CODEVIEW debug directory entries, the debug directory
372  * points to a structure like this.  The cv_name field is the name
373  * of an external .PDB file.
374  */
375 struct CodeViewDebug
376 {
377         char                cv_nbtype[8];
378         unsigned int        cv_timestamp;
379         char                cv_unknown[4];
380         char                cv_name[1];
381 };
382
383 struct MiscDebug {
384     unsigned int       DataType;
385     unsigned int       Length;
386     char               Unicode;
387     char               Reserved[3];
388     char               Data[1];
389 };
390
391 /*
392  * This is the header that the COFF variety of debug header points to.
393  */
394 struct CoffDebug {
395     unsigned int   N_Sym;
396     unsigned int   SymbolOffset;
397     unsigned int   N_Linenum;
398     unsigned int   LinenumberOffset;
399     unsigned int   Unused[4];
400 };
401
402 struct CoffLinenum {
403         unsigned int            VirtualAddr;
404         unsigned short int      Linenum;
405 };
406
407 struct CoffFiles {
408         unsigned int    startaddr;
409         unsigned int    endaddr;
410         char          * filename;
411         int             linetab_offset;
412         int             linecnt;
413         struct name_hash **entries;
414         int                    neps;
415         int              neps_alloc;
416 };
417
418
419 struct CoffSymbol {
420     union {
421         char    ShortName[8];
422         struct {
423             unsigned int   NotLong;
424             unsigned int   StrTaboff;
425         } Name;
426     } N;
427     unsigned int   Value;
428     short          SectionNumber;
429     short          Type;
430     char           StorageClass;
431     unsigned char  NumberOfAuxSymbols;
432 };
433
434 struct CoffAuxSection{
435   unsigned int   Length;
436   unsigned short NumberOfRelocations;
437   unsigned short NumberOfLinenumbers;
438   unsigned int   CheckSum;
439   short          Number;
440   char           Selection;
441 } Section;
442
443 /*
444  * These two structures are used in the directory within a .DBG file
445  * to locate the individual important bits that we might want to see.
446  */
447 struct CV4_DirHead {
448   short unsigned int       dhsize;
449   short unsigned int       desize;
450   unsigned int             ndir;
451   unsigned int             next_offset;
452   unsigned int             flags;
453 };
454
455 struct CV4_DirEnt {
456   short unsigned int       subsect_number;
457   short unsigned int       module_number;
458   unsigned int             offset;
459   unsigned int             size;
460 };
461
462 /*
463  * These are the values of interest that the subsect_number field takes.
464  */
465 #define sstAlignSym             0x125
466 #define sstSrcModule            0x127
467
468 struct codeview_linetab_hdr
469 {
470   unsigned int             nline;
471   unsigned int             segno;
472   unsigned int             start;
473   unsigned int             end;
474   char                   * sourcefile;
475   unsigned short         * linetab;
476   unsigned int           * offtab;
477 };
478
479 struct codeview_pdb_hdr
480 {
481   char          ident[44];
482   unsigned int  blocksize;         /* Extent size */
483   unsigned short loc_freelist;   /* freelist. */
484   unsigned short alloc_filesize; /* # extents allocated. */
485   unsigned int  toc_len;
486   unsigned int  unknown;
487   unsigned short toc_ext[1];       /* array of extent #'s for toc. */
488 };
489
490 /*
491  * This is our own structure that we use to keep track of the contents
492  * of a PDB file.
493  */
494 struct file_list
495 {
496         int             record_len;
497         int             nextents;
498         short int     * extent_list;
499         unsigned int    linetab_offset;
500         unsigned int    linetab_len;
501 };
502
503 /*
504  * These are the structures that represent how the file table is set up
505  * within the PDB file.
506  */
507 struct filetab_hdr
508 {
509   unsigned short        tab1_file;
510   unsigned short        tab2_file;
511   unsigned short        gsym_file;
512   unsigned short        padding;
513   unsigned int          ftab_len;
514   unsigned int          fofftab_len;
515   unsigned int          hash_len;
516   unsigned int          strtab_len;
517 };
518
519 struct file_ent
520 {
521   unsigned int          reserved1;
522   unsigned short        datasect_segment;
523   unsigned short        reserved2;
524   unsigned int          datasect_offset;
525   unsigned int          datasect_size;
526   unsigned int          datasect_flags;
527   unsigned short        reserved3;
528   unsigned short        index;
529   unsigned short        num6a;
530   unsigned short        file_number;
531   unsigned int          linetab_offset;
532   unsigned int          linetab_len;
533   unsigned int          num9;
534   unsigned int          num10;
535   unsigned int          num11;
536   unsigned char         filename[1];
537 };
538
539 /*
540  ********************************************************************
541  */
542 struct deferred_debug_info
543 {
544         struct deferred_debug_info      * next;
545         char                            * load_addr;
546         char                            * module_name;
547         char                            * dbg_info;
548         int                               dbg_size;
549         HMODULE                         module;
550         PIMAGE_DEBUG_DIRECTORY           dbgdir;
551         PIMAGE_SECTION_HEADER             sectp;
552         int                               nsect;
553         short int                         dbg_index;                    
554         char                              loaded;
555 };
556
557 struct deferred_debug_info * dbglist = NULL;
558
559 /*
560  * A simple macro that tells us whether a given COFF symbol is a
561  * function or not.
562  */
563 #define N_TMASK                             0x0030
564 #define IMAGE_SYM_DTYPE_FUNCTION            2
565 #define N_BTSHFT                            4
566 #define ISFCN(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_FUNCTION << N_BTSHFT))
567
568
569 /*
570  * This is what we are looking for in the COFF symbols.
571  */
572 #define IMAGE_SYM_CLASS_EXTERNAL            0x2
573 #define IMAGE_SYM_CLASS_STATIC              0x3
574 #define IMAGE_SYM_CLASS_FILE                0x67
575
576 static 
577 struct datatype * DEBUG_GetCVType(int typeno)
578 {
579   struct datatype * dt = NULL;
580
581   /*
582    * Convert Codeview type numbers into something we can grok internally.
583    * Numbers < 0x1000 are all fixed builtin types.  Numbers from 0x1000 and
584    * up are all user defined (structs, etc).
585    */
586   if( typeno < 0x1000 )
587     {
588       if( typeno < MAX_BUILTIN_TYPES )
589         {
590           dt = cv_basic_types[typeno];
591         }
592     }
593   else
594     {
595       if( typeno - 0x1000 < num_cv_defined_types )
596         {
597           dt = cv_defined_types[typeno - 0x1000];
598         } 
599     }
600
601   return dt;
602 }
603
604 static int
605 DEBUG_ParseTypeTable(char * table, int len)
606 {
607   int                             arr_max;
608   int                             curr_type;
609   enum debug_type                 fieldtype;
610   int                             elem_size;
611   union any_size                  ptr;
612   union any_size                  ptr2;
613   struct datatype               * subtype;
614   char                            symname[256];
615   union codeview_type           * type;
616   union codeview_type           * type2;
617   struct datatype               * typeptr;
618
619   curr_type = 0x1000;
620
621   ptr.c = (table + 16);
622   while( ptr.c - table < len )
623     {
624       type = (union codeview_type *) ptr.c;
625
626       if( curr_type - 0x1000 >= num_cv_defined_types )
627         {
628           num_cv_defined_types += 0x100;
629           cv_defined_types = (struct datatype **) DBG_realloc(cv_defined_types,
630                   num_cv_defined_types * sizeof(struct datatype *));
631           memset(cv_defined_types + num_cv_defined_types - 0x100,
632                  0,
633                  0x100 * sizeof(struct datatype *));
634           if( cv_defined_types == NULL )
635             {
636               return FALSE;
637             }
638         }
639
640       switch(type->generic.id)
641         {
642         case LF_POINTER:
643           cv_defined_types[curr_type - 0x1000] = 
644             DEBUG_FindOrMakePointerType(DEBUG_GetCVType(type->pointer.datatype));
645           break;
646         case LF_ARRAY:
647           if( type->array.arrlen >= 0x8000 )
648             {
649               /*
650                * This is a numeric leaf, I am too lazy to handle this right
651                * now.
652                */
653               fprintf(stderr, "Ignoring large numberic leaf.\n");
654               break;
655             }
656           if( type->array.namelen != 0 )
657             {
658               memset(symname, 0, sizeof(symname));
659               memcpy(symname, type->array.name, type->array.namelen);
660               typeptr = DEBUG_NewDataType(DT_ARRAY, symname);
661             }
662           else
663             {
664               typeptr = DEBUG_NewDataType(DT_ARRAY, NULL);
665             }
666           cv_defined_types[curr_type - 0x1000] = typeptr;
667
668           subtype = DEBUG_GetCVType(type->array.elemtype);
669           if(    (subtype == NULL)
670               || (elem_size = DEBUG_GetObjectSize(subtype)) == 0 )
671             {
672               arr_max = 0;
673             }
674           else
675             {
676               arr_max = type->array.arrlen / DEBUG_GetObjectSize(subtype);
677             }
678
679           DEBUG_SetArrayParams(typeptr, 0, arr_max, subtype);
680           break;
681         case LF_FIELDLIST:
682           /*
683            * This is where the basic list of fields is defined for
684            * structures and classes.
685            *
686            * First, we need to look ahead and see whether we are building
687            * a fieldlist for an enum or a struct.
688            */
689           ptr2.i = ptr.i + 1;
690           type2 = (union codeview_type *) ptr2.c;
691           if( type2->member.id == LF_MEMBER )
692             {
693               typeptr = DEBUG_NewDataType(DT_STRUCT, NULL);
694               fieldtype = DT_STRUCT;
695             }
696           else if( type2->member.id == LF_ENUMERATE )
697             {
698               typeptr = DEBUG_NewDataType(DT_ENUM, NULL);
699               fieldtype = DT_ENUM;
700             }
701           else
702             {
703               break;
704             }
705
706           cv_defined_types[curr_type - 0x1000] = typeptr;
707           while( ptr2.c < (ptr.c + ((type->generic.len + 3) & ~3)) )
708             {
709               type2 = (union codeview_type *) ptr2.c;
710               if( type2->member.id == LF_MEMBER && fieldtype == DT_STRUCT )
711                 {
712                   memset(symname, 0, sizeof(symname));
713                   memcpy(symname, type2->member.name, type2->member.namelen);
714                   
715                   subtype = DEBUG_GetCVType(type2->member.type);
716                   elem_size = 0;
717                   if( subtype != NULL )
718                     {
719                       elem_size = DEBUG_GetObjectSize(subtype);
720                     }
721                   
722                   if( type2->member.offset >= 0x8000 )
723                     {
724                       /*
725                        * This is a numeric leaf, I am too lazy to handle this right
726                        * now.
727                        */
728                       fprintf(stderr, "Ignoring large numberic leaf.\n");
729                     }
730                   else
731                     {
732                       DEBUG_AddStructElement(typeptr, symname, subtype, 
733                                              type2->member.offset << 3,
734                                              elem_size << 3);
735                     }
736                 }
737               else if( type2->member.id == LF_ENUMERATE && fieldtype == DT_ENUM )
738                 {
739                   memset(symname, 0, sizeof(symname));
740                   memcpy(symname, type2->enumerate.name, type2->enumerate.namelen);
741                   
742                   if( type2->enumerate.value >= 0x8000 )
743                     {
744                       /*
745                        * This is a numeric leaf, I am too lazy to handle this right
746                        * now.
747                        */
748                       fprintf(stderr, "Ignoring large numberic leaf.\n");
749                     }
750                   else
751                     {
752                       DEBUG_AddStructElement(typeptr, symname, NULL, 
753                                              type2->enumerate.value, 0);
754                     }
755                 }
756               else
757                 {
758                   /*
759                    * Something else I have never seen before.  Either wrong type of
760                    * object in the fieldlist, or some other problem which I wouldn't
761                    * really know how to handle until it came up.
762                    */
763                   fprintf(stderr, "Unexpected entry in fieldlist\n");
764                   break;
765                 }
766
767
768               ptr2.c += ((type2->member.namelen + 9 + 3) & ~3);
769             }
770           break;
771         case LF_STRUCTURE:
772         case LF_CLASS:
773           if( type->structure.structlen >= 0x8000 )
774             {
775               /*
776                * This is a numeric leaf, I am too lazy to handle this right
777                * now.
778                */
779               fprintf(stderr, "Ignoring large numberic leaf.\n");
780               break;
781             }
782           memset(symname, 0, sizeof(symname));
783           memcpy(symname, type->structure.name, type->structure.namelen);
784           if( strcmp(symname, "__unnamed") == 0 )
785             {
786               typeptr = DEBUG_NewDataType(DT_STRUCT, NULL);
787             }
788           else
789             {
790               typeptr = DEBUG_NewDataType(DT_STRUCT, symname);
791             }
792           cv_defined_types[curr_type - 0x1000] = typeptr;
793
794           /*
795            * Now copy the relevant bits from the fieldlist that we specified.
796            */
797           subtype = DEBUG_GetCVType(type->structure.fieldlist);
798
799           if( subtype != NULL )
800             {
801               DEBUG_SetStructSize(typeptr, type->structure.structlen);
802               DEBUG_CopyFieldlist(typeptr, subtype);
803             }
804           break;
805         case LF_UNION:
806           if( type->t_union.un_len >= 0x8000 )
807             {
808               /*
809                * This is a numeric leaf, I am too lazy to handle this right
810                * now.
811                */
812               fprintf(stderr, "Ignoring large numberic leaf.\n");
813               break;
814             }
815           memset(symname, 0, sizeof(symname));
816           memcpy(symname, type->t_union.name, type->t_union.namelen);
817
818           if( strcmp(symname, "__unnamed") == 0 )
819             {
820               typeptr = DEBUG_NewDataType(DT_STRUCT, NULL);
821             }
822           else
823             {
824               typeptr = DEBUG_NewDataType(DT_STRUCT, symname);
825             }
826
827           cv_defined_types[curr_type - 0x1000] = typeptr;
828
829           /*
830            * Now copy the relevant bits from the fieldlist that we specified.
831            */
832           subtype = DEBUG_GetCVType(type->t_union.field);
833
834           if( subtype != NULL )
835             {
836               DEBUG_SetStructSize(typeptr, type->t_union.un_len);
837               DEBUG_CopyFieldlist(typeptr, subtype);
838             }
839           break;
840         case LF_BITFIELD:
841           typeptr = DEBUG_NewDataType(DT_BITFIELD, NULL);
842           cv_defined_types[curr_type - 0x1000] = typeptr;
843           DEBUG_SetBitfieldParams(typeptr, type->bitfield.bitoff,
844                                   type->bitfield.nbits, 
845                                   DEBUG_GetCVType(type->bitfield.type));
846           break;
847         case LF_ENUMERATION:
848           memset(symname, 0, sizeof(symname));
849           memcpy(symname, type->enumeration.name, type->enumeration.namelen);
850           typeptr = DEBUG_NewDataType(DT_ENUM, symname);
851           cv_defined_types[curr_type - 0x1000] = typeptr;
852
853           /*
854            * Now copy the relevant bits from the fieldlist that we specified.
855            */
856           subtype = DEBUG_GetCVType(type->enumeration.field);
857
858           if( subtype != NULL )
859             {
860               DEBUG_CopyFieldlist(typeptr, subtype);
861             }
862           break;
863         case LF_DIMARRAY:
864         default:
865           break;
866         }
867       curr_type++;
868       ptr.c += (type->generic.len + 3) & ~3;
869     }
870
871   return TRUE;
872 }
873
874 void
875 DEBUG_InitCVDataTypes()
876 {
877   /*
878    * These are the common builtin types that are used by VC++.
879    */
880   cv_basic_types[T_NOTYPE] = NULL;
881   cv_basic_types[T_ABS] = NULL;
882   cv_basic_types[T_VOID] = DEBUG_NewDataType(DT_BASIC, "void");
883   cv_basic_types[T_CHAR] = DEBUG_NewDataType(DT_BASIC, "char");
884   cv_basic_types[T_SHORT] = DEBUG_NewDataType(DT_BASIC, "short int");
885   cv_basic_types[T_LONG] = DEBUG_NewDataType(DT_BASIC, "long int");
886   cv_basic_types[T_QUAD] = DEBUG_NewDataType(DT_BASIC, "long long int");
887   cv_basic_types[T_UCHAR] = DEBUG_NewDataType(DT_BASIC, "unsigned char");
888   cv_basic_types[T_USHORT] = DEBUG_NewDataType(DT_BASIC, "short unsigned int");
889   cv_basic_types[T_ULONG] = DEBUG_NewDataType(DT_BASIC, "long unsigned int");
890   cv_basic_types[T_UQUAD] = DEBUG_NewDataType(DT_BASIC, "long long unsigned int");
891   cv_basic_types[T_REAL32] = DEBUG_NewDataType(DT_BASIC, "float");
892   cv_basic_types[T_REAL64] = DEBUG_NewDataType(DT_BASIC, "double");
893   cv_basic_types[T_RCHAR] = DEBUG_NewDataType(DT_BASIC, "char");
894   cv_basic_types[T_WCHAR] = DEBUG_NewDataType(DT_BASIC, "short");
895   cv_basic_types[T_INT4] = DEBUG_NewDataType(DT_BASIC, "int");
896   cv_basic_types[T_UINT4] = DEBUG_NewDataType(DT_BASIC, "unsigned int");
897
898   cv_basic_types[T_32PVOID] = DEBUG_FindOrMakePointerType(cv_basic_types[T_VOID]);
899   cv_basic_types[T_32PCHAR] = DEBUG_FindOrMakePointerType(cv_basic_types[T_CHAR]);
900   cv_basic_types[T_32PSHORT] = DEBUG_FindOrMakePointerType(cv_basic_types[T_SHORT]);
901   cv_basic_types[T_32PLONG] = DEBUG_FindOrMakePointerType(cv_basic_types[T_LONG]);
902   cv_basic_types[T_32PQUAD] = DEBUG_FindOrMakePointerType(cv_basic_types[T_QUAD]);
903   cv_basic_types[T_32PUCHAR] = DEBUG_FindOrMakePointerType(cv_basic_types[T_UCHAR]);
904   cv_basic_types[T_32PUSHORT] = DEBUG_FindOrMakePointerType(cv_basic_types[T_USHORT]);
905   cv_basic_types[T_32PULONG] = DEBUG_FindOrMakePointerType(cv_basic_types[T_ULONG]);
906   cv_basic_types[T_32PUQUAD] = DEBUG_FindOrMakePointerType(cv_basic_types[T_UQUAD]);
907   cv_basic_types[T_32PREAL32] = DEBUG_FindOrMakePointerType(cv_basic_types[T_REAL32]);
908   cv_basic_types[T_32PREAL64] = DEBUG_FindOrMakePointerType(cv_basic_types[T_REAL64]);
909   cv_basic_types[T_32PRCHAR] = DEBUG_FindOrMakePointerType(cv_basic_types[T_RCHAR]);
910   cv_basic_types[T_32PWCHAR] = DEBUG_FindOrMakePointerType(cv_basic_types[T_WCHAR]);
911   cv_basic_types[T_32PINT4] = DEBUG_FindOrMakePointerType(cv_basic_types[T_INT4]);
912   cv_basic_types[T_32PUINT4] = DEBUG_FindOrMakePointerType(cv_basic_types[T_UINT4]);
913 }
914
915 /*
916  * In this function, we keep track of deferred debugging information
917  * that we may need later if we were to need to use the internal debugger.
918  * We don't fully process it here for performance reasons.
919  */
920 int
921 DEBUG_RegisterDebugInfo( HMODULE hModule, const char *module_name)
922 {
923   int                     has_codeview = FALSE;
924   int                     rtn = FALSE;
925   int                     orig_size;
926   PIMAGE_DEBUG_DIRECTORY dbgptr;
927   u_long v_addr, size;
928   PIMAGE_NT_HEADERS       nth  = PE_HEADER(hModule);
929
930   size = nth->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size;
931   if (size) {
932     v_addr = nth->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress;
933     dbgptr = (PIMAGE_DEBUG_DIRECTORY) (hModule + v_addr);
934     orig_size = size;
935     for(; size >= sizeof(*dbgptr); size -= sizeof(*dbgptr), dbgptr++ )
936     {
937       switch(dbgptr->Type)
938         {
939         case IMAGE_DEBUG_TYPE_CODEVIEW:
940         case IMAGE_DEBUG_TYPE_MISC:
941           has_codeview = TRUE;
942           break;
943         }
944     }
945
946     size = orig_size;
947     dbgptr = (PIMAGE_DEBUG_DIRECTORY) (hModule + v_addr);
948     for(; size >= sizeof(*dbgptr); size -= sizeof(*dbgptr), dbgptr++ )
949     {
950       switch(dbgptr->Type)
951         {
952         case IMAGE_DEBUG_TYPE_COFF:
953           /*
954            * If we have both codeview and COFF debug info, ignore the
955            * coff debug info as  it would just confuse us, and it is 
956            * less complete.
957            *
958            * FIXME - this is broken - if we cannot find the PDB file, then
959            * we end up with no debugging info at all.  In this case, we
960            * should use the COFF info as a backup.
961            */
962           if( has_codeview )
963             {
964               break;
965             }
966         case IMAGE_DEBUG_TYPE_CODEVIEW:
967         case IMAGE_DEBUG_TYPE_MISC:
968           /*
969            * This is usually an indirection to a .DBG file.
970            * This is similar to (but a slightly older format) from the
971            * PDB file.
972            *
973            * First check to see if the image was 'stripped'.  If so, it
974            * means that this entry points to a .DBG file.  Otherwise,
975            * it just points to itself, and we can ignore this.
976            */
977
978
979
980
981
982
983           if(   (dbgptr->Type != IMAGE_DEBUG_TYPE_MISC) ||
984                 (PE_HEADER(hModule)->FileHeader.Characteristics & IMAGE_FILE_DEBUG_STRIPPED) != 0 )
985             {
986                 char                 fn[PATH_MAX];
987                 int                  fd = -1;
988                 DOS_FULL_NAME        full_name;
989                 struct deferred_debug_info*      deefer = (struct deferred_debug_info *) DBG_alloc(sizeof(*deefer));
990  
991                 deefer->module    = hModule;
992                 deefer->load_addr = (char *)hModule;
993  
994                 /*
995                  * Read the important bits.  What we do after this depends
996                  * upon the type, but this is always enough so we are able
997                  * to proceed if we know what we need to do next.
998                  */                  
999                 /* basically, the PE loader maps all sections (data, resources...), but doesn't map
1000                  * the DataDirectory array's content. One its entry contains the *beloved*
1001                  * debug information. (Note the DataDirectory is mapped, not its content)
1002                  */
1003  
1004                  if (GetModuleFileNameA(hModule, fn, sizeof(fn)) > 0 &&
1005                     DOSFS_GetFullName(fn, TRUE, &full_name) &&
1006                     (fd = open(full_name.long_name, O_RDONLY)) > 0)
1007                 {
1008                     deefer->dbg_info = mmap(NULL, dbgptr->SizeOfData,
1009                                             PROT_READ, MAP_PRIVATE, fd, dbgptr->PointerToRawData);
1010                     close(fd);
1011                     if( deefer->dbg_info == (char *) 0xffffffff )
1012                     {
1013                         DBG_free(deefer);
1014                         break;
1015                     }
1016                 }
1017                 else
1018                 {
1019                     DBG_free(deefer);
1020                     fprintf(stderr, " (not mapped: fn=%s, lfn=%s, fd=%d)", fn, full_name.long_name, fd);
1021                     break;
1022                 }
1023                 deefer->dbg_size = dbgptr->SizeOfData;
1024                 deefer->dbgdir = dbgptr;
1025                 deefer->next = dbglist;
1026                 deefer->loaded = FALSE;
1027                 deefer->dbg_index = DEBUG_next_index;
1028                 deefer->module_name = DBG_strdup(module_name);
1029
1030                 deefer->sectp = PE_SECTIONS(hModule);
1031                 deefer->nsect = PE_HEADER(hModule)->FileHeader.NumberOfSections;
1032
1033                 dbglist = deefer;
1034             }
1035           break;
1036 #if 0
1037         default:
1038 #endif
1039         }
1040     }
1041     DEBUG_next_index++;
1042   }
1043   /* look for .stabs/.stabstr sections */
1044   {
1045     PIMAGE_SECTION_HEADER      pe_seg = PE_SECTIONS(hModule);
1046     int i,stabsize=0,stabstrsize=0;
1047     unsigned int stabs=0,stabstr=0;
1048     
1049     for (i=0;i<nth->FileHeader.NumberOfSections;i++) {
1050       if (!strcasecmp(pe_seg[i].Name,".stab")) {
1051         stabs = pe_seg[i].VirtualAddress;
1052         stabsize = pe_seg[i].SizeOfRawData;
1053       }
1054       if (!strncasecmp(pe_seg[i].Name,".stabstr",8)) {
1055         stabstr = pe_seg[i].VirtualAddress;
1056         stabstrsize = pe_seg[i].SizeOfRawData;
1057       }
1058     }
1059     if (stabstrsize && stabsize) {
1060 #ifdef _WE_SUPPORT_THE_STAB_TYPES_USED_BY_MINGW_TOO
1061       /* Won't work currently, since MINGW32 uses some special typedefs
1062        * which we do not handle yet. Support for them is a bit difficult.
1063        */
1064       DEBUG_ParseStabs(hModule,0,stabs,stabsize,stabstr,stabstrsize);
1065 #endif
1066       fprintf(stderr,"(stabs not loaded)");
1067     }
1068   }
1069   return (rtn);
1070 }
1071
1072 /*
1073  * ELF modules are also entered into the list - this is so that we
1074  * can make 'info shared' types of displays possible.
1075  */
1076 int
1077 DEBUG_RegisterELFDebugInfo(int load_addr, u_long size, char * name)
1078 {
1079   struct deferred_debug_info * deefer;
1080
1081   deefer = (struct deferred_debug_info *) DBG_alloc(sizeof(*deefer));
1082   deefer->module = 0;
1083   
1084   /*
1085    * Read the important bits.  What we do after this depends
1086    * upon the type, but this is always enough so we are able
1087    * to proceed if we know what we need to do next.
1088    */
1089   deefer->dbg_size = size;
1090   deefer->dbg_info = (char *) NULL;
1091   
1092   deefer->load_addr = (char *) load_addr;
1093   deefer->dbgdir = NULL;
1094   deefer->next = dbglist;
1095   deefer->loaded = TRUE;
1096   deefer->dbg_index = DEBUG_next_index;
1097   deefer->module_name = DBG_strdup(name);
1098   dbglist = deefer;
1099
1100   DEBUG_next_index++;
1101
1102   return (TRUE);
1103 }
1104
1105
1106
1107 /*
1108  * Process COFF debugging information embedded in a Win32 application.
1109  *
1110  */
1111 static
1112 int
1113 DEBUG_ProcessCoff(struct deferred_debug_info * deefer)
1114 {
1115   struct CoffAuxSection * aux;
1116   struct CoffDebug   * coff;
1117   struct CoffFiles   * coff_files = NULL;
1118   struct CoffLinenum * coff_linetab;
1119   char               * coff_strtab;
1120   struct CoffSymbol  * coff_sym;
1121   struct CoffSymbol  * coff_symbol;
1122   struct CoffFiles   * curr_file = NULL;
1123   int                  i;
1124   int                  j;
1125   int                  k;
1126   struct CoffLinenum * linepnt;
1127   int                  linetab_indx;
1128   char                 namebuff[9];
1129   char               * nampnt;
1130   int                  naux;
1131   DBG_ADDR             new_addr;
1132   int                  nfiles = 0;
1133   int                  nfiles_alloc = 0;
1134   struct CoffFiles     orig_file;
1135   int                  rtn = FALSE;
1136   char               * this_file = NULL;
1137
1138   coff = (struct CoffDebug *) deefer->dbg_info;
1139
1140   coff_symbol = (struct CoffSymbol *) ((unsigned int) coff + coff->SymbolOffset);
1141   coff_linetab = (struct CoffLinenum *) ((unsigned int) coff + coff->LinenumberOffset);
1142   coff_strtab = (char *) ((unsigned int) coff_symbol + 18*coff->N_Sym);
1143
1144   linetab_indx = 0;
1145
1146   for(i=0; i < coff->N_Sym; i++ )
1147     {
1148       /*
1149        * We do this because some compilers (i.e. gcc) incorrectly
1150        * pad the structure up to a 4 byte boundary.  The structure
1151        * is really only 18 bytes long, so we have to manually make sure
1152        * we get it right.
1153        *
1154        * FIXME - there must be a way to have autoconf figure out the
1155        * correct compiler option for this.  If it is always gcc, that
1156        * makes life simpler, but I don't want to force this.
1157        */
1158       coff_sym = (struct CoffSymbol *) ((unsigned int) coff_symbol + 18*i);
1159       naux = coff_sym->NumberOfAuxSymbols;
1160
1161       if( coff_sym->StorageClass == IMAGE_SYM_CLASS_FILE )
1162         {
1163           if( nfiles + 1 >= nfiles_alloc )
1164             {
1165               nfiles_alloc += 10;
1166               coff_files = (struct CoffFiles *) DBG_realloc(coff_files,
1167                         nfiles_alloc * sizeof(struct CoffFiles));
1168             }
1169           curr_file = coff_files + nfiles;
1170           nfiles++;
1171           curr_file->startaddr = 0xffffffff;
1172           curr_file->endaddr   = 0;
1173           curr_file->filename =  ((char *) coff_sym) + 18;
1174           curr_file->linetab_offset = -1;
1175           curr_file->linecnt = 0;
1176           curr_file->entries = NULL;
1177           curr_file->neps = curr_file->neps_alloc = 0;
1178 #if 0
1179           fprintf(stderr,"New file %s\n", curr_file->filename);
1180 #endif
1181           i += naux;
1182           continue;
1183         }
1184
1185       /*
1186        * This guy marks the size and location of the text section
1187        * for the current file.  We need to keep track of this so
1188        * we can figure out what file the different global functions
1189        * go with.
1190        */
1191       if(    (coff_sym->StorageClass == IMAGE_SYM_CLASS_STATIC)
1192           && (naux != 0)
1193           && (coff_sym->Type == 0)
1194           && (coff_sym->SectionNumber == 1) )
1195         {
1196           aux = (struct CoffAuxSection *) ((unsigned int) coff_sym + 18);
1197
1198           if( curr_file->linetab_offset != -1 )
1199             {
1200 #if 0
1201               fprintf(stderr, "Duplicating sect from %s: %x %x %x %d %d\n",
1202                       curr_file->filename,
1203                       aux->Length,
1204                       aux->NumberOfRelocations,
1205                       aux->NumberOfLinenumbers,
1206                       aux->Number,
1207                       aux->Selection);
1208               fprintf(stderr, "More sect %d %x %d %d %d\n", 
1209                       coff_sym->SectionNumber,
1210                       coff_sym->Value,
1211                       coff_sym->Type,
1212                       coff_sym->StorageClass,
1213                       coff_sym->NumberOfAuxSymbols);
1214 #endif
1215
1216               /*
1217                * Save this so we can copy bits from it.
1218                */
1219               orig_file = *curr_file;
1220
1221               /*
1222                * Duplicate the file entry.  We have no way to describe
1223                * multiple text sections in our current way of handling things.
1224                */
1225               if( nfiles + 1 >= nfiles_alloc )
1226                 {
1227                   nfiles_alloc += 10;
1228                   coff_files = (struct CoffFiles *) DBG_realloc(coff_files,
1229                                                              nfiles_alloc * sizeof(struct CoffFiles));
1230                 }
1231               curr_file = coff_files + nfiles;
1232               nfiles++;
1233               curr_file->startaddr = 0xffffffff;
1234               curr_file->endaddr   = 0;
1235               curr_file->filename = orig_file.filename;
1236               curr_file->linetab_offset = -1;
1237               curr_file->linecnt = 0;
1238               curr_file->entries = NULL;
1239               curr_file->neps = curr_file->neps_alloc = 0;
1240             }
1241 #if 0
1242           else
1243             {
1244               fprintf(stderr, "New text sect from %s: %x %x %x %d %d\n",
1245                       curr_file->filename,
1246                       aux->Length,
1247                       aux->NumberOfRelocations,
1248                       aux->NumberOfLinenumbers,
1249                       aux->Number,
1250                       aux->Selection);
1251             }
1252 #endif
1253
1254           if( curr_file->startaddr > coff_sym->Value )
1255             {
1256               curr_file->startaddr = coff_sym->Value;
1257             }
1258           
1259           if( curr_file->startaddr > coff_sym->Value )
1260             {
1261               curr_file->startaddr = coff_sym->Value;
1262             }
1263           
1264           if( curr_file->endaddr < coff_sym->Value + aux->Length )
1265             {
1266               curr_file->endaddr = coff_sym->Value + aux->Length;
1267             }
1268           
1269           curr_file->linetab_offset = linetab_indx;
1270           curr_file->linecnt = aux->NumberOfLinenumbers;
1271           linetab_indx += aux->NumberOfLinenumbers;
1272           i += naux;
1273           continue;
1274         }
1275
1276       if(    (coff_sym->StorageClass == IMAGE_SYM_CLASS_STATIC)
1277           && (naux == 0)
1278           && (coff_sym->SectionNumber == 1) )
1279         {
1280           /*
1281            * This is a normal static function when naux == 0.
1282            * Just register it.  The current file is the correct
1283            * one in this instance.
1284            */
1285           if( coff_sym->N.Name.NotLong )
1286             {
1287               memcpy(namebuff, coff_sym->N.ShortName, 8);
1288               namebuff[8] = '\0';
1289               nampnt = &namebuff[0];
1290             }
1291           else
1292             {
1293               nampnt = coff_strtab + coff_sym->N.Name.StrTaboff;
1294             }
1295
1296           if( nampnt[0] == '_' )
1297             {
1298               nampnt++;
1299             }
1300
1301           new_addr.seg = 0;
1302           new_addr.off = (int) (deefer->load_addr + coff_sym->Value);
1303
1304           if( curr_file->neps + 1 >= curr_file->neps_alloc )
1305             {
1306               curr_file->neps_alloc += 10;
1307               curr_file->entries = (struct name_hash **) 
1308                 DBG_realloc(curr_file->entries, 
1309                          curr_file->neps_alloc * sizeof(struct name_hash *));
1310             }
1311 #if 0
1312           fprintf(stderr,"\tAdding static symbol %s\n", nampnt);
1313 #endif
1314           curr_file->entries[curr_file->neps++] =
1315             DEBUG_AddSymbol( nampnt, &new_addr, this_file, SYM_WIN32 );
1316           i += naux;
1317           continue;
1318         }
1319
1320       if(    (coff_sym->StorageClass == IMAGE_SYM_CLASS_EXTERNAL)
1321           && ISFCN(coff_sym->Type)
1322           && (coff_sym->SectionNumber > 0) )
1323         {
1324           if( coff_sym->N.Name.NotLong )
1325             {
1326               memcpy(namebuff, coff_sym->N.ShortName, 8);
1327               namebuff[8] = '\0';
1328               nampnt = &namebuff[0];
1329             }
1330           else
1331             {
1332               nampnt = coff_strtab + coff_sym->N.Name.StrTaboff;
1333             }
1334
1335
1336           if( nampnt[0] == '_' )
1337             {
1338               nampnt++;
1339             }
1340
1341           new_addr.seg = 0;
1342           new_addr.off = (int) (deefer->load_addr + coff_sym->Value);
1343
1344 #if 0
1345           fprintf(stderr, "%d: %x %s\n", i, new_addr.off, nampnt);
1346
1347           fprintf(stderr,"\tAdding global symbol %s\n", nampnt);
1348 #endif
1349
1350           /*
1351            * Now we need to figure out which file this guy belongs to.
1352            */
1353           this_file = NULL;
1354           for(j=0; j < nfiles; j++)
1355             {
1356               if( coff_files[j].startaddr <= coff_sym->Value
1357                   && coff_files[j].endaddr > coff_sym->Value )
1358                 {
1359                   this_file = coff_files[j].filename;
1360                   break;
1361                 }
1362             }
1363           if( coff_files[j].neps + 1 >= coff_files[j].neps_alloc )
1364             {
1365               coff_files[j].neps_alloc += 10;
1366               coff_files[j].entries = (struct name_hash **) 
1367                 DBG_realloc(coff_files[j].entries, 
1368                          coff_files[j].neps_alloc * sizeof(struct name_hash *));
1369             }
1370           coff_files[j].entries[coff_files[j].neps++] =
1371             DEBUG_AddSymbol( nampnt, &new_addr, this_file, SYM_WIN32 );
1372           i += naux;
1373           continue;
1374         }
1375
1376       if(    (coff_sym->StorageClass == IMAGE_SYM_CLASS_EXTERNAL)
1377           && (coff_sym->SectionNumber > 0) )
1378         {
1379           /*
1380            * Similar to above, but for the case of data symbols.
1381            * These aren't treated as entrypoints.
1382            */
1383           if( coff_sym->N.Name.NotLong )
1384             {
1385               memcpy(namebuff, coff_sym->N.ShortName, 8);
1386               namebuff[8] = '\0';
1387               nampnt = &namebuff[0];
1388             }
1389           else
1390             {
1391               nampnt = coff_strtab + coff_sym->N.Name.StrTaboff;
1392             }
1393
1394
1395           if( nampnt[0] == '_' )
1396             {
1397               nampnt++;
1398             }
1399
1400           new_addr.seg = 0;
1401           new_addr.off = (int) (deefer->load_addr + coff_sym->Value);
1402
1403 #if 0
1404           fprintf(stderr, "%d: %x %s\n", i, new_addr.off, nampnt);
1405
1406           fprintf(stderr,"\tAdding global data symbol %s\n", nampnt);
1407 #endif
1408
1409           /*
1410            * Now we need to figure out which file this guy belongs to.
1411            */
1412           DEBUG_AddSymbol( nampnt, &new_addr, NULL, SYM_WIN32 );
1413           i += naux;
1414           continue;
1415         }
1416           
1417       if(    (coff_sym->StorageClass == IMAGE_SYM_CLASS_STATIC)
1418           && (naux == 0) )
1419         {
1420           /*
1421            * Ignore these.  They don't have anything to do with
1422            * reality.
1423            */
1424           i += naux;
1425           continue;
1426         }
1427
1428 #if 0
1429       fprintf(stderr,"Skipping unknown entry %d %d %d\n", coff_sym->StorageClass, 
1430               coff_sym->SectionNumber, naux);
1431 #endif
1432
1433       /*
1434        * For now, skip past the aux entries.
1435        */
1436       i += naux;
1437       
1438     }
1439     
1440   /*
1441    * OK, we now should have a list of files, and we should have a list
1442    * of entrypoints.  We need to sort the entrypoints so that we are
1443    * able to tie the line numbers with the given functions within the
1444    * file.
1445    */
1446   if( coff_files != NULL )
1447     {
1448       for(j=0; j < nfiles; j++)
1449         {
1450           if( coff_files[j].entries != NULL )
1451             {
1452               qsort(coff_files[j].entries, coff_files[j].neps,
1453                     sizeof(struct name_hash *), DEBUG_cmp_sym);
1454             }
1455         }
1456
1457       /*
1458        * Now pick apart the line number tables, and attach the entries
1459        * to the given functions.
1460        */
1461       for(j=0; j < nfiles; j++)
1462         {
1463           i = 0;
1464           if( coff_files[j].neps != 0 )
1465             for(k=0; k < coff_files[j].linecnt; k++)
1466             {
1467               /*
1468                * Another monstrosity caused by the fact that we are using
1469                * a 6 byte structure, and gcc wants to pad structures to 4 byte
1470                * boundaries.  Otherwise we could just index into an array.
1471                */
1472               linepnt = (struct CoffLinenum *) 
1473                 ((unsigned int) coff_linetab + 
1474                  6*(coff_files[j].linetab_offset + k));
1475               /*
1476                * If we have spilled onto the next entrypoint, then
1477                * bump the counter..
1478                */
1479               while(TRUE)
1480                 {
1481                   if (i+1 >= coff_files[j].neps) break;
1482                   DEBUG_GetSymbolAddr(coff_files[j].entries[i+1], &new_addr);
1483                   if( (((unsigned int)deefer->load_addr +
1484                         linepnt->VirtualAddr) >= new_addr.off) )
1485                   {
1486                       i++;
1487                   } else break;
1488                 }
1489
1490               /*
1491                * Add the line number.  This is always relative to the
1492                * start of the function, so we need to subtract that offset
1493                * first.
1494                */
1495               DEBUG_GetSymbolAddr(coff_files[j].entries[i], &new_addr);
1496               DEBUG_AddLineNumber(coff_files[j].entries[i], 
1497                                   linepnt->Linenum,
1498                                   (unsigned int) deefer->load_addr 
1499                                   + linepnt->VirtualAddr 
1500                                   - new_addr.off);
1501             }
1502         }
1503     }
1504
1505   rtn = TRUE;
1506
1507   if( coff_files != NULL )
1508     {
1509       for(j=0; j < nfiles; j++)
1510         {
1511           if( coff_files[j].entries != NULL )
1512             {
1513               DBG_free(coff_files[j].entries);
1514             }
1515         }
1516       DBG_free(coff_files);
1517     }
1518
1519   return (rtn);
1520
1521 }
1522
1523 /*
1524  * Process a codeview line number table.  Digestify the thing so that
1525  * we can easily reference the thing when we process the rest of
1526  * the information.
1527  */
1528 static struct codeview_linetab_hdr *
1529 DEBUG_SnarfLinetab(char                      * linetab,
1530                    int                         size)
1531 {
1532   int                             file_segcount;
1533   char                            filename[PATH_MAX];
1534   unsigned int                  * filetab;
1535   char                          * fn;
1536   int                             i;
1537   int                             k;
1538   struct codeview_linetab_hdr   * lt_hdr;
1539   unsigned int                  * lt_ptr;
1540   int                             nfile;
1541   int                             nseg;
1542   union any_size                  pnt;
1543   union any_size                  pnt2;
1544   struct startend               * start;
1545   int                             this_seg;
1546
1547   /*
1548    * Now get the important bits.
1549    */
1550   pnt.c = linetab;
1551   nfile = *pnt.s++;
1552   nseg = *pnt.s++;
1553
1554   filetab = (unsigned int *) pnt.c;
1555
1556   /*
1557    * Now count up the number of segments in the file.
1558    */
1559   nseg = 0;
1560   for(i=0; i<nfile; i++)
1561     {
1562       pnt2.c = linetab + filetab[i];
1563       nseg += *pnt2.s;
1564     }
1565
1566   /*
1567    * Next allocate the header we will be returning.
1568    * There is one header for each segment, so that we can reach in
1569    * and pull bits as required.
1570    */
1571   lt_hdr = (struct codeview_linetab_hdr *) 
1572     DBG_alloc((nseg + 1) * sizeof(*lt_hdr));
1573   if( lt_hdr == NULL )
1574     {
1575       goto leave;
1576     }
1577
1578   memset(lt_hdr, 0, sizeof(*lt_hdr) * (nseg+1));
1579
1580   /*
1581    * Now fill the header we will be returning, one for each segment.
1582    * Note that this will basically just contain pointers into the existing
1583    * line table, and we do not actually copy any additional information
1584    * or allocate any additional memory.
1585    */
1586
1587   this_seg = 0;
1588   for(i=0; i<nfile; i++)
1589     {
1590       /*
1591        * Get the pointer into the segment information.
1592        */
1593       pnt2.c = linetab + filetab[i];
1594       file_segcount = *pnt2.s;
1595
1596       pnt2.ui++;
1597       lt_ptr = (unsigned int *) pnt2.c;
1598       start = (struct startend *) (lt_ptr + file_segcount);
1599
1600       /*
1601        * Now snarf the filename for all of the segments for this file.
1602        */
1603       fn = (unsigned char *) (start + file_segcount);
1604       memset(filename, 0, sizeof(filename));
1605       memcpy(filename, fn + 1, *fn);
1606       fn = DBG_strdup(filename);
1607
1608       for(k = 0; k < file_segcount; k++, this_seg++)
1609         {
1610           pnt2.c = linetab + lt_ptr[k];
1611           lt_hdr[this_seg].start      = start[k].start;
1612           lt_hdr[this_seg].end        = start[k].end;
1613           lt_hdr[this_seg].sourcefile = fn;
1614           lt_hdr[this_seg].segno      = *pnt2.s++;
1615           lt_hdr[this_seg].nline      = *pnt2.s++;
1616           lt_hdr[this_seg].offtab     =  pnt2.ui;
1617           lt_hdr[this_seg].linetab    = (unsigned short *) 
1618             (pnt2.ui + lt_hdr[this_seg].nline);
1619         }
1620     }
1621
1622 leave:
1623
1624   return lt_hdr;
1625
1626 }
1627
1628 static int
1629 DEBUG_SnarfCodeView(      struct deferred_debug_info * deefer,
1630                           char                       * cv_data,
1631                           int                          size,
1632                           struct codeview_linetab_hdr * linetab)
1633 {
1634   struct name_hash      * curr_func = NULL;
1635   struct wine_locals    * curr_sym = NULL;
1636   int                     i;
1637   int                     j;
1638   int                     len;
1639   DBG_ADDR                new_addr;
1640   int                     nsect;
1641   union any_size          ptr;
1642   IMAGE_SECTION_HEADER  * sectp;
1643   union codeview_symbol * sym;
1644   char                    symname[PATH_MAX];
1645   struct name_hash      * thunk_sym = NULL;
1646
1647   ptr.c = cv_data;
1648   nsect = deefer->nsect;
1649   sectp = deefer->sectp;
1650
1651   /*
1652    * Skip over the first word.  Don't really know what it means, but
1653    * it is useless.
1654    */
1655   ptr.ui++;
1656
1657   /*
1658    * Loop over the different types of records and whenever we
1659    * find something we are interested in, record it and move on.
1660    */
1661   while( ptr.c - cv_data < size )
1662     {
1663       sym = (union codeview_symbol *) ptr.c;
1664
1665       if( sym->generic.len - sizeof(int) == (ptr.c - cv_data) )
1666         {
1667           /*
1668            * This happens when we have indirect symbols that VC++ 4.2
1669            * sometimes uses when there isn't a line number table.
1670            * We ignore it - we will process and enter all of the
1671            * symbols in the global symbol table anyways, so there
1672            * isn't much point in keeping track of all of this crap.
1673            */
1674           break;
1675         }
1676
1677       memset(symname, 0, sizeof(symname));
1678       switch(sym->generic.id)
1679         {
1680         case S_GDATA:
1681         case S_LDATA:
1682         case S_PUB:
1683           /*
1684            * First, a couple of sanity checks.
1685            */
1686           if( sym->data.namelen == 0 )
1687             {
1688               break;
1689             }
1690
1691           if( sym->data.seg == 0 || sym->data.seg > nsect )
1692             {
1693               break;
1694             }
1695
1696           /*
1697            * Global and local data symbols.  We don't associate these
1698            * with any given source file.
1699            */
1700
1701           memcpy(symname, sym->data.name, sym->data.namelen);
1702           new_addr.seg = 0;
1703           new_addr.type = DEBUG_GetCVType(sym->data.symtype);
1704           new_addr.off = (unsigned int) deefer->load_addr + 
1705             sectp[sym->data.seg - 1].VirtualAddress + 
1706             sym->data.offset;
1707           DEBUG_AddSymbol( symname, &new_addr, NULL, SYM_WIN32 | SYM_DATA );
1708           break;
1709         case S_THUNK:
1710           /*
1711            * Sort of like a global function, but it just points
1712            * to a thunk, which is a stupid name for what amounts to
1713            * a PLT slot in the normal jargon that everyone else uses.
1714            */
1715           memcpy(symname, sym->thunk.name, sym->thunk.namelen);
1716           new_addr.seg = 0;
1717           new_addr.type = NULL;
1718           new_addr.off = (unsigned int) deefer->load_addr + 
1719             sectp[sym->thunk.segment - 1].VirtualAddress + 
1720             sym->thunk.offset;
1721           thunk_sym = DEBUG_AddSymbol( symname, &new_addr, NULL, 
1722                                        SYM_WIN32 | SYM_FUNC);
1723           DEBUG_SetSymbolSize(thunk_sym, sym->thunk.thunk_len);
1724           break;
1725         case S_GPROC:
1726         case S_LPROC:
1727           /*
1728            * Global and static functions.
1729            */
1730           memcpy(symname, sym->proc.name, sym->proc.namelen);
1731           new_addr.seg = 0;
1732           new_addr.type = DEBUG_GetCVType(sym->proc.proctype);
1733           new_addr.off = (unsigned int) deefer->load_addr + 
1734             sectp[sym->proc.segment - 1].VirtualAddress + 
1735             sym->proc.offset;
1736           /*
1737            * See if we can find a segment that this goes with.  If so,
1738            * it means that we also may have line number information
1739            * for this function.
1740            */
1741           for(i=0; linetab[i].linetab != NULL; i++)
1742             {
1743               if(     ((unsigned int) deefer->load_addr 
1744                        + sectp[linetab[i].segno - 1].VirtualAddress 
1745                        + linetab[i].start <= new_addr.off)
1746                   &&  ((unsigned int) deefer->load_addr 
1747                        + sectp[linetab[i].segno - 1].VirtualAddress 
1748                        + linetab[i].end > new_addr.off) )
1749                 {
1750                   break;
1751                 }
1752             }
1753
1754           DEBUG_Normalize(curr_func);
1755           if( linetab[i].linetab == NULL )
1756             {
1757               curr_func = DEBUG_AddSymbol( symname, &new_addr, NULL,
1758                                            SYM_WIN32 | SYM_FUNC);
1759             }
1760           else
1761             {
1762               /*
1763                * First, create the entry.  Then dig through the linetab
1764                * and add whatever line numbers are appropriate for this
1765                * function.
1766                */
1767               curr_func = DEBUG_AddSymbol( symname, &new_addr, 
1768                                            linetab[i].sourcefile,
1769                                            SYM_WIN32 | SYM_FUNC);
1770               for(j=0; j < linetab[i].nline; j++)
1771                 {
1772                   if( linetab[i].offtab[j] >= sym->proc.offset 
1773                       && linetab[i].offtab[j] < sym->proc.offset 
1774                       + sym->proc.proc_len )
1775                     {
1776                       DEBUG_AddLineNumber(curr_func, linetab[i].linetab[j],
1777                                           linetab[i].offtab[j] - sym->proc.offset);
1778                     }
1779                 }
1780
1781             }
1782
1783           /*
1784            * Add information about where we should set breakpoints
1785            * in this function.
1786            */
1787           DEBUG_SetSymbolBPOff(curr_func, sym->proc.debug_start);
1788           DEBUG_SetSymbolSize(curr_func, sym->proc.proc_len);
1789           break;
1790         case S_BPREL:
1791           /*
1792            * Function parameters and stack variables.
1793            */
1794           memcpy(symname, sym->stack.name, sym->stack.namelen);
1795           curr_sym = DEBUG_AddLocal(curr_func, 
1796                          0, 
1797                          sym->stack.offset, 
1798                          0, 
1799                          0, 
1800                          symname);
1801           DEBUG_SetLocalSymbolType(curr_sym, DEBUG_GetCVType(sym->stack.symtype));
1802           
1803           break;
1804         default:
1805           break;
1806         }
1807
1808       /*
1809        * Adjust pointer to point to next entry, rounding up to a word
1810        * boundary.  MS preserving alignment?  Stranger things have
1811        * happened.
1812        */
1813       if( sym->generic.id == S_PROCREF
1814           || sym->generic.id == S_DATAREF
1815           || sym->generic.id == S_UNKNOWN )
1816         {
1817           len = (sym->generic.len + 3) & ~3;
1818           len += ptr.c[16] + 1;
1819           ptr.c += (len + 3) & ~3;
1820         }
1821       else
1822         {
1823           ptr.c += (sym->generic.len + 3) & ~3;
1824         }
1825     }
1826
1827   if( linetab != NULL )
1828     {
1829       DBG_free(linetab);
1830     }
1831
1832   return TRUE;
1833 }
1834
1835
1836 /*
1837  * Process PDB file which contains debug information.
1838  *
1839  * These are really weird beasts.  They are intended to be incrementally
1840  * updated by the incremental linker, and this means that you need to 
1841  * be able to remove and add information.  Thus the PDB file is sort of
1842  * like a block structured device, with a freelist and lists of extent numbers
1843  * that are used to get the relevant pieces.  In all cases seen so far, the
1844  * blocksize is always 0x400 bytes.  The header has a field which apparently
1845  * holds the blocksize, so if it ever changes we are safe.
1846  *
1847  * In general, every time we need to extract something from the pdb file,
1848  * it is easier to copy it into another buffer so we have the information
1849  * in one contiguous block rather than attempt to try and keep track of when
1850  * we need to grab another extent from the pdb file.
1851  *
1852  * The thing that is a real pain about some MS stuff is that they choose
1853  * data structures which are not representable in C.  Thus we have to
1854  * hack around and diddle pointers.
1855  */
1856 /* static */
1857 int
1858 DEBUG_ProcessPDBFile(struct deferred_debug_info * deefer, char * full_filename)
1859 {
1860   char                        * addr = (char *) 0xffffffff;
1861   unsigned int                  blocksize;
1862   unsigned int                  bufflen = 0;
1863   char                        * buffer = NULL;
1864   unsigned short              * extent_table;
1865   int                           fd = -1;
1866   struct file_ent             * fent;
1867   char                          filename[MAX_PATHNAME_LEN];
1868   struct file_list            * filelist = NULL;
1869   unsigned int                  gsym_record = 0;
1870   char                        * gsymtab = NULL;
1871   struct filetab_hdr          * hd;
1872   int                           i;
1873   int                           j;
1874   unsigned int                  last_extent;
1875   struct codeview_linetab_hdr * linetab;
1876   unsigned int                  nblocks;
1877   unsigned int                  npair;
1878   unsigned int                  offset;
1879   struct codeview_pdb_hdr     * pdbhdr;
1880   unsigned int                * pnt;
1881   struct stat                   statbuf;
1882   int                           status;
1883   unsigned short              * table;
1884   char                        * toc;
1885   unsigned int                  toc_blocks;
1886
1887   LocateDebugInfoFile(full_filename, filename);
1888   status = stat(filename, &statbuf);
1889   if( status == -1 )
1890     {
1891       fprintf(stderr, "-Unable to open .PDB file %s\n", filename);
1892       goto leave;
1893     }
1894
1895   /*
1896    * Now open the file, so that we can mmap() it.
1897    */
1898   fd = open(filename, O_RDONLY);
1899   if( fd == -1 )
1900     {
1901       fprintf(stderr, "-Unable to open .DBG file %s\n", filename);
1902       goto leave;
1903     }
1904
1905
1906   /*
1907    * Now mmap() the file.
1908    */
1909   addr = mmap(0, statbuf.st_size, PROT_READ, 
1910               MAP_PRIVATE, fd, 0);
1911   if( addr == (char *) 0xffffffff )
1912     {
1913       fprintf(stderr, "-Unable to mmap .DBG file %s\n", filename);
1914       goto leave;
1915     }
1916
1917   /*
1918    * Now that we have the formalities over and done with, we need
1919    * to find the table of contents for the PDB file.
1920    */
1921   pdbhdr = (struct codeview_pdb_hdr *) addr;
1922   blocksize = pdbhdr->blocksize;
1923   last_extent = (statbuf.st_size + blocksize - 1) / blocksize;
1924
1925   /*
1926    * The TOC itself isn't always contiguous, so we need to extract a few
1927    * extents from the file to form the TOC.
1928    */
1929   toc_blocks = (pdbhdr->toc_len + blocksize - 1) / blocksize;
1930   toc = (char *) DBG_alloc(toc_blocks * blocksize);
1931   table = pdbhdr->toc_ext;
1932   for(i=0; i < toc_blocks; i++)
1933     {
1934       memcpy(toc + blocksize*i, addr + table[i]*blocksize, blocksize);
1935     }
1936
1937   /*
1938    * Next build our own table which will have the size and extent block
1939    * list for each record in the PDB file.
1940    *
1941    * The TOC starts out with the number of files.  Then it is followed by
1942    * (npair * 2*sizeof(int)) bytes of information, which are pairs of ints.
1943    * The first one is the size of the record (in bytes), and the second one
1944    * is something else which I haven't figured out yet.
1945    */
1946   pnt = (unsigned int *) toc;
1947   npair = *pnt++;
1948   extent_table = (unsigned short *) ((unsigned int) toc +
1949                                      npair * 2 * sizeof(int) + sizeof(int));
1950
1951   /*
1952    * Sanity check.
1953    */
1954   if( sizeof(int) + 2*sizeof(int)*npair > pdbhdr->toc_len )
1955     {
1956       goto leave;
1957     }
1958   
1959   filelist = (struct file_list *) DBG_alloc(npair * sizeof(*filelist));
1960   if( filelist == NULL )
1961     {
1962       goto leave;
1963     }
1964   memset(filelist, 0, npair * sizeof(*filelist));
1965
1966   nblocks = 0;
1967   for(i=0; i < npair; i++)
1968     {
1969       filelist[i].record_len = pnt[i*2];
1970       filelist[i].nextents   = (filelist[i].record_len + blocksize - 1) 
1971         / blocksize;
1972       filelist[i].extent_list = extent_table + nblocks;
1973       nblocks += filelist[i].nextents;
1974
1975       /*
1976        * These get filled in later when we parse one of the records.
1977        */
1978       filelist[i].linetab_offset = 0;
1979       filelist[i].linetab_len = 0;
1980     }
1981
1982   /*
1983    * OK, now walk through the various records and pick out the bits we
1984    * really want to see.  Some of the records are extra special, and
1985    * we need to handle these a little bit differently.
1986    */
1987   for(i=0; i < npair; i++)
1988     {
1989       if( filelist[i].record_len == 0xffffffff )
1990         {
1991           continue;
1992         }
1993
1994       /*
1995        * Make sure our buffer is large enough to hold the record.
1996        */
1997       if( bufflen < filelist[i].nextents * blocksize )
1998         {
1999           bufflen = filelist[i].nextents * blocksize;
2000           buffer = (char *) DBG_realloc(buffer, bufflen);
2001         }
2002
2003       /*
2004        * Do this just for completeness.  It makes debugging easier
2005        * if we have a clean indication of where the record ends.
2006        */
2007       memset(buffer, 0, filelist[i].nextents * blocksize);
2008
2009       /*
2010        * Next, build the record using the extent list.
2011        */
2012       for(j=0; j < filelist[i].nextents; j++)
2013         {
2014           memcpy(buffer + j * blocksize,
2015                  addr + filelist[i].extent_list[j] * blocksize,
2016                  blocksize);
2017         }
2018
2019       pnt = (unsigned int *) buffer;
2020
2021       /*
2022        * OK, now figure out what to do with it.
2023        */
2024
2025       /*
2026        * Always ignore the first entry.  It seems to contain a backup copy
2027        * of the TOC (the last time the file was modified??)
2028        */
2029       if( i == 0 )
2030         {
2031           continue;
2032         }
2033
2034       /* 
2035        * The second entry as a id block.  It contains a magic number
2036        * to identify the compiler, plus it also contains the timestamp
2037        * which must match the timestamp in the executable.  
2038        */
2039       if( i == 1 )
2040         {
2041
2042           if( ((*pnt != 19950623) && (*pnt != 19950814))
2043               || (filelist[i].record_len != 0x24)
2044               || (pnt[1] != ((struct CodeViewDebug *)(deefer->dbg_info))->cv_timestamp) )
2045             {
2046               goto leave;
2047             }
2048         }
2049
2050       /*
2051        * The third entry contains pointers to the global symbol table,
2052        * plus it also contains additional information about each record
2053        * in the PDB file.
2054        */
2055       if( i == 3 )
2056         {
2057           hd = (struct filetab_hdr *) buffer;
2058
2059           gsym_record = hd->gsym_file;
2060           gsymtab = (char *) DBG_alloc(filelist[gsym_record].nextents 
2061                                       * blocksize);
2062           memset(gsymtab, 0, filelist[gsym_record].nextents * blocksize);
2063           
2064           for(j=0; j < filelist[gsym_record].nextents; j++)
2065             {
2066               memcpy(gsymtab + j * blocksize,
2067                      addr + filelist[gsym_record].extent_list[j] * blocksize,
2068                      blocksize);
2069             }
2070
2071           /*
2072            * This record also contains information about where in the
2073            * remaining records we will be able to find the start of the
2074            * line number table.  We could locate that bit using heuristics,
2075            * but since we have the info handy, we might as well use it.
2076            */
2077           offset = sizeof(*hd);
2078           while(1==1)
2079             {
2080               fent = (struct file_ent *) (buffer + offset);
2081               if( offset > hd->ftab_len )
2082                 {
2083                   break;
2084                 }
2085
2086               if( fent->file_number == 0 || fent->file_number >= npair )
2087                 {
2088                   break;
2089                 }
2090
2091               filelist[fent->file_number].linetab_offset = 
2092                 fent->linetab_offset;
2093               filelist[fent->file_number].linetab_len = 
2094                 fent->linetab_len;
2095               /*
2096                * Figure out the offset of the next entry.
2097                * There is a fixed part of the record and a variable
2098                * length filename which we must also skip past.
2099                */
2100               offset += ((unsigned int) &fent->filename - (unsigned int) fent)
2101                 + strlen(fent->filename) + 1;
2102               offset += strlen(buffer+offset) + 1;
2103               offset = (offset + 3) & ~3;
2104             }
2105         }
2106       
2107
2108       /*
2109        * Two different magic numbers used as dates.
2110        * These indicate the 'type' table.
2111        */
2112       if(       *pnt == 19950410
2113              || *pnt == 19951122 )
2114         {
2115           DEBUG_ParseTypeTable(buffer, filelist[i].record_len);
2116           continue;
2117         }
2118
2119       /*
2120        * This is something we really want to look at, since it contains
2121        * real debug info.  Anything that doesn't match this can be
2122        * ignored for now.
2123        */
2124       if( *pnt == 1 )
2125         {
2126           /*
2127            * First, snag the line table, if we have one.  This always
2128            * occurs at the end of the record, so we take the linetab
2129            * offset as the end of the normal part of the record.
2130            */
2131           linetab = NULL;
2132           if( filelist[i].linetab_len != 0 )
2133             {
2134               linetab = DEBUG_SnarfLinetab(buffer + filelist[i].linetab_offset,
2135                                            filelist[i].linetab_len);
2136               DEBUG_SnarfCodeView(deefer, buffer,
2137                                   filelist[i].linetab_offset,
2138                                   linetab);
2139             }
2140           else
2141             {
2142               DEBUG_SnarfCodeView(deefer, buffer,
2143                                   filelist[i].record_len,
2144                                   linetab);
2145             }
2146           continue;
2147         }
2148     }
2149
2150   /*
2151    * Finally, process the global symbol table itself.  There isn't
2152    * a line number component to this, so we just toss everything
2153    * into the mix and it all should work out.
2154    */
2155   if( gsym_record != 0 )
2156     {
2157       DEBUG_SnarfCodeView(deefer, gsymtab - sizeof(int), 
2158                           filelist[gsym_record].record_len,
2159                           NULL);
2160     }
2161   
2162 leave:
2163
2164   if( gsymtab != NULL )
2165     {
2166       DBG_free(gsymtab);
2167       gsymtab = NULL;
2168     }
2169
2170   if( buffer != NULL )
2171     {
2172       DBG_free(buffer);
2173     }
2174
2175   if( filelist != NULL )
2176     {
2177       DBG_free(filelist);
2178     }
2179
2180   if( addr != (char *) 0xffffffff )
2181     {
2182       munmap(addr, statbuf.st_size);
2183     }
2184
2185   if( fd != -1 )
2186     {
2187       close(fd);
2188     }
2189
2190   return TRUE;
2191 }
2192
2193 /*
2194  * Process DBG file which contains debug information.
2195  */
2196 /* static */
2197 int
2198 DEBUG_ProcessDBGFile(struct deferred_debug_info * deefer, char * filename)
2199 {
2200   char                        * addr = (char *) 0xffffffff;
2201   char                        * codeview;
2202   struct CV4_DirHead          * codeview_dir;
2203   struct CV4_DirEnt           * codeview_dent;
2204   PIMAGE_DEBUG_DIRECTORY        dbghdr;
2205   struct deferred_debug_info    deefer2;
2206   int                           fd = -1;
2207   int                           i;
2208   int                           j;
2209   struct codeview_linetab_hdr * linetab;
2210   int                           nsect;
2211   PIMAGE_SEPARATE_DEBUG_HEADER pdbg = NULL;
2212   IMAGE_SECTION_HEADER        * sectp;
2213   struct stat                   statbuf;
2214   int                           status;
2215   char                          dbg_file[MAX_PATHNAME_LEN];
2216
2217   LocateDebugInfoFile(filename, dbg_file);
2218   status = stat(dbg_file, &statbuf);
2219   if( status == -1 )
2220     {
2221       fprintf(stderr, "-Unable to open .DBG file %s\n", dbg_file);
2222       goto leave;
2223     }
2224
2225   /*
2226    * Now open the file, so that we can mmap() it.
2227    */
2228   fd = open(dbg_file, O_RDONLY);
2229   if( fd == -1 )
2230     {
2231       fprintf(stderr, "Unable to open .DBG file %s\n", dbg_file);
2232       goto leave;
2233     }
2234
2235
2236   /*
2237    * Now mmap() the file.
2238    */
2239   addr = mmap(0, statbuf.st_size, PROT_READ, 
2240               MAP_PRIVATE, fd, 0);
2241   if( addr == (char *) 0xffffffff )
2242     {
2243       fprintf(stderr, "Unable to mmap .DBG file %s\n", dbg_file);
2244       goto leave;
2245     }
2246
2247   pdbg = (PIMAGE_SEPARATE_DEBUG_HEADER) addr;
2248
2249   if( pdbg->TimeDateStamp != deefer->dbgdir->TimeDateStamp )
2250     {
2251       fprintf(stderr, "Warning - %s has incorrect internal timestamp\n",
2252               dbg_file);
2253 /*      goto leave; */
2254 /*
2255    Well, sometimes this happens to DBG files which ARE REALLY the right .DBG
2256    files but nonetheless this check fails. Anyway, WINDBG (debugger for
2257    Windows by Microsoft) loads debug symbols which have incorrect timestamps.
2258 */
2259    }
2260
2261   fprintf(stderr, "Processing symbols from %s...\n", dbg_file);
2262
2263   dbghdr = (PIMAGE_DEBUG_DIRECTORY) (  addr + sizeof(*pdbg) 
2264                  + pdbg->NumberOfSections * sizeof(IMAGE_SECTION_HEADER) 
2265                  + pdbg->ExportedNamesSize);
2266
2267   sectp = (PIMAGE_SECTION_HEADER) ((char *) pdbg + sizeof(*pdbg));
2268   nsect = pdbg->NumberOfSections;
2269
2270   for( i=0; i < pdbg->DebugDirectorySize / sizeof(*pdbg); i++, dbghdr++ )
2271     {
2272       switch(dbghdr->Type)
2273                 {
2274                 case IMAGE_DEBUG_TYPE_COFF:
2275                   /*
2276                    * Dummy up a deferred debug header to handle the
2277                    * COFF stuff embedded within the DBG file.
2278                    */
2279                   memset((char *) &deefer2, 0, sizeof(deefer2));
2280                   deefer2.dbg_info = (addr + dbghdr->PointerToRawData);
2281                   deefer2.dbg_size = dbghdr->SizeOfData;
2282                   deefer2.load_addr = deefer->load_addr;
2283
2284                   DEBUG_ProcessCoff(&deefer2);
2285                   break;
2286                 case IMAGE_DEBUG_TYPE_CODEVIEW:
2287                   /*
2288                    * This is the older format by which codeview stuff is 
2289                    * stored, known as the 'NB09' format.  Newer executables
2290                    * and dlls created by VC++ use PDB files instead, which
2291                    * have lots of internal similarities, but the overall
2292                    * format and structure is quite different.
2293                    */
2294                   codeview = (addr + dbghdr->PointerToRawData);
2295
2296                   /*
2297                    * The first thing in the codeview section should be
2298                    * an 'NB09' identifier.  As a sanity check, make sure
2299                    * it is there.
2300                    */
2301                   if( *((unsigned int*) codeview) != 0x3930424e )
2302                     {
2303                       break;
2304                     }
2305                   
2306                   /*
2307                    * Next we need to find the directory.  This is easy too.
2308                    */
2309                   codeview_dir = (struct CV4_DirHead *) 
2310                     (codeview + ((unsigned int*) codeview)[1]);
2311
2312                   /*
2313                    * Some more sanity checks.  Make sure that everything
2314                    * is as we expect it.
2315                    */
2316                   if( codeview_dir->next_offset != 0 
2317                       || codeview_dir->dhsize != sizeof(*codeview_dir)
2318                       || codeview_dir->desize != sizeof(*codeview_dent) )
2319                     {
2320                       break;
2321                     }
2322                   codeview_dent = (struct CV4_DirEnt *) (codeview_dir + 1);
2323
2324                   for(j=0; j < codeview_dir->ndir; j++, codeview_dent++)
2325                     {
2326                       if( codeview_dent->subsect_number == sstAlignSym )
2327                         {
2328                           /*
2329                            * Check the previous entry.  If it is a
2330                            * sstSrcModule, it contains the line number
2331                            * info for this file.
2332                            */
2333                           linetab = NULL;
2334                           if( codeview_dent[1].module_number == codeview_dent[0].module_number
2335                               && codeview_dent[1].subsect_number == sstSrcModule )
2336                             {
2337                               linetab = DEBUG_SnarfLinetab(
2338                                            codeview + codeview_dent[1].offset,
2339                                            codeview_dent[1].size);
2340                             }
2341
2342                           if( codeview_dent[-1].module_number == codeview_dent[0].module_number
2343                               && codeview_dent[-1].subsect_number == sstSrcModule )
2344                             {
2345                               linetab = DEBUG_SnarfLinetab(
2346                                            codeview + codeview_dent[-1].offset,
2347                                            codeview_dent[-1].size);
2348                             }
2349                           /*
2350                            * Now process the CV stuff.
2351                            */
2352                           DEBUG_SnarfCodeView(deefer, 
2353                                               codeview + codeview_dent->offset,
2354                                               codeview_dent->size,
2355                                               linetab);
2356                         }
2357                     }
2358
2359                   break;
2360                 default:
2361                   break;
2362                 }
2363     }
2364 leave:
2365
2366   if( addr != (char *) 0xffffffff )
2367     {
2368       munmap(addr, statbuf.st_size);
2369     }
2370
2371   if( fd != -1 )
2372     {
2373       close(fd);
2374     }
2375
2376   return TRUE;
2377 }
2378
2379 int
2380 DEBUG_ProcessDeferredDebug()
2381 {
2382   struct deferred_debug_info * deefer;
2383   struct CodeViewDebug       * cvd;
2384   struct MiscDebug           * misc;
2385   char                       * filename;
2386   int                          last_proc = -1;
2387   int                          need_print =0;
2388
2389   DEBUG_InitCVDataTypes();
2390
2391   for(deefer = dbglist; deefer; deefer = deefer->next)
2392     {
2393       if( deefer->loaded )
2394         {
2395           continue;
2396         }
2397
2398       if( last_proc != deefer->dbg_index )
2399         {
2400           if (!need_print)
2401             {
2402               fprintf(stderr, "DeferredDebug for:");
2403               need_print=1;
2404             }
2405           fprintf(stderr, " %s",deefer->module_name);
2406           last_proc = deefer->dbg_index;
2407         }
2408
2409       switch(deefer->dbgdir->Type)
2410         {
2411         case IMAGE_DEBUG_TYPE_COFF:
2412           /*
2413            * Standard COFF debug information that VC++ adds when you
2414            * use /debugtype:both with the linker.
2415            */
2416 #if 0
2417           fprintf(stderr, "Processing COFF symbols...\n");
2418 #endif
2419           DEBUG_ProcessCoff(deefer);
2420           break;
2421         case IMAGE_DEBUG_TYPE_CODEVIEW:
2422           /*
2423            * This is a pointer to a PDB file of some sort.
2424            */
2425           cvd = (struct CodeViewDebug *) deefer->dbg_info;
2426
2427           if( strcmp(cvd->cv_nbtype, "NB10") != 0 )
2428             {
2429               /*
2430                * Whatever this is, we don't know how to deal with
2431                * it yet.
2432                */
2433               break;
2434             }
2435           DEBUG_ProcessPDBFile(deefer, cvd->cv_name);
2436 #if 0
2437           fprintf(stderr, "Processing PDB file %s\n", cvd->cv_name);
2438 #endif
2439           break;
2440         case IMAGE_DEBUG_TYPE_MISC:
2441           /*
2442            * A pointer to a .DBG file of some sort.  These files
2443            * can contain either CV4 or COFF information.  Open
2444            * the file, and try to do the right thing with it.
2445            */
2446           misc = (struct MiscDebug *) deefer->dbg_info;
2447
2448           filename = strrchr((char *) &misc->Data, '.');
2449
2450           /*
2451            * Ignore the file if it doesn't have a .DBG extension.
2452            */
2453           if(    (filename == NULL)
2454               || (    (strcmp(filename, ".dbg") != 0)
2455                    && (strcmp(filename, ".DBG") != 0)) )
2456             {
2457               break;
2458             }
2459
2460           filename = (char *) &misc->Data;
2461
2462           /*
2463            * Do the dirty deed...
2464            */
2465           DEBUG_ProcessDBGFile(deefer, filename);
2466       
2467           break;
2468         default:
2469           /*
2470            * We should never get here...
2471            */
2472           break;
2473         }
2474     }
2475       if(need_print)
2476        fprintf(stderr, "\n");
2477   return TRUE;
2478
2479 }
2480
2481 /***********************************************************************
2482  *           DEBUG_InfoShare
2483  *
2484  * Display shared libarary information.
2485  */
2486 void DEBUG_InfoShare(void)
2487 {
2488   struct deferred_debug_info * deefer;
2489
2490   fprintf(stderr,"Address\t\tModule\tName\n");
2491
2492   for(deefer = dbglist; deefer; deefer = deefer->next)
2493   {
2494       fprintf(stderr,"0x%8.8x\t(%s)\t%s\n", (unsigned int) deefer->load_addr,
2495               deefer->module ? "Win32" : "ELF", deefer->module_name);
2496   }
2497 }
2498