Allow multiple invokes per landing pad. This (probably) fixes PR1410.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36977 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Anton Korobeynikov 2007-05-10 22:34:59 +00:00
parent c1fe16610a
commit eeb37e0b80
3 changed files with 79 additions and 62 deletions

View File

@ -33,6 +33,7 @@
#include "llvm/Support/Dwarf.h"
#include "llvm/Support/DataTypes.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/UniqueVector.h"
#include "llvm/GlobalValue.h"
#include "llvm/Pass.h"
@ -955,8 +956,8 @@ public:
///
struct LandingPadInfo {
MachineBasicBlock *LandingPadBlock; // Landing pad block.
unsigned BeginLabel; // Label prior to invoke.
unsigned EndLabel; // Label after invoke.
SmallVector<unsigned, 1> BeginLabels; // Labels prior to invoke.
SmallVector<unsigned, 1> EndLabels; // Labels after invoke.
unsigned LandingPadLabel; // Label at beginning of landing pad.
Function *Personality; // Personality function.
std::vector<unsigned> TypeIds; // List of type ids.
@ -965,8 +966,6 @@ struct LandingPadInfo {
LandingPadInfo(MachineBasicBlock *MBB)
: LandingPadBlock(MBB)
, BeginLabel(0)
, EndLabel(0)
, LandingPadLabel(0)
, TypeIds()
, IsFilter(false)

View File

@ -2934,6 +2934,7 @@ private:
unsigned SizeAction = 0;
signed FirstAction;
for (unsigned j = 0, E = LandingPad.BeginLabels.size(); j != E; ++j) {
if (IsFilter) {
// FIXME - Assume there is only one filter typeinfo list per function
// time being. I.E., Each call to eh_filter will have the same list.
@ -2947,10 +2948,10 @@ private:
FirstAction = 0;
} else {
// Gather the action sizes
for (unsigned j = 0, M = TypeIds.size(); j != M; ++j) {
unsigned TypeID = TypeIds[j];
for (unsigned k = 0, M = TypeIds.size(); k != M; ++k) {
unsigned TypeID = TypeIds[k];
unsigned SizeTypeID = Asm->SizeSLEB128(TypeID);
signed Action = j ? -(SizeAction + SizeTypeID) : 0;
signed Action = k ? -(SizeAction + SizeTypeID) : 0;
SizeAction = SizeTypeID + Asm->SizeSLEB128(Action);
SizeSiteActions += SizeAction;
}
@ -2968,6 +2969,7 @@ private:
sizeof(int32_t) + // Landing pad.
Asm->SizeSLEB128(FirstAction); // Action.
}
}
// Final tallies.
unsigned SizeTypes = TypeInfos.size() * TAI->getAddressSize();
@ -2998,15 +3000,17 @@ private:
Asm->EmitULEB128Bytes(SizeSites);
Asm->EOL("Call-site table length");
// Emit the landng pad site information.
// Emit the landing pad site information.
for (unsigned i = 0, N = LandingPads.size(); i != N; ++i) {
const LandingPadInfo &LandingPad = LandingPads[i];
for (unsigned j=0, E = LandingPad.BeginLabels.size(); j != E; ++j) {
EmitSectionOffset("label", "eh_func_begin",
LandingPad.BeginLabel, SubprogramCount, false, true);
LandingPad.BeginLabels[j], SubprogramCount,
false, true);
Asm->EOL("Region start");
EmitDifference("label", LandingPad.EndLabel,
"label", LandingPad.BeginLabel);
EmitDifference("label", LandingPad.EndLabels[j],
"label", LandingPad.BeginLabels[j]);
Asm->EOL("Region length");
if (LandingPad.TypeIds.empty()) {
@ -3023,6 +3027,7 @@ private:
Asm->EmitULEB128Bytes(Actions[i]);
Asm->EOL("Action");
}
}
// Emit the actions.
for (unsigned i = 0, N = LandingPads.size(); i != N; ++i) {

View File

@ -1669,8 +1669,8 @@ LandingPadInfo &MachineModuleInfo::getOrCreateLandingPadInfo
void MachineModuleInfo::addInvoke(MachineBasicBlock *LandingPad,
unsigned BeginLabel, unsigned EndLabel) {
LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad);
if (!LP.BeginLabel) LP.BeginLabel = BeginLabel;
LP.EndLabel = EndLabel;
LP.BeginLabels.push_back(BeginLabel);
LP.EndLabels.push_back(EndLabel);
}
/// addLandingPad - Provide the label of a try LandingPad block.
@ -1711,17 +1711,30 @@ void MachineModuleInfo::setIsFilterLandingPad(MachineBasicBlock *LandingPad) {
void MachineModuleInfo::TidyLandingPads() {
for (unsigned i = 0; i != LandingPads.size(); ) {
LandingPadInfo &LandingPad = LandingPads[i];
LandingPad.BeginLabel = MappedLabel(LandingPad.BeginLabel);
LandingPad.EndLabel = MappedLabel(LandingPad.EndLabel);
LandingPad.LandingPadLabel = MappedLabel(LandingPad.LandingPadLabel);
if (!LandingPad.BeginLabel ||
!LandingPad.EndLabel ||
!LandingPad.LandingPadLabel) {
if (!LandingPad.LandingPadLabel) {
LandingPads.erase(LandingPads.begin() + i);
continue;
}
for (unsigned j=0; j != LandingPads[i].BeginLabels.size(); ) {
unsigned BeginLabel = MappedLabel(LandingPad.BeginLabels[j]);
unsigned EndLabel = MappedLabel(LandingPad.EndLabels[j]);
if (!BeginLabel || !EndLabel) {
printf("Tidy: %d, %d, %d\n", BeginLabel, EndLabel, LandingPad.LandingPadLabel);
LandingPad.BeginLabels.erase(LandingPad.BeginLabels.begin() + j);
LandingPad.EndLabels.erase(LandingPad.EndLabels.begin() + j);
continue;
}
LandingPad.BeginLabels[j] = BeginLabel;
LandingPad.EndLabels[j] = EndLabel;
++j;
}
++i;
}
}