Implement new llc flag -disable-required-unwind-tables.

Corresponds to -fno-unwind-tables (usually default in gcc).

llvm-svn: 49361
This commit is contained in:
Dale Johannesen 2008-04-08 00:10:24 +00:00
parent be2279d470
commit ec0fe04044
5 changed files with 26 additions and 7 deletions

View 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

View 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)

View 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;

View 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(

View 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;