57 std::unique_ptr<PerTargetMIParsingState> Target;
61 bool NoLLVMIR =
false;
64 bool NoMIRDocuments =
false;
66 std::function<void(
Function &)> ProcessIRFunction;
71 std::function<
void(
Function &)> ProcessIRFunction);
95 std::unique_ptr<Module>
136 const std::vector<yaml::SaveRestorePointEntry> &YamlSRPoints,
140 std::vector<CalleeSavedInfo> &CSIInfo,
142 bool IsRestored,
int FrameIdx);
154 template <
typename T>
206 reinterpret_cast<MIRParserImpl *
>(Context)->reportDiagnostic(Diag);
211 std::function<
void(
Function &)> Callback)
213 In(SM.getMemoryBuffer(SM.AddNewSourceBuffer(
std::
move(Contents),
SMLoc()))
216 Filename(Filename), ProcessIRFunction(Callback) {
257std::unique_ptr<Module>
259 if (!In.setCurrentDocument()) {
263 NoMIRDocuments =
true;
264 auto M = std::make_unique<Module>(Filename, Context);
265 if (
auto LayoutOverride = DataLayoutCallback(M->getTargetTriple().str(),
266 M->getDataLayoutStr()))
267 M->setDataLayout(*LayoutOverride);
271 std::unique_ptr<Module> M;
274 if (
const auto *BSN =
278 Context, &IRSlots, DataLayoutCallback);
284 if (!In.setCurrentDocument())
285 NoMIRDocuments =
true;
288 M = std::make_unique<Module>(Filename, Context);
289 if (
auto LayoutOverride = DataLayoutCallback(M->getTargetTriple().str(),
290 M->getDataLayoutStr()))
291 M->setDataLayout(*LayoutOverride);
303 auto FirstUnvisitedFunction = M.begin();
308 }
while (In.setCurrentDocument());
321 if (ProcessIRFunction)
322 ProcessIRFunction(*
F);
330 for (; FirstUnvisitedFunction != M.end(); ++FirstUnvisitedFunction)
331 if (!FirstUnvisitedFunction->hasName())
332 return &*FirstUnvisitedFunction++;
354 Function *
F = M.getFunction(FunctionName);
358 }
else if (!FunctionName.
empty() ||
360 return error(
Twine(
"function '") + FunctionName +
361 "' isn't defined in the provided LLVM IR");
367 return error(
Twine(
"redefinition of machine function '") + FunctionName +
378 return error(
Twine(
"redefinition of machine function '") + FunctionName +
405bool MIRParserImpl::computeFunctionProperties(
410 bool HasInlineAsm =
false;
411 bool HasFakeUses =
false;
412 bool AllTiedOpsRewritten =
true, HasTiedOps =
false;
413 for (
const MachineBasicBlock &
MBB : MF) {
414 for (
const MachineInstr &
MI :
MBB) {
417 if (
MI.isInlineAsm())
421 for (
unsigned I = 0;
I <
MI.getNumOperands(); ++
I) {
422 const MachineOperand &MO =
MI.getOperand(
I);
426 if (MO.
isUse() &&
MI.isRegTiedToDefOperand(
I, &DefIdx)) {
428 if (MO.
getReg() !=
MI.getOperand(DefIdx).getReg())
429 AllTiedOpsRewritten =
false;
437 auto ComputedPropertyHelper =
438 [&Properties](std::optional<bool> ExplicitProp,
bool ComputedProp,
441 if (ExplicitProp.value_or(ComputedProp))
447 return ExplicitProp && *ExplicitProp && !ComputedProp;
450 if (ComputedPropertyHelper(YamlMF.
NoPHIs, !HasPHI,
452 return error(MF.getName() +
453 " has explicit property NoPhi, but contains at least one PHI");
456 MF.setHasInlineAsm(HasInlineAsm);
458 if (HasTiedOps && AllTiedOpsRewritten)
459 Properties.setTiedOpsRewritten();
461 if (ComputedPropertyHelper(YamlMF.
IsSSA,
isSSA(MF),
463 return error(MF.getName() +
464 " has explicit property IsSSA, but is not valid SSA");
467 const MachineRegisterInfo &MRI = MF.getRegInfo();
472 " has explicit property NoVRegs, but contains virtual registers");
482 " has explicit property hasFakeUses=false, but contains fake uses");
483 MF.setHasFakeUses(YamlMF.
HasFakeUses.value_or(HasFakeUses));
493 Twine(
" instruction block out of range.") +
494 " Unable to reference bb:" + Twine(MILoc.
BlockNum));
497 if (MILoc.
Offset >= BB->size())
499 Twine(MF.
getName()) + Twine(
" instruction offset out of range.") +
500 " Unable to reference instruction at bb: " + Twine(MILoc.
BlockNum) +
501 " at offset:" + Twine(MILoc.
Offset));
502 MI = &*std::next(BB->instr_begin(), MILoc.
Offset);
514 if (parseMachineInst(MF, MILoc, CallI))
518 Twine(
" call site info should reference call "
519 "instruction. Instruction at bb:") +
521 " is not a call instruction");
523 for (
auto ArgRegPair : YamlCSInfo.ArgForwardingRegs) {
526 return error(
Error, ArgRegPair.Reg.SourceRange);
527 CSInfo.
ArgRegPairs.emplace_back(Reg, ArgRegPair.ArgNo);
529 if (!YamlCSInfo.CalleeTypeIds.empty()) {
530 for (
auto CalleeTypeId : YamlCSInfo.CalleeTypeIds) {
532 CSInfo.
CalleeTypeIds.push_back(ConstantInt::get(Int64Ty, CalleeTypeId,
543 return error(
"call site info provided but not used");
547void MIRParserImpl::setupDebugValueTracking(
551 unsigned MaxInstrNum = 0;
554 MaxInstrNum = std::max(
MI.peekDebugInstrNum(), MaxInstrNum);
555 MF.setDebugInstrNumberingCount(MaxInstrNum);
559 MF.makeDebugValueSubstitution({
Sub.SrcInst,
Sub.SrcOp},
591 Props.setLegalized();
593 Props.setRegBankSelected();
597 Props.setFailedISel();
599 Props.setFailsVerification();
601 Props.setTracksDebugUserValues();
684 if (computeFunctionProperties(MF, YamlMF))
696 setupDebugValueTracking(MF, PFS, YamlMF);
713 Targets[Target.BBID].push_back(Target.CallsiteIndex);
723 assert(RegInfo.tracksLiveness());
725 RegInfo.invalidateLiveness();
732 return error(VReg.ID.SourceRange.Start,
733 Twine(
"redefinition of virtual register '%") +
734 Twine(VReg.ID.Value) +
"'");
735 Info.Explicit =
true;
737 if (VReg.Class.Value ==
"_") {
739 Info.D.RegBank =
nullptr;
741 const auto *RC = Target->getRegClass(VReg.Class.Value);
746 const RegisterBank *RegBank = Target->getRegBank(VReg.Class.Value);
749 VReg.Class.SourceRange.Start,
750 Twine(
"use of undefined register class or register bank '") +
751 VReg.Class.Value +
"'");
753 Info.D.RegBank = RegBank;
757 if (!VReg.PreferredRegister.Value.empty()) {
759 return error(VReg.Class.SourceRange.Start,
760 Twine(
"preferred register can only be set for normal vregs"));
763 VReg.PreferredRegister.Value,
Error))
764 return error(
Error, VReg.PreferredRegister.SourceRange);
767 for (
const auto &FlagStringValue : VReg.RegisterFlags) {
769 if (Target->getVRegFlagValue(FlagStringValue.Value, FlagValue))
770 return error(FlagStringValue.SourceRange.Start,
771 Twine(
"use of undefined register flag '") +
772 FlagStringValue.Value +
"'");
773 Info.Flags |= FlagValue;
775 RegInfo.noteNewVirtualRegister(Info.VReg);
779 for (
const auto &LiveIn : YamlMF.
LiveIns) {
782 return error(
Error, LiveIn.Register.SourceRange);
784 if (!LiveIn.VirtualRegister.Value.empty()) {
788 return error(
Error, LiveIn.VirtualRegister.SourceRange);
791 RegInfo.addLiveIn(Reg, VReg);
802 CalleeSavedRegisters.
push_back(Reg.id());
804 RegInfo.setCalleeSavedRegs(CalleeSavedRegisters);
819 auto populateVRegInfo = [&](
const VRegInfo &Info,
const Twine &Name) {
824 (
Twine(
"Cannot determine class/bank of virtual register ") + Name +
825 " in function '" + MF.
getName() +
"'")
829 if (!Info.D.RC->isAllocatable()) {
831 TRI->getRegClassName(Info.D.RC) +
832 "' for virtual register " + Name +
" in function '" +
839 if (Info.PreferredReg != 0)
852 populateVRegInfo(Info,
Twine(
P.first()));
857 populateVRegInfo(Info,
Twine(
P.first.id()));
864 if (
auto *RegMask =
TRI->getCustomEHPadPreservedMask(MF))
881 for (
auto &E : Errors)
921 std::vector<CalleeSavedInfo> CSIInfo;
927 Object.IsImmutable, Object.IsAliased);
932 return error(Object.ID.SourceRange.Start,
933 Twine(
"StackID is not supported by target"));
939 return error(Object.ID.SourceRange.Start,
940 Twine(
"redefinition of fixed stack object '%fixed-stack.") +
941 Twine(Object.ID.Value) +
"'");
943 Object.CalleeSavedRestored, ObjectIdx))
954 return error(
Error, Object.EntryValueRegister.SourceRange);
955 if (!Reg.isPhysical())
956 return error(Object.EntryValueRegister.SourceRange.Start,
957 "Expected physical register for entry value field");
959 PFS, Object.DebugVar, Object.DebugExpr, Object.DebugLoc);
962 if (MaybeInfo->DIVar || MaybeInfo->DIExpr || MaybeInfo->DILoc)
964 Reg.asMCReg(), MaybeInfo->DILoc);
972 if (!Name.Value.empty()) {
974 F.getValueSymbolTable()->lookup(Name.Value));
976 return error(Name.SourceRange.Start,
977 "alloca instruction named '" + Name.Value +
978 "' isn't defined in the function '" +
F.getName() +
982 return error(Object.ID.SourceRange.Start,
983 Twine(
"StackID is not supported by target"));
989 Object.Size, Object.Alignment.valueOrOne(),
996 return error(Object.ID.SourceRange.Start,
997 Twine(
"redefinition of stack object '%stack.") +
998 Twine(Object.ID.Value) +
"'");
1000 Object.CalleeSavedRestored, ObjectIdx))
1002 if (Object.LocalOffset)
1008 if (!CSIInfo.empty())
1033 std::vector<CalleeSavedInfo> &CSIInfo,
1035 if (RegisterSource.
Value.empty())
1043 CSIInfo.push_back(CSI);
1048template <
typename T>
1056 return Parser.
error(Source.SourceRange.Start,
1057 "expected a reference to a '" + TypeString +
1068 if (parseMDNode(PFS, Var, VarStr) || parseMDNode(PFS, Expr, ExprStr) ||
1069 parseMDNode(PFS,
Loc, LocStr))
1070 return std::nullopt;
1077 return std::nullopt;
1081template <
typename T>
1083 const T &Object,
int FrameIdx) {
1084 std::optional<VarExprLoc> MaybeInfo =
1085 parseVarExprLoc(PFS, Object.DebugVar, Object.DebugExpr, Object.DebugLoc);
1090 if (MaybeInfo->DIVar || MaybeInfo->DIExpr || MaybeInfo->DILoc)
1098 if (Source.Value.empty())
1112 for (
const auto &YamlConstant : YamlMF.
Constants) {
1113 if (YamlConstant.IsTargetSpecific)
1115 return error(YamlConstant.Value.SourceRange.Start,
1116 "Can't parse target-specific constant pool entries yet");
1120 return error(
Error, YamlConstant.Value.SourceRange);
1121 const Align PrefTypeAlign =
1123 const Align Alignment = YamlConstant.Alignment.value_or(PrefTypeAlign);
1125 if (!ConstantPoolSlots.
insert(std::make_pair(YamlConstant.ID.Value, Index))
1127 return error(YamlConstant.ID.SourceRange.Start,
1128 Twine(
"redefinition of constant pool item '%const.") +
1129 Twine(YamlConstant.ID.Value) +
"'");
1137 const std::vector<yaml::SaveRestorePointEntry> &YamlSRPoints,
1142 if (parseMBBReference(PFS,
MBB, Entry.Point.Value))
1146 for (
auto &RegStr : Entry.Registers) {
1160 for (
const auto &Entry : YamlJTI.
Entries) {
1161 std::vector<MachineBasicBlock *> Blocks;
1162 for (
const auto &MBBSource : Entry.Blocks) {
1164 if (parseMBBReference(PFS,
MBB, MBBSource.Value))
1166 Blocks.push_back(
MBB);
1171 return error(Entry.ID.SourceRange.Start,
1172 Twine(
"redefinition of jump table entry '%jump-table.") +
1173 Twine(Entry.ID.Value) +
"'");
1199 if (parseMachineMetadata(PFS, MDS))
1205 "use of undefined metadata '!" +
1217 if (parseMachineInst(MF, MILoc, CallI))
1221 Twine(
" called global should reference call "
1222 "instruction. Instruction at bb:") +
1224 " is not a call instruction");
1227 F.getParent()->getValueSymbolTable().lookup(YamlCG.Callee.Value);
1229 return error(YamlCG.Callee.SourceRange.Start,
1230 "use of undefined global '" + YamlCG.Callee.Value +
"'");
1232 return error(YamlCG.Callee.SourceRange.Start,
1233 "use of non-global value '" + YamlCG.Callee.Value +
"'");
1246 *
Loc.getPointer() ==
'\'';
1249 Loc =
Loc.getFromPointer(
Loc.getPointer() +
Error.getColumnNo() +
1250 (HasQuote ? 1 : 0));
1263 auto LineAndColumn =
SM.getLineAndColumn(SourceRange.
Start);
1264 unsigned Line = LineAndColumn.first +
Error.getLineNo() - 1;
1265 unsigned Column =
Error.getColumnNo();
1273 if (L.line_number() == Line) {
1276 auto Indent = LineStr.
find(
Error.getLineContents());
1283 return SMDiagnostic(SM, Loc, Filename, Line, Column,
Error.getKind(),
1284 Error.getMessage(), LineStr,
Error.getRanges(),
1293std::unique_ptr<Module>
1295 return Impl->parseIRModule(DataLayoutCallback);
1299 return Impl->parseMachineFunctions(M, MMI);
1304 return Impl->parseMachineFunctions(M, MMI, &
MAM);
1309 std::function<
void(
Function &)> ProcessIRFunction) {
1311 if (std::error_code EC = FileOrErr.getError()) {
1313 "could not open input file: " + EC.message());
1320std::unique_ptr<MIRParser>
1323 std::function<
void(
Function &)> ProcessIRFunction) {
1324 auto Filename = Contents->getBufferIdentifier();
1325 if (Context.shouldDiscardValueNames()) {
1330 "cannot read MIR with a Context that discards named Values")));
1333 return std::make_unique<MIRParser>(std::make_unique<MIRParserImpl>(
1334 std::move(Contents),
Filename, Context, ProcessIRFunction));
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file defines the DenseMap class.
Module.h This file contains the declarations for the Module class.
static bool isSSA(const MachineFunction &MF)
static void handleYAMLDiag(const SMDiagnostic &Diag, void *Context)
static bool typecheckMDNode(T *&Result, MDNode *Node, const yaml::StringValue &Source, StringRef TypeString, MIRParserImpl &Parser)
Verify that given node is of a certain type. Return true on error.
static Function * getNextUnusedUnnamedFunction(const Module &M, Module::iterator &FirstUnvisitedFunction)
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
Register const TargetRegisterInfo * TRI
static constexpr unsigned SM(unsigned Version)
static constexpr StringLiteral Filename
FunctionAnalysisManager FAM
ModuleAnalysisManager MAM
SI Pre allocate WWM Registers
an instruction to allocate memory on the stack
LLVM Basic Block Representation.
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
The CalleeSavedInfo class tracks the information need to locate where a callee saved register is in t...
This is an important base class in LLVM.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Diagnostic information for machine IR parser.
Lightweight error class with error context and mandatory checking.
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Module * getParent()
Get the module that this global value is contained inside of...
@ ExternalLinkage
Externally visible function.
Class to represent integer types.
This is an important class for using LLVM in a threaded context.
This class implements the parsing of LLVM IR that's embedded inside a MIR file.
bool error(const Twine &Message)
Report an error with the given message at unknown location.
void reportDiagnostic(const SMDiagnostic &Diag)
bool setupRegisterInfo(const PerFunctionMIParsingState &PFS, const yaml::MachineFunction &YamlMF)
bool parseRegisterInfo(PerFunctionMIParsingState &PFS, const yaml::MachineFunction &YamlMF)
bool initializeFrameInfo(PerFunctionMIParsingState &PFS, const yaml::MachineFunction &YamlMF)
bool parseMachineFunction(Module &M, MachineModuleInfo &MMI, ModuleAnalysisManager *FAM, Module::iterator &FirstUnvisitedFunction)
Parse the machine function in the current YAML document.
Function * createDummyFunction(StringRef Name, Module &M)
Create an empty function with the given name.
bool parseStackObjectsDebugInfo(PerFunctionMIParsingState &PFS, const T &Object, int FrameIdx)
bool initializeMachineFunction(const yaml::MachineFunction &YamlMF, MachineFunction &MF)
Initialize the machine function to the state that's described in the MIR file.
std::unique_ptr< Module > parseIRModule(DataLayoutCallbackTy DataLayoutCallback)
Try to parse the optional LLVM module and the machine functions in the MIR file.
bool initializePrefetchTargets(PerFunctionMIParsingState &PFS, const yaml::MachineFunction &YamlMF)
bool initializeJumpTableInfo(PerFunctionMIParsingState &PFS, const yaml::MachineJumpTable &YamlJTI)
bool initializeConstantPool(PerFunctionMIParsingState &PFS, MachineConstantPool &ConstantPool, const yaml::MachineFunction &YamlMF)
MIRParserImpl(std::unique_ptr< MemoryBuffer > Contents, StringRef Filename, LLVMContext &Context, std::function< void(Function &)> ProcessIRFunction)
std::optional< VarExprLoc > parseVarExprLoc(PerFunctionMIParsingState &PFS, const yaml::StringValue &VarStr, const yaml::StringValue &ExprStr, const yaml::StringValue &LocStr)
bool parseCalledGlobals(PerFunctionMIParsingState &PFS, MachineFunction &MF, const yaml::MachineFunction &YMF)
bool parseCalleeSavedRegister(PerFunctionMIParsingState &PFS, std::vector< CalleeSavedInfo > &CSIInfo, const yaml::StringValue &RegisterSource, bool IsRestored, int FrameIdx)
bool parseMachineMetadataNodes(PerFunctionMIParsingState &PFS, MachineFunction &MF, const yaml::MachineFunction &YMF)
bool initializeCallSiteInfo(PerFunctionMIParsingState &PFS, const yaml::MachineFunction &YamlMF)
bool initializeSaveRestorePoints(PerFunctionMIParsingState &PFS, const std::vector< yaml::SaveRestorePointEntry > &YamlSRPoints, llvm::SaveRestorePoints &SaveRestorePoints)
bool parseMachineFunctions(Module &M, MachineModuleInfo &MMI, ModuleAnalysisManager *FAM=nullptr)
LLVM_ABI MIRParser(std::unique_ptr< MIRParserImpl > Impl)
LLVM_ABI std::unique_ptr< Module > parseIRModule(DataLayoutCallbackTy DataLayoutCallback=[](StringRef, StringRef) { return std::nullopt;})
Parses the optional LLVM IR module in the MIR file.
LLVM_ABI bool parseMachineFunctions(Module &M, MachineModuleInfo &MMI)
Parses MachineFunctions in the MIR file and add them to the given MachineModuleInfo MMI.
The MachineConstantPool class keeps track of constants referenced by a function which must be spilled...
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
void setMaxCallFrameSize(uint64_t S)
LLVM_ABI int CreateFixedObject(uint64_t Size, int64_t SPOffset, bool IsImmutable, bool isAliased=false)
Create a new object at a fixed location on the stack.
void setAdjustsStack(bool V)
LLVM_ABI int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
LLVM_ABI void ensureMaxAlignment(Align Alignment)
Make sure the function is at least Align bytes aligned.
void setHasPatchPoint(bool s=true)
void setLocalFrameSize(int64_t sz)
Set the size of the local object blob.
void setObjectOffset(int ObjectIdx, int64_t SPOffset)
Set the stack frame offset of the specified object.
void setFrameAddressIsTaken(bool T)
void setHasStackMap(bool s=true)
void setSavePoints(SaveRestorePoints NewSavePoints)
void setCVBytesOfCalleeSavedRegisters(unsigned S)
void setStackID(int ObjectIdx, uint8_t ID)
void setHasTailCall(bool V=true)
void setStackProtectorIndex(int I)
void setCalleeSavedInfoValid(bool v)
void setReturnAddressIsTaken(bool s)
void mapLocalFrameObject(int ObjectIndex, int64_t Offset)
Map a frame index into the local object block.
void setHasOpaqueSPAdjustment(bool B)
void setCalleeSavedInfo(std::vector< CalleeSavedInfo > CSI)
Used by prolog/epilog inserter to set the function's callee saved information.
LLVM_ABI int CreateVariableSizedObject(Align Alignment, const AllocaInst *Alloca)
Notify the MachineFrameInfo object that a variable sized object has been created.
void setRestorePoints(SaveRestorePoints NewRestorePoints)
LLVM_ABI int CreateFixedSpillStackObject(uint64_t Size, int64_t SPOffset, bool IsImmutable=false)
Create a spill slot at a fixed location on the stack.
void setStackSize(uint64_t Size)
Set the size of the stack.
void setHasVAStart(bool B)
void setHasMustTailInVarArgFunc(bool B)
void setObjectAlignment(int ObjectIdx, Align Alignment)
setObjectAlignment - Change the alignment of the specified stack object.
void setOffsetAdjustment(int64_t Adj)
Set the correction for frame offsets.
void setFunctionContextIndex(int I)
This analysis create MachineFunction for given Function.
Properties which a MachineFunction may have at a given point in time.
MachineFunctionProperties & set(Property P)
MachineFunctionProperties & reset(Property P)
void setCallsUnwindInit(bool b)
void setHasEHFunclets(bool V)
void setExposesReturnsTwice(bool B)
setCallsSetJmp - Set a flag that indicates if there's a call to a "returns twice" function.
void setHasWinCFI(bool v)
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineJumpTableInfo * getOrCreateJumpTableInfo(unsigned JTEntryKind)
getOrCreateJumpTableInfo - Get the JumpTableInfo for this function, if it does already exist,...
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
void setCallsEHReturn(bool b)
void setAlignment(Align A)
setAlignment - Set the alignment of the function.
void setPrefetchTargets(const DenseMap< UniqueBBID, SmallVector< unsigned > > &V)
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
bool hasBBSections() const
Returns true if this function has basic block sections enabled.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
bool verify(Pass *p=nullptr, const char *Banner=nullptr, raw_ostream *OS=nullptr, bool AbortOnError=true) const
Run the current MachineFunction through the machine code verifier, useful for debugger use.
Function & getFunction()
Return the LLVM function that this machine code represents.
void setIsOutlined(bool V)
MachineConstantPool * getConstantPool()
getConstantPool - Return the constant pool object for the current function.
void addCallSiteInfo(const MachineInstr *CallI, CallSiteInfo &&CallInfo)
Start tracking the arguments passed to the call CallI.
const MachineFunctionProperties & getProperties() const
Get the function properties.
void setVariableDbgInfo(const DILocalVariable *Var, const DIExpression *Expr, int Slot, const DILocation *Loc)
Collect information used to emit debugging information of a variable in a stack slot.
void setHasEHScopes(bool V)
void setHasEHContTarget(bool V)
void addCalledGlobal(const MachineInstr *MI, CalledGlobalInfo Details)
Notes the global and target flags for a call site.
void assignBeginEndSections()
Assign IsBeginSection IsEndSection fields for basic blocks in this function.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
Representation of each machine instruction.
bool isCall(QueryType Type=AnyInBundle) const
LLVM_ABI unsigned createJumpTableIndex(const std::vector< MachineBasicBlock * > &DestBBs)
createJumpTableIndex - Create a new jump table.
An analysis that produces MachineModuleInfo for a module.
This class contains meta information specific to a module.
LLVM_ABI MachineFunction & getOrCreateMachineFunction(Function &F)
Returns the MachineFunction constructed for the IR function F.
const TargetMachine & getTarget() const
LLVM_ABI MachineFunction * getMachineFunction(const Function &F) const
Returns the MachineFunction associated to IR function F if there is one, otherwise nullptr.
MachineOperand class - Representation of each machine instruction operand.
unsigned getSubReg() const
bool isReg() const
isReg - Tests if this is a MO_Register operand.
bool isRegMask() const
isRegMask - Tests if this is a MO_RegisterMask operand.
Register getReg() const
getReg - Returns the register number.
const uint32_t * getRegMask() const
getRegMask - Returns a bit mask of registers preserved by this RegMask operand.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
LLVM_ABI void freezeReservedRegs()
freezeReservedRegs - Called by the register allocator to freeze the set of reserved registers before ...
MachineOperand * getOneDef(Register Reg) const
Returns the defining operand if there is exactly one operand defining the specified register,...
bool def_empty(Register RegNo) const
def_empty - Return true if there are no instructions defining the specified register (it may be live-...
LLVM_ABI void setRegBank(Register Reg, const RegisterBank &RegBank)
Set the register bank to RegBank for Reg.
bool hasOneDef(Register RegNo) const
Return true if there is exactly one operand defining the specified register.
LLVM_ABI void setRegClass(Register Reg, const TargetRegisterClass *RC)
setRegClass - Set the register class of the specified virtual register.
void setSimpleHint(Register VReg, Register PrefReg)
Specify the preferred (target independent) register allocation hint for the specified virtual registe...
void addPhysRegsUsedFromRegMask(const uint32_t *RegMask)
addPhysRegsUsedFromRegMask - Mark any registers not in RegMask as used.
unsigned getNumVirtRegs() const
getNumVirtRegs - Return the number of virtual registers created.
static std::unique_ptr< MemoryBuffer > getMemBuffer(StringRef InputData, StringRef BufferName="", bool RequiresNullTerminator=true)
Open the specified memory range as a MemoryBuffer.
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFileOrSTDIN(const Twine &Filename, bool IsText=false, bool RequiresNullTerminator=true, std::optional< Align > Alignment=std::nullopt)
Open the specified file as a MemoryBuffer, or open stdin if the Filename is "-".
A Module instance is used to store all the information related to an LLVM module.
FunctionListType::iterator iterator
The Function iterators.
This class implements the register bank concept.
Wrapper class representing virtual and physical registers.
static Register index2VirtReg(unsigned Index)
Convert a 0-based index to a virtual register number.
Instances of this class encapsulate one diagnostic report, allowing printing to a raw_ostream as a ca...
SourceMgr::DiagKind getKind() const
Represents a location in source code.
static SMLoc getFromPointer(const char *Ptr)
constexpr const char * getPointer() const
Represents a range in source code.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
This owns the files read by a parser, handles include stacks, and handles diagnostic wrangling.
unsigned AddNewSourceBuffer(std::unique_ptr< MemoryBuffer > F, SMLoc IncludeLoc)
Add a new source buffer to this source manager.
StringRef - Represent a constant reference to a string, i.e.
static constexpr size_t npos
constexpr bool empty() const
empty - Check if the string is empty.
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
size_t find(char C, size_t From=0) const
Search for the first character C in the string.
Information about stack frame layout on the target.
virtual bool isSupportedStackID(TargetStackID::Value ID) const
Primary interface to the complete machine description for the target machine.
virtual yaml::MachineFunctionInfo * createDefaultFuncInfoYAML() const
Allocate and return a default initialized instance of the YAML representation for the MachineFunction...
virtual bool parseMachineFunctionInfo(const yaml::MachineFunctionInfo &, PerFunctionMIParsingState &PFS, SMDiagnostic &Error, SMRange &SourceRange) const
Parse out the target's MachineFunctionInfo from the YAML reprsentation.
unsigned EmitCallSiteInfo
The flag enables call site info production.
unsigned EmitCallGraphSection
Emit section containing call graph metadata.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual void mirFileLoaded(MachineFunction &MF) const
This is called after a .mir file was loaded.
virtual const TargetFrameLowering * getFrameLowering() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
LLVM_ABI std::string str() const
Return the twine contents as a std::string.
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
This function has undefined behavior.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
A forward iterator which reads text lines from a buffer.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
std::enable_if_t< has_ScalarEnumerationTraits< T >::value, void > yamlize(IO &io, T &Val, bool, EmptyContext &Ctx)
This is an optimization pass for GlobalISel generic memory operations.
bool parseStackObjectReference(PerFunctionMIParsingState &PFS, int &FI, StringRef Src, SMDiagnostic &Error)
bool parseMDNode(PerFunctionMIParsingState &PFS, MDNode *&Node, StringRef Src, SMDiagnostic &Error)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI std::unique_ptr< Module > parseAssembly(MemoryBufferRef F, SMDiagnostic &Err, LLVMContext &Context, SlotMapping *Slots=nullptr, DataLayoutCallbackTy DataLayoutCallback=[](StringRef, StringRef) { return std::nullopt;}, AsmParserContext *ParserContext=nullptr)
parseAssemblyFile and parseAssemblyString are wrappers around this function.
InnerAnalysisManagerProxy< FunctionAnalysisManager, Module > FunctionAnalysisManagerModuleProxy
Provide the FunctionAnalysisManager to Module proxy.
bool parseMachineBasicBlockDefinitions(PerFunctionMIParsingState &PFS, StringRef Src, SMDiagnostic &Error)
Parse the machine basic block definitions, and skip the machine instructions.
bool parsePrefetchTarget(PerFunctionMIParsingState &PFS, CallsiteID &Target, StringRef Src, SMDiagnostic &Error)
bool parseMBBReference(PerFunctionMIParsingState &PFS, MachineBasicBlock *&MBB, StringRef Src, SMDiagnostic &Error)
auto dyn_cast_or_null(const Y &Val)
DenseMap< MachineBasicBlock *, std::vector< CalleeSavedInfo > > SaveRestorePoints
void sort(IteratorTy Start, IteratorTy End)
LLVM_ABI std::unique_ptr< MIRParser > createMIRParserFromFile(StringRef Filename, SMDiagnostic &Error, LLVMContext &Context, std::function< void(Function &)> ProcessIRFunction=nullptr)
This function is the main interface to the MIR serialization format parser.
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
LLVM_ABI std::unique_ptr< MIRParser > createMIRParser(std::unique_ptr< MemoryBuffer > Contents, LLVMContext &Context, std::function< void(Function &)> ProcessIRFunction=nullptr)
This function is another interface to the MIR serialization format parser.
llvm::function_ref< std::optional< std::string >(StringRef, StringRef)> DataLayoutCallbackTy
@ Sub
Subtraction of integers.
bool parseMachineInstructions(PerFunctionMIParsingState &PFS, StringRef Src, SMDiagnostic &Error)
Parse the machine instructions.
bool parseRegisterReference(PerFunctionMIParsingState &PFS, Register &Reg, StringRef Src, SMDiagnostic &Error)
LLVM_ABI Constant * parseConstantValue(StringRef Asm, SMDiagnostic &Err, const Module &M, const SlotMapping *Slots=nullptr)
Parse a type and a constant value in the given string.
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
DiagnosticSeverity
Defines the different supported severity of a diagnostic.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
bool parseMachineMetadata(PerFunctionMIParsingState &PFS, StringRef Src, SMRange SourceRange, SMDiagnostic &Error)
bool parseVirtualRegisterReference(PerFunctionMIParsingState &PFS, VRegInfo *&Info, StringRef Src, SMDiagnostic &Error)
bool parseNamedRegisterReference(PerFunctionMIParsingState &PFS, Register &Reg, StringRef Src, SMDiagnostic &Error)
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
Implement std::hash so that hash_code can be used in STL containers.
This struct is a compact representation of a valid (non-zero power of two) alignment.
SmallVector< ConstantInt *, 4 > CalleeTypeIds
Callee type ids.
SmallVector< ArgRegPair, 1 > ArgRegPairs
Vector of call argument and its forwarding register.
Align valueOrOne() const
For convenience, returns a valid alignment or 1 if undefined.
DenseMap< unsigned, unsigned > JumpTableSlots
VRegInfo & getVRegInfo(Register Num)
DenseMap< unsigned, int > FixedStackObjectSlots
DenseMap< unsigned, unsigned > ConstantPoolSlots
StringMap< VRegInfo * > VRegInfosNamed
DenseMap< unsigned, int > StackObjectSlots
std::map< unsigned, std::pair< TempMDTuple, SMLoc > > MachineForwardRefMDNodes
DenseMap< Register, VRegInfo * > VRegInfos
This struct contains the mappings from the slot numbers to unnamed metadata nodes,...
Serializable representation of MachineFrameInfo.
std::vector< SaveRestorePointEntry > RestorePoints
bool IsCalleeSavedInfoValid
unsigned MaxCallFrameSize
~0u means: not computed yet.
StringValue StackProtector
std::vector< SaveRestorePointEntry > SavePoints
bool HasMustTailInVarArgFunc
unsigned CVBytesOfCalleeSavedRegisters
bool HasOpaqueSPAdjustment
bool IsReturnAddressTaken
StringValue FunctionContext
std::vector< MachineStackObject > StackObjects
std::vector< StringValue > MachineMetadataNodes
std::optional< std::vector< FlowStringValue > > CalleeSavedRegisters
std::vector< CalledGlobal > CalledGlobals
std::optional< bool > HasFakeUses
std::vector< EntryValueObject > EntryValueObjects
std::optional< bool > NoPHIs
std::vector< FlowStringValue > PrefetchTargets
bool TracksDebugUserValues
std::vector< MachineConstantPoolValue > Constants
std::optional< bool > NoVRegs
std::vector< CallSiteInfo > CallSitesInfo
std::vector< MachineFunctionLiveIn > LiveIns
std::vector< VirtualRegisterDefinition > VirtualRegisters
std::vector< FixedMachineStackObject > FixedStackObjects
std::optional< bool > IsSSA
std::vector< DebugValueSubstitution > DebugValueSubstitutions
std::unique_ptr< MachineFunctionInfo > MachineFuncInfo
Constant pool.
MachineJumpTable JumpTableInfo
MachineFrameInfo FrameInfo
Identifies call instruction location in machine function.
std::vector< Entry > Entries
MachineJumpTableInfo::JTEntryKind Kind
A wrapper around std::string which contains a source range that's being set during parsing.