[llvm-commits] [llvm] r78625 - in /llvm/trunk: docs/ include/llvm/ include/llvm/CodeGen/ include/llvm/Target/ lib/CodeGen/ lib/CodeGen/AsmPrinter/ lib/CodeGen/SelectionDAG/ lib/ExecutionEngine/JIT/ lib/Target/ lib/Target/ARM/ lib/Target/ARM/AsmPrinter/ lib/Target/CellSPU/ lib/Target/PowerPC/ lib/Target/X86/ tools/lto/

Evan Cheng evan.cheng at apple.com
Mon Aug 10 17:53:55 PDT 2009


On Aug 10, 2009, at 5:09 PM, Jim Grosbach wrote:

> Author: grosbach
> Date: Mon Aug 10 19:09:57 2009
> New Revision: 78625
>
> URL: http://llvm.org/viewvc/llvm-project?rev=78625&view=rev
> Log:
> SjLj based exception handling unwinding support. This patch is  
> nasty, brutish
> and short. Well, it's kinda short. Definitely nasty and brutish.

Ok.

>
> The front-end generates the register/unregister calls into the SjLj  
> runtime,
> call-site indices and landing pad dispatch. The back end fills in  
> the LSDA
> with the call-site information provided by the front end. Catch  
> blocks are
> not yet implemented.

Obviously we can throw an exception yet. But how far away are we from  
being able run ARM C++ and Objc tests?

>
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp?rev=78625&r1=78624&r2=78625&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp Mon Aug 10  
> 19:09:57 2009
> @@ -364,6 +364,7 @@
> /// try-range address.
> void DwarfException::
> ComputeCallSiteTable(SmallVectorImpl<CallSiteEntry> &CallSites,
> +                     std::map<unsigned,CallSiteEntry*>  
> &CallSiteIndexMap,

Are indices continuous integers? If so, perhaps it would be better to  
use IndexedMap or at least DenseMap?

>                      const RangeMapType &PadMap,
>
> -  for (unsigned i = 0, e = CallSites.size(); i < e; ++i)
> +  unsigned SizeSites;
> +  if (TAI->getExceptionHandlingType() == ExceptionHandling::SjLj) {
> +    SizeSites = (MF->getMaxCallSiteIndex() - CallSites.size()) *
> +      TargetAsmInfo::getULEB128Size(0) * 2;
> +  } else
> +    SizeSites = CallSites.size() *
> +      (SiteStartSize + SiteLengthSize + LandingPadSize);
> +  for (unsigned i = 0, e = CallSites.size(); i < e; ++i) {
>     SizeSites += TargetAsmInfo::getULEB128Size(CallSites[i].Action);
> -
> +    if (TAI->getExceptionHandlingType() == ExceptionHandling::SjLj)
> +      SizeSites += TargetAsmInfo::getULEB128Size(i);
> +      // FIXME: 'i' above should be the landing pad index

I don't quite understand this fixme comment.

>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Target/ARM/ARMInstrInfo.td (original)
> +++ llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Mon Aug 10 19:09:57 2009
> @@ -1427,9 +1427,12 @@
>   def Int_eh_sjlj_setjmp : XI<(outs), (ins GPR:$src),
>                                AddrModeNone, SizeSpecial,  
> IndexModeNone,
>                                Pseudo, NoItinerary,
> -                               "add r0, pc, #4\n\t"
> -                               "str r0, [$src, #+4]\n\t"
> -                               "mov r0, #0 @ eh_setjmp", "",
> +                               "str sp, [$src, #+8] @ eh_setjmp  
> begin\n\t"
> +                               "add ip, pc, #8\n\t"
> +                               "str ip, [$src, #+4]\n\t"
> +                               "mov r0, #0\n\t"
> +                               "add pc, pc, #0\n\t"
> +                               "mov r0, #1 @ eh_setjmp end\n\t", "",
>                                [(set R0, (ARMeh_sjlj_setjmp GPR: 
> $src))]>;
> }
>

You need to update ARMBaseInstrInfo::GetInstSizeInBytes. It's no  
longer 12-bytes long.

Please add a Thumb2 specific instruction, this obviously is ARM  
specific only. Please take care not to use "add pc, pc, #0", its  
semantics is undefined in Thumb2 mode. Also please make sure you use  
universal syntax for Thumb2.

Evan

>
> Modified: llvm/trunk/lib/Target/ARM/ARMTargetAsmInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMTargetAsmInfo.cpp?rev=78625&r1=78624&r2=78625&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Target/ARM/ARMTargetAsmInfo.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/ARMTargetAsmInfo.cpp Mon Aug 10  
> 19:09:57 2009
> @@ -47,6 +47,12 @@
>   ProtectedDirective = NULL;
>   HasDotTypeDotSizeDirective = false;
>   SupportsDebugInformation = true;
> +
> +  // Exceptions handling
> +  ExceptionsType = ExceptionHandling::SjLj;
> +  GlobalEHDirective = "\t.globl\t";
> +  SupportsWeakOmittedEHFrame = false;
> +  AbsoluteEHSectionOffsets = false;
> }
>
> ARMELFTargetAsmInfo::ARMELFTargetAsmInfo() {
>
> Modified: llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp?rev=78625&r1=78624&r2=78625&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp Mon Aug  
> 10 19:09:57 2009
> @@ -208,6 +208,8 @@
>       } else {
>         if (GV)
>           Name = Mang->getMangledName(GV);
> +        else if (!strncmp(ACPV->getSymbol(), "L_lsda_", 7))
> +          Name = ACPV->getSymbol();
>         else
>           Name = Mang->makeNameProper(ACPV->getSymbol());
>       }
>
> Modified: llvm/trunk/lib/Target/CellSPU/SPUTargetAsmInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CellSPU/SPUTargetAsmInfo.cpp?rev=78625&r1=78624&r2=78625&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Target/CellSPU/SPUTargetAsmInfo.cpp (original)
> +++ llvm/trunk/lib/Target/CellSPU/SPUTargetAsmInfo.cpp Mon Aug 10  
> 19:09:57 2009
> @@ -37,6 +37,6 @@
>
>   // Exception handling is not supported on CellSPU (think about it:  
> you only
>   // have 256K for code+data. Would you support exception handling?)
> -  SupportsExceptionHandling = false;
> +  ExceptionsType = ExceptionHandling::None;
> }
>
>
> Modified: llvm/trunk/lib/Target/PowerPC/PPCTargetAsmInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCTargetAsmInfo.cpp?rev=78625&r1=78624&r2=78625&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Target/PowerPC/PPCTargetAsmInfo.cpp (original)
> +++ llvm/trunk/lib/Target/PowerPC/PPCTargetAsmInfo.cpp Mon Aug 10  
> 19:09:57 2009
> @@ -24,8 +24,8 @@
>   PCSymbol = ".";
>   CommentString = ";";
>   UsedDirective = "\t.no_dead_strip\t";
> -  SupportsExceptionHandling = true;
> -
> +  ExceptionsType = ExceptionHandling::Dwarf;
> +
>   GlobalEHDirective = "\t.globl\t";
>   SupportsWeakOmittedEHFrame = false;
> }
> @@ -49,7 +49,7 @@
>
>   // Exceptions handling
>   if (!TM.getSubtargetImpl()->isPPC64())
> -    SupportsExceptionHandling = true;
> +    ExceptionsType = ExceptionHandling::Dwarf;
>   AbsoluteEHSectionOffsets = false;
> }
>
>
> Modified: llvm/trunk/lib/Target/TargetAsmInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/TargetAsmInfo.cpp?rev=78625&r1=78624&r2=78625&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Target/TargetAsmInfo.cpp (original)
> +++ llvm/trunk/lib/Target/TargetAsmInfo.cpp Mon Aug 10 19:09:57 2009
> @@ -72,7 +72,7 @@
>   HasLEB128 = false;
>   HasDotLocAndDotFile = false;
>   SupportsDebugInformation = false;
> -  SupportsExceptionHandling = false;
> +  ExceptionsType = ExceptionHandling::None;
>   DwarfRequiresFrameSection = true;
>   DwarfUsesInlineInfoSection = false;
>   Is_EHSymbolPrivate = true;
>
> Modified: llvm/trunk/lib/Target/TargetMachine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/TargetMachine.cpp?rev=78625&r1=78624&r2=78625&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Target/TargetMachine.cpp (original)
> +++ llvm/trunk/lib/Target/TargetMachine.cpp Mon Aug 10 19:09:57 2009
> @@ -33,7 +33,8 @@
>   FloatABI::ABIType FloatABIType;
>   bool NoImplicitFloat;
>   bool NoZerosInBSS;
> -  bool ExceptionHandling;
> +  bool DwarfExceptionHandling;
> +  bool SjLjExceptionHandling;
>   bool UnwindTablesMandatory;
>   Reloc::Model RelocationModel;
>   CodeModel::Model CMModel;
> @@ -104,9 +105,14 @@
>   cl::location(NoZerosInBSS),
>   cl::init(false));
> static cl::opt<bool, true>
> -EnableExceptionHandling("enable-eh",
> +EnableDwarfExceptionHandling("enable-eh",
>   cl::desc("Emit DWARF exception handling (default if target  
> supports)"),
> -  cl::location(ExceptionHandling),
> +  cl::location(DwarfExceptionHandling),
> +  cl::init(false));
> +static cl::opt<bool, true>
> +EnableSjLjExceptionHandling("enable-sjlj-eh",
> +  cl::desc("Emit SJLJ exception handling (default if target  
> supports)"),
> +  cl::location(SjLjExceptionHandling),
>   cl::init(false));
> static cl::opt<bool, true>
> EnableUnwindTables("unwind-tables",
>
> Modified: llvm/trunk/lib/Target/X86/X86TargetAsmInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86TargetAsmInfo.cpp?rev=78625&r1=78624&r2=78625&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Target/X86/X86TargetAsmInfo.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86TargetAsmInfo.cpp Mon Aug 10  
> 19:09:57 2009
> @@ -77,7 +77,7 @@
>   DwarfUsesInlineInfoSection = true;
>
>   // Exceptions handling
> -  SupportsExceptionHandling = true;
> +  ExceptionsType = ExceptionHandling::Dwarf;
>   GlobalEHDirective = "\t.globl\t";
>   SupportsWeakOmittedEHFrame = false;
>   AbsoluteEHSectionOffsets = false;
> @@ -99,7 +99,7 @@
>   SupportsDebugInformation = true;
>
>   // Exceptions handling
> -  SupportsExceptionHandling = true;
> +  ExceptionsType = ExceptionHandling::Dwarf;
>   AbsoluteEHSectionOffsets = false;
>
>   // On Linux we must declare when we can use a non-executable stack.
>
> Modified: llvm/trunk/tools/lto/LTOCodeGenerator.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/LTOCodeGenerator.cpp?rev=78625&r1=78624&r2=78625&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/tools/lto/LTOCodeGenerator.cpp (original)
> +++ llvm/trunk/tools/lto/LTOCodeGenerator.cpp Mon Aug 10 19:09:57 2009
> @@ -394,9 +394,19 @@
>
>     Module* mergedModule = _linker.getModule();
>
> -     // If target supports exception handling then enable it now.
> -    if ( _target->getTargetAsmInfo()->doesSupportExceptionHandling 
> () )
> -        llvm::ExceptionHandling = true;
> +    // If target supports exception handling then enable it now.
> +    switch (_target->getTargetAsmInfo()->getExceptionHandlingType 
> ()) {
> +    case ExceptionHandling::Dwarf:
> +      llvm::DwarfExceptionHandling = true;
> +      break;
> +    case ExceptionHandling::SjLj:
> +      llvm::SjLjExceptionHandling = true;
> +      break;
> +    case ExceptionHandling::None:
> +      break;
> +    default:
> +      assert (0 && "Unknown exception handling model!");
> +    }
>
>     // if options were requested, set them
>     if ( !_codegenOptions.empty() )
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list