python-lancelot 0.9.4__cp311-cp311-win32.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
lancelot/__init__.py ADDED
@@ -0,0 +1,14 @@
1
+ from ._lib import binexport2_from_bytes as _binexport2_bytes_from_bytes
2
+ from .be2utils.binexport2_pb2 import BinExport2
3
+
4
+
5
+ def get_binexport2_bytes_from_bytes(buf: bytes, sig_paths=None, function_hints=None) -> bytes:
6
+ """Get the Lancelot workspace as a BinExport2-encoded buffer"""
7
+ return _binexport2_bytes_from_bytes(buf, sig_paths=sig_paths, function_hints=function_hints)
8
+
9
+
10
+ def get_binexport2_from_bytes(buf: bytes, sig_paths=None, function_hints=None) -> BinExport2:
11
+ """Get the Lancelot workspace as a BinExport2 instance"""
12
+ be2: BinExport2 = BinExport2()
13
+ be2.ParseFromString(get_binexport2_bytes_from_bytes(buf, sig_paths=sig_paths, function_hints=function_hints))
14
+ return be2
Binary file
@@ -0,0 +1,291 @@
1
+ """
2
+ Proto files generated via protobuf v24.4:
3
+
4
+ protoc --python_out=. --mypy_out=. binexport2.proto
5
+
6
+ from BinExport2 at 6916731d5f6693c4a4f0a052501fd3bd92cfd08b
7
+ https://github.com/google/binexport/blob/6916731/binexport2.proto
8
+ """
9
+
10
+ import io
11
+ import logging
12
+ from typing import Iterator
13
+ from collections import defaultdict
14
+ from dataclasses import dataclass
15
+
16
+ from pefile import PE
17
+ from elftools.elf.elffile import ELFFile
18
+ from lancelot.be2utils.binexport2_pb2 import BinExport2
19
+
20
+ logger = logging.getLogger(__name__)
21
+
22
+
23
+ class BinExport2Index:
24
+ def __init__(self, be2: BinExport2):
25
+ self.be2: BinExport2 = be2
26
+
27
+ self.callers_by_vertex_index: dict[int, list[int]] = defaultdict(list)
28
+ self.callees_by_vertex_index: dict[int, list[int]] = defaultdict(list)
29
+
30
+ # note: flow graph != call graph (vertex)
31
+ self.flow_graph_index_by_address: dict[int, int] = {}
32
+ self.flow_graph_address_by_index: dict[int, int] = {}
33
+
34
+ # edges that come from the given basic block
35
+ self.source_edges_by_basic_block_index: dict[int, list[BinExport2.FlowGraph.Edge]] = defaultdict(list)
36
+ # edges that end up at the given basic block
37
+ self.target_edges_by_basic_block_index: dict[int, list[BinExport2.FlowGraph.Edge]] = defaultdict(list)
38
+
39
+ self.vertex_index_by_address: dict[int, int] = {}
40
+
41
+ self.data_reference_index_by_source_instruction_index: dict[int, list[int]] = defaultdict(list)
42
+ self.data_reference_index_by_target_address: dict[int, list[int]] = defaultdict(list)
43
+ self.string_reference_index_by_source_instruction_index: dict[int, list[int]] = defaultdict(list)
44
+
45
+ self.insn_address_by_index: dict[int, int] = {}
46
+ self.insn_index_by_address: dict[int, int] = {}
47
+ self.insn_by_address: dict[int, BinExport2.Instruction] = {}
48
+
49
+ # must index instructions first
50
+ self._index_insn_addresses()
51
+ self._index_vertex_edges()
52
+ self._index_flow_graph_nodes()
53
+ self._index_flow_graph_edges()
54
+ self._index_call_graph_vertices()
55
+ self._index_data_references()
56
+ self._index_string_references()
57
+
58
+ def get_insn_address(self, insn_index: int) -> int:
59
+ assert insn_index in self.insn_address_by_index, f"insn must be indexed, missing {insn_index}"
60
+ return self.insn_address_by_index[insn_index]
61
+
62
+ def get_basic_block_address(self, basic_block_index: int) -> int:
63
+ basic_block: BinExport2.BasicBlock = self.be2.basic_block[basic_block_index]
64
+ first_instruction_index: int = next(self.instruction_indices(basic_block))
65
+ return self.get_insn_address(first_instruction_index)
66
+
67
+ def _index_vertex_edges(self):
68
+ for edge in self.be2.call_graph.edge:
69
+ if not edge.source_vertex_index:
70
+ continue
71
+ if not edge.target_vertex_index:
72
+ continue
73
+
74
+ self.callers_by_vertex_index[edge.target_vertex_index].append(edge.source_vertex_index)
75
+ self.callees_by_vertex_index[edge.source_vertex_index].append(edge.target_vertex_index)
76
+
77
+ def _index_flow_graph_nodes(self):
78
+ for flow_graph_index, flow_graph in enumerate(self.be2.flow_graph):
79
+ function_address: int = self.get_basic_block_address(flow_graph.entry_basic_block_index)
80
+ self.flow_graph_index_by_address[function_address] = flow_graph_index
81
+ self.flow_graph_address_by_index[flow_graph_index] = function_address
82
+
83
+ def _index_flow_graph_edges(self):
84
+ for flow_graph in self.be2.flow_graph:
85
+ for edge in flow_graph.edge:
86
+ if not edge.HasField("source_basic_block_index") or not edge.HasField("target_basic_block_index"):
87
+ continue
88
+
89
+ self.source_edges_by_basic_block_index[edge.source_basic_block_index].append(edge)
90
+ self.target_edges_by_basic_block_index[edge.target_basic_block_index].append(edge)
91
+
92
+ def _index_call_graph_vertices(self):
93
+ for vertex_index, vertex in enumerate(self.be2.call_graph.vertex):
94
+ if not vertex.HasField("address"):
95
+ continue
96
+
97
+ vertex_address: int = vertex.address
98
+ self.vertex_index_by_address[vertex_address] = vertex_index
99
+
100
+ def _index_data_references(self):
101
+ for data_reference_index, data_reference in enumerate(self.be2.data_reference):
102
+ self.data_reference_index_by_source_instruction_index[data_reference.instruction_index].append(
103
+ data_reference_index
104
+ )
105
+ self.data_reference_index_by_target_address[data_reference.address].append(data_reference_index)
106
+
107
+ def _index_string_references(self):
108
+ for string_reference_index, string_reference in enumerate(self.be2.string_reference):
109
+ self.string_reference_index_by_source_instruction_index[string_reference.instruction_index].append(
110
+ string_reference_index
111
+ )
112
+
113
+ def _index_insn_addresses(self):
114
+ # see https://github.com/google/binexport/blob/39f6445c232bb5caf5c4a2a996de91dfa20c48e8/binexport.cc#L45
115
+ if len(self.be2.instruction) == 0:
116
+ return
117
+
118
+ assert self.be2.instruction[0].HasField("address"), "first insn must have explicit address"
119
+
120
+ addr: int = 0
121
+ next_addr: int = 0
122
+ for idx, insn in enumerate(self.be2.instruction):
123
+ if insn.HasField("address"):
124
+ addr = insn.address
125
+ next_addr = addr + len(insn.raw_bytes)
126
+ else:
127
+ addr = next_addr
128
+ next_addr += len(insn.raw_bytes)
129
+ self.insn_address_by_index[idx] = addr
130
+ self.insn_index_by_address[addr] = idx
131
+ self.insn_by_address[addr] = insn
132
+
133
+ @staticmethod
134
+ def instruction_indices(basic_block: BinExport2.BasicBlock) -> Iterator[int]:
135
+ """
136
+ For a given basic block, enumerate the instruction indices.
137
+ """
138
+ for index_range in basic_block.instruction_index:
139
+ if not index_range.HasField("end_index"):
140
+ yield index_range.begin_index
141
+ continue
142
+ else:
143
+ yield from range(index_range.begin_index, index_range.end_index)
144
+
145
+ def basic_block_instructions(
146
+ self, basic_block: BinExport2.BasicBlock
147
+ ) -> Iterator[tuple[int, BinExport2.Instruction, int]]:
148
+ """
149
+ For a given basic block, enumerate the instruction indices,
150
+ the instruction instances, and their addresses.
151
+ """
152
+ for instruction_index in self.instruction_indices(basic_block):
153
+ instruction: BinExport2.Instruction = self.be2.instruction[instruction_index]
154
+ instruction_address: int = self.get_insn_address(instruction_index)
155
+
156
+ yield instruction_index, instruction, instruction_address
157
+
158
+ def get_function_name_by_vertex(self, vertex_index: int) -> str:
159
+ vertex: BinExport2.CallGraph.Vertex = self.be2.call_graph.vertex[vertex_index]
160
+ name: str = f"sub_{vertex.address:x}"
161
+ if vertex.HasField("mangled_name"):
162
+ name = vertex.mangled_name
163
+
164
+ if vertex.HasField("demangled_name"):
165
+ name = vertex.demangled_name
166
+
167
+ if vertex.HasField("library_index"):
168
+ library: BinExport2.Library = self.be2.library[vertex.library_index]
169
+ if library.HasField("name"):
170
+ name = f"{library.name}!{name}"
171
+
172
+ return name
173
+
174
+ def get_function_name_by_address(self, address: int) -> str:
175
+ if address not in self.vertex_index_by_address:
176
+ return ""
177
+
178
+ vertex_index: int = self.vertex_index_by_address[address]
179
+ return self.get_function_name_by_vertex(vertex_index)
180
+
181
+ def get_instruction_by_address(self, address: int) -> BinExport2.Instruction:
182
+ assert address in self.insn_by_address, f"address must be indexed, missing {address:x}"
183
+ return self.insn_by_address[address]
184
+
185
+
186
+ def find_be2_base_address(be2: BinExport2):
187
+ sections_with_perms: Iterator[BinExport2.Section] = filter(lambda s: s.flag_r or s.flag_w or s.flag_x, be2.section)
188
+ # assume the lowest address is the base address.
189
+ # this works as long as BinExport doesn't record other
190
+ # libraries mapped into memory.
191
+ return min(s.address for s in sections_with_perms)
192
+
193
+
194
+ @dataclass
195
+ class MemoryRegion:
196
+ # location of the bytes, potentially relative to a base address
197
+ address: int
198
+ buf: bytes
199
+
200
+ @property
201
+ def end(self) -> int:
202
+ return self.address + len(self.buf)
203
+
204
+ def contains(self, address: int) -> bool:
205
+ # note: address must be relative to any base address
206
+ return self.address <= address < self.end
207
+
208
+
209
+ class ReadMemoryError(ValueError): ...
210
+
211
+
212
+ class AddressNotMappedError(ReadMemoryError): ...
213
+
214
+
215
+ @dataclass
216
+ class AddressSpace:
217
+ """
218
+ Simple accessor to mapped executable files.
219
+
220
+ BinExport2 doesn't capture file bytes, but it does reference
221
+ bytes by virtual addresses. This class makes it easy to read
222
+ the data at those references.
223
+
224
+ Addresses are relative to the `base_address` field here,
225
+ so provide RVAs (not VAs). Use `find_be2_base_address` to
226
+ when working with BinExport2 instances to map a VA to an RVA.
227
+ """
228
+
229
+ base_address: int
230
+ memory_regions: tuple[MemoryRegion, ...]
231
+
232
+ def read_memory(self, address: int, length: int) -> bytes:
233
+ rva: int = address - self.base_address
234
+ for region in self.memory_regions:
235
+ if region.contains(rva):
236
+ offset: int = rva - region.address
237
+ return region.buf[offset : offset + length]
238
+
239
+ raise AddressNotMappedError(address)
240
+
241
+ @classmethod
242
+ def from_pe(cls, pe: PE, base_address: int):
243
+ regions: list[MemoryRegion] = []
244
+ for section in pe.sections:
245
+ address: int = section.VirtualAddress
246
+ size: int = section.Misc_VirtualSize
247
+ buf: bytes = section.get_data()
248
+
249
+ if len(buf) != size:
250
+ # pad the section with NULLs
251
+ # assume page alignment is already handled.
252
+ # might need more hardening here.
253
+ buf += b"\x00" * (size - len(buf))
254
+
255
+ regions.append(MemoryRegion(address, buf))
256
+
257
+ return cls(base_address, tuple(regions))
258
+
259
+ @classmethod
260
+ def from_elf(cls, elf: ELFFile, base_address: int):
261
+ regions: list[MemoryRegion] = []
262
+
263
+ # ELF segments are for runtime data,
264
+ # ELF sections are for link-time data.
265
+ for segment in elf.iter_segments():
266
+ # assume p_align is consistent with addresses here.
267
+ # otherwise, should harden this loader.
268
+ segment_rva: int = segment.header.p_vaddr
269
+ segment_size: int = segment.header.p_memsz
270
+ segment_data: bytes = segment.data()
271
+
272
+ if len(segment_data) < segment_size:
273
+ # pad the section with NULLs
274
+ # assume page alignment is already handled.
275
+ # might need more hardening here.
276
+ segment_data += b"\x00" * (segment_size - len(segment_data))
277
+
278
+ regions.append(MemoryRegion(segment_rva, segment_data))
279
+
280
+ return cls(base_address, tuple(regions))
281
+
282
+ @classmethod
283
+ def from_buf(cls, buf: bytes, base_address: int):
284
+ if buf.startswith(b"MZ"):
285
+ pe: PE = PE(data=buf)
286
+ return cls.from_pe(pe, base_address)
287
+ elif buf.startswith(b"\x7fELF"):
288
+ elf: ELFFile = ELFFile(io.BytesIO(buf))
289
+ return cls.from_elf(elf, base_address)
290
+ else:
291
+ raise NotImplementedError("file format address space")
@@ -0,0 +1,73 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: binexport2.proto
4
+ """Generated protocol buffer code."""
5
+ from google.protobuf import descriptor as _descriptor
6
+ from google.protobuf import descriptor_pool as _descriptor_pool
7
+ from google.protobuf import symbol_database as _symbol_database
8
+ from google.protobuf.internal import builder as _builder
9
+
10
+ # @@protoc_insertion_point(imports)
11
+
12
+ _sym_db = _symbol_database.Default()
13
+
14
+
15
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(
16
+ b'\n\x10\x62inexport2.proto"\xa5\x17\n\nBinExport2\x12*\n\x10meta_information\x18\x01 \x01(\x0b\x32\x10.BinExport2.Meta\x12*\n\nexpression\x18\x02 \x03(\x0b\x32\x16.BinExport2.Expression\x12$\n\x07operand\x18\x03 \x03(\x0b\x32\x13.BinExport2.Operand\x12&\n\x08mnemonic\x18\x04 \x03(\x0b\x32\x14.BinExport2.Mnemonic\x12,\n\x0binstruction\x18\x05 \x03(\x0b\x32\x17.BinExport2.Instruction\x12+\n\x0b\x62\x61sic_block\x18\x06 \x03(\x0b\x32\x16.BinExport2.BasicBlock\x12)\n\nflow_graph\x18\x07 \x03(\x0b\x32\x15.BinExport2.FlowGraph\x12)\n\ncall_graph\x18\x08 \x01(\x0b\x32\x15.BinExport2.CallGraph\x12\x14\n\x0cstring_table\x18\t \x03(\t\x12\x32\n\x0f\x61\x64\x64ress_comment\x18\n \x03(\x0b\x32\x15.BinExport2.ReferenceB\x02\x18\x01\x12$\n\x07\x63omment\x18\x11 \x03(\x0b\x32\x13.BinExport2.Comment\x12/\n\x10string_reference\x18\x0b \x03(\x0b\x32\x15.BinExport2.Reference\x12\x36\n\x17\x65xpression_substitution\x18\x0c \x03(\x0b\x32\x15.BinExport2.Reference\x12$\n\x07section\x18\r \x03(\x0b\x32\x13.BinExport2.Section\x12$\n\x07library\x18\x0e \x03(\x0b\x32\x13.BinExport2.Library\x12\x31\n\x0e\x64\x61ta_reference\x18\x0f \x03(\x0b\x32\x19.BinExport2.DataReference\x12"\n\x06module\x18\x10 \x03(\x0b\x32\x12.BinExport2.Module\x1aj\n\x04Meta\x12\x17\n\x0f\x65xecutable_name\x18\x01 \x01(\t\x12\x15\n\rexecutable_id\x18\x02 \x01(\t\x12\x19\n\x11\x61rchitecture_name\x18\x03 \x01(\t\x12\x11\n\ttimestamp\x18\x04 \x01(\x03J\x04\x08\x05\x10\x06\x1a\x9c\x03\n\tCallGraph\x12,\n\x06vertex\x18\x01 \x03(\x0b\x32\x1c.BinExport2.CallGraph.Vertex\x12(\n\x04\x65\x64ge\x18\x02 \x03(\x0b\x32\x1a.BinExport2.CallGraph.Edge\x1a\xf4\x01\n\x06Vertex\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x04\x12\x37\n\x04type\x18\x02 \x01(\x0e\x32!.BinExport2.CallGraph.Vertex.Type:\x06NORMAL\x12\x14\n\x0cmangled_name\x18\x03 \x01(\t\x12\x16\n\x0e\x64\x65mangled_name\x18\x04 \x01(\t\x12\x15\n\rlibrary_index\x18\x05 \x01(\x05\x12\x14\n\x0cmodule_index\x18\x06 \x01(\x05"E\n\x04Type\x12\n\n\x06NORMAL\x10\x00\x12\x0b\n\x07LIBRARY\x10\x01\x12\x0c\n\x08IMPORTED\x10\x02\x12\t\n\x05THUNK\x10\x03\x12\x0b\n\x07INVALID\x10\x04\x1a@\n\x04\x45\x64ge\x12\x1b\n\x13source_vertex_index\x18\x01 \x01(\x05\x12\x1b\n\x13target_vertex_index\x18\x02 \x01(\x05\x1a\x90\x02\n\nExpression\x12\x38\n\x04type\x18\x01 \x01(\x0e\x32\x1b.BinExport2.Expression.Type:\rIMMEDIATE_INT\x12\x0e\n\x06symbol\x18\x02 \x01(\t\x12\x11\n\timmediate\x18\x03 \x01(\x04\x12\x14\n\x0cparent_index\x18\x04 \x01(\x05\x12\x15\n\ris_relocation\x18\x05 \x01(\x08"x\n\x04Type\x12\n\n\x06SYMBOL\x10\x01\x12\x11\n\rIMMEDIATE_INT\x10\x02\x12\x13\n\x0fIMMEDIATE_FLOAT\x10\x03\x12\x0c\n\x08OPERATOR\x10\x04\x12\x0c\n\x08REGISTER\x10\x05\x12\x0f\n\x0bSIZE_PREFIX\x10\x06\x12\x0f\n\x0b\x44\x45REFERENCE\x10\x07\x1a#\n\x07Operand\x12\x18\n\x10\x65xpression_index\x18\x01 \x03(\x05\x1a\x18\n\x08Mnemonic\x12\x0c\n\x04name\x18\x01 \x01(\t\x1a\x8f\x01\n\x0bInstruction\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x04\x12\x13\n\x0b\x63\x61ll_target\x18\x02 \x03(\x04\x12\x19\n\x0emnemonic_index\x18\x03 \x01(\x05:\x01\x30\x12\x15\n\roperand_index\x18\x04 \x03(\x05\x12\x11\n\traw_bytes\x18\x05 \x01(\x0c\x12\x15\n\rcomment_index\x18\x06 \x03(\x05\x1a\x80\x01\n\nBasicBlock\x12<\n\x11instruction_index\x18\x01 \x03(\x0b\x32!.BinExport2.BasicBlock.IndexRange\x1a\x34\n\nIndexRange\x12\x13\n\x0b\x62\x65gin_index\x18\x01 \x01(\x05\x12\x11\n\tend_index\x18\x02 \x01(\x05\x1a\xe9\x02\n\tFlowGraph\x12\x19\n\x11\x62\x61sic_block_index\x18\x01 \x03(\x05\x12\x1f\n\x17\x65ntry_basic_block_index\x18\x03 \x01(\x05\x12(\n\x04\x65\x64ge\x18\x02 \x03(\x0b\x32\x1a.BinExport2.FlowGraph.Edge\x1a\xf5\x01\n\x04\x45\x64ge\x12 \n\x18source_basic_block_index\x18\x01 \x01(\x05\x12 \n\x18target_basic_block_index\x18\x02 \x01(\x05\x12<\n\x04type\x18\x03 \x01(\x0e\x32\x1f.BinExport2.FlowGraph.Edge.Type:\rUNCONDITIONAL\x12\x1b\n\x0cis_back_edge\x18\x04 \x01(\x08:\x05\x66\x61lse"N\n\x04Type\x12\x12\n\x0e\x43ONDITION_TRUE\x10\x01\x12\x13\n\x0f\x43ONDITION_FALSE\x10\x02\x12\x11\n\rUNCONDITIONAL\x10\x03\x12\n\n\x06SWITCH\x10\x04\x1a\x8d\x01\n\tReference\x12\x19\n\x11instruction_index\x18\x01 \x01(\x05\x12$\n\x19instruction_operand_index\x18\x02 \x01(\x05:\x01\x30\x12#\n\x18operand_expression_index\x18\x03 \x01(\x05:\x01\x30\x12\x1a\n\x12string_table_index\x18\x04 \x01(\x05\x1a;\n\rDataReference\x12\x19\n\x11instruction_index\x18\x01 \x01(\x05\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\x04\x1a\xd4\x02\n\x07\x43omment\x12\x19\n\x11instruction_index\x18\x01 \x01(\x05\x12$\n\x19instruction_operand_index\x18\x02 \x01(\x05:\x01\x30\x12#\n\x18operand_expression_index\x18\x03 \x01(\x05:\x01\x30\x12\x1a\n\x12string_table_index\x18\x04 \x01(\x05\x12\x12\n\nrepeatable\x18\x05 \x01(\x08\x12/\n\x04type\x18\x06 \x01(\x0e\x32\x18.BinExport2.Comment.Type:\x07\x44\x45\x46\x41ULT"\x81\x01\n\x04Type\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\x0c\n\x08\x41NTERIOR\x10\x01\x12\r\n\tPOSTERIOR\x10\x02\x12\x0c\n\x08\x46UNCTION\x10\x03\x12\x08\n\x04\x45NUM\x10\x04\x12\x0c\n\x08LOCATION\x10\x05\x12\x14\n\x10GLOBAL_REFERENCE\x10\x06\x12\x13\n\x0fLOCAL_REFERENCE\x10\x07\x1aX\n\x07Section\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x04\x12\x0c\n\x04size\x18\x02 \x01(\x04\x12\x0e\n\x06\x66lag_r\x18\x03 \x01(\x08\x12\x0e\n\x06\x66lag_w\x18\x04 \x01(\x08\x12\x0e\n\x06\x66lag_x\x18\x05 \x01(\x08\x1a\x43\n\x07Library\x12\x11\n\tis_static\x18\x01 \x01(\x08\x12\x17\n\x0cload_address\x18\x02 \x01(\x04:\x01\x30\x12\x0c\n\x04name\x18\x03 \x01(\t\x1a\x16\n\x06Module\x12\x0c\n\x04name\x18\x01 \x01(\t*\x0b\x08\x80\xc2\xd7/\x10\x80\x80\x80\x80\x02\x42)\n\x1c\x63om.google.security.zynamicsB\tBinExport'
17
+ )
18
+
19
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
20
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "binexport2_pb2", globals())
21
+ if _descriptor._USE_C_DESCRIPTORS == False:
22
+
23
+ DESCRIPTOR._options = None
24
+ DESCRIPTOR._serialized_options = b"\n\034com.google.security.zynamicsB\tBinExport"
25
+ _BINEXPORT2.fields_by_name["address_comment"]._options = None
26
+ _BINEXPORT2.fields_by_name["address_comment"]._serialized_options = b"\030\001"
27
+ _BINEXPORT2._serialized_start = 21
28
+ _BINEXPORT2._serialized_end = 3002
29
+ _BINEXPORT2_META._serialized_start = 758
30
+ _BINEXPORT2_META._serialized_end = 864
31
+ _BINEXPORT2_CALLGRAPH._serialized_start = 867
32
+ _BINEXPORT2_CALLGRAPH._serialized_end = 1279
33
+ _BINEXPORT2_CALLGRAPH_VERTEX._serialized_start = 969
34
+ _BINEXPORT2_CALLGRAPH_VERTEX._serialized_end = 1213
35
+ _BINEXPORT2_CALLGRAPH_VERTEX_TYPE._serialized_start = 1144
36
+ _BINEXPORT2_CALLGRAPH_VERTEX_TYPE._serialized_end = 1213
37
+ _BINEXPORT2_CALLGRAPH_EDGE._serialized_start = 1215
38
+ _BINEXPORT2_CALLGRAPH_EDGE._serialized_end = 1279
39
+ _BINEXPORT2_EXPRESSION._serialized_start = 1282
40
+ _BINEXPORT2_EXPRESSION._serialized_end = 1554
41
+ _BINEXPORT2_EXPRESSION_TYPE._serialized_start = 1434
42
+ _BINEXPORT2_EXPRESSION_TYPE._serialized_end = 1554
43
+ _BINEXPORT2_OPERAND._serialized_start = 1556
44
+ _BINEXPORT2_OPERAND._serialized_end = 1591
45
+ _BINEXPORT2_MNEMONIC._serialized_start = 1593
46
+ _BINEXPORT2_MNEMONIC._serialized_end = 1617
47
+ _BINEXPORT2_INSTRUCTION._serialized_start = 1620
48
+ _BINEXPORT2_INSTRUCTION._serialized_end = 1763
49
+ _BINEXPORT2_BASICBLOCK._serialized_start = 1766
50
+ _BINEXPORT2_BASICBLOCK._serialized_end = 1894
51
+ _BINEXPORT2_BASICBLOCK_INDEXRANGE._serialized_start = 1842
52
+ _BINEXPORT2_BASICBLOCK_INDEXRANGE._serialized_end = 1894
53
+ _BINEXPORT2_FLOWGRAPH._serialized_start = 1897
54
+ _BINEXPORT2_FLOWGRAPH._serialized_end = 2258
55
+ _BINEXPORT2_FLOWGRAPH_EDGE._serialized_start = 2013
56
+ _BINEXPORT2_FLOWGRAPH_EDGE._serialized_end = 2258
57
+ _BINEXPORT2_FLOWGRAPH_EDGE_TYPE._serialized_start = 2180
58
+ _BINEXPORT2_FLOWGRAPH_EDGE_TYPE._serialized_end = 2258
59
+ _BINEXPORT2_REFERENCE._serialized_start = 2261
60
+ _BINEXPORT2_REFERENCE._serialized_end = 2402
61
+ _BINEXPORT2_DATAREFERENCE._serialized_start = 2404
62
+ _BINEXPORT2_DATAREFERENCE._serialized_end = 2463
63
+ _BINEXPORT2_COMMENT._serialized_start = 2466
64
+ _BINEXPORT2_COMMENT._serialized_end = 2806
65
+ _BINEXPORT2_COMMENT_TYPE._serialized_start = 2677
66
+ _BINEXPORT2_COMMENT_TYPE._serialized_end = 2806
67
+ _BINEXPORT2_SECTION._serialized_start = 2808
68
+ _BINEXPORT2_SECTION._serialized_end = 2896
69
+ _BINEXPORT2_LIBRARY._serialized_start = 2898
70
+ _BINEXPORT2_LIBRARY._serialized_end = 2965
71
+ _BINEXPORT2_MODULE._serialized_start = 2967
72
+ _BINEXPORT2_MODULE._serialized_end = 2989
73
+ # @@protoc_insertion_point(module_scope)