[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