Recommitting EH patch; this should answer most of the
authorDale Johannesen <dalej@apple.com>
Wed, 2 Apr 2008 00:25:04 +0000 (00:25 +0000)
committerDale Johannesen <dalej@apple.com>
Wed, 2 Apr 2008 00:25:04 +0000 (00:25 +0000)
review feedback.
-enable-eh is still accepted but doesn't do anything.
EH intrinsics use Dwarf EH if the target supports that,
and are handled by LowerInvoke otherwise.
The separation of the EH table and frame move data is,
I think, logically figured out, but either one still
causes full EH info to be generated (not sure how to
split the metadata correctly).
MachineModuleInfo::needsFrameInfo is no longer used and
is removed.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@49064 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/MachineModuleInfo.h
lib/CodeGen/DwarfWriter.cpp
lib/CodeGen/LLVMTargetMachine.cpp
lib/CodeGen/MachineModuleInfo.cpp
lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
lib/Target/PowerPC/PPCAsmPrinter.cpp
lib/Target/PowerPC/PPCRegisterInfo.cpp
lib/Target/X86/X86ATTAsmPrinter.cpp
lib/Target/X86/X86AsmPrinter.cpp
lib/Target/X86/X86RegisterInfo.cpp

index 2cd4e23781ebf3a3427ef710897f7a116f648900..f798e50c4338a4f0bcbcd886e7101514ae4373b2 100644 (file)
@@ -1091,10 +1091,6 @@ public:
   ///
   bool hasDebugInfo() const { return !CompileUnits.empty(); }
   
-  /// needsFrameInfo - Returns true if we need to gather callee-saved register
-  /// move info for the frame.
-  bool needsFrameInfo() const;
-
   bool callsEHReturn() const { return CallsEHReturn; }
   void setCallsEHReturn(bool b) { CallsEHReturn = b; }
 
index e72ff07a9d704299b36a67d4e0afc11ac0b3cf44..0fa956e0972dc073ea07897cc52b4b1c8ac35c37 100644 (file)
@@ -2777,10 +2777,22 @@ private:
   };
 
   std::vector<FunctionEHFrameInfo> EHFrames;
-    
-  /// shouldEmit - Flag to indicate if debug information should be emitted.
-  ///
-  bool shouldEmit;
+
+  /// shouldEmitTable - Per-function flag to indicate if EH tables should
+  /// be emitted.
+  bool shouldEmitTable;
+
+  /// shouldEmitMoves - Per-function flag to indicate if frame moves info
+  /// should be emitted.
+  bool shouldEmitMoves;
+
+  /// shouldEmitTableModule - Per-module flag to indicate if EH tables
+  /// should be emitted.
+  bool shouldEmitTableModule;
+
+  /// shouldEmitFrameModule - Per-module flag to indicate if frame moves 
+  /// should be emitted.
+  bool shouldEmitMovesModule;
   
   /// EmitCommonEHFrame - Emit the common eh unwind frame.
   ///
@@ -3045,9 +3057,6 @@ private:
   };
 
   void EmitExceptionTable() {
-    // Map all labels and get rid of any dead landing pads.
-    MMI->TidyLandingPads();
-
     const std::vector<GlobalVariable *> &TypeInfos = MMI->getTypeInfos();
     const std::vector<unsigned> &FilterIds = MMI->getFilterIds();
     const std::vector<LandingPadInfo> &PadInfos = MMI->getLandingPads();
@@ -3367,7 +3376,10 @@ public:
   //
   DwarfException(std::ostream &OS, AsmPrinter *A, const TargetAsmInfo *T)
   : Dwarf(OS, A, T, "eh")
-  , shouldEmit(false)
+  , shouldEmitTable(false)
+  , shouldEmitMoves(false)
+  , shouldEmitTableModule(false)
+  , shouldEmitMovesModule(false)
   {}
   
   virtual ~DwarfException() {}
@@ -3387,48 +3399,59 @@ public:
   /// EndModule - Emit all exception information that should come after the
   /// content.
   void EndModule() {
-    if (!shouldEmit) return;
-
-    const std::vector<Function *> Personalities = MMI->getPersonalities();
-    for (unsigned i =0; i < Personalities.size(); ++i)
-      EmitCommonEHFrame(Personalities[i], i);
-
-    for (std::vector<FunctionEHFrameInfo>::iterator I = EHFrames.begin(),
-           E = EHFrames.end(); I != E; ++I)
-      EmitEHFrame(*I);
+    if (shouldEmitMovesModule || shouldEmitTableModule) {
+      const std::vector<Function *> Personalities = MMI->getPersonalities();
+      for (unsigned i =0; i < Personalities.size(); ++i)
+        EmitCommonEHFrame(Personalities[i], i);
+
+      for (std::vector<FunctionEHFrameInfo>::iterator I = EHFrames.begin(),
+             E = EHFrames.end(); I != E; ++I)
+        EmitEHFrame(*I);
+    }
   }
 
   /// BeginFunction - Gather pre-function exception information.  Assumes being 
   /// emitted immediately after the function entry point.
   void BeginFunction(MachineFunction *MF) {
     this->MF = MF;
-    
-    if (MMI &&
-        ExceptionHandling &&
-        TAI->doesSupportExceptionHandling()) {
-      shouldEmit = true;
-      // Assumes in correct section after the entry point.
-      EmitLabel("eh_func_begin", ++SubprogramCount);
+    shouldEmitTable = shouldEmitMoves = false;
+    if (TAI->doesSupportExceptionHandling()) {
+
+      // Map all labels and get rid of any dead landing pads.
+      MMI->TidyLandingPads();
+      // If any landing pads survive, we need an EH table.
+      if (MMI->getLandingPads().size())
+        shouldEmitTable = true;
+
+      // See if we need frame move info.
+      if (MMI->hasDebugInfo() || !MF->getFunction()->doesNotThrow())
+        shouldEmitMoves = true;
+
+      if (shouldEmitMoves || shouldEmitTable)
+        // Assumes in correct section after the entry point.
+        EmitLabel("eh_func_begin", ++SubprogramCount);
     }
+    shouldEmitTableModule |= shouldEmitTable;
+    shouldEmitMovesModule |= shouldEmitMoves;
   }
 
   /// EndFunction - Gather and emit post-function exception information.
   ///
   void EndFunction() {
-    if (!shouldEmit) return;
+    if (shouldEmitMoves || shouldEmitTable) {
+      EmitLabel("eh_func_end", SubprogramCount);
+      EmitExceptionTable();
 
-    EmitLabel("eh_func_end", SubprogramCount);
-    EmitExceptionTable();
-
-    // Save EH frame information
-    EHFrames.
-      push_back(FunctionEHFrameInfo(getAsm()->getCurrentFunctionEHName(MF),
+      // Save EH frame information
+      EHFrames.
+        push_back(FunctionEHFrameInfo(getAsm()->getCurrentFunctionEHName(MF),
                                     SubprogramCount,
                                     MMI->getPersonalityIndex(),
                                     MF->getFrameInfo()->hasCalls(),
                                     !MMI->getLandingPads().empty(),
                                     MMI->getFrameMoves(),
                                     MF->getFunction()));
+      }
   }
 };
 
index bae7140bfb17b5f6e7b7c603025ee764d9620abb..c65a6b9a795278a32878deb54d7a262e7908f9ed 100644 (file)
@@ -19,6 +19,7 @@
 #include "llvm/CodeGen/Passes.h"
 #include "llvm/CodeGen/Collector.h"
 #include "llvm/Target/TargetOptions.h"
+#include "llvm/Target/TargetAsmInfo.h"
 #include "llvm/Transforms/Scalar.h"
 #include "llvm/Support/CommandLine.h"
 using namespace llvm;
@@ -66,7 +67,7 @@ LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
   
   PM.add(createGCLoweringPass());
 
-  if (!ExceptionHandling)
+  if (!getTargetAsmInfo()->doesSupportExceptionHandling())
     PM.add(createLowerInvokePass(getTargetLowering()));
 
   // Make sure that no unreachable blocks are instruction selected.
@@ -192,7 +193,7 @@ bool LLVMTargetMachine::addPassesToEmitMachineCode(PassManagerBase &PM,
   
   PM.add(createGCLoweringPass());
   
-  if (!ExceptionHandling)
+  if (!getTargetAsmInfo()->doesSupportExceptionHandling())
     PM.add(createLowerInvokePass(getTargetLowering()));
   
   // Make sure that no unreachable blocks are instruction selected.
index 2446bff293d84fe1aa4d125a1e84ed59531a4321..0cfcc61b780544e53e276c1c75c0364517455d51 100644 (file)
@@ -1583,12 +1583,6 @@ void MachineModuleInfo::AnalyzeModule(Module &M) {
   }
 }
 
-/// needsFrameInfo - Returns true if we need to gather callee-saved register
-/// move info for the frame.
-bool MachineModuleInfo::needsFrameInfo() const {
-  return hasDebugInfo() || ExceptionHandling;
-}
-
 /// SetupCompileUnits - Set up the unique vector of compile units.
 ///
 void MachineModuleInfo::SetupCompileUnits(Module &M) {
index 80b5c046a7141abf83cf40339878e1893bf9ec9b..f237cafd493bbaea3ca07014fe8eedcf01b498b0 100644 (file)
@@ -2827,22 +2827,18 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
   }
     
   case Intrinsic::eh_exception: {
-    if (ExceptionHandling) {
-      if (!CurMBB->isLandingPad()) {
-        // FIXME: Mark exception register as live in.  Hack for PR1508.
-        unsigned Reg = TLI.getExceptionAddressRegister();
-        if (Reg) CurMBB->addLiveIn(Reg);
-      }
-      // Insert the EXCEPTIONADDR instruction.
-      SDVTList VTs = DAG.getVTList(TLI.getPointerTy(), MVT::Other);
-      SDOperand Ops[1];
-      Ops[0] = DAG.getRoot();
-      SDOperand Op = DAG.getNode(ISD::EXCEPTIONADDR, VTs, Ops, 1);
-      setValue(&I, Op);
-      DAG.setRoot(Op.getValue(1));
-    } else {
-      setValue(&I, DAG.getConstant(0, TLI.getPointerTy()));
+    if (!CurMBB->isLandingPad()) {
+      // FIXME: Mark exception register as live in.  Hack for PR1508.
+      unsigned Reg = TLI.getExceptionAddressRegister();
+      if (Reg) CurMBB->addLiveIn(Reg);
     }
+    // Insert the EXCEPTIONADDR instruction.
+    SDVTList VTs = DAG.getVTList(TLI.getPointerTy(), MVT::Other);
+    SDOperand Ops[1];
+    Ops[0] = DAG.getRoot();
+    SDOperand Op = DAG.getNode(ISD::EXCEPTIONADDR, VTs, Ops, 1);
+    setValue(&I, Op);
+    DAG.setRoot(Op.getValue(1));
     return 0;
   }
 
@@ -2852,7 +2848,7 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
     MVT::ValueType VT = (Intrinsic == Intrinsic::eh_selector_i32 ?
                          MVT::i32 : MVT::i64);
     
-    if (ExceptionHandling && MMI) {
+    if (MMI) {
       if (CurMBB->isLandingPad())
         addCatchInfo(I, MMI, CurMBB);
       else {
@@ -2902,7 +2898,7 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
   case Intrinsic::eh_return: {
     MachineModuleInfo *MMI = DAG.getMachineModuleInfo();
 
-    if (MMI && ExceptionHandling) {
+    if (MMI) {
       MMI->setCallsEHReturn(true);
       DAG.setRoot(DAG.getNode(ISD::EH_RETURN,
                               MVT::Other,
@@ -2925,32 +2921,27 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
    }
 
    case Intrinsic::eh_dwarf_cfa: {
-     if (ExceptionHandling) {
-       MVT::ValueType VT = getValue(I.getOperand(1)).getValueType();
-       SDOperand CfaArg;
-       if (MVT::getSizeInBits(VT) > MVT::getSizeInBits(TLI.getPointerTy()))
-         CfaArg = DAG.getNode(ISD::TRUNCATE,
-                              TLI.getPointerTy(), getValue(I.getOperand(1)));
-       else
-         CfaArg = DAG.getNode(ISD::SIGN_EXTEND,
-                              TLI.getPointerTy(), getValue(I.getOperand(1)));
-       
-       SDOperand Offset = DAG.getNode(ISD::ADD,
-                                      TLI.getPointerTy(),
-                                      DAG.getNode(ISD::FRAME_TO_ARGS_OFFSET,
-                                                  TLI.getPointerTy()),
-                                      CfaArg);
-       setValue(&I, DAG.getNode(ISD::ADD,
-                                TLI.getPointerTy(),
-                                DAG.getNode(ISD::FRAMEADDR,
-                                            TLI.getPointerTy(),
-                                            DAG.getConstant(0,
-                                                            TLI.getPointerTy())),
-                                Offset));
-     } else {
-       setValue(&I, DAG.getConstant(0, TLI.getPointerTy()));
-     }
-
+     MVT::ValueType VT = getValue(I.getOperand(1)).getValueType();
+     SDOperand CfaArg;
+     if (MVT::getSizeInBits(VT) > MVT::getSizeInBits(TLI.getPointerTy()))
+       CfaArg = DAG.getNode(ISD::TRUNCATE,
+                            TLI.getPointerTy(), getValue(I.getOperand(1)));
+     else
+       CfaArg = DAG.getNode(ISD::SIGN_EXTEND,
+                            TLI.getPointerTy(), getValue(I.getOperand(1)));
+
+     SDOperand Offset = DAG.getNode(ISD::ADD,
+                                    TLI.getPointerTy(),
+                                    DAG.getNode(ISD::FRAME_TO_ARGS_OFFSET,
+                                                TLI.getPointerTy()),
+                                    CfaArg);
+     setValue(&I, DAG.getNode(ISD::ADD,
+                              TLI.getPointerTy(),
+                              DAG.getNode(ISD::FRAMEADDR,
+                                          TLI.getPointerTy(),
+                                          DAG.getConstant(0,
+                                                          TLI.getPointerTy())),
+                              Offset));
      return 0;
   }
 
@@ -3176,7 +3167,7 @@ void SelectionDAGLowering::LowerCallTo(CallSite CS, SDOperand Callee,
     Args.push_back(Entry);
   }
 
-  if (LandingPad && ExceptionHandling && MMI) {
+  if (LandingPad && MMI) {
     // Insert a label before the invoke call to mark the try range.  This can be
     // used to detect deletion of the invoke via the MachineModuleInfo.
     BeginLabel = MMI->NextLabelID();
@@ -3195,7 +3186,7 @@ void SelectionDAGLowering::LowerCallTo(CallSite CS, SDOperand Callee,
     setValue(CS.getInstruction(), Result.first);
   DAG.setRoot(Result.second);
 
-  if (LandingPad && ExceptionHandling && MMI) {
+  if (LandingPad && MMI) {
     // Insert a label at the end of the invoke call to mark the try range.  This
     // can be used to detect deletion of the invoke via the MachineModuleInfo.
     EndLabel = MMI->NextLabelID();
@@ -4614,11 +4605,10 @@ bool SelectionDAGISel::runOnFunction(Function &Fn) {
 
   FunctionLoweringInfo FuncInfo(TLI, Fn, MF);
 
-  if (ExceptionHandling)
-    for (Function::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I)
-      if (InvokeInst *Invoke = dyn_cast<InvokeInst>(I->getTerminator()))
-        // Mark landing pad.
-        FuncInfo.MBBMap[Invoke->getSuccessor(1)]->setIsLandingPad();
+  for (Function::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I)
+    if (InvokeInst *Invoke = dyn_cast<InvokeInst>(I->getTerminator()))
+      // Mark landing pad.
+      FuncInfo.MBBMap[Invoke->getSuccessor(1)]->setIsLandingPad();
 
   for (Function::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I)
     SelectBasicBlock(I, MF, FuncInfo);
@@ -4757,7 +4747,7 @@ void SelectionDAGISel::BuildSelectionDAG(SelectionDAG &DAG, BasicBlock *LLVMBB,
 
   MachineModuleInfo *MMI = DAG.getMachineModuleInfo();
 
-  if (ExceptionHandling && MMI && BB->isLandingPad()) {
+  if (MMI && BB->isLandingPad()) {
     // Add a label to mark the beginning of the landing pad.  Deletion of the
     // landing pad can thus be detected via the MachineModuleInfo.
     unsigned LabelID = MMI->addLandingPad(BB);
index 2537d67ddaadf82858daa5bb3a1d8e819d7b401e..4cc9d2a9bd58a85ca9bf2c305bfc2fe53a60a5b7 100644 (file)
@@ -1086,8 +1086,9 @@ bool DarwinAsmPrinter::doFinalization(Module &M) {
 
   O << "\n";
 
-  if (ExceptionHandling && TAI->doesSupportExceptionHandling() && MMI) {
+  if (TAI->doesSupportExceptionHandling() && MMI) {
     // Add the (possibly multiple) personalities to the set of global values.
+    // Only referenced functions get into the Personalities list.
     const std::vector<Function *>& Personalities = MMI->getPersonalities();
 
     for (std::vector<Function *>::const_iterator I = Personalities.begin(),
index 0e6bc69023def8ddd299baa7d47f6c0bddaade54..3bafccde8de69e6a5bd9befbbb61845955cf47a2 100644 (file)
@@ -20,6 +20,7 @@
 #include "PPCFrameInfo.h"
 #include "PPCSubtarget.h"
 #include "llvm/Constants.h"
+#include "llvm/Function.h"
 #include "llvm/Type.h"
 #include "llvm/CodeGen/ValueTypes.h"
 #include "llvm/CodeGen/MachineInstrBuilder.h"
@@ -946,6 +947,8 @@ PPCRegisterInfo::emitPrologue(MachineFunction &MF) const {
   MachineBasicBlock::iterator MBBI = MBB.begin();
   MachineFrameInfo *MFI = MF.getFrameInfo();
   MachineModuleInfo *MMI = MFI->getMachineModuleInfo();
+  bool needsFrameInfo = (MMI && MMI->hasDebugInfo()) ||
+       !MF.getFunction()->doesNotThrow();
   
   // Prepare for frame info.
   unsigned FrameLabelId = 0;
@@ -1019,7 +1022,7 @@ PPCRegisterInfo::emitPrologue(MachineFunction &MF) const {
   unsigned TargetAlign = MF.getTarget().getFrameInfo()->getStackAlignment();
   unsigned MaxAlign = MFI->getMaxAlignment();
 
-  if (MMI && MMI->needsFrameInfo()) {
+  if (needsFrameInfo) {
     // Mark effective beginning of when frame pointer becomes valid.
     FrameLabelId = MMI->NextLabelID();
     BuildMI(MBB, MBBI, TII.get(PPC::LABEL)).addImm(FrameLabelId).addImm(0);
@@ -1095,7 +1098,7 @@ PPCRegisterInfo::emitPrologue(MachineFunction &MF) const {
     }
   }
   
-  if (MMI && MMI->needsFrameInfo()) {
+  if (needsFrameInfo) {
     std::vector<MachineMove> &Moves = MMI->getFrameMoves();
     
     if (NegFrameSize) {
index 067965666125688f06a4c9b3347ab34fc5df748e..151bf119cab520ede3abb7e2aba952ce416f6e8a 100644 (file)
@@ -150,8 +150,9 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
        F->getLinkage() == Function::WeakLinkage))
     O << "Lllvm$workaround$fake$stub$" << CurrentFnName << ":\n";
 
-  if (TAI->doesSupportDebugInformation()) {
-    // Emit pre-function debug information.
+  if (TAI->doesSupportDebugInformation() ||
+      TAI->doesSupportExceptionHandling()) {
+    // Emit pre-function debug and/or EH information.
     DW.BeginFunction(&MF);
   }
 
index 98e7d9c1e819943de53eced9a5819162666f9057..e1bc65fc5d64e365e18c1eed37dce5eef4089488 100644 (file)
@@ -381,9 +381,9 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) {
 
     O << "\n";
 
-    if (ExceptionHandling && TAI->doesSupportExceptionHandling() && MMI &&
-        !Subtarget->is64Bit()) {
+    if (TAI->doesSupportExceptionHandling() && MMI && !Subtarget->is64Bit()) {
       // Add the (possibly multiple) personalities to the set of global values.
+      // Only referenced functions get into the Personalities list.
       const std::vector<Function *>& Personalities = MMI->getPersonalities();
 
       for (std::vector<Function *>::const_iterator I = Personalities.begin(),
index 5cd2fbe35e6618f1a3bdc67f39591402a88a8642..6c3484ecfffab1dfb632b5a0064b049b8076c4ee 100644 (file)
@@ -504,6 +504,7 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
   MachineModuleInfo *MMI = MFI->getMachineModuleInfo();
   X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
   MachineBasicBlock::iterator MBBI = MBB.begin();
+  bool needsFrameInfo = (MMI && MMI->hasDebugInfo()) || !Fn->doesNotThrow();
   
   // Prepare for frame info.
   unsigned FrameLabelId = 0;
@@ -536,7 +537,7 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
       .addReg(FramePtr);
     NumBytes -= SlotSize;
 
-    if (MMI && MMI->needsFrameInfo()) {
+    if (needsFrameInfo) {
       // Mark effective beginning of when frame pointer becomes valid.
       FrameLabelId = MMI->NextLabelID();
       BuildMI(MBB, MBBI, TII.get(X86::LABEL)).addImm(FrameLabelId).addImm(0);
@@ -548,7 +549,7 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
   }
   
   unsigned ReadyLabelId = 0;
-  if (MMI && MMI->needsFrameInfo()) {
+  if (needsFrameInfo) {
     // Mark effective beginning of when frame pointer is ready.
     ReadyLabelId = MMI->NextLabelID();
     BuildMI(MBB, MBBI, TII.get(X86::LABEL)).addImm(ReadyLabelId).addImm(0);
@@ -607,7 +608,7 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
     }
   }
 
-  if (MMI && MMI->needsFrameInfo()) {
+  if (needsFrameInfo) {
     std::vector<MachineMove> &Moves = MMI->getFrameMoves();
     const TargetData *TD = MF.getTarget().getTargetData();