97 if (
MI->memoperands_empty())
102 EE =
MI->memoperands_end(); MMOI != EE; ++MMOI)
103 if ((*MMOI)->getAlign() < Alignment)
104 Alignment = (*MMOI)->getAlign();
106 unsigned AlignmentHint = 0;
107 if (Alignment >=
Align(16))
109 else if (Alignment >=
Align(8))
111 if (AlignmentHint == 0)
125 .
addReg(
MI->getOperand(3).getReg());
144void SystemZAsmPrinter::emitCallInformation(CallType CT) {
153 auto Key = std::make_pair(
Sym, SlotKind);
154 auto It = Displacements.find(Key);
156 if (It != Displacements.end())
170 uint32_t Displacement = NextDisplacement;
171 Displacements[std::make_pair(
Sym, SlotKind)] = NextDisplacement;
172 NextDisplacement +=
Length;
178SystemZAsmPrinter::AssociatedDataAreaTable::insert(
const MachineOperand MO) {
192 return insert(
Sym, ADAslotType);
196 SystemZ_MC::verifyInstructionPredicates(
MI->getOpcode(),
201 switch (
MI->getOpcode()) {
202 case SystemZ::Return:
207 case SystemZ::Return_XPLINK:
214 case SystemZ::CondReturn:
221 case SystemZ::CondReturn_XPLINK:
230 case SystemZ::CRBReturn:
239 case SystemZ::CGRBReturn:
248 case SystemZ::CIBReturn:
257 case SystemZ::CGIBReturn:
266 case SystemZ::CLRBReturn:
275 case SystemZ::CLGRBReturn:
284 case SystemZ::CLIBReturn:
293 case SystemZ::CLGIBReturn:
302 case SystemZ::CallBRASL_XPLINK64:
305 .addReg(SystemZ::R7D)
306 .addExpr(
Lower.getExpr(
MI->getOperand(0),
308 emitCallInformation(CallType::BRASL7);
311 case SystemZ::CallBASR_XPLINK64:
313 .addReg(SystemZ::R7D)
314 .addReg(
MI->getOperand(0).getReg()));
315 emitCallInformation(CallType::BASR76);
318 case SystemZ::CallBASR_STACKEXT:
320 .addReg(SystemZ::R3D)
321 .addReg(
MI->getOperand(0).getReg()));
322 emitCallInformation(CallType::BASR33);
325 case SystemZ::ADA_ENTRY_VALUE:
326 case SystemZ::ADA_ENTRY: {
329 uint32_t Disp = ADATable.insert(
MI->getOperand(1));
330 Register TargetReg =
MI->getOperand(0).getReg();
333 Disp +=
MI->getOperand(3).getImm();
334 bool LoadAddr =
MI->getOpcode() == SystemZ::ADA_ENTRY;
336 unsigned Op0 = LoadAddr ? SystemZ::LA : SystemZ::LG;
337 unsigned Op =
TII->getOpcodeForOffset(Op0, Disp);
341 if (TargetReg != ADAReg) {
342 IndexReg = TargetReg;
346 MCInstBuilder(SystemZ::LLILF).addReg(TargetReg).addImm(Disp));
350 MCInstBuilder(SystemZ::ALGFI).addReg(TargetReg).addImm(Disp));
362 case SystemZ::CallBRASL:
368 case SystemZ::CallBASR:
371 .
addReg(
MI->getOperand(0).getReg());
374 case SystemZ::CallJG:
379 case SystemZ::CallBRCL:
386 case SystemZ::CallBR:
388 .
addReg(
MI->getOperand(0).getReg());
391 case SystemZ::CallBCR:
395 .
addReg(
MI->getOperand(2).getReg());
398 case SystemZ::CRBCall:
407 case SystemZ::CGRBCall:
416 case SystemZ::CIBCall:
425 case SystemZ::CGIBCall:
434 case SystemZ::CLRBCall:
443 case SystemZ::CLGRBCall:
452 case SystemZ::CLIBCall:
461 case SystemZ::CLGIBCall:
470 case SystemZ::TLS_GDCALL:
477 case SystemZ::TLS_LDCALL:
490 case SystemZ::IILF64:
493 .
addImm(
MI->getOperand(2).getImm());
496 case SystemZ::IIHF64:
499 .
addImm(
MI->getOperand(2).getImm());
502 case SystemZ::RISBHH:
503 case SystemZ::RISBHL:
507 case SystemZ::RISBLH:
508 case SystemZ::RISBLL:
512 case SystemZ::VLVGP32:
577#define LOWER_LOW(NAME) \
578 case SystemZ::NAME##64: LoweredMI = lowerRILow(MI, SystemZ::NAME); break
594#define LOWER_HIGH(NAME) \
595 case SystemZ::NAME##64: LoweredMI = lowerRIHigh(MI, SystemZ::NAME); break
611 case SystemZ::Serialize:
624 case SystemZ::Trap: {
637 case SystemZ::CondTrap: {
650 case TargetOpcode::FENTRY_CALL:
654 case TargetOpcode::STACKMAP:
658 case TargetOpcode::PATCHPOINT:
662 case SystemZ::EXRL_Pseudo: {
663 unsigned TargetInsOpc =
MI->getOperand(0).getImm();
664 Register LenMinus1Reg =
MI->getOperand(1).getReg();
665 Register DestReg =
MI->getOperand(2).getReg();
666 int64_t DestDisp =
MI->getOperand(3).getImm();
668 int64_t SrcDisp =
MI->getOperand(5).getImm();
675 SystemZTargetStreamer::EXRLT2SymMap::iterator
I =
684 MCInstBuilder(SystemZ::EXRL).addReg(LenMinus1Reg).addExpr(Dot));
703 else if (NumBytes < 4) {
705 MCInstBuilder(SystemZ::BCRAsm).addImm(0).addReg(SystemZ::R0D), STI);
708 else if (NumBytes < 6) {
710 MCInstBuilder(SystemZ::BCAsm).addImm(0).addReg(0).addImm(0).addReg(0),
719 MCInstBuilder(SystemZ::BRCLAsm).addImm(0).addExpr(Dot), STI);
753 unsigned NumNOPBytes =
MI.getOperand(1).getImm();
760 assert(NumNOPBytes % 2 == 0 &&
"Invalid number of NOP bytes requested!");
763 unsigned ShadowBytes = 0;
767 while (ShadowBytes < NumNOPBytes) {
769 MII->getOpcode() == TargetOpcode::PATCHPOINT ||
770 MII->getOpcode() == TargetOpcode::STACKMAP)
772 ShadowBytes +=
TII->getInstSizeInBytes(*MII);
779 while (ShadowBytes < NumNOPBytes)
795 unsigned EncodedBytes = 0;
798 if (CalleeMO.
isImm()) {
801 unsigned ScratchIdx = -1;
802 unsigned ScratchReg = 0;
804 ScratchIdx = Opers.getNextScratchIdx(ScratchIdx + 1);
805 ScratchReg =
MI.getOperand(ScratchIdx).getReg();
806 }
while (ScratchReg == SystemZ::R0D);
811 .addImm(CallTarget & 0xFFFFFFFF));
813 if (CallTarget >> 32) {
816 .addImm(CallTarget >> 32));
821 .addReg(SystemZ::R14D)
822 .addReg(ScratchReg));
828 .addReg(SystemZ::R14D)
834 unsigned NumBytes = Opers.getNumPatchBytes();
835 assert(NumBytes >= EncodedBytes &&
836 "Patchpoint can't request size less than the length of a call.");
837 assert((NumBytes - EncodedBytes) % 2 == 0 &&
838 "Invalid number of NOP bytes requested!");
839 while (EncodedBytes < NumBytes)
847void SystemZAsmPrinter::emitAttributes(
Module &M) {
848 if (
M.getModuleFlag(
"s390x-visible-vector-ABI")) {
849 bool HasVectorFeature =
851 OutStreamer->emitGNUAttribute(8, HasVectorFeature ? 2 : 1);
903 else if (MCOp.
isImm())
929 const char *ExtraCode,
935 if (ExtraCode[0] ==
'N' && !ExtraCode[1] && MO.
isReg() &&
936 SystemZ::GR128BitRegClass.contains(MO.
getReg()))
943 MCOp =
Lower.lowerOperand(MO);
951 const char *ExtraCode,
953 if (ExtraCode && ExtraCode[0] && !ExtraCode[1]) {
954 switch (ExtraCode[0]) {
961 OS <<
MI->getOperand(OpNo + 1).getImm();
970 MI->getOperand(OpNo + 2).getReg(),
OS);
983void SystemZAsmPrinter::emitADASection() {
989 unsigned EmittedBytes = 0;
990 for (
auto &Entry : ADATable.getTable()) {
993 std::tie(
Sym, SlotKind) = Entry.first;
994 unsigned Offset = Entry.second;
995 assert(
Offset == EmittedBytes &&
"Offset not as expected");
997#define EMIT_COMMENT(Str) \
998 OutStreamer->AddComment(Twine("Offset ") \
999 .concat(utostr(Offset)) \
1000 .concat(" " Str " ") \
1001 .concat(Sym->getName()));
1017 EmittedBytes += PointerSize * 2;
1026 EmittedBytes += PointerSize;
1041 EmittedBytes += PointerSize;
1053 std::string ProductID;
1054 if (
auto *MD = M.getModuleFlag(
"zos_product_id"))
1055 ProductID = cast<MDString>(MD)->getString().str();
1056 if (ProductID.empty())
1062 if (
auto *VersionVal = mdconst::extract_or_null<ConstantInt>(
1063 M.getModuleFlag(
"zos_product_major_version")))
1064 return VersionVal->getZExtValue();
1065 return LLVM_VERSION_MAJOR;
1069 if (
auto *ReleaseVal = mdconst::extract_or_null<ConstantInt>(
1070 M.getModuleFlag(
"zos_product_minor_version")))
1071 return ReleaseVal->getZExtValue();
1072 return LLVM_VERSION_MINOR;
1076 if (
auto *PatchVal = mdconst::extract_or_null<ConstantInt>(
1077 M.getModuleFlag(
"zos_product_patchlevel")))
1078 return PatchVal->getZExtValue();
1079 return LLVM_VERSION_PATCH;
1083 std::time_t Time = 0;
1084 if (
auto *Val = mdconst::extract_or_null<ConstantInt>(
1085 M.getModuleFlag(
"zos_translation_time"))) {
1086 long SecondsSinceEpoch = Val->getSExtValue();
1087 Time =
static_cast<time_t
>(SecondsSinceEpoch);
1092void SystemZAsmPrinter::emitIDRLSection(
Module &M) {
1095 constexpr unsigned IDRLDataLength = 30;
1105 O <<
formatv(
"{0,-10}{1,0-2:d}{2,0-2:d}{3:%Y%m%d%H%M%S}{4,0-2}",
1106 ProductID.substr(0, 10).c_str(), ProductVersion, ProductRelease,
1130 CurrentFnPPA1Sym =
nullptr;
1131 CurrentFnEPMarkerSym =
nullptr;
1137 bool EHBlock,
bool HasName) {
1138 enum class PPA1Flag1 : uint8_t {
1139 DSA64Bit = (0x80 >> 0),
1140 VarArg = (0x80 >> 7),
1143 enum class PPA1Flag2 : uint8_t {
1144 ExternalProcedure = (0x80 >> 0),
1145 STACKPROTECTOR = (0x80 >> 3),
1148 enum class PPA1Flag3 : uint8_t {
1149 FPRMask = (0x80 >> 2),
1152 enum class PPA1Flag4 : uint8_t {
1153 EPMOffsetPresent = (0x80 >> 0),
1154 VRMask = (0x80 >> 2),
1155 EHBlock = (0x80 >> 3),
1156 ProcedureNamePresent = (0x80 >> 7),
1161 auto Flags1 = PPA1Flag1(0);
1162 auto Flags2 = PPA1Flag2::ExternalProcedure;
1163 auto Flags3 = PPA1Flag3(0);
1164 auto Flags4 = PPA1Flag4::EPMOffsetPresent;
1166 Flags1 |= PPA1Flag1::DSA64Bit;
1169 Flags1 |= PPA1Flag1::VarArg;
1172 Flags2 |= PPA1Flag2::STACKPROTECTOR;
1176 Flags3 |= PPA1Flag3::FPRMask;
1179 Flags4 |= PPA1Flag4::VRMask;
1182 Flags4 |= PPA1Flag4::EHBlock;
1185 Flags4 |= PPA1Flag4::ProcedureNamePresent;
1187 OutStreamer->AddComment(
"PPA1 Flags 1");
1188 if ((Flags1 & PPA1Flag1::DSA64Bit) == PPA1Flag1::DSA64Bit)
1189 OutStreamer->AddComment(
" Bit 0: 1 = 64-bit DSA");
1191 OutStreamer->AddComment(
" Bit 0: 0 = 32-bit DSA");
1192 if ((Flags1 & PPA1Flag1::VarArg) == PPA1Flag1::VarArg)
1193 OutStreamer->AddComment(
" Bit 7: 1 = Vararg function");
1194 OutStreamer->emitInt8(
static_cast<uint8_t
>(Flags1));
1196 OutStreamer->AddComment(
"PPA1 Flags 2");
1197 if ((Flags2 & PPA1Flag2::ExternalProcedure) == PPA1Flag2::ExternalProcedure)
1198 OutStreamer->AddComment(
" Bit 0: 1 = External procedure");
1199 if ((Flags2 & PPA1Flag2::STACKPROTECTOR) == PPA1Flag2::STACKPROTECTOR)
1200 OutStreamer->AddComment(
" Bit 3: 1 = STACKPROTECT is enabled");
1202 OutStreamer->AddComment(
" Bit 3: 0 = STACKPROTECT is not enabled");
1203 OutStreamer->emitInt8(
static_cast<uint8_t
>(Flags2));
1205 OutStreamer->AddComment(
"PPA1 Flags 3");
1206 if ((Flags3 & PPA1Flag3::FPRMask) == PPA1Flag3::FPRMask)
1207 OutStreamer->AddComment(
" Bit 2: 1 = FP Reg Mask is in optional area");
1208 OutStreamer->emitInt8(
1209 static_cast<uint8_t
>(Flags3));
1211 OutStreamer->AddComment(
"PPA1 Flags 4");
1212 if ((Flags4 & PPA1Flag4::VRMask) == PPA1Flag4::VRMask)
1213 OutStreamer->AddComment(
" Bit 2: 1 = Vector Reg Mask is in optional area");
1214 if ((Flags4 & PPA1Flag4::EHBlock) == PPA1Flag4::EHBlock)
1215 OutStreamer->AddComment(
" Bit 3: 1 = C++ EH block");
1216 if ((Flags4 & PPA1Flag4::ProcedureNamePresent) ==
1217 PPA1Flag4::ProcedureNamePresent)
1218 OutStreamer->AddComment(
" Bit 7: 1 = Name Length and Name");
1219 OutStreamer->emitInt8(
static_cast<uint8_t
>(
1230 OutName = OutName.
substr(0, UINT16_MAX);
1231 OutSize = UINT16_MAX;
1234 uint8_t ExtraZeros = 4 - ((2 + OutSize) % 4);
1238 OutName = OutnameConv.
str();
1240 OutStreamer->AddComment(
"Length of Name");
1241 OutStreamer->emitInt16(OutSize);
1242 OutStreamer->AddComment(
"Name of Function");
1243 OutStreamer->emitBytes(OutName);
1244 OutStreamer->emitZeros(ExtraZeros);
1247void SystemZAsmPrinter::emitPPA1(
MCSymbol *FnEndSym) {
1248 assert(PPA2Sym !=
nullptr &&
"PPA2 Symbol not defined");
1252 const auto TargetHasVector = Subtarget.hasVector();
1264 uint8_t SavedVRMask = 0;
1265 int64_t OffsetFPR = 0;
1266 int64_t OffsetVR = 0;
1267 const int64_t TopOfStack =
1274 I && E &&
I <= E; ++
I) {
1276 assert(V < 16 &&
"GPR index out of range");
1277 SavedGPRMask |= 1 << (15 -
V);
1280 for (
auto &CS : CSI) {
1281 unsigned Reg = CS.getReg();
1282 unsigned I =
TRI->getEncodingValue(Reg);
1284 if (SystemZ::FP64BitRegClass.
contains(Reg)) {
1285 assert(
I < 16 &&
"FPR index out of range");
1286 SavedFPRMask |= 1 << (15 -
I);
1288 if (Temp < OffsetFPR)
1290 }
else if (SystemZ::VR128BitRegClass.
contains(Reg)) {
1291 assert(
I >= 16 &&
I <= 23 &&
"VPR index out of range");
1292 unsigned BitNum =
I - 16;
1293 SavedVRMask |= 1 << (7 - BitNum);
1295 if (Temp < OffsetVR)
1301 OffsetFPR += (OffsetFPR < 0) ? TopOfStack : 0;
1302 OffsetVR += (OffsetVR < 0) ? TopOfStack : 0;
1305 uint8_t FrameReg =
TRI->getEncodingValue(
TRI->getFrameRegister(*
MF));
1306 uint8_t AllocaReg = ZFL->hasFP(*
MF) ? FrameReg : 0;
1307 assert(AllocaReg < 16 &&
"Can't have alloca register larger than 15");
1313 uint64_t FPRSaveAreaOffset = OffsetFPR;
1314 assert(FPRSaveAreaOffset < 0x10000000 &&
"Offset out of range");
1316 FrameAndFPROffset = FPRSaveAreaOffset & 0x0FFFFFFF;
1317 FrameAndFPROffset |= FrameReg << 28;
1322 if (TargetHasVector && SavedVRMask) {
1323 uint64_t VRSaveAreaOffset = OffsetVR;
1324 assert(VRSaveAreaOffset < 0x10000000 &&
"Offset out of range");
1326 FrameAndVROffset = VRSaveAreaOffset & 0x0FFFFFFF;
1327 FrameAndVROffset |= FrameReg << 28;
1340 OutStreamer->emitAbsoluteSymbolDiff(PPA2Sym, CurrentFnPPA1Sym, 4);
1349 TargetHasVector && SavedVRMask != 0, NeedEmitEHBlock, HasName);
1355 OutStreamer->emitAbsoluteSymbolDiff(FnEndSym, CurrentFnEPMarkerSym, 4);
1365 .
concat(utostr(FrameAndFPROffset >> 28))
1368 .
concat(utostr(FrameAndFPROffset & 0x0FFFFFFF))
1376 if (TargetHasVector && SavedVRMask) {
1383 .
concat(utostr(FrameAndVROffset >> 28))
1386 .
concat(utostr(FrameAndVROffset & 0x0FFFFFFF))
1393 if (NeedEmitEHBlock) {
1394 Per = dyn_cast<Function>(
1398 assert(PersonalityRoutine &&
"Missing personality routine");
1419 OutStreamer->emitAbsoluteSymbolDiff(CurrentFnEPMarkerSym, CurrentFnPPA1Sym,
1429void SystemZAsmPrinter::emitPPA2(
Module &M) {
1434 const char *StartSymbolName =
"CELQSTRT";
1452 ostr <<
formatv(
"{0,0-2:d}{1,0-2:d}{2,0-2:d}", ProductVersion, ProductRelease,
1456 SmallString<
sizeof(CompilationTime) - 1> CompilationTimeStr;
1462 enum class PPA2MemberId : uint8_t {
1467 enum class PPA2MemberSubId : uint8_t {
1473 LLVMBasedLang = 0xe7,
1476 enum class PPA2Flags : uint8_t {
1477 CompileForBinaryFloatingPoint = 0x80,
1478 CompiledWithXPLink = 0x01,
1479 CompiledUnitASCII = 0x04,
1480 HasServiceInfo = 0x20,
1483 PPA2MemberSubId MemberSubId = PPA2MemberSubId::LLVMBasedLang;
1484 if (
auto *MD =
M.getModuleFlag(
"zos_cu_language")) {
1487 .
Case(
"C", PPA2MemberSubId::C)
1488 .
Case(
"C++", PPA2MemberSubId::CXX)
1489 .
Case(
"Swift", PPA2MemberSubId::Swift)
1490 .
Case(
"Go", PPA2MemberSubId::Go)
1491 .
Default(PPA2MemberSubId::LLVMBasedLang);
1496 OutStreamer->emitInt8(
static_cast<uint8_t
>(PPA2MemberId::LE_C_Runtime));
1497 OutStreamer->emitInt8(
static_cast<uint8_t
>(MemberSubId));
1500 OutStreamer->emitAbsoluteSymbolDiff(CELQSTRT, PPA2Sym, 4);
1502 OutStreamer->emitAbsoluteSymbolDiff(DateVersionSym, PPA2Sym, 4);
1505 uint8_t Flgs =
static_cast<uint8_t
>(PPA2Flags::CompileForBinaryFloatingPoint);
1506 Flgs |=
static_cast<uint8_t
>(PPA2Flags::CompiledWithXPLink);
1508 if (
auto *MD =
M.getModuleFlag(
"zos_le_char_mode")) {
1509 const StringRef &CharMode = cast<MDString>(MD)->getString();
1510 if (CharMode ==
"ascii") {
1511 Flgs |=
static_cast<uint8_t
>(
1512 PPA2Flags::CompiledUnitASCII);
1513 }
else if (CharMode !=
"ebcdic") {
1515 "Only ascii or ebcdic are valid values for zos_le_char_mode "
1540 OutStreamer->emitAbsoluteSymbolDiff(PPA2Sym, CELQSTRT, 8);
1547 if (Subtarget.getTargetTriple().isOSzOS()) {
1555 CurrentFnEPMarkerSym =
1574 uint32_t DSAAndFlags = DSASize & 0xFFFFFFE0;
1575 DSAAndFlags |= Flags;
1578 OutStreamer->AddComment(
"XPLINK Routine Layout Entry");
1580 OutStreamer->AddComment(
"Eyecatcher 0x00C300C500C500");
1581 OutStreamer->emitIntValueInHex(0x00C300C500C500, 7);
1585 OutStreamer->emitAbsoluteSymbolDiff(CurrentFnPPA1Sym, CurrentFnEPMarkerSym,
1591 OutStreamer->AddComment(
" Bit 1: 1 = Leaf function");
1593 OutStreamer->AddComment(
" Bit 1: 0 = Non-leaf function");
1595 OutStreamer->AddComment(
" Bit 2: 1 = Uses alloca");
1597 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
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,...