bool AdjustsStack = false;
bool HasCalls = false;
StringValue StackProtector;
- // TODO: Serialize FunctionContextIdx
+ StringValue FunctionContext;
unsigned MaxCallFrameSize = ~0u; ///< ~0u means: not computed yet.
unsigned CVBytesOfCalleeSavedRegisters = 0;
bool HasOpaqueSPAdjustment = false;
MaxAlignment == Other.MaxAlignment &&
AdjustsStack == Other.AdjustsStack && HasCalls == Other.HasCalls &&
StackProtector == Other.StackProtector &&
+ FunctionContext == Other.FunctionContext &&
MaxCallFrameSize == Other.MaxCallFrameSize &&
CVBytesOfCalleeSavedRegisters ==
Other.CVBytesOfCalleeSavedRegisters &&
YamlIO.mapOptional("hasCalls", MFI.HasCalls, false);
YamlIO.mapOptional("stackProtector", MFI.StackProtector,
StringValue()); // Don't print it out when it's empty.
+ YamlIO.mapOptional("functionContext", MFI.FunctionContext,
+ StringValue()); // Don't print it out when it's empty.
YamlIO.mapOptional("maxCallFrameSize", MFI.MaxCallFrameSize, (unsigned)~0);
YamlIO.mapOptional("cvBytesOfCalleeSavedRegisters",
MFI.CVBytesOfCalleeSavedRegisters, 0U);
return error(Error, YamlMFI.StackProtector.SourceRange);
MFI.setStackProtectorIndex(FI);
}
+
+ if (!YamlMFI.FunctionContext.Value.empty()) {
+ SMDiagnostic Error;
+ int FI;
+ if (parseStackObjectReference(PFS, FI, YamlMFI.FunctionContext.Value, Error))
+ return error(Error, YamlMFI.FunctionContext.SourceRange);
+ MFI.setFunctionContextIndex(FI);
+ }
+
return false;
}
.printStackObjectReference(MFI.getStackProtectorIndex());
}
+ if (MFI.hasFunctionContextIndex()) {
+ raw_string_ostream StrOS(YMF.FrameInfo.FunctionContext.Value);
+ MIPrinter(StrOS, MST, RegisterMaskIds, StackObjectOperandMapping)
+ .printStackObjectReference(MFI.getFunctionContextIndex());
+ }
+
// Print the debug variable information.
for (const MachineFunction::VariableDbgInfo &DebugVar :
MF.getVariableDbgInfo()) {
# CHECK-NEXT: adjustsStack: false
# CHECK-NEXT: hasCalls: false
# CHECK-NEXT: stackProtector: ''
+# CHECK-NEXT: functionContext: ''
# CHECK-NEXT: maxCallFrameSize:
# CHECK-NEXT: cvBytesOfCalleeSavedRegisters: 0
# CHECK-NEXT: hasOpaqueSPAdjustment: false
---
name: test2
tracksRegLiveness: true
+stack:
+ - { id: 0, offset: -40, size: 8, alignment: 8 }
# CHECK: test2
# CHECK: frameInfo:
# CHECK-NEXT: adjustsStack: true
# CHECK-NEXT: hasCalls: true
# CHECK-NEXT: stackProtector: ''
+# CHECK-NEXT: functionContext: '%stack.0'
# CHECK-NEXT: maxCallFrameSize: 4
# CHECK-NEXT: cvBytesOfCalleeSavedRegisters: 8
# CHECK-NEXT: hasOpaqueSPAdjustment: true
maxAlignment: 4
adjustsStack: true
hasCalls: true
+ functionContext: '%stack.0'
maxCallFrameSize: 4
cvBytesOfCalleeSavedRegisters: 8
hasOpaqueSPAdjustment: true
--- /dev/null
+# RUN: not llc -march=x86-64 -run-pass=none -o /dev/null %s 2>&1 | FileCheck %s
+
+---
+name: test
+frameInfo:
+ # CHECK: [[@LINE+1]]:22: expected a stack object
+ functionContext: '0'
+stack:
+ - { id: 0, offset: -24, size: 8, alignment: 8 }
+body: |
+ bb.0:
+
+...