~ubuntu-branches/ubuntu/feisty/clamav/feisty

« back to all changes in this revision

Viewing changes to libclamav/c++/llvm/utils/TableGen/RegisterInfoEmitter.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Kees Cook
  • Date: 2007-02-20 10:33:44 UTC
  • mto: This revision was merged to the branch mainline in revision 16.
  • Revision ID: james.westby@ubuntu.com-20070220103344-zgcu2psnx9d98fpa
Tags: upstream-0.90
ImportĀ upstreamĀ versionĀ 0.90

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
//===- RegisterInfoEmitter.cpp - Generate a Register File Desc. -*- C++ -*-===//
2
 
//
3
 
//                     The LLVM Compiler Infrastructure
4
 
//
5
 
// This file is distributed under the University of Illinois Open Source
6
 
// License. See LICENSE.TXT for details.
7
 
//
8
 
//===----------------------------------------------------------------------===//
9
 
//
10
 
// This tablegen backend is responsible for emitting a description of a target
11
 
// register file for a code generator.  It uses instances of the Register,
12
 
// RegisterAliases, and RegisterClass classes to gather this information.
13
 
//
14
 
//===----------------------------------------------------------------------===//
15
 
 
16
 
#include "RegisterInfoEmitter.h"
17
 
#include "CodeGenTarget.h"
18
 
#include "CodeGenRegisters.h"
19
 
#include "Record.h"
20
 
#include "llvm/ADT/StringExtras.h"
21
 
#include "llvm/ADT/STLExtras.h"
22
 
#include <algorithm>
23
 
#include <set>
24
 
using namespace llvm;
25
 
 
26
 
// runEnums - Print out enum values for all of the registers.
27
 
void RegisterInfoEmitter::runEnums(raw_ostream &OS) {
28
 
  CodeGenTarget Target;
29
 
  const std::vector<CodeGenRegister> &Registers = Target.getRegisters();
30
 
 
31
 
  std::string Namespace = Registers[0].TheDef->getValueAsString("Namespace");
32
 
 
33
 
  EmitSourceFileHeader("Target Register Enum Values", OS);
34
 
  OS << "namespace llvm {\n\n";
35
 
 
36
 
  if (!Namespace.empty())
37
 
    OS << "namespace " << Namespace << " {\n";
38
 
  OS << "enum {\n  NoRegister,\n";
39
 
 
40
 
  for (unsigned i = 0, e = Registers.size(); i != e; ++i)
41
 
    OS << "  " << Registers[i].getName() << ", \t// " << i+1 << "\n";
42
 
  OS << "  NUM_TARGET_REGS \t// " << Registers.size()+1 << "\n";
43
 
  OS << "};\n";
44
 
  if (!Namespace.empty())
45
 
    OS << "}\n";
46
 
 
47
 
  const std::vector<Record*> SubRegIndices = Target.getSubRegIndices();
48
 
  if (!SubRegIndices.empty()) {
49
 
    OS << "\n// Subregister indices\n";
50
 
    Namespace = SubRegIndices[0]->getValueAsString("Namespace");
51
 
    if (!Namespace.empty())
52
 
      OS << "namespace " << Namespace << " {\n";
53
 
    OS << "enum {\n  NoSubRegister,\n";
54
 
    for (unsigned i = 0, e = SubRegIndices.size(); i != e; ++i)
55
 
      OS << "  " << SubRegIndices[i]->getName() << ",\t// " << i+1 << "\n";
56
 
    OS << "  NUM_TARGET_SUBREGS = " << SubRegIndices.size()+1 << "\n";
57
 
    OS << "};\n";
58
 
    if (!Namespace.empty())
59
 
      OS << "}\n";
60
 
  }
61
 
  OS << "} // End llvm namespace \n";
62
 
}
63
 
 
64
 
void RegisterInfoEmitter::runHeader(raw_ostream &OS) {
65
 
  EmitSourceFileHeader("Register Information Header Fragment", OS);
66
 
  CodeGenTarget Target;
67
 
  const std::string &TargetName = Target.getName();
68
 
  std::string ClassName = TargetName + "GenRegisterInfo";
69
 
 
70
 
  OS << "#include \"llvm/Target/TargetRegisterInfo.h\"\n";
71
 
  OS << "#include <string>\n\n";
72
 
 
73
 
  OS << "namespace llvm {\n\n";
74
 
 
75
 
  OS << "struct " << ClassName << " : public TargetRegisterInfo {\n"
76
 
     << "  explicit " << ClassName
77
 
     << "(int CallFrameSetupOpcode = -1, int CallFrameDestroyOpcode = -1);\n"
78
 
     << "  virtual int getDwarfRegNumFull(unsigned RegNum, "
79
 
     << "unsigned Flavour) const;\n"
80
 
     << "  virtual int getDwarfRegNum(unsigned RegNum, bool isEH) const = 0;\n"
81
 
     << "  virtual bool needsStackRealignment(const MachineFunction &) const\n"
82
 
     << "     { return false; }\n"
83
 
     << "  unsigned getSubReg(unsigned RegNo, unsigned Index) const;\n"
84
 
     << "  unsigned getSubRegIndex(unsigned RegNo, unsigned SubRegNo) const;\n"
85
 
     << "  unsigned composeSubRegIndices(unsigned, unsigned) const;\n"
86
 
     << "};\n\n";
87
 
 
88
 
  const std::vector<CodeGenRegisterClass> &RegisterClasses =
89
 
    Target.getRegisterClasses();
90
 
 
91
 
  if (!RegisterClasses.empty()) {
92
 
    OS << "namespace " << RegisterClasses[0].Namespace
93
 
       << " { // Register classes\n";
94
 
       
95
 
    OS << "  enum {\n";
96
 
    for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
97
 
      if (i) OS << ",\n";
98
 
      OS << "    " << RegisterClasses[i].getName() << "RegClassID";
99
 
      OS << " = " << i;
100
 
    }
101
 
    OS << "\n  };\n\n";
102
 
 
103
 
    for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
104
 
      const std::string &Name = RegisterClasses[i].getName();
105
 
 
106
 
      // Output the register class definition.
107
 
      OS << "  struct " << Name << "Class : public TargetRegisterClass {\n"
108
 
         << "    " << Name << "Class();\n"
109
 
         << RegisterClasses[i].MethodProtos << "  };\n";
110
 
 
111
 
      // Output the extern for the instance.
112
 
      OS << "  extern " << Name << "Class\t" << Name << "RegClass;\n";
113
 
      // Output the extern for the pointer to the instance (should remove).
114
 
      OS << "  static TargetRegisterClass * const "<< Name <<"RegisterClass = &"
115
 
         << Name << "RegClass;\n";
116
 
    }
117
 
    OS << "} // end of namespace " << TargetName << "\n\n";
118
 
  }
119
 
  OS << "} // End llvm namespace \n";
120
 
}
121
 
 
122
 
static void addSuperReg(Record *R, Record *S,
123
 
                  std::map<Record*, std::set<Record*>, LessRecord> &SubRegs,
124
 
                  std::map<Record*, std::set<Record*>, LessRecord> &SuperRegs,
125
 
                  std::map<Record*, std::set<Record*>, LessRecord> &Aliases) {
126
 
  if (R == S) {
127
 
    errs() << "Error: recursive sub-register relationship between"
128
 
           << " register " << getQualifiedName(R)
129
 
           << " and its sub-registers?\n";
130
 
    abort();
131
 
  }
132
 
  if (!SuperRegs[R].insert(S).second)
133
 
    return;
134
 
  SubRegs[S].insert(R);
135
 
  Aliases[R].insert(S);
136
 
  Aliases[S].insert(R);
137
 
  if (SuperRegs.count(S))
138
 
    for (std::set<Record*>::iterator I = SuperRegs[S].begin(),
139
 
           E = SuperRegs[S].end(); I != E; ++I)
140
 
      addSuperReg(R, *I, SubRegs, SuperRegs, Aliases);
141
 
}
142
 
 
143
 
static void addSubSuperReg(Record *R, Record *S,
144
 
                   std::map<Record*, std::set<Record*>, LessRecord> &SubRegs,
145
 
                   std::map<Record*, std::set<Record*>, LessRecord> &SuperRegs,
146
 
                   std::map<Record*, std::set<Record*>, LessRecord> &Aliases) {
147
 
  if (R == S) {
148
 
    errs() << "Error: recursive sub-register relationship between"
149
 
           << " register " << getQualifiedName(R)
150
 
           << " and its sub-registers?\n";
151
 
    abort();
152
 
  }
153
 
 
154
 
  if (!SubRegs[R].insert(S).second)
155
 
    return;
156
 
  addSuperReg(S, R, SubRegs, SuperRegs, Aliases);
157
 
  Aliases[R].insert(S);
158
 
  Aliases[S].insert(R);
159
 
  if (SubRegs.count(S))
160
 
    for (std::set<Record*>::iterator I = SubRegs[S].begin(),
161
 
           E = SubRegs[S].end(); I != E; ++I)
162
 
      addSubSuperReg(R, *I, SubRegs, SuperRegs, Aliases);
163
 
}
164
 
 
165
 
struct RegisterMaps {
166
 
  // Map SubRegIndex -> Register
167
 
  typedef std::map<Record*, Record*, LessRecord> SubRegMap;
168
 
  // Map Register -> SubRegMap
169
 
  typedef std::map<Record*, SubRegMap> SubRegMaps;
170
 
 
171
 
  SubRegMaps SubReg;
172
 
  SubRegMap &inferSubRegIndices(Record *Reg);
173
 
 
174
 
  // Composite SubRegIndex instances.
175
 
  // Map (SubRegIndex,SubRegIndex) -> SubRegIndex
176
 
  typedef DenseMap<std::pair<Record*,Record*>,Record*> CompositeMap;
177
 
  CompositeMap Composite;
178
 
 
179
 
  // Compute SubRegIndex compositions after inferSubRegIndices has run on all
180
 
  // registers.
181
 
  void computeComposites();
182
 
};
183
 
 
184
 
// Calculate all subregindices for Reg. Loopy subregs cause infinite recursion.
185
 
RegisterMaps::SubRegMap &RegisterMaps::inferSubRegIndices(Record *Reg) {
186
 
  SubRegMap &SRM = SubReg[Reg];
187
 
  if (!SRM.empty())
188
 
    return SRM;
189
 
  std::vector<Record*> SubRegs = Reg->getValueAsListOfDefs("SubRegs");
190
 
  std::vector<Record*> Indices = Reg->getValueAsListOfDefs("SubRegIndices");
191
 
  if (SubRegs.size() != Indices.size())
192
 
    throw "Register " + Reg->getName() + " SubRegIndices doesn't match SubRegs";
193
 
 
194
 
  // First insert the direct subregs and make sure they are fully indexed.
195
 
  for (unsigned i = 0, e = SubRegs.size(); i != e; ++i) {
196
 
    if (!SRM.insert(std::make_pair(Indices[i], SubRegs[i])).second)
197
 
      throw "SubRegIndex " + Indices[i]->getName()
198
 
        + " appears twice in Register " + Reg->getName();
199
 
    inferSubRegIndices(SubRegs[i]);
200
 
  }
201
 
 
202
 
  // Keep track of inherited subregs and how they can be reached.
203
 
  // Register -> (SubRegIndex, SubRegIndex)
204
 
  typedef std::map<Record*, std::pair<Record*,Record*>, LessRecord> OrphanMap;
205
 
  OrphanMap Orphans;
206
 
 
207
 
  // Clone inherited subregs. Here the order is important - earlier subregs take
208
 
  // precedence.
209
 
  for (unsigned i = 0, e = SubRegs.size(); i != e; ++i) {
210
 
    SubRegMap &M = SubReg[SubRegs[i]];
211
 
    for (SubRegMap::iterator si = M.begin(), se = M.end(); si != se; ++si)
212
 
      if (!SRM.insert(*si).second)
213
 
        Orphans[si->second] = std::make_pair(Indices[i], si->first);
214
 
  }
215
 
 
216
 
  // Finally process the composites.
217
 
  ListInit *Comps = Reg->getValueAsListInit("CompositeIndices");
218
 
  for (unsigned i = 0, e = Comps->size(); i != e; ++i) {
219
 
    DagInit *Pat = dynamic_cast<DagInit*>(Comps->getElement(i));
220
 
    if (!Pat)
221
 
      throw "Invalid dag '" + Comps->getElement(i)->getAsString()
222
 
        + "' in CompositeIndices";
223
 
    DefInit *BaseIdxInit = dynamic_cast<DefInit*>(Pat->getOperator());
224
 
    if (!BaseIdxInit || !BaseIdxInit->getDef()->isSubClassOf("SubRegIndex"))
225
 
      throw "Invalid SubClassIndex in " + Pat->getAsString();
226
 
 
227
 
    // Resolve list of subreg indices into R2.
228
 
    Record *R2 = Reg;
229
 
    for (DagInit::const_arg_iterator di = Pat->arg_begin(),
230
 
         de = Pat->arg_end(); di != de; ++di) {
231
 
      DefInit *IdxInit = dynamic_cast<DefInit*>(*di);
232
 
      if (!IdxInit || !IdxInit->getDef()->isSubClassOf("SubRegIndex"))
233
 
        throw "Invalid SubClassIndex in " + Pat->getAsString();
234
 
      SubRegMap::const_iterator ni = SubReg[R2].find(IdxInit->getDef());
235
 
      if (ni == SubReg[R2].end())
236
 
        throw "Composite " + Pat->getAsString() + " refers to bad index in "
237
 
          + R2->getName();
238
 
      R2 = ni->second;
239
 
    }
240
 
 
241
 
    // Insert composite index. Allow overriding inherited indices etc.
242
 
    SRM[BaseIdxInit->getDef()] = R2;
243
 
 
244
 
    // R2 is now directly addressable, no longer an orphan.
245
 
    Orphans.erase(R2);
246
 
  }
247
 
 
248
 
  // Now, Orphans contains the inherited subregisters without a direct index.
249
 
  if (!Orphans.empty()) {
250
 
    errs() << "Error: Register " << getQualifiedName(Reg)
251
 
           << " inherited subregisters without an index:\n";
252
 
    for (OrphanMap::iterator i = Orphans.begin(), e = Orphans.end(); i != e;
253
 
         ++i) {
254
 
      errs() << "  " << getQualifiedName(i->first)
255
 
             << " = " << i->second.first->getName()
256
 
             << ", " << i->second.second->getName() << "\n";
257
 
    }
258
 
    abort();
259
 
  }
260
 
  return SRM;
261
 
}
262
 
 
263
 
void RegisterMaps::computeComposites() {
264
 
  for (SubRegMaps::const_iterator sri = SubReg.begin(), sre = SubReg.end();
265
 
       sri != sre; ++sri) {
266
 
    Record *Reg1 = sri->first;
267
 
    const SubRegMap &SRM1 = sri->second;
268
 
    for (SubRegMap::const_iterator i1 = SRM1.begin(), e1 = SRM1.end();
269
 
         i1 != e1; ++i1) {
270
 
      Record *Idx1 = i1->first;
271
 
      Record *Reg2 = i1->second;
272
 
      // Ignore identity compositions.
273
 
      if (Reg1 == Reg2)
274
 
        continue;
275
 
      // If Reg2 has no subregs, Idx1 doesn't compose.
276
 
      if (!SubReg.count(Reg2))
277
 
        continue;
278
 
      const SubRegMap &SRM2 = SubReg[Reg2];
279
 
      // Try composing Idx1 with another SubRegIndex.
280
 
      for (SubRegMap::const_iterator i2 = SRM2.begin(), e2 = SRM2.end();
281
 
           i2 != e2; ++i2) {
282
 
        std::pair<Record*,Record*> IdxPair(Idx1, i2->first);
283
 
        Record *Reg3 = i2->second;
284
 
        // OK Reg1:IdxPair == Reg3. Find the index with Reg:Idx == Reg3.
285
 
        for (SubRegMap::const_iterator i1d = SRM1.begin(), e1d = SRM1.end();
286
 
             i1d != e1d; ++i1d) {
287
 
          // Ignore identity compositions.
288
 
          if (Reg2 == Reg3)
289
 
            continue;
290
 
          if (i1d->second == Reg3) {
291
 
            std::pair<CompositeMap::iterator,bool> Ins =
292
 
              Composite.insert(std::make_pair(IdxPair, i1d->first));
293
 
            // Conflicting composition?
294
 
            if (!Ins.second && Ins.first->second != i1d->first) {
295
 
              errs() << "Error: SubRegIndex " << getQualifiedName(Idx1)
296
 
                     << " and " << getQualifiedName(IdxPair.second)
297
 
                     << " compose ambiguously as "
298
 
                     << getQualifiedName(Ins.first->second) << " or "
299
 
                     << getQualifiedName(i1d->first) << "\n";
300
 
              abort();
301
 
            }
302
 
          }
303
 
        }
304
 
      }
305
 
    }
306
 
  }
307
 
 
308
 
  // We don't care about the difference between (Idx1, Idx2) -> Idx2 and invalid
309
 
  // compositions, so remove any mappings of that form.
310
 
  for (CompositeMap::iterator i = Composite.begin(), e = Composite.end();
311
 
       i != e;) {
312
 
    CompositeMap::iterator j = i;
313
 
    ++i;
314
 
    if (j->first.second == j->second)
315
 
      Composite.erase(j);
316
 
  }
317
 
}
318
 
 
319
 
class RegisterSorter {
320
 
private:
321
 
  std::map<Record*, std::set<Record*>, LessRecord> &RegisterSubRegs;
322
 
 
323
 
public:
324
 
  RegisterSorter(std::map<Record*, std::set<Record*>, LessRecord> &RS)
325
 
    : RegisterSubRegs(RS) {}
326
 
 
327
 
  bool operator()(Record *RegA, Record *RegB) {
328
 
    // B is sub-register of A.
329
 
    return RegisterSubRegs.count(RegA) && RegisterSubRegs[RegA].count(RegB);
330
 
  }
331
 
};
332
 
 
333
 
// RegisterInfoEmitter::run - Main register file description emitter.
334
 
//
335
 
void RegisterInfoEmitter::run(raw_ostream &OS) {
336
 
  CodeGenTarget Target;
337
 
  EmitSourceFileHeader("Register Information Source Fragment", OS);
338
 
 
339
 
  OS << "namespace llvm {\n\n";
340
 
 
341
 
  // Start out by emitting each of the register classes... to do this, we build
342
 
  // a set of registers which belong to a register class, this is to ensure that
343
 
  // each register is only in a single register class.
344
 
  //
345
 
  const std::vector<CodeGenRegisterClass> &RegisterClasses =
346
 
    Target.getRegisterClasses();
347
 
 
348
 
  // Loop over all of the register classes... emitting each one.
349
 
  OS << "namespace {     // Register classes...\n";
350
 
 
351
 
  // RegClassesBelongedTo - Keep track of which register classes each reg
352
 
  // belongs to.
353
 
  std::multimap<Record*, const CodeGenRegisterClass*> RegClassesBelongedTo;
354
 
 
355
 
  // Emit the register enum value arrays for each RegisterClass
356
 
  for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
357
 
    const CodeGenRegisterClass &RC = RegisterClasses[rc];
358
 
 
359
 
    // Give the register class a legal C name if it's anonymous.
360
 
    std::string Name = RC.TheDef->getName();
361
 
  
362
 
    // Emit the register list now.
363
 
    OS << "  // " << Name << " Register Class...\n"
364
 
       << "  static const unsigned " << Name
365
 
       << "[] = {\n    ";
366
 
    for (unsigned i = 0, e = RC.Elements.size(); i != e; ++i) {
367
 
      Record *Reg = RC.Elements[i];
368
 
      OS << getQualifiedName(Reg) << ", ";
369
 
 
370
 
      // Keep track of which regclasses this register is in.
371
 
      RegClassesBelongedTo.insert(std::make_pair(Reg, &RC));
372
 
    }
373
 
    OS << "\n  };\n\n";
374
 
  }
375
 
 
376
 
  // Emit the ValueType arrays for each RegisterClass
377
 
  for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
378
 
    const CodeGenRegisterClass &RC = RegisterClasses[rc];
379
 
    
380
 
    // Give the register class a legal C name if it's anonymous.
381
 
    std::string Name = RC.TheDef->getName() + "VTs";
382
 
    
383
 
    // Emit the register list now.
384
 
    OS << "  // " << Name 
385
 
       << " Register Class Value Types...\n"
386
 
       << "  static const EVT " << Name
387
 
       << "[] = {\n    ";
388
 
    for (unsigned i = 0, e = RC.VTs.size(); i != e; ++i)
389
 
      OS << getEnumName(RC.VTs[i]) << ", ";
390
 
    OS << "MVT::Other\n  };\n\n";
391
 
  }
392
 
  OS << "}  // end anonymous namespace\n\n";
393
 
  
394
 
  // Now that all of the structs have been emitted, emit the instances.
395
 
  if (!RegisterClasses.empty()) {
396
 
    OS << "namespace " << RegisterClasses[0].Namespace
397
 
       << " {   // Register class instances\n";
398
 
    for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i)
399
 
      OS << "  " << RegisterClasses[i].getName()  << "Class\t"
400
 
         << RegisterClasses[i].getName() << "RegClass;\n";
401
 
         
402
 
    std::map<unsigned, std::set<unsigned> > SuperClassMap;
403
 
    std::map<unsigned, std::set<unsigned> > SuperRegClassMap;
404
 
    OS << "\n";
405
 
 
406
 
    unsigned NumSubRegIndices = Target.getSubRegIndices().size();
407
 
 
408
 
    if (NumSubRegIndices) {
409
 
      // Emit the sub-register classes for each RegisterClass
410
 
      for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
411
 
        const CodeGenRegisterClass &RC = RegisterClasses[rc];
412
 
        std::vector<Record*> SRC(NumSubRegIndices);
413
 
        for (DenseMap<Record*,Record*>::const_iterator
414
 
             i = RC.SubRegClasses.begin(),
415
 
             e = RC.SubRegClasses.end(); i != e; ++i) {
416
 
          // Build SRC array.
417
 
          unsigned idx = Target.getSubRegIndexNo(i->first);
418
 
          SRC.at(idx-1) = i->second;
419
 
 
420
 
          // Find the register class number of i->second for SuperRegClassMap.
421
 
          for (unsigned rc2 = 0, e2 = RegisterClasses.size(); rc2 != e2; ++rc2) {
422
 
            const CodeGenRegisterClass &RC2 =  RegisterClasses[rc2];
423
 
            if (RC2.TheDef == i->second) {
424
 
              SuperRegClassMap[rc2].insert(rc);
425
 
              break;
426
 
            }
427
 
          }
428
 
        }
429
 
 
430
 
        // Give the register class a legal C name if it's anonymous.
431
 
        std::string Name = RC.TheDef->getName();
432
 
 
433
 
        OS << "  // " << Name
434
 
           << " Sub-register Classes...\n"
435
 
           << "  static const TargetRegisterClass* const "
436
 
           << Name << "SubRegClasses[] = {\n    ";
437
 
 
438
 
        for (unsigned idx = 0; idx != NumSubRegIndices; ++idx) {
439
 
          if (idx)
440
 
            OS << ", ";
441
 
          if (SRC[idx])
442
 
            OS << "&" << getQualifiedName(SRC[idx]) << "RegClass";
443
 
          else
444
 
            OS << "0";
445
 
        }
446
 
        OS << "\n  };\n\n";
447
 
      }
448
 
 
449
 
      // Emit the super-register classes for each RegisterClass
450
 
      for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
451
 
        const CodeGenRegisterClass &RC = RegisterClasses[rc];
452
 
 
453
 
        // Give the register class a legal C name if it's anonymous.
454
 
        std::string Name = RC.TheDef->getName();
455
 
 
456
 
        OS << "  // " << Name
457
 
           << " Super-register Classes...\n"
458
 
           << "  static const TargetRegisterClass* const "
459
 
           << Name << "SuperRegClasses[] = {\n    ";
460
 
 
461
 
        bool Empty = true;
462
 
        std::map<unsigned, std::set<unsigned> >::iterator I =
463
 
          SuperRegClassMap.find(rc);
464
 
        if (I != SuperRegClassMap.end()) {
465
 
          for (std::set<unsigned>::iterator II = I->second.begin(),
466
 
                 EE = I->second.end(); II != EE; ++II) {
467
 
            const CodeGenRegisterClass &RC2 = RegisterClasses[*II];
468
 
            if (!Empty)
469
 
              OS << ", ";
470
 
            OS << "&" << getQualifiedName(RC2.TheDef) << "RegClass";
471
 
            Empty = false;
472
 
          }
473
 
        }
474
 
 
475
 
        OS << (!Empty ? ", " : "") << "NULL";
476
 
        OS << "\n  };\n\n";
477
 
      }
478
 
    } else {
479
 
      // No subregindices in this target
480
 
      OS << "  static const TargetRegisterClass* const "
481
 
         << "NullRegClasses[] = { NULL };\n\n";
482
 
    }
483
 
 
484
 
    // Emit the sub-classes array for each RegisterClass
485
 
    for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
486
 
      const CodeGenRegisterClass &RC = RegisterClasses[rc];
487
 
 
488
 
      // Give the register class a legal C name if it's anonymous.
489
 
      std::string Name = RC.TheDef->getName();
490
 
 
491
 
      OS << "  // " << Name 
492
 
         << " Register Class sub-classes...\n"
493
 
         << "  static const TargetRegisterClass* const "
494
 
         << Name << "Subclasses[] = {\n    ";
495
 
 
496
 
      bool Empty = true;
497
 
      for (unsigned rc2 = 0, e2 = RegisterClasses.size(); rc2 != e2; ++rc2) {
498
 
        const CodeGenRegisterClass &RC2 = RegisterClasses[rc2];
499
 
 
500
 
        // Sub-classes are used to determine if a virtual register can be used
501
 
        // as an instruction operand, or if it must be copied first.
502
 
        if (rc == rc2 || !RC.hasSubClass(&RC2)) continue;
503
 
      
504
 
        if (!Empty) OS << ", ";
505
 
        OS << "&" << getQualifiedName(RC2.TheDef) << "RegClass";
506
 
        Empty = false;
507
 
 
508
 
        std::map<unsigned, std::set<unsigned> >::iterator SCMI =
509
 
          SuperClassMap.find(rc2);
510
 
        if (SCMI == SuperClassMap.end()) {
511
 
          SuperClassMap.insert(std::make_pair(rc2, std::set<unsigned>()));
512
 
          SCMI = SuperClassMap.find(rc2);
513
 
        }
514
 
        SCMI->second.insert(rc);
515
 
      }
516
 
 
517
 
      OS << (!Empty ? ", " : "") << "NULL";
518
 
      OS << "\n  };\n\n";
519
 
    }
520
 
 
521
 
    for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
522
 
      const CodeGenRegisterClass &RC = RegisterClasses[rc];
523
 
 
524
 
      // Give the register class a legal C name if it's anonymous.
525
 
      std::string Name = RC.TheDef->getName();
526
 
 
527
 
      OS << "  // " << Name 
528
 
         << " Register Class super-classes...\n"
529
 
         << "  static const TargetRegisterClass* const "
530
 
         << Name << "Superclasses[] = {\n    ";
531
 
 
532
 
      bool Empty = true;
533
 
      std::map<unsigned, std::set<unsigned> >::iterator I =
534
 
        SuperClassMap.find(rc);
535
 
      if (I != SuperClassMap.end()) {
536
 
        for (std::set<unsigned>::iterator II = I->second.begin(),
537
 
               EE = I->second.end(); II != EE; ++II) {
538
 
          const CodeGenRegisterClass &RC2 = RegisterClasses[*II];
539
 
          if (!Empty) OS << ", ";
540
 
          OS << "&" << getQualifiedName(RC2.TheDef) << "RegClass";
541
 
          Empty = false;        
542
 
        }
543
 
      }
544
 
 
545
 
      OS << (!Empty ? ", " : "") << "NULL";
546
 
      OS << "\n  };\n\n";
547
 
    }
548
 
 
549
 
 
550
 
    for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
551
 
      const CodeGenRegisterClass &RC = RegisterClasses[i];
552
 
      OS << RC.MethodBodies << "\n";
553
 
      OS << RC.getName() << "Class::" << RC.getName() 
554
 
         << "Class()  : TargetRegisterClass("
555
 
         << RC.getName() + "RegClassID" << ", "
556
 
         << '\"' << RC.getName() << "\", "
557
 
         << RC.getName() + "VTs" << ", "
558
 
         << RC.getName() + "Subclasses" << ", "
559
 
         << RC.getName() + "Superclasses" << ", "
560
 
         << (NumSubRegIndices ? RC.getName() + "Sub" : std::string("Null"))
561
 
         << "RegClasses, "
562
 
         << (NumSubRegIndices ? RC.getName() + "Super" : std::string("Null"))
563
 
         << "RegClasses, "
564
 
         << RC.SpillSize/8 << ", "
565
 
         << RC.SpillAlignment/8 << ", "
566
 
         << RC.CopyCost << ", "
567
 
         << RC.getName() << ", " << RC.getName() << " + " << RC.Elements.size()
568
 
         << ") {}\n";
569
 
    }
570
 
  
571
 
    OS << "}\n";
572
 
  }
573
 
 
574
 
  OS << "\nnamespace {\n";
575
 
  OS << "  const TargetRegisterClass* const RegisterClasses[] = {\n";
576
 
  for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i)
577
 
    OS << "    &" << getQualifiedName(RegisterClasses[i].TheDef)
578
 
       << "RegClass,\n";
579
 
  OS << "  };\n";
580
 
 
581
 
  // Emit register sub-registers / super-registers, aliases...
582
 
  std::map<Record*, std::set<Record*>, LessRecord> RegisterSubRegs;
583
 
  std::map<Record*, std::set<Record*>, LessRecord> RegisterSuperRegs;
584
 
  std::map<Record*, std::set<Record*>, LessRecord> RegisterAliases;
585
 
  typedef std::map<Record*, std::vector<int64_t>, LessRecord> DwarfRegNumsMapTy;
586
 
  DwarfRegNumsMapTy DwarfRegNums;
587
 
  
588
 
  const std::vector<CodeGenRegister> &Regs = Target.getRegisters();
589
 
 
590
 
  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
591
 
    Record *R = Regs[i].TheDef;
592
 
    std::vector<Record*> LI = Regs[i].TheDef->getValueAsListOfDefs("Aliases");
593
 
    // Add information that R aliases all of the elements in the list... and
594
 
    // that everything in the list aliases R.
595
 
    for (unsigned j = 0, e = LI.size(); j != e; ++j) {
596
 
      Record *Reg = LI[j];
597
 
      if (RegisterAliases[R].count(Reg))
598
 
        errs() << "Warning: register alias between " << getQualifiedName(R)
599
 
               << " and " << getQualifiedName(Reg)
600
 
               << " specified multiple times!\n";
601
 
      RegisterAliases[R].insert(Reg);
602
 
 
603
 
      if (RegisterAliases[Reg].count(R))
604
 
        errs() << "Warning: register alias between " << getQualifiedName(R)
605
 
               << " and " << getQualifiedName(Reg)
606
 
               << " specified multiple times!\n";
607
 
      RegisterAliases[Reg].insert(R);
608
 
    }
609
 
  }
610
 
 
611
 
  // Process sub-register sets.
612
 
  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
613
 
    Record *R = Regs[i].TheDef;
614
 
    std::vector<Record*> LI = Regs[i].TheDef->getValueAsListOfDefs("SubRegs");
615
 
    // Process sub-register set and add aliases information.
616
 
    for (unsigned j = 0, e = LI.size(); j != e; ++j) {
617
 
      Record *SubReg = LI[j];
618
 
      if (RegisterSubRegs[R].count(SubReg))
619
 
        errs() << "Warning: register " << getQualifiedName(SubReg)
620
 
               << " specified as a sub-register of " << getQualifiedName(R)
621
 
               << " multiple times!\n";
622
 
      addSubSuperReg(R, SubReg, RegisterSubRegs, RegisterSuperRegs,
623
 
                     RegisterAliases);
624
 
    }
625
 
  }
626
 
  
627
 
  // Print the SubregHashTable, a simple quadratically probed
628
 
  // hash table for determining if a register is a subregister
629
 
  // of another register.
630
 
  unsigned NumSubRegs = 0;
631
 
  std::map<Record*, unsigned> RegNo;
632
 
  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
633
 
    RegNo[Regs[i].TheDef] = i;
634
 
    NumSubRegs += RegisterSubRegs[Regs[i].TheDef].size();
635
 
  }
636
 
  
637
 
  unsigned SubregHashTableSize = 2 * NextPowerOf2(2 * NumSubRegs);
638
 
  unsigned* SubregHashTable = new unsigned[2 * SubregHashTableSize];
639
 
  std::fill(SubregHashTable, SubregHashTable + 2 * SubregHashTableSize, ~0U);
640
 
  
641
 
  unsigned hashMisses = 0;
642
 
  
643
 
  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
644
 
    Record* R = Regs[i].TheDef;
645
 
    for (std::set<Record*>::iterator I = RegisterSubRegs[R].begin(),
646
 
         E = RegisterSubRegs[R].end(); I != E; ++I) {
647
 
      Record* RJ = *I;
648
 
      // We have to increase the indices of both registers by one when
649
 
      // computing the hash because, in the generated code, there
650
 
      // will be an extra empty slot at register 0.
651
 
      size_t index = ((i+1) + (RegNo[RJ]+1) * 37) & (SubregHashTableSize-1);
652
 
      unsigned ProbeAmt = 2;
653
 
      while (SubregHashTable[index*2] != ~0U &&
654
 
             SubregHashTable[index*2+1] != ~0U) {
655
 
        index = (index + ProbeAmt) & (SubregHashTableSize-1);
656
 
        ProbeAmt += 2;
657
 
        
658
 
        hashMisses++;
659
 
      }
660
 
      
661
 
      SubregHashTable[index*2] = i;
662
 
      SubregHashTable[index*2+1] = RegNo[RJ];
663
 
    }
664
 
  }
665
 
  
666
 
  OS << "\n\n  // Number of hash collisions: " << hashMisses << "\n";
667
 
  
668
 
  if (SubregHashTableSize) {
669
 
    std::string Namespace = Regs[0].TheDef->getValueAsString("Namespace");
670
 
    
671
 
    OS << "  const unsigned SubregHashTable[] = { ";
672
 
    for (unsigned i = 0; i < SubregHashTableSize - 1; ++i) {
673
 
      if (i != 0)
674
 
        // Insert spaces for nice formatting.
675
 
        OS << "                                       ";
676
 
      
677
 
      if (SubregHashTable[2*i] != ~0U) {
678
 
        OS << getQualifiedName(Regs[SubregHashTable[2*i]].TheDef) << ", "
679
 
           << getQualifiedName(Regs[SubregHashTable[2*i+1]].TheDef) << ", \n";
680
 
      } else {
681
 
        OS << Namespace << "::NoRegister, " << Namespace << "::NoRegister, \n";
682
 
      }
683
 
    }
684
 
    
685
 
    unsigned Idx = SubregHashTableSize*2-2;
686
 
    if (SubregHashTable[Idx] != ~0U) {
687
 
      OS << "                                       "
688
 
         << getQualifiedName(Regs[SubregHashTable[Idx]].TheDef) << ", "
689
 
         << getQualifiedName(Regs[SubregHashTable[Idx+1]].TheDef) << " };\n";
690
 
    } else {
691
 
      OS << Namespace << "::NoRegister, " << Namespace << "::NoRegister };\n";
692
 
    }
693
 
    
694
 
    OS << "  const unsigned SubregHashTableSize = "
695
 
       << SubregHashTableSize << ";\n";
696
 
  } else {
697
 
    OS << "  const unsigned SubregHashTable[] = { ~0U, ~0U };\n"
698
 
       << "  const unsigned SubregHashTableSize = 1;\n";
699
 
  }
700
 
  
701
 
  delete [] SubregHashTable;
702
 
 
703
 
 
704
 
  // Print the AliasHashTable, a simple quadratically probed
705
 
  // hash table for determining if a register aliases another register.
706
 
  unsigned NumAliases = 0;
707
 
  RegNo.clear();
708
 
  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
709
 
    RegNo[Regs[i].TheDef] = i;
710
 
    NumAliases += RegisterAliases[Regs[i].TheDef].size();
711
 
  }
712
 
  
713
 
  unsigned AliasesHashTableSize = 2 * NextPowerOf2(2 * NumAliases);
714
 
  unsigned* AliasesHashTable = new unsigned[2 * AliasesHashTableSize];
715
 
  std::fill(AliasesHashTable, AliasesHashTable + 2 * AliasesHashTableSize, ~0U);
716
 
  
717
 
  hashMisses = 0;
718
 
  
719
 
  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
720
 
    Record* R = Regs[i].TheDef;
721
 
    for (std::set<Record*>::iterator I = RegisterAliases[R].begin(),
722
 
         E = RegisterAliases[R].end(); I != E; ++I) {
723
 
      Record* RJ = *I;
724
 
      // We have to increase the indices of both registers by one when
725
 
      // computing the hash because, in the generated code, there
726
 
      // will be an extra empty slot at register 0.
727
 
      size_t index = ((i+1) + (RegNo[RJ]+1) * 37) & (AliasesHashTableSize-1);
728
 
      unsigned ProbeAmt = 2;
729
 
      while (AliasesHashTable[index*2] != ~0U &&
730
 
             AliasesHashTable[index*2+1] != ~0U) {
731
 
        index = (index + ProbeAmt) & (AliasesHashTableSize-1);
732
 
        ProbeAmt += 2;
733
 
        
734
 
        hashMisses++;
735
 
      }
736
 
      
737
 
      AliasesHashTable[index*2] = i;
738
 
      AliasesHashTable[index*2+1] = RegNo[RJ];
739
 
    }
740
 
  }
741
 
  
742
 
  OS << "\n\n  // Number of hash collisions: " << hashMisses << "\n";
743
 
  
744
 
  if (AliasesHashTableSize) {
745
 
    std::string Namespace = Regs[0].TheDef->getValueAsString("Namespace");
746
 
    
747
 
    OS << "  const unsigned AliasesHashTable[] = { ";
748
 
    for (unsigned i = 0; i < AliasesHashTableSize - 1; ++i) {
749
 
      if (i != 0)
750
 
        // Insert spaces for nice formatting.
751
 
        OS << "                                       ";
752
 
      
753
 
      if (AliasesHashTable[2*i] != ~0U) {
754
 
        OS << getQualifiedName(Regs[AliasesHashTable[2*i]].TheDef) << ", "
755
 
           << getQualifiedName(Regs[AliasesHashTable[2*i+1]].TheDef) << ", \n";
756
 
      } else {
757
 
        OS << Namespace << "::NoRegister, " << Namespace << "::NoRegister, \n";
758
 
      }
759
 
    }
760
 
    
761
 
    unsigned Idx = AliasesHashTableSize*2-2;
762
 
    if (AliasesHashTable[Idx] != ~0U) {
763
 
      OS << "                                       "
764
 
         << getQualifiedName(Regs[AliasesHashTable[Idx]].TheDef) << ", "
765
 
         << getQualifiedName(Regs[AliasesHashTable[Idx+1]].TheDef) << " };\n";
766
 
    } else {
767
 
      OS << Namespace << "::NoRegister, " << Namespace << "::NoRegister };\n";
768
 
    }
769
 
    
770
 
    OS << "  const unsigned AliasesHashTableSize = "
771
 
       << AliasesHashTableSize << ";\n";
772
 
  } else {
773
 
    OS << "  const unsigned AliasesHashTable[] = { ~0U, ~0U };\n"
774
 
       << "  const unsigned AliasesHashTableSize = 1;\n";
775
 
  }
776
 
  
777
 
  delete [] AliasesHashTable;
778
 
 
779
 
  if (!RegisterAliases.empty())
780
 
    OS << "\n\n  // Register Alias Sets...\n";
781
 
 
782
 
  // Emit the empty alias list
783
 
  OS << "  const unsigned Empty_AliasSet[] = { 0 };\n";
784
 
  // Loop over all of the registers which have aliases, emitting the alias list
785
 
  // to memory.
786
 
  for (std::map<Record*, std::set<Record*>, LessRecord >::iterator
787
 
         I = RegisterAliases.begin(), E = RegisterAliases.end(); I != E; ++I) {
788
 
    if (I->second.empty())
789
 
      continue;
790
 
    OS << "  const unsigned " << I->first->getName() << "_AliasSet[] = { ";
791
 
    for (std::set<Record*>::iterator ASI = I->second.begin(),
792
 
           E = I->second.end(); ASI != E; ++ASI)
793
 
      OS << getQualifiedName(*ASI) << ", ";
794
 
    OS << "0 };\n";
795
 
  }
796
 
 
797
 
  if (!RegisterSubRegs.empty())
798
 
    OS << "\n\n  // Register Sub-registers Sets...\n";
799
 
 
800
 
  // Emit the empty sub-registers list
801
 
  OS << "  const unsigned Empty_SubRegsSet[] = { 0 };\n";
802
 
  // Loop over all of the registers which have sub-registers, emitting the
803
 
  // sub-registers list to memory.
804
 
  for (std::map<Record*, std::set<Record*>, LessRecord>::iterator
805
 
         I = RegisterSubRegs.begin(), E = RegisterSubRegs.end(); I != E; ++I) {
806
 
   if (I->second.empty())
807
 
     continue;
808
 
    OS << "  const unsigned " << I->first->getName() << "_SubRegsSet[] = { ";
809
 
    std::vector<Record*> SubRegsVector;
810
 
    for (std::set<Record*>::iterator ASI = I->second.begin(),
811
 
           E = I->second.end(); ASI != E; ++ASI)
812
 
      SubRegsVector.push_back(*ASI);
813
 
    RegisterSorter RS(RegisterSubRegs);
814
 
    std::stable_sort(SubRegsVector.begin(), SubRegsVector.end(), RS);
815
 
    for (unsigned i = 0, e = SubRegsVector.size(); i != e; ++i)
816
 
      OS << getQualifiedName(SubRegsVector[i]) << ", ";
817
 
    OS << "0 };\n";
818
 
  }
819
 
 
820
 
  if (!RegisterSuperRegs.empty())
821
 
    OS << "\n\n  // Register Super-registers Sets...\n";
822
 
 
823
 
  // Emit the empty super-registers list
824
 
  OS << "  const unsigned Empty_SuperRegsSet[] = { 0 };\n";
825
 
  // Loop over all of the registers which have super-registers, emitting the
826
 
  // super-registers list to memory.
827
 
  for (std::map<Record*, std::set<Record*>, LessRecord >::iterator
828
 
         I = RegisterSuperRegs.begin(), E = RegisterSuperRegs.end(); I != E; ++I) {
829
 
    if (I->second.empty())
830
 
      continue;
831
 
    OS << "  const unsigned " << I->first->getName() << "_SuperRegsSet[] = { ";
832
 
 
833
 
    std::vector<Record*> SuperRegsVector;
834
 
    for (std::set<Record*>::iterator ASI = I->second.begin(),
835
 
           E = I->second.end(); ASI != E; ++ASI)
836
 
      SuperRegsVector.push_back(*ASI);
837
 
    RegisterSorter RS(RegisterSubRegs);
838
 
    std::stable_sort(SuperRegsVector.begin(), SuperRegsVector.end(), RS);
839
 
    for (unsigned i = 0, e = SuperRegsVector.size(); i != e; ++i)
840
 
      OS << getQualifiedName(SuperRegsVector[i]) << ", ";
841
 
    OS << "0 };\n";
842
 
  }
843
 
 
844
 
  OS<<"\n  const TargetRegisterDesc RegisterDescriptors[] = { // Descriptors\n";
845
 
  OS << "    { \"NOREG\",\t0,\t0,\t0 },\n";
846
 
 
847
 
  // Now that register alias and sub-registers sets have been emitted, emit the
848
 
  // register descriptors now.
849
 
  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
850
 
    const CodeGenRegister &Reg = Regs[i];
851
 
    OS << "    { \"";
852
 
    OS << Reg.getName() << "\",\t";
853
 
    if (!RegisterAliases[Reg.TheDef].empty())
854
 
      OS << Reg.getName() << "_AliasSet,\t";
855
 
    else
856
 
      OS << "Empty_AliasSet,\t";
857
 
    if (!RegisterSubRegs[Reg.TheDef].empty())
858
 
      OS << Reg.getName() << "_SubRegsSet,\t";
859
 
    else
860
 
      OS << "Empty_SubRegsSet,\t";
861
 
    if (!RegisterSuperRegs[Reg.TheDef].empty())
862
 
      OS << Reg.getName() << "_SuperRegsSet },\n";
863
 
    else
864
 
      OS << "Empty_SuperRegsSet },\n";
865
 
  }
866
 
  OS << "  };\n";      // End of register descriptors...
867
 
 
868
 
  // Emit SubRegIndex names, skipping 0
869
 
  const std::vector<Record*> SubRegIndices = Target.getSubRegIndices();
870
 
  OS << "\n  const char *const SubRegIndexTable[] = { \"";
871
 
  for (unsigned i = 0, e = SubRegIndices.size(); i != e; ++i) {
872
 
    OS << SubRegIndices[i]->getName();
873
 
    if (i+1 != e)
874
 
      OS << "\", \"";
875
 
  }
876
 
  OS << "\" };\n\n";
877
 
  OS << "}\n\n";       // End of anonymous namespace...
878
 
 
879
 
  std::string ClassName = Target.getName() + "GenRegisterInfo";
880
 
 
881
 
  // Calculate the mapping of subregister+index pairs to physical registers.
882
 
  RegisterMaps RegMaps;
883
 
 
884
 
  // Emit the subregister + index mapping function based on the information
885
 
  // calculated above.
886
 
  OS << "unsigned " << ClassName
887
 
     << "::getSubReg(unsigned RegNo, unsigned Index) const {\n"
888
 
     << "  switch (RegNo) {\n"
889
 
     << "  default:\n    return 0;\n";
890
 
  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
891
 
    RegisterMaps::SubRegMap &SRM = RegMaps.inferSubRegIndices(Regs[i].TheDef);
892
 
    if (SRM.empty())
893
 
      continue;
894
 
    OS << "  case " << getQualifiedName(Regs[i].TheDef) << ":\n";
895
 
    OS << "    switch (Index) {\n";
896
 
    OS << "    default: return 0;\n";
897
 
    for (RegisterMaps::SubRegMap::const_iterator ii = SRM.begin(),
898
 
         ie = SRM.end(); ii != ie; ++ii)
899
 
      OS << "    case " << getQualifiedName(ii->first)
900
 
         << ": return " << getQualifiedName(ii->second) << ";\n";
901
 
    OS << "    };\n" << "    break;\n";
902
 
  }
903
 
  OS << "  };\n";
904
 
  OS << "  return 0;\n";
905
 
  OS << "}\n\n";
906
 
 
907
 
  OS << "unsigned " << ClassName
908
 
     << "::getSubRegIndex(unsigned RegNo, unsigned SubRegNo) const {\n"
909
 
     << "  switch (RegNo) {\n"
910
 
     << "  default:\n    return 0;\n";
911
 
   for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
912
 
     RegisterMaps::SubRegMap &SRM = RegMaps.SubReg[Regs[i].TheDef];
913
 
     if (SRM.empty())
914
 
       continue;
915
 
    OS << "  case " << getQualifiedName(Regs[i].TheDef) << ":\n";
916
 
    for (RegisterMaps::SubRegMap::const_iterator ii = SRM.begin(),
917
 
         ie = SRM.end(); ii != ie; ++ii)
918
 
      OS << "    if (SubRegNo == " << getQualifiedName(ii->second)
919
 
         << ")  return " << getQualifiedName(ii->first) << ";\n";
920
 
    OS << "    return 0;\n";
921
 
  }
922
 
  OS << "  };\n";
923
 
  OS << "  return 0;\n";
924
 
  OS << "}\n\n";
925
 
 
926
 
  // Emit composeSubRegIndices
927
 
  RegMaps.computeComposites();
928
 
  OS << "unsigned " << ClassName
929
 
     << "::composeSubRegIndices(unsigned IdxA, unsigned IdxB) const {\n"
930
 
     << "  switch (IdxA) {\n"
931
 
     << "  default:\n    return IdxB;\n";
932
 
  for (unsigned i = 0, e = SubRegIndices.size(); i != e; ++i) {
933
 
    bool Open = false;
934
 
    for (unsigned j = 0; j != e; ++j) {
935
 
      if (Record *Comp = RegMaps.Composite.lookup(
936
 
                          std::make_pair(SubRegIndices[i], SubRegIndices[j]))) {
937
 
        if (!Open) {
938
 
          OS << "  case " << getQualifiedName(SubRegIndices[i])
939
 
             << ": switch(IdxB) {\n    default: return IdxB;\n";
940
 
          Open = true;
941
 
        }
942
 
        OS << "    case " << getQualifiedName(SubRegIndices[j])
943
 
           << ": return " << getQualifiedName(Comp) << ";\n";
944
 
      }
945
 
    }
946
 
    if (Open)
947
 
      OS << "    }\n";
948
 
  }
949
 
  OS << "  }\n}\n\n";
950
 
 
951
 
  // Emit the constructor of the class...
952
 
  OS << ClassName << "::" << ClassName
953
 
     << "(int CallFrameSetupOpcode, int CallFrameDestroyOpcode)\n"
954
 
     << "  : TargetRegisterInfo(RegisterDescriptors, " << Regs.size()+1
955
 
     << ", RegisterClasses, RegisterClasses+" << RegisterClasses.size() <<",\n"
956
 
     << "                 SubRegIndexTable,\n"
957
 
     << "                 CallFrameSetupOpcode, CallFrameDestroyOpcode,\n"
958
 
     << "                 SubregHashTable, SubregHashTableSize,\n"
959
 
     << "                 AliasesHashTable, AliasesHashTableSize) {\n"
960
 
     << "}\n\n";
961
 
 
962
 
  // Collect all information about dwarf register numbers
963
 
 
964
 
  // First, just pull all provided information to the map
965
 
  unsigned maxLength = 0;
966
 
  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
967
 
    Record *Reg = Regs[i].TheDef;
968
 
    std::vector<int64_t> RegNums = Reg->getValueAsListOfInts("DwarfNumbers");
969
 
    maxLength = std::max((size_t)maxLength, RegNums.size());
970
 
    if (DwarfRegNums.count(Reg))
971
 
      errs() << "Warning: DWARF numbers for register " << getQualifiedName(Reg)
972
 
             << "specified multiple times\n";
973
 
    DwarfRegNums[Reg] = RegNums;
974
 
  }
975
 
 
976
 
  // Now we know maximal length of number list. Append -1's, where needed
977
 
  for (DwarfRegNumsMapTy::iterator 
978
 
       I = DwarfRegNums.begin(), E = DwarfRegNums.end(); I != E; ++I)
979
 
    for (unsigned i = I->second.size(), e = maxLength; i != e; ++i)
980
 
      I->second.push_back(-1);
981
 
 
982
 
  // Emit information about the dwarf register numbers.
983
 
  OS << "int " << ClassName << "::getDwarfRegNumFull(unsigned RegNum, "
984
 
     << "unsigned Flavour) const {\n"
985
 
     << "  switch (Flavour) {\n"
986
 
     << "  default:\n"
987
 
     << "    assert(0 && \"Unknown DWARF flavour\");\n"
988
 
     << "    return -1;\n";
989
 
  
990
 
  for (unsigned i = 0, e = maxLength; i != e; ++i) {
991
 
    OS << "  case " << i << ":\n"
992
 
       << "    switch (RegNum) {\n"
993
 
       << "    default:\n"
994
 
       << "      assert(0 && \"Invalid RegNum\");\n"
995
 
       << "      return -1;\n";
996
 
    
997
 
    // Sort by name to get a stable order.
998
 
    
999
 
 
1000
 
    for (DwarfRegNumsMapTy::iterator 
1001
 
           I = DwarfRegNums.begin(), E = DwarfRegNums.end(); I != E; ++I) {
1002
 
      int RegNo = I->second[i];
1003
 
      if (RegNo != -2)
1004
 
        OS << "    case " << getQualifiedName(I->first) << ":\n"
1005
 
           << "      return " << RegNo << ";\n";
1006
 
      else
1007
 
        OS << "    case " << getQualifiedName(I->first) << ":\n"
1008
 
           << "      assert(0 && \"Invalid register for this mode\");\n"
1009
 
           << "      return -1;\n";
1010
 
    }
1011
 
    OS << "    };\n";
1012
 
  }
1013
 
    
1014
 
  OS << "  };\n}\n\n";
1015
 
 
1016
 
  OS << "} // End llvm namespace \n";
1017
 
}