22 #define DEBUG_TYPE "abstract-call-sites"
24 STATISTIC(NumCallbackCallSites,
"Number of callback call sites created");
26 "Number of direct abstract call sites created");
27 STATISTIC(NumInvalidAbstractCallSitesUnknownUse,
28 "Number of invalid abstract call sites created (unknown use)");
29 STATISTIC(NumInvalidAbstractCallSitesUnknownCallee,
30 "Number of invalid abstract call sites created (unknown callee)");
31 STATISTIC(NumInvalidAbstractCallSitesNoCallback,
32 "Number of invalid abstract call sites created (no callback)");
40 MDNode *CallbackMD =
Callee->getMetadata(LLVMContext::MD_callback);
45 MDNode *OpMD = cast<MDNode>(
Op.get());
46 auto *CBCalleeIdxAsCM = cast<ConstantAsMetadata>(OpMD->
getOperand(0));
48 cast<ConstantInt>(CBCalleeIdxAsCM->getValue())->getZExtValue();
50 CallbackUses.push_back(CB.
arg_begin() + CBCalleeIdx);
65 if (
ConstantExpr *CE = dyn_cast<ConstantExpr>(U->getUser()))
66 if (CE->hasOneUse() && CE->isCast()) {
67 U = &*CE->use_begin();
68 CB = dyn_cast<CallBase>(U->getUser());
72 NumInvalidAbstractCallSitesUnknownUse++;
80 NumDirectAbstractCallSites++;
88 NumInvalidAbstractCallSitesUnknownCallee++;
93 MDNode *CallbackMD =
Callee->getMetadata(LLVMContext::MD_callback);
95 NumInvalidAbstractCallSitesNoCallback++;
101 MDNode *CallbackEncMD =
nullptr;
103 MDNode *OpMD = cast<MDNode>(
Op.get());
104 auto *CBCalleeIdxAsCM = cast<ConstantAsMetadata>(OpMD->
getOperand(0));
106 cast<ConstantInt>(CBCalleeIdxAsCM->getValue())->getZExtValue();
107 if (CBCalleeIdx != UseIdx)
109 CallbackEncMD = OpMD;
113 if (!CallbackEncMD) {
114 NumInvalidAbstractCallSitesNoCallback++;
119 NumCallbackCallSites++;
123 unsigned NumCallOperands = CB->
arg_size();
127 auto *OpAsCM = cast<ConstantAsMetadata>(OpAsM);
128 assert(OpAsCM->getType()->isIntegerTy(64) &&
129 "Malformed !callback metadata");
131 int64_t Idx = cast<ConstantInt>(OpAsCM->getValue())->getSExtValue();
132 assert(-1 <= Idx && Idx <= NumCallOperands &&
133 "Out-of-bounds !callback metadata index");
143 auto *VarArgFlagAsCM = cast<ConstantAsMetadata>(VarArgFlagAsM);
144 assert(VarArgFlagAsCM->getType()->isIntegerTy(1) &&
145 "Malformed !callback metadata var-arg flag");
147 if (VarArgFlagAsCM->getValue()->isNullValue())
151 for (
unsigned u =
Callee->arg_size(); u < NumCallOperands; u++)