1//===- CodeGenMapTable.cpp - Instruction Mapping Table Generator ----------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8// CodeGenMapTable provides functionality for the TableGen to create
9// relation mapping between instructions. Relation models are defined using
10// InstrMapping as a base class. This file implements the functionality which
11// parses these definitions and generates relation maps using the information
12// specified there. These maps are emitted as tables in the XXXGenInstrInfo.inc
13// file along with the functions to query them.
14//
15// A relationship model to relate non-predicate instructions with their
16// predicated true/false forms can be defined as follows:
17//
18// def getPredOpcode : InstrMapping {
19//  let FilterClass = "PredRel";
20//  let RowFields = ["BaseOpcode"];
21//  let ColFields = ["PredSense"];
22//  let KeyCol = ["none"];
23//  let ValueCols = [["true"], ["false"]]; }
24//
25// CodeGenMapTable parses this map and generates a table in XXXGenInstrInfo.inc
26// file that contains the instructions modeling this relationship. This table
27// is defined in the function
28// "int getPredOpcode(uint16_t Opcode, enum PredSense inPredSense)"
29// that can be used to retrieve the predicated form of the instruction by
30// passing its opcode value and the predicate sense (true/false) of the desired
31// instruction as arguments.
32//
33// Short description of the algorithm:
34//
35// 1) Iterate through all the records that derive from "InstrMapping" class.
36// 2) For each record, filter out instructions based on the FilterClass value.
37// 3) Iterate through this set of instructions and insert them into
38// RowInstrMap map based on their RowFields values. RowInstrMap is keyed by the
39// vector of RowFields values and contains vectors of Records (instructions) as
40// values. RowFields is a list of fields that are required to have the same
41// values for all the instructions appearing in the same row of the relation
42// table. All the instructions in a given row of the relation table have some
43// sort of relationship with the key instruction defined by the corresponding
44// relationship model.
45//
46// Ex: RowInstrMap(RowVal1, RowVal2, ...) -> [Instr1, Instr2, Instr3, ... ]
47// Here Instr1, Instr2, Instr3 have same values (RowVal1, RowVal2) for
48// RowFields. These groups of instructions are later matched against ValueCols
49// to determine the column they belong to, if any.
50//
51// While building the RowInstrMap map, collect all the key instructions in
52// KeyInstrVec. These are the instructions having the same values as KeyCol
53// for all the fields listed in ColFields.
54//
55// For Example:
56//
57// Relate non-predicate instructions with their predicated true/false forms.
58//
59// def getPredOpcode : InstrMapping {
60//  let FilterClass = "PredRel";
61//  let RowFields = ["BaseOpcode"];
62//  let ColFields = ["PredSense"];
63//  let KeyCol = ["none"];
64//  let ValueCols = [["true"], ["false"]]; }
65//
66// Here, only instructions that have "none" as PredSense will be selected as key
67// instructions.
68//
69// 4) For each key instruction, get the group of instructions that share the
70// same key-value as the key instruction from RowInstrMap. Iterate over the list
71// of columns in ValueCols (it is defined as a list<list<string> >. Therefore,
72// it can specify multi-column relationships). For each column, find the
73// instruction from the group that matches all the values for the column.
74// Multiple matches are not allowed.
75//
76//===----------------------------------------------------------------------===//
77
78#include "CodeGenInstruction.h"
79#include "CodeGenTarget.h"
80#include "llvm/TableGen/Error.h"
81#include "llvm/TableGen/Record.h"
82using namespace llvm;
83typedef std::map<std::string, std::vector<Record*> > InstrRelMapTy;
84
85typedef std::map<std::vector<Init*>, std::vector<Record*> > RowInstrMapTy;
86
87namespace {
88
89//===----------------------------------------------------------------------===//
90// This class is used to represent InstrMapping class defined in Target.td file.
91class InstrMap {
92private:
93  std::string Name;
94  std::string FilterClass;
95  ListInit *RowFields;
96  ListInit *ColFields;
97  ListInit *KeyCol;
98  std::vector<ListInit*> ValueCols;
99
100public:
101  InstrMap(Record* MapRec) {
102    Name = std::string(MapRec->getName());
103
104    // FilterClass - It's used to reduce the search space only to the
105    // instructions that define the kind of relationship modeled by
106    // this InstrMapping object/record.
107    const RecordVal *Filter = MapRec->getValue("FilterClass");
108    FilterClass = Filter->getValue()->getAsUnquotedString();
109
110    // List of fields/attributes that need to be same across all the
111    // instructions in a row of the relation table.
112    RowFields = MapRec->getValueAsListInit("RowFields");
113
114    // List of fields/attributes that are constant across all the instruction
115    // in a column of the relation table. Ex: ColFields = 'predSense'
116    ColFields = MapRec->getValueAsListInit("ColFields");
117
118    // Values for the fields/attributes listed in 'ColFields'.
119    // Ex: KeyCol = 'noPred' -- key instruction is non-predicated
120    KeyCol = MapRec->getValueAsListInit("KeyCol");
121
122    // List of values for the fields/attributes listed in 'ColFields', one for
123    // each column in the relation table.
124    //
125    // Ex: ValueCols = [['true'],['false']] -- it results two columns in the
126    // table. First column requires all the instructions to have predSense
127    // set to 'true' and second column requires it to be 'false'.
128    ListInit *ColValList = MapRec->getValueAsListInit("ValueCols");
129
130    // Each instruction map must specify at least one column for it to be valid.
131    if (ColValList->empty())
132      PrintFatalError(MapRec->getLoc(), "InstrMapping record `" +
133        MapRec->getName() + "' has empty " + "`ValueCols' field!");
134
135    for (Init *I : ColValList->getValues()) {
136      auto *ColI = cast<ListInit>(I);
137
138      // Make sure that all the sub-lists in 'ValueCols' have same number of
139      // elements as the fields in 'ColFields'.
140      if (ColI->size() != ColFields->size())
141        PrintFatalError(MapRec->getLoc(), "Record `" + MapRec->getName() +
142          "', field `ValueCols' entries don't match with " +
143          " the entries in 'ColFields'!");
144      ValueCols.push_back(ColI);
145    }
146  }
147
148  const std::string &getName() const { return Name; }
149
150  const std::string &getFilterClass() const { return FilterClass; }
151
152  ListInit *getRowFields() const { return RowFields; }
153
154  ListInit *getColFields() const { return ColFields; }
155
156  ListInit *getKeyCol() const { return KeyCol; }
157
158  const std::vector<ListInit*> &getValueCols() const {
159    return ValueCols;
160  }
161};
162} // end anonymous namespace
163
164
165//===----------------------------------------------------------------------===//
166// class MapTableEmitter : It builds the instruction relation maps using
167// the information provided in InstrMapping records. It outputs these
168// relationship maps as tables into XXXGenInstrInfo.inc file along with the
169// functions to query them.
170
171namespace {
172class MapTableEmitter {
173private:
174//  std::string TargetName;
175  const CodeGenTarget &Target;
176  // InstrMapDesc - InstrMapping record to be processed.
177  InstrMap InstrMapDesc;
178
179  // InstrDefs - list of instructions filtered using FilterClass defined
180  // in InstrMapDesc.
181  std::vector<Record*> InstrDefs;
182
183  // RowInstrMap - maps RowFields values to the instructions. It's keyed by the
184  // values of the row fields and contains vector of records as values.
185  RowInstrMapTy RowInstrMap;
186
187  // KeyInstrVec - list of key instructions.
188  std::vector<Record*> KeyInstrVec;
189  DenseMap<Record*, std::vector<Record*> > MapTable;
190
191public:
192  MapTableEmitter(CodeGenTarget &Target, RecordKeeper &Records, Record *IMRec):
193                  Target(Target), InstrMapDesc(IMRec) {
194    const std::string &FilterClass = InstrMapDesc.getFilterClass();
195    InstrDefs = Records.getAllDerivedDefinitions(FilterClass);
196  }
197
198  void buildRowInstrMap();
199
200  // Returns true if an instruction is a key instruction, i.e., its ColFields
201  // have same values as KeyCol.
202  bool isKeyColInstr(Record* CurInstr);
203
204  // Find column instruction corresponding to a key instruction based on the
205  // constraints for that column.
206  Record *getInstrForColumn(Record *KeyInstr, ListInit *CurValueCol);
207
208  // Find column instructions for each key instruction based
209  // on ValueCols and store them into MapTable.
210  void buildMapTable();
211
212  void emitBinSearch(raw_ostream &OS, unsigned TableSize);
213  void emitTablesWithFunc(raw_ostream &OS);
214  unsigned emitBinSearchTable(raw_ostream &OS);
215
216  // Lookup functions to query binary search tables.
217  void emitMapFuncBody(raw_ostream &OS, unsigned TableSize);
218
219};
220} // end anonymous namespace
221
222
223//===----------------------------------------------------------------------===//
224// Process all the instructions that model this relation (alreday present in
225// InstrDefs) and insert them into RowInstrMap which is keyed by the values of
226// the fields listed as RowFields. It stores vectors of records as values.
227// All the related instructions have the same values for the RowFields thus are
228// part of the same key-value pair.
229//===----------------------------------------------------------------------===//
230
231void MapTableEmitter::buildRowInstrMap() {
232  for (Record *CurInstr : InstrDefs) {
233    std::vector<Init*> KeyValue;
234    ListInit *RowFields = InstrMapDesc.getRowFields();
235    for (Init *RowField : RowFields->getValues()) {
236      RecordVal *RecVal = CurInstr->getValue(RowField);
237      if (RecVal == nullptr)
238        PrintFatalError(CurInstr->getLoc(), "No value " +
239                        RowField->getAsString() + " found in \"" +
240                        CurInstr->getName() + "\" instruction description.");
241      Init *CurInstrVal = RecVal->getValue();
242      KeyValue.push_back(CurInstrVal);
243    }
244
245    // Collect key instructions into KeyInstrVec. Later, these instructions are
246    // processed to assign column position to the instructions sharing
247    // their KeyValue in RowInstrMap.
248    if (isKeyColInstr(CurInstr))
249      KeyInstrVec.push_back(CurInstr);
250
251    RowInstrMap[KeyValue].push_back(CurInstr);
252  }
253}
254
255//===----------------------------------------------------------------------===//
256// Return true if an instruction is a KeyCol instruction.
257//===----------------------------------------------------------------------===//
258
259bool MapTableEmitter::isKeyColInstr(Record* CurInstr) {
260  ListInit *ColFields = InstrMapDesc.getColFields();
261  ListInit *KeyCol = InstrMapDesc.getKeyCol();
262
263  // Check if the instruction is a KeyCol instruction.
264  bool MatchFound = true;
265  for (unsigned j = 0, endCF = ColFields->size();
266      (j < endCF) && MatchFound; j++) {
267    RecordVal *ColFieldName = CurInstr->getValue(ColFields->getElement(j));
268    std::string CurInstrVal = ColFieldName->getValue()->getAsUnquotedString();
269    std::string KeyColValue = KeyCol->getElement(j)->getAsUnquotedString();
270    MatchFound = (CurInstrVal == KeyColValue);
271  }
272  return MatchFound;
273}
274
275//===----------------------------------------------------------------------===//
276// Build a map to link key instructions with the column instructions arranged
277// according to their column positions.
278//===----------------------------------------------------------------------===//
279
280void MapTableEmitter::buildMapTable() {
281  // Find column instructions for a given key based on the ColField
282  // constraints.
283  const std::vector<ListInit*> &ValueCols = InstrMapDesc.getValueCols();
284  unsigned NumOfCols = ValueCols.size();
285  for (Record *CurKeyInstr : KeyInstrVec) {
286    std::vector<Record*> ColInstrVec(NumOfCols);
287
288    // Find the column instruction based on the constraints for the column.
289    for (unsigned ColIdx = 0; ColIdx < NumOfCols; ColIdx++) {
290      ListInit *CurValueCol = ValueCols[ColIdx];
291      Record *ColInstr = getInstrForColumn(CurKeyInstr, CurValueCol);
292      ColInstrVec[ColIdx] = ColInstr;
293    }
294    MapTable[CurKeyInstr] = ColInstrVec;
295  }
296}
297
298//===----------------------------------------------------------------------===//
299// Find column instruction based on the constraints for that column.
300//===----------------------------------------------------------------------===//
301
302Record *MapTableEmitter::getInstrForColumn(Record *KeyInstr,
303                                           ListInit *CurValueCol) {
304  ListInit *RowFields = InstrMapDesc.getRowFields();
305  std::vector<Init*> KeyValue;
306
307  // Construct KeyValue using KeyInstr's values for RowFields.
308  for (Init *RowField : RowFields->getValues()) {
309    Init *KeyInstrVal = KeyInstr->getValue(RowField)->getValue();
310    KeyValue.push_back(KeyInstrVal);
311  }
312
313  // Get all the instructions that share the same KeyValue as the KeyInstr
314  // in RowInstrMap. We search through these instructions to find a match
315  // for the current column, i.e., the instruction which has the same values
316  // as CurValueCol for all the fields in ColFields.
317  const std::vector<Record*> &RelatedInstrVec = RowInstrMap[KeyValue];
318
319  ListInit *ColFields = InstrMapDesc.getColFields();
320  Record *MatchInstr = nullptr;
321
322  for (llvm::Record *CurInstr : RelatedInstrVec) {
323    bool MatchFound = true;
324    for (unsigned j = 0, endCF = ColFields->size();
325         (j < endCF) && MatchFound; j++) {
326      Init *ColFieldJ = ColFields->getElement(j);
327      Init *CurInstrInit = CurInstr->getValue(ColFieldJ)->getValue();
328      std::string CurInstrVal = CurInstrInit->getAsUnquotedString();
329      Init *ColFieldJVallue = CurValueCol->getElement(j);
330      MatchFound = (CurInstrVal == ColFieldJVallue->getAsUnquotedString());
331    }
332
333    if (MatchFound) {
334      if (MatchInstr) {
335        // Already had a match
336        // Error if multiple matches are found for a column.
337        std::string KeyValueStr;
338        for (Init *Value : KeyValue) {
339          if (!KeyValueStr.empty())
340            KeyValueStr += ", ";
341          KeyValueStr += Value->getAsString();
342        }
343
344        PrintFatalError("Multiple matches found for `" + KeyInstr->getName() +
345                        "', for the relation `" + InstrMapDesc.getName() +
346                        "', row fields [" + KeyValueStr + "], column `" +
347                        CurValueCol->getAsString() + "'");
348      }
349      MatchInstr = CurInstr;
350    }
351  }
352  return MatchInstr;
353}
354
355//===----------------------------------------------------------------------===//
356// Emit one table per relation. Only instructions with a valid relation of a
357// given type are included in the table sorted by their enum values (opcodes).
358// Binary search is used for locating instructions in the table.
359//===----------------------------------------------------------------------===//
360
361unsigned MapTableEmitter::emitBinSearchTable(raw_ostream &OS) {
362
363  ArrayRef<const CodeGenInstruction*> NumberedInstructions =
364                                            Target.getInstructionsByEnumValue();
365  StringRef Namespace = Target.getInstNamespace();
366  const std::vector<ListInit*> &ValueCols = InstrMapDesc.getValueCols();
367  unsigned NumCol = ValueCols.size();
368  unsigned TotalNumInstr = NumberedInstructions.size();
369  unsigned TableSize = 0;
370
371  OS << "static const uint16_t "<<InstrMapDesc.getName();
372  // Number of columns in the table are NumCol+1 because key instructions are
373  // emitted as first column.
374  OS << "Table[]["<< NumCol+1 << "] = {\n";
375  for (unsigned i = 0; i < TotalNumInstr; i++) {
376    Record *CurInstr = NumberedInstructions[i]->TheDef;
377    std::vector<Record*> ColInstrs = MapTable[CurInstr];
378    std::string OutStr;
379    unsigned RelExists = 0;
380    if (!ColInstrs.empty()) {
381      for (unsigned j = 0; j < NumCol; j++) {
382        if (ColInstrs[j] != nullptr) {
383          RelExists = 1;
384          OutStr += ", ";
385          OutStr += Namespace;
386          OutStr += "::";
387          OutStr += ColInstrs[j]->getName();
388        } else { OutStr += ", (uint16_t)-1U";}
389      }
390
391      if (RelExists) {
392        OS << "  { " << Namespace << "::" << CurInstr->getName();
393        OS << OutStr <<" },\n";
394        TableSize++;
395      }
396    }
397  }
398  if (!TableSize) {
399    OS << "  { " << Namespace << "::" << "INSTRUCTION_LIST_END, ";
400    OS << Namespace << "::" << "INSTRUCTION_LIST_END }";
401  }
402  OS << "}; // End of " << InstrMapDesc.getName() << "Table\n\n";
403  return TableSize;
404}
405
406//===----------------------------------------------------------------------===//
407// Emit binary search algorithm as part of the functions used to query
408// relation tables.
409//===----------------------------------------------------------------------===//
410
411void MapTableEmitter::emitBinSearch(raw_ostream &OS, unsigned TableSize) {
412  OS << "  unsigned mid;\n";
413  OS << "  unsigned start = 0;\n";
414  OS << "  unsigned end = " << TableSize << ";\n";
415  OS << "  while (start < end) {\n";
416  OS << "    mid = start + (end - start) / 2;\n";
417  OS << "    if (Opcode == " << InstrMapDesc.getName() << "Table[mid][0]) {\n";
418  OS << "      break;\n";
419  OS << "    }\n";
420  OS << "    if (Opcode < " << InstrMapDesc.getName() << "Table[mid][0])\n";
421  OS << "      end = mid;\n";
422  OS << "    else\n";
423  OS << "      start = mid + 1;\n";
424  OS << "  }\n";
425  OS << "  if (start == end)\n";
426  OS << "    return -1; // Instruction doesn't exist in this table.\n\n";
427}
428
429//===----------------------------------------------------------------------===//
430// Emit functions to query relation tables.
431//===----------------------------------------------------------------------===//
432
433void MapTableEmitter::emitMapFuncBody(raw_ostream &OS,
434                                           unsigned TableSize) {
435
436  ListInit *ColFields = InstrMapDesc.getColFields();
437  const std::vector<ListInit*> &ValueCols = InstrMapDesc.getValueCols();
438
439  // Emit binary search algorithm to locate instructions in the
440  // relation table. If found, return opcode value from the appropriate column
441  // of the table.
442  emitBinSearch(OS, TableSize);
443
444  if (ValueCols.size() > 1) {
445    for (unsigned i = 0, e = ValueCols.size(); i < e; i++) {
446      ListInit *ColumnI = ValueCols[i];
447      OS << "  if (";
448      for (unsigned j = 0, ColSize = ColumnI->size(); j < ColSize; ++j) {
449        std::string ColName = ColFields->getElement(j)->getAsUnquotedString();
450        OS << "in" << ColName;
451        OS << " == ";
452        OS << ColName << "_" << ColumnI->getElement(j)->getAsUnquotedString();
453        if (j < ColumnI->size() - 1)
454          OS << " && ";
455      }
456      OS << ")\n";
457      OS << "    return " << InstrMapDesc.getName();
458      OS << "Table[mid]["<<i+1<<"];\n";
459    }
460    OS << "  return -1;";
461  }
462  else
463    OS << "  return " << InstrMapDesc.getName() << "Table[mid][1];\n";
464
465  OS <<"}\n\n";
466}
467
468//===----------------------------------------------------------------------===//
469// Emit relation tables and the functions to query them.
470//===----------------------------------------------------------------------===//
471
472void MapTableEmitter::emitTablesWithFunc(raw_ostream &OS) {
473
474  // Emit function name and the input parameters : mostly opcode value of the
475  // current instruction. However, if a table has multiple columns (more than 2
476  // since first column is used for the key instructions), then we also need
477  // to pass another input to indicate the column to be selected.
478
479  ListInit *ColFields = InstrMapDesc.getColFields();
480  const std::vector<ListInit*> &ValueCols = InstrMapDesc.getValueCols();
481  OS << "// "<< InstrMapDesc.getName() << "\nLLVM_READONLY\n";
482  OS << "int "<< InstrMapDesc.getName() << "(uint16_t Opcode";
483  if (ValueCols.size() > 1) {
484    for (Init *CF : ColFields->getValues()) {
485      std::string ColName = CF->getAsUnquotedString();
486      OS << ", enum " << ColName << " in" << ColName;
487    }
488  }
489  OS << ") {\n";
490
491  // Emit map table.
492  unsigned TableSize = emitBinSearchTable(OS);
493
494  // Emit rest of the function body.
495  emitMapFuncBody(OS, TableSize);
496}
497
498//===----------------------------------------------------------------------===//
499// Emit enums for the column fields across all the instruction maps.
500//===----------------------------------------------------------------------===//
501
502static void emitEnums(raw_ostream &OS, RecordKeeper &Records) {
503
504  std::vector<Record*> InstrMapVec;
505  InstrMapVec = Records.getAllDerivedDefinitions("InstrMapping");
506  std::map<std::string, std::vector<Init*> > ColFieldValueMap;
507
508  // Iterate over all InstrMapping records and create a map between column
509  // fields and their possible values across all records.
510  for (Record *CurMap : InstrMapVec) {
511    ListInit *ColFields;
512    ColFields = CurMap->getValueAsListInit("ColFields");
513    ListInit *List = CurMap->getValueAsListInit("ValueCols");
514    std::vector<ListInit*> ValueCols;
515    unsigned ListSize = List->size();
516
517    for (unsigned j = 0; j < ListSize; j++) {
518      auto *ListJ = cast<ListInit>(List->getElement(j));
519
520      if (ListJ->size() != ColFields->size())
521        PrintFatalError("Record `" + CurMap->getName() + "', field "
522          "`ValueCols' entries don't match with the entries in 'ColFields' !");
523      ValueCols.push_back(ListJ);
524    }
525
526    for (unsigned j = 0, endCF = ColFields->size(); j < endCF; j++) {
527      for (unsigned k = 0; k < ListSize; k++){
528        std::string ColName = ColFields->getElement(j)->getAsUnquotedString();
529        ColFieldValueMap[ColName].push_back((ValueCols[k])->getElement(j));
530      }
531    }
532  }
533
534  for (auto &Entry : ColFieldValueMap) {
535    std::vector<Init*> FieldValues = Entry.second;
536
537    // Delete duplicate entries from ColFieldValueMap
538    for (unsigned i = 0; i < FieldValues.size() - 1; i++) {
539      Init *CurVal = FieldValues[i];
540      for (unsigned j = i+1; j < FieldValues.size(); j++) {
541        if (CurVal == FieldValues[j]) {
542          FieldValues.erase(FieldValues.begin()+j);
543          --j;
544        }
545      }
546    }
547
548    // Emit enumerated values for the column fields.
549    OS << "enum " << Entry.first << " {\n";
550    for (unsigned i = 0, endFV = FieldValues.size(); i < endFV; i++) {
551      OS << "\t" << Entry.first << "_" << FieldValues[i]->getAsUnquotedString();
552      if (i != endFV - 1)
553        OS << ",\n";
554      else
555        OS << "\n};\n\n";
556    }
557  }
558}
559
560namespace llvm {
561//===----------------------------------------------------------------------===//
562// Parse 'InstrMapping' records and use the information to form relationship
563// between instructions. These relations are emitted as a tables along with the
564// functions to query them.
565//===----------------------------------------------------------------------===//
566void EmitMapTable(RecordKeeper &Records, raw_ostream &OS) {
567  CodeGenTarget Target(Records);
568  StringRef NameSpace = Target.getInstNamespace();
569  std::vector<Record*> InstrMapVec;
570  InstrMapVec = Records.getAllDerivedDefinitions("InstrMapping");
571
572  if (InstrMapVec.empty())
573    return;
574
575  OS << "#ifdef GET_INSTRMAP_INFO\n";
576  OS << "#undef GET_INSTRMAP_INFO\n";
577  OS << "namespace llvm {\n\n";
578  OS << "namespace " << NameSpace << " {\n\n";
579
580  // Emit coulumn field names and their values as enums.
581  emitEnums(OS, Records);
582
583  // Iterate over all instruction mapping records and construct relationship
584  // maps based on the information specified there.
585  //
586  for (Record *CurMap : InstrMapVec) {
587    MapTableEmitter IMap(Target, Records, CurMap);
588
589    // Build RowInstrMap to group instructions based on their values for
590    // RowFields. In the process, also collect key instructions into
591    // KeyInstrVec.
592    IMap.buildRowInstrMap();
593
594    // Build MapTable to map key instructions with the corresponding column
595    // instructions.
596    IMap.buildMapTable();
597
598    // Emit map tables and the functions to query them.
599    IMap.emitTablesWithFunc(OS);
600  }
601  OS << "} // end namespace " << NameSpace << "\n";
602  OS << "} // end namespace llvm\n";
603  OS << "#endif // GET_INSTRMAP_INFO\n\n";
604}
605
606} // End llvm namespace
607