diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/CodeGen/MIRParser/MIParser.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/CodeGen/MIRParser/MIParser.cpp | 74 |
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)) |