|
1 /* -*- Mode: Javascript; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
|
2 |
|
3 "use strict"; |
|
4 |
|
5 function assert(x, msg) |
|
6 { |
|
7 if (x) |
|
8 return; |
|
9 debugger; |
|
10 if (msg) |
|
11 throw "assertion failed: " + msg + "\n" + (Error().stack); |
|
12 else |
|
13 throw "assertion failed: " + (Error().stack); |
|
14 } |
|
15 |
|
16 function defined(x) { |
|
17 return x !== undefined; |
|
18 } |
|
19 |
|
20 function xprint(x, padding) |
|
21 { |
|
22 if (!padding) |
|
23 padding = ""; |
|
24 if (x instanceof Array) { |
|
25 print(padding + "["); |
|
26 for (var elem of x) |
|
27 xprint(elem, padding + " "); |
|
28 print(padding + "]"); |
|
29 } else if (x instanceof Object) { |
|
30 print(padding + "{"); |
|
31 for (var prop in x) { |
|
32 print(padding + " " + prop + ":"); |
|
33 xprint(x[prop], padding + " "); |
|
34 } |
|
35 print(padding + "}"); |
|
36 } else { |
|
37 print(padding + x); |
|
38 } |
|
39 } |
|
40 |
|
41 function sameBlockId(id0, id1) |
|
42 { |
|
43 if (id0.Kind != id1.Kind) |
|
44 return false; |
|
45 if (!sameVariable(id0.Variable, id1.Variable)) |
|
46 return false; |
|
47 if (id0.Kind == "Loop" && id0.Loop != id1.Loop) |
|
48 return false; |
|
49 return true; |
|
50 } |
|
51 |
|
52 function sameVariable(var0, var1) |
|
53 { |
|
54 assert("Name" in var0 || var0.Kind == "This" || var0.Kind == "Return"); |
|
55 assert("Name" in var1 || var1.Kind == "This" || var1.Kind == "Return"); |
|
56 if ("Name" in var0) |
|
57 return "Name" in var1 && var0.Name[0] == var1.Name[0]; |
|
58 return var0.Kind == var1.Kind; |
|
59 } |
|
60 |
|
61 function blockIdentifier(body) |
|
62 { |
|
63 if (body.BlockId.Kind == "Loop") |
|
64 return body.BlockId.Loop; |
|
65 assert(body.BlockId.Kind == "Function", "body.Kind should be Function, not " + body.BlockId.Kind); |
|
66 return body.BlockId.Variable.Name[0]; |
|
67 } |
|
68 |
|
69 function collectBodyEdges(body) |
|
70 { |
|
71 body.predecessors = []; |
|
72 body.successors = []; |
|
73 if (!("PEdge" in body)) |
|
74 return; |
|
75 |
|
76 for (var edge of body.PEdge) { |
|
77 var [ source, target ] = edge.Index; |
|
78 if (!(target in body.predecessors)) |
|
79 body.predecessors[target] = []; |
|
80 body.predecessors[target].push(edge); |
|
81 if (!(source in body.successors)) |
|
82 body.successors[source] = []; |
|
83 body.successors[source].push(edge); |
|
84 } |
|
85 } |
|
86 |
|
87 function getPredecessors(body) |
|
88 { |
|
89 try { |
|
90 if (!('predecessors' in body)) |
|
91 collectBodyEdges(body); |
|
92 } catch (e) { |
|
93 debugger; |
|
94 printErr("body is " + body); |
|
95 } |
|
96 return body.predecessors; |
|
97 } |
|
98 |
|
99 function getSuccessors(body) |
|
100 { |
|
101 if (!('successors' in body)) |
|
102 collectBodyEdges(body); |
|
103 return body.successors; |
|
104 } |
|
105 |
|
106 // Split apart a function from sixgill into its mangled and unmangled name. If |
|
107 // no mangled name was given, use the unmangled name as its mangled name |
|
108 function splitFunction(func) |
|
109 { |
|
110 var split = func.indexOf("|"); |
|
111 if (split == -1) |
|
112 return [ func, func ]; |
|
113 return [ func.substr(0, split), func.substr(split+1) ]; |
|
114 } |
|
115 |
|
116 function mangled(fullname) |
|
117 { |
|
118 var split = fullname.indexOf("|"); |
|
119 if (split == -1) |
|
120 return fullname; |
|
121 return fullname.substr(0, split); |
|
122 } |
|
123 |
|
124 function readable(fullname) |
|
125 { |
|
126 var split = fullname.indexOf("|"); |
|
127 if (split == -1) |
|
128 return fullname; |
|
129 return fullname.substr(split+1); |
|
130 } |
|
131 |
|
132 function xdbLibrary() |
|
133 { |
|
134 var lib = ctypes.open(environment['XDB']); |
|
135 return { |
|
136 open: lib.declare("xdb_open", ctypes.default_abi, ctypes.void_t, ctypes.char.ptr), |
|
137 min_data_stream: lib.declare("xdb_min_data_stream", ctypes.default_abi, ctypes.int), |
|
138 max_data_stream: lib.declare("xdb_max_data_stream", ctypes.default_abi, ctypes.int), |
|
139 read_key: lib.declare("xdb_read_key", ctypes.default_abi, ctypes.char.ptr, ctypes.int), |
|
140 read_entry: lib.declare("xdb_read_entry", ctypes.default_abi, ctypes.char.ptr, ctypes.char.ptr), |
|
141 free_string: lib.declare("xdb_free", ctypes.default_abi, ctypes.void_t, ctypes.char.ptr) |
|
142 }; |
|
143 } |