49 bool analyze(
const std::vector<std::unique_ptr<ProgramElement>>& elements,
58 void buildCandidateList(
const std::vector<std::unique_ptr<ProgramElement>>& elements,
61 InlineCandidateList* candidateList);
63 std::unique_ptr<Expression> inlineExpression(Position
pos,
64 VariableRewriteMap* varMap,
65 SymbolTable* symbolTableForExpression,
66 const Expression& expression);
67 std::unique_ptr<Statement> inlineStatement(Position
pos,
68 VariableRewriteMap* varMap,
69 SymbolTable* symbolTableForStatement,
70 std::unique_ptr<Expression>* resultExpr,
72 const Statement& statement,
73 const ProgramUsage&
usage,
80 static const Variable* RemapVariable(
const Variable* variable,
81 const VariableRewriteMap* varMap);
84 bool candidateCanBeInlined(
const InlineCandidate& candidate,
85 const ProgramUsage&
usage,
86 InlinabilityCache* cache);
88 bool functionCanBeInlined(
const FunctionDeclaration& funcDecl,
89 const ProgramUsage&
usage,
90 InlinabilityCache* cache);
93 int getFunctionSize(
const FunctionDeclaration& fnDecl, FunctionSizeCache* cache);
101 std::unique_ptr<Block> fInlinedBody;
102 std::unique_ptr<Expression> fReplacementExpr;
104 InlinedCall inlineCall(
const FunctionCall&,
107 const FunctionDeclaration* caller);
110 void ensureScopedBlocks(Statement* inlinedBody, Statement* parentStmt);
113 bool isSafeToInline(
const FunctionDefinition* functionDef,
const ProgramUsage&
usage);
115 const Context* fContext =
nullptr;
117 int fInlinedStatementCounter = 0;
static void usage(char *argv0)