annotate src/codeview/parser.d @ 1:4a9dcbd9e54f

-files of 0.13 beta -fixes so that it now compiles with the current dmd version
author marton@basel.hu
date Tue, 05 Apr 2011 20:44:01 +0200
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1 /* Ddbg - Win32 Debugger for the D programming language
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
2 * Copyright (c) 2007 Jascha Wetzel
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
3 * All rights reserved. See LICENSE.TXT for details.
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
4 */
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
5
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
6 module codeview.parser;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
7
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
8 import codeview.codeview;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
9 import codeview.decl;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
10 import codeview.coff;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
11
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
12 import util;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
13 import container;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
14
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
15 import std.demangle;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
16 import std.string;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
17
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
18 class CodeViewException : Exception
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
19 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
20 this(string msg) { super(msg); }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
21 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
22
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
23 class CodeViewParser
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
24 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
25 const uint cv_nb09_sig = intFromStr("NB09");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
26
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
27 static:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
28 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
29 Parses the given CodeView section data from the given COFF image.
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
30 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
31 CodeView parse(COFFImage img, ubyte[] data)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
32 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
33 if ( data.length <= 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
34 return null;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
35 CodeView cv = new CodeView;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
36
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
37 cv.image = img;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
38 cv.global_pub = new SymbolSet;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
39 cv.global_sym = new SymbolSet;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
40 cv.static_sym = new SymbolSet;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
41
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
42 DataReader dr = new DataReader(data);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
43 uint sig;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
44 dr.read(sig);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
45 if ( sig != cv_nb09_sig ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
46 char[4] sigstr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
47 sigstr[] = (cast(char*)&sig)[0..4];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
48 debug DbgIO.println("Unsupported CodeView version %s", sigstr);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
49 return null;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
50 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
51
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
52 uint lfoDir;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
53 dr.read(lfoDir);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
54 dr.seek(lfoDir);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
55
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
56 ubyte[] buf;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
57 dr.readA(buf, DirHeader.sizeof);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
58 DirHeader* head = cast(DirHeader*)buf.ptr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
59 assert(head.cbDirHeader==DirHeader.sizeof);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
60 assert(head.cbDirEntry==DirEntry.sizeof);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
61
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
62 DirEntry[] entries;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
63 dr.readA(entries, head.cDir);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
64
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
65 foreach ( DirEntry entry; entries )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
66 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
67 ubyte[] section_data;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
68 dr.seek(entry.lfo);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
69 dr.readA(section_data, entry.cb);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
70
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
71 switch ( entry.subsection )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
72 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
73 case sstModule:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
74 Module mod = parseModule(cv, section_data);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
75 assert ( entry.iMod-1 == cv.modulesByIndex.length );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
76 cv.modulesByIndex ~= mod;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
77 cv.modulesByName[mod.name] = mod;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
78 debug(cvsections) DbgIO.println("sstModule section \"%s\"", mod.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
79 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
80 case sstAlignSym:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
81 debug(cvsections) DbgIO.println("sstAlignSym section");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
82 assert ( entry.iMod <= cv.modulesByIndex.length );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
83 Module mod = cv.modulesByIndex[entry.iMod-1];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
84 parseSymbols(cv, section_data, mod.symbols, true, mod);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
85 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
86 case sstSrcModule:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
87 debug(cvsections) DbgIO.println("sstSrcModule section");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
88 assert( entry.iMod <= cv.modulesByIndex.length );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
89 parseSrcModule(cv, section_data, cv.modulesByIndex[entry.iMod-1]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
90 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
91 case sstLibraries:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
92 debug(cvsections) DbgIO.println("sstLibraries section");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
93 parseLibraries(cv, section_data);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
94 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
95 case sstGlobalSym:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
96 debug(cvsections) DbgIO.println("sstGlobalSym section");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
97 parsePackedSymbols(cv, section_data, cv.global_sym);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
98 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
99 case sstGlobalPub:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
100 debug(cvsections) DbgIO.println("sstGlobalPub section");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
101 parsePackedSymbols(cv, section_data, cv.global_pub);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
102 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
103 case sstStaticSym:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
104 debug(cvsections) DbgIO.println("sstStaticSym section");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
105 parsePackedSymbols(cv, section_data, cv.static_sym);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
106 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
107 case sstGlobalTypes:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
108 debug(cvsections) DbgIO.println("sstGlobalTypes section");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
109 parseGlobalTypes(cv, section_data, entry.lfo);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
110 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
111 case sstSegMap:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
112 debug(cvsections) DbgIO.println("sstSegMap section");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
113 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
114 case sstSegName:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
115 debug(cvsections) DbgIO.println("sstSegName section");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
116 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
117 case sstFileIndex:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
118 debug(cvsections) DbgIO.println("sstFileIndex section");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
119 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
120 case sstSymbols:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
121 case sstTypes:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
122 case sstPublic:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
123 case sstPublicSym:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
124 case sstSrcLnSeg:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
125 case sstMPC:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
126 case sstPreComp:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
127 case sstPreCompMap:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
128 case sstOffsetMap16:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
129 case sstOffsetMap32:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
130 debug DbgIO.println("Unprocessed CV section 0x%x", entry.subsection);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
131 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
132 default:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
133 debug DbgIO.println("Unknown CV section 0x%x", entry.subsection);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
134 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
135 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
136
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
137 updateSymbols(cv, cv.global_pub.named_symbols);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
138 updateSymbols(cv, cv.global_sym.named_symbols);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
139 updateSymbols(cv, cv.static_sym.named_symbols);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
140 foreach ( m; cv.modulesByIndex )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
141 updateSymbols(cv, m.symbols.named_symbols);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
142
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
143 cv.globalNamedSymbols = new AVLTree!(NamedSymbol);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
144 foreach ( ns; cv.global_sym.named_symbols )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
145 cv.globalNamedSymbols.insert(ns);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
146 foreach ( ns; cv.global_pub.named_symbols )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
147 cv.globalNamedSymbols.insert(ns);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
148 foreach ( ns; cv.static_sym.named_symbols )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
149 cv.globalNamedSymbols.insert(ns);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
150
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
151 cv.updateCodeblocks();
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
152
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
153 return cv;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
154 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
155
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
156 private:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
157 T min(T)(T a, T b)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
158 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
159 return a<b?a:b;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
160 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
161
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
162 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
163 Parse a Module from the given data.
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
164 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
165 Module parseModule(CodeView cv, ubyte[] data)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
166 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
167 if ( data.length <= 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
168 throw new CodeViewException("parseModule on empty data");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
169 DataReader dr = new DataReader(data);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
170 Module mod = new Module(cv);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
171 ubyte[] buf;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
172 dr.readA(buf, ModuleHeader.sizeof);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
173 mod.header = cast(ModuleHeader*)buf.ptr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
174 assert(mod.header.Style==intFromStr("CV"));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
175 dr.readA!(SegInfo)(mod.seginfos, mod.header.cSeg);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
176 dr.read(mod.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
177 return mod;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
178 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
179
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
180 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
181
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
182 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
183 void parseSymbols(CodeView cv, ubyte[] data, SymbolSet symbols, bool skip_to_ssearch=false, Module mod=null)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
184 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
185 if ( data.length <= 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
186 throw new CodeViewException("parseSymbols on empty data");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
187 DataReader dr = new DataReader(data);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
188
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
189 uint num_sym;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
190
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
191 // skip until S_SSEARCH symbol is found
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
192 while ( skip_to_ssearch && dr.available )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
193 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
194 ushort length, index;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
195 dr.read(length);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
196 dr.read(index);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
197 if ( index == SymbolIndex.S_SSEARCH ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
198 dr.relseek(-4);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
199 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
200 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
201 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
202
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
203 uint sym_off;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
204 bool expecting_arguments=false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
205 ScopeSymbol[uint] scope_syms;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
206 ScopeSymbol parent_scope;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
207
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
208 while ( dr.available )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
209 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
210 ushort length, index;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
211 uint next_symbol, symbol_start;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
212
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
213 void addSymbol(Symbol sym)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
214 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
215 assert( !expecting_arguments || parent_scope !is null );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
216 if ( parent_scope !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
217 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
218 if ( expecting_arguments )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
219 (cast(ProcedureSymbol)parent_scope).arguments.add(sym);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
220 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
221 parent_scope.symbols.add(sym);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
222 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
223 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
224 symbols.add(sym);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
225 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
226
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
227 symbol_start = dr.cursor;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
228 dr.read(length);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
229 next_symbol = dr.cursor+length;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
230 if ( next_symbol > dr.data.length ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
231 debug DbgIO.println("WARNING: length %d for symbol exceeds block size %d - skipping section", length, dr.data.length);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
232 if ( mod !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
233 debug DbgIO.println("in module %s", mod.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
234 return;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
235 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
236 dr.read(index);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
237
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
238 ubyte[] buf;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
239 switch ( index )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
240 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
241 case SymbolIndex.S_COMPILE:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
242 ubyte machine,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
243 language;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
244 ushort flags;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
245 dr.read(machine);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
246 dr.read(language);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
247 dr.read(flags);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
248 string version_string;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
249 dr.read(version_string);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
250 debug(cvsymbols) DbgIO.println("machine: 0x%x, language: %d, flags: 0x%x, version: %s", machine, language, flags, version_string);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
251 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
252 case SymbolIndex.S_SSEARCH:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
253 dr.read(sym_off);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
254 ushort pe_section;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
255 dr.read(pe_section);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
256 if ( mod !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
257 mod.pe_section = pe_section;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
258 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
259 case SymbolIndex.S_END:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
260 debug(cvsymbols) DbgIO.println("S_END");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
261 if ( parent_scope !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
262 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
263 if ( parent_scope.parent_scope !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
264 parent_scope = parent_scope.parent_scope;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
265 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
266 parent_scope = null;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
267 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
268 else {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
269 debug DbgIO.println("S_END with no active parent scope");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
270 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
271 expecting_arguments = false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
272 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
273 case SymbolIndex.S_ENDARG:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
274 expecting_arguments = false;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
275 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
276 case SymbolIndex.S_RETURN:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
277 dr.readA(buf, CVReturnSymbol.sizeof);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
278 ReturnSymbol rsym = new ReturnSymbol(cast(CVReturnSymbol*)buf.ptr);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
279 if ( rsym.cvdata.style == 1 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
280 ubyte count;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
281 dr.read(count);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
282 dr.readA!(ubyte)(rsym.registers, count);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
283 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
284 ProcedureSymbol psym = cast(ProcedureSymbol)parent_scope;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
285 assert(psym !is null);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
286 psym.return_sym = rsym;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
287 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
288 case SymbolIndex.S_LPROC32:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
289 case SymbolIndex.S_GPROC32:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
290 dr.readA(buf, CVProcedureSymbol.sizeof);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
291 ProcedureSymbol psym = new ProcedureSymbol(cast(SymbolIndex)index, symbol_start, cast(CVProcedureSymbol*)buf.ptr);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
292 dr.read(psym.mangled_name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
293 psym.name_notype = demangleName(psym.mangled_name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
294 psym.name_type = demangle(psym.mangled_name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
295 debug(cvsymbols) DbgIO.println("PROC32 %s (%s) s:%x o:%x", psym.name_type, psym.name_notype, psym.cvdata.segment, psym.cvdata.offset);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
296 scope_syms[symbol_start] = psym;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
297 addSymbol(psym);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
298 assert ( parent_scope is null || psym.cvdata.pParent==parent_scope.lfo );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
299 if ( psym.cvdata.pParent in scope_syms )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
300 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
301 psym.parent_scope = scope_syms[psym.cvdata.pParent];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
302 psym.parent_scope.symbols.add(psym);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
303 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
304 parent_scope = psym;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
305 expecting_arguments = true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
306 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
307 case SymbolIndex.S_BPREL32:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
308 dr.readA(buf, CVStackSymbol.sizeof);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
309 StackSymbol stsym = new StackSymbol(cast(CVStackSymbol*)buf.ptr);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
310 dr.read(stsym.mangled_name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
311 stsym.name_notype = demangleName(stsym.mangled_name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
312 stsym.name_type = demangle(stsym.mangled_name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
313 debug(cvsymbols) DbgIO.println(
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
314 "BPREL32 %s%s [%s] 0x%x o:%d", parent_scope !is null?"("~parent_scope.name_type~") ":"",
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
315 stsym.name_type, stsym.name_notype, stsym.cvtype, cast(int)stsym.cvdata.offset
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
316 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
317 addSymbol(stsym);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
318 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
319 case SymbolIndex.S_LDATA32:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
320 case SymbolIndex.S_GDATA32:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
321 case SymbolIndex.S_PUB32:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
322 dr.readA(buf, CVDataSymbol.sizeof);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
323 DataSymbol dsym = new DataSymbol(cast(SymbolIndex)index, cast(CVDataSymbol*)buf.ptr);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
324 dr.read(dsym.mangled_name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
325 dsym.name_notype = demangleName(dsym.mangled_name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
326 dsym.name_type = demangle(dsym.mangled_name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
327 debug(cvsymbols) DbgIO.println("[LG]DATA|PUB32 %s (%s) s:%x o:%x t:0x%x", dsym.name_type, dsym.name_notype, dsym.cvdata.segment, dsym.offset, dsym.cvtype);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
328 addSymbol(dsym);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
329 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
330 case SymbolIndex.S_ALIGN:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
331 debug(cvsymbols) DbgIO.println("ALIGN");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
332 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
333 case SymbolIndex.S_UDT:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
334 UserDefinedType udt = new UserDefinedType;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
335 dr.read(udt.type_index);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
336 dr.read(udt.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
337 cv.udtypes ~= udt;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
338 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
339 case SymbolIndex.S_PROCREF:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
340 case SymbolIndex.S_DATAREF:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
341 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
342 case SymbolIndex.S_REGISTER:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
343 case SymbolIndex.S_CONSTANT:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
344 case SymbolIndex.S_SKIP:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
345 case SymbolIndex.S_CVRESERVE:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
346 case SymbolIndex.S_OBJNAME:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
347 case SymbolIndex.S_COBOLUDT:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
348 case SymbolIndex.S_MANYREG:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
349 case SymbolIndex.S_ENTRYTHIS:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
350 case SymbolIndex.S_BPREL16:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
351 case SymbolIndex.S_LDATA16:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
352 case SymbolIndex.S_PUB16:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
353 case SymbolIndex.S_LPROC16:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
354 case SymbolIndex.S_GPROC16:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
355 case SymbolIndex.S_THUNK16:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
356 case SymbolIndex.S_BLOCK16:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
357 case SymbolIndex.S_WITH16:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
358 case SymbolIndex.S_LABEL16:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
359 case SymbolIndex.S_CEXMODEL16:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
360 case SymbolIndex.S_VFTPATH16:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
361 case SymbolIndex.S_REGREL16:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
362 case SymbolIndex.S_GDATA16:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
363 case SymbolIndex.S_THUNK32:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
364 case SymbolIndex.S_BLOCK32:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
365 case SymbolIndex.S_WITH32:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
366 case SymbolIndex.S_LABEL32:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
367 case SymbolIndex.S_CEXMODEL32:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
368 case SymbolIndex.S_VFTPATH32:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
369 case SymbolIndex.S_REGREL32:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
370 case SymbolIndex.S_LTHREAD32:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
371 case SymbolIndex.S_GTHREAD32:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
372 debug DbgIO.println("unprocessed symbol index 0x%x", index);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
373 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
374 default:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
375 debug DbgIO.println("unknown symbol index 0x%x", index);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
376 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
377
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
378 dr.seek(next_symbol);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
379 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
380 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
381
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
382 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
383
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
384 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
385 void parseSrcModule(CodeView cv, ubyte[] data, Module mod)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
386 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
387 if ( data.length <= 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
388 throw new CodeViewException("parseSrcModule on empty data");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
389 DataReader dr = new DataReader(data);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
390 ushort cFile, cSeg;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
391 dr.read(cFile);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
392 dr.read(cSeg);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
393
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
394 SourceModule smod = new SourceModule;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
395 mod.source_module = smod;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
396 cv.source_modules ~= smod;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
397
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
398 uint[] baseSrcFile,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
399 start_end;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
400 ushort[] seginds;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
401 dr.readA(baseSrcFile, cast(uint)cFile);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
402 dr.readA(start_end, cast(uint)cSeg*2);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
403 dr.readA(seginds, cast(uint)cSeg);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
404 debug(cvparser) DbgIO.println("Module %s files=%d segs=%d", mod.name, cFile, cSeg);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
405
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
406 foreach ( fileoffset; baseSrcFile )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
407 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
408 dr.seek(fileoffset);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
409 dr.read(cSeg);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
410 ushort pad;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
411 dr.read(pad);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
412
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
413 SourceFile file = new SourceFile;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
414 file.source_module = smod;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
415 uint[] baseSrcLn;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
416 dr.readA(baseSrcLn, cast(uint)cSeg);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
417 start_end = null;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
418 dr.readA(start_end, cast(uint)cSeg*2);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
419 dr.read(file.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
420 debug(cvparser) DbgIO.println("\tFile %s segs=%d", file.name, cSeg);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
421 smod.files ~= file;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
422
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
423 foreach ( int i, segoff; baseSrcLn )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
424 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
425 dr.seek(segoff);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
426 SourceSegment seg = new SourceSegment;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
427 file.segments ~= seg;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
428 seg.file = file;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
429
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
430 seg.start = start_end[i*2];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
431 seg.end = start_end[i*2+1];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
432
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
433 dr.read(pad); // segment index
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
434 ushort cPair;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
435 dr.read(cPair);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
436 debug(cvparser) DbgIO.println("\t\tSegment %d lines=%d", file.segments.length-1, cPair);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
437
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
438 uint[] offset;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
439 ushort[] linenumber;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
440 dr.readA(offset, cast(uint)cPair);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
441 dr.readA(linenumber, cast(uint)cPair);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
442
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
443 foreach ( int j, l; linenumber ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
444 CodeBlock cb = new CodeBlock(offset[j], l, seg);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
445 file.blocks_by_line[l] ~= cb;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
446 debug(cvparser)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
447 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
448 bool inserted = cv.codeblocks.insert(cb);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
449 if ( !inserted )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
450 DbgIO.println("failed to insert block %s, already exists", cb);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
451 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
452 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
453 cv.codeblocks.insert(cb);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
454 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
455 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
456
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
457 file.lines = file.blocks_by_line.keys.dup.sort;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
458 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
459 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
460
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
461 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
462
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
463 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
464 void parseLibraries(CodeView cv, ubyte[] data)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
465 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
466 if ( data.length <= 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
467 throw new CodeViewException("parseLibraries on empty data");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
468 DataReader dr = new DataReader(data);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
469 while ( dr.available ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
470 string lib;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
471 dr.read(lib);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
472 cv.libraries ~= lib;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
473 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
474 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
475
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
476 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
477
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
478 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
479 void parsePackedSymbols(CodeView cv, ubyte[] data, SymbolSet symbols)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
480 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
481 if ( data.length <= 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
482 throw new CodeViewException("parsePackedSymbols on empty data");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
483 DataReader dr = new DataReader(data);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
484
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
485 ubyte[] buf;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
486 dr.readA(buf, PackedSymbolsHeader.sizeof);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
487 PackedSymbolsHeader* gsh = cast(PackedSymbolsHeader*)buf.ptr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
488
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
489 dr.readA(buf, gsh.cbSymbol);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
490 parseSymbols(cv, buf, symbols);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
491 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
492
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
493 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
494
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
495 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
496 void parseGlobalTypes(CodeView cv, ubyte[] data, uint absolute_offset)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
497 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
498 DataReader dr = new DataReader(data);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
499 uint flags,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
500 cType;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
501 uint[] offType;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
502 dr.read(flags);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
503 dr.read(cType);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
504 dr.readA(offType, cType);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
505
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
506 uint base = dr.cursor;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
507 foreach ( off; offType )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
508 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
509 dr.seek(base+off);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
510 ushort len;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
511 dr.read(len);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
512 ubyte[] buf;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
513 dr.readA(buf, cast(uint)len);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
514 cv.type_strings ~= parseTypeString(cv, buf);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
515 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
516 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
517
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
518 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
519
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
520 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
521 Leaf[] parseTypeString(CodeView cv, ubyte[] data)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
522 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
523 debug(cvdump) foreach ( b; data )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
524 DbgIO.print("%02x ", b);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
525 debug(cvdump) DbgIO.println("");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
526 DataReader dr = new DataReader(data);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
527 Leaf[] leafs;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
528 bool first = true;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
529 while ( dr.available )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
530 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
531 ushort leaf_index;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
532 dr.read(leaf_index);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
533 Leaf l;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
534 // debug(cvparser) DbgIO.println("parsing 0x%x", leaf_index);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
535 switch ( leaf_index )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
536 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
537 case LF_MODIFIER_16t:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
538 LeafModifer lm = new LeafModifer;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
539 l = lm;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
540 dr.read(lm.attribute);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
541 dr.read(lm.index);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
542 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
543 case LF_POINTER_16t:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
544 LeafPointer lp = new LeafPointer;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
545 l = lp;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
546 dr.read(lp.attribute);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
547 dr.read(lp.type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
548 switch ( lp.attribute&0x1f )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
549 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
550 case 0:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
551 case 10:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
552 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
553 default:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
554 debug DbgIO.println("unprocessed pointer type: 0x%x", lp.attribute);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
555 assert(0);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
556 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
557 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
558 case LF_ARRAY_16t:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
559 LeafArray la = new LeafArray;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
560 l = la;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
561 dr.read(la.elemtype);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
562 dr.read(la.idxtype);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
563 la.length = parseNumericLeaf(dr);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
564 dr.read(la.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
565 debug(cvparser) DbgIO.println("LF_ARRAY: %d 0x%x", la.length.getUint, 0x1000+cv.type_strings.length);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
566 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
567 case LF_PROCEDURE_16t:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
568 LeafProcedure lp = new LeafProcedure;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
569 l = lp;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
570 dr.read(lp.rvtype);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
571 dr.read(lp.call);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
572 dr.read(lp.reserved);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
573 dr.read(lp.cParms);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
574 dr.read(lp.arglist);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
575 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
576 case LF_MFUNCTION_16t:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
577 LeafMFunction lmf = new LeafMFunction;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
578 l = lmf;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
579 dr.read(lmf.rvtype);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
580 dr.read(lmf._class);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
581 dr.read(lmf._this);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
582 dr.read(lmf.call);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
583 dr.read(lmf.reserved);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
584 dr.read(lmf.cParms);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
585 dr.read(lmf.arglist);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
586 dr.read(lmf.thisadjust);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
587 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
588 case LF_VTSHAPE:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
589 LeafVTShape lvts = new LeafVTShape;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
590 l = lvts;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
591 ushort count;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
592 dr.read(count);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
593 dr.readA(lvts.descriptor, cast(uint)(count+1)>>1);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
594 // skip rest of typestring
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
595 dr.seek(dr.data.length);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
596 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
597 case LF_CLASS_16t:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
598 case LF_STRUCTURE_16t:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
599 LeafClassStruc lcs = new LeafClassStruc;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
600 l = lcs;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
601 dr.read(lcs.count);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
602 dr.read(lcs.field);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
603 dr.read(lcs.property);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
604 dr.read(lcs.dList);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
605 dr.read(lcs.vshape);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
606 lcs.length = parseNumericLeaf(dr);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
607 dr.read(lcs.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
608 lcs.type = cast(ushort)(0x1000+cv.type_strings.length);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
609 debug(cvparser) DbgIO.println(
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
610 "%s 0x%x '%s' fl: 0x%x prop: 0x%x, length=0x%x", leaf_index==LF_CLASS_16t?"class":"struct",
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
611 lcs.type, lcs.name, lcs.field, lcs.property, lcs.length.getUint
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
612 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
613
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
614 cv.UDTsByName[lcs.name] = lcs;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
615 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
616 case LF_ENUM_16t:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
617 LeafEnum le = new LeafEnum;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
618 l = le;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
619 dr.read(le.count);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
620 dr.read(le.type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
621 dr.read(le.field);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
622 dr.read(le.property);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
623 dr.read(le.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
624 debug(cvparser) DbgIO.println(
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
625 "enum 0x%x '%s' type: 0x%x fl: 0x%x prop: 0x%x", 0x1000+cv.type_strings.length, le.name, le.type, le.field, le.property
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
626 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
627 cv.UDTsByName[le.name] = le;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
628 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
629 case LF_UNION_16t:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
630 LeafUnion lu = new LeafUnion;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
631 l = lu;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
632 dr.read(lu.count);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
633 dr.read(lu.field);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
634 dr.read(lu.property);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
635 lu.length = parseNumericLeaf(dr);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
636 dr.read(lu.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
637 // skip rest of typestring
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
638 dr.seek(dr.data.length);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
639 debug(cvparser) DbgIO.println("Union '%s' count %d fields 0x%x length 0x%x", lu.name, lu.count, lu.field, lu.length.getUint);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
640 cv.UDTsByName[lu.name] = lu;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
641 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
642 case LF_OEM_16t:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
643 ushort oem;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
644 dr.read(oem);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
645 assert(oem == OEM_DIGITALMARS);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
646 dr.read(oem);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
647 ushort count;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
648 dr.read(count);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
649 assert(count == 2);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
650 switch ( oem )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
651 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
652 case D_DYN_ARRAY:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
653 LeafDynArray lda = new LeafDynArray;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
654 l = lda;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
655 dr.read(lda.index_type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
656 dr.read(lda.elem_type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
657 debug(cvparser) DbgIO.println("Dynamic array index_type 0x%x elem_type 0x%x", lda.index_type, lda.elem_type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
658 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
659 case D_ASSOC_ARRAY:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
660 LeafAssocArray laa = new LeafAssocArray;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
661 l = laa;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
662 dr.read(laa.key_type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
663 dr.read(laa.elem_type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
664 debug(cvparser) DbgIO.println("Associativ array key_type 0x%x elem_type 0x%x", laa.key_type, laa.elem_type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
665 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
666 default:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
667 LeafDelegate ld = new LeafDelegate;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
668 l = ld;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
669 dr.read(ld.this_type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
670 dr.read(ld.func_type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
671 debug(cvparser) DbgIO.println("Delegate this_type 0x%x func_type 0x%x", ld.this_type, ld.func_type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
672 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
673 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
674 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
675
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
676 case LF_ARGLIST_16t:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
677 LeafArgList lal = new LeafArgList;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
678 l = lal;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
679 dr.read(lal.argcount);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
680 dr.readA(lal.indeces, cast(uint)lal.argcount);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
681 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
682 case LF_FIELDLIST_16t:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
683 debug(cvparser) DbgIO.println("fieldlist 0x%x", 0x1000+cv.type_strings.length);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
684 LeafFieldList lfl = new LeafFieldList;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
685 l = lfl;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
686 while ( dr.available )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
687 lfl.fields ~= parseSubfield(dr);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
688 // skip rest of typestring
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
689 dr.seek(dr.data.length);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
690 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
691 case LF_DERIVED_16t:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
692 LeafDerived ld = new LeafDerived;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
693 l = ld;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
694 ushort count;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
695 dr.read(count);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
696 dr.readA(ld.types, cast(uint)count);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
697 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
698 case LF_METHODLIST_16t:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
699 LeafMethodList lml = new LeafMethodList;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
700 l = lml;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
701 // skip rest of typestring
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
702 dr.seek(dr.data.length);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
703 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
704 default:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
705 debug DbgIO.println("unprocessed leaf index 0x%x at 0x%x", leaf_index, dr.cursor-2);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
706 l = new Leaf;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
707 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
708 assert ( l !is null );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
709 l.leaf_index = leaf_index;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
710 leafs ~= l;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
711 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
712 return leafs;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
713 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
714
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
715 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
716
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
717 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
718 Leaf parseSubfield(DataReader dr)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
719 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
720 ushort leaf_index;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
721 dr.read(leaf_index);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
722 Leaf l;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
723 switch ( leaf_index )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
724 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
725 case LF_BCLASS_16t:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
726 LeafBaseClass lbc = new LeafBaseClass;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
727 l = lbc;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
728 dr.read(lbc.type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
729 dr.read(lbc.attribute);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
730 lbc.offset = parseNumericLeaf(dr);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
731 debug(cvparser) DbgIO.println("SFbclass");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
732 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
733 case LF_MEMBER_16t:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
734 LeafMember lm = new LeafMember;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
735 l = lm;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
736 dr.read(lm.type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
737 dr.read(lm.attribute);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
738 lm.offset = parseNumericLeaf(dr);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
739 dr.read(lm.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
740 debug(cvparser) DbgIO.println("SFmember: %s", lm.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
741 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
742 case LF_METHOD_16t:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
743 LeafMethod lm = new LeafMethod;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
744 l = lm;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
745 dr.read(lm.count);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
746 dr.read(lm.mList);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
747 dr.read(lm.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
748 debug(cvparser) DbgIO.println("SFmethod: %d 0x%x %s", lm.count, lm.mList, lm.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
749 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
750 case LF_ENUMERATE:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
751 LeafEnumNameValue le = new LeafEnumNameValue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
752 l = le;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
753 dr.read(le.attribute);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
754 le.value = parseNumericLeaf(dr);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
755 dr.read(le.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
756 debug(cvparser) DbgIO.println("SFenumerate: %s %d", le.name, le.value.getUint);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
757 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
758 case LF_NESTTYPE_16t:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
759 LeafNestedType ln = new LeafNestedType;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
760 l = ln;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
761 dr.read(ln.index);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
762 dr.read(ln.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
763 debug(cvparser) DbgIO.println("SFnesttype: %s", ln.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
764 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
765 case LF_STMEMBER_16t:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
766 LeafStaticDataMember ls = new LeafStaticDataMember;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
767 l = ls;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
768 dr.read(ls.type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
769 dr.read(ls.attribute);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
770 dr.read(ls.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
771 debug(cvparser) DbgIO.println("SFstmember: %s", ls.name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
772 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
773 case LF_SKIP_16t:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
774 dr.seek(dr.data.length);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
775 debug(cvparser) DbgIO.println("SFskip");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
776 break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
777 default:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
778 debug DbgIO.println("unprocessed subfield index 0x%x", leaf_index);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
779 l = new Leaf;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
780 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
781 if ( dr.available )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
782 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
783 ubyte pad;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
784 dr.peek(pad);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
785 if ( pad > 0xf0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
786 dr.relseek(pad&0xf);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
787 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
788 assert ( l !is null );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
789 l.leaf_index = leaf_index;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
790 return l;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
791 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
792
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
793 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
794
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
795 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
796 LeafNumeric parseNumericLeaf(DataReader dr)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
797 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
798 LeafNumeric nl = new LeafNumeric;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
799 dr.read(nl.leaf_index);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
800 if ( nl.leaf_index < 0x8000 ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
801 nl.us = cast(ushort)nl.leaf_index;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
802 nl.leaf_index = LF_USHORT;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
803 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
804 else switch ( nl.leaf_index )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
805 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
806 case LF_VARSTRING: dr.read(nl.str); break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
807 case LF_CHAR: dr.read(nl.c); break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
808 case LF_SHORT: dr.read(nl.s); break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
809 case LF_USHORT: dr.read(nl.us); break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
810 case LF_LONG: dr.read(nl.i); break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
811 case LF_ULONG: dr.read(nl.ui); break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
812 case LF_REAL32: dr.read(nl.f); break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
813 case LF_REAL64: dr.read(nl.d); break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
814 case LF_REAL80: dr.read(nl.r); break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
815 case LF_QUADWORD: dr.read(nl.l); break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
816 case LF_UQUADWORD: dr.read(nl.ul); break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
817 case LF_COMPLEX32: dr.read(nl.cf); break;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
818 case LF_COMPLEX64:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
819 case LF_COMPLEX80:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
820 case LF_REAL48:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
821 case LF_COMPLEX128:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
822 case LF_REAL128:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
823 default:
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
824 debug DbgIO.println("unknown leaftype %x", nl.leaf_index);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
825 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
826 return nl;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
827 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
828
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
829 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
830 Updates symbol size fields and mangled_names. Since both can only
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
831 be determined fully after sstGlobalTypes have been read.
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
832 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
833 void updateSymbols(CodeView cv, NamedSymbol[] syms)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
834 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
835 foreach ( s; syms )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
836 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
837 if ( s.mangled_name is null || s.mangled_name.length <= 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
838 s.mangled_name = cv.mangle(s);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
839
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
840 ScopeSymbol scs = cast(ScopeSymbol)s;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
841 if ( scs !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
842 updateSymbols(cv, scs.symbols.named_symbols);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
843 ProcedureSymbol ps = cast(ProcedureSymbol)s;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
844 if ( ps !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
845 updateSymbols(cv, ps.arguments.named_symbols);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
846
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
847 string type = cv.mangleType(s);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
848 if ( type is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
849 continue;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
850
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
851 DataSymbol ds = cast(DataSymbol)s;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
852 if ( ds !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
853 ds.size = cv.sizeofCV(ds.cvdata.type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
854 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
855 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
856 StackSymbol ss = cast(StackSymbol)s;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
857 if ( ss !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
858 ss.size = cv.sizeofCV(ss.cvdata.type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
859 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
860 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
861 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
862 }