// Register information
bool TracksRegLiveness = false;
bool HasWinCFI = false;
+
+ bool CallsEHReturn = false;
+ bool CallsUnwindInit = false;
+ bool HasEHCatchret = false;
+ bool HasEHScopes = false;
+ bool HasEHFunclets = false;
+
bool FailsVerification = false;
bool TracksDebugUserValues = false;
std::vector<VirtualRegisterDefinition> VirtualRegisters;
YamlIO.mapOptional("failedISel", MF.FailedISel, false);
YamlIO.mapOptional("tracksRegLiveness", MF.TracksRegLiveness, false);
YamlIO.mapOptional("hasWinCFI", MF.HasWinCFI, false);
+
+ YamlIO.mapOptional("callsEHReturn", MF.CallsEHReturn, false);
+ YamlIO.mapOptional("callsUnwindInit", MF.CallsUnwindInit, false);
+ YamlIO.mapOptional("hasEHCatchret", MF.HasEHCatchret, false);
+ YamlIO.mapOptional("hasEHScopes", MF.HasEHScopes, false);
+ YamlIO.mapOptional("hasEHFunclets", MF.HasEHFunclets, false);
+
YamlIO.mapOptional("failsVerification", MF.FailsVerification, false);
YamlIO.mapOptional("tracksDebugUserValues", MF.TracksDebugUserValues,
false);
MF.setExposesReturnsTwice(YamlMF.ExposesReturnsTwice);
MF.setHasWinCFI(YamlMF.HasWinCFI);
+ MF.setCallsEHReturn(YamlMF.CallsEHReturn);
+ MF.setCallsUnwindInit(YamlMF.CallsUnwindInit);
+ MF.setHasEHCatchret(YamlMF.HasEHCatchret);
+ MF.setHasEHScopes(YamlMF.HasEHScopes);
+ MF.setHasEHFunclets(YamlMF.HasEHFunclets);
+
if (YamlMF.Legalized)
MF.getProperties().set(MachineFunctionProperties::Property::Legalized);
if (YamlMF.RegBankSelected)
YamlMF.ExposesReturnsTwice = MF.exposesReturnsTwice();
YamlMF.HasWinCFI = MF.hasWinCFI();
+ YamlMF.CallsEHReturn = MF.callsEHReturn();
+ YamlMF.CallsUnwindInit = MF.callsUnwindInit();
+ YamlMF.HasEHCatchret = MF.hasEHCatchret();
+ YamlMF.HasEHScopes = MF.hasEHScopes();
+ YamlMF.HasEHFunclets = MF.hasEHFunclets();
+
YamlMF.Legalized = MF.getProperties().hasProperty(
MachineFunctionProperties::Property::Legalized);
YamlMF.RegBankSelected = MF.getProperties().hasProperty(
--- /dev/null
+# RUN: llc -simplify-mir=0 -march=x86-64 -run-pass=none -o - %s | FileCheck -check-prefixes=FULL,ALL %s
+# RUN: llc -simplify-mir=1 -march=x86-64 -run-pass=none -o - %s | FileCheck -check-prefixes=SIMPLE,ALL %s
+
+# This test ensures that the MIR parser parses callee saved information in the
+# stack objects correctly.
+
+# ALL: name: func0
+# ALL: callsEHReturn: true
+# ALL: callsUnwindInit: true
+# ALL: hasEHCatchret: true
+# ALL: hasEHScopes: true
+# ALL: hasEHFunclets: true
+
+---
+name: func0
+callsEHReturn: true
+callsUnwindInit: true
+hasEHCatchret: true
+hasEHScopes: true
+hasEHFunclets: true
+body: |
+ bb.0:
+...
+
+# ALL: name: func1
+# FULL: callsEHReturn: false
+# FULL: callsUnwindInit: true
+# FULL: hasEHCatchret: false
+# FULL: hasEHScopes: true
+# FULL: hasEHFunclets: false
+
+# SIMPLE-NOT: callsEHReturn
+# SIMPLE: callsUnwindInit: true
+# SIMPLE-NOT: hasEHCatchret
+# SIMPLE: hasEHScopes: true
+# SIMPLE-NOT: hasEHFunclets
+---
+name: func1
+tracksRegLiveness: true
+callsEHReturn: false
+callsUnwindInit: true
+hasEHCatchret: false
+hasEHScopes: true
+hasEHFunclets: false
+body: |
+ bb.0:
+...
+
+# ALL: name: func2
+# FULL: callsEHReturn: true
+# FULL: callsUnwindInit: false
+# FULL: hasEHCatchret: true
+# FULL: hasEHScopes: false
+# FULL: hasEHFunclets: false
+
+# SIMPLE: callsEHReturn: true
+# SIMPLE-NOT: callsUnwindInit
+# SIMPLE: hasEHCatchret: true
+# SIMPLE-NOT hasEHScopes
+# SIMPLE-NOT: hasEHFunclets
+---
+name: func2
+tracksRegLiveness: true
+callsEHReturn: true
+callsUnwindInit: false
+hasEHCatchret: true
+hasEHScopes: false
+hasEHFunclets: false
+body: |
+ bb.0:
+...