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()) {
91 if (Callee->getParent() ==
92 getLLVMCallSite()->getParent()->getParent()->getParent()) {
93 assert(getCalledFunction() == Callee);
96 SideEffectMap[Callee];
100 void setInputSummaryNode(
int APDepth,
102 void setOutputSummaryNode(
int APDepth,
SEGOperandNode *SummaryNode);
105 void setBackEdge(Function *Callee) {
106 SideEffectMap[Callee].IsBackEdge =
true;
109 bool isBackEdge(Function *Callee)
const {
110 if (SideEffectMap.count(Callee)) {
111 return SideEffectMap.at(Callee).IsBackEdge;
116 void setExpanded(Function *Callee) {
117 SideEffectMap[Callee].IsExpanded =
true;
120 bool isExpanded(Function *Callee)
const {
121 if (Callee && SideEffectMap.count(Callee)) {
122 return SideEffectMap.at(Callee).IsExpanded;
129 const SEGOperandNode *getPseudoInput(Function *,
size_t Index)
const;
136 bool hasCommonOutput()
const;
138 bool isCommonInput(
const SEGNodeBase *Node)
const {
139 return this->CommonInputNodes.count(Node);
142 size_t getNumOutputs(Function *)
const;
144 size_t getNumPseudoOutputs(Function *)
const;
146 size_t getNumInputs(Function *)
const;
148 size_t getNumCommonInputs()
const;
150 size_t getNumPseudoInputs(Function *)
const;
152 size_t getInputIndex(
const SEGNodeBase *Input)
const;
154 bool hasCallee(Function *Func)
const {
return SideEffectMap.count(Func); }
156 Function *getCalledFunction()
const {
157 return this->getLLVMCallSite().getCalledFunction();
160 static bool classof(
const SEGObject *N) {
161 return N->getKind() == SEGOBJK_CallSite;
168 std::map<Function *, SideEffectIO>::const_iterator It;
171 CalleeIterator(
bool End,
const std::map<Function *, SideEffectIO> &M) {
199 Function *operator*() {
return It->first; }
201 bool operator==(
const CalleeIterator &CIt) {
return It == CIt.It; }
203 bool operator!=(
const CalleeIterator &CIt) {
return It != CIt.It; }
210 const std::vector<SEGCallSiteInputStruct> &CommonIns;
211 const std::vector<SEGCallSiteInputStruct> &PseudoIns;
214 InputIterator(
bool End,
const std::vector<SEGCallSiteInputStruct> &CI,
215 const std::vector<SEGCallSiteInputStruct> &PI)
216 : I(End ? CI.size() + PI.size() : 0), CommonIns(CI), PseudoIns(PI) {}
219 : I(It.I), CommonIns(It.CommonIns), PseudoIns(It.PseudoIns) {}
233 return I < CommonIns.size() ? CommonIns[I]
234 : PseudoIns[I - CommonIns.size()];
237 bool operator==(
const InputIterator &It) {
return I == It.I; }
239 bool operator!=(
const InputIterator &It) {
return I != It.I; }
247 const std::vector<SEGCallSitePseudoOutputNode *> &PseudoOuts;
251 const std::vector<SEGCallSitePseudoOutputNode *> &POs)
252 : I(End ? (POs.size() + (CO ? 1 : 0)) : 0), CommonOut(CO),
256 : I(It.I), CommonOut(It.CommonOut), PseudoOuts(It.PseudoOuts) {}
291 CalleeIterator callee_end()
const {
292 return CalleeIterator(
true, SideEffectMap);
295 size_t callee_size()
const {
return SideEffectMap.size(); }
297 InputIterator input_begin(Function *Callee)
const {
298 auto It = SideEffectMap.find(Callee);
299 assert(It != SideEffectMap.end());
300 auto &PseudoInputsVec = It->second.PseudoInputs;
301 return InputIterator(
false, CommonInputs, PseudoInputsVec);
304 InputIterator input_end(Function *Callee)
const {
305 auto It = SideEffectMap.find(Callee);
306 assert(It != SideEffectMap.end());
307 auto &PseudoInputsVec = It->second.PseudoInputs;
308 return InputIterator(
true, CommonInputs, PseudoInputsVec);
311 std::vector<SEGCallSiteInputStruct>::const_iterator
312 common_input_begin()
const {
313 return CommonInputs.begin();
316 std::vector<SEGCallSiteInputStruct>::const_iterator common_input_end()
const {
317 return CommonInputs.end();
320 OutputIterator output_begin(Function *Callee)
const {
321 auto It = SideEffectMap.find(Callee);
322 assert(It != SideEffectMap.end());
323 auto &PseudoOutputsVec = It->second.PseudoOutputs;
324 return OutputIterator(
false, CommonOutput, PseudoOutputsVec);
327 OutputIterator output_end(Function *Callee)
const {
328 auto It = SideEffectMap.find(Callee);
329 assert(It != SideEffectMap.end());
330 auto &PseudoOutputsVec = It->second.PseudoOutputs;
331 return OutputIterator(
true, CommonOutput, PseudoOutputsVec);