mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Emit the Itanium LSDA for unknown EH personalities on Win64
This fixes lots of generic CodeGen tests that use __gcc_personality_v0. This suggests that using ExceptionHandling::MSVC was a mistake, and we should instead classify each function by personality function. This would, for example, allow us to LTO a binary containing uses of SEH and Itanium EH. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@226019 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
983125f9b4
commit
4350881a94
@ -103,18 +103,13 @@ void Win64Exception::endFunction(const MachineFunction *) {
|
||||
// Emit an UNWIND_INFO struct describing the prologue.
|
||||
Asm->OutStreamer.EmitWinEHHandlerData();
|
||||
|
||||
// Emit either MSVC-compatible tables or the usual Itanium-style LSDA after
|
||||
// the UNWIND_INFO struct.
|
||||
if (Asm->MAI->getExceptionHandlingType() == ExceptionHandling::MSVC) {
|
||||
const Function *Per = MMI->getPersonalities()[MMI->getPersonalityIndex()];
|
||||
if (Per->getName() == "__C_specific_handler")
|
||||
emitCSpecificHandlerTable();
|
||||
else
|
||||
report_fatal_error(Twine("unexpected personality function: ") +
|
||||
Per->getName());
|
||||
} else {
|
||||
// Emit the tables appropriate to the personality function in use. If we
|
||||
// don't recognize the personality, assume it uses an Itanium-style LSDA.
|
||||
const Function *Per = MMI->getPersonalities()[MMI->getPersonalityIndex()];
|
||||
if (Per->getName() == "__C_specific_handler")
|
||||
emitCSpecificHandlerTable();
|
||||
else
|
||||
emitExceptionTable();
|
||||
}
|
||||
|
||||
Asm->OutStreamer.PopSection();
|
||||
}
|
||||
|
@ -941,6 +941,10 @@ void SelectionDAGISel::PrepareEHLandingPad() {
|
||||
*MBB, MBB->begin(), SDB->getCurDebugLoc(), TII->get(TargetOpcode::PHI),
|
||||
FuncInfo->ExceptionSelectorVirtReg);
|
||||
for (unsigned I = 0, E = LPadInst->getNumClauses(); I != E; ++I) {
|
||||
// Skip filter clauses, we can't implement them yet.
|
||||
if (LPadInst->isFilter(I))
|
||||
continue;
|
||||
|
||||
MachineBasicBlock *ClauseBB = MF->CreateMachineBasicBlock(LLVMBB);
|
||||
MF->insert(MBB, ClauseBB);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user