[llvm] r237708 - MIR Serialization: print and parse LLVM IR using MIR format.

Alex L arphaman at gmail.com
Tue May 19 14:47:28 PDT 2015


I've reverted this commit for now as it caused the incremental buildbots to
become unstable - they sometimes pass but sometimes fail with one of the
tests here.

2015-05-19 11:17 GMT-07:00 Alex Lorenz <arphaman at gmail.com>:

> Author: arphaman
> Date: Tue May 19 13:17:39 2015
> New Revision: 237708
>
> URL: http://llvm.org/viewvc/llvm-project?rev=237708&view=rev
> Log:
> MIR Serialization: print and parse LLVM IR using MIR format.
>
> This commit is the initial commit for the MIR serialization project.
> It creates a new library under CodeGen called 'MIR'. This new
> library adds a new machine function pass that prints out the LLVM IR
> using the MIR format. This pass is then added as a last pass when a
> 'stop-after' option is used in llc. The new library adds the initial
> functionality for parsing of MIR files as well. This commit also
> extends the llc tool so that it can recognize and parse MIR input files.
>
> Reviewers: Duncan P. N. Exon Smith, Matthias Braun, Philip Reames
>
> Differential Revision: http://reviews.llvm.org/D9616
>
> Added:
>     llvm/trunk/include/llvm/CodeGen/MIR/
>     llvm/trunk/include/llvm/CodeGen/MIR/MIRParser.h
>     llvm/trunk/lib/CodeGen/MIR/
>     llvm/trunk/lib/CodeGen/MIR/CMakeLists.txt
>     llvm/trunk/lib/CodeGen/MIR/LLVMBuild.txt
>     llvm/trunk/lib/CodeGen/MIR/MIRParser.cpp
>     llvm/trunk/lib/CodeGen/MIR/MIRPrinter.cpp
>     llvm/trunk/lib/CodeGen/MIR/MIRPrinter.h
>     llvm/trunk/lib/CodeGen/MIR/MIRPrintingPass.cpp
>     llvm/trunk/lib/CodeGen/MIR/Makefile
>     llvm/trunk/test/CodeGen/MIR/
>     llvm/trunk/test/CodeGen/MIR/lit.local.cfg
>     llvm/trunk/test/CodeGen/MIR/llvmIR.mir
>     llvm/trunk/test/CodeGen/MIR/llvmIRMissing.mir
> Modified:
>     llvm/trunk/include/llvm/CodeGen/Passes.h
>     llvm/trunk/include/llvm/InitializePasses.h
>     llvm/trunk/include/llvm/Support/YAMLTraits.h
>     llvm/trunk/lib/CodeGen/CMakeLists.txt
>     llvm/trunk/lib/CodeGen/LLVMBuild.txt
>     llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp
>     llvm/trunk/lib/CodeGen/Makefile
>     llvm/trunk/lib/Support/YAMLTraits.cpp
>     llvm/trunk/test/CodeGen/Generic/stop-after.ll
>     llvm/trunk/tools/llc/llc.cpp
>
> Added: llvm/trunk/include/llvm/CodeGen/MIR/MIRParser.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MIR/MIRParser.h?rev=237708&view=auto
>
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/MIR/MIRParser.h (added)
> +++ llvm/trunk/include/llvm/CodeGen/MIR/MIRParser.h Tue May 19 13:17:39
> 2015
> @@ -0,0 +1,52 @@
> +//===- MIRParser.h - MIR serialization format parser
> ----------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +//
> +// This MIR serialization library is currently a work in progress. It
> can't
> +// serialize machine functions at this time.
> +//
> +// This file declares the functions that parse the MIR serialization
> format
> +// files.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef LLVM_CODEGEN_MIR_MIRPARSER_H
> +#define LLVM_CODEGEN_MIR_MIRPARSER_H
> +
> +#include "llvm/ADT/StringRef.h"
> +#include "llvm/IR/Module.h"
> +#include "llvm/Support/MemoryBuffer.h"
> +#include <memory>
> +
> +namespace llvm {
> +
> +class SMDiagnostic;
> +
> +/// This function is the main interface to the MIR serialization format
> parser.
> +///
> +/// It reads a YAML file that has an optional LLVM IR and returns an LLVM
> +/// module.
> +/// \param Filename - The name of the file to parse.
> +/// \param Error - Error result info.
> +/// \param Context - Context in which to allocate globals info.
> +std::unique_ptr<Module> parseMIRFile(StringRef Filename, SMDiagnostic
> &Error,
> +                                     LLVMContext &Context);
> +
> +/// This function is another interface to the MIR serialization format
> parser.
> +///
> +/// It parses the optional LLVM IR in the given buffer, and returns an
> LLVM
> +/// module.
> +/// \param Contents - The MemoryBuffer containing the machine level IR.
> +/// \param Error - Error result info.
> +/// \param Context - Context in which to allocate globals info.
> +std::unique_ptr<Module> parseMIR(std::unique_ptr<MemoryBuffer> Contents,
> +                                 SMDiagnostic &Error, LLVMContext
> &Context);
> +
> +} // end namespace llvm
> +
> +#endif
>
> Modified: llvm/trunk/include/llvm/CodeGen/Passes.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/Passes.h?rev=237708&r1=237707&r2=237708&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/Passes.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/Passes.h Tue May 19 13:17:39 2015
> @@ -374,6 +374,10 @@ namespace llvm {
>    createMachineFunctionPrinterPass(raw_ostream &OS,
>                                     const std::string &Banner ="");
>
> +  /// MIRPrinting pass - this pass prints out the LLVM IR into the given
> stream
> +  /// using the MIR serialization format.
> +  MachineFunctionPass *createPrintMIRPass(raw_ostream &OS);
> +
>    /// createCodeGenPreparePass - Transform the code to expose more pattern
>    /// matching during instruction selection.
>    FunctionPass *createCodeGenPreparePass(const TargetMachine *TM =
> nullptr);
> @@ -488,6 +492,10 @@ namespace llvm {
>    /// MachineFunctionPrinterPass - This pass prints out MachineInstr's.
>    extern char &MachineFunctionPrinterPassID;
>
> +  /// MIRPrintingPass - this pass prints out the LLVM IR using the MIR
> +  /// serialization format.
> +  extern char &MIRPrintingPassID;
> +
>    /// TailDuplicate - Duplicate blocks with unconditional branches
>    /// into tails of their predecessors.
>    extern char &TailDuplicateID;
>
> Modified: llvm/trunk/include/llvm/InitializePasses.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/InitializePasses.h?rev=237708&r1=237707&r2=237708&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/InitializePasses.h (original)
> +++ llvm/trunk/include/llvm/InitializePasses.h Tue May 19 13:17:39 2015
> @@ -289,6 +289,7 @@ void initializeLoopVectorizePass(PassReg
>  void initializeSLPVectorizerPass(PassRegistry&);
>  void initializeBBVectorizePass(PassRegistry&);
>  void initializeMachineFunctionPrinterPassPass(PassRegistry&);
> +void initializeMIRPrintingPassPass(PassRegistry&);
>  void initializeStackMapLivenessPass(PassRegistry&);
>  void initializeMachineCombinerPass(PassRegistry &);
>  void initializeLoadCombinePass(PassRegistry&);
>
> Modified: llvm/trunk/include/llvm/Support/YAMLTraits.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/YAMLTraits.h?rev=237708&r1=237707&r2=237708&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/YAMLTraits.h (original)
> +++ llvm/trunk/include/llvm/Support/YAMLTraits.h Tue May 19 13:17:39 2015
> @@ -1090,6 +1090,9 @@ public:
>    bool setCurrentDocument();
>    bool nextDocument();
>
> +  /// Returns the current node that's being parsed by the YAML Parser.
> +  const Node *getCurrentNode() const;
> +
>  private:
>    llvm::SourceMgr                     SrcMgr; // must be before Strm
>    std::unique_ptr<llvm::yaml::Stream> Strm;
>
> Modified: llvm/trunk/lib/CodeGen/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/CMakeLists.txt?rev=237708&r1=237707&r2=237708&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/CMakeLists.txt (original)
> +++ llvm/trunk/lib/CodeGen/CMakeLists.txt Tue May 19 13:17:39 2015
> @@ -128,3 +128,4 @@ add_dependencies(LLVMCodeGen intrinsics_
>
>  add_subdirectory(SelectionDAG)
>  add_subdirectory(AsmPrinter)
> +add_subdirectory(MIR)
>
> Modified: llvm/trunk/lib/CodeGen/LLVMBuild.txt
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LLVMBuild.txt?rev=237708&r1=237707&r2=237708&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/LLVMBuild.txt (original)
> +++ llvm/trunk/lib/CodeGen/LLVMBuild.txt Tue May 19 13:17:39 2015
> @@ -16,10 +16,10 @@
>
>  ;===------------------------------------------------------------------------===;
>
>  [common]
> -subdirectories = AsmPrinter SelectionDAG
> +subdirectories = AsmPrinter SelectionDAG MIR
>
>  [component_0]
>  type = Library
>  name = CodeGen
>  parent = Libraries
> -required_libraries = Analysis Core MC Scalar Support Target TransformUtils
> +required_libraries = Analysis Core MC Scalar Support Target
> TransformUtils MIR
>
> Modified: llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp?rev=237708&r1=237707&r2=237708&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp (original)
> +++ llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp Tue May 19 13:17:39 2015
> @@ -150,12 +150,7 @@ bool LLVMTargetMachine::addPassesToEmitF
>      return true;
>
>    if (StopAfter) {
> -    // FIXME: The intent is that this should eventually write out a YAML
> file,
> -    // containing the LLVM IR, the machine-level IR (when stopping after a
> -    // machine-level pass), and whatever other information is needed to
> -    // deserialize the code and resume compilation.  For now, just write
> the
> -    // LLVM IR.
> -    PM.add(createPrintModulePass(Out));
> +    PM.add(createPrintMIRPass(outs()));
>      return false;
>    }
>
>
> Added: llvm/trunk/lib/CodeGen/MIR/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIR/CMakeLists.txt?rev=237708&view=auto
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/MIR/CMakeLists.txt (added)
> +++ llvm/trunk/lib/CodeGen/MIR/CMakeLists.txt Tue May 19 13:17:39 2015
> @@ -0,0 +1,7 @@
> +add_llvm_library(LLVMMIR
> +  MIRPrinter.cpp
> +  MIRPrintingPass.cpp
> +  MIRParser.cpp
> +  )
> +
> +add_dependencies(LLVMMIR intrinsics_gen)
>
> Added: llvm/trunk/lib/CodeGen/MIR/LLVMBuild.txt
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIR/LLVMBuild.txt?rev=237708&view=auto
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/MIR/LLVMBuild.txt (added)
> +++ llvm/trunk/lib/CodeGen/MIR/LLVMBuild.txt Tue May 19 13:17:39 2015
> @@ -0,0 +1,22 @@
> +;===- ./lib/CodeGen/MIR/LLVMBuild.txt --------------------------*- Conf
> -*--===;
> +;
> +;                     The LLVM Compiler Infrastructure
> +;
> +; This file is distributed under the University of Illinois Open Source
> +; License. See LICENSE.TXT for details.
> +;
>
> +;===------------------------------------------------------------------------===;
> +;
> +; This is an LLVMBuild description file for the components in this
> subdirectory.
> +;
> +; For more information on the LLVMBuild system, please see:
> +;
> +;   http://llvm.org/docs/LLVMBuild.html
> +;
>
> +;===------------------------------------------------------------------------===;
> +
> +[component_0]
> +type = Library
> +name = MIR
> +parent = CodeGen
> +required_libraries = Core Support Target AsmParser
>
> Added: llvm/trunk/lib/CodeGen/MIR/MIRParser.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIR/MIRParser.cpp?rev=237708&view=auto
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/MIR/MIRParser.cpp (added)
> +++ llvm/trunk/lib/CodeGen/MIR/MIRParser.cpp Tue May 19 13:17:39 2015
> @@ -0,0 +1,90 @@
> +//===- MIRParser.cpp - MIR serialization format parser implementation
> -----===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +//
> +// This file implements the class that parses the optional LLVM IR and
> machine
> +// functions that are stored in MIR files.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +#include "llvm/CodeGen/MIR/MIRParser.h"
> +#include "llvm/ADT/StringRef.h"
> +#include "llvm/ADT/STLExtras.h"
> +#include "llvm/AsmParser/Parser.h"
> +#include "llvm/IR/Module.h"
> +#include "llvm/Support/SMLoc.h"
> +#include "llvm/Support/SourceMgr.h"
> +#include "llvm/Support/MemoryBuffer.h"
> +#include "llvm/Support/YAMLTraits.h"
> +#include <memory>
> +
> +using namespace llvm;
> +
> +namespace {
> +
> +/// This class implements the parsing of LLVM IR that's embedded inside a
> MIR
> +/// file.
> +class MIRParserImpl {
> +  SourceMgr SM;
> +  StringRef Filename;
> +  LLVMContext &Context;
> +
> +public:
> +  MIRParserImpl(std::unique_ptr<MemoryBuffer> Contents, StringRef
> Filename,
> +                LLVMContext &Context);
> +
> +  /// Try to parse the optional LLVM module in the MIR file.
> +  ///
> +  /// Return null if an error occurred while parsing the LLVM module.
> +  std::unique_ptr<Module> parseLLVMModule(SMDiagnostic &Error);
> +};
> +
> +} // end anonymous namespace
> +
> +MIRParserImpl::MIRParserImpl(std::unique_ptr<MemoryBuffer> Contents,
> +                             StringRef Filename, LLVMContext &Context)
> +    : SM(), Filename(Filename), Context(Context) {
> +  SM.AddNewSourceBuffer(std::move(Contents), SMLoc());
> +}
> +
> +std::unique_ptr<Module> MIRParserImpl::parseLLVMModule(SMDiagnostic
> &Error) {
> +  yaml::Input In(SM.getMemoryBuffer(SM.getMainFileID())->getBuffer());
> +
> +  // Parse the block scalar manually so that we can return unique pointer
> +  // without having to go trough YAML traits.
> +  if (In.setCurrentDocument()) {
> +    if (const auto *BSN =
> +            dyn_cast_or_null<yaml::BlockScalarNode>(In.getCurrentNode()))
> {
> +      return parseAssembly(MemoryBufferRef(BSN->getValue(), Filename),
> Error,
> +                           Context);
> +    }
> +  }
> +
> +  // Create an new, empty module.
> +  return llvm::make_unique<Module>(Filename, Context);
> +}
> +
> +std::unique_ptr<Module> llvm::parseMIRFile(StringRef Filename,
> +                                           SMDiagnostic &Error,
> +                                           LLVMContext &Context) {
> +  auto FileOrErr = MemoryBuffer::getFile(Filename);
> +  if (std::error_code EC = FileOrErr.getError()) {
> +    Error = SMDiagnostic(Filename, SourceMgr::DK_Error,
> +                         "Could not open input file: " + EC.message());
> +    return std::unique_ptr<Module>();
> +  }
> +  return parseMIR(std::move(FileOrErr.get()), Error, Context);
> +}
> +
> +std::unique_ptr<Module> llvm::parseMIR(std::unique_ptr<MemoryBuffer>
> Contents,
> +                                       SMDiagnostic &Error,
> +                                       LLVMContext &Context) {
> +  auto Filename = Contents->getBufferIdentifier();
> +  MIRParserImpl Parser(std::move(Contents), Filename, Context);
> +  return Parser.parseLLVMModule(Error);
> +}
>
> Added: llvm/trunk/lib/CodeGen/MIR/MIRPrinter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIR/MIRPrinter.cpp?rev=237708&view=auto
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/MIR/MIRPrinter.cpp (added)
> +++ llvm/trunk/lib/CodeGen/MIR/MIRPrinter.cpp Tue May 19 13:17:39 2015
> @@ -0,0 +1,66 @@
> +//===- MIRPrinter.cpp - MIR serialization format printer
> ------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +//
> +// This file implements the class that prints out the LLVM IR and machine
> +// functions using the MIR serialization format.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +#include "MIRPrinter.h"
> +#include "llvm/ADT/STLExtras.h"
> +#include "llvm/IR/Module.h"
> +#include "llvm/Support/MemoryBuffer.h"
> +#include "llvm/Support/raw_ostream.h"
> +#include "llvm/Support/YAMLTraits.h"
> +
> +using namespace llvm;
> +
> +namespace {
> +
> +/// This class prints out the LLVM IR using the MIR serialization format
> and
> +/// YAML I/O.
> +class MIRPrinter {
> +  raw_ostream &OS;
> +
> +public:
> +  MIRPrinter(raw_ostream &OS);
> +
> +  void printModule(const Module &Mod);
> +};
> +
> +} // end anonymous namespace
> +
> +namespace llvm {
> +namespace yaml {
> +
> +/// This struct serializes the LLVM IR module.
> +template <> struct BlockScalarTraits<Module> {
> +  static void output(const Module &Mod, void *Ctxt, raw_ostream &OS) {
> +    Mod.print(OS, nullptr);
> +  }
> +  static StringRef input(StringRef Str, void *Ctxt, Module &Mod) {
> +    llvm_unreachable("LLVM Module is supposed to be parsed separately");
> +    return "";
> +  }
> +};
> +
> +} // end namespace yaml
> +} // end namespace llvm
> +
> +MIRPrinter::MIRPrinter(raw_ostream &OS) : OS(OS) {}
> +
> +void MIRPrinter::printModule(const Module &Mod) {
> +  yaml::Output Out(OS);
> +  Out << const_cast<Module &>(Mod);
> +}
> +
> +void llvm::printMIR(raw_ostream &OS, const Module &Mod) {
> +  MIRPrinter Printer(OS);
> +  Printer.printModule(Mod);
> +}
>
> Added: llvm/trunk/lib/CodeGen/MIR/MIRPrinter.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIR/MIRPrinter.h?rev=237708&view=auto
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/MIR/MIRPrinter.h (added)
> +++ llvm/trunk/lib/CodeGen/MIR/MIRPrinter.h Tue May 19 13:17:39 2015
> @@ -0,0 +1,29 @@
> +//===- MIRPrinter.h - MIR serialization format printer
> --------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +//
> +// This file declares the function that prints out the LLVM IR using the
> MIR
> +// serialization format.
> +// TODO: Print out machine functions.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef LLVM_LIB_CODEGEN_MIR_MIRPRINTER_H
> +#define LLVM_LIB_CODEGEN_MIR_MIRPRINTER_H
> +
> +namespace llvm {
> +
> +class Module;
> +class raw_ostream;
> +
> +/// Print LLVM IR using the MIR serialization format to the given output
> stream.
> +void printMIR(raw_ostream &OS, const Module &Mod);
> +
> +} // end namespace llvm
> +
> +#endif
>
> Added: llvm/trunk/lib/CodeGen/MIR/MIRPrintingPass.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIR/MIRPrintingPass.cpp?rev=237708&view=auto
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/MIR/MIRPrintingPass.cpp (added)
> +++ llvm/trunk/lib/CodeGen/MIR/MIRPrintingPass.cpp Tue May 19 13:17:39 2015
> @@ -0,0 +1,66 @@
> +//===- MIRPrintingPass.cpp - Pass that prints out using the MIR format
> ----===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +//
> +// This file implements a pass that prints out the LLVM module using the
> MIR
> +// serialization format.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +#include "MIRPrinter.h"
> +#include "llvm/CodeGen/Passes.h"
> +#include "llvm/CodeGen/MachineFunction.h"
> +#include "llvm/CodeGen/MachineFunctionPass.h"
> +#include "llvm/Support/Debug.h"
> +#include "llvm/Support/raw_ostream.h"
> +
> +using namespace llvm;
> +
> +namespace {
> +
> +/// This pass prints out the LLVM IR to an output stream using the MIR
> +/// serialization format.
> +struct MIRPrintingPass : public MachineFunctionPass {
> +  static char ID;
> +  raw_ostream &OS;
> +
> +  MIRPrintingPass() : MachineFunctionPass(ID), OS(dbgs()) {}
> +  MIRPrintingPass(raw_ostream &OS) : MachineFunctionPass(ID), OS(OS) {}
> +
> +  const char *getPassName() const override { return "MIR Printing Pass"; }
> +
> +  void getAnalysisUsage(AnalysisUsage &AU) const override {
> +    AU.setPreservesAll();
> +    MachineFunctionPass::getAnalysisUsage(AU);
> +  }
> +
> +  virtual bool runOnMachineFunction(MachineFunction &MF) override {
> +    // TODO: Print out the machine function.
> +    return false;
> +  }
> +
> +  virtual bool doFinalization(Module &M) override {
> +    printMIR(OS, M);
> +    return false;
> +  }
> +};
> +
> +char MIRPrintingPass::ID = 0;
> +
> +} // end anonymous namespace
> +
> +char &llvm::MIRPrintingPassID = MIRPrintingPass::ID;
> +INITIALIZE_PASS(MIRPrintingPass, "mir-printer", "MIR Printer", false,
> false)
> +
> +namespace llvm {
> +
> +MachineFunctionPass *createPrintMIRPass(raw_ostream &OS) {
> +  return new MIRPrintingPass(OS);
> +}
> +
> +} // end namespace llvm
>
> Added: llvm/trunk/lib/CodeGen/MIR/Makefile
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIR/Makefile?rev=237708&view=auto
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/MIR/Makefile (added)
> +++ llvm/trunk/lib/CodeGen/MIR/Makefile Tue May 19 13:17:39 2015
> @@ -0,0 +1,13 @@
> +##===- lib/CodeGen/MIR/Makefile ----------------------------*- Makefile
> -*-===##
> +#
> +#                     The LLVM Compiler Infrastructure
> +#
> +# This file is distributed under the University of Illinois Open Source
> +# License. See LICENSE.TXT for details.
> +#
>
> +##===----------------------------------------------------------------------===##
> +
> +LEVEL = ../../..
> +LIBRARYNAME = LLVMMIR
> +
> +include $(LEVEL)/Makefile.common
>
> Modified: llvm/trunk/lib/CodeGen/Makefile
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/Makefile?rev=237708&r1=237707&r2=237708&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/Makefile (original)
> +++ llvm/trunk/lib/CodeGen/Makefile Tue May 19 13:17:39 2015
> @@ -9,7 +9,7 @@
>
>  LEVEL = ../..
>  LIBRARYNAME = LLVMCodeGen
> -PARALLEL_DIRS = SelectionDAG AsmPrinter
> +PARALLEL_DIRS = SelectionDAG AsmPrinter MIR
>  BUILD_ARCHIVE = 1
>
>  include $(LEVEL)/Makefile.common
>
> Modified: llvm/trunk/lib/Support/YAMLTraits.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/YAMLTraits.cpp?rev=237708&r1=237707&r2=237708&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Support/YAMLTraits.cpp (original)
> +++ llvm/trunk/lib/Support/YAMLTraits.cpp Tue May 19 13:17:39 2015
> @@ -97,6 +97,10 @@ bool Input::nextDocument() {
>    return ++DocIterator != Strm->end();
>  }
>
> +const Node *Input::getCurrentNode() const {
> +  return CurrentNode ? CurrentNode->_node : nullptr;
> +}
> +
>  bool Input::mapTag(StringRef Tag, bool Default) {
>    std::string foundTag = CurrentNode->_node->getVerbatimTag();
>    if (foundTag.empty()) {
>
> Modified: llvm/trunk/test/CodeGen/Generic/stop-after.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Generic/stop-after.ll?rev=237708&r1=237707&r2=237708&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/Generic/stop-after.ll (original)
> +++ llvm/trunk/test/CodeGen/Generic/stop-after.ll Tue May 19 13:17:39 2015
> @@ -1,9 +1,10 @@
>  ; RUN: llc < %s -debug-pass=Structure -stop-after=loop-reduce -o
> /dev/null 2>&1 | FileCheck %s -check-prefix=STOP
>  ; RUN: llc < %s -debug-pass=Structure -start-after=loop-reduce -o
> /dev/null 2>&1 | FileCheck %s -check-prefix=START
>
> -; STOP: -loop-reduce -print-module
> +; STOP: -loop-reduce
>  ; STOP: Loop Strength Reduction
>  ; STOP-NEXT: Machine Function Analysis
> +; STOP-NEXT: MIR Printing Pass
>
>  ; START: -machine-branch-prob -gc-lowering
>  ; START: FunctionPass Manager
>
> Added: llvm/trunk/test/CodeGen/MIR/lit.local.cfg
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/lit.local.cfg?rev=237708&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/MIR/lit.local.cfg (added)
> +++ llvm/trunk/test/CodeGen/MIR/lit.local.cfg Tue May 19 13:17:39 2015
> @@ -0,0 +1,2 @@
> +config.suffixes = ['.mir']
> +
>
> Added: llvm/trunk/test/CodeGen/MIR/llvmIR.mir
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/llvmIR.mir?rev=237708&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/MIR/llvmIR.mir (added)
> +++ llvm/trunk/test/CodeGen/MIR/llvmIR.mir Tue May 19 13:17:39 2015
> @@ -0,0 +1,35 @@
> +# RUN: ~/build/llvm/bin/llc -start-after branch-folder -stop-after
> branch-folder -o /dev/null %s | FileCheck %s
> +# This test ensures that the LLVM IR that's embedded with MIR is parsed
> +# correctly.
> +
> +--- |
> +  target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
> +  target triple = "x86_64-apple-darwin14.3.0"
> +
> +  ; CHECK: define i32 @foo(i32 %x, i32 %y)
> +  ; CHECK: %z = alloca i32, align 4
> +  ; CHECK: store i32 %x, i32* %z, align 4
> +  ; CHECK: br label %Test
> +  ; CHECK: Test:
> +  ; CHECK: %m = load i32, i32* %z, align 4
> +  ; CHECK: %cond = icmp eq i32 %y, %m
> +  ; CHECK: br i1 %cond, label %IfEqual, label %IfUnequal
> +  ; CHECK: IfEqual:
> +  ; CHECK: ret i32 1
> +  ; CHECK: IfUnequal:
> +  ; CHECK: ret i32 0
> +  define i32 @foo(i32 %x, i32 %y) {
> +    %z = alloca i32, align 4
> +    store i32 %x, i32* %z, align 4
> +    br label %Test
> +  Test:
> +    %m = load i32, i32* %z, align 4
> +    %cond = icmp eq i32 %y, %m
> +    br i1 %cond, label %IfEqual, label %IfUnequal
> +  IfEqual:
> +    ret i32 1
> +  IfUnequal:
> +    ret i32 0
> +  }
> +
> +...
>
> Added: llvm/trunk/test/CodeGen/MIR/llvmIRMissing.mir
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/llvmIRMissing.mir?rev=237708&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/MIR/llvmIRMissing.mir (added)
> +++ llvm/trunk/test/CodeGen/MIR/llvmIRMissing.mir Tue May 19 13:17:39 2015
> @@ -0,0 +1,5 @@
> +# RUN: ~/build/llvm/bin/llc -start-after branch-folder -stop-after
> branch-folder -o /dev/null %s
> +# This test ensures that the MIR parser accepts files without the LLVM IR.
> +
> +---
> +...
>
> Modified: llvm/trunk/tools/llc/llc.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llc/llc.cpp?rev=237708&r1=237707&r2=237708&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/llc/llc.cpp (original)
> +++ llvm/trunk/tools/llc/llc.cpp Tue May 19 13:17:39 2015
> @@ -20,6 +20,7 @@
>  #include "llvm/CodeGen/CommandFlags.h"
>  #include "llvm/CodeGen/LinkAllAsmWriterComponents.h"
>  #include "llvm/CodeGen/LinkAllCodegenComponents.h"
> +#include "llvm/CodeGen/MIR/MIRParser.h"
>  #include "llvm/IR/DataLayout.h"
>  #include "llvm/IR/IRPrintingPasses.h"
>  #include "llvm/IR/LLVMContext.h"
> @@ -109,6 +110,8 @@ GetOutputStream(const char *TargetName,
>        StringRef IFN = InputFilename;
>        if (IFN.endswith(".bc") || IFN.endswith(".ll"))
>          OutputFilename = IFN.drop_back(3);
> +      else if (IFN.endswith(".mir"))
> +        OutputFilename = IFN.drop_back(4);
>        else
>          OutputFilename = IFN;
>
> @@ -214,7 +217,10 @@ static int compileModule(char **argv, LL
>
>    // If user just wants to list available options, skip module loading
>    if (!SkipModule) {
> -    M = parseIRFile(InputFilename, Err, Context);
> +    if (StringRef(InputFilename).endswith_lower(".mir"))
> +      M = parseMIRFile(InputFilename, Err, Context);
> +    else
> +      M = parseIRFile(InputFilename, Err, Context);
>      if (!M) {
>        Err.print(argv[0], errs());
>        return 1;
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150519/134400ec/attachment.html>


More information about the llvm-commits mailing list