50#define GET_INSTRINFO_MC_DESC
51#define ENABLE_INSTR_PREDICATE_VERIFIER
52#include "HexagonGenInstrInfo.inc"
54#define GET_SUBTARGETINFO_MC_DESC
55#include "HexagonGenSubtargetInfo.inc"
57#define GET_REGINFO_MC_DESC
58#include "HexagonGenRegisterInfo.inc"
62 cl::desc(
"Disable looking for compound instructions for Hexagon"));
66 cl::desc(
"Disable looking for duplex instructions for Hexagon"));
108 "mhvx",
cl::desc(
"Enable Hexagon Vector eXtensions"),
130 cl::desc(
"Disable Hexagon Vector eXtensions"));
133 cl::desc(
"Enable Hexagon Matrix eXtensions"));
137 cl::desc(
"Enable HVX IEEE floating point extensions"));
160 return "hexagonv67t";
168 return "hexagonv71t";
187 if (!ArchV.
empty() && !CPU.empty()) {
190 std::pair<StringRef, StringRef> ArchP = ArchV.
split(
't');
191 std::pair<StringRef, StringRef> CPUP = CPU.split(
't');
192 if (ArchP.first != CPUP.first)
216 if (ItinUnits == HexagonItinerariesV62FU::CVI_ALL ||
217 ItinUnits == HexagonItinerariesV62FU::CVI_ALL_NOMEM)
218 return (*Lanes = 4, CVI_XLANE);
219 else if (ItinUnits & HexagonItinerariesV62FU::CVI_MPY01 &&
220 ItinUnits & HexagonItinerariesV62FU::CVI_XLSHF)
221 return (*Lanes = 2, CVI_XLANE | CVI_MPY0);
222 else if (ItinUnits & HexagonItinerariesV62FU::CVI_MPY01)
223 return (*Lanes = 2, CVI_MPY0);
224 else if (ItinUnits & HexagonItinerariesV62FU::CVI_XLSHF)
225 return (*Lanes = 2, CVI_XLANE);
226 else if (ItinUnits & HexagonItinerariesV62FU::CVI_XLANE &&
227 ItinUnits & HexagonItinerariesV62FU::CVI_SHIFT &&
228 ItinUnits & HexagonItinerariesV62FU::CVI_MPY0 &&
229 ItinUnits & HexagonItinerariesV62FU::CVI_MPY1)
230 return (*Lanes = 1, CVI_XLANE | CVI_SHIFT | CVI_MPY0 | CVI_MPY1);
231 else if (ItinUnits & HexagonItinerariesV62FU::CVI_XLANE &&
232 ItinUnits & HexagonItinerariesV62FU::CVI_SHIFT)
233 return (*Lanes = 1, CVI_XLANE | CVI_SHIFT);
234 else if (ItinUnits & HexagonItinerariesV62FU::CVI_MPY0 &&
235 ItinUnits & HexagonItinerariesV62FU::CVI_MPY1)
236 return (*Lanes = 1, CVI_MPY0 | CVI_MPY1);
237 else if (ItinUnits == HexagonItinerariesV62FU::CVI_ZW)
238 return (*Lanes = 1, CVI_ZW);
239 else if (ItinUnits == HexagonItinerariesV62FU::CVI_XLANE)
240 return (*Lanes = 1, CVI_XLANE);
241 else if (ItinUnits == HexagonItinerariesV62FU::CVI_SHIFT)
242 return (*Lanes = 1, CVI_SHIFT);
244 return (*Lanes = 0, CVI_NONE);
251 return HexagonItinerariesV62FU::SLOT0 == units;
259 formatted_raw_ostream &OS;
262 HexagonTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS,
264 : HexagonTargetStreamer(S), OS(OS) {}
267 const MCInst &Inst,
const MCSubtargetInfo &STI,
268 raw_ostream &OS)
override {
273 raw_string_ostream TempStream(Buffer);
280 std::string LoopString =
"";
284 LoopString += (IsLoop1 ?
" :endloop01" :
" :endloop0");
285 }
else if (IsLoop1) {
286 LoopString +=
" :endloop1";
289 StringRef Contents(Buffer);
290 auto PacketBundle = Contents.rsplit(
'\n');
291 auto HeadTail = PacketBundle.first.split(
'\n');
292 StringRef Separator =
"\n";
293 StringRef Indent =
"\t";
295 while (!HeadTail.first.empty()) {
297 auto Duplex = HeadTail.first.split(
'\v');
298 if (!Duplex.second.empty()) {
299 OS << Indent << Duplex.first << Separator;
300 InstTxt = Duplex.second;
301 }
else if (!HeadTail.first.trim().starts_with(
"immext")) {
302 InstTxt = Duplex.first;
304 if (!InstTxt.
empty())
305 OS << Indent << InstTxt << Separator;
306 HeadTail = HeadTail.second.
split(
'\n');
310 OS <<
"\n\t} :mem_noshuf" << LoopString;
312 OS <<
"\t}" << LoopString;
315 void finish()
override { finishAttributeSection(); }
317 void finishAttributeSection()
override {}
321 if (getStreamer().isVerboseAsm()) {
325 OS <<
"\t// " <<
Name;
333 MCELFStreamer &getStreamer() {
334 return static_cast<MCELFStreamer &
>(
Streamer);
336 HexagonTargetELFStreamer(MCStreamer &S, MCSubtargetInfo
const &STI)
337 : HexagonTargetStreamer(S) {
341 void emitCommonSymbolSorted(MCSymbol *Symbol,
uint64_t Size,
342 unsigned ByteAlignment,
343 unsigned AccessSize)
override {
344 HexagonMCELFStreamer &HexagonELFStreamer =
345 static_cast<HexagonMCELFStreamer &
>(getStreamer());
347 Symbol,
Size,
Align(ByteAlignment), AccessSize);
350 void emitLocalCommonSymbolSorted(MCSymbol *Symbol,
uint64_t Size,
351 unsigned ByteAlignment,
352 unsigned AccessSize)
override {
353 HexagonMCELFStreamer &HexagonELFStreamer =
354 static_cast<HexagonMCELFStreamer &
>(getStreamer());
356 Symbol,
Size,
Align(ByteAlignment), AccessSize);
359 void finish()
override { finishAttributeSection(); }
361 void reset()
override { AttributeSection =
nullptr; }
364 MCSection *AttributeSection =
nullptr;
366 void finishAttributeSection()
override {
367 MCELFStreamer &S = getStreamer();
385 InitHexagonMCInstrInfo(
X);
391 InitHexagonMCRegisterInfo(
X, Hexagon::R31, 0,
403 nullptr,
MRI.getDwarfRegNum(Hexagon::R30,
true), 0);
410 unsigned SyntaxVariant,
415 if (SyntaxVariant == 0)
424 return new HexagonTargetAsmStreamer(S, OS, *IP);
428 std::unique_ptr<MCAsmBackend> &&MAB,
429 std::unique_ptr<MCObjectWriter> &&OW,
430 std::unique_ptr<MCCodeEmitter> &&
Emitter) {
437 return new HexagonTargetELFStreamer(S, STI);
467 Result.push_back(
"+hvxv60");
470 Result.push_back(
"+hvxv62");
473 Result.push_back(
"+hvxv65");
476 Result.push_back(
"+hvxv66");
479 Result.push_back(
"+hvxv67");
482 Result.push_back(
"+hvxv68");
485 Result.push_back(
"+hvxv69");
488 Result.push_back(
"+hvxv71");
491 Result.push_back(
"+hvxv73");
494 Result.push_back(
"+hvxv75");
497 Result.push_back(
"+hvxv79");
500 Result.push_back(
"+hvxv81");
503 Result.push_back(
"+hvxv83");
506 Result.push_back(
"+hvxv85");
511 .Case(
"hexagonv60",
"+hvxv60")
512 .Case(
"hexagonv62",
"+hvxv62")
513 .Case(
"hexagonv65",
"+hvxv65")
514 .Case(
"hexagonv66",
"+hvxv66")
515 .Case(
"hexagonv67",
"+hvxv67")
516 .Case(
"hexagonv67t",
"+hvxv67")
517 .Case(
"hexagonv68",
"+hvxv68")
518 .Case(
"hexagonv69",
"+hvxv69")
519 .Case(
"hexagonv71",
"+hvxv71")
520 .Case(
"hexagonv71t",
"+hvxv71")
521 .Case(
"hexagonv73",
"+hvxv73")
522 .Case(
"hexagonv75",
"+hvxv75")
523 .Case(
"hexagonv79",
"+hvxv79")
524 .Case(
"hexagonv81",
"+hvxv81")
525 .Case(
"hexagonv83",
"+hvxv83")
526 .Case(
"hexagonv85",
"+hvxv85"));
534 Result.push_back(
"+hvx-ieee-fp");
536 Result.push_back(
"+cabac");
549std::pair<std::string, std::string> selectCPUAndFS(
StringRef CPU,
551 std::pair<std::string, std::string>
Result;
556std::mutex ArchSubtargetMutex;
562 std::lock_guard<std::mutex> Lock(ArchSubtargetMutex);
563 auto Existing = ArchSubtarget.find(STI->
getCPU());
564 if (Existing == ArchSubtarget.end())
566 return Existing->second.get();
574 unsigned CpuArch = ArchV5;
575 for (
unsigned F : {ArchV85, ArchV83, ArchV81, ArchV79, ArchV75, ArchV73,
576 ArchV71, ArchV69, ArchV68, ArchV67, ArchV66, ArchV65,
577 ArchV62, ArchV60, ArchV55, ArchV5}) {
584 for (
unsigned F : {ExtensionHVX, ExtensionHVX64B, ExtensionHVX128B}) {
590 bool HasHvxVer =
false;
592 {ExtensionHVXV60, ExtensionHVXV62, ExtensionHVXV65, ExtensionHVXV66,
593 ExtensionHVXV67, ExtensionHVXV68, ExtensionHVXV69, ExtensionHVXV71,
594 ExtensionHVXV73, ExtensionHVXV75, ExtensionHVXV79, ExtensionHVXV81,
595 ExtensionHVXV83, ExtensionHVXV85}) {
603 if (!UseHvx || HasHvxVer)
609 FB.
set(ExtensionHVXV85);
612 FB.
set(ExtensionHVXV83);
615 FB.
set(ExtensionHVXV81);
618 FB.
set(ExtensionHVXV79);
621 FB.
set(ExtensionHVXV75);
624 FB.
set(ExtensionHVXV73);
627 FB.
set(ExtensionHVXV71);
630 FB.
set(ExtensionHVXV69);
633 FB.
set(ExtensionHVXV68);
636 FB.
set(ExtensionHVXV67);
639 FB.
set(ExtensionHVXV66);
642 FB.
set(ExtensionHVXV65);
645 FB.
set(ExtensionHVXV62);
648 FB.
set(ExtensionHVXV60);
657 std::pair<std::string, std::string> Features = selectCPUAndFS(CPU, FS);
662 TT, CPUName, CPUName, ArchFS);
663 if (
X !=
nullptr && (CPUName ==
"hexagonv67t" || CPUName ==
"hexagon71t"))
670 errs() <<
"error: invalid CPU \"" << CPUName.
str().c_str()
680 X->setFeatureBits(Features.
set(Hexagon::ExtensionHVXQFloat));
685 X->setFeatureBits(Features.
reset(Hexagon::FeatureDuplex));
693 const bool ZRegOnDefault =
694 (CPUName ==
"hexagonv67") || (CPUName ==
"hexagonv66");
697 X->setFeatureBits(Features.
set(Hexagon::ExtensionZReg));
708 std::lock_guard<std::mutex> Lock(ArchSubtargetMutex);
709 ArchSubtarget[STI->
getCPU()] =
710 std::unique_ptr<MCSubtargetInfo const>(ArchSTI);
714std::optional<unsigned>
716 for (
auto Arch : {Hexagon::ExtensionHVXV85, Hexagon::ExtensionHVXV83,
717 Hexagon::ExtensionHVXV81, Hexagon::ExtensionHVXV79,
718 Hexagon::ExtensionHVXV75, Hexagon::ExtensionHVXV73,
719 Hexagon::ExtensionHVXV71, Hexagon::ExtensionHVXV69,
720 Hexagon::ExtensionHVXV68, Hexagon::ExtensionHVXV67,
721 Hexagon::ExtensionHVXV66, Hexagon::ExtensionHVXV65,
722 Hexagon::ExtensionHVXV62, Hexagon::ExtensionHVXV60})
723 if (Features.
test(Arch))
730 {Hexagon::ArchV85, Hexagon::ArchV83, Hexagon::ArchV81, Hexagon::ArchV79,
731 Hexagon::ArchV75, Hexagon::ArchV73, Hexagon::ArchV71, Hexagon::ArchV69,
732 Hexagon::ArchV68, Hexagon::ArchV67, Hexagon::ArchV66, Hexagon::ArchV65,
733 Hexagon::ArchV62, Hexagon::ArchV60, Hexagon::ArchV55, Hexagon::ArchV5})
734 if (Features.
test(Arch))
764 const auto &RC = getHexagonMCRegisterClass(Hexagon::VectRegRevRegClassID);
765 return ArrayRef(RC.begin(), RC.end());
773 bool isUnconditionalBranch(
MCInst const &Inst)
const override {
778 bool isConditionalBranch(MCInst
const &Inst)
const override {
783 bool evaluateBranch(MCInst
const &Inst,
uint64_t Addr,
785 if (!(isCall(Inst) || isUnconditionalBranch(Inst) ||
786 isConditionalBranch(Inst)))
801 uint32_t getValueFromMask(uint32_t Instruction, uint32_t Mask)
const {
805 if (Instruction & (Mask & -Mask))
813 std::vector<std::pair<uint64_t, uint64_t>>
814 findPltEntries(
uint64_t PltSectionVA, ArrayRef<uint8_t> PltContents,
815 const MCSubtargetInfo &STI)
const override {
817 std::vector<std::pair<uint64_t, uint64_t>>
Result;
821 if ((ImmExt & 0x00004000) != 0x00004000)
823 uint32_t LoadGotPlt =
825 if ((LoadGotPlt & 0x6a49c00c) != 0x6a49c00c)
827 uint32_t
Address = (getValueFromMask(ImmExt, 0xfff3fff) << 6) +
828 getValueFromMask(LoadGotPlt, 0x1f80) + PltSectionVA +
838 return new HexagonMCInstrAnalysis(Info);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the StringMap class.
static MCStreamer * createMCStreamer(const Triple &T, MCContext &Context, std::unique_ptr< MCAsmBackend > &&MAB, std::unique_ptr< MCObjectWriter > &&OW, std::unique_ptr< MCCodeEmitter > &&Emitter)
static MCTargetStreamer * createMCAsmTargetStreamer(MCStreamer &S, formatted_raw_ostream &OS, MCInstPrinter *InstPrint)
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
#define LLVM_EXTERNAL_VISIBILITY
dxil container DXContainer Global Emitter
static cl::opt< bool > EnableHexagonCabac("mcabac", cl::desc("tbd"), cl::init(false))
static MCTargetStreamer * createHexagonNullTargetStreamer(MCStreamer &S)
static MCTargetStreamer * createHexagonObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI)
static MCTargetStreamer * createMCAsmTargetStreamer(MCStreamer &S, formatted_raw_ostream &OS, MCInstPrinter *IP)
LLVM_ABI LLVM_EXTERNAL_VISIBILITY void LLVMInitializeHexagonTargetMC()
static MCInstrAnalysis * createHexagonMCInstrAnalysis(const MCInstrInfo *Info)
static cl::opt< bool > EnableHLX("mhlx", cl::desc("Enable Hexagon HLX"))
static MCInstPrinter * createHexagonMCInstPrinter(const Triple &T, unsigned SyntaxVariant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI)
static cl::opt< bool > DisableHVX("mno-hvx", cl::Hidden, cl::desc("Disable Hexagon Vector eXtensions"))
static MCStreamer * createMCStreamer(Triple const &T, MCContext &Context, std::unique_ptr< MCAsmBackend > &&MAB, std::unique_ptr< MCObjectWriter > &&OW, std::unique_ptr< MCCodeEmitter > &&Emitter)
static bool isCPUValid(StringRef CPU)
static cl::opt< bool > EnableHMX("mhmx", cl::desc("Enable Hexagon Matrix eXtensions"))
static MCRegisterInfo * createHexagonMCRegisterInfo(const Triple &TT)
static cl::opt< bool > EnableHvxIeeeFp("mhvx-ieee-fp", cl::Hidden, cl::desc("Enable HVX IEEE floating point extensions"))
static MCAsmInfo * createHexagonMCAsmInfo(const MCRegisterInfo &MRI, const Triple &TT, const MCTargetOptions &Options)
static StringRef HexagonGetArchVariant()
static void clearFeature(MCSubtargetInfo *STI, uint64_t F)
static cl::opt< Hexagon::ArchEnum > EnableHVX("mhvx", cl::desc("Enable Hexagon Vector eXtensions"), cl::values(clEnumValN(Hexagon::ArchEnum::V60, "v60", "Build for HVX v60"), clEnumValN(Hexagon::ArchEnum::V62, "v62", "Build for HVX v62"), clEnumValN(Hexagon::ArchEnum::V65, "v65", "Build for HVX v65"), clEnumValN(Hexagon::ArchEnum::V66, "v66", "Build for HVX v66"), clEnumValN(Hexagon::ArchEnum::V67, "v67", "Build for HVX v67"), clEnumValN(Hexagon::ArchEnum::V68, "v68", "Build for HVX v68"), clEnumValN(Hexagon::ArchEnum::V69, "v69", "Build for HVX v69"), clEnumValN(Hexagon::ArchEnum::V71, "v71", "Build for HVX v71"), clEnumValN(Hexagon::ArchEnum::V73, "v73", "Build for HVX v73"), clEnumValN(Hexagon::ArchEnum::V75, "v75", "Build for HVX v75"), clEnumValN(Hexagon::ArchEnum::V79, "v79", "Build for HVX v79"), clEnumValN(Hexagon::ArchEnum::V81, "v81", "Build for HVX v81"), clEnumValN(Hexagon::ArchEnum::V83, "v83", "Build for HVX v83"), clEnumValN(Hexagon::ArchEnum::V85, "v85", "Build for HVX v85"), clEnumValN(Hexagon::ArchEnum::Generic, "", "")), cl::init(Hexagon::ArchEnum::NoArch), cl::ValueOptional)
static bool checkFeature(MCSubtargetInfo *STI, uint64_t F)
static constexpr StringRef DefaultArch
#define HEXAGON_PACKET_SIZE
MachineRegisterInfo & MRI
std::unique_ptr< MCStreamer > && Streamer
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
Container class for subtarget features.
constexpr FeatureBitset & reset(unsigned I)
constexpr bool test(unsigned I) const
Prints bundles as a newline separated list of individual instructions Duplexes are separated by a ver...
void HexagonMCEmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, Align ByteAlignment, unsigned AccessSize)
void HexagonMCEmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, Align ByteAlignment, unsigned AccessSize)
This class is intended to be used as a base class for asm properties and features specific to the tar...
void addInitialFrameState(const MCCFIInstruction &Inst)
static MCCFIInstruction cfiDefCfa(MCSymbol *L, unsigned Register, int64_t Offset, SMLoc Loc={})
.cfi_def_cfa defines a rule for computing CFA as: take address from Register and add Offset to it.
Context object for machine code objects.
SmallVector< AttributeItem, 64 > Contents
void emitAttributesSection(StringRef Vendor, const Twine &Section, unsigned Type, MCSection *&AttributeSection)
This is an instance of a target assembly language printer that converts an MCInst to valid target ass...
virtual void printInst(const MCInst *MI, uint64_t Address, StringRef Annot, const MCSubtargetInfo &STI, raw_ostream &OS)=0
Print the specified MCInst to the specified raw_ostream.
Instances of this class represent a single low-level machine instruction.
virtual bool isUnconditionalBranch(const MCInst &Inst) const
virtual bool isConditionalBranch(const MCInst &Inst) const
Interface to description of machine instruction set.
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
Streaming machine code generation interface.
Generic base class for all target subtargets.
bool hasFeature(unsigned Feature) const
const Triple & getTargetTriple() const
const FeatureBitset & ToggleFeature(uint64_t FB)
Toggle a feature and return the re-computed feature bits.
Target specific streamer interface.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
Represent a constant reference to a string, i.e.
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
std::string str() const
Get the contents as an std::string.
constexpr bool empty() const
Check if the string is empty.
bool contains(StringRef Other) const
Return true if the given string is a substring of *this, and false otherwise.
StringRef drop_back(size_t N=1) const
Return a StringRef equal to 'this' but with the last N elements dropped.
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
Triple - Helper class for working with autoconf configuration names.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
LLVM_ABI StringRef attrTypeAsString(unsigned attr, TagNameMap tagNameMap, bool hasTagPrefix=true)
LLVM_ABI const TagNameMap & getHexagonAttributeTags()
bool isSlot0Only(unsigned units)
bool isOuterLoop(MCInst const &MCI)
size_t bundleSize(MCInst const &MCI)
bool isMemReorderDisabled(MCInst const &MCI)
iterator_range< Hexagon::PacketIterator > bundleInstructions(MCInstrInfo const &MCII, MCInst const &MCI)
bool isBundle(MCInst const &MCI)
bool isExtendable(MCInstrInfo const &MCII, MCInst const &MCI)
bool isInnerLoop(MCInst const &MCI)
MCOperand const & getExtendableOperand(MCInstrInfo const &MCII, MCInst const &MCI)
llvm::ArrayRef< MCPhysReg > GetVectRegRev()
unsigned getArchVersion(const FeatureBitset &Features)
unsigned GetELFFlags(const MCSubtargetInfo &STI)
std::optional< unsigned > getHVXVersion(const FeatureBitset &Features)
MCSubtargetInfo const * getArchSubtarget(MCSubtargetInfo const *STI)
StringRef selectHexagonCPU(StringRef CPU)
void addArchSubtarget(MCSubtargetInfo const *STI, StringRef FS)
FeatureBitset completeHVXFeatures(const FeatureBitset &FB)
MCSubtargetInfo * createHexagonMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS)
Create a Hexagon MCSubtargetInfo instance.
std::optional< Hexagon::ArchEnum > getCpu(StringRef CPU)
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
initializer< Ty > init(const Ty &Val)
uint32_t read32le(const void *P)
This is an optimization pass for GlobalISel generic memory operations.
unsigned HexagonConvertUnits(unsigned ItinUnits, unsigned *Lanes)
cl::opt< bool > HexagonDisableCompound
MCCodeEmitter * createHexagonMCCodeEmitter(const MCInstrInfo &MCII, MCContext &MCT)
unsigned HexagonGetLastSlot()
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Target & getTheHexagonTarget()
MCAsmBackend * createHexagonAsmBackend(const Target &T, const MCSubtargetInfo &STI, const MCRegisterInfo &MRI, const MCTargetOptions &Options)
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
std::string join(IteratorT Begin, IteratorT End, StringRef Separator)
Joins the strings in the range [Begin, End), adding Separator between the elements.
MCInstrInfo * createHexagonMCInstrInfo()
ArrayRef(const T &OneElt) -> ArrayRef< T >
MCStreamer * createHexagonELFStreamer(Triple const &TT, MCContext &Context, std::unique_ptr< MCAsmBackend > MAB, std::unique_ptr< MCObjectWriter > OW, std::unique_ptr< MCCodeEmitter > CE)
@ End
Run the machine verifier once, at the end of the pipeline.
cl::opt< bool > HexagonDisableDuplex
RegisterMCAsmInfoFn - Helper template for registering a target assembly info implementation.
static void RegisterMCRegInfo(Target &T, Target::MCRegInfoCtorFnTy Fn)
RegisterMCRegInfo - Register a MCRegisterInfo implementation for the given target.
static void RegisterMCAsmBackend(Target &T, Target::MCAsmBackendCtorTy Fn)
RegisterMCAsmBackend - Register a MCAsmBackend implementation for the given target.
static void RegisterMCCodeEmitter(Target &T, Target::MCCodeEmitterCtorTy Fn)
RegisterMCCodeEmitter - Register a MCCodeEmitter implementation for the given target.
static void RegisterMCSubtargetInfo(Target &T, Target::MCSubtargetInfoCtorFnTy Fn)
RegisterMCSubtargetInfo - Register a MCSubtargetInfo implementation for the given target.
static void RegisterObjectTargetStreamer(Target &T, Target::ObjectTargetStreamerCtorTy Fn)
static void RegisterMCInstrAnalysis(Target &T, Target::MCInstrAnalysisCtorFnTy Fn)
RegisterMCInstrAnalysis - Register a MCInstrAnalysis implementation for the given target.
static void RegisterELFStreamer(Target &T, Target::ELFStreamerCtorTy Fn)
static void RegisterNullTargetStreamer(Target &T, Target::NullTargetStreamerCtorTy Fn)
static void RegisterMCInstPrinter(Target &T, Target::MCInstPrinterCtorTy Fn)
RegisterMCInstPrinter - Register a MCInstPrinter implementation for the given target.
static void RegisterMCInstrInfo(Target &T, Target::MCInstrInfoCtorFnTy Fn)
RegisterMCInstrInfo - Register a MCInstrInfo implementation for the given target.
static void RegisterAsmTargetStreamer(Target &T, Target::AsmTargetStreamerCtorTy Fn)