mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-17 21:29:20 +00:00
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:
parent
c1fe16610a
commit
eeb37e0b80
@ -33,6 +33,7 @@
|
|||||||
|
|
||||||
#include "llvm/Support/Dwarf.h"
|
#include "llvm/Support/Dwarf.h"
|
||||||
#include "llvm/Support/DataTypes.h"
|
#include "llvm/Support/DataTypes.h"
|
||||||
|
#include "llvm/ADT/SmallVector.h"
|
||||||
#include "llvm/ADT/UniqueVector.h"
|
#include "llvm/ADT/UniqueVector.h"
|
||||||
#include "llvm/GlobalValue.h"
|
#include "llvm/GlobalValue.h"
|
||||||
#include "llvm/Pass.h"
|
#include "llvm/Pass.h"
|
||||||
@ -955,8 +956,8 @@ public:
|
|||||||
///
|
///
|
||||||
struct LandingPadInfo {
|
struct LandingPadInfo {
|
||||||
MachineBasicBlock *LandingPadBlock; // Landing pad block.
|
MachineBasicBlock *LandingPadBlock; // Landing pad block.
|
||||||
unsigned BeginLabel; // Label prior to invoke.
|
SmallVector<unsigned, 1> BeginLabels; // Labels prior to invoke.
|
||||||
unsigned EndLabel; // Label after invoke.
|
SmallVector<unsigned, 1> EndLabels; // Labels after invoke.
|
||||||
unsigned LandingPadLabel; // Label at beginning of landing pad.
|
unsigned LandingPadLabel; // Label at beginning of landing pad.
|
||||||
Function *Personality; // Personality function.
|
Function *Personality; // Personality function.
|
||||||
std::vector<unsigned> TypeIds; // List of type ids.
|
std::vector<unsigned> TypeIds; // List of type ids.
|
||||||
@ -965,8 +966,6 @@ struct LandingPadInfo {
|
|||||||
|
|
||||||
LandingPadInfo(MachineBasicBlock *MBB)
|
LandingPadInfo(MachineBasicBlock *MBB)
|
||||||
: LandingPadBlock(MBB)
|
: LandingPadBlock(MBB)
|
||||||
, BeginLabel(0)
|
|
||||||
, EndLabel(0)
|
|
||||||
, LandingPadLabel(0)
|
, LandingPadLabel(0)
|
||||||
, TypeIds()
|
, TypeIds()
|
||||||
, IsFilter(false)
|
, IsFilter(false)
|
||||||
|
@ -2933,40 +2933,42 @@ private:
|
|||||||
const std::vector<unsigned> &TypeIds = LandingPad.TypeIds;
|
const std::vector<unsigned> &TypeIds = LandingPad.TypeIds;
|
||||||
unsigned SizeAction = 0;
|
unsigned SizeAction = 0;
|
||||||
signed FirstAction;
|
signed FirstAction;
|
||||||
|
|
||||||
if (IsFilter) {
|
for (unsigned j = 0, E = LandingPad.BeginLabels.size(); j != E; ++j) {
|
||||||
// FIXME - Assume there is only one filter typeinfo list per function
|
if (IsFilter) {
|
||||||
// time being. I.E., Each call to eh_filter will have the same list.
|
// FIXME - Assume there is only one filter typeinfo list per function
|
||||||
// This can change if a function is inlined.
|
// time being. I.E., Each call to eh_filter will have the same list.
|
||||||
Filter = &LandingPad;
|
// This can change if a function is inlined.
|
||||||
SizeAction = Asm->SizeSLEB128(-1) + Asm->SizeSLEB128(0);
|
Filter = &LandingPad;
|
||||||
SizeSiteActions += SizeAction;
|
SizeAction = Asm->SizeSLEB128(-1) + Asm->SizeSLEB128(0);
|
||||||
// Record the first action of the landing pad site.
|
|
||||||
FirstAction = SizeActions + SizeSiteActions - SizeAction + 1;
|
|
||||||
} else if (TypeIds.empty()) {
|
|
||||||
FirstAction = 0;
|
|
||||||
} else {
|
|
||||||
// Gather the action sizes
|
|
||||||
for (unsigned j = 0, M = TypeIds.size(); j != M; ++j) {
|
|
||||||
unsigned TypeID = TypeIds[j];
|
|
||||||
unsigned SizeTypeID = Asm->SizeSLEB128(TypeID);
|
|
||||||
signed Action = j ? -(SizeAction + SizeTypeID) : 0;
|
|
||||||
SizeAction = SizeTypeID + Asm->SizeSLEB128(Action);
|
|
||||||
SizeSiteActions += SizeAction;
|
SizeSiteActions += SizeAction;
|
||||||
}
|
// Record the first action of the landing pad site.
|
||||||
|
FirstAction = SizeActions + SizeSiteActions - SizeAction + 1;
|
||||||
|
} else if (TypeIds.empty()) {
|
||||||
|
FirstAction = 0;
|
||||||
|
} else {
|
||||||
|
// Gather the action sizes
|
||||||
|
for (unsigned k = 0, M = TypeIds.size(); k != M; ++k) {
|
||||||
|
unsigned TypeID = TypeIds[k];
|
||||||
|
unsigned SizeTypeID = Asm->SizeSLEB128(TypeID);
|
||||||
|
signed Action = k ? -(SizeAction + SizeTypeID) : 0;
|
||||||
|
SizeAction = SizeTypeID + Asm->SizeSLEB128(Action);
|
||||||
|
SizeSiteActions += SizeAction;
|
||||||
|
}
|
||||||
|
|
||||||
// Record the first action of the landing pad site.
|
// Record the first action of the landing pad site.
|
||||||
FirstAction = SizeActions + SizeSiteActions - SizeAction + 1;
|
FirstAction = SizeActions + SizeSiteActions - SizeAction + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Actions.push_back(FirstAction);
|
||||||
|
|
||||||
|
// Compute this sites contribution to size.
|
||||||
|
SizeActions += SizeSiteActions;
|
||||||
|
SizeSites += sizeof(int32_t) + // Site start.
|
||||||
|
sizeof(int32_t) + // Site length.
|
||||||
|
sizeof(int32_t) + // Landing pad.
|
||||||
|
Asm->SizeSLEB128(FirstAction); // Action.
|
||||||
}
|
}
|
||||||
|
|
||||||
Actions.push_back(FirstAction);
|
|
||||||
|
|
||||||
// Compute this sites contribution to size.
|
|
||||||
SizeActions += SizeSiteActions;
|
|
||||||
SizeSites += sizeof(int32_t) + // Site start.
|
|
||||||
sizeof(int32_t) + // Site length.
|
|
||||||
sizeof(int32_t) + // Landing pad.
|
|
||||||
Asm->SizeSLEB128(FirstAction); // Action.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Final tallies.
|
// Final tallies.
|
||||||
@ -2998,30 +3000,33 @@ private:
|
|||||||
Asm->EmitULEB128Bytes(SizeSites);
|
Asm->EmitULEB128Bytes(SizeSites);
|
||||||
Asm->EOL("Call-site table length");
|
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) {
|
for (unsigned i = 0, N = LandingPads.size(); i != N; ++i) {
|
||||||
const LandingPadInfo &LandingPad = LandingPads[i];
|
const LandingPadInfo &LandingPad = LandingPads[i];
|
||||||
EmitSectionOffset("label", "eh_func_begin",
|
for (unsigned j=0, E = LandingPad.BeginLabels.size(); j != E; ++j) {
|
||||||
LandingPad.BeginLabel, SubprogramCount, false, true);
|
EmitSectionOffset("label", "eh_func_begin",
|
||||||
Asm->EOL("Region start");
|
LandingPad.BeginLabels[j], SubprogramCount,
|
||||||
|
false, true);
|
||||||
|
Asm->EOL("Region start");
|
||||||
|
|
||||||
EmitDifference("label", LandingPad.EndLabel,
|
EmitDifference("label", LandingPad.EndLabels[j],
|
||||||
"label", LandingPad.BeginLabel);
|
"label", LandingPad.BeginLabels[j]);
|
||||||
Asm->EOL("Region length");
|
Asm->EOL("Region length");
|
||||||
|
|
||||||
if (LandingPad.TypeIds.empty()) {
|
if (LandingPad.TypeIds.empty()) {
|
||||||
if (TAI->getAddressSize() == sizeof(int32_t))
|
if (TAI->getAddressSize() == sizeof(int32_t))
|
||||||
Asm->EmitInt32(0);
|
Asm->EmitInt32(0);
|
||||||
else
|
else
|
||||||
Asm->EmitInt64(0);
|
Asm->EmitInt64(0);
|
||||||
} else {
|
} else {
|
||||||
EmitSectionOffset("label", "eh_func_begin", LandingPad.LandingPadLabel,
|
EmitSectionOffset("label", "eh_func_begin", LandingPad.LandingPadLabel,
|
||||||
SubprogramCount, false, true);
|
SubprogramCount, false, true);
|
||||||
}
|
}
|
||||||
Asm->EOL("Landing pad");
|
Asm->EOL("Landing pad");
|
||||||
|
|
||||||
Asm->EmitULEB128Bytes(Actions[i]);
|
Asm->EmitULEB128Bytes(Actions[i]);
|
||||||
Asm->EOL("Action");
|
Asm->EOL("Action");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Emit the actions.
|
// Emit the actions.
|
||||||
|
@ -1669,8 +1669,8 @@ LandingPadInfo &MachineModuleInfo::getOrCreateLandingPadInfo
|
|||||||
void MachineModuleInfo::addInvoke(MachineBasicBlock *LandingPad,
|
void MachineModuleInfo::addInvoke(MachineBasicBlock *LandingPad,
|
||||||
unsigned BeginLabel, unsigned EndLabel) {
|
unsigned BeginLabel, unsigned EndLabel) {
|
||||||
LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad);
|
LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad);
|
||||||
if (!LP.BeginLabel) LP.BeginLabel = BeginLabel;
|
LP.BeginLabels.push_back(BeginLabel);
|
||||||
LP.EndLabel = EndLabel;
|
LP.EndLabels.push_back(EndLabel);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// addLandingPad - Provide the label of a try LandingPad block.
|
/// addLandingPad - Provide the label of a try LandingPad block.
|
||||||
@ -1711,16 +1711,29 @@ void MachineModuleInfo::setIsFilterLandingPad(MachineBasicBlock *LandingPad) {
|
|||||||
void MachineModuleInfo::TidyLandingPads() {
|
void MachineModuleInfo::TidyLandingPads() {
|
||||||
for (unsigned i = 0; i != LandingPads.size(); ) {
|
for (unsigned i = 0; i != LandingPads.size(); ) {
|
||||||
LandingPadInfo &LandingPad = LandingPads[i];
|
LandingPadInfo &LandingPad = LandingPads[i];
|
||||||
LandingPad.BeginLabel = MappedLabel(LandingPad.BeginLabel);
|
|
||||||
LandingPad.EndLabel = MappedLabel(LandingPad.EndLabel);
|
|
||||||
LandingPad.LandingPadLabel = MappedLabel(LandingPad.LandingPadLabel);
|
LandingPad.LandingPadLabel = MappedLabel(LandingPad.LandingPadLabel);
|
||||||
|
|
||||||
if (!LandingPad.BeginLabel ||
|
if (!LandingPad.LandingPadLabel) {
|
||||||
!LandingPad.EndLabel ||
|
|
||||||
!LandingPad.LandingPadLabel) {
|
|
||||||
LandingPads.erase(LandingPads.begin() + i);
|
LandingPads.erase(LandingPads.begin() + i);
|
||||||
continue;
|
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;
|
++i;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user