[llvm-commits] [llvm] r94055 - in /llvm/trunk: include/llvm/CodeGen/MachineModuleInfo.h include/llvm/Function.h lib/CodeGen/AsmPrinter/DwarfException.cpp lib/CodeGen/MachineModuleInfo.cpp lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp lib/CodeGen/SjLjEHPrepare.cpp
Jim Grosbach
grosbach at apple.com
Thu Jan 21 12:08:10 PST 2010
On Jan 20, 2010, at 6:16 PM, Chris Lattner wrote:
>
> On Jan 20, 2010, at 4:43 PM, Jim Grosbach wrote:
>
>> Author: grosbach
>> Date: Wed Jan 20 18:43:30 2010
>> New Revision: 94055
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=94055&view=rev
>> Log:
>> Make sure that landing pad entries in the EH call site table are in the proper
>> order for SjLj style exception handling.
>
> hi Jim,
>
>> +++ llvm/trunk/include/llvm/Function.h Wed Jan 20 18:43:30 2010
>> @@ -24,6 +24,7 @@
>> #include "llvm/Argument.h"
>> #include "llvm/Attributes.h"
>> #include "llvm/Support/Compiler.h"
>> +#include "llvm/ADT/DenseMap.h"
>>
>> namespace llvm {
>>
>> @@ -86,6 +87,8 @@
>> mutable ArgumentListType ArgumentList; ///< The formal arguments
>> ValueSymbolTable *SymTab; ///< Symbol table of args/instructions
>> AttrListPtr AttributeList; ///< Parameter attributes
>> + DenseMap<Instruction*, unsigned>
>> + CallSiteNumbering; ///< SjLj EH call site numbering
>
> Why are you adding this to llvm::Function? SjLj EH should not impact anything that core to the entire compiler. Maybe codegen should have a DenseMap<Instruction*, unsigned> ?
>
Yeah, I was worried about that. You're right that's not the best place for it. I've been looking for a better alternative, but that far don't have a good answer. I'll back this out 'til I have one.
Thanks for having a look!
-Jim
>
>>
>> // HasLazyArguments is stored in Value::SubclassData.
>> /*bool HasLazyArguments;*/
>> @@ -165,7 +168,19 @@
>> setValueSubclassData((getSubclassDataFromValue() & 1) |
>> (static_cast<unsigned>(CC) << 1));
>> }
>> -
>> +
>> + /// setCallSiteNumber - Set the call site number mapping for an invoke
>> + /// in the function
>> + void setCallSiteNumber(Instruction *II, unsigned Num) {
>> + CallSiteNumbering[II] = Num;
>> + }
>> +
>> + /// getCallSiteNumber - Get the call site number for an invoke instruction
>> + unsigned getCallSiteNumber(Instruction *II) {
>> + if (CallSiteNumbering.count(II) == 0) return 0;
>> + return CallSiteNumbering[II];
>> + }
>> +
>> /// getAttributes - Return the attribute list for this Function.
>> ///
>> const AttrListPtr &getAttributes() const { return AttributeList; }
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp?rev=94055&r1=94054&r2=94055&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp Wed Jan 20 18:43:30 2010
>> @@ -590,7 +590,16 @@
>> }
>>
>> // Otherwise, create a new call-site.
>> - CallSites.push_back(Site);
>> + if (MAI->getExceptionHandlingType() == ExceptionHandling::Dwarf)
>> + CallSites.push_back(Site);
>> + else {
>> + // SjLj EH must maintain the call sites in the order assigned
>> + // to them by the SjLjPrepare pass.
>> + unsigned SiteNo = MMI->getCallSiteBeginLabel(BeginLabel);
>> + if (CallSites.size() < SiteNo)
>> + CallSites.resize(SiteNo);
>> + CallSites[SiteNo - 1] = Site;
>> + }
>> PreviousIsInvoke = true;
>> } else {
>> // Create a gap.
>>
>> Modified: llvm/trunk/lib/CodeGen/MachineModuleInfo.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineModuleInfo.cpp?rev=94055&r1=94054&r2=94055&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/MachineModuleInfo.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/MachineModuleInfo.cpp Wed Jan 20 18:43:30 2010
>> @@ -71,6 +71,7 @@
>>
>> // Clean up exception info.
>> LandingPads.clear();
>> + CallSiteMap.clear();
>> TypeInfos.clear();
>> FilterIds.clear();
>> FilterEnds.clear();
>>
>> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=94055&r1=94054&r2=94055&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Wed Jan 20 18:43:30 2010
>> @@ -5049,6 +5049,12 @@
>> // used to detect deletion of the invoke via the MachineModuleInfo.
>> BeginLabel = MMI->NextLabelID();
>>
>> + // Keep track of which landing pads go with which invokes. SjLj uses
>> + // this to maintain the ordering of pads in the LSDA. Dwarf ignores it.
>> + Function *F = LandingPad->getParent()->getFunction();
>> + MMI->setCallSiteBeginLabel(BeginLabel,
>> + F->getCallSiteNumber(CS.getInstruction()));
>> +
>> // Both PendingLoads and PendingExports must be flushed here;
>> // this call might not return.
>> (void)getRoot();
>>
>> Modified: llvm/trunk/lib/CodeGen/SjLjEHPrepare.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SjLjEHPrepare.cpp?rev=94055&r1=94054&r2=94055&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/SjLjEHPrepare.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/SjLjEHPrepare.cpp Wed Jan 20 18:43:30 2010
>> @@ -474,8 +474,10 @@
>> // At this point, we are all set up, update the invoke instructions
>> // to mark their call_site values, and fill in the dispatch switch
>> // accordingly.
>> - for (unsigned i = 0, e = Invokes.size(); i != e; ++i)
>> + for (unsigned i = 0, e = Invokes.size(); i != e; ++i) {
>> + F.setCallSiteNumber(Invokes[i], i+1);
>> markInvokeCallSite(Invokes[i], i+1, CallSite, DispatchSwitch);
>> + }
>>
>> // The front end has likely added calls to _Unwind_Resume. We need
>> // to find those calls and mark the call_site as -1 immediately prior.
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
More information about the llvm-commits
mailing list