[llvm] r185761 - Emit personality function and Dwarf EH data for Win64 SEH.

Duncan Sands duncan.sands at gmail.com
Sun Jul 7 07:07:34 PDT 2013


Hi Kai, no testcase?

Ciao, Duncan.

On 06/07/13 19:17, Kai Nacke wrote:
> Author: redstar
> Date: Sat Jul  6 12:17:31 2013
> New Revision: 185761
>
> URL: http://llvm.org/viewvc/llvm-project?rev=185761&view=rev
> Log:
> Emit personality function and Dwarf EH data for Win64 SEH.
>
> Obviously the personality function should be emitted as language handler
> instead of the hard coded _GCC_specific_handler. The language specific
> data must be placed after the unwind information therefore it must not
> be emitted into a separate section.
>
> Reviewed by Charles Davis and Nico Rieck.
>
> Modified:
>      llvm/trunk/lib/CodeGen/AsmPrinter/Win64Exception.cpp
>      llvm/trunk/lib/MC/MCObjectFileInfo.cpp
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/Win64Exception.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/Win64Exception.cpp?rev=185761&r1=185760&r2=185761&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/Win64Exception.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/Win64Exception.cpp Sat Jul  6 12:17:31 2013
> @@ -78,9 +78,9 @@ void Win64Exception::BeginFunction(const
>     if (!shouldEmitPersonality)
>       return;
>
> -  MCSymbol *GCCHandlerSym =
> -    Asm->GetExternalSymbolSymbol("_GCC_specific_handler");
> -  Asm->OutStreamer.EmitWin64EHHandler(GCCHandlerSym, true, true);
> +  const MCSymbol *PersHandlerSym = TLOF.getCFIPersonalitySymbol(Per, Asm->Mang,
> +                                                                MMI);
> +  Asm->OutStreamer.EmitWin64EHHandler(PersHandlerSym, true, true);
>
>     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("eh_func_begin",
>                                                   Asm->getFunctionNumber()));
> @@ -99,14 +99,8 @@ void Win64Exception::EndFunction() {
>     MMI->TidyLandingPads();
>
>     if (shouldEmitPersonality) {
> -    const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
> -    const Function *Per = MMI->getPersonalities()[MMI->getPersonalityIndex()];
> -    const MCSymbol *Sym = TLOF.getCFIPersonalitySymbol(Per, Asm->Mang, MMI);
> -
>       Asm->OutStreamer.PushSection();
>       Asm->OutStreamer.EmitWin64EHHandlerData();
> -    Asm->OutStreamer.EmitValue(MCSymbolRefExpr::Create(Sym, Asm->OutContext),
> -                               4);
>       EmitExceptionTable();
>       Asm->OutStreamer.PopSection();
>     }
>
> Modified: llvm/trunk/lib/MC/MCObjectFileInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCObjectFileInfo.cpp?rev=185761&r1=185760&r2=185761&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCObjectFileInfo.cpp (original)
> +++ llvm/trunk/lib/MC/MCObjectFileInfo.cpp Sat Jul  6 12:17:31 2013
> @@ -547,11 +547,16 @@ void MCObjectFileInfo::InitCOFFMCObjectF
>     // though it contains relocatable pointers.  In PIC mode, this is probably a
>     // big runtime hit for C++ apps.  Either the contents of the LSDA need to be
>     // adjusted or this should be a data section.
> -  LSDASection =
> -    Ctx->getCOFFSection(".gcc_except_table",
> -                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
> -                        COFF::IMAGE_SCN_MEM_READ,
> -                        SectionKind::getReadOnly());
> +  if (T.getOS() == Triple::Win32) {
> +    // On Windows with SEH, the LSDA is emitted into the .xdata section
> +    LSDASection = 0;
> +  } else {
> +    LSDASection =
> +      Ctx->getCOFFSection(".gcc_except_table",
> +                          COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
> +                          COFF::IMAGE_SCN_MEM_READ,
> +                          SectionKind::getReadOnly());
> +  }
>
>     // Debug info.
>     DwarfAbbrevSection =
>
>
> _______________________________________________
> 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