]> granicus.if.org Git - llvm/commitdiff
llc: Add ability to parse mir from stdin
authorMatthias Braun <matze@braunis.de>
Tue, 6 Jun 2017 20:06:57 +0000 (20:06 +0000)
committerMatthias Braun <matze@braunis.de>
Tue, 6 Jun 2017 20:06:57 +0000 (20:06 +0000)
- 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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@304825 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/MIRParser/MIRParser.cpp
test/CodeGen/MIR/X86/roundtrip.mir [new file with mode: 0644]
tools/llc/llc.cpp

index cdeba007458f9b1b26c0ff42f49b3b0747e2a9e4..78b57f357781e83ab3950528070e7ec7c52c0c11 100644 (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());
diff --git a/test/CodeGen/MIR/X86/roundtrip.mir b/test/CodeGen/MIR/X86/roundtrip.mir
new file mode 100644 (file)
index 0000000..c697f73
--- /dev/null
@@ -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
+...
index 10fb9f623325d2e63402e8c058d182a6eb81bf4c..e71c3c5bb705f3bf15e5ed77a202da25d6e450ac 100644 (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();