diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2020-07-26 19:36:28 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2020-07-26 19:36:28 +0000 |
commit | cfca06d7963fa0909f90483b42a6d7d194d01e08 (patch) | |
tree | 209fb2a2d68f8f277793fc8df46c753d31bc853b /llvm/lib/CodeGen/MIRParser/MIParser.cpp | |
parent | 706b4fc47bbc608932d3b491ae19a3b9cde9497b (diff) |
Notes
Diffstat (limited to 'llvm/lib/CodeGen/MIRParser/MIParser.cpp')
-rw-r--r-- | llvm/lib/CodeGen/MIRParser/MIParser.cpp | 104 |
1 files changed, 70 insertions, 34 deletions
diff --git a/llvm/lib/CodeGen/MIRParser/MIParser.cpp b/llvm/lib/CodeGen/MIRParser/MIParser.cpp index 076ca943788b..ded31cd08fb5 100644 --- a/llvm/lib/CodeGen/MIRParser/MIParser.cpp +++ b/llvm/lib/CodeGen/MIRParser/MIParser.cpp @@ -122,7 +122,7 @@ void PerTargetMIParsingState::initNames2Regs() { } bool PerTargetMIParsingState::getRegisterByName(StringRef RegName, - unsigned &Reg) { + Register &Reg) { initNames2Regs(); auto RegInfo = Names2Regs.find(RegName); if (RegInfo == Names2Regs.end()) @@ -321,7 +321,7 @@ PerFunctionMIParsingState::PerFunctionMIParsingState(MachineFunction &MF, : MF(MF), SM(&SM), IRSlots(IRSlots), Target(T) { } -VRegInfo &PerFunctionMIParsingState::getVRegInfo(unsigned Num) { +VRegInfo &PerFunctionMIParsingState::getVRegInfo(Register Num) { auto I = VRegInfos.insert(std::make_pair(Num, nullptr)); if (I.second) { MachineRegisterInfo &MRI = MF.getRegInfo(); @@ -426,9 +426,9 @@ public: bool parseBasicBlocks(); bool parse(MachineInstr *&MI); bool parseStandaloneMBB(MachineBasicBlock *&MBB); - bool parseStandaloneNamedRegister(unsigned &Reg); + bool parseStandaloneNamedRegister(Register &Reg); bool parseStandaloneVirtualRegister(VRegInfo *&Info); - bool parseStandaloneRegister(unsigned &Reg); + bool parseStandaloneRegister(Register &Reg); bool parseStandaloneStackObject(int &FI); bool parseStandaloneMDNode(MDNode *&Node); @@ -439,10 +439,10 @@ public: bool parseBasicBlockLiveins(MachineBasicBlock &MBB); bool parseBasicBlockSuccessors(MachineBasicBlock &MBB); - bool parseNamedRegister(unsigned &Reg); + bool parseNamedRegister(Register &Reg); bool parseVirtualRegister(VRegInfo *&Info); bool parseNamedVirtualRegister(VRegInfo *&Info); - bool parseRegister(unsigned &Reg, VRegInfo *&VRegInfo); + bool parseRegister(Register &Reg, VRegInfo *&VRegInfo); bool parseRegisterFlag(unsigned &Flags); bool parseRegisterClassOrBank(VRegInfo &RegInfo); bool parseSubRegisterIndex(unsigned &SubReg); @@ -474,7 +474,7 @@ public: bool parseDILocation(MDNode *&Expr); bool parseMetadataOperand(MachineOperand &Dest); bool parseCFIOffset(int &Offset); - bool parseCFIRegister(unsigned &Reg); + bool parseCFIRegister(Register &Reg); bool parseCFIEscapeValues(std::string& Values); bool parseCFIOperand(MachineOperand &Dest); bool parseIRBlock(BasicBlock *&BB, const Function &F); @@ -495,6 +495,7 @@ public: bool parseOffset(int64_t &Offset); bool parseAlignment(unsigned &Alignment); bool parseAddrspace(unsigned &Addrspace); + bool parseSectionID(Optional<MBBSectionID> &SID); bool parseOperandsOffset(MachineOperand &Op); bool parseIRValue(const Value *&V); bool parseMemoryOperandFlag(MachineMemOperand::Flags &Flags); @@ -562,7 +563,7 @@ MIParser::MIParser(PerFunctionMIParsingState &PFS, SMDiagnostic &Error, void MIParser::lex(unsigned SkipChar) { CurrentSource = lexMIToken( - CurrentSource.data() + SkipChar, Token, + CurrentSource.slice(SkipChar, StringRef::npos), Token, [this](StringRef::iterator Loc, const Twine &Msg) { error(Loc, Msg); }); } @@ -619,6 +620,28 @@ bool MIParser::consumeIfPresent(MIToken::TokenKind TokenKind) { return true; } +// Parse Machine Basic Block Section ID. +bool MIParser::parseSectionID(Optional<MBBSectionID> &SID) { + assert(Token.is(MIToken::kw_bbsections)); + lex(); + if (Token.is(MIToken::IntegerLiteral)) { + unsigned Value = 0; + if (getUnsigned(Value)) + return error("Unknown Section ID"); + SID = MBBSectionID{Value}; + } else { + const StringRef &S = Token.stringValue(); + if (S == "Exception") + SID = MBBSectionID::ExceptionSectionID; + else if (S == "Cold") + SID = MBBSectionID::ColdSectionID; + else + return error("Unknown Section ID"); + } + lex(); + return false; +} + bool MIParser::parseBasicBlockDefinition( DenseMap<unsigned, MachineBasicBlock *> &MBBSlots) { assert(Token.is(MIToken::MachineBasicBlockLabel)); @@ -630,6 +653,8 @@ bool MIParser::parseBasicBlockDefinition( lex(); bool HasAddressTaken = false; bool IsLandingPad = false; + bool IsEHFuncletEntry = false; + Optional<MBBSectionID> SectionID; unsigned Alignment = 0; BasicBlock *BB = nullptr; if (consumeIfPresent(MIToken::lparen)) { @@ -644,6 +669,10 @@ bool MIParser::parseBasicBlockDefinition( IsLandingPad = true; lex(); break; + case MIToken::kw_ehfunclet_entry: + IsEHFuncletEntry = true; + lex(); + break; case MIToken::kw_align: if (parseAlignment(Alignment)) return true; @@ -654,6 +683,10 @@ bool MIParser::parseBasicBlockDefinition( return true; lex(); break; + case MIToken::kw_bbsections: + if (parseSectionID(SectionID)) + return true; + break; default: break; } @@ -683,6 +716,11 @@ bool MIParser::parseBasicBlockDefinition( if (HasAddressTaken) MBB->setHasAddressTaken(); MBB->setIsEHPad(IsLandingPad); + MBB->setIsEHFuncletEntry(IsEHFuncletEntry); + if (SectionID.hasValue()) { + MBB->setSectionID(SectionID.getValue()); + MF.setBBSectionsType(BasicBlockSection::List); + } return false; } @@ -740,7 +778,7 @@ bool MIParser::parseBasicBlockLiveins(MachineBasicBlock &MBB) { do { if (Token.isNot(MIToken::NamedRegister)) return error("expected a named register"); - unsigned Reg = 0; + Register Reg; if (parseNamedRegister(Reg)) return true; lex(); @@ -750,10 +788,10 @@ bool MIParser::parseBasicBlockLiveins(MachineBasicBlock &MBB) { if (Token.isNot(MIToken::IntegerLiteral) && Token.isNot(MIToken::HexLiteral)) return error("expected a lane mask"); - static_assert(sizeof(LaneBitmask::Type) == sizeof(unsigned), + static_assert(sizeof(LaneBitmask::Type) == sizeof(uint64_t), "Use correct get-function for lane mask"); LaneBitmask::Type V; - if (getUnsigned(V)) + if (getUint64(V)) return error("invalid lane mask value"); Mask = LaneBitmask(V); lex(); @@ -1048,7 +1086,7 @@ bool MIParser::parseStandaloneMBB(MachineBasicBlock *&MBB) { return false; } -bool MIParser::parseStandaloneNamedRegister(unsigned &Reg) { +bool MIParser::parseStandaloneNamedRegister(Register &Reg) { lex(); if (Token.isNot(MIToken::NamedRegister)) return error("expected a named register"); @@ -1072,7 +1110,7 @@ bool MIParser::parseStandaloneVirtualRegister(VRegInfo *&Info) { return false; } -bool MIParser::parseStandaloneRegister(unsigned &Reg) { +bool MIParser::parseStandaloneRegister(Register &Reg) { lex(); if (Token.isNot(MIToken::NamedRegister) && Token.isNot(MIToken::VirtualRegister)) @@ -1123,7 +1161,7 @@ static const char *printImplicitRegisterFlag(const MachineOperand &MO) { } static std::string getRegisterName(const TargetRegisterInfo *TRI, - unsigned Reg) { + Register Reg) { assert(Register::isPhysicalRegister(Reg) && "expected phys reg"); return StringRef(TRI->getName(Reg)).lower(); } @@ -1223,7 +1261,7 @@ bool MIParser::parseInstruction(unsigned &OpCode, unsigned &Flags) { return false; } -bool MIParser::parseNamedRegister(unsigned &Reg) { +bool MIParser::parseNamedRegister(Register &Reg) { assert(Token.is(MIToken::NamedRegister) && "Needs NamedRegister token"); StringRef Name = Token.stringValue(); if (PFS.Target.getRegisterByName(Name, Reg)) @@ -1251,7 +1289,7 @@ bool MIParser::parseVirtualRegister(VRegInfo *&Info) { return false; } -bool MIParser::parseRegister(unsigned &Reg, VRegInfo *&Info) { +bool MIParser::parseRegister(Register &Reg, VRegInfo *&Info) { switch (Token.kind()) { case MIToken::underscore: Reg = 0; @@ -1445,7 +1483,7 @@ bool MIParser::parseRegisterOperand(MachineOperand &Dest, } if (!Token.isRegister()) return error("expected a register after register flags"); - unsigned Reg; + Register Reg; VRegInfo *RegInfo; if (parseRegister(Reg, RegInfo)) return true; @@ -2138,10 +2176,10 @@ bool MIParser::parseCFIOffset(int &Offset) { return false; } -bool MIParser::parseCFIRegister(unsigned &Reg) { +bool MIParser::parseCFIRegister(Register &Reg) { if (Token.isNot(MIToken::NamedRegister)) return error("expected a cfi register"); - unsigned LLVMReg; + Register LLVMReg; if (parseNamedRegister(LLVMReg)) return true; const auto *TRI = MF.getSubtarget().getRegisterInfo(); @@ -2173,7 +2211,7 @@ bool MIParser::parseCFIOperand(MachineOperand &Dest) { auto Kind = Token.kind(); lex(); int Offset; - unsigned Reg; + Register Reg; unsigned CFIIndex; switch (Kind) { case MIToken::kw_cfi_same_value: @@ -2204,9 +2242,8 @@ bool MIParser::parseCFIOperand(MachineOperand &Dest) { case MIToken::kw_cfi_def_cfa_offset: if (parseCFIOffset(Offset)) return true; - // NB: MCCFIInstruction::createDefCfaOffset negates the offset. - CFIIndex = MF.addFrameInst( - MCCFIInstruction::createDefCfaOffset(nullptr, -Offset)); + CFIIndex = + MF.addFrameInst(MCCFIInstruction::cfiDefCfaOffset(nullptr, Offset)); break; case MIToken::kw_cfi_adjust_cfa_offset: if (parseCFIOffset(Offset)) @@ -2218,9 +2255,8 @@ bool MIParser::parseCFIOperand(MachineOperand &Dest) { if (parseCFIRegister(Reg) || expectAndConsume(MIToken::comma) || parseCFIOffset(Offset)) return true; - // NB: MCCFIInstruction::createDefCfa negates the offset. CFIIndex = - MF.addFrameInst(MCCFIInstruction::createDefCfa(nullptr, Reg, -Offset)); + MF.addFrameInst(MCCFIInstruction::cfiDefCfa(nullptr, Reg, Offset)); break; case MIToken::kw_cfi_remember_state: CFIIndex = MF.addFrameInst(MCCFIInstruction::createRememberState(nullptr)); @@ -2239,7 +2275,7 @@ bool MIParser::parseCFIOperand(MachineOperand &Dest) { CFIIndex = MF.addFrameInst(MCCFIInstruction::createUndefined(nullptr, Reg)); break; case MIToken::kw_cfi_register: { - unsigned Reg2; + Register Reg2; if (parseCFIRegister(Reg) || expectAndConsume(MIToken::comma) || parseCFIRegister(Reg2)) return true; @@ -2334,7 +2370,7 @@ bool MIParser::parseIntrinsicOperand(MachineOperand &Dest) { if (Token.isNot(MIToken::NamedGlobalValue)) return error("expected syntax intrinsic(@llvm.whatever)"); - std::string Name = Token.stringValue(); + std::string Name = std::string(Token.stringValue()); lex(); if (expectAndConsume(MIToken::rparen)) @@ -2469,7 +2505,7 @@ bool MIParser::parseCustomRegisterMaskOperand(MachineOperand &Dest) { while (true) { if (Token.isNot(MIToken::NamedRegister)) return error("expected a named register"); - unsigned Reg; + Register Reg; if (parseNamedRegister(Reg)) return true; lex(); @@ -2495,7 +2531,7 @@ bool MIParser::parseLiveoutRegisterMaskOperand(MachineOperand &Dest) { while (true) { if (Token.isNot(MIToken::NamedRegister)) return error("expected a named register"); - unsigned Reg; + Register Reg; if (parseNamedRegister(Reg)) return true; lex(); @@ -3060,8 +3096,8 @@ bool MIParser::parseMachineMemoryOperand(MachineMemOperand *&Dest) { } if (expectAndConsume(MIToken::rparen)) return true; - Dest = MF.getMachineMemOperand(Ptr, Flags, Size, BaseAlignment, AAInfo, Range, - SSID, Order, FailureOrder); + Dest = MF.getMachineMemOperand(Ptr, Flags, Size, Align(BaseAlignment), AAInfo, + Range, SSID, Order, FailureOrder); return false; } @@ -3149,7 +3185,7 @@ MCSymbol *MIParser::getOrCreateMCSymbol(StringRef Name) { bool MIParser::parseStringConstant(std::string &Result) { if (Token.isNot(MIToken::StringConstant)) return error("expected string constant"); - Result = Token.stringValue(); + Result = std::string(Token.stringValue()); lex(); return false; } @@ -3172,13 +3208,13 @@ bool llvm::parseMBBReference(PerFunctionMIParsingState &PFS, } bool llvm::parseRegisterReference(PerFunctionMIParsingState &PFS, - unsigned &Reg, StringRef Src, + Register &Reg, StringRef Src, SMDiagnostic &Error) { return MIParser(PFS, Error, Src).parseStandaloneRegister(Reg); } bool llvm::parseNamedRegisterReference(PerFunctionMIParsingState &PFS, - unsigned &Reg, StringRef Src, + Register &Reg, StringRef Src, SMDiagnostic &Error) { return MIParser(PFS, Error, Src).parseStandaloneNamedRegister(Reg); } |