Implement new llc flag -disable-required-unwind-tables.
authorDale Johannesen <dalej@apple.com>
Tue, 8 Apr 2008 00:10:24 +0000 (00:10 +0000)
committerDale Johannesen <dalej@apple.com>
Tue, 8 Apr 2008 00:10:24 +0000 (00:10 +0000)
Corresponds to -fno-unwind-tables (usually default in gcc).

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

include/llvm/Target/TargetOptions.h
lib/CodeGen/DwarfWriter.cpp
lib/Target/PowerPC/PPCRegisterInfo.cpp
lib/Target/TargetMachine.cpp
lib/Target/X86/X86RegisterInfo.cpp

index 72bb272015a78b87ae7ba0cf4830ea66ae026968..881ec21a0a28b2e58723f5b2486d2e3f7aeb46fc 100644 (file)
@@ -74,13 +74,18 @@ namespace llvm {
   /// be emitted.
   extern bool ExceptionHandling;
 
+  /// UnwindTablesOptional - This flag indicates that unwind tables need not
+  /// be emitted for all functions.  Exception handling may still require them
+  /// for some functions.
+  extern bool UnwindTablesOptional;
+
   /// PerformTailCallOpt - This flag is enabled when -tailcallopt is specified
   /// on the commandline. When the flag is on, the target will perform tail call
   /// optimization (pop the caller's stack) providing it supports it.
   extern bool PerformTailCallOpt;
 
-  /// OptimizeForSize - When this flags is set, code generator avoids optimization
-  /// that increases size.
+  /// OptimizeForSize - When this flag is set, the code generator avoids 
+  /// optimizations that increase size.
   extern bool OptimizeForSize;
 } // End llvm namespace
 
index 947b420cd514de524106bb803a97dc878ece175a..6cdc91e1f723bffecadc21688c196fb03d5e1bf2 100644 (file)
@@ -2905,8 +2905,11 @@ private:
 
     // If there are no calls then you can't unwind.  This may mean we can
     // omit the EH Frame, but some environments do not handle weak absolute
-    // symbols.
+    // symbols.  
+    // If UnwindTablesOptional is not set we cannot do this optimization; the
+    // unwind info is to be available for non-EH uses.
     if (!EHFrameInfo.hasCalls &&
+        UnwindTablesOptional &&
         ((linkage != Function::WeakLinkage && 
           linkage != Function::LinkOnceLinkage) ||
          !TAI->getWeakDefDirective() ||
@@ -3427,7 +3430,9 @@ public:
         shouldEmitTable = true;
 
       // See if we need frame move info.
-      if (MMI->hasDebugInfo() || !MF->getFunction()->doesNotThrow())
+      if (MMI->hasDebugInfo() || 
+          !MF->getFunction()->doesNotThrow() ||
+          !UnwindTablesOptional)
         shouldEmitMoves = true;
 
       if (shouldEmitMoves || shouldEmitTable)
index 8ef8b3fafa67588fca660a7fc44d4ca3da5b6199..8b4fb6a356a5a07005dcb32eda27ea039955b5d4 100644 (file)
@@ -948,7 +948,8 @@ PPCRegisterInfo::emitPrologue(MachineFunction &MF) const {
   MachineFrameInfo *MFI = MF.getFrameInfo();
   MachineModuleInfo *MMI = MFI->getMachineModuleInfo();
   bool needsFrameMoves = (MMI && MMI->hasDebugInfo()) ||
-       !MF.getFunction()->doesNotThrow();
+       !MF.getFunction()->doesNotThrow() ||
+       !UnwindTablesOptional;
   
   // Prepare for frame info.
   unsigned FrameLabelId = 0;
index e4f633f111da03b5dcfc6bc702c1db8c41e3568c..e6f080d328d2690453782102faf025ee7aeb12f5 100644 (file)
@@ -31,6 +31,7 @@ namespace llvm {
   bool UseSoftFloat;
   bool NoZerosInBSS;
   bool ExceptionHandling;
+  bool UnwindTablesOptional;
   Reloc::Model RelocationModel;
   CodeModel::Model CMModel;
   bool PerformTailCallOpt;
@@ -80,9 +81,14 @@ namespace {
               cl::init(false));
   cl::opt<bool, true>
   EnableExceptionHandling("enable-eh",
-               cl::desc("Exception handling should be emitted."),
+               cl::desc("Emit DWARF exception handling (default if target supports)"),
                cl::location(ExceptionHandling),
                cl::init(false));
+  cl::opt<bool, true>
+  DisableUnwindTables("disable-required-unwind-tables",
+               cl::desc("Do not require unwinding info for all functions"),
+               cl::location(UnwindTablesOptional),
+               cl::init(false));
 
   cl::opt<llvm::Reloc::Model, true>
   DefRelocationModel(
index 0a755605d49ac05d6c2ceb85ecaea91224432e11..2668582aefabb331f127e6781a8080f58a6f245f 100644 (file)
@@ -504,7 +504,9 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
   MachineModuleInfo *MMI = MFI->getMachineModuleInfo();
   X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
   MachineBasicBlock::iterator MBBI = MBB.begin();
-  bool needsFrameMoves = (MMI && MMI->hasDebugInfo()) || !Fn->doesNotThrow();
+  bool needsFrameMoves = (MMI && MMI->hasDebugInfo()) || 
+                          !Fn->doesNotThrow() ||
+                          !UnwindTablesOptional;
   
   // Prepare for frame info.
   unsigned FrameLabelId = 0;