diff options
author | Anton Korobeynikov <asl@math.spbu.ru> | 2007-05-10 22:34:59 +0000 |
---|---|---|
committer | Anton Korobeynikov <asl@math.spbu.ru> | 2007-05-10 22:34:59 +0000 |
commit | eeb37e0b80f6f71b7620099083e7c10a9978ef86 (patch) | |
tree | 788c3ad913a586e08e3be62143ae10ee5e76d2ea /lib/CodeGen/DwarfWriter.cpp | |
parent | c1fe16610ade320bade1a970fa2721b0558321b8 (diff) |
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
Diffstat (limited to 'lib/CodeGen/DwarfWriter.cpp')
-rw-r--r-- | lib/CodeGen/DwarfWriter.cpp | 103 |
1 files changed, 54 insertions, 49 deletions
diff --git a/lib/CodeGen/DwarfWriter.cpp b/lib/CodeGen/DwarfWriter.cpp index d8f58ba048..44809213f9 100644 --- a/lib/CodeGen/DwarfWriter.cpp +++ b/lib/CodeGen/DwarfWriter.cpp @@ -2933,40 +2933,42 @@ private: 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 @@ 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]; - 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. |