<li><a href="#llvm_eh_sjlj_setjmp"><tt>llvm.eh.sjlj.setjmp</tt></a></li>
<li><a href="#llvm_eh_sjlj_longjmp"><tt>llvm.eh.sjlj.longjmp</tt></a></li>
<li><a href="#llvm_eh_sjlj_lsda"><tt>llvm.eh.sjlj.lsda</tt></a></li>
- <li><a href="#llvm_eh_sjlj_callsite"><tt>llvm.eh.sjlj.callsite</tt></a></li>
</ol></li>
<li><a href="#asm">Asm Table Formats</a>
<ol>
</div>
<!-- ======================================================================= -->
-<div class="doc_subsubsection">
- <a name="llvm_eh_sjlj_callsite">llvm.eh.sjlj.callsite</a>
-</div>
-
-<div class="doc_text">
-
-<pre>
- void %<a href="#llvm_eh_sjlj_callsite">llvm.eh.sjlj.callsite</a>(i32)
-</pre>
-
-<p>The SJLJ front-end allocates call site indices for invoke instrucitons.
- These values are passed to the back-end via the
- <a href="#llvm_eh_sjlj_callsite"><tt>llvm.eh.sjlj.callsite</tt></a>
- intrinsic, where they are used to build the LSDA call-site table.</p>
-
-</div>
-
-<!-- ======================================================================= -->
<div class="doc_section">
<a name="asm">Asm Table Formats</a>
</div>
// The alignment of the function.
unsigned Alignment;
- // The currently active call_site value
- unsigned CallSiteIndex;
-
- // The largest call_site value encountered
- unsigned MaxCallSiteIndex;
-
- // Call sites mapped to corresponding landing pads
- std::map<MachineBasicBlock*, unsigned> LandingPadCallSiteIndexMap;
-
public:
MachineFunction(Function *Fn, const TargetMachine &TM);
~MachineFunction();
///
void setAlignment(unsigned A) { Alignment = A; }
- /// getCallSiteIndex() - Get the current call site index
- ///
- unsigned getCallSiteIndex() { return CallSiteIndex; }
-
- /// setCallSiteIndex() - Set the current call site index
- ///
- void setCallSiteIndex(unsigned Idx) {
- CallSiteIndex = Idx;
- if (CallSiteIndex > MaxCallSiteIndex)
- MaxCallSiteIndex = CallSiteIndex;
- }
-
- /// getMaxCallSiteIndex() - Get the largest call site index issued
- ///
- unsigned getMaxCallSiteIndex() { return MaxCallSiteIndex; }
-
- /// setCallSiteIndexLandingPad() - Map the call site to a landing pad
- ///
- void setLandingPadCallSiteIndex(MachineBasicBlock *LandingPad,
- unsigned CallSite) {
- LandingPadCallSiteIndexMap[LandingPad] = CallSite;
- }
-
- /// getCallSiteIndexLandingPad() - Get landing pad for the call site index
- ///
- unsigned getLandingPadCallSiteIndex(MachineBasicBlock *LandingPad) {
- return LandingPadCallSiteIndexMap[LandingPad];
- }
-
- /// getCallSiteCount() - Get the count of call site entries
- ///
- unsigned getCallSiteCount() {
- return LandingPadCallSiteIndexMap.size();
- }
-
/// MachineFunctionInfo - Keep track of various per-function pieces of
/// information for backends that would like to do so.
///
def int_eh_sjlj_longjmp : Intrinsic<[llvm_void_ty], [llvm_ptr_ty]>;
def int_eh_sjlj_lsda : Intrinsic<[llvm_ptr_ty]>;
}
-let Properties = [IntrWriteMem] in {
- def int_eh_sjlj_callsite: Intrinsic<[llvm_void_ty], [llvm_i32_ty]>;
-}
//===---------------- Generic Variable Attribute Intrinsics----------------===//
//
Asm->EmitULEB128Bytes(SizeSites);
Asm->EOL("Call-site table length");
-
- assert(MF->getCallSiteCount() == CallSites.size());
-
// Emit the landing pad site information.
unsigned idx = 0;
for (SmallVectorImpl<CallSiteEntry>::const_iterator
MachineConstantPool(TM.getTargetData());
Alignment = TM.getTargetLowering()->getFunctionAlignment(F);
- CallSiteIndex = 0;
- MaxCallSiteIndex = 0;
-
// Set up jump table.
const TargetData &TD = *TM.getTargetData();
bool IsPic = TM.getRelocationModel() == Reloc::PIC_;
Offset));
return 0;
}
- case Intrinsic::eh_sjlj_callsite: {
- MachineFunction &MF = DAG.getMachineFunction();
- MF.setCallSiteIndex(cast<ConstantSDNode>(getValue(I.getOperand(1)))->getZExtValue());
- return 0;
- }
case Intrinsic::convertff:
case Intrinsic::convertfsi:
case Intrinsic::convertfui:
}
if (LandingPad && MMI) {
- MachineFunction &MF = DAG.getMachineFunction();
// Insert a label before the invoke call to mark the try range. This can be
// used to detect deletion of the invoke via the MachineModuleInfo.
BeginLabel = MMI->NextLabelID();
- // Map this landing pad to the current call site entry
- MF.setLandingPadCallSiteIndex(LandingPad, MF.getCallSiteIndex());
-
// Both PendingLoads and PendingExports must be flushed here;
// this call might not return.
(void)getRoot();