MIR Serialization: Print and parse simple machine function attributes.
authorAlex Lorenz <arphaman@gmail.com>
Tue, 16 Jun 2015 00:10:47 +0000 (00:10 +0000)
committerAlex Lorenz <arphaman@gmail.com>
Tue, 16 Jun 2015 00:10:47 +0000 (00:10 +0000)
This commit serializes the simple, scalar attributes from the
'MachineFunction' class.

Reviewers: Duncan P. N. Exon Smith

Differential Revision: http://reviews.llvm.org/D10449

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

include/llvm/CodeGen/MIRYamlMapping.h
lib/CodeGen/MIRParser/MIRParser.cpp
lib/CodeGen/MIRPrinter.cpp
test/CodeGen/MIR/machine-function.mir

index f9d4c7471b93d19f00701f71e2b919a79d1bf13e..c7489ba8bfd7979251a781f8323428132ed4b1f3 100644 (file)
@@ -26,11 +26,17 @@ namespace yaml {
 
 struct MachineFunction {
   StringRef Name;
+  unsigned Alignment;
+  bool ExposesReturnsTwice;
+  bool HasInlineAsm;
 };
 
 template <> struct MappingTraits<MachineFunction> {
   static void mapping(IO &YamlIO, MachineFunction &MF) {
     YamlIO.mapRequired("name", MF.Name);
+    YamlIO.mapOptional("alignment", MF.Alignment);
+    YamlIO.mapOptional("exposesReturnsTwice", MF.ExposesReturnsTwice);
+    YamlIO.mapOptional("hasInlineAsm", MF.HasInlineAsm);
   }
 };
 
index 689615b8b6e6afa5c54ee74c446d47132336086d..acd3c1130a586d15bddfc47d31066b1c174f8173 100644 (file)
@@ -190,6 +190,11 @@ bool MIRParserImpl::initializeMachineFunction(MachineFunction &MF) {
     return error(Twine("no machine function information for function '") +
                  MF.getName() + "' in the MIR file");
   // TODO: Recreate the machine function.
+  const yaml::MachineFunction &YamlMF = *It->getValue();
+  if (YamlMF.Alignment)
+    MF.setAlignment(YamlMF.Alignment);
+  MF.setExposesReturnsTwice(YamlMF.ExposesReturnsTwice);
+  MF.setHasInlineAsm(YamlMF.HasInlineAsm);
   return false;
 }
 
index 36bbaf94a158fac834d6f8a90db83cb2d74e513c..b2bb2f9278d8b2b5f0cf4817dfbdf8d028ea5834 100644 (file)
@@ -58,6 +58,9 @@ template <> struct BlockScalarTraits<Module> {
 void MIRPrinter::print(const MachineFunction &MF) {
   yaml::MachineFunction YamlMF;
   YamlMF.Name = MF.getName();
+  YamlMF.Alignment = MF.getAlignment();
+  YamlMF.ExposesReturnsTwice = MF.exposesReturnsTwice();
+  YamlMF.HasInlineAsm = MF.hasInlineAsm();
   yaml::Output Out(OS);
   Out << YamlMF;
 }
index 679bfd2d162099c1ed44a9696491c2d6fb26e026..a3c1d1d739279b350d33248629f087a53a409cc7 100644 (file)
   define i32 @bar() {
     ret i32 0
   }
+
+  define i32 @func() {
+    ret i32 0
+  }
+
+  define i32 @func2() {
+    ret i32 0
+  }
   
 ...
 ---
 # CHECK: name: foo
+# CHECK-NEXT: alignment:
+# CHECK-NEXT: exposesReturnsTwice: false
+# CHECK-NEXT: hasInlineAsm: false
 # CHECK-NEXT: ...
 name:            foo
 ...
 ---
 # CHECK: name: bar
+# CHECK-NEXT: alignment:
+# CHECK-NEXT: exposesReturnsTwice: false
+# CHECK-NEXT: hasInlineAsm: false
 # CHECK-NEXT: ...
 name:            bar
 ...
+---
+# CHECK: name: func
+# CHECK-NEXT: alignment: 8
+# CHECK-NEXT: exposesReturnsTwice: false
+# CHECK-NEXT: hasInlineAsm: false
+# CHECK-NEXT: ...
+name:            func
+alignment:       8
+...
+---
+# CHECK: name: func2
+# CHECK-NEXT: alignment: 16
+# CHECK-NEXT: exposesReturnsTwice: true
+# CHECK-NEXT: hasInlineAsm: true
+# CHECK-NEXT: ...
+name:            func2
+alignment:       16
+exposesReturnsTwice: true
+hasInlineAsm:    true
+...