003 File Manager
Current Path:
/usr/src/contrib/llvm-project/llvm/utils/TableGen
usr
/
src
/
contrib
/
llvm-project
/
llvm
/
utils
/
TableGen
/
📁
..
📄
AsmMatcherEmitter.cpp
(149.98 KB)
📄
AsmWriterEmitter.cpp
(46.29 KB)
📄
AsmWriterInst.cpp
(7.57 KB)
📄
AsmWriterInst.h
(3.83 KB)
📄
Attributes.cpp
(3.12 KB)
📄
CTagsEmitter.cpp
(2.52 KB)
📄
CallingConvEmitter.cpp
(11.74 KB)
📄
CodeEmitterGen.cpp
(22.5 KB)
📄
CodeGenDAGPatterns.cpp
(168.72 KB)
📄
CodeGenDAGPatterns.h
(47.85 KB)
📄
CodeGenHwModes.cpp
(3.45 KB)
📄
CodeGenHwModes.h
(1.84 KB)
📄
CodeGenInstruction.cpp
(30.97 KB)
📄
CodeGenInstruction.h
(13.7 KB)
📄
CodeGenIntrinsics.h
(6.6 KB)
📄
CodeGenMapTable.cpp
(23.38 KB)
📄
CodeGenRegisters.cpp
(90.68 KB)
📄
CodeGenRegisters.h
(29.9 KB)
📄
CodeGenSchedule.cpp
(84.92 KB)
📄
CodeGenSchedule.h
(23.14 KB)
📄
CodeGenTarget.cpp
(32.63 KB)
📄
CodeGenTarget.h
(7.22 KB)
📄
DAGISelEmitter.cpp
(6.92 KB)
📄
DAGISelMatcher.cpp
(13.53 KB)
📄
DAGISelMatcher.h
(37.72 KB)
📄
DAGISelMatcherEmitter.cpp
(37.44 KB)
📄
DAGISelMatcherGen.cpp
(44.06 KB)
📄
DAGISelMatcherOpt.cpp
(17.35 KB)
📄
DFAEmitter.cpp
(13.11 KB)
📄
DFAEmitter.h
(3.96 KB)
📄
DFAPacketizerEmitter.cpp
(13.02 KB)
📄
DirectiveEmitter.cpp
(20.15 KB)
📄
DisassemblerEmitter.cpp
(7.02 KB)
📄
ExegesisEmitter.cpp
(7.39 KB)
📄
FastISelEmitter.cpp
(30.83 KB)
📄
FixedLenDecoderEmitter.cpp
(90.04 KB)
📄
GICombinerEmitter.cpp
(40.12 KB)
📁
GlobalISel
📄
GlobalISelEmitter.cpp
(215.56 KB)
📄
InfoByHwMode.cpp
(6.69 KB)
📄
InfoByHwMode.h
(5.74 KB)
📄
InstrDocsEmitter.cpp
(7.05 KB)
📄
InstrInfoEmitter.cpp
(31.52 KB)
📄
IntrinsicEmitter.cpp
(32.87 KB)
📄
OptEmitter.cpp
(2.9 KB)
📄
OptEmitter.h
(575 B)
📄
OptParserEmitter.cpp
(15.16 KB)
📄
OptRSTEmitter.cpp
(2.71 KB)
📄
PredicateExpander.cpp
(17.39 KB)
📄
PredicateExpander.h
(5.19 KB)
📄
PseudoLoweringEmitter.cpp
(11.8 KB)
📄
RISCVCompressInstEmitter.cpp
(39.23 KB)
📄
RegisterBankEmitter.cpp
(12.52 KB)
📄
RegisterInfoEmitter.cpp
(61.32 KB)
📄
SDNodeProperties.cpp
(1.9 KB)
📄
SDNodeProperties.h
(985 B)
📄
SearchableTableEmitter.cpp
(26.81 KB)
📄
SequenceToOffsetTable.h
(8.49 KB)
📄
SubtargetEmitter.cpp
(70.77 KB)
📄
SubtargetFeatureInfo.cpp
(5.72 KB)
📄
SubtargetFeatureInfo.h
(4.05 KB)
📄
TableGen.cpp
(9.7 KB)
📄
TableGenBackends.h
(4.62 KB)
📄
Types.cpp
(1.46 KB)
📄
Types.h
(900 B)
📄
WebAssemblyDisassemblerEmitter.cpp
(6.79 KB)
📄
WebAssemblyDisassemblerEmitter.h
(980 B)
📄
X86DisassemblerShared.h
(1.88 KB)
📄
X86DisassemblerTables.cpp
(42.64 KB)
📄
X86DisassemblerTables.h
(11.7 KB)
📄
X86EVEX2VEXTablesEmitter.cpp
(8.77 KB)
📄
X86FoldTablesEmitter.cpp
(26.09 KB)
📄
X86ModRMFilters.cpp
(636 B)
📄
X86ModRMFilters.h
(4.69 KB)
📄
X86RecognizableInstr.cpp
(47.05 KB)
📄
X86RecognizableInstr.h
(14.13 KB)
Editing: InstrDocsEmitter.cpp
//===- InstrDocsEmitter.cpp - Opcode Documentation Generator --------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // InstrDocsEmitter generates restructured text documentation for the opcodes // that can be used by MachineInstr. For each opcode, the documentation lists: // * Opcode name // * Assembly string // * Flags (e.g. mayLoad, isBranch, ...) // * Operands, including type and name // * Operand constraints // * Implicit register uses & defs // * Predicates // //===----------------------------------------------------------------------===// #include "CodeGenDAGPatterns.h" #include "CodeGenInstruction.h" #include "CodeGenTarget.h" #include "TableGenBackends.h" #include "llvm/TableGen/Record.h" #include <string> #include <vector> using namespace llvm; namespace llvm { void writeTitle(StringRef Str, raw_ostream &OS, char Kind = '-') { OS << std::string(Str.size(), Kind) << "\n" << Str << "\n" << std::string(Str.size(), Kind) << "\n"; } void writeHeader(StringRef Str, raw_ostream &OS, char Kind = '-') { OS << Str << "\n" << std::string(Str.size(), Kind) << "\n"; } std::string escapeForRST(StringRef Str) { std::string Result; Result.reserve(Str.size() + 4); for (char C : Str) { switch (C) { // We want special characters to be shown as their C escape codes. case '\n': Result += "\\n"; break; case '\t': Result += "\\t"; break; // Underscore at the end of a line has a special meaning in rst. case '_': Result += "\\_"; break; default: Result += C; } } return Result; } void EmitInstrDocs(RecordKeeper &RK, raw_ostream &OS) { CodeGenDAGPatterns CDP(RK); CodeGenTarget &Target = CDP.getTargetInfo(); unsigned VariantCount = Target.getAsmParserVariantCount(); // Page title. std::string Title = std::string(Target.getName()); Title += " Instructions"; writeTitle(Title, OS); OS << "\n"; for (const CodeGenInstruction *II : Target.getInstructionsByEnumValue()) { Record *Inst = II->TheDef; // Don't print the target-independent instructions. if (II->Namespace == "TargetOpcode") continue; // Heading (instruction name). writeHeader(escapeForRST(Inst->getName()), OS, '='); OS << "\n"; // Assembly string(s). if (!II->AsmString.empty()) { for (unsigned VarNum = 0; VarNum < VariantCount; ++VarNum) { Record *AsmVariant = Target.getAsmParserVariant(VarNum); OS << "Assembly string"; if (VariantCount != 1) OS << " (" << AsmVariant->getValueAsString("Name") << ")"; std::string AsmString = CodeGenInstruction::FlattenAsmStringVariants(II->AsmString, VarNum); // We trim spaces at each end of the asm string because rst needs the // formatting backticks to be next to a non-whitespace character. OS << ": ``" << escapeForRST(StringRef(AsmString).trim(" ")) << "``\n\n"; } } // Boolean flags. std::vector<const char *> FlagStrings; #define xstr(s) str(s) #define str(s) #s #define FLAG(f) if (II->f) { FlagStrings.push_back(str(f)); } FLAG(isReturn) FLAG(isEHScopeReturn) FLAG(isBranch) FLAG(isIndirectBranch) FLAG(isCompare) FLAG(isMoveImm) FLAG(isBitcast) FLAG(isSelect) FLAG(isBarrier) FLAG(isCall) FLAG(isAdd) FLAG(isTrap) FLAG(canFoldAsLoad) FLAG(mayLoad) //FLAG(mayLoad_Unset) // Deliberately omitted. FLAG(mayStore) //FLAG(mayStore_Unset) // Deliberately omitted. FLAG(isPredicable) FLAG(isConvertibleToThreeAddress) FLAG(isCommutable) FLAG(isTerminator) FLAG(isReMaterializable) FLAG(hasDelaySlot) FLAG(usesCustomInserter) FLAG(hasPostISelHook) FLAG(hasCtrlDep) FLAG(isNotDuplicable) FLAG(hasSideEffects) //FLAG(hasSideEffects_Unset) // Deliberately omitted. FLAG(isAsCheapAsAMove) FLAG(hasExtraSrcRegAllocReq) FLAG(hasExtraDefRegAllocReq) FLAG(isCodeGenOnly) FLAG(isPseudo) FLAG(isRegSequence) FLAG(isExtractSubreg) FLAG(isInsertSubreg) FLAG(isConvergent) FLAG(hasNoSchedulingInfo) FLAG(variadicOpsAreDefs) FLAG(isAuthenticated) if (!FlagStrings.empty()) { OS << "Flags: "; bool IsFirst = true; for (auto FlagString : FlagStrings) { if (!IsFirst) OS << ", "; OS << "``" << FlagString << "``"; IsFirst = false; } OS << "\n\n"; } // Operands. for (unsigned i = 0; i < II->Operands.size(); ++i) { bool IsDef = i < II->Operands.NumDefs; auto Op = II->Operands[i]; if (Op.MINumOperands > 1) { // This operand corresponds to multiple operands on the // MachineInstruction, so print all of them, showing the types and // names of both the compound operand and the basic operands it // contains. for (unsigned SubOpIdx = 0; SubOpIdx < Op.MINumOperands; ++SubOpIdx) { Record *SubRec = cast<DefInit>(Op.MIOperandInfo->getArg(SubOpIdx))->getDef(); StringRef SubOpName = Op.MIOperandInfo->getArgNameStr(SubOpIdx); StringRef SubOpTypeName = SubRec->getName(); OS << "* " << (IsDef ? "DEF" : "USE") << " ``" << Op.Rec->getName() << "/" << SubOpTypeName << ":$" << Op.Name << "."; // Not all sub-operands are named, make up a name for these. if (SubOpName.empty()) OS << "anon" << SubOpIdx; else OS << SubOpName; OS << "``\n\n"; } } else { // The operand corresponds to only one MachineInstruction operand. OS << "* " << (IsDef ? "DEF" : "USE") << " ``" << Op.Rec->getName() << ":$" << Op.Name << "``\n\n"; } } // Constraints. StringRef Constraints = Inst->getValueAsString("Constraints"); if (!Constraints.empty()) { OS << "Constraints: ``" << Constraints << "``\n\n"; } // Implicit definitions. if (!II->ImplicitDefs.empty()) { OS << "Implicit defs: "; bool IsFirst = true; for (Record *Def : II->ImplicitDefs) { if (!IsFirst) OS << ", "; OS << "``" << Def->getName() << "``"; IsFirst = false; } OS << "\n\n"; } // Implicit uses. if (!II->ImplicitUses.empty()) { OS << "Implicit uses: "; bool IsFirst = true; for (Record *Use : II->ImplicitUses) { if (!IsFirst) OS << ", "; OS << "``" << Use->getName() << "``"; IsFirst = false; } OS << "\n\n"; } // Predicates. std::vector<Record *> Predicates = II->TheDef->getValueAsListOfDefs("Predicates"); if (!Predicates.empty()) { OS << "Predicates: "; bool IsFirst = true; for (Record *P : Predicates) { if (!IsFirst) OS << ", "; OS << "``" << P->getName() << "``"; IsFirst = false; } OS << "\n\n"; } } } } // end namespace llvm
Upload File
Create Folder