98 if (
MI->memoperands_empty())
103 EE =
MI->memoperands_end(); MMOI != EE; ++MMOI)
104 if ((*MMOI)->getAlign() < Alignment)
105 Alignment = (*MMOI)->getAlign();
107 unsigned AlignmentHint = 0;
108 if (Alignment >=
Align(16))
110 else if (Alignment >=
Align(8))
112 if (AlignmentHint == 0)
126 .
addReg(
MI->getOperand(3).getReg());
145void SystemZAsmPrinter::emitCallInformation(CallType CT) {
154 auto Key = std::make_pair(
Sym, SlotKind);
155 auto It = Displacements.find(Key);
157 if (It != Displacements.end())
171 uint32_t Displacement = NextDisplacement;
172 Displacements[std::make_pair(
Sym, SlotKind)] = NextDisplacement;
173 NextDisplacement +=
Length;
179SystemZAsmPrinter::AssociatedDataAreaTable::insert(
const MachineOperand MO) {
193 return insert(
Sym, ADAslotType);
197 SystemZ_MC::verifyInstructionPredicates(
MI->getOpcode(),
202 switch (
MI->getOpcode()) {
203 case SystemZ::Return:
208 case SystemZ::Return_XPLINK:
215 case SystemZ::CondReturn:
222 case SystemZ::CondReturn_XPLINK:
231 case SystemZ::CRBReturn:
240 case SystemZ::CGRBReturn:
249 case SystemZ::CIBReturn:
258 case SystemZ::CGIBReturn:
267 case SystemZ::CLRBReturn:
276 case SystemZ::CLGRBReturn:
285 case SystemZ::CLIBReturn:
294 case SystemZ::CLGIBReturn:
303 case SystemZ::CallBRASL_XPLINK64:
306 .addReg(SystemZ::R7D)
307 .addExpr(
Lower.getExpr(
MI->getOperand(0),
309 emitCallInformation(CallType::BRASL7);
312 case SystemZ::CallBASR_XPLINK64:
314 .addReg(SystemZ::R7D)
315 .addReg(
MI->getOperand(0).getReg()));
316 emitCallInformation(CallType::BASR76);
319 case SystemZ::CallBASR_STACKEXT:
321 .addReg(SystemZ::R3D)
322 .addReg(
MI->getOperand(0).getReg()));
323 emitCallInformation(CallType::BASR33);
326 case SystemZ::ADA_ENTRY_VALUE:
327 case SystemZ::ADA_ENTRY: {
330 uint32_t Disp = ADATable.insert(
MI->getOperand(1));
331 Register TargetReg =
MI->getOperand(0).getReg();
334 Disp +=
MI->getOperand(3).getImm();
335 bool LoadAddr =
MI->getOpcode() == SystemZ::ADA_ENTRY;
337 unsigned Op0 = LoadAddr ? SystemZ::LA : SystemZ::LG;
338 unsigned Op =
TII->getOpcodeForOffset(Op0, Disp);
342 if (TargetReg != ADAReg) {
343 IndexReg = TargetReg;
347 MCInstBuilder(SystemZ::LLILF).addReg(TargetReg).addImm(Disp));
351 MCInstBuilder(SystemZ::ALGFI).addReg(TargetReg).addImm(Disp));
363 case SystemZ::CallBRASL:
369 case SystemZ::CallBASR:
372 .
addReg(
MI->getOperand(0).getReg());
375 case SystemZ::CallJG:
380 case SystemZ::CallBRCL:
387 case SystemZ::CallBR:
389 .
addReg(
MI->getOperand(0).getReg());
392 case SystemZ::CallBCR:
396 .
addReg(
MI->getOperand(2).getReg());
399 case SystemZ::CRBCall:
408 case SystemZ::CGRBCall:
417 case SystemZ::CIBCall:
426 case SystemZ::CGIBCall:
435 case SystemZ::CLRBCall:
444 case SystemZ::CLGRBCall:
453 case SystemZ::CLIBCall:
462 case SystemZ::CLGIBCall:
471 case SystemZ::TLS_GDCALL:
478 case SystemZ::TLS_LDCALL:
491 case SystemZ::IILF64:
494 .
addImm(
MI->getOperand(2).getImm());
497 case SystemZ::IIHF64:
500 .
addImm(
MI->getOperand(2).getImm());
503 case SystemZ::RISBHH:
504 case SystemZ::RISBHL:
508 case SystemZ::RISBLH:
509 case SystemZ::RISBLL:
513 case SystemZ::VLVGP32:
578#define LOWER_LOW(NAME) \
579 case SystemZ::NAME##64: LoweredMI = lowerRILow(MI, SystemZ::NAME); break
595#define LOWER_HIGH(NAME) \
596 case SystemZ::NAME##64: LoweredMI = lowerRIHigh(MI, SystemZ::NAME); break
612 case SystemZ::Serialize:
625 case SystemZ::Trap: {
638 case SystemZ::CondTrap: {
651 case TargetOpcode::FENTRY_CALL:
655 case TargetOpcode::STACKMAP:
659 case TargetOpcode::PATCHPOINT:
663 case SystemZ::EXRL_Pseudo: {
664 unsigned TargetInsOpc =
MI->getOperand(0).getImm();
665 Register LenMinus1Reg =
MI->getOperand(1).getReg();
666 Register DestReg =
MI->getOperand(2).getReg();
667 int64_t DestDisp =
MI->getOperand(3).getImm();
669 int64_t SrcDisp =
MI->getOperand(5).getImm();
676 SystemZTargetStreamer::EXRLT2SymMap::iterator
I =
685 MCInstBuilder(SystemZ::EXRL).addReg(LenMinus1Reg).addExpr(Dot));
704 else if (NumBytes < 4) {
706 MCInstBuilder(SystemZ::BCRAsm).addImm(0).addReg(SystemZ::R0D), STI);
709 else if (NumBytes < 6) {
711 MCInstBuilder(SystemZ::BCAsm).addImm(0).addReg(0).addImm(0).addReg(0),
720 MCInstBuilder(SystemZ::BRCLAsm).addImm(0).addExpr(Dot), STI);
754 unsigned NumNOPBytes =
MI.getOperand(1).getImm();
761 assert(NumNOPBytes % 2 == 0 &&
"Invalid number of NOP bytes requested!");
764 unsigned ShadowBytes = 0;
768 while (ShadowBytes < NumNOPBytes) {
770 MII->getOpcode() == TargetOpcode::PATCHPOINT ||
771 MII->getOpcode() == TargetOpcode::STACKMAP)
773 ShadowBytes +=
TII->getInstSizeInBytes(*MII);
780 while (ShadowBytes < NumNOPBytes)
796 unsigned EncodedBytes = 0;
799 if (CalleeMO.
isImm()) {
802 unsigned ScratchIdx = -1;
803 unsigned ScratchReg = 0;
805 ScratchIdx = Opers.getNextScratchIdx(ScratchIdx + 1);
806 ScratchReg =
MI.getOperand(ScratchIdx).getReg();
807 }
while (ScratchReg == SystemZ::R0D);
812 .addImm(CallTarget & 0xFFFFFFFF));
814 if (CallTarget >> 32) {
817 .addImm(CallTarget >> 32));
822 .addReg(SystemZ::R14D)
823 .addReg(ScratchReg));
829 .addReg(SystemZ::R14D)
835 unsigned NumBytes = Opers.getNumPatchBytes();
836 assert(NumBytes >= EncodedBytes &&
837 "Patchpoint can't request size less than the length of a call.");
838 assert((NumBytes - EncodedBytes) % 2 == 0 &&
839 "Invalid number of NOP bytes requested!");
840 while (EncodedBytes < NumBytes)
848void SystemZAsmPrinter::emitAttributes(
Module &M) {
849 if (
M.getModuleFlag(
"s390x-visible-vector-ABI")) {
850 bool HasVectorFeature =
852 OutStreamer->emitGNUAttribute(8, HasVectorFeature ? 2 : 1);
904 else if (MCOp.
isImm())
930 const char *ExtraCode,
936 if (ExtraCode[0] ==
'N' && !ExtraCode[1] && MO.
isReg() &&
937 SystemZ::GR128BitRegClass.contains(MO.
getReg()))
944 MCOp =
Lower.lowerOperand(MO);
952 const char *ExtraCode,
954 if (ExtraCode && ExtraCode[0] && !ExtraCode[1]) {
955 switch (ExtraCode[0]) {
962 OS <<
MI->getOperand(OpNo + 1).getImm();
971 MI->getOperand(OpNo + 2).getReg(),
OS);
984void SystemZAsmPrinter::emitADASection() {
990 unsigned EmittedBytes = 0;
991 for (
auto &Entry : ADATable.getTable()) {
994 std::tie(
Sym, SlotKind) = Entry.first;
995 unsigned Offset = Entry.second;
996 assert(
Offset == EmittedBytes &&
"Offset not as expected");
998#define EMIT_COMMENT(Str) \
999 OutStreamer->AddComment(Twine("Offset ") \
1000 .concat(utostr(Offset)) \
1001 .concat(" " Str " ") \
1002 .concat(Sym->getName()));
1018 EmittedBytes += PointerSize * 2;
1027 EmittedBytes += PointerSize;
1042 EmittedBytes += PointerSize;
1054 std::string ProductID;
1055 if (
auto *MD = M.getModuleFlag(
"zos_product_id"))
1056 ProductID = cast<MDString>(MD)->getString().str();
1057 if (ProductID.empty())
1063 if (
auto *VersionVal = mdconst::extract_or_null<ConstantInt>(
1064 M.getModuleFlag(
"zos_product_major_version")))
1065 return VersionVal->getZExtValue();
1066 return LLVM_VERSION_MAJOR;
1070 if (
auto *ReleaseVal = mdconst::extract_or_null<ConstantInt>(
1071 M.getModuleFlag(
"zos_product_minor_version")))
1072 return ReleaseVal->getZExtValue();
1073 return LLVM_VERSION_MINOR;
1077 if (
auto *PatchVal = mdconst::extract_or_null<ConstantInt>(
1078 M.getModuleFlag(
"zos_product_patchlevel")))
1079 return PatchVal->getZExtValue();
1080 return LLVM_VERSION_PATCH;
1084 std::time_t Time = 0;
1085 if (
auto *Val = mdconst::extract_or_null<ConstantInt>(
1086 M.getModuleFlag(
"zos_translation_time"))) {
1087 long SecondsSinceEpoch = Val->getSExtValue();
1088 Time =
static_cast<time_t
>(SecondsSinceEpoch);
1093void SystemZAsmPrinter::emitIDRLSection(
Module &M) {
1096 constexpr unsigned IDRLDataLength = 30;
1106 O <<
formatv(
"{0,-10}{1,0-2:d}{2,0-2:d}{3:%Y%m%d%H%M%S}{4,0-2}",
1107 ProductID.substr(0, 10).c_str(), ProductVersion, ProductRelease,
1131 CurrentFnPPA1Sym =
nullptr;
1132 CurrentFnEPMarkerSym =
nullptr;
1138 bool EHBlock,
bool HasName) {
1139 enum class PPA1Flag1 : uint8_t {
1140 DSA64Bit = (0x80 >> 0),
1141 VarArg = (0x80 >> 7),
1144 enum class PPA1Flag2 : uint8_t {
1145 ExternalProcedure = (0x80 >> 0),
1146 STACKPROTECTOR = (0x80 >> 3),
1149 enum class PPA1Flag3 : uint8_t {
1150 FPRMask = (0x80 >> 2),
1153 enum class PPA1Flag4 : uint8_t {
1154 EPMOffsetPresent = (0x80 >> 0),
1155 VRMask = (0x80 >> 2),
1156 EHBlock = (0x80 >> 3),
1157 ProcedureNamePresent = (0x80 >> 7),
1162 auto Flags1 = PPA1Flag1(0);
1163 auto Flags2 = PPA1Flag2::ExternalProcedure;
1164 auto Flags3 = PPA1Flag3(0);
1165 auto Flags4 = PPA1Flag4::EPMOffsetPresent;
1167 Flags1 |= PPA1Flag1::DSA64Bit;
1170 Flags1 |= PPA1Flag1::VarArg;
1173 Flags2 |= PPA1Flag2::STACKPROTECTOR;
1177 Flags3 |= PPA1Flag3::FPRMask;
1180 Flags4 |= PPA1Flag4::VRMask;
1183 Flags4 |= PPA1Flag4::EHBlock;
1186 Flags4 |= PPA1Flag4::ProcedureNamePresent;
1188 OutStreamer->AddComment(
"PPA1 Flags 1");
1189 if ((Flags1 & PPA1Flag1::DSA64Bit) == PPA1Flag1::DSA64Bit)
1190 OutStreamer->AddComment(
" Bit 0: 1 = 64-bit DSA");
1192 OutStreamer->AddComment(
" Bit 0: 0 = 32-bit DSA");
1193 if ((Flags1 & PPA1Flag1::VarArg) == PPA1Flag1::VarArg)
1194 OutStreamer->AddComment(
" Bit 7: 1 = Vararg function");
1195 OutStreamer->emitInt8(
static_cast<uint8_t
>(Flags1));
1197 OutStreamer->AddComment(
"PPA1 Flags 2");
1198 if ((Flags2 & PPA1Flag2::ExternalProcedure) == PPA1Flag2::ExternalProcedure)
1199 OutStreamer->AddComment(
" Bit 0: 1 = External procedure");
1200 if ((Flags2 & PPA1Flag2::STACKPROTECTOR) == PPA1Flag2::STACKPROTECTOR)
1201 OutStreamer->AddComment(
" Bit 3: 1 = STACKPROTECT is enabled");
1203 OutStreamer->AddComment(
" Bit 3: 0 = STACKPROTECT is not enabled");
1204 OutStreamer->emitInt8(
static_cast<uint8_t
>(Flags2));
1206 OutStreamer->AddComment(
"PPA1 Flags 3");
1207 if ((Flags3 & PPA1Flag3::FPRMask) == PPA1Flag3::FPRMask)
1208 OutStreamer->AddComment(
" Bit 2: 1 = FP Reg Mask is in optional area");
1209 OutStreamer->emitInt8(
1210 static_cast<uint8_t
>(Flags3));
1212 OutStreamer->AddComment(
"PPA1 Flags 4");
1213 if ((Flags4 & PPA1Flag4::VRMask) == PPA1Flag4::VRMask)
1214 OutStreamer->AddComment(
" Bit 2: 1 = Vector Reg Mask is in optional area");
1215 if ((Flags4 & PPA1Flag4::EHBlock) == PPA1Flag4::EHBlock)
1216 OutStreamer->AddComment(
" Bit 3: 1 = C++ EH block");
1217 if ((Flags4 & PPA1Flag4::ProcedureNamePresent) ==
1218 PPA1Flag4::ProcedureNamePresent)
1219 OutStreamer->AddComment(
" Bit 7: 1 = Name Length and Name");
1220 OutStreamer->emitInt8(
static_cast<uint8_t
>(
1231 OutName = OutName.
substr(0, UINT16_MAX);
1232 OutSize = UINT16_MAX;
1235 uint8_t ExtraZeros = 4 - ((2 + OutSize) % 4);
1239 OutName = OutnameConv.
str();
1241 OutStreamer->AddComment(
"Length of Name");
1242 OutStreamer->emitInt16(OutSize);
1243 OutStreamer->AddComment(
"Name of Function");
1244 OutStreamer->emitBytes(OutName);
1245 OutStreamer->emitZeros(ExtraZeros);
1248void SystemZAsmPrinter::emitPPA1(
MCSymbol *FnEndSym) {
1249 assert(PPA2Sym !=
nullptr &&
"PPA2 Symbol not defined");
1253 const auto TargetHasVector = Subtarget.hasVector();
1265 uint8_t SavedVRMask = 0;
1266 int64_t OffsetFPR = 0;
1267 int64_t OffsetVR = 0;
1268 const int64_t TopOfStack =
1275 I && E &&
I <= E; ++
I) {
1277 assert(V < 16 &&
"GPR index out of range");
1278 SavedGPRMask |= 1 << (15 -
V);
1281 for (
auto &CS : CSI) {
1282 unsigned Reg = CS.getReg();
1283 unsigned I =
TRI->getEncodingValue(Reg);
1285 if (SystemZ::FP64BitRegClass.
contains(Reg)) {
1286 assert(
I < 16 &&
"FPR index out of range");
1287 SavedFPRMask |= 1 << (15 -
I);
1289 if (Temp < OffsetFPR)
1291 }
else if (SystemZ::VR128BitRegClass.
contains(Reg)) {
1292 assert(
I >= 16 &&
I <= 23 &&
"VPR index out of range");
1293 unsigned BitNum =
I - 16;
1294 SavedVRMask |= 1 << (7 - BitNum);
1296 if (Temp < OffsetVR)
1302 OffsetFPR += (OffsetFPR < 0) ? TopOfStack : 0;
1303 OffsetVR += (OffsetVR < 0) ? TopOfStack : 0;
1306 uint8_t FrameReg =
TRI->getEncodingValue(
TRI->getFrameRegister(*
MF));
1307 uint8_t AllocaReg = ZFL->hasFP(*
MF) ? FrameReg : 0;
1308 assert(AllocaReg < 16 &&
"Can't have alloca register larger than 15");
1314 uint64_t FPRSaveAreaOffset = OffsetFPR;
1315 assert(FPRSaveAreaOffset < 0x10000000 &&
"Offset out of range");
1317 FrameAndFPROffset = FPRSaveAreaOffset & 0x0FFFFFFF;
1318 FrameAndFPROffset |= FrameReg << 28;
1323 if (TargetHasVector && SavedVRMask) {
1324 uint64_t VRSaveAreaOffset = OffsetVR;
1325 assert(VRSaveAreaOffset < 0x10000000 &&
"Offset out of range");
1327 FrameAndVROffset = VRSaveAreaOffset & 0x0FFFFFFF;
1328 FrameAndVROffset |= FrameReg << 28;
1341 OutStreamer->emitAbsoluteSymbolDiff(PPA2Sym, CurrentFnPPA1Sym, 4);
1350 TargetHasVector && SavedVRMask != 0, NeedEmitEHBlock, HasName);
1356 OutStreamer->emitAbsoluteSymbolDiff(FnEndSym, CurrentFnEPMarkerSym, 4);
1366 .
concat(utostr(FrameAndFPROffset >> 28))
1369 .
concat(utostr(FrameAndFPROffset & 0x0FFFFFFF))
1377 if (TargetHasVector && SavedVRMask) {
1384 .
concat(utostr(FrameAndVROffset >> 28))
1387 .
concat(utostr(FrameAndVROffset & 0x0FFFFFFF))
1394 if (NeedEmitEHBlock) {
1395 Per = dyn_cast<Function>(
1399 assert(PersonalityRoutine &&
"Missing personality routine");
1420 OutStreamer->emitAbsoluteSymbolDiff(CurrentFnEPMarkerSym, CurrentFnPPA1Sym,
1430void SystemZAsmPrinter::emitPPA2(
Module &M) {
1435 const char *StartSymbolName =
"CELQSTRT";
1453 ostr <<
formatv(
"{0,0-2:d}{1,0-2:d}{2,0-2:d}", ProductVersion, ProductRelease,
1457 SmallString<
sizeof(CompilationTime) - 1> CompilationTimeStr;
1463 enum class PPA2MemberId : uint8_t {
1468 enum class PPA2MemberSubId : uint8_t {
1474 LLVMBasedLang = 0xe7,
1477 enum class PPA2Flags : uint8_t {
1478 CompileForBinaryFloatingPoint = 0x80,
1479 CompiledWithXPLink = 0x01,
1480 CompiledUnitASCII = 0x04,
1481 HasServiceInfo = 0x20,
1484 PPA2MemberSubId MemberSubId = PPA2MemberSubId::LLVMBasedLang;
1485 if (
auto *MD =
M.getModuleFlag(
"zos_cu_language")) {
1488 .
Case(
"C", PPA2MemberSubId::C)
1489 .
Case(
"C++", PPA2MemberSubId::CXX)
1490 .
Case(
"Swift", PPA2MemberSubId::Swift)
1491 .
Case(
"Go", PPA2MemberSubId::Go)
1492 .
Default(PPA2MemberSubId::LLVMBasedLang);
1497 OutStreamer->emitInt8(
static_cast<uint8_t
>(PPA2MemberId::LE_C_Runtime));
1498 OutStreamer->emitInt8(
static_cast<uint8_t
>(MemberSubId));
1501 OutStreamer->emitAbsoluteSymbolDiff(CELQSTRT, PPA2Sym, 4);
1503 OutStreamer->emitAbsoluteSymbolDiff(DateVersionSym, PPA2Sym, 4);
1506 uint8_t Flgs =
static_cast<uint8_t
>(PPA2Flags::CompileForBinaryFloatingPoint);
1507 Flgs |=
static_cast<uint8_t
>(PPA2Flags::CompiledWithXPLink);
1509 if (
auto *MD =
M.getModuleFlag(
"zos_le_char_mode")) {
1510 const StringRef &CharMode = cast<MDString>(MD)->getString();
1511 if (CharMode ==
"ascii") {
1512 Flgs |=
static_cast<uint8_t
>(
1513 PPA2Flags::CompiledUnitASCII);
1514 }
else if (CharMode !=
"ebcdic") {
1516 "Only ascii or ebcdic are valid values for zos_le_char_mode "
1541 OutStreamer->emitAbsoluteSymbolDiff(PPA2Sym, CELQSTRT, 8);
1548 if (Subtarget.getTargetTriple().isOSzOS()) {
1556 CurrentFnEPMarkerSym =
1575 uint32_t DSAAndFlags = DSASize & 0xFFFFFFE0;
1576 DSAAndFlags |= Flags;
1579 OutStreamer->AddComment(
"XPLINK Routine Layout Entry");
1581 OutStreamer->AddComment(
"Eyecatcher 0x00C300C500C500");
1582 OutStreamer->emitIntValueInHex(0x00C300C500C500, 7);
1586 OutStreamer->emitAbsoluteSymbolDiff(CurrentFnPPA1Sym, CurrentFnEPMarkerSym,
1592 OutStreamer->AddComment(
" Bit 1: 1 = Leaf function");
1594 OutStreamer->AddComment(
" Bit 1: 0 = Non-leaf function");
1596 OutStreamer->AddComment(
" Bit 2: 1 = Uses alloca");
1598 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
unsigned const TargetRegisterInfo * TRI
Module.h This file contains the declarations for the Module class.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
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)
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
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...
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(unsigned 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(unsigned Reg)
static MCOperand createImm(int64_t Val)
unsigned 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.
int 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 LLVMTargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
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...
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 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()
auto formatv(const char *Fmt, Ts &&...Vals) -> formatv_object< decltype(std::make_tuple(support::detail::build_format_adapter(std::forward< Ts >(Vals))...))>
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
detail::concat_range< ValueT, RangeTs... > concat(RangeTs &&... Ranges)
Concatenated range across two or more ranges.
@ 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,...