[llvm-commits] CVS: llvm/lib/CodeGen/DwarfWriter.cpp MachineModuleInfo.cpp
Anton Korobeynikov
asl at math.spbu.ru
Thu May 10 15:35:23 PDT 2007
Changes in directory llvm/lib/CodeGen:
DwarfWriter.cpp updated: 1.138 -> 1.139
MachineModuleInfo.cpp updated: 1.9 -> 1.10
---
Log message:
Allow multiple invokes per landing pad. This (probably) fixes PR1410: http://llvm.org/PR1410 .
---
Diffs of the changes: (+75 -57)
DwarfWriter.cpp | 103 ++++++++++++++++++++++++++------------------------
MachineModuleInfo.cpp | 29 ++++++++++----
2 files changed, 75 insertions(+), 57 deletions(-)
Index: llvm/lib/CodeGen/DwarfWriter.cpp
diff -u llvm/lib/CodeGen/DwarfWriter.cpp:1.138 llvm/lib/CodeGen/DwarfWriter.cpp:1.139
--- llvm/lib/CodeGen/DwarfWriter.cpp:1.138 Thu May 10 13:40:24 2007
+++ llvm/lib/CodeGen/DwarfWriter.cpp Thu May 10 17:34:59 2007
@@ -2933,40 +2933,42 @@
const std::vector<unsigned> &TypeIds = LandingPad.TypeIds;
unsigned SizeAction = 0;
signed FirstAction;
-
- 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.
- // This can change if a function is inlined.
- Filter = &LandingPad;
- SizeAction = Asm->SizeSLEB128(-1) + Asm->SizeSLEB128(0);
- 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 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);
+
+ 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.
+ // This can change if a function is inlined.
+ Filter = &LandingPad;
+ SizeAction = Asm->SizeSLEB128(-1) + Asm->SizeSLEB128(0);
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.
+ FirstAction = SizeActions + SizeSiteActions - SizeAction + 1;
}
+
+ Actions.push_back(FirstAction);
- // Record the first action of the landing pad site.
- FirstAction = SizeActions + SizeSiteActions - SizeAction + 1;
+ // 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.
@@ -2998,30 +3000,33 @@
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];
- EmitSectionOffset("label", "eh_func_begin",
- LandingPad.BeginLabel, SubprogramCount, false, true);
- Asm->EOL("Region start");
+ for (unsigned j=0, E = LandingPad.BeginLabels.size(); j != E; ++j) {
+ EmitSectionOffset("label", "eh_func_begin",
+ LandingPad.BeginLabels[j], SubprogramCount,
+ false, true);
+ Asm->EOL("Region start");
- EmitDifference("label", LandingPad.EndLabel,
- "label", LandingPad.BeginLabel);
- Asm->EOL("Region length");
+ EmitDifference("label", LandingPad.EndLabels[j],
+ "label", LandingPad.BeginLabels[j]);
+ Asm->EOL("Region length");
- if (LandingPad.TypeIds.empty()) {
- if (TAI->getAddressSize() == sizeof(int32_t))
- Asm->EmitInt32(0);
- else
- Asm->EmitInt64(0);
- } else {
- EmitSectionOffset("label", "eh_func_begin", LandingPad.LandingPadLabel,
- SubprogramCount, false, true);
- }
- Asm->EOL("Landing pad");
+ if (LandingPad.TypeIds.empty()) {
+ if (TAI->getAddressSize() == sizeof(int32_t))
+ Asm->EmitInt32(0);
+ else
+ Asm->EmitInt64(0);
+ } else {
+ EmitSectionOffset("label", "eh_func_begin", LandingPad.LandingPadLabel,
+ SubprogramCount, false, true);
+ }
+ Asm->EOL("Landing pad");
- Asm->EmitULEB128Bytes(Actions[i]);
- Asm->EOL("Action");
+ Asm->EmitULEB128Bytes(Actions[i]);
+ Asm->EOL("Action");
+ }
}
// Emit the actions.
Index: llvm/lib/CodeGen/MachineModuleInfo.cpp
diff -u llvm/lib/CodeGen/MachineModuleInfo.cpp:1.9 llvm/lib/CodeGen/MachineModuleInfo.cpp:1.10
--- llvm/lib/CodeGen/MachineModuleInfo.cpp:1.9 Wed May 2 20:11:53 2007
+++ llvm/lib/CodeGen/MachineModuleInfo.cpp Thu May 10 17:34:59 2007
@@ -1669,8 +1669,8 @@
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,16 +1711,29 @@
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;
}
More information about the llvm-commits
mailing list