Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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 llvm-svn: 237708
- Loading branch information
Showing
21 changed files
with
417 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
add_llvm_library(LLVMMIR | ||
MIRPrinter.cpp | ||
MIRPrintingPass.cpp | ||
MIRParser.cpp | ||
) | ||
|
||
add_dependencies(LLVMMIR intrinsics_gen) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
Oops, something went wrong.