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 | |
parent | 706b4fc47bbc608932d3b491ae19a3b9cde9497b (diff) |
Notes
Diffstat (limited to 'llvm/lib/CodeGen/MIRParser')
-rw-r--r-- | llvm/lib/CodeGen/MIRParser/MILexer.cpp | 23 | ||||
-rw-r--r-- | llvm/lib/CodeGen/MIRParser/MILexer.h | 3 | ||||
-rw-r--r-- | llvm/lib/CodeGen/MIRParser/MIParser.cpp | 104 | ||||
-rw-r--r-- | llvm/lib/CodeGen/MIRParser/MIRParser.cpp | 63 |
4 files changed, 130 insertions, 63 deletions
diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.cpp b/llvm/lib/CodeGen/MIRParser/MILexer.cpp index 5976f5da15691..98af46dc4872e 100644 --- a/llvm/lib/CodeGen/MIRParser/MILexer.cpp +++ b/llvm/lib/CodeGen/MIRParser/MILexer.cpp @@ -11,12 +11,9 @@ //===----------------------------------------------------------------------===// #include "MILexer.h" -#include "llvm/ADT/APSInt.h" #include "llvm/ADT/None.h" -#include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringSwitch.h" -#include "llvm/ADT/StringRef.h" #include "llvm/ADT/Twine.h" #include <algorithm> #include <cassert> @@ -104,6 +101,20 @@ static Cursor skipComment(Cursor C) { return C; } +/// Machine operands can have comments, enclosed between /* and */. +/// This eats up all tokens, including /* and */. +static Cursor skipMachineOperandComment(Cursor C) { + if (C.peek() != '/' || C.peek(1) != '*') + return C; + + while (C.peek() != '*' || C.peek(1) != '/') + C.advance(); + + C.advance(); + C.advance(); + return C; +} + /// Return true if the given character satisfies the following regular /// expression: [-a-zA-Z$._0-9] static bool isIdentifierChar(char C) { @@ -246,6 +257,7 @@ static MIToken::TokenKind getIdentifierKind(StringRef Identifier) { .Case("liveout", MIToken::kw_liveout) .Case("address-taken", MIToken::kw_address_taken) .Case("landing-pad", MIToken::kw_landing_pad) + .Case("ehfunclet-entry", MIToken::kw_ehfunclet_entry) .Case("liveins", MIToken::kw_liveins) .Case("successors", MIToken::kw_successors) .Case("floatpred", MIToken::kw_floatpred) @@ -254,6 +266,7 @@ static MIToken::TokenKind getIdentifierKind(StringRef Identifier) { .Case("pre-instr-symbol", MIToken::kw_pre_instr_symbol) .Case("post-instr-symbol", MIToken::kw_post_instr_symbol) .Case("heap-alloc-marker", MIToken::kw_heap_alloc_marker) + .Case("bbsections", MIToken::kw_bbsections) .Case("unknown-size", MIToken::kw_unknown_size) .Default(MIToken::Identifier); } @@ -518,7 +531,7 @@ static Cursor maybeLexMCSymbol(Cursor C, MIToken &Token, } static bool isValidHexFloatingPointPrefix(char C) { - return C == 'H' || C == 'K' || C == 'L' || C == 'M'; + return C == 'H' || C == 'K' || C == 'L' || C == 'M' || C == 'R'; } static Cursor lexFloatingPointLiteral(Cursor Range, Cursor C, MIToken &Token) { @@ -691,6 +704,8 @@ StringRef llvm::lexMIToken(StringRef Source, MIToken &Token, return C.remaining(); } + C = skipMachineOperandComment(C); + if (Cursor R = maybeLexMachineBasicBlock(C, Token, ErrorCallback)) return R.remaining(); if (Cursor R = maybeLexIdentifier(C, Token)) diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.h b/llvm/lib/CodeGen/MIRParser/MILexer.h index aaffe4a4c91bb..ef16da94d21b3 100644 --- a/llvm/lib/CodeGen/MIRParser/MILexer.h +++ b/llvm/lib/CodeGen/MIRParser/MILexer.h @@ -15,7 +15,6 @@ #define LLVM_LIB_CODEGEN_MIRPARSER_MILEXER_H #include "llvm/ADT/APSInt.h" -#include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringRef.h" #include <string> @@ -114,6 +113,7 @@ struct MIToken { kw_liveout, kw_address_taken, kw_landing_pad, + kw_ehfunclet_entry, kw_liveins, kw_successors, kw_floatpred, @@ -122,6 +122,7 @@ struct MIToken { kw_pre_instr_symbol, kw_post_instr_symbol, kw_heap_alloc_marker, + kw_bbsections, kw_unknown_size, // Named metadata keywords diff --git a/llvm/lib/CodeGen/MIRParser/MIParser.cpp b/llvm/lib/CodeGen/MIRParser/MIParser.cpp index 076ca943788bf..ded31cd08fb5c 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); } diff --git a/llvm/lib/CodeGen/MIRParser/MIRParser.cpp b/llvm/lib/CodeGen/MIRParser/MIRParser.cpp index 10157c746b462..2e0b0e745e9eb 100644 --- a/llvm/lib/CodeGen/MIRParser/MIRParser.cpp +++ b/llvm/lib/CodeGen/MIRParser/MIRParser.cpp @@ -93,7 +93,8 @@ public: /// file. /// /// Return null if an error occurred. - std::unique_ptr<Module> parseIRModule(); + std::unique_ptr<Module> + parseIRModule(DataLayoutCallbackTy DataLayoutCallback); /// Create an empty function with the given name. Function *createDummyFunction(StringRef Name, Module &M); @@ -216,13 +217,17 @@ void MIRParserImpl::reportDiagnostic(const SMDiagnostic &Diag) { Context.diagnose(DiagnosticInfoMIRParser(Kind, Diag)); } -std::unique_ptr<Module> MIRParserImpl::parseIRModule() { +std::unique_ptr<Module> +MIRParserImpl::parseIRModule(DataLayoutCallbackTy DataLayoutCallback) { if (!In.setCurrentDocument()) { if (In.error()) return nullptr; // Create an empty module when the MIR file is empty. NoMIRDocuments = true; - return std::make_unique<Module>(Filename, Context); + auto M = std::make_unique<Module>(Filename, Context); + if (auto LayoutOverride = DataLayoutCallback(M->getTargetTriple())) + M->setDataLayout(*LayoutOverride); + return M; } std::unique_ptr<Module> M; @@ -232,7 +237,7 @@ std::unique_ptr<Module> MIRParserImpl::parseIRModule() { dyn_cast_or_null<yaml::BlockScalarNode>(In.getCurrentNode())) { SMDiagnostic Error; M = parseAssembly(MemoryBufferRef(BSN->getValue(), Filename), Error, - Context, &IRSlots, /*UpgradeDebugInfo=*/false); + Context, &IRSlots, DataLayoutCallback); if (!M) { reportDiagnostic(diagFromBlockStringDiag(Error, BSN->getSourceRange())); return nullptr; @@ -243,6 +248,8 @@ std::unique_ptr<Module> MIRParserImpl::parseIRModule() { } else { // Create an new, empty module. M = std::make_unique<Module>(Filename, Context); + if (auto LayoutOverride = DataLayoutCallback(M->getTargetTriple())) + M->setDataLayout(*LayoutOverride); NoLLVMIR = true; } return M; @@ -375,17 +382,17 @@ bool MIRParserImpl::initializeCallSiteInfo( " is not a call instruction"); MachineFunction::CallSiteInfo CSInfo; for (auto ArgRegPair : YamlCSInfo.ArgForwardingRegs) { - unsigned Reg = 0; + Register Reg; if (parseNamedRegisterReference(PFS, Reg, ArgRegPair.Reg.Value, Error)) return error(Error, ArgRegPair.Reg.SourceRange); CSInfo.emplace_back(Reg, ArgRegPair.ArgNo); } - if (TM.Options.EnableDebugEntryValues) + if (TM.Options.EmitCallSiteInfo) MF.addCallArgsForwardingRegs(&*CallI, std::move(CSInfo)); } - if (YamlMF.CallSitesInfo.size() && !TM.Options.EnableDebugEntryValues) + if (YamlMF.CallSitesInfo.size() && !TM.Options.EmitCallSiteInfo) return error(Twine("Call site info provided but not used")); return false; } @@ -401,8 +408,7 @@ MIRParserImpl::initializeMachineFunction(const yaml::MachineFunction &YamlMF, Target.reset(new PerTargetMIParsingState(MF.getSubtarget())); } - if (YamlMF.Alignment) - MF.setAlignment(Align(YamlMF.Alignment)); + MF.setAlignment(YamlMF.Alignment.valueOrOne()); MF.setExposesReturnsTwice(YamlMF.ExposesReturnsTwice); MF.setHasWinCFI(YamlMF.HasWinCFI); @@ -438,6 +444,14 @@ MIRParserImpl::initializeMachineFunction(const yaml::MachineFunction &YamlMF, diagFromBlockStringDiag(Error, YamlMF.Body.Value.SourceRange)); return true; } + // Check Basic Block Section Flags. + if (MF.getTarget().getBBSectionsType() == BasicBlockSection::Labels) { + MF.createBBLabels(); + MF.setBBSectionsType(BasicBlockSection::Labels); + } else if (MF.hasBBSections()) { + MF.createBBLabels(); + MF.assignBeginEndSections(); + } PFS.SM = &SM; // Initialize the frame information after creating all the MBBs so that the @@ -550,10 +564,10 @@ bool MIRParserImpl::parseRegisterInfo(PerFunctionMIParsingState &PFS, // Parse the liveins. for (const auto &LiveIn : YamlMF.LiveIns) { - unsigned Reg = 0; + Register Reg; if (parseNamedRegisterReference(PFS, Reg, LiveIn.Register.Value, Error)) return error(Error, LiveIn.Register.SourceRange); - unsigned VReg = 0; + Register VReg; if (!LiveIn.VirtualRegister.Value.empty()) { VRegInfo *Info; if (parseVirtualRegisterReference(PFS, Info, LiveIn.VirtualRegister.Value, @@ -569,7 +583,7 @@ bool MIRParserImpl::parseRegisterInfo(PerFunctionMIParsingState &PFS, if (YamlMF.CalleeSavedRegisters) { SmallVector<MCPhysReg, 16> CalleeSavedRegisters; for (const auto &RegSource : YamlMF.CalleeSavedRegisters.getValue()) { - unsigned Reg = 0; + Register Reg; if (parseNamedRegisterReference(PFS, Reg, RegSource.Value, Error)) return error(Error, RegSource.SourceRange); CalleeSavedRegisters.push_back(Reg); @@ -587,7 +601,7 @@ bool MIRParserImpl::setupRegisterInfo(const PerFunctionMIParsingState &PFS, bool Error = false; // Create VRegs auto populateVRegInfo = [&] (const VRegInfo &Info, Twine Name) { - unsigned Reg = Info.VReg; + Register Reg = Info.VReg; switch (Info.Kind) { case VRegInfo::UNKNOWN: error(Twine("Cannot determine class/bank of virtual register ") + @@ -646,7 +660,7 @@ bool MIRParserImpl::initializeFrameInfo(PerFunctionMIParsingState &PFS, MFI.setStackSize(YamlMFI.StackSize); MFI.setOffsetAdjustment(YamlMFI.OffsetAdjustment); if (YamlMFI.MaxAlignment) - MFI.ensureMaxAlignment(YamlMFI.MaxAlignment); + MFI.ensureMaxAlignment(Align(YamlMFI.MaxAlignment)); MFI.setAdjustsStack(YamlMFI.AdjustsStack); MFI.setHasCalls(YamlMFI.HasCalls); if (YamlMFI.MaxCallFrameSize != ~0u) @@ -683,7 +697,7 @@ bool MIRParserImpl::initializeFrameInfo(PerFunctionMIParsingState &PFS, return error(Object.ID.SourceRange.Start, Twine("StackID is not supported by target")); MFI.setStackID(ObjectIdx, Object.StackID); - MFI.setObjectAlignment(ObjectIdx, Object.Alignment); + MFI.setObjectAlignment(ObjectIdx, Object.Alignment.valueOrOne()); if (!PFS.FixedStackObjectSlots.insert(std::make_pair(Object.ID.Value, ObjectIdx)) .second) @@ -715,10 +729,11 @@ bool MIRParserImpl::initializeFrameInfo(PerFunctionMIParsingState &PFS, return error(Object.ID.SourceRange.Start, Twine("StackID is not supported by target")); if (Object.Type == yaml::MachineStackObject::VariableSized) - ObjectIdx = MFI.CreateVariableSizedObject(Object.Alignment, Alloca); + ObjectIdx = + MFI.CreateVariableSizedObject(Object.Alignment.valueOrOne(), Alloca); else ObjectIdx = MFI.CreateStackObject( - Object.Size, Object.Alignment, + Object.Size, Object.Alignment.valueOrOne(), Object.Type == yaml::MachineStackObject::SpillSlot, Alloca, Object.StackID); MFI.setObjectOffset(ObjectIdx, Object.Offset); @@ -757,7 +772,7 @@ bool MIRParserImpl::parseCalleeSavedRegister(PerFunctionMIParsingState &PFS, const yaml::StringValue &RegisterSource, bool IsRestored, int FrameIdx) { if (RegisterSource.Value.empty()) return false; - unsigned Reg = 0; + Register Reg; SMDiagnostic Error; if (parseNamedRegisterReference(PFS, Reg, RegisterSource.Value, Error)) return error(Error, RegisterSource.SourceRange); @@ -830,10 +845,9 @@ bool MIRParserImpl::initializeConstantPool(PerFunctionMIParsingState &PFS, parseConstantValue(YamlConstant.Value.Value, Error, M)); if (!Value) return error(Error, YamlConstant.Value.SourceRange); - unsigned Alignment = - YamlConstant.Alignment - ? YamlConstant.Alignment - : M.getDataLayout().getPrefTypeAlignment(Value->getType()); + const Align PrefTypeAlign = + M.getDataLayout().getPrefTypeAlign(Value->getType()); + const Align Alignment = YamlConstant.Alignment.getValueOr(PrefTypeAlign); unsigned Index = ConstantPool.getConstantPoolIndex(Value, Alignment); if (!ConstantPoolSlots.insert(std::make_pair(YamlConstant.ID.Value, Index)) .second) @@ -926,8 +940,9 @@ MIRParser::MIRParser(std::unique_ptr<MIRParserImpl> Impl) MIRParser::~MIRParser() {} -std::unique_ptr<Module> MIRParser::parseIRModule() { - return Impl->parseIRModule(); +std::unique_ptr<Module> +MIRParser::parseIRModule(DataLayoutCallbackTy DataLayoutCallback) { + return Impl->parseIRModule(DataLayoutCallback); } bool MIRParser::parseMachineFunctions(Module &M, MachineModuleInfo &MMI) { |