99 if (
MI->memoperands_empty())
104 EE =
MI->memoperands_end(); MMOI != EE; ++MMOI)
105 if ((*MMOI)->getAlign() < Alignment)
106 Alignment = (*MMOI)->getAlign();
108 unsigned AlignmentHint = 0;
109 if (Alignment >=
Align(16))
111 else if (Alignment >=
Align(8))
113 if (AlignmentHint == 0)
127 .
addReg(
MI->getOperand(3).getReg());
146void SystemZAsmPrinter::emitCallInformation(CallType CT) {
155 auto Key = std::make_pair(
Sym, SlotKind);
156 auto It = Displacements.find(Key);
158 if (It != Displacements.end())
172 uint32_t Displacement = NextDisplacement;
173 Displacements[std::make_pair(
Sym, SlotKind)] = NextDisplacement;
174 NextDisplacement +=
Length;
180SystemZAsmPrinter::AssociatedDataAreaTable::insert(
const MachineOperand MO) {
194 return insert(
Sym, ADAslotType);
198 SystemZ_MC::verifyInstructionPredicates(
MI->getOpcode(),
203 switch (
MI->getOpcode()) {
204 case SystemZ::Return:
209 case SystemZ::Return_XPLINK:
216 case SystemZ::CondReturn:
223 case SystemZ::CondReturn_XPLINK:
232 case SystemZ::CRBReturn:
241 case SystemZ::CGRBReturn:
250 case SystemZ::CIBReturn:
259 case SystemZ::CGIBReturn:
268 case SystemZ::CLRBReturn:
277 case SystemZ::CLGRBReturn:
286 case SystemZ::CLIBReturn:
295 case SystemZ::CLGIBReturn:
304 case SystemZ::CallBRASL_XPLINK64:
307 .addReg(SystemZ::R7D)
308 .addExpr(
Lower.getExpr(
MI->getOperand(0),
310 emitCallInformation(CallType::BRASL7);
313 case SystemZ::CallBASR_XPLINK64:
315 .addReg(SystemZ::R7D)
316 .addReg(
MI->getOperand(0).getReg()));
317 emitCallInformation(CallType::BASR76);
320 case SystemZ::CallBASR_STACKEXT:
322 .addReg(SystemZ::R3D)
323 .addReg(
MI->getOperand(0).getReg()));
324 emitCallInformation(CallType::BASR33);
327 case SystemZ::ADA_ENTRY_VALUE:
328 case SystemZ::ADA_ENTRY: {
331 uint32_t Disp = ADATable.insert(
MI->getOperand(1));
332 Register TargetReg =
MI->getOperand(0).getReg();
335 Disp +=
MI->getOperand(3).getImm();
336 bool LoadAddr =
MI->getOpcode() == SystemZ::ADA_ENTRY;
338 unsigned Op0 = LoadAddr ? SystemZ::LA : SystemZ::LG;
339 unsigned Op =
TII->getOpcodeForOffset(Op0, Disp);
343 if (TargetReg != ADAReg) {
344 IndexReg = TargetReg;
348 MCInstBuilder(SystemZ::LLILF).addReg(TargetReg).addImm(Disp));
365 case SystemZ::CallBRASL:
371 case SystemZ::CallBASR:
374 .
addReg(
MI->getOperand(0).getReg());
377 case SystemZ::CallJG:
382 case SystemZ::CallBRCL:
389 case SystemZ::CallBR:
391 .
addReg(
MI->getOperand(0).getReg());
394 case SystemZ::CallBCR:
398 .
addReg(
MI->getOperand(2).getReg());
401 case SystemZ::CRBCall:
410 case SystemZ::CGRBCall:
419 case SystemZ::CIBCall:
428 case SystemZ::CGIBCall:
437 case SystemZ::CLRBCall:
446 case SystemZ::CLGRBCall:
455 case SystemZ::CLIBCall:
464 case SystemZ::CLGIBCall:
473 case SystemZ::TLS_GDCALL:
480 case SystemZ::TLS_LDCALL:
493 case SystemZ::IILF64:
496 .
addImm(
MI->getOperand(2).getImm());
499 case SystemZ::IIHF64:
502 .
addImm(
MI->getOperand(2).getImm());
505 case SystemZ::RISBHH:
506 case SystemZ::RISBHL:
510 case SystemZ::RISBLH:
511 case SystemZ::RISBLL:
515 case SystemZ::VLVGP32:
580#define LOWER_LOW(NAME) \
581 case SystemZ::NAME##64: LoweredMI = lowerRILow(MI, SystemZ::NAME); break
597#define LOWER_HIGH(NAME) \
598 case SystemZ::NAME##64: LoweredMI = lowerRIHigh(MI, SystemZ::NAME); break
614 case SystemZ::Serialize:
627 case SystemZ::Trap: {
640 case SystemZ::CondTrap: {
653 case TargetOpcode::FENTRY_CALL:
657 case TargetOpcode::STACKMAP:
661 case TargetOpcode::PATCHPOINT:
665 case TargetOpcode::PATCHABLE_FUNCTION_ENTER:
666 LowerPATCHABLE_FUNCTION_ENTER(*
MI,
Lower);
669 case TargetOpcode::PATCHABLE_RET:
670 LowerPATCHABLE_RET(*
MI,
Lower);
673 case TargetOpcode::PATCHABLE_FUNCTION_EXIT:
676 case TargetOpcode::PATCHABLE_TAIL_CALL:
680 "around this assert.");
682 case SystemZ::EXRL_Pseudo: {
683 unsigned TargetInsOpc =
MI->getOperand(0).getImm();
684 Register LenMinus1Reg =
MI->getOperand(1).getReg();
685 Register DestReg =
MI->getOperand(2).getReg();
686 int64_t DestDisp =
MI->getOperand(3).getImm();
688 int64_t SrcDisp =
MI->getOperand(5).getImm();
695 SystemZTargetStreamer::EXRLT2SymMap::iterator
I =
704 MCInstBuilder(SystemZ::EXRL).addReg(LenMinus1Reg).addExpr(Dot));
710 case SystemZ::EH_SjLj_Setup:
728 else if (NumBytes < 4) {
730 MCInstBuilder(SystemZ::BCRAsm).addImm(0).addReg(SystemZ::R0D), STI);
733 else if (NumBytes < 6) {
735 MCInstBuilder(SystemZ::BCAsm).addImm(0).addReg(0).addImm(0).addReg(0),
744 MCInstBuilder(SystemZ::BRCLAsm).addImm(0).addExpr(Dot), STI);
778 unsigned NumNOPBytes =
MI.getOperand(1).getImm();
785 assert(NumNOPBytes % 2 == 0 &&
"Invalid number of NOP bytes requested!");
788 unsigned ShadowBytes = 0;
792 while (ShadowBytes < NumNOPBytes) {
794 MII->getOpcode() == TargetOpcode::PATCHPOINT ||
795 MII->getOpcode() == TargetOpcode::STACKMAP)
797 ShadowBytes +=
TII->getInstSizeInBytes(*MII);
804 while (ShadowBytes < NumNOPBytes)
820 unsigned EncodedBytes = 0;
823 if (CalleeMO.
isImm()) {
826 unsigned ScratchIdx = -1;
827 unsigned ScratchReg = 0;
829 ScratchIdx = Opers.getNextScratchIdx(ScratchIdx + 1);
830 ScratchReg =
MI.getOperand(ScratchIdx).getReg();
831 }
while (ScratchReg == SystemZ::R0D);
836 .addImm(CallTarget & 0xFFFFFFFF));
838 if (CallTarget >> 32) {
841 .addImm(CallTarget >> 32));
846 .addReg(SystemZ::R14D)
847 .addReg(ScratchReg));
853 .addReg(SystemZ::R14D)
859 unsigned NumBytes = Opers.getNumPatchBytes();
860 assert(NumBytes >= EncodedBytes &&
861 "Patchpoint can't request size less than the length of a call.");
862 assert((NumBytes - EncodedBytes) % 2 == 0 &&
863 "Invalid number of NOP bytes requested!");
864 while (EncodedBytes < NumBytes)
869void SystemZAsmPrinter::LowerPATCHABLE_FUNCTION_ENTER(
880 bool HasVectorFeature =
884 HasVectorFeature ?
"__xray_FunctionEntryVec" :
"__xray_FunctionEntry");
893 MCInstBuilder(SystemZ::LLILF).addReg(SystemZ::R2D).addImm(0));
896 .addReg(SystemZ::R14D)
905 unsigned OpCode =
MI.getOperand(0).getImm();
906 MCSymbol *FallthroughLabel =
nullptr;
907 if (OpCode == SystemZ::CondReturn) {
909 int64_t Cond0 =
MI.getOperand(1).getImm();
910 int64_t Cond1 =
MI.getOperand(2).getImm();
913 .addImm(Cond1 ^ Cond0)
926 bool HasVectorFeature =
930 HasVectorFeature ?
"__xray_FunctionExitVec" :
"__xray_FunctionExit");
937 MCInstBuilder(SystemZ::LLILF).addReg(SystemZ::R2D).addImm(0));
942 if (FallthroughLabel)
950void SystemZAsmPrinter::emitAttributes(
Module &M) {
951 if (
M.getModuleFlag(
"s390x-visible-vector-ABI")) {
952 bool HasVectorFeature =
954 OutStreamer->emitGNUAttribute(8, HasVectorFeature ? 2 : 1);
1009 else if (MCOp.
isImm())
1018 const MCOperand &DispMO,
unsigned Index,
1021 if (
Base || Index) {
1035 const char *ExtraCode,
1041 if (ExtraCode[0] ==
'N' && !ExtraCode[1] && MO.
isReg() &&
1042 SystemZ::GR128BitRegClass.contains(MO.
getReg()))
1049 MCOp =
Lower.lowerOperand(MO);
1057 const char *ExtraCode,
1059 if (ExtraCode && ExtraCode[0] && !ExtraCode[1]) {
1060 switch (ExtraCode[0]) {
1067 OS <<
MI->getOperand(OpNo + 1).getImm();
1076 MI->getOperand(OpNo + 2).getReg(),
OS);
1089void SystemZAsmPrinter::emitADASection() {
1095 unsigned EmittedBytes = 0;
1096 for (
auto &Entry : ADATable.getTable()) {
1099 std::tie(
Sym, SlotKind) = Entry.first;
1100 unsigned Offset = Entry.second;
1101 assert(
Offset == EmittedBytes &&
"Offset not as expected");
1103#define EMIT_COMMENT(Str) \
1104 OutStreamer->AddComment(Twine("Offset ") \
1105 .concat(utostr(Offset)) \
1106 .concat(" " Str " ") \
1107 .concat(Sym->getName()));
1123 EmittedBytes += PointerSize * 2;
1132 EmittedBytes += PointerSize;
1147 EmittedBytes += PointerSize;
1159 std::string ProductID;
1160 if (
auto *MD = M.getModuleFlag(
"zos_product_id"))
1161 ProductID = cast<MDString>(MD)->getString().str();
1162 if (ProductID.empty())
1168 if (
auto *VersionVal = mdconst::extract_or_null<ConstantInt>(
1169 M.getModuleFlag(
"zos_product_major_version")))
1170 return VersionVal->getZExtValue();
1171 return LLVM_VERSION_MAJOR;
1175 if (
auto *ReleaseVal = mdconst::extract_or_null<ConstantInt>(
1176 M.getModuleFlag(
"zos_product_minor_version")))
1177 return ReleaseVal->getZExtValue();
1178 return LLVM_VERSION_MINOR;
1182 if (
auto *PatchVal = mdconst::extract_or_null<ConstantInt>(
1183 M.getModuleFlag(
"zos_product_patchlevel")))
1184 return PatchVal->getZExtValue();
1185 return LLVM_VERSION_PATCH;
1189 std::time_t Time = 0;
1190 if (
auto *Val = mdconst::extract_or_null<ConstantInt>(
1191 M.getModuleFlag(
"zos_translation_time"))) {
1192 long SecondsSinceEpoch = Val->getSExtValue();
1193 Time =
static_cast<time_t
>(SecondsSinceEpoch);
1198void SystemZAsmPrinter::emitIDRLSection(
Module &M) {
1201 constexpr unsigned IDRLDataLength = 30;
1211 O <<
formatv(
"{0,-10}{1,0-2:d}{2,0-2:d}{3:%Y%m%d%H%M%S}{4,0-2}",
1212 ProductID.substr(0, 10).c_str(), ProductVersion, ProductRelease,
1236 CurrentFnPPA1Sym =
nullptr;
1237 CurrentFnEPMarkerSym =
nullptr;
1243 bool EHBlock,
bool HasName) {
1244 enum class PPA1Flag1 :
uint8_t {
1245 DSA64Bit = (0x80 >> 0),
1246 VarArg = (0x80 >> 7),
1249 enum class PPA1Flag2 :
uint8_t {
1250 ExternalProcedure = (0x80 >> 0),
1251 STACKPROTECTOR = (0x80 >> 3),
1254 enum class PPA1Flag3 :
uint8_t {
1255 FPRMask = (0x80 >> 2),
1258 enum class PPA1Flag4 :
uint8_t {
1259 EPMOffsetPresent = (0x80 >> 0),
1260 VRMask = (0x80 >> 2),
1261 EHBlock = (0x80 >> 3),
1262 ProcedureNamePresent = (0x80 >> 7),
1267 auto Flags1 = PPA1Flag1(0);
1268 auto Flags2 = PPA1Flag2::ExternalProcedure;
1269 auto Flags3 = PPA1Flag3(0);
1270 auto Flags4 = PPA1Flag4::EPMOffsetPresent;
1272 Flags1 |= PPA1Flag1::DSA64Bit;
1275 Flags1 |= PPA1Flag1::VarArg;
1278 Flags2 |= PPA1Flag2::STACKPROTECTOR;
1282 Flags3 |= PPA1Flag3::FPRMask;
1285 Flags4 |= PPA1Flag4::VRMask;
1288 Flags4 |= PPA1Flag4::EHBlock;
1291 Flags4 |= PPA1Flag4::ProcedureNamePresent;
1293 OutStreamer->AddComment(
"PPA1 Flags 1");
1294 if ((Flags1 & PPA1Flag1::DSA64Bit) == PPA1Flag1::DSA64Bit)
1295 OutStreamer->AddComment(
" Bit 0: 1 = 64-bit DSA");
1297 OutStreamer->AddComment(
" Bit 0: 0 = 32-bit DSA");
1298 if ((Flags1 & PPA1Flag1::VarArg) == PPA1Flag1::VarArg)
1299 OutStreamer->AddComment(
" Bit 7: 1 = Vararg function");
1300 OutStreamer->emitInt8(
static_cast<uint8_t>(Flags1));
1302 OutStreamer->AddComment(
"PPA1 Flags 2");
1303 if ((Flags2 & PPA1Flag2::ExternalProcedure) == PPA1Flag2::ExternalProcedure)
1304 OutStreamer->AddComment(
" Bit 0: 1 = External procedure");
1305 if ((Flags2 & PPA1Flag2::STACKPROTECTOR) == PPA1Flag2::STACKPROTECTOR)
1306 OutStreamer->AddComment(
" Bit 3: 1 = STACKPROTECT is enabled");
1308 OutStreamer->AddComment(
" Bit 3: 0 = STACKPROTECT is not enabled");
1309 OutStreamer->emitInt8(
static_cast<uint8_t>(Flags2));
1311 OutStreamer->AddComment(
"PPA1 Flags 3");
1312 if ((Flags3 & PPA1Flag3::FPRMask) == PPA1Flag3::FPRMask)
1313 OutStreamer->AddComment(
" Bit 2: 1 = FP Reg Mask is in optional area");
1314 OutStreamer->emitInt8(
1315 static_cast<uint8_t>(Flags3));
1317 OutStreamer->AddComment(
"PPA1 Flags 4");
1318 if ((Flags4 & PPA1Flag4::VRMask) == PPA1Flag4::VRMask)
1319 OutStreamer->AddComment(
" Bit 2: 1 = Vector Reg Mask is in optional area");
1320 if ((Flags4 & PPA1Flag4::EHBlock) == PPA1Flag4::EHBlock)
1321 OutStreamer->AddComment(
" Bit 3: 1 = C++ EH block");
1322 if ((Flags4 & PPA1Flag4::ProcedureNamePresent) ==
1323 PPA1Flag4::ProcedureNamePresent)
1324 OutStreamer->AddComment(
" Bit 7: 1 = Name Length and Name");
1325 OutStreamer->emitInt8(
static_cast<uint8_t>(
1336 OutName = OutName.
substr(0, UINT16_MAX);
1337 OutSize = UINT16_MAX;
1340 uint8_t ExtraZeros = 4 - ((2 + OutSize) % 4);
1344 OutName = OutnameConv.
str();
1346 OutStreamer->AddComment(
"Length of Name");
1347 OutStreamer->emitInt16(OutSize);
1348 OutStreamer->AddComment(
"Name of Function");
1349 OutStreamer->emitBytes(OutName);
1350 OutStreamer->emitZeros(ExtraZeros);
1353void SystemZAsmPrinter::emitPPA1(
MCSymbol *FnEndSym) {
1354 assert(PPA2Sym !=
nullptr &&
"PPA2 Symbol not defined");
1358 const auto TargetHasVector = Subtarget.hasVector();
1371 int64_t OffsetFPR = 0;
1372 int64_t OffsetVR = 0;
1373 const int64_t TopOfStack =
1380 I && E &&
I <= E; ++
I) {
1382 assert(V < 16 &&
"GPR index out of range");
1383 SavedGPRMask |= 1 << (15 -
V);
1386 for (
auto &CS : CSI) {
1387 unsigned Reg = CS.getReg();
1388 unsigned I =
TRI->getEncodingValue(Reg);
1390 if (SystemZ::FP64BitRegClass.
contains(Reg)) {
1391 assert(
I < 16 &&
"FPR index out of range");
1392 SavedFPRMask |= 1 << (15 -
I);
1394 if (Temp < OffsetFPR)
1396 }
else if (SystemZ::VR128BitRegClass.
contains(Reg)) {
1397 assert(
I >= 16 &&
I <= 23 &&
"VPR index out of range");
1398 unsigned BitNum =
I - 16;
1399 SavedVRMask |= 1 << (7 - BitNum);
1401 if (Temp < OffsetVR)
1407 OffsetFPR += (OffsetFPR < 0) ? TopOfStack : 0;
1408 OffsetVR += (OffsetVR < 0) ? TopOfStack : 0;
1412 uint8_t AllocaReg = ZFL->hasFP(*
MF) ? FrameReg : 0;
1413 assert(AllocaReg < 16 &&
"Can't have alloca register larger than 15");
1419 uint64_t FPRSaveAreaOffset = OffsetFPR;
1420 assert(FPRSaveAreaOffset < 0x10000000 &&
"Offset out of range");
1422 FrameAndFPROffset = FPRSaveAreaOffset & 0x0FFFFFFF;
1423 FrameAndFPROffset |= FrameReg << 28;
1428 if (TargetHasVector && SavedVRMask) {
1429 uint64_t VRSaveAreaOffset = OffsetVR;
1430 assert(VRSaveAreaOffset < 0x10000000 &&
"Offset out of range");
1432 FrameAndVROffset = VRSaveAreaOffset & 0x0FFFFFFF;
1433 FrameAndVROffset |= FrameReg << 28;
1446 OutStreamer->emitAbsoluteSymbolDiff(PPA2Sym, CurrentFnPPA1Sym, 4);
1455 TargetHasVector && SavedVRMask != 0, NeedEmitEHBlock, HasName);
1461 OutStreamer->emitAbsoluteSymbolDiff(FnEndSym, CurrentFnEPMarkerSym, 4);
1471 .
concat(utostr(FrameAndFPROffset >> 28))
1474 .
concat(utostr(FrameAndFPROffset & 0x0FFFFFFF))
1482 if (TargetHasVector && SavedVRMask) {
1489 .
concat(utostr(FrameAndVROffset >> 28))
1492 .
concat(utostr(FrameAndVROffset & 0x0FFFFFFF))
1499 if (NeedEmitEHBlock) {
1500 Per = dyn_cast<Function>(
1504 assert(PersonalityRoutine &&
"Missing personality routine");
1525 OutStreamer->emitAbsoluteSymbolDiff(CurrentFnEPMarkerSym, CurrentFnPPA1Sym,
1535void SystemZAsmPrinter::emitPPA2(
Module &M) {
1540 const char *StartSymbolName =
"CELQSTRT";
1558 ostr <<
formatv(
"{0,0-2:d}{1,0-2:d}{2,0-2:d}", ProductVersion, ProductRelease,
1562 SmallString<
sizeof(CompilationTime) - 1> CompilationTimeStr;
1568 enum class PPA2MemberId :
uint8_t {
1573 enum class PPA2MemberSubId :
uint8_t {
1579 LLVMBasedLang = 0xe7,
1582 enum class PPA2Flags :
uint8_t {
1583 CompileForBinaryFloatingPoint = 0x80,
1584 CompiledWithXPLink = 0x01,
1585 CompiledUnitASCII = 0x04,
1586 HasServiceInfo = 0x20,
1589 PPA2MemberSubId MemberSubId = PPA2MemberSubId::LLVMBasedLang;
1590 if (
auto *MD =
M.getModuleFlag(
"zos_cu_language")) {
1593 .
Case(
"C", PPA2MemberSubId::C)
1594 .
Case(
"C++", PPA2MemberSubId::CXX)
1595 .
Case(
"Swift", PPA2MemberSubId::Swift)
1596 .
Case(
"Go", PPA2MemberSubId::Go)
1597 .
Default(PPA2MemberSubId::LLVMBasedLang);
1606 OutStreamer->emitAbsoluteSymbolDiff(CELQSTRT, PPA2Sym, 4);
1608 OutStreamer->emitAbsoluteSymbolDiff(DateVersionSym, PPA2Sym, 4);
1611 uint8_t Flgs =
static_cast<uint8_t>(PPA2Flags::CompileForBinaryFloatingPoint);
1612 Flgs |=
static_cast<uint8_t>(PPA2Flags::CompiledWithXPLink);
1614 if (
auto *MD =
M.getModuleFlag(
"zos_le_char_mode")) {
1615 const StringRef &CharMode = cast<MDString>(MD)->getString();
1616 if (CharMode ==
"ascii") {
1618 PPA2Flags::CompiledUnitASCII);
1619 }
else if (CharMode !=
"ebcdic") {
1621 "Only ascii or ebcdic are valid values for zos_le_char_mode "
1646 OutStreamer->emitAbsoluteSymbolDiff(PPA2Sym, CELQSTRT, 8);
1653 if (Subtarget.getTargetTriple().isOSzOS()) {
1661 CurrentFnEPMarkerSym =
1680 uint32_t DSAAndFlags = DSASize & 0xFFFFFFE0;
1681 DSAAndFlags |= Flags;
1684 OutStreamer->AddComment(
"XPLINK Routine Layout Entry");
1686 OutStreamer->AddComment(
"Eyecatcher 0x00C300C500C500");
1687 OutStreamer->emitIntValueInHex(0x00C300C500C500, 7);
1691 OutStreamer->emitAbsoluteSymbolDiff(CurrentFnPPA1Sym, CurrentFnEPMarkerSym,
1697 OutStreamer->AddComment(
" Bit 1: 1 = Leaf function");
1699 OutStreamer->AddComment(
" Bit 1: 0 = Non-leaf function");
1701 OutStreamer->AddComment(
" Bit 2: 1 = Uses alloca");
1703 OutStreamer->AddComment(
" Bit 2: 0 = Does not use alloca");
unsigned const MachineRegisterInfo * MRI
static MCSymbolRefExpr::VariantKind getModifierVariantKind(ARMCP::ARMCPModifier Modifier)
#define LLVM_EXTERNAL_VISIBILITY
This file provides utility functions for converting between EBCDIC-1047 and UTF-8.
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
const HexagonInstrInfo * TII
Module.h This file contains the declarations for the Module class.
unsigned const TargetRegisterInfo * TRI
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
static bool printOperand(raw_ostream &OS, const SelectionDAG *G, const SDValue Value)
static void emitPPA1Name(std::unique_ptr< MCStreamer > &OutStreamer, StringRef OutName)
static void lowerAlignmentHint(const MachineInstr *MI, MCInst &LoweredMI, unsigned Opcode)
#define EMIT_COMMENT(Str)
static const MCSymbolRefExpr * getGlobalOffsetTable(MCContext &Context)
static void printFormattedRegName(const MCAsmInfo *MAI, unsigned RegNo, raw_ostream &OS)
static MCInst lowerRILow(const MachineInstr *MI, unsigned Opcode)
static uint32_t getProductVersion(Module &M)
static std::string getProductID(Module &M)
static MCInst lowerRIHigh(const MachineInstr *MI, unsigned Opcode)
static void emitPPA1Flags(std::unique_ptr< MCStreamer > &OutStreamer, bool VarArg, bool StackProtector, bool FPRMask, bool VRMask, bool EHBlock, bool HasName)
LLVM_EXTERNAL_VISIBILITY void LLVMInitializeSystemZAsmPrinter()
static void printAddress(const MCAsmInfo *MAI, unsigned Base, const MCOperand &DispMO, unsigned Index, raw_ostream &OS)
static time_t getTranslationTime(Module &M)
static const MCSymbolRefExpr * getTLSGetOffset(MCContext &Context)
static MCInst lowerSubvectorStore(const MachineInstr *MI, unsigned Opcode)
static unsigned EmitNop(MCContext &OutContext, MCStreamer &OutStreamer, unsigned NumBytes, const MCSubtargetInfo &STI)
static uint32_t getProductRelease(Module &M)
static MCInst lowerSubvectorLoad(const MachineInstr *MI, unsigned Opcode)
static uint32_t getProductPatch(Module &M)
static MCInst lowerRIEfLow(const MachineInstr *MI, unsigned Opcode)
const TargetLoweringObjectFile & getObjFileLowering() const
Return information about object file lowering.
MCSymbol * getSymbol(const GlobalValue *GV) const
void EmitToStreamer(MCStreamer &S, const MCInst &Inst)
TargetMachine & TM
Target machine description.
const MCAsmInfo * MAI
Target Asm Printer information.
MachineFunction * MF
The current machine function.
virtual void emitStartOfAsmFile(Module &)
This virtual method can be overridden by targets that want to emit something at the start of their fi...
void recordSled(MCSymbol *Sled, const MachineInstr &MI, SledKind Kind, uint8_t Version=0)
MCContext & OutContext
This is the context for the output file that we are streaming.
MCSymbol * createTempSymbol(const Twine &Name) const
std::unique_ptr< MCStreamer > OutStreamer
This is the MCStreamer object for the file we are generating.
const DataLayout & getDataLayout() const
Return information about data layout.
virtual void emitFunctionEntryLabel()
EmitFunctionEntryLabel - Emit the label that is the entrypoint for the function.
const MCSubtargetInfo & getSubtargetInfo() const
Return information about subtarget.
virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, const char *ExtraCode, raw_ostream &OS)
Print the specified operand of MI, an INLINEASM instruction, using the specified assembler variant.
const Constant * stripPointerCasts() const
This class represents an Operation in the Expression.
TypeSize getTypeAllocSize(Type *Ty) const
Returns the offset in bytes between successive objects of the specified type, including alignment pad...
unsigned getPointerSize(unsigned AS=0) const
Layout pointer size in bytes, rounded up to a whole number of bytes.
Constant * getPersonalityFn() const
Get the personality function associated with this function.
bool isVarArg() const
isVarArg - Return true if this function takes a variable number of arguments.
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
This class is intended to be used as a base class for asm properties and features specific to the tar...
unsigned getAssemblerDialect() const
static const MCBinaryExpr * createAdd(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
static const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Context object for machine code objects.
MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
MCSectionELF * getELFSection(const Twine &Section, unsigned Type, unsigned Flags)
MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
const Triple & getTargetTriple() const
Base class for the full range of assembler expressions which are needed for parsing.
void print(raw_ostream &OS, const MCAsmInfo *MAI, bool InParens=false) const
MCInstBuilder & addReg(MCRegister Reg)
Add a new register operand.
MCInstBuilder & addImm(int64_t Val)
Add a new integer immediate operand.
MCInstBuilder & addExpr(const MCExpr *Val)
Add a new MCExpr operand.
Instances of this class represent a single low-level machine instruction.
void addOperand(const MCOperand Op)
void setOpcode(unsigned Op)
Instances of this class represent operands of the MCInst class.
static MCOperand createReg(MCRegister Reg)
static MCOperand createImm(int64_t Val)
MCRegister getReg() const
Returns the register number.
const MCExpr * getExpr() const
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
Streaming machine code generation interface.
virtual void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI)
Emit the given Instruction into the current section.
virtual void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc())
Emit a label for Symbol into the current section.
Generic base class for all target subtargets.
bool hasFeature(unsigned Feature) const
Represent a reference to a symbol from inside an expression.
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx)
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Abstract base class for all machine specific constantpool value subclasses.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
bool hasVarSizedObjects() const
This method may be called any time after instruction selection is complete to determine if the stack ...
uint64_t getStackSize() const
Return the number of bytes that must be allocated to hold all of the fixed size frame objects.
int64_t getOffsetAdjustment() const
Return the correction for frame offsets.
const std::vector< CalleeSavedInfo > & getCalleeSavedInfo() const
Returns a reference to call saved info vector for the current function.
bool hasStackProtectorIndex() const
int64_t getObjectOffset(int ObjectIdx) const
Return the assigned stack offset of the specified object from the incoming stack pointer.
unsigned getFunctionNumber() const
getFunctionNumber - Return a unique ID for the current function.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MCContext & getContext() const
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
const std::vector< LandingPadInfo > & getLandingPads() const
Return a reference to the landing pad info for the current function.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
Representation of each machine instruction.
const MachineFunction * getMF() const
Return the function that contains the basic block that this instruction belongs to.
MachineOperand class - Representation of each machine instruction operand.
const GlobalValue * getGlobal() const
bool isReg() const
isReg - Tests if this is a MO_Register operand.
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
unsigned getTargetFlags() const
bool isGlobal() const
isGlobal - Tests if this is a MO_GlobalAddress operand.
MachineOperandType getType() const
getType - Returns the MachineOperandType for this operand.
const char * getSymbolName() const
Register getReg() const
getReg - Returns the register number.
@ MO_GlobalAddress
Address of a global value.
@ MO_ExternalSymbol
Name of external global symbol.
const TargetRegisterInfo * getTargetRegisterInfo() const
A Module instance is used to store all the information related to an LLVM module.
MI-level patchpoint operands.
Wrapper class representing virtual and physical registers.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
StringRef str() const
Explicit conversion to StringRef.
void recordPatchPoint(const MCSymbol &L, const MachineInstr &MI)
Generate a stackmap record for a patchpoint instruction.
void recordStackMap(const MCSymbol &L, const MachineInstr &MI)
Generate a stackmap record for a stackmap instruction.
StringRef - Represent a constant reference to a string, i.e.
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
constexpr size_t size() const
size - Get the string size.
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
void emitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) override
void emitFunctionBodyEnd() override
Targets can override this to emit stuff after the last basic block in the function.
void emitStartOfAsmFile(Module &M) override
This virtual method can be overridden by targets that want to emit something at the start of their fi...
void emitInstruction(const MachineInstr *MI) override
Targets should implement this to emit instructions.
bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, const char *ExtraCode, raw_ostream &OS) override
Print the specified operand of MI, an INLINEASM instruction, using the specified assembler variant as...
void emitFunctionEntryLabel() override
EmitFunctionEntryLabel - Emit the label that is the entrypoint for the function.
bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, const char *ExtraCode, raw_ostream &OS) override
Print the specified operand of MI, an INLINEASM instruction, using the specified assembler variant.
void emitEndOfAsmFile(Module &M) override
This virtual method can be overridden by targets that want to emit something at the end of their file...
A SystemZ-specific constant pool value.
static const char * getRegisterName(MCRegister Reg)
static const char * getRegisterName(MCRegister Reg)
static const SystemZMCExpr * create(VariantKind Kind, const MCExpr *Expr, MCContext &Ctx)
SystemZ::GPRRegs getSpillGPRRegs() const
unsigned getSizeOfFnParams() const
const SystemZInstrInfo * getInstrInfo() const override
const TargetFrameLowering * getFrameLowering() const override
std::pair< MCInst, const MCSubtargetInfo * > MCInstSTIPair
EXRLT2SymMap EXRLTargets2Sym
const Triple & getTargetTriple() const
const MCSubtargetInfo * getMCSubtargetInfo() const
MCSymbol * getSymbol(const GlobalValue *GV) const
const MCRegisterInfo * getMCRegisterInfo() const
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
std::string str() const
Return the twine contents as a std::string.
Twine concat(const Twine &Suffix) const
static Twine utohexstr(const uint64_t &Val)
StringRef getName() const
Return a constant reference to the value's name.
This class implements an extremely fast bulk output stream that can only output to a stream.
A raw_ostream that writes to an SmallVector or SmallString.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Language[]
Key for Kernel::Metadata::mLanguage.
@ Swift
Calling convention for Swift.
@ C
The default llvm calling convention, compatible with C.
std::error_code convertToEBCDIC(StringRef Source, SmallVectorImpl< char > &Result)
@ MO_ADA_DATA_SYMBOL_ADDR
@ MO_ADA_DIRECT_FUNC_DESC
@ MO_ADA_INDIRECT_FUNC_DESC
unsigned getRegAsGR32(unsigned Reg)
const unsigned GR64Regs[16]
unsigned getRegAsGRH32(unsigned Reg)
unsigned getRegAsVR128(unsigned Reg)
unsigned getRegAsGR64(unsigned Reg)
Reg
All possible values of the reg field in the ModR/M byte.
constexpr size_t NameSize
constexpr uint64_t PointerSize
aarch64 pointer size.
UtcTime< std::chrono::seconds > toUtcTime(std::time_t T)
Convert a std::time_t to a UtcTime.
This is an optimization pass for GlobalISel generic memory operations.
Target & getTheSystemZTarget()
detail::concat_range< ValueT, RangeTs... > concat(RangeTs &&...Ranges)
Returns a concatenated range across two or more ranges.
auto formatv(bool Validate, const char *Fmt, Ts &&...Vals)
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
@ LLVM_MARK_AS_BITMASK_ENUM
Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
@ MCSA_IndirectSymbol
.indirect_symbol (MachO)
This struct is a compact representation of a valid (non-zero power of two) alignment.
RegisterAsmPrinter - Helper template for registering a target specific assembly printer,...