class FunctionCall; class FunctionDeclaration; class FunctionDefinition; class Position; class ProgramElement; class ProgramUsage; class Statement; class SymbolTable; class Variable; struct InlineCandidate; struct InlineCandidateList; namespace Analysis { enumclass ReturnComplexity; }
/** * Converts a FunctionCall in the IR to a set of statements to be injected ahead of the function * call, and a replacement expression. Can also detect cases where inlining isn't cleanly possible * (e.g. return statements nested inside of a loop construct). The inliner isn't able to guarantee * identical-to-GLSL execution order if the inlined function has visible side effects.
*/ class Inliner { public:
Inliner(const Context* context) : fContext(context) {}
/** Inlines any eligible functions that are found. Returns true if any changes are made. */ bool analyze(const std::vector<std::unique_ptr<ProgramElement>>& elements,
SymbolTable* symbols,
ProgramUsage* usage);
private: using VariableRewriteMap = skia_private::THashMap<const Variable*, std::unique_ptr<Expression>>;
/** * Searches the rewrite map for an rewritten Variable* for the passed-in one. Asserts if the * rewrite map doesn't contain the variable, or contains a different type of expression.
*/ staticconst Variable* RemapVariable(const Variable* variable, const VariableRewriteMap* varMap);
using FunctionSizeCache = skia_private::THashMap<const FunctionDeclaration*, int>; int getFunctionSize(const FunctionDeclaration& fnDecl, FunctionSizeCache* cache);
/** * Processes the passed-in FunctionCall expression. The FunctionCall expression should be * replaced with `fReplacementExpr`. If non-null, `fInlinedBody` should be inserted immediately * above the statement containing the inlined expression.
*/ struct InlinedCall {
std::unique_ptr<Block> fInlinedBody;
std::unique_ptr<Expression> fReplacementExpr;
};
InlinedCall inlineCall(const FunctionCall&,
SymbolTable*, const ProgramUsage&, const FunctionDeclaration* caller);
/** Adds a scope to inlined bodies returned by `inlineCall`, if one is required. */ void ensureScopedBlocks(Statement* inlinedBody, Statement* parentStmt);
/** Checks whether inlining is viable for a FunctionCall, modulo recursion and function size. */ bool isSafeToInline(const FunctionDefinition* functionDef, const ProgramUsage& usage);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.