MIR Serialization: Print and parse simple machine function attributes.

This commit serializes the simple, scalar attributes from the 
'MachineFunction' class.

Reviewers: Duncan P. N. Exon Smith

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

llvm-svn: 239790
This commit is contained in:
Alex Lorenz 2015-06-16 00:10:47 +00:00
parent 47972afd10
commit 5b5f97537f
4 changed files with 48 additions and 0 deletions

View 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);
}
};

View 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;
}

View 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;
}

View File

@ -10,15 +10,49 @@
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
...