| 21 | }; |
| 22 | |
| 23 | void collectDevirtCallBases(std::vector<DevirtCallBase> &Bases, const Value &V, |
| 24 | uint64_t Offset) { |
| 25 | for (const Use &U : V.uses()) { |
| 26 | const auto *User = U.getUser(); |
| 27 | if (!User) |
| 28 | continue; |
| 29 | |
| 30 | if (isa<BitCastInst>(User)) |
| 31 | return collectDevirtCallBases(Bases, *User, Offset); |
| 32 | |
| 33 | if (const auto *CB = dyn_cast<CallBase>(User)) { |
| 34 | if (CB->getCalledFunction()) |
| 35 | continue; |
| 36 | |
| 37 | Bases.emplace_back(CB->getCalledOperand(), Offset); |
| 38 | return; |
| 39 | } |
| 40 | } |
| 41 | } // namespace |
| 42 | |
| 43 | void collectDevirtCallBases(std::vector<DevirtCallBase> &Bases, const Value &V, |
| 44 | uint64_t Offset, const Module &M) { |
no test coverage detected