//===- DXILEmitter.cpp - DXIL operation Emitter ---------------------------===// // // 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 // //===----------------------------------------------------------------------===// // // DXILEmitter uses the descriptions of DXIL operation to construct enum and // helper functions for DXIL operation. // //===----------------------------------------------------------------------===// #include "Basic/SequenceToOffsetTable.h" #include "Common/CodeGenTarget.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallSet.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringSet.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/Support/DXILABI.h" #include "llvm/Support/VersionTuple.h" #include "llvm/TableGen/Error.h" #include "llvm/TableGen/Record.h" #include "llvm/TableGen/TableGenBackend.h" #include <string> #include <vector> usingnamespacellvm; usingnamespacellvm::dxil; namespace { struct DXILOperationDesc { … }; } // end anonymous namespace /// In-place sort TableGen records of class with a field /// Version dxil_version /// in the ascending version order. static void AscendingSortByVersion(std::vector<Record *> &Recs) { … } /// Construct an object using the DXIL Operation records specified /// in DXIL.td. This serves as the single source of reference of /// the information extracted from the specified Record R, for /// C++ code generated by this TableGen backend. // \param R Object representing TableGen record of a DXIL Operation DXILOperationDesc::DXILOperationDesc(const Record *R) { … } /// Return a string representation of OverloadKind enum that maps to /// input LLVMType record /// \param R TableGen def record of class LLVMType /// \return std::string string representation of OverloadKind static StringRef getOverloadKindStr(const Record *R) { … } /// Return a string representation of valid overload information denoted // by input records // /// \param Recs A vector of records of TableGen Overload records /// \return std::string string representation of overload mask string /// predicated by DXIL Version. E.g., // {{{1, 0}, Mask1}, {{1, 2}, Mask2}, ...} static std::string getOverloadMaskString(const SmallVector<Record *> Recs) { … } /// Return a string representation of valid shader stag information denoted // by input records // /// \param Recs A vector of records of TableGen Stages records /// \return std::string string representation of stages mask string /// predicated by DXIL Version. E.g., // {{{1, 0}, Mask1}, {{1, 2}, Mask2}, ...} static std::string getStageMaskString(const SmallVector<Record *> Recs) { … } /// Return a string representation of valid attribute information denoted // by input records // /// \param Recs A vector of records of TableGen Attribute records /// \return std::string string representation of stages mask string /// predicated by DXIL Version. E.g., // {{{1, 0}, Mask1}, {{1, 2}, Mask2}, ...} static std::string getAttributeMaskString(const SmallVector<Record *> Recs) { … } /// Emit a mapping of DXIL opcode to opname static void emitDXILOpCodes(std::vector<DXILOperationDesc> &Ops, raw_ostream &OS) { … } /// Emit a list of DXIL op classes static void emitDXILOpClasses(RecordKeeper &Records, raw_ostream &OS) { … } /// Emit a list of DXIL op parameter types static void emitDXILOpParamTypes(RecordKeeper &Records, raw_ostream &OS) { … } /// Emit a list of DXIL op function types static void emitDXILOpFunctionTypes(ArrayRef<DXILOperationDesc> Ops, raw_ostream &OS) { … } /// Emit map of DXIL operation to LLVM or DirectX intrinsic /// \param A vector of DXIL Ops /// \param Output stream static void emitDXILIntrinsicMap(std::vector<DXILOperationDesc> &Ops, raw_ostream &OS) { … } /// Emit DXIL operation table /// \param A vector of DXIL Ops /// \param Output stream static void emitDXILOperationTable(std::vector<DXILOperationDesc> &Ops, raw_ostream &OS) { … } static void emitDXILOperationTableDataStructs(RecordKeeper &Records, raw_ostream &OS) { … } /// Entry function call that invokes the functionality of this TableGen backend /// \param Records TableGen records of DXIL Operations defined in DXIL.td /// \param OS output stream static void EmitDXILOperation(RecordKeeper &Records, raw_ostream &OS) { … } static TableGen::Emitter::Opt X("gen-dxil-operation", EmitDXILOperation, "Generate DXIL operation information");