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

Alex Lorenz arphaman at gmail.com
Tue May 19 11:17:40 PDT 2015


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;





More information about the llvm-commits mailing list