mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-12 13:38:21 +00:00
Integrate exception filter support and exception catch support. This
simplifies the code in DwarfWriter, allows for multiple filters and makes it trivial to specify filters accompanied by cleanups or catch-all specifications (see next patch). What a deal! Patch blessed by Anton. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37398 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -1521,6 +1521,7 @@ void MachineModuleInfo::EndFunction() {
|
||||
// Clean up exception info.
|
||||
LandingPads.clear();
|
||||
TypeInfos.clear();
|
||||
FilterIds.clear();
|
||||
}
|
||||
|
||||
/// getDescFor - Convert a Value to a debug information descriptor.
|
||||
@ -1708,12 +1709,16 @@ void MachineModuleInfo::addCatchTypeInfo(MachineBasicBlock *LandingPad,
|
||||
for (unsigned N = TyInfo.size(); N; --N)
|
||||
LP.TypeIds.push_back(getTypeIDFor(TyInfo[N - 1]));
|
||||
}
|
||||
|
||||
/// setIsFilterLandingPad - Indicates that the landing pad is a throw filter.
|
||||
|
||||
/// addFilterTypeInfo - Provide the filter typeinfo for a landing pad.
|
||||
///
|
||||
void MachineModuleInfo::setIsFilterLandingPad(MachineBasicBlock *LandingPad) {
|
||||
void MachineModuleInfo::addFilterTypeInfo(MachineBasicBlock *LandingPad,
|
||||
std::vector<GlobalVariable *> &TyInfo) {
|
||||
LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad);
|
||||
LP.IsFilter = true;
|
||||
std::vector<unsigned> IdsInFilter (TyInfo.size());
|
||||
for (unsigned I = 0, E = TyInfo.size(); I != E; ++I)
|
||||
IdsInFilter[I] = getTypeIDFor(TyInfo[I]);
|
||||
LP.TypeIds.push_back(getFilterIDFor(IdsInFilter));
|
||||
}
|
||||
|
||||
/// TidyLandingPads - Remap landing pad labels and remove any deleted landing
|
||||
@ -1760,6 +1765,20 @@ unsigned MachineModuleInfo::getTypeIDFor(GlobalVariable *TI) {
|
||||
return TypeInfos.size();
|
||||
}
|
||||
|
||||
/// getFilterIDFor - Return the filter id for the specified typeinfos. This is
|
||||
/// function wide.
|
||||
int MachineModuleInfo::getFilterIDFor(std::vector<unsigned> &TyIds) {
|
||||
// TODO: map duplicate filters to the same filter id; a filter equal to the
|
||||
// tail of an existing filter also need not be added; re-order filters and
|
||||
// filter elements to maximize this kind of sharing.
|
||||
int FilterID = -(1 + FilterIds.size());
|
||||
FilterIds.reserve(FilterIds.size() + TyIds.size() + 1);
|
||||
for (unsigned I = 0, N = TyIds.size(); I != N; ++I)
|
||||
FilterIds.push_back(TyIds[I]);
|
||||
FilterIds.push_back(0); // terminator
|
||||
return FilterID;
|
||||
}
|
||||
|
||||
/// 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
|
||||
|
Reference in New Issue
Block a user