namespace llvm {
namespace bolt {
-class Inliner : public BinaryFunctionPass {
-private:
- enum InliningType : char {
- INL_NONE = 0, /// Cannot inline
- INL_TAILCALL, /// Can inline at tail call site
- INL_ANY /// Can inline at any call site
- };
+enum InliningType : char {
+ INL_NONE = 0, /// Cannot inline
+ INL_TAILCALL, /// Can inline at tail call site
+ INL_ANY /// Can inline at any call site
+};
+
+struct InliningInfo {
+ InliningType Type{INL_NONE};
+ uint64_t SizeAfterInlining{0};
+ uint64_t SizeAfterTailCallInlining{0};
- struct InliningInfo {
- InliningType Type{INL_NONE};
- uint64_t SizeAfterInlining{0};
- uint64_t SizeAfterTailCallInlining{0};
+ InliningInfo(InliningType Type = INL_NONE) : Type(Type) {}
+};
- InliningInfo(InliningType Type = INL_NONE) : Type(Type) {}
- };
+/// Check if the inliner can handle inlining of \p BF.
+InliningInfo getInliningInfo(const BinaryFunction &BF);
+class Inliner : public BinaryFunctionPass {
std::unordered_map<const BinaryFunction *, InliningInfo> InliningCandidates;
/// Count total amount of bytes inlined for all instances of Inliner.
inlineCall(BinaryBasicBlock &CallerBB, BinaryBasicBlock::iterator CallInst,
const BinaryFunction &Callee);
- /// Check if the inliner can handle inlining of \p BF.
- InliningInfo getInliningInfo(const BinaryFunction &BF) const;
-
public:
explicit Inliner(const cl::opt<bool> &PrintPass)
: BinaryFunctionPass(PrintPass) {}
return SizeOfTailCallInst;
}
-Inliner::InliningInfo Inliner::getInliningInfo(const BinaryFunction &BF) const {
- if (!shouldOptimize(BF))
- return INL_NONE;
-
+InliningInfo getInliningInfo(const BinaryFunction &BF) {
const BinaryContext &BC = BF.getBinaryContext();
bool DirectSP = false;
bool HasCFI = false;
void Inliner::findInliningCandidates(BinaryContext &BC) {
for (const auto &BFI : BC.getBinaryFunctions()) {
const BinaryFunction &Function = BFI.second;
+ if (!shouldOptimize(Function))
+ continue;
const InliningInfo InlInfo = getInliningInfo(Function);
if (InlInfo.Type != INL_NONE)
InliningCandidates[&Function] = InlInfo;