diff options
author | Artyom Skrobov <Artyom.Skrobov@arm.com> | 2014-02-14 17:19:07 +0000 |
---|---|---|
committer | Artyom Skrobov <Artyom.Skrobov@arm.com> | 2014-02-14 17:19:07 +0000 |
commit | e228078ca6de1c5316ec53a370568ea5d824f8e5 (patch) | |
tree | 7dfa79dfdd4dc4e51be2616dae57ac8876661dae /lib/CodeGen/AsmPrinter | |
parent | 54136cad2ea9f322849ce49b299860454fc97368 (diff) | |
download | llvm-e228078ca6de1c5316ec53a370568ea5d824f8e5.tar.gz llvm-e228078ca6de1c5316ec53a370568ea5d824f8e5.tar.bz2 llvm-e228078ca6de1c5316ec53a370568ea5d824f8e5.tar.xz |
Generate the DWARF stack frame decode operations in the function prologue for ARM/Thumb functions.
Patch by Keith Walker!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@201423 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/AsmPrinter')
-rw-r--r-- | lib/CodeGen/AsmPrinter/ARMException.cpp | 18 | ||||
-rw-r--r-- | lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 5 | ||||
-rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfException.h | 4 |
3 files changed, 25 insertions, 2 deletions
diff --git a/lib/CodeGen/AsmPrinter/ARMException.cpp b/lib/CodeGen/AsmPrinter/ARMException.cpp index 6e79bef8d0..403feb4583 100644 --- a/lib/CodeGen/AsmPrinter/ARMException.cpp +++ b/lib/CodeGen/AsmPrinter/ARMException.cpp @@ -37,7 +37,8 @@ using namespace llvm; ARMException::ARMException(AsmPrinter *A) - : DwarfException(A) {} + : DwarfException(A), + shouldEmitCFI(false) {} ARMException::~ARMException() {} @@ -46,7 +47,11 @@ ARMTargetStreamer &ARMException::getTargetStreamer() { return static_cast<ARMTargetStreamer &>(TS); } +/// endModule - Emit all exception information that should come after the +/// content. void ARMException::endModule() { + if (shouldEmitCFI) + Asm->OutStreamer.EmitCFISections(false, true); } /// beginFunction - Gather pre-function exception information. Assumes it's @@ -56,11 +61,22 @@ void ARMException::beginFunction(const MachineFunction *MF) { if (Asm->MF->getFunction()->needsUnwindTableEntry()) Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("eh_func_begin", Asm->getFunctionNumber())); + // See if we need call frame info. + AsmPrinter::CFIMoveType MoveType = Asm->needsCFIMoves(); + assert(MoveType != AsmPrinter::CFI_M_EH && + "non-EH CFI not yet supported in prologue with EHABI lowering"); + if (MoveType == AsmPrinter::CFI_M_Debug) { + shouldEmitCFI = true; + Asm->OutStreamer.EmitCFIStartProc(false); + } } /// endFunction - Gather and emit post-function exception information. /// void ARMException::endFunction(const MachineFunction *) { + if (shouldEmitCFI) + Asm->OutStreamer.EmitCFIEndProc(); + ARMTargetStreamer &ATS = getTargetStreamer(); if (!Asm->MF->getFunction()->needsUnwindTableEntry()) ATS.emitCantUnwind(); diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 2f15c97f2d..63b4bb4296 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -697,7 +697,10 @@ bool AsmPrinter::needsSEHMoves() { void AsmPrinter::emitPrologLabel(const MachineInstr &MI) { const MCSymbol *Label = MI.getOperand(0).getMCSymbol(); - if (MAI->getExceptionHandlingType() != ExceptionHandling::DwarfCFI) + ExceptionHandling::ExceptionsType ExceptionHandlingType = + MAI->getExceptionHandlingType(); + if (ExceptionHandlingType != ExceptionHandling::DwarfCFI && + ExceptionHandlingType != ExceptionHandling::ARM) return; if (needsCFIMoves() == CFI_M_None) diff --git a/lib/CodeGen/AsmPrinter/DwarfException.h b/lib/CodeGen/AsmPrinter/DwarfException.h index 5a2ee9e490..a28eaf0c14 100644 --- a/lib/CodeGen/AsmPrinter/DwarfException.h +++ b/lib/CodeGen/AsmPrinter/DwarfException.h @@ -186,6 +186,10 @@ class ARMException : public DwarfException { void EmitTypeInfos(unsigned TTypeEncoding); ARMTargetStreamer &getTargetStreamer(); + /// shouldEmitCFI - Per-function flag to indicate if frame CFI info + /// should be emitted. + bool shouldEmitCFI; + public: //===--------------------------------------------------------------------===// // Main entry points. |