diff options
Diffstat (limited to 'include/llvm/CodeGen/MIRYamlMapping.h')
| -rw-r--r-- | include/llvm/CodeGen/MIRYamlMapping.h | 163 | 
1 files changed, 158 insertions, 5 deletions
| diff --git a/include/llvm/CodeGen/MIRYamlMapping.h b/include/llvm/CodeGen/MIRYamlMapping.h index a6ffeb382978..9798e5cef645 100644 --- a/include/llvm/CodeGen/MIRYamlMapping.h +++ b/include/llvm/CodeGen/MIRYamlMapping.h @@ -81,15 +81,30 @@ LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(llvm::yaml::FlowStringValue)  namespace llvm {  namespace yaml { +struct VirtualRegisterDefinition { +  unsigned ID; +  StringValue Class; +  // TODO: Serialize the virtual register hints. +}; + +template <> struct MappingTraits<VirtualRegisterDefinition> { +  static void mapping(IO &YamlIO, VirtualRegisterDefinition &Reg) { +    YamlIO.mapRequired("id", Reg.ID); +    YamlIO.mapRequired("class", Reg.Class); +  } + +  static const bool flow = true; +}; +  struct MachineBasicBlock {    unsigned ID; -  std::string Name; +  StringValue Name;    unsigned Alignment = 0;    bool IsLandingPad = false;    bool AddressTaken = false; -  // TODO: Serialize the successor weights and liveins. +  // TODO: Serialize the successor weights.    std::vector<FlowStringValue> Successors; - +  std::vector<FlowStringValue> LiveIns;    std::vector<StringValue> Instructions;  }; @@ -97,23 +112,153 @@ template <> struct MappingTraits<MachineBasicBlock> {    static void mapping(IO &YamlIO, MachineBasicBlock &MBB) {      YamlIO.mapRequired("id", MBB.ID);      YamlIO.mapOptional("name", MBB.Name, -                       std::string()); // Don't print out an empty name. +                       StringValue()); // Don't print out an empty name.      YamlIO.mapOptional("alignment", MBB.Alignment);      YamlIO.mapOptional("isLandingPad", MBB.IsLandingPad);      YamlIO.mapOptional("addressTaken", MBB.AddressTaken);      YamlIO.mapOptional("successors", MBB.Successors); +    YamlIO.mapOptional("liveins", MBB.LiveIns);      YamlIO.mapOptional("instructions", MBB.Instructions);    }  }; +/// Serializable representation of stack object from the MachineFrameInfo class. +/// +/// The flags 'isImmutable' and 'isAliased' aren't serialized, as they are +/// determined by the object's type and frame information flags. +/// Dead stack objects aren't serialized. +/// +/// TODO: Determine isPreallocated flag by mapping between objects and local +/// objects (Serialize local objects). +struct MachineStackObject { +  enum ObjectType { DefaultType, SpillSlot, VariableSized }; +  // TODO: Serialize LLVM alloca reference. +  unsigned ID; +  ObjectType Type = DefaultType; +  int64_t Offset = 0; +  uint64_t Size = 0; +  unsigned Alignment = 0; +}; + +template <> struct ScalarEnumerationTraits<MachineStackObject::ObjectType> { +  static void enumeration(yaml::IO &IO, MachineStackObject::ObjectType &Type) { +    IO.enumCase(Type, "default", MachineStackObject::DefaultType); +    IO.enumCase(Type, "spill-slot", MachineStackObject::SpillSlot); +    IO.enumCase(Type, "variable-sized", MachineStackObject::VariableSized); +  } +}; + +template <> struct MappingTraits<MachineStackObject> { +  static void mapping(yaml::IO &YamlIO, MachineStackObject &Object) { +    YamlIO.mapRequired("id", Object.ID); +    YamlIO.mapOptional( +        "type", Object.Type, +        MachineStackObject::DefaultType); // Don't print the default type. +    YamlIO.mapOptional("offset", Object.Offset); +    if (Object.Type != MachineStackObject::VariableSized) +      YamlIO.mapRequired("size", Object.Size); +    YamlIO.mapOptional("alignment", Object.Alignment); +  } + +  static const bool flow = true; +}; + +/// Serializable representation of the fixed stack object from the +/// MachineFrameInfo class. +struct FixedMachineStackObject { +  enum ObjectType { DefaultType, SpillSlot }; +  unsigned ID; +  ObjectType Type = DefaultType; +  int64_t Offset = 0; +  uint64_t Size = 0; +  unsigned Alignment = 0; +  bool IsImmutable = false; +  bool IsAliased = false; +}; + +template <> +struct ScalarEnumerationTraits<FixedMachineStackObject::ObjectType> { +  static void enumeration(yaml::IO &IO, +                          FixedMachineStackObject::ObjectType &Type) { +    IO.enumCase(Type, "default", FixedMachineStackObject::DefaultType); +    IO.enumCase(Type, "spill-slot", FixedMachineStackObject::SpillSlot); +  } +}; + +template <> struct MappingTraits<FixedMachineStackObject> { +  static void mapping(yaml::IO &YamlIO, FixedMachineStackObject &Object) { +    YamlIO.mapRequired("id", Object.ID); +    YamlIO.mapOptional( +        "type", Object.Type, +        FixedMachineStackObject::DefaultType); // Don't print the default type. +    YamlIO.mapOptional("offset", Object.Offset); +    YamlIO.mapOptional("size", Object.Size); +    YamlIO.mapOptional("alignment", Object.Alignment); +    if (Object.Type != FixedMachineStackObject::SpillSlot) { +      YamlIO.mapOptional("isImmutable", Object.IsImmutable); +      YamlIO.mapOptional("isAliased", Object.IsAliased); +    } +  } + +  static const bool flow = true; +}; +  } // end namespace yaml  } // end namespace llvm +LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::yaml::VirtualRegisterDefinition)  LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::yaml::MachineBasicBlock) +LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::yaml::MachineStackObject) +LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::yaml::FixedMachineStackObject)  namespace llvm {  namespace yaml { +/// Serializable representation of MachineFrameInfo. +/// +/// Doesn't serialize attributes like 'StackAlignment', 'IsStackRealignable' and +/// 'RealignOption' as they are determined by the target and LLVM function +/// attributes. +/// It also doesn't serialize attributes like 'NumFixedObject' and +/// 'HasVarSizedObjects' as they are determined by the frame objects themselves. +struct MachineFrameInfo { +  bool IsFrameAddressTaken = false; +  bool IsReturnAddressTaken = false; +  bool HasStackMap = false; +  bool HasPatchPoint = false; +  uint64_t StackSize = 0; +  int OffsetAdjustment = 0; +  unsigned MaxAlignment = 0; +  bool AdjustsStack = false; +  bool HasCalls = false; +  // TODO: Serialize StackProtectorIdx and FunctionContextIdx +  unsigned MaxCallFrameSize = 0; +  // TODO: Serialize callee saved info. +  // TODO: Serialize local frame objects. +  bool HasOpaqueSPAdjustment = false; +  bool HasVAStart = false; +  bool HasMustTailInVarArgFunc = false; +  // TODO: Serialize save and restore MBB references. +}; + +template <> struct MappingTraits<MachineFrameInfo> { +  static void mapping(IO &YamlIO, MachineFrameInfo &MFI) { +    YamlIO.mapOptional("isFrameAddressTaken", MFI.IsFrameAddressTaken); +    YamlIO.mapOptional("isReturnAddressTaken", MFI.IsReturnAddressTaken); +    YamlIO.mapOptional("hasStackMap", MFI.HasStackMap); +    YamlIO.mapOptional("hasPatchPoint", MFI.HasPatchPoint); +    YamlIO.mapOptional("stackSize", MFI.StackSize); +    YamlIO.mapOptional("offsetAdjustment", MFI.OffsetAdjustment); +    YamlIO.mapOptional("maxAlignment", MFI.MaxAlignment); +    YamlIO.mapOptional("adjustsStack", MFI.AdjustsStack); +    YamlIO.mapOptional("hasCalls", MFI.HasCalls); +    YamlIO.mapOptional("maxCallFrameSize", MFI.MaxCallFrameSize); +    YamlIO.mapOptional("hasOpaqueSPAdjustment", MFI.HasOpaqueSPAdjustment); +    YamlIO.mapOptional("hasVAStart", MFI.HasVAStart); +    YamlIO.mapOptional("hasMustTailInVarArgFunc", MFI.HasMustTailInVarArgFunc); +  } +}; +  struct MachineFunction {    StringRef Name;    unsigned Alignment = 0; @@ -123,9 +268,13 @@ struct MachineFunction {    bool IsSSA = false;    bool TracksRegLiveness = false;    bool TracksSubRegLiveness = false; -  // TODO: Serialize virtual register definitions. +  std::vector<VirtualRegisterDefinition> VirtualRegisters;    // TODO: Serialize the various register masks.    // TODO: Serialize live in registers. +  // Frame information +  MachineFrameInfo FrameInfo; +  std::vector<FixedMachineStackObject> FixedStackObjects; +  std::vector<MachineStackObject> StackObjects;    std::vector<MachineBasicBlock> BasicBlocks;  }; @@ -139,6 +288,10 @@ template <> struct MappingTraits<MachineFunction> {      YamlIO.mapOptional("isSSA", MF.IsSSA);      YamlIO.mapOptional("tracksRegLiveness", MF.TracksRegLiveness);      YamlIO.mapOptional("tracksSubRegLiveness", MF.TracksSubRegLiveness); +    YamlIO.mapOptional("registers", MF.VirtualRegisters); +    YamlIO.mapOptional("frameInfo", MF.FrameInfo); +    YamlIO.mapOptional("fixedStack", MF.FixedStackObjects); +    YamlIO.mapOptional("stack", MF.StackObjects);      YamlIO.mapOptional("body", MF.BasicBlocks);    }  }; | 
