aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/CodeGen/MIRParser/MIParser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/llvm/lib/CodeGen/MIRParser/MIParser.cpp')
-rw-r--r--contrib/llvm-project/llvm/lib/CodeGen/MIRParser/MIParser.cpp74
1 files changed, 51 insertions, 23 deletions
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/MIRParser/MIParser.cpp b/contrib/llvm-project/llvm/lib/CodeGen/MIRParser/MIParser.cpp
index 6477965bdc21..40ae7053ea09 100644
--- a/contrib/llvm-project/llvm/lib/CodeGen/MIRParser/MIParser.cpp
+++ b/contrib/llvm-project/llvm/lib/CodeGen/MIRParser/MIParser.cpp
@@ -26,8 +26,6 @@
#include "llvm/Analysis/MemoryLocation.h"
#include "llvm/AsmParser/Parser.h"
#include "llvm/AsmParser/SlotMapping.h"
-#include "llvm/CodeGen/GlobalISel/RegisterBank.h"
-#include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h"
#include "llvm/CodeGen/MIRFormatter.h"
#include "llvm/CodeGen/MIRPrinter.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
@@ -38,6 +36,8 @@
#include "llvm/CodeGen/MachineMemOperand.h"
#include "llvm/CodeGen/MachineOperand.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
+#include "llvm/CodeGen/RegisterBank.h"
+#include "llvm/CodeGen/RegisterBankInfo.h"
#include "llvm/CodeGen/TargetInstrInfo.h"
#include "llvm/CodeGen/TargetRegisterInfo.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
@@ -60,7 +60,6 @@
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCDwarf.h"
#include "llvm/MC/MCInstrDesc.h"
-#include "llvm/MC/MCRegisterInfo.h"
#include "llvm/Support/AtomicOrdering.h"
#include "llvm/Support/BranchProbability.h"
#include "llvm/Support/Casting.h"
@@ -69,10 +68,8 @@
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/SMLoc.h"
#include "llvm/Support/SourceMgr.h"
-#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetIntrinsicInfo.h"
#include "llvm/Target/TargetMachine.h"
-#include <algorithm>
#include <cassert>
#include <cctype>
#include <cstddef>
@@ -744,7 +741,7 @@ bool MIParser::parseBasicBlockDefinition(
MBB->setIsEHPad(IsLandingPad);
MBB->setIsInlineAsmBrIndirectTarget(IsInlineAsmBrIndirectTarget);
MBB->setIsEHFuncletEntry(IsEHFuncletEntry);
- if (SectionID.hasValue()) {
+ if (SectionID) {
MBB->setSectionID(SectionID.getValue());
MF.setBBSectionsType(BasicBlockSection::List);
}
@@ -1094,11 +1091,23 @@ bool MIParser::parse(MachineInstr *&MI) {
return true;
}
- // TODO: Check for extraneous machine operands.
MI = MF.CreateMachineInstr(MCID, DebugLocation, /*NoImplicit=*/true);
MI->setFlags(Flags);
- for (const auto &Operand : Operands)
+
+ unsigned NumExplicitOps = 0;
+ for (const auto &Operand : Operands) {
+ bool IsImplicitOp = Operand.Operand.isReg() && Operand.Operand.isImplicit();
+ if (!IsImplicitOp) {
+ if (!MCID.isVariadic() && NumExplicitOps >= MCID.getNumOperands() &&
+ !Operand.Operand.isValidExcessOperand())
+ return error(Operand.Begin, "too many operands for instruction");
+
+ ++NumExplicitOps;
+ }
+
MI->addOperand(MF, Operand.Operand);
+ }
+
if (assignRegisterTies(*MI, Operands))
return true;
if (PreInstrSymbol)
@@ -1609,7 +1618,7 @@ bool MIParser::assignRegisterTies(MachineInstr &MI,
continue;
// The parser ensures that this operand is a register use, so we just have
// to check the tied-def operand.
- unsigned DefIdx = Operands[I].TiedDefIdx.getValue();
+ unsigned DefIdx = *Operands[I].TiedDefIdx;
if (DefIdx >= E)
return error(Operands[I].Begin,
Twine("use of invalid tied-def operand index '" +
@@ -1714,6 +1723,15 @@ bool MIParser::parseRegisterOperand(MachineOperand &Dest,
RegInfo->Kind == VRegInfo::REGBANK)
return error("generic virtual registers must have a type");
}
+
+ if (Flags & RegState::Define) {
+ if (Flags & RegState::Kill)
+ return error("cannot have a killed def operand");
+ } else {
+ if (Flags & RegState::Dead)
+ return error("cannot have a dead use operand");
+ }
+
Dest = MachineOperand::CreateReg(
Reg, Flags & RegState::Define, Flags & RegState::Implicit,
Flags & RegState::Kill, Flags & RegState::Dead, Flags & RegState::Undef,
@@ -2689,19 +2707,19 @@ bool MIParser::parseCustomRegisterMaskOperand(MachineOperand &Dest) {
return true;
uint32_t *Mask = MF.allocateRegMask();
- while (true) {
- if (Token.isNot(MIToken::NamedRegister))
- return error("expected a named register");
- Register Reg;
- if (parseNamedRegister(Reg))
- return true;
- lex();
- Mask[Reg / 32] |= 1U << (Reg % 32);
+ do {
+ if (Token.isNot(MIToken::rparen)) {
+ if (Token.isNot(MIToken::NamedRegister))
+ return error("expected a named register");
+ Register Reg;
+ if (parseNamedRegister(Reg))
+ return true;
+ lex();
+ Mask[Reg / 32] |= 1U << (Reg % 32);
+ }
+
// TODO: Report an error if the same register is used more than once.
- if (Token.isNot(MIToken::comma))
- break;
- lex();
- }
+ } while (consumeIfPresent(MIToken::comma));
if (expectAndConsume(MIToken::rparen))
return true;
@@ -3269,11 +3287,21 @@ bool MIParser::parseMachineMemoryOperand(MachineMemOperand *&Dest) {
MDNode *Range = nullptr;
while (consumeIfPresent(MIToken::comma)) {
switch (Token.kind()) {
- case MIToken::kw_align:
+ case MIToken::kw_align: {
// align is printed if it is different than size.
- if (parseAlignment(BaseAlignment))
+ uint64_t Alignment;
+ if (parseAlignment(Alignment))
return true;
+ if (Ptr.Offset & (Alignment - 1)) {
+ // MachineMemOperand::getAlign never returns a value greater than the
+ // alignment of offset, so this just guards against hand-written MIR
+ // that specifies a large "align" value when it should probably use
+ // "basealign" instead.
+ return error("specified alignment is more aligned than offset");
+ }
+ BaseAlignment = Alignment;
break;
+ }
case MIToken::kw_basealign:
// basealign is printed if it is different than align.
if (parseAlignment(BaseAlignment))