9 #ifndef IR_SEG_SEGCALLSITE_H
10 #define IR_SEG_SEGCALLSITE_H
12 #include <llvm/IR/BasicBlock.h>
13 #include <llvm/IR/CallSite.h>
14 #include <llvm/IR/Function.h>
15 #include <llvm/IR/Instructions.h>
16 #include <llvm/IR/Value.h>
21 #include "IR/SEG/SEGCallSitePseudoInputNode.h"
22 #include "IR/SEG/SymbolicExprGraph.h"
37 : InputNode(N), InputIndex(I), IsCommonInput(C) {}
41 std::vector<SEGCallSiteInputStruct> PseudoInputs;
42 std::vector<SEGCallSitePseudoOutputNode *> PseudoOutputs;
43 bool IsBackEdge =
false;
44 bool IsExpanded =
false;
47 namespace FalconPlus {
52 friend class SEGSerializer;
56 std::set<const SEGNodeBase *> CommonInputNodes;
58 std::vector<SEGCallSiteInputStruct> CommonInputs;
61 std::map<Function *, SideEffectIO> SideEffectMap;
68 kvec<SEGCallSiteArgumentSummaryNode *> InputSummaryNodes;
69 kvec<SEGOperandNode *> OutputSummaryNodes;
73 friend class IntraFalcon;
74 friend class FalconPlus::IntraFalcon;
88 void addCallee(Function *Callee) {
89 if (getCalledFunction()) {
90 assert(getCalledFunction() == Callee);
92 SideEffectMap[Callee];
96 void setInputSummaryNode(
int APDepth,
98 void setOutputSummaryNode(
int APDepth,
SEGOperandNode *SummaryNode);
101 void setBackEdge(Function *Callee) {
102 SideEffectMap[Callee].IsBackEdge =
true;
105 bool isBackEdge(Function *Callee)
const {
106 if (SideEffectMap.count(Callee)) {
107 return SideEffectMap.at(Callee).IsBackEdge;
112 void setExpanded(Function *Callee) {
113 SideEffectMap[Callee].IsExpanded =
true;
116 bool isExpanded(Function *Callee)
const {
117 if (Callee && SideEffectMap.count(Callee)) {
118 return SideEffectMap.at(Callee).IsExpanded;
125 const SEGOperandNode *getPseudoInput(Function *,
size_t Index)
const;
132 bool hasCommonOutput()
const;
134 bool isCommonInput(
const SEGNodeBase *Node)
const {
135 return this->CommonInputNodes.count(Node);
138 size_t getNumOutputs(Function *)
const;
140 size_t getNumPseudoOutputs(Function *)
const;
142 size_t getNumInputs(Function *)
const;
144 size_t getNumCommonInputs()
const;
146 size_t getNumPseudoInputs(Function *)
const;
148 size_t getInputIndex(
const SEGNodeBase *Input)
const;
150 bool hasCallee(Function *Func)
const {
return SideEffectMap.count(Func); }
152 Function *getCalledFunction()
const {
153 return this->getLLVMCallSite().getCalledFunction();
156 static bool classof(
const SEGObject *N) {
157 return N->getKind() == SEGOBJK_CallSite;
164 std::map<Function *, SideEffectIO>::const_iterator It;
167 CalleeIterator(
bool End,
const std::map<Function *, SideEffectIO> &M) {
195 Function *operator*() {
return It->first; }
197 bool operator==(
const CalleeIterator &CIt) {
return It == CIt.It; }
199 bool operator!=(
const CalleeIterator &CIt) {
return It != CIt.It; }
206 const std::vector<SEGCallSiteInputStruct> &CommonIns;
207 const std::vector<SEGCallSiteInputStruct> &PseudoIns;
210 InputIterator(
bool End,
const std::vector<SEGCallSiteInputStruct> &CI,
211 const std::vector<SEGCallSiteInputStruct> &PI)
212 : I(End ? CI.size() + PI.size() : 0), CommonIns(CI), PseudoIns(PI) {}
215 : I(It.I), CommonIns(It.CommonIns), PseudoIns(It.PseudoIns) {}
229 return I < CommonIns.size() ? CommonIns[I]
230 : PseudoIns[I - CommonIns.size()];
233 bool operator==(
const InputIterator &It) {
return I == It.I; }
235 bool operator!=(
const InputIterator &It) {
return I != It.I; }
243 const std::vector<SEGCallSitePseudoOutputNode *> &PseudoOuts;
247 const std::vector<SEGCallSitePseudoOutputNode *> &POs)
248 : I(End ? (POs.size() + (CO ? 1 : 0)) : 0), CommonOut(CO),
252 : I(It.I), CommonOut(It.CommonOut), PseudoOuts(It.PseudoOuts) {}
287 CalleeIterator callee_end()
const {
288 return CalleeIterator(
true, SideEffectMap);
291 size_t callee_size()
const {
return SideEffectMap.size(); }
293 InputIterator input_begin(Function *Callee)
const {
294 auto It = SideEffectMap.find(Callee);
295 assert(It != SideEffectMap.end());
296 auto &PseudoInputsVec = It->second.PseudoInputs;
297 return InputIterator(
false, CommonInputs, PseudoInputsVec);
300 InputIterator input_end(Function *Callee)
const {
301 auto It = SideEffectMap.find(Callee);
302 assert(It != SideEffectMap.end());
303 auto &PseudoInputsVec = It->second.PseudoInputs;
304 return InputIterator(
true, CommonInputs, PseudoInputsVec);
307 std::vector<SEGCallSiteInputStruct>::const_iterator
308 common_input_begin()
const {
309 return CommonInputs.begin();
312 std::vector<SEGCallSiteInputStruct>::const_iterator common_input_end()
const {
313 return CommonInputs.end();
316 OutputIterator output_begin(Function *Callee)
const {
317 auto It = SideEffectMap.find(Callee);
318 assert(It != SideEffectMap.end());
319 auto &PseudoOutputsVec = It->second.PseudoOutputs;
320 return OutputIterator(
false, CommonOutput, PseudoOutputsVec);
323 OutputIterator output_end(Function *Callee)
const {
324 auto It = SideEffectMap.find(Callee);
325 assert(It != SideEffectMap.end());
326 auto &PseudoOutputsVec = It->second.PseudoOutputs;
327 return OutputIterator(
true, CommonOutput, PseudoOutputsVec);