Index: llvm/include/llvm/CodeGen/MIRYamlMapping.h =================================================================== --- llvm/include/llvm/CodeGen/MIRYamlMapping.h +++ llvm/include/llvm/CodeGen/MIRYamlMapping.h @@ -694,6 +694,13 @@ // 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 VirtualRegisters; @@ -724,6 +731,13 @@ 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); Index: llvm/lib/CodeGen/MIRParser/MIRParser.cpp =================================================================== --- llvm/lib/CodeGen/MIRParser/MIRParser.cpp +++ llvm/lib/CodeGen/MIRParser/MIRParser.cpp @@ -458,6 +458,12 @@ 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) Index: llvm/lib/CodeGen/MIRPrinter.cpp =================================================================== --- llvm/lib/CodeGen/MIRPrinter.cpp +++ llvm/lib/CodeGen/MIRPrinter.cpp @@ -195,6 +195,12 @@ 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( Index: llvm/test/CodeGen/MIR/X86/exception-function-state.mir =================================================================== --- /dev/null +++ llvm/test/CodeGen/MIR/X86/exception-function-state.mir @@ -0,0 +1,71 @@ +# 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: +...