Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // run - Emit the main instruction description records for the target...
- void InstrInfoEmitter::run(raw_ostream &OS) {
- emitEnums(OS);
- GatherItinClasses();
- EmitSourceFileHeader("Target Instruction Descriptors", OS);
- CodeGenTarget &Target = CDP.getTargetInfo();
- const std::string &TargetName = Target.getName();
- Record *InstrInfo = Target.getInstructionSet();
- std::string Namespace = Target.getInstNamespace();
- OS << "\n#ifdef GET_INSTRINFO_MC_DESC\n";
- OS << "#undef GET_INSTRINFO_MC_DESC\n";
- OS << "namespace llvm {\n";
- OS << "namespace " << Namespace << " {\n\n";
- // Keep track of all of the def lists we have emitted already.
- std::map<std::vector<Record*>, unsigned> EmittedLists;
- unsigned ListNumber = 0;
- // Emit all of the instruction's implicit uses and defs.
- for (CodeGenTarget::inst_iterator II = Target.inst_begin(),
- E = Target.inst_end(); II != E; ++II) {
- Record *Inst = (*II)->TheDef;
- std::vector<Record*> Uses = Inst->getValueAsListOfDefs("Uses");
- if (!Uses.empty()) {
- unsigned &IL = EmittedLists[Uses];
- if (!IL) PrintDefList(Uses, IL = ++ListNumber, OS);
- }
- std::vector<Record*> Defs = Inst->getValueAsListOfDefs("Defs");
- if (!Defs.empty()) {
- unsigned &IL = EmittedLists[Defs];
- if (!IL) PrintDefList(Defs, IL = ++ListNumber, OS);
- }
- }
- OperandInfoMapTy OperandInfoIDs;
- // Emit all of the operand info records.
- EmitOperandInfo(OS, OperandInfoIDs);
- // Emit all of the MCInstrDesc records in their ENUM ordering.
- //
- OS << "\nMCInstrDesc " << "Insts[] = {\n";
- const std::vector<const CodeGenInstruction*> &NumberedInstructions =
- Target.getInstructionsByEnumValue();
- for (unsigned i = 0, e = NumberedInstructions.size(); i != e; ++i)
- emitRecord(*NumberedInstructions[i], i, InstrInfo, EmittedLists,
- OperandInfoIDs, OS);
- OS << "};\n\n";
- OS << "} // End " << Namespace << " namespace \n";
- OS << "} // End llvm namespace \n\n";
- // MCInstrInfo initialization routine.
- OS << "namespace llvm {\n";
- OS << "static inline void Init" << TargetName
- << "MCInstrInfo(MCInstrInfo *II) {\n";
- OS << " II->InitMCInstrInfo(" << Namespace << "::Insts, "
- << NumberedInstructions.size() << ");\n}\n\n";
- OS << "} // End llvm namespace \n";
- OS << "#endif // GET_INSTRINFO_MC_DESC\n\n";
- // Create a TargetInstrInfo subclass to hide the MC layer initialization.
- OS << "\n#ifdef GET_INSTRINFO_HEADER\n";
- OS << "#undef GET_INSTRINFO_HEADER\n";
- std::string ClassName = TargetName + "GenInstrInfo";
- OS << "namespace llvm {\n";
- OS << "struct " << ClassName << " : public TargetInstrInfoImpl {\n"
- << " explicit " << ClassName << "(int SO = -1, int DO = -1);\n"
- << "};\n";
- OS << "} // End llvm namespace \n";
- OS << "#endif // GET_INSTRINFO_HEADER\n\n";
- OS << "\n#ifdef GET_INSTRINFO_CTOR\n";
- OS << "#undef GET_INSTRINFO_CTOR\n";
- OS << "namespace llvm {\n";
- OS << "namespace " << Namespace << " {\n";
- OS << "extern MCInstrDesc " << "Insts[];\n";
- OS << "} // End " << Namespace << " namespace \n";
- OS << ClassName << "::" << ClassName << "(int SO, int DO)\n"
- << " : TargetInstrInfoImpl(SO, DO) {\n"
- << " InitMCInstrInfo(" << TargetName << "::Insts, "
- << NumberedInstructions.size() << ");\n}\n";
- OS << "} // End llvm namespace \n";
- OS << "#endif // GET_INSTRINFO_CTOR\n\n";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement