Skip to content

Commit

Permalink
Emit personality function and Dwarf EH data for Win64 SEH.
Browse files Browse the repository at this point in the history
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.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185761 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
redstar committed Jul 6, 2013
1 parent 59c5c6c commit 28bb044
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 14 deletions.
12 changes: 3 additions & 9 deletions lib/CodeGen/AsmPrinter/Win64Exception.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,9 @@ void Win64Exception::BeginFunction(const MachineFunction *MF) {
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()));
Expand All @@ -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();
}
Expand Down
15 changes: 10 additions & 5 deletions lib/MC/MCObjectFileInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -547,11 +547,16 @@ void MCObjectFileInfo::InitCOFFMCObjectFileInfo(Triple T) {
// 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 =
Expand Down

0 comments on commit 28bb044

Please sign in to comment.