1 //===- SubtargetEmitter.h - Generate subtarget enumerations -----*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This tablegen backend emits subtarget enumerations.
12 //===----------------------------------------------------------------------===//
14 #ifndef SUBTARGET_EMITTER_H
15 #define SUBTARGET_EMITTER_H
17 #include "TableGenBackend.h"
18 #include "llvm/MC/MCInstrItineraries.h"
26 class SubtargetEmitter
: public TableGenBackend
{
28 RecordKeeper
&Records
;
32 void Enumeration(raw_ostream
&OS
, const char *ClassName
, bool isBits
);
33 unsigned FeatureKeyValues(raw_ostream
&OS
);
34 unsigned CPUKeyValues(raw_ostream
&OS
);
35 unsigned CollectAllItinClasses(raw_ostream
&OS
,
36 std::map
<std::string
,unsigned> &ItinClassesMap
,
37 std::vector
<Record
*> &ItinClassList
);
38 void FormItineraryStageString(const std::string
&Names
,
39 Record
*ItinData
, std::string
&ItinString
,
41 void FormItineraryOperandCycleString(Record
*ItinData
, std::string
&ItinString
,
42 unsigned &NOperandCycles
);
43 void FormItineraryBypassString(const std::string
&Names
,
45 std::string
&ItinString
, unsigned NOperandCycles
);
46 void EmitStageAndOperandCycleData(raw_ostream
&OS
, unsigned NItinClasses
,
47 std::map
<std::string
, unsigned> &ItinClassesMap
,
48 std::vector
<Record
*> &ItinClassList
,
49 std::vector
<std::vector
<InstrItinerary
> > &ProcList
);
50 void EmitProcessorData(raw_ostream
&OS
,
51 std::vector
<Record
*> &ItinClassList
,
52 std::vector
<std::vector
<InstrItinerary
> > &ProcList
);
53 void EmitProcessorLookup(raw_ostream
&OS
);
54 void EmitData(raw_ostream
&OS
);
55 void ParseFeaturesFunction(raw_ostream
&OS
, unsigned NumFeatures
,
59 SubtargetEmitter(RecordKeeper
&R
) : Records(R
), HasItineraries(false) {}
61 // run - Output the subtarget enumerations, returning true on failure.
62 void run(raw_ostream
&o
);
67 } // End llvm namespace