diff options
5 files changed, 74 insertions, 0 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.cpp index b1923dba8d6..b7fc73380e7 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.cpp @@ -77,3 +77,13 @@ llvm::signatureFromMVTs(const SmallVectorImpl<MVT> &Results,    valTypesFromMVTs(Params, Sig->Params);    return Sig;  } + +yaml::WebAssemblyFunctionInfo::WebAssemblyFunctionInfo( +    const llvm::WebAssemblyFunctionInfo &MFI) {} + +void yaml::WebAssemblyFunctionInfo::mappingImpl(yaml::IO &YamlIO) { +  MappingTraits<WebAssemblyFunctionInfo>::mapping(YamlIO, *this); +} + +void WebAssemblyFunctionInfo::initializeBaseYamlFields( +    const yaml::WebAssemblyFunctionInfo &YamlMFI) {} diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.h b/llvm/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.h index 3962e8db946..6844656b75e 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.h +++ b/llvm/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.h @@ -17,11 +17,16 @@  #include "MCTargetDesc/WebAssemblyMCTargetDesc.h"  #include "llvm/BinaryFormat/Wasm.h" +#include "llvm/CodeGen/MIRYamlMapping.h"  #include "llvm/CodeGen/MachineRegisterInfo.h"  #include "llvm/MC/MCSymbolWasm.h"  namespace llvm { +namespace yaml { +struct WebAssemblyFunctionInfo; +} +  /// This class is derived from MachineFunctionInfo and contains private  /// WebAssembly-specific information for each MachineFunction.  class WebAssemblyFunctionInfo final : public MachineFunctionInfo { @@ -54,6 +59,7 @@ class WebAssemblyFunctionInfo final : public MachineFunctionInfo {  public:    explicit WebAssemblyFunctionInfo(MachineFunction &MF) : MF(MF) {}    ~WebAssemblyFunctionInfo() override; +  void initializeBaseYamlFields(const yaml::WebAssemblyFunctionInfo &YamlMFI);    void addParam(MVT VT) { Params.push_back(VT); }    const std::vector<MVT> &getParams() const { return Params; } @@ -135,6 +141,22 @@ std::unique_ptr<wasm::WasmSignature>  signatureFromMVTs(const SmallVectorImpl<MVT> &Results,                    const SmallVectorImpl<MVT> &Params); +namespace yaml { + +struct WebAssemblyFunctionInfo final : public yaml::MachineFunctionInfo { +  WebAssemblyFunctionInfo() = default; +  WebAssemblyFunctionInfo(const llvm::WebAssemblyFunctionInfo &MFI); + +  void mappingImpl(yaml::IO &YamlIO) override; +  ~WebAssemblyFunctionInfo() = default; +}; + +template <> struct MappingTraits<WebAssemblyFunctionInfo> { +  static void mapping(IO &YamlIO, WebAssemblyFunctionInfo &MFI) {} +}; + +} // end namespace yaml +  } // end namespace llvm  #endif diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp index 414f055932b..6d9fd0016ce 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp @@ -14,8 +14,10 @@  #include "WebAssemblyTargetMachine.h"  #include "MCTargetDesc/WebAssemblyMCTargetDesc.h"  #include "WebAssembly.h" +#include "WebAssemblyMachineFunctionInfo.h"  #include "WebAssemblyTargetObjectFile.h"  #include "WebAssemblyTargetTransformInfo.h" +#include "llvm/CodeGen/MIRParser/MIParser.h"  #include "llvm/CodeGen/MachineFunctionPass.h"  #include "llvm/CodeGen/Passes.h"  #include "llvm/CodeGen/RegAllocRegistry.h" @@ -367,3 +369,24 @@ void WebAssemblyPassConfig::addPreEmitPass() {    // Create a mapping from LLVM CodeGen virtual registers to wasm registers.    addPass(createWebAssemblyRegNumbering());  } + +yaml::MachineFunctionInfo * +WebAssemblyTargetMachine::createDefaultFuncInfoYAML() const { +  return new yaml::WebAssemblyFunctionInfo(); +} + +yaml::MachineFunctionInfo *WebAssemblyTargetMachine::convertFuncInfoToYAML( +    const MachineFunction &MF) const { +  const auto *MFI = MF.getInfo<WebAssemblyFunctionInfo>(); +  return new yaml::WebAssemblyFunctionInfo(*MFI); +} + +bool WebAssemblyTargetMachine::parseMachineFunctionInfo( +    const yaml::MachineFunctionInfo &MFI, PerFunctionMIParsingState &PFS, +    SMDiagnostic &Error, SMRange &SourceRange) const { +  const auto &YamlMFI = +      reinterpret_cast<const yaml::WebAssemblyFunctionInfo &>(MFI); +  MachineFunction &MF = PFS.MF; +  MF.getInfo<WebAssemblyFunctionInfo>()->initializeBaseYamlFields(YamlMFI); +  return false; +} diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.h b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.h index 0630797fe81..0f1901020b5 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.h +++ b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.h @@ -51,6 +51,14 @@ public:    TargetTransformInfo getTargetTransformInfo(const Function &F) override;    bool usesPhysRegsForPEI() const override { return false; } + +  yaml::MachineFunctionInfo *createDefaultFuncInfoYAML() const override; +  yaml::MachineFunctionInfo * +  convertFuncInfoToYAML(const MachineFunction &MF) const override; +  bool parseMachineFunctionInfo(const yaml::MachineFunctionInfo &, +                                PerFunctionMIParsingState &PFS, +                                SMDiagnostic &Error, +                                SMRange &SourceRange) const override;  };  } // end namespace llvm diff --git a/llvm/test/CodeGen/WebAssembly/function-info.mir b/llvm/test/CodeGen/WebAssembly/function-info.mir new file mode 100644 index 00000000000..bb3630461f7 --- /dev/null +++ b/llvm/test/CodeGen/WebAssembly/function-info.mir @@ -0,0 +1,11 @@ +# RUN: llc -mtriple=wasm32-unknown-unknown -run-pass wasm-cfg-stackify %s -o - | FileCheck %s + +# CHECK-LABEL: function_property_test +# CHECK: machineFunctionInfo: {} +name: function_property_test +liveins: +  - { reg: '$arguments' } +body: | +  bb.0: +    RETURN_VOID implicit-def dead $arguments +...  | 

