diff options
| author | Duncan Sands <baldrick@free.fr> | 2009-08-31 16:45:16 +0000 |
|---|---|---|
| committer | Duncan Sands <baldrick@free.fr> | 2009-08-31 16:45:16 +0000 |
| commit | 9cf8bcb69dc86e7d7f851dc51084179796623b2e (patch) | |
| tree | ea45bbaabd05be86d05c76aef3845e555a1202f1 /llvm/lib/CodeGen/AsmPrinter/DwarfException.cpp | |
| parent | 5778fce14148ae0ccf5a6bb5b940e66b33653e5c (diff) | |
| download | bcm5719-llvm-9cf8bcb69dc86e7d7f851dc51084179796623b2e.tar.gz bcm5719-llvm-9cf8bcb69dc86e7d7f851dc51084179796623b2e.zip | |
Revert commit 80428. It completely broke exception
handling on x86-32 linux.
llvm-svn: 80592
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/DwarfException.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfException.cpp | 47 |
1 files changed, 17 insertions, 30 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfException.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfException.cpp index 0371d64e91d..0b3affe07ee 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfException.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfException.cpp @@ -22,7 +22,6 @@ #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetFrameInfo.h" #include "llvm/Target/TargetLoweringObjectFile.h" -#include "llvm/Target/TargetLowering.h" #include "llvm/Target/TargetOptions.h" #include "llvm/Target/TargetRegisterInfo.h" #include "llvm/Support/Dwarf.h" @@ -81,7 +80,6 @@ void DwarfException::EmitCIE(const Function *Personality, unsigned Index) { EmitLabel("eh_frame_common_begin", Index); Asm->EmitInt32((int)0); Asm->EOL("CIE Identifier Tag"); - Asm->EmitInt8(dwarf::DW_CIE_VERSION); Asm->EOL("CIE Version"); @@ -93,29 +91,23 @@ void DwarfException::EmitCIE(const Function *Personality, unsigned Index) { // Round out reader. Asm->EmitULEB128Bytes(1); Asm->EOL("CIE Code Alignment Factor"); - Asm->EmitSLEB128Bytes(stackGrowth); Asm->EOL("CIE Data Alignment Factor"); - Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), true)); Asm->EOL("CIE Return Address Column"); - unsigned Encoding = 0; - // If there is a personality, we need to indicate the function's location. if (Personality) { Asm->EmitULEB128Bytes(7); Asm->EOL("Augmentation Size"); if (MAI->getNeedsIndirectEncoding()) { - Encoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4 | - dwarf::DW_EH_PE_indirect; - Asm->EmitInt8(Encoding); - Asm->EOL("Personality", Encoding); + Asm->EmitInt8(dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4 | + dwarf::DW_EH_PE_indirect); + Asm->EOL("Personality (pcrel sdata4 indirect)"); } else { - Encoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4; - Asm->EmitInt8(Encoding); - Asm->EOL("Personality", Encoding); + Asm->EmitInt8(dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4); + Asm->EOL("Personality (pcrel sdata4)"); } PrintRelDirective(true); @@ -126,20 +118,17 @@ void DwarfException::EmitCIE(const Function *Personality, unsigned Index) { O << "-" << MAI->getPCSymbol(); Asm->EOL("Personality"); - Encoding = Asm->TM.getTargetLowering()->getPreferredLSDADataFormat(); - Asm->EmitInt8(Encoding); - Asm->EOL("LSDA Encoding", Encoding); + Asm->EmitInt8(dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4); + Asm->EOL("LSDA Encoding (pcrel sdata4)"); - Encoding = Asm->TM.getTargetLowering()->getPreferredFDEDataFormat(); - Asm->EmitInt8(Encoding); - Asm->EOL("FDE Encoding", Encoding); + Asm->EmitInt8(dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4); + Asm->EOL("FDE Encoding (pcrel sdata4)"); } else { Asm->EmitULEB128Bytes(1); Asm->EOL("Augmentation Size"); - Encoding = Asm->TM.getTargetLowering()->getPreferredFDEDataFormat(); - Asm->EmitInt8(Encoding); - Asm->EOL("FDE Encoding", Encoding); + Asm->EmitInt8(dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4); + Asm->EOL("FDE Encoding (pcrel sdata4)"); } // Indicate locations of general callee saved registers in frame. @@ -163,7 +152,6 @@ void DwarfException::EmitFDE(const FunctionEHFrameInfo &EHFrameInfo) { "Should not emit 'available externally' functions at all"); const Function *TheFunc = EHFrameInfo.function; - bool is4Byte = TD->getPointerSize() == sizeof(int32_t); Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getEHFrameSection()); @@ -207,22 +195,23 @@ void DwarfException::EmitFDE(const FunctionEHFrameInfo &EHFrameInfo) { Asm->EOL("FDE CIE offset"); - EmitReference("eh_func_begin", EHFrameInfo.Number, true, is4Byte); + EmitReference("eh_func_begin", EHFrameInfo.Number, true, true); Asm->EOL("FDE initial location"); - EmitDifference("eh_func_end", EHFrameInfo.Number, - "eh_func_begin", EHFrameInfo.Number, is4Byte); + "eh_func_begin", EHFrameInfo.Number, true); Asm->EOL("FDE address range"); // If there is a personality and landing pads then point to the language // specific data area in the exception table. if (MMI->getPersonalities()[0] != NULL) { + bool is4Byte = TD->getPointerSize() == sizeof(int32_t); + Asm->EmitULEB128Bytes(is4Byte ? 4 : 8); Asm->EOL("Augmentation size"); - if (EHFrameInfo.hasLandingPads) { + if (EHFrameInfo.hasLandingPads) EmitReference("exception", EHFrameInfo.Number, true, false); - } else { + else { if (is4Byte) Asm->EmitInt32((int)0); else @@ -930,8 +919,6 @@ void DwarfException::EndFunction() { MF->getFunction())); } - MF = 0; - if (TimePassesIsEnabled) ExceptionTimer->stopTimer(); } |

