mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-12 13:38:21 +00:00
Emit multiple common EH frames for multiple (including blank) personality
functions. This partly fixes PR1414: now we're restricted only to one personality function per eh frame, not per module. Further work on "multiple personalities" topic needs representative example. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37018 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -1475,8 +1475,11 @@ MachineModuleInfo::MachineModuleInfo()
|
||||
, RootScope(NULL)
|
||||
, FrameMoves()
|
||||
, LandingPads()
|
||||
, Personality(NULL)
|
||||
{}
|
||||
, Personalities()
|
||||
{
|
||||
// Always emit "no personality" info
|
||||
Personalities.push_back(NULL);
|
||||
}
|
||||
MachineModuleInfo::~MachineModuleInfo() {
|
||||
|
||||
}
|
||||
@ -1686,13 +1689,15 @@ unsigned MachineModuleInfo::addLandingPad(MachineBasicBlock *LandingPad) {
|
||||
/// addPersonality - Provide the personality function for the exception
|
||||
/// information.
|
||||
void MachineModuleInfo::addPersonality(MachineBasicBlock *LandingPad,
|
||||
Function *PersFn) {
|
||||
Function *Personality) {
|
||||
LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad);
|
||||
LP.Personality = PersFn;
|
||||
LP.Personality = Personality;
|
||||
|
||||
// FIXME: Until PR1414 will be fixed, we're using 1 personality function per
|
||||
// module
|
||||
Personality = PersFn;
|
||||
for (unsigned i = 0; i < Personalities.size(); ++i)
|
||||
if (Personalities[i] == Personality)
|
||||
return;
|
||||
|
||||
Personalities.push_back(Personality);
|
||||
}
|
||||
|
||||
/// addCatchTypeInfo - Provide the catch typeinfo for a landing pad.
|
||||
@ -1753,16 +1758,28 @@ unsigned MachineModuleInfo::getTypeIDFor(GlobalVariable *TI) {
|
||||
return TypeInfos.size();
|
||||
}
|
||||
|
||||
/// getLandingPadInfos - Return a reference to the landing pad info for the
|
||||
/// current function.
|
||||
/// getPersonality - Return the personality function for the current function.
|
||||
Function *MachineModuleInfo::getPersonality() const {
|
||||
// FIXME: Until PR1414 will be fixed, we're using 1 personality function per
|
||||
// module
|
||||
|
||||
//return !LandingPads.empty() ? LandingPads[0].Personality : NULL;
|
||||
return Personality;
|
||||
// function
|
||||
return !LandingPads.empty() ? LandingPads[0].Personality : NULL;
|
||||
}
|
||||
|
||||
/// getPersonalityIndex - Return unique index for current personality
|
||||
/// function. NULL personality function should always get zero index.
|
||||
unsigned MachineModuleInfo::getPersonalityIndex() const {
|
||||
const Function* Personality = (!LandingPads.empty() ?
|
||||
LandingPads[0].Personality : NULL);
|
||||
|
||||
for (unsigned i = 0; i < Personalities.size(); ++i) {
|
||||
if (Personalities[i] == Personality)
|
||||
return i;
|
||||
}
|
||||
|
||||
// This should never happen
|
||||
assert(0 && "Personality function should be set!");
|
||||
return 0;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// DebugLabelFolding pass - This pass prunes out redundant labels. This allows
|
||||
|
Reference in New Issue
Block a user