1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 12:41:49 +01:00

llc: Add ability to parse mir from stdin

- Add -x <language> option to switch between IR and MIR inputs.
- Change MIR parser to read from stdin when filename is '-'.
- Add a simple mir roundtrip test.

llvm-svn: 304825
This commit is contained in:
Matthias Braun 2017-06-06 20:06:57 +00:00
parent 5f498de20b
commit 938b489a87
3 changed files with 32 additions and 2 deletions

View File

@ -869,7 +869,7 @@ bool MIRParser::parseMachineFunctions(Module &M, MachineModuleInfo &MMI) {
std::unique_ptr<MIRParser> llvm::createMIRParserFromFile(StringRef Filename,
SMDiagnostic &Error,
LLVMContext &Context) {
auto FileOrErr = MemoryBuffer::getFile(Filename);
auto FileOrErr = MemoryBuffer::getFileOrSTDIN(Filename);
if (std::error_code EC = FileOrErr.getError()) {
Error = SMDiagnostic(Filename, SourceMgr::DK_Error,
"Could not open input file: " + EC.message());

View File

@ -0,0 +1,20 @@
# RUN: llc -o - %s -mtriple=x86_64-- -run-pass=none | llc -o - -x mir - -mtriple=x86_64-- -run-pass=none | FileCheck %s
---
# CHECK-LABEL: name: func0
# CHECK: registers:
# CHECK: - { id: 0, class: gr32, preferred-register: '' }
# CHECK: - { id: 1, class: gr32, preferred-register: '' }
# CHECK: body: |
# CHECK: bb.0:
# CHECK: %0 = MOV32r0 implicit-def %eflags
# CHECK: dead %1 = COPY %0
# CHECK: MOV32mr undef %rcx, 1, _, 0, _, killed %0 :: (volatile store 4)
# CHECK: RETQ undef %eax
name: func0
body: |
bb.0:
%0 : gr32 = MOV32r0 implicit-def %eflags
dead %1 : gr32 = COPY %0
MOV32mr undef %rcx, 1, _, 0, _, killed %0 :: (volatile store 4)
RETQ undef %eax
...

View File

@ -61,6 +61,9 @@ using namespace llvm;
static cl::opt<std::string>
InputFilename(cl::Positional, cl::desc("<input bitcode>"), cl::init("-"));
static cl::opt<std::string>
InputLanguage("x", cl::desc("Input language ('ir' or 'mir')"));
static cl::opt<std::string>
OutputFilename("o", cl::desc("Output filename"), cl::value_desc("filename"));
@ -335,6 +338,12 @@ int main(int argc, char **argv) {
llvm::make_unique<yaml::Output>(YamlFile->os()));
}
if (InputLanguage != "" && InputLanguage != "ir" &&
InputLanguage != "mir") {
errs() << argv[0] << "Input language must be '', 'IR' or 'MIR'\n";
return 1;
}
// Compile the module TimeCompilations times to give better compile time
// metrics.
for (unsigned I = TimeCompilations; I; --I)
@ -398,7 +407,8 @@ static int compileModule(char **argv, LLVMContext &Context) {
// If user just wants to list available options, skip module loading
if (!SkipModule) {
if (StringRef(InputFilename).endswith_lower(".mir")) {
if (InputLanguage == "mir" ||
(InputLanguage == "" && StringRef(InputFilename).endswith(".mir"))) {
MIR = createMIRParserFromFile(InputFilename, Err, Context);
if (MIR)
M = MIR->parseIRModule();