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

Kai Nacke kai.nacke at redstar.de
Sun Jul 7 07:24:17 PDT 2013


Hi Duncan,

this code path is currently not used and can't be tested right now.
I add the test case with my next patch which enables Dwarf Exception 
Handling on top of Win64 SEH.
(I already posted the patch here but it needs some more cleaning yet.)

Regards
Kai

On 07.07.2013 16:07, Duncan Sands wrote:
> 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
>>
>
> _______________________________________________
> 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