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 {
49 class IntraAliasAnalysis;
53 friend class SEGSerializer;
57 std::set<const SEGNodeBase *> CommonInputNodes;
59 std::vector<SEGCallSiteInputStruct> CommonInputs;
62 std::map<Function *, SideEffectIO> SideEffectMap;
69 kvec<SEGCallSiteArgumentSummaryNode *> InputSummaryNodes;
70 kvec<SEGOperandNode *> OutputSummaryNodes;
74 friend class IntraFalcon;
75 friend class FalconPlus::IntraFalcon;
76 friend class FalconPlus::IntraAliasAnalysis;
77 friend class MantaIntraFalcon;
91 void addCallee(Function *Callee) {
92 if (getCalledFunction()) {
93 assert(getCalledFunction() == Callee);
95 SideEffectMap[Callee];
99 void setInputSummaryNode(
int APDepth,
101 void setOutputSummaryNode(
int APDepth,
SEGOperandNode *SummaryNode);
104 void setBackEdge(Function *Callee) {
105 SideEffectMap[Callee].IsBackEdge =
true;
108 bool isBackEdge(Function *Callee)
const {
109 if (SideEffectMap.count(Callee)) {
110 return SideEffectMap.at(Callee).IsBackEdge;
115 void setExpanded(Function *Callee) {
116 SideEffectMap[Callee].IsExpanded =
true;
119 bool isExpanded(Function *Callee)
const {
120 if (Callee && SideEffectMap.count(Callee)) {
121 return SideEffectMap.at(Callee).IsExpanded;
128 const SEGOperandNode *getPseudoInput(Function *,
size_t Index)
const;
135 bool hasCommonOutput()
const;
137 bool isCommonInput(
const SEGNodeBase *Node)
const {
138 return this->CommonInputNodes.count(Node);
141 size_t getNumOutputs(Function *)
const;
143 size_t getNumPseudoOutputs(Function *)
const;
145 size_t getNumInputs(Function *)
const;
147 size_t getNumCommonInputs()
const;
149 size_t getNumPseudoInputs(Function *)
const;
151 size_t getInputIndex(
const SEGNodeBase *Input)
const;
153 bool hasCallee(Function *Func)
const {
return SideEffectMap.count(Func); }
155 Function *getCalledFunction()
const {
156 return this->getLLVMCallSite().getCalledFunction();
159 static bool classof(
const SEGObject *N) {
160 return N->getKind() == SEGOBJK_CallSite;
167 std::map<Function *, SideEffectIO>::const_iterator It;
170 CalleeIterator(
bool End,
const std::map<Function *, SideEffectIO> &M) {
198 Function *operator*() {
return It->first; }
200 bool operator==(
const CalleeIterator &CIt) {
return It == CIt.It; }
202 bool operator!=(
const CalleeIterator &CIt) {
return It != CIt.It; }
209 const std::vector<SEGCallSiteInputStruct> &CommonIns;
210 const std::vector<SEGCallSiteInputStruct> &PseudoIns;
213 InputIterator(
bool End,
const std::vector<SEGCallSiteInputStruct> &CI,
214 const std::vector<SEGCallSiteInputStruct> &PI)
215 : I(End ? CI.size() + PI.size() : 0), CommonIns(CI), PseudoIns(PI) {}
218 : I(It.I), CommonIns(It.CommonIns), PseudoIns(It.PseudoIns) {}
232 return I < CommonIns.size() ? CommonIns[I]
233 : PseudoIns[I - CommonIns.size()];
236 bool operator==(
const InputIterator &It) {
return I == It.I; }
238 bool operator!=(
const InputIterator &It) {
return I != It.I; }
246 const std::vector<SEGCallSitePseudoOutputNode *> &PseudoOuts;
250 const std::vector<SEGCallSitePseudoOutputNode *> &POs)
251 : I(End ? (POs.size() + (CO ? 1 : 0)) : 0), CommonOut(CO),
255 : I(It.I), CommonOut(It.CommonOut), PseudoOuts(It.PseudoOuts) {}
290 CalleeIterator callee_end()
const {
291 return CalleeIterator(
true, SideEffectMap);
294 size_t callee_size()
const {
return SideEffectMap.size(); }
296 InputIterator input_begin(Function *Callee)
const {
297 auto It = SideEffectMap.find(Callee);
298 assert(It != SideEffectMap.end());
299 auto &PseudoInputsVec = It->second.PseudoInputs;
300 return InputIterator(
false, CommonInputs, PseudoInputsVec);
303 InputIterator input_end(Function *Callee)
const {
304 auto It = SideEffectMap.find(Callee);
305 assert(It != SideEffectMap.end());
306 auto &PseudoInputsVec = It->second.PseudoInputs;
307 return InputIterator(
true, CommonInputs, PseudoInputsVec);
310 std::vector<SEGCallSiteInputStruct>::const_iterator
311 common_input_begin()
const {
312 return CommonInputs.begin();
315 std::vector<SEGCallSiteInputStruct>::const_iterator common_input_end()
const {
316 return CommonInputs.end();
319 OutputIterator output_begin(Function *Callee)
const {
320 auto It = SideEffectMap.find(Callee);
321 assert(It != SideEffectMap.end());
322 auto &PseudoOutputsVec = It->second.PseudoOutputs;
323 return OutputIterator(
false, CommonOutput, PseudoOutputsVec);
326 OutputIterator output_end(Function *Callee)
const {
327 auto It = SideEffectMap.find(Callee);
328 assert(It != SideEffectMap.end());
329 auto &PseudoOutputsVec = It->second.PseudoOutputs;
330 return OutputIterator(
true, CommonOutput, PseudoOutputsVec);