aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/CodeGen/MIRParser/MIRParser.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2023-04-14 21:41:27 +0000
committerDimitry Andric <dim@FreeBSD.org>2023-06-22 18:20:56 +0000
commitbdd1243df58e60e85101c09001d9812a789b6bc4 (patch)
treea1ce621c7301dd47ba2ddc3b8eaa63b441389481 /contrib/llvm-project/llvm/lib/CodeGen/MIRParser/MIRParser.cpp
parent781624ca2d054430052c828ba8d2c2eaf2d733e7 (diff)
parente3b557809604d036af6e00c60f012c2025b59a5e (diff)
Diffstat (limited to 'contrib/llvm-project/llvm/lib/CodeGen/MIRParser/MIRParser.cpp')
-rw-r--r--contrib/llvm-project/llvm/lib/CodeGen/MIRParser/MIRParser.cpp24
1 files changed, 19 insertions, 5 deletions
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/MIRParser/MIRParser.cpp b/contrib/llvm-project/llvm/lib/CodeGen/MIRParser/MIRParser.cpp
index aa9522bc3459..a20c2bfe6c0f 100644
--- a/contrib/llvm-project/llvm/lib/CodeGen/MIRParser/MIRParser.cpp
+++ b/contrib/llvm-project/llvm/lib/CodeGen/MIRParser/MIRParser.cpp
@@ -234,7 +234,8 @@ MIRParserImpl::parseIRModule(DataLayoutCallbackTy DataLayoutCallback) {
// Create an empty module when the MIR file is empty.
NoMIRDocuments = true;
auto M = std::make_unique<Module>(Filename, Context);
- if (auto LayoutOverride = DataLayoutCallback(M->getTargetTriple()))
+ if (auto LayoutOverride =
+ DataLayoutCallback(M->getTargetTriple(), M->getDataLayoutStr()))
M->setDataLayout(*LayoutOverride);
return M;
}
@@ -257,7 +258,8 @@ MIRParserImpl::parseIRModule(DataLayoutCallbackTy DataLayoutCallback) {
} else {
// Create an new, empty module.
M = std::make_unique<Module>(Filename, Context);
- if (auto LayoutOverride = DataLayoutCallback(M->getTargetTriple()))
+ if (auto LayoutOverride =
+ DataLayoutCallback(M->getTargetTriple(), M->getDataLayoutStr()))
M->setDataLayout(*LayoutOverride);
NoLLVMIR = true;
}
@@ -441,6 +443,9 @@ void MIRParserImpl::setupDebugValueTracking(
MF.makeDebugValueSubstitution({Sub.SrcInst, Sub.SrcOp},
{Sub.DstInst, Sub.DstOp}, Sub.Subreg);
}
+
+ // Flag for whether we're supposed to be using DBG_INSTR_REF.
+ MF.setUseDebugInstrRef(YamlMF.UseDebugInstrRef);
}
bool
@@ -659,9 +664,11 @@ bool MIRParserImpl::setupRegisterInfo(const PerFunctionMIParsingState &PFS,
const yaml::MachineFunction &YamlMF) {
MachineFunction &MF = PFS.MF;
MachineRegisterInfo &MRI = MF.getRegInfo();
+ const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
+
bool Error = false;
// Create VRegs
- auto populateVRegInfo = [&] (const VRegInfo &Info, Twine Name) {
+ auto populateVRegInfo = [&](const VRegInfo &Info, Twine Name) {
Register Reg = Info.VReg;
switch (Info.Kind) {
case VRegInfo::UNKNOWN:
@@ -670,6 +677,14 @@ bool MIRParserImpl::setupRegisterInfo(const PerFunctionMIParsingState &PFS,
Error = true;
break;
case VRegInfo::NORMAL:
+ if (!Info.D.RC->isAllocatable()) {
+ error(Twine("Cannot use non-allocatable class '") +
+ TRI->getRegClassName(Info.D.RC) + "' for virtual register " +
+ Name + " in function '" + MF.getName() + "'");
+ Error = true;
+ break;
+ }
+
MRI.setRegClass(Reg, Info.D.RC);
if (Info.PreferredReg != 0)
MRI.setSimpleHint(Reg, Info.PreferredReg);
@@ -695,7 +710,6 @@ bool MIRParserImpl::setupRegisterInfo(const PerFunctionMIParsingState &PFS,
// Compute MachineRegisterInfo::UsedPhysRegMask
for (const MachineBasicBlock &MBB : MF) {
// Make sure MRI knows about registers clobbered by unwinder.
- const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
if (MBB.isEHPad())
if (auto *RegMask = TRI->getCustomEHPadPreservedMask(MF))
MRI.addPhysRegsUsedFromRegMask(RegMask);
@@ -999,7 +1013,7 @@ SMDiagnostic MIRParserImpl::diagFromMIStringDiag(const SMDiagnostic &Error,
(HasQuote ? 1 : 0));
// TODO: Translate any source ranges as well.
- return SM.GetMessage(Loc, Error.getKind(), Error.getMessage(), None,
+ return SM.GetMessage(Loc, Error.getKind(), Error.getMessage(), std::nullopt,
Error.getFixIts());
}