diff options
Diffstat (limited to 'llvm/lib/CodeGen/MIRParser')
| -rw-r--r-- | llvm/lib/CodeGen/MIRParser/MILexer.cpp | 6 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/MIRParser/MILexer.h | 3 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/MIRParser/MIParser.cpp | 17 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/MIRParser/MIParser.h | 1 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/MIRParser/MIRParser.cpp | 35 | 
5 files changed, 61 insertions, 1 deletions
| diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.cpp b/llvm/lib/CodeGen/MIRParser/MILexer.cpp index 9ec12ee2427..ee4d59ddcaa 100644 --- a/llvm/lib/CodeGen/MIRParser/MILexer.cpp +++ b/llvm/lib/CodeGen/MIRParser/MILexer.cpp @@ -211,6 +211,10 @@ static Cursor maybeLexFixedStackObject(Cursor C, MIToken &Token) {    return maybeLexIndex(C, Token, "%fixed-stack.", MIToken::FixedStackObject);  } +static Cursor maybeLexConstantPoolItem(Cursor C, MIToken &Token) { +  return maybeLexIndex(C, Token, "%const.", MIToken::ConstantPoolItem); +} +  static Cursor lexVirtualRegister(Cursor C, MIToken &Token) {    auto Range = C;    C.advance(); // Skip '%' @@ -321,6 +325,8 @@ StringRef llvm::lexMIToken(      return R.remaining();    if (Cursor R = maybeLexFixedStackObject(C, Token))      return R.remaining(); +  if (Cursor R = maybeLexConstantPoolItem(C, Token)) +    return R.remaining();    if (Cursor R = maybeLexRegister(C, Token))      return R.remaining();    if (Cursor R = maybeLexGlobalValue(C, Token, ErrorCallback)) diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.h b/llvm/lib/CodeGen/MIRParser/MILexer.h index 778640a2c81..fd94d61cab3 100644 --- a/llvm/lib/CodeGen/MIRParser/MILexer.h +++ b/llvm/lib/CodeGen/MIRParser/MILexer.h @@ -58,6 +58,7 @@ struct MIToken {      // Other tokens      IntegerLiteral,      VirtualRegister, +    ConstantPoolItem,      JumpTableIndex    }; @@ -122,7 +123,7 @@ public:      return Kind == IntegerLiteral || Kind == MachineBasicBlock ||             Kind == StackObject || Kind == FixedStackObject ||             Kind == GlobalValue || Kind == VirtualRegister || -           Kind == JumpTableIndex; +           Kind == ConstantPoolItem || Kind == JumpTableIndex;    }  }; diff --git a/llvm/lib/CodeGen/MIRParser/MIParser.cpp b/llvm/lib/CodeGen/MIRParser/MIParser.cpp index b458a8b8882..34d3e1e3c53 100644 --- a/llvm/lib/CodeGen/MIRParser/MIParser.cpp +++ b/llvm/lib/CodeGen/MIRParser/MIParser.cpp @@ -108,6 +108,7 @@ public:    bool parseStackObjectOperand(MachineOperand &Dest);    bool parseFixedStackObjectOperand(MachineOperand &Dest);    bool parseGlobalAddressOperand(MachineOperand &Dest); +  bool parseConstantPoolIndexOperand(MachineOperand &Dest);    bool parseJumpTableIndexOperand(MachineOperand &Dest);    bool parseMachineOperand(MachineOperand &Dest); @@ -531,6 +532,20 @@ bool MIParser::parseGlobalAddressOperand(MachineOperand &Dest) {    return false;  } +bool MIParser::parseConstantPoolIndexOperand(MachineOperand &Dest) { +  assert(Token.is(MIToken::ConstantPoolItem)); +  unsigned ID; +  if (getUnsigned(ID)) +    return true; +  auto ConstantInfo = PFS.ConstantPoolSlots.find(ID); +  if (ConstantInfo == PFS.ConstantPoolSlots.end()) +    return error("use of undefined constant '%const." + Twine(ID) + "'"); +  lex(); +  // TODO: Parse offset and target flags. +  Dest = MachineOperand::CreateCPI(ID, /*Offset=*/0); +  return false; +} +  bool MIParser::parseJumpTableIndexOperand(MachineOperand &Dest) {    assert(Token.is(MIToken::JumpTableIndex));    unsigned ID; @@ -568,6 +583,8 @@ bool MIParser::parseMachineOperand(MachineOperand &Dest) {    case MIToken::NamedGlobalValue:    case MIToken::QuotedNamedGlobalValue:      return parseGlobalAddressOperand(Dest); +  case MIToken::ConstantPoolItem: +    return parseConstantPoolIndexOperand(Dest);    case MIToken::JumpTableIndex:      return parseJumpTableIndexOperand(Dest);    case MIToken::Error: diff --git a/llvm/lib/CodeGen/MIRParser/MIParser.h b/llvm/lib/CodeGen/MIRParser/MIParser.h index b34b7626eb8..888f2f57a31 100644 --- a/llvm/lib/CodeGen/MIRParser/MIParser.h +++ b/llvm/lib/CodeGen/MIRParser/MIParser.h @@ -31,6 +31,7 @@ struct PerFunctionMIParsingState {    DenseMap<unsigned, unsigned> VirtualRegisterSlots;    DenseMap<unsigned, int> FixedStackObjectSlots;    DenseMap<unsigned, int> StackObjectSlots; +  DenseMap<unsigned, unsigned> ConstantPoolSlots;    DenseMap<unsigned, unsigned> JumpTableSlots;  }; diff --git a/llvm/lib/CodeGen/MIRParser/MIRParser.cpp b/llvm/lib/CodeGen/MIRParser/MIRParser.cpp index ca46de44740..a7c81ab390a 100644 --- a/llvm/lib/CodeGen/MIRParser/MIRParser.cpp +++ b/llvm/lib/CodeGen/MIRParser/MIRParser.cpp @@ -20,6 +20,7 @@  #include "llvm/ADT/STLExtras.h"  #include "llvm/AsmParser/Parser.h"  #include "llvm/AsmParser/SlotMapping.h" +#include "llvm/CodeGen/MachineConstantPool.h"  #include "llvm/CodeGen/MachineFunction.h"  #include "llvm/CodeGen/MachineFrameInfo.h"  #include "llvm/CodeGen/MachineRegisterInfo.h" @@ -113,6 +114,11 @@ public:                             DenseMap<unsigned, int> &StackObjectSlots,                             DenseMap<unsigned, int> &FixedStackObjectSlots); +  bool initializeConstantPool(MachineConstantPool &ConstantPool, +                              const yaml::MachineFunction &YamlMF, +                              const MachineFunction &MF, +                              DenseMap<unsigned, unsigned> &ConstantPoolSlots); +    bool initializeJumpTableInfo(MachineFunction &MF,                                 const yaml::MachineJumpTable &YamlJTI,                                 PerFunctionMIParsingState &PFS); @@ -273,6 +279,13 @@ bool MIRParserImpl::initializeMachineFunction(MachineFunction &MF) {    if (initializeFrameInfo(*MF.getFunction(), *MF.getFrameInfo(), YamlMF,                            PFS.StackObjectSlots, PFS.FixedStackObjectSlots))      return true; +  if (!YamlMF.Constants.empty()) { +    auto *ConstantPool = MF.getConstantPool(); +    assert(ConstantPool && "Constant pool must be created"); +    if (initializeConstantPool(*ConstantPool, YamlMF, MF, +                               PFS.ConstantPoolSlots)) +      return true; +  }    const auto &F = *MF.getFunction();    for (const auto &YamlMBB : YamlMF.BasicBlocks) { @@ -439,6 +452,28 @@ bool MIRParserImpl::initializeFrameInfo(    return false;  } +bool MIRParserImpl::initializeConstantPool( +    MachineConstantPool &ConstantPool, const yaml::MachineFunction &YamlMF, +    const MachineFunction &MF, +    DenseMap<unsigned, unsigned> &ConstantPoolSlots) { +  const auto &M = *MF.getFunction()->getParent(); +  SMDiagnostic Error; +  for (const auto &YamlConstant : YamlMF.Constants) { +    const Constant *Value = dyn_cast_or_null<Constant>( +        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()); +    // TODO: Report an error when the same constant pool value ID is redefined. +    ConstantPoolSlots.insert(std::make_pair( +        YamlConstant.ID, ConstantPool.getConstantPoolIndex(Value, Alignment))); +  } +  return false; +} +  bool MIRParserImpl::initializeJumpTableInfo(      MachineFunction &MF, const yaml::MachineJumpTable &YamlJTI,      PerFunctionMIParsingState &PFS) { | 

