C++: Rename shouldPrintFunction to shouldPrintDeclaration

This commit is contained in:
Jeroen Ketema
2023-07-19 16:23:21 +02:00
parent 0a0e9bb25b
commit 2a63116fc2
14 changed files with 96 additions and 88 deletions

View File

@@ -0,0 +1,5 @@
---
category: breaking
---
* The `shouldPrintFunction` predicate from `PrintAstConfiguration` has been replaced by `shouldPrintDeclaration`. Users should now override `shouldPrintDeclaration` if they want to limit the declarations that should be printed.
* The `shouldPrintFunction` predicate from `PrintIRConfiguration` has been replaced by `shouldPrintDeclaration`. Users should now override `shouldPrintDeclaration` if they want to limit the declarations that should be printed.

View File

@@ -18,10 +18,10 @@ external string selectedSourceFile();
class Cfg extends PrintAstConfiguration { class Cfg extends PrintAstConfiguration {
/** /**
* Holds if the AST for `func` should be printed. * Holds if the AST for `decl` should be printed.
* Print All functions from the selected file. * Print All declarations from the selected file.
*/ */
override predicate shouldPrintFunction(Function func) { override predicate shouldPrintDeclaration(Declaration decl) {
func.getFile() = getFileBySourceArchiveName(selectedSourceFile()) decl.getFile() = getFileBySourceArchiveName(selectedSourceFile())
} }
} }

View File

@@ -10,7 +10,7 @@ private predicate shouldPrintDeclaration(Declaration decl) {
or or
not exists(PrintAstConfiguration c) not exists(PrintAstConfiguration c)
or or
exists(PrintAstConfiguration config | config.shouldPrintFunction(decl)) exists(PrintAstConfiguration config | config.shouldPrintDeclaration(decl))
} }
/** /**

View File

@@ -9,13 +9,13 @@ import cpp
import PrintAST import PrintAST
/** /**
* Temporarily tweak this class or make a copy to control which functions are * Temporarily tweak this class or make a copy to control which declarations are
* printed. * printed.
*/ */
class Cfg extends PrintAstConfiguration { class Cfg extends PrintAstConfiguration {
/** /**
* TWEAK THIS PREDICATE AS NEEDED. * TWEAK THIS PREDICATE AS NEEDED.
* Holds if the AST for `func` should be printed. * Holds if the AST for `decl` should be printed.
*/ */
override predicate shouldPrintFunction(Function func) { any() } override predicate shouldPrintDeclaration(Declaration decl) { any() }
} }

View File

@@ -2,8 +2,8 @@
* Provides queries to pretty-print a C++ AST as a graph. * Provides queries to pretty-print a C++ AST as a graph.
* *
* By default, this will print the AST for all functions in the database. To change this behavior, * By default, this will print the AST for all functions in the database. To change this behavior,
* extend `PrintASTConfiguration` and override `shouldPrintFunction` to hold for only the functions * extend `PrintASTConfiguration` and override `shouldPrintDeclaration` to hold for only the
* you wish to view the AST for. * declarations you wish to view the AST for.
*/ */
import cpp import cpp
@@ -12,7 +12,7 @@ private import semmle.code.cpp.Print
private newtype TPrintAstConfiguration = MkPrintAstConfiguration() private newtype TPrintAstConfiguration = MkPrintAstConfiguration()
/** /**
* The query can extend this class to control which functions are printed. * The query can extend this class to control which declarations are printed.
*/ */
class PrintAstConfiguration extends TPrintAstConfiguration { class PrintAstConfiguration extends TPrintAstConfiguration {
/** /**
@@ -21,14 +21,17 @@ class PrintAstConfiguration extends TPrintAstConfiguration {
string toString() { result = "PrintASTConfiguration" } string toString() { result = "PrintASTConfiguration" }
/** /**
* Holds if the AST for `func` should be printed. By default, holds for all * Holds if the AST for `decl` should be printed. By default, holds for all
* functions. * functions. Currently, does not support any other declaration types.
*/ */
predicate shouldPrintFunction(Function func) { any() } predicate shouldPrintDeclaration(Declaration decl) { any() }
} }
private predicate shouldPrintFunction(Function func) { private predicate shouldPrintDeclaration(Declaration decl) {
exists(PrintAstConfiguration config | config.shouldPrintFunction(func)) exists(PrintAstConfiguration config |
config.shouldPrintDeclaration(decl) and
decl instanceof Function
)
} }
bindingset[s] bindingset[s]
@@ -86,21 +89,21 @@ private Function getEnclosingFunction(Locatable ast) {
* nodes for things like parameter lists and constructor init lists. * nodes for things like parameter lists and constructor init lists.
*/ */
private newtype TPrintAstNode = private newtype TPrintAstNode =
TAstNode(Locatable ast) { shouldPrintFunction(getEnclosingFunction(ast)) } or TAstNode(Locatable ast) { shouldPrintDeclaration(getEnclosingFunction(ast)) } or
TDeclarationEntryNode(DeclStmt stmt, DeclarationEntry entry) { TDeclarationEntryNode(DeclStmt stmt, DeclarationEntry entry) {
// We create a unique node for each pair of (stmt, entry), to avoid having one node with // We create a unique node for each pair of (stmt, entry), to avoid having one node with
// multiple parents due to extractor bug CPP-413. // multiple parents due to extractor bug CPP-413.
stmt.getADeclarationEntry() = entry and stmt.getADeclarationEntry() = entry and
shouldPrintFunction(stmt.getEnclosingFunction()) shouldPrintDeclaration(stmt.getEnclosingFunction())
} or } or
TParametersNode(Function func) { shouldPrintFunction(func) } or TParametersNode(Function func) { shouldPrintDeclaration(func) } or
TConstructorInitializersNode(Constructor ctor) { TConstructorInitializersNode(Constructor ctor) {
ctor.hasEntryPoint() and ctor.hasEntryPoint() and
shouldPrintFunction(ctor) shouldPrintDeclaration(ctor)
} or } or
TDestructorDestructionsNode(Destructor dtor) { TDestructorDestructionsNode(Destructor dtor) {
dtor.hasEntryPoint() and dtor.hasEntryPoint() and
shouldPrintFunction(dtor) shouldPrintDeclaration(dtor)
} }
/** /**
@@ -159,9 +162,9 @@ class PrintAstNode extends TPrintAstNode {
/** /**
* Holds if this node should be printed in the output. By default, all nodes * Holds if this node should be printed in the output. By default, all nodes
* within a function are printed, but the query can override * within a function are printed, but the query can override
* `PrintASTConfiguration.shouldPrintFunction` to filter the output. * `PrintASTConfiguration.shouldPrintDeclaration` to filter the output.
*/ */
final predicate shouldPrint() { shouldPrintFunction(this.getEnclosingFunction()) } final predicate shouldPrint() { shouldPrintDeclaration(this.getEnclosingFunction()) }
/** /**
* Gets the children of this node. * Gets the children of this node.
@@ -628,7 +631,7 @@ class FunctionNode extends AstNode {
} }
private string getChildAccessorWithoutConversions(Locatable parent, Element child) { private string getChildAccessorWithoutConversions(Locatable parent, Element child) {
shouldPrintFunction(getEnclosingFunction(parent)) and shouldPrintDeclaration(getEnclosingFunction(parent)) and
( (
exists(Stmt s | s = parent | exists(Stmt s | s = parent |
namedStmtChildPredicates(s, child, result) namedStmtChildPredicates(s, child, result)
@@ -647,7 +650,7 @@ private string getChildAccessorWithoutConversions(Locatable parent, Element chil
} }
private predicate namedStmtChildPredicates(Locatable s, Element e, string pred) { private predicate namedStmtChildPredicates(Locatable s, Element e, string pred) {
shouldPrintFunction(getEnclosingFunction(s)) and shouldPrintDeclaration(getEnclosingFunction(s)) and
( (
exists(int n | s.(BlockStmt).getStmt(n) = e and pred = "getStmt(" + n + ")") exists(int n | s.(BlockStmt).getStmt(n) = e and pred = "getStmt(" + n + ")")
or or
@@ -735,7 +738,7 @@ private predicate namedStmtChildPredicates(Locatable s, Element e, string pred)
} }
private predicate namedExprChildPredicates(Expr expr, Element ele, string pred) { private predicate namedExprChildPredicates(Expr expr, Element ele, string pred) {
shouldPrintFunction(expr.getEnclosingFunction()) and shouldPrintDeclaration(expr.getEnclosingFunction()) and
( (
expr.(Access).getTarget() = ele and pred = "getTarget()" expr.(Access).getTarget() = ele and pred = "getTarget()"
or or

View File

@@ -4,8 +4,8 @@
* This file contains the actual implementation of `PrintIR.ql`. For test cases and very small * This file contains the actual implementation of `PrintIR.ql`. For test cases and very small
* databases, `PrintIR.ql` can be run directly to dump the IR for the entire database. For most * databases, `PrintIR.ql` can be run directly to dump the IR for the entire database. For most
* uses, however, it is better to write a query that imports `PrintIR.qll`, extends * uses, however, it is better to write a query that imports `PrintIR.qll`, extends
* `PrintIRConfiguration`, and overrides `shouldPrintFunction()` to select a subset of functions to * `PrintIRConfiguration`, and overrides `shouldPrintDeclaration()` to select a subset of declarations
* dump. * to dump.
*/ */
import implementation.aliased_ssa.PrintIR import implementation.aliased_ssa.PrintIR

View File

@@ -4,8 +4,8 @@
* This file contains the actual implementation of `PrintIR.ql`. For test cases and very small * This file contains the actual implementation of `PrintIR.ql`. For test cases and very small
* databases, `PrintIR.ql` can be run directly to dump the IR for the entire database. For most * databases, `PrintIR.ql` can be run directly to dump the IR for the entire database. For most
* uses, however, it is better to write a query that imports `PrintIR.qll`, extends * uses, however, it is better to write a query that imports `PrintIR.qll`, extends
* `PrintIRConfiguration`, and overrides `shouldPrintFunction()` to select a subset of functions to * `PrintIRConfiguration`, and overrides `shouldPrintDeclaration()` to select a subset of declarations
* dump. * to dump.
*/ */
private import internal.IRInternal private import internal.IRInternal
@@ -16,7 +16,7 @@ import Imports::IRConfiguration
private newtype TPrintIRConfiguration = MkPrintIRConfiguration() private newtype TPrintIRConfiguration = MkPrintIRConfiguration()
/** /**
* The query can extend this class to control which functions are printed. * The query can extend this class to control which declarations are printed.
*/ */
class PrintIRConfiguration extends TPrintIRConfiguration { class PrintIRConfiguration extends TPrintIRConfiguration {
/** Gets a textual representation of this configuration. */ /** Gets a textual representation of this configuration. */
@@ -24,9 +24,9 @@ class PrintIRConfiguration extends TPrintIRConfiguration {
/** /**
* Holds if the IR for `func` should be printed. By default, holds for all * Holds if the IR for `func` should be printed. By default, holds for all
* functions. * functions, global and namespace variables, and static local variables.
*/ */
predicate shouldPrintFunction(Language::Declaration decl) { any() } predicate shouldPrintDeclaration(Language::Declaration decl) { any() }
} }
/** /**
@@ -34,12 +34,12 @@ class PrintIRConfiguration extends TPrintIRConfiguration {
*/ */
private class FilteredIRConfiguration extends IRConfiguration { private class FilteredIRConfiguration extends IRConfiguration {
override predicate shouldEvaluateDebugStringsForFunction(Language::Declaration func) { override predicate shouldEvaluateDebugStringsForFunction(Language::Declaration func) {
shouldPrintFunction(func) shouldPrintDeclaration(func)
} }
} }
private predicate shouldPrintFunction(Language::Declaration decl) { private predicate shouldPrintDeclaration(Language::Declaration decl) {
exists(PrintIRConfiguration config | config.shouldPrintFunction(decl)) exists(PrintIRConfiguration config | config.shouldPrintDeclaration(decl))
} }
private predicate shouldPrintInstruction(Instruction i) { private predicate shouldPrintInstruction(Instruction i) {
@@ -90,10 +90,10 @@ private string getOperandPropertyString(Operand operand) {
} }
private newtype TPrintableIRNode = private newtype TPrintableIRNode =
TPrintableIRFunction(IRFunction irFunc) { shouldPrintFunction(irFunc.getFunction()) } or TPrintableIRFunction(IRFunction irFunc) { shouldPrintDeclaration(irFunc.getFunction()) } or
TPrintableIRBlock(IRBlock block) { shouldPrintFunction(block.getEnclosingFunction()) } or TPrintableIRBlock(IRBlock block) { shouldPrintDeclaration(block.getEnclosingFunction()) } or
TPrintableInstruction(Instruction instr) { TPrintableInstruction(Instruction instr) {
shouldPrintInstruction(instr) and shouldPrintFunction(instr.getEnclosingFunction()) shouldPrintInstruction(instr) and shouldPrintDeclaration(instr.getEnclosingFunction())
} }
/** /**

View File

@@ -4,8 +4,8 @@
* This file contains the actual implementation of `PrintIR.ql`. For test cases and very small * This file contains the actual implementation of `PrintIR.ql`. For test cases and very small
* databases, `PrintIR.ql` can be run directly to dump the IR for the entire database. For most * databases, `PrintIR.ql` can be run directly to dump the IR for the entire database. For most
* uses, however, it is better to write a query that imports `PrintIR.qll`, extends * uses, however, it is better to write a query that imports `PrintIR.qll`, extends
* `PrintIRConfiguration`, and overrides `shouldPrintFunction()` to select a subset of functions to * `PrintIRConfiguration`, and overrides `shouldPrintDeclaration()` to select a subset of declarations
* dump. * to dump.
*/ */
private import internal.IRInternal private import internal.IRInternal
@@ -16,7 +16,7 @@ import Imports::IRConfiguration
private newtype TPrintIRConfiguration = MkPrintIRConfiguration() private newtype TPrintIRConfiguration = MkPrintIRConfiguration()
/** /**
* The query can extend this class to control which functions are printed. * The query can extend this class to control which declarations are printed.
*/ */
class PrintIRConfiguration extends TPrintIRConfiguration { class PrintIRConfiguration extends TPrintIRConfiguration {
/** Gets a textual representation of this configuration. */ /** Gets a textual representation of this configuration. */
@@ -24,9 +24,9 @@ class PrintIRConfiguration extends TPrintIRConfiguration {
/** /**
* Holds if the IR for `func` should be printed. By default, holds for all * Holds if the IR for `func` should be printed. By default, holds for all
* functions. * functions, global and namespace variables, and static local variables.
*/ */
predicate shouldPrintFunction(Language::Declaration decl) { any() } predicate shouldPrintDeclaration(Language::Declaration decl) { any() }
} }
/** /**
@@ -34,12 +34,12 @@ class PrintIRConfiguration extends TPrintIRConfiguration {
*/ */
private class FilteredIRConfiguration extends IRConfiguration { private class FilteredIRConfiguration extends IRConfiguration {
override predicate shouldEvaluateDebugStringsForFunction(Language::Declaration func) { override predicate shouldEvaluateDebugStringsForFunction(Language::Declaration func) {
shouldPrintFunction(func) shouldPrintDeclaration(func)
} }
} }
private predicate shouldPrintFunction(Language::Declaration decl) { private predicate shouldPrintDeclaration(Language::Declaration decl) {
exists(PrintIRConfiguration config | config.shouldPrintFunction(decl)) exists(PrintIRConfiguration config | config.shouldPrintDeclaration(decl))
} }
private predicate shouldPrintInstruction(Instruction i) { private predicate shouldPrintInstruction(Instruction i) {
@@ -90,10 +90,10 @@ private string getOperandPropertyString(Operand operand) {
} }
private newtype TPrintableIRNode = private newtype TPrintableIRNode =
TPrintableIRFunction(IRFunction irFunc) { shouldPrintFunction(irFunc.getFunction()) } or TPrintableIRFunction(IRFunction irFunc) { shouldPrintDeclaration(irFunc.getFunction()) } or
TPrintableIRBlock(IRBlock block) { shouldPrintFunction(block.getEnclosingFunction()) } or TPrintableIRBlock(IRBlock block) { shouldPrintDeclaration(block.getEnclosingFunction()) } or
TPrintableInstruction(Instruction instr) { TPrintableInstruction(Instruction instr) {
shouldPrintInstruction(instr) and shouldPrintFunction(instr.getEnclosingFunction()) shouldPrintInstruction(instr) and shouldPrintDeclaration(instr.getEnclosingFunction())
} }
/** /**

View File

@@ -4,8 +4,8 @@
* This file contains the actual implementation of `PrintIR.ql`. For test cases and very small * This file contains the actual implementation of `PrintIR.ql`. For test cases and very small
* databases, `PrintIR.ql` can be run directly to dump the IR for the entire database. For most * databases, `PrintIR.ql` can be run directly to dump the IR for the entire database. For most
* uses, however, it is better to write a query that imports `PrintIR.qll`, extends * uses, however, it is better to write a query that imports `PrintIR.qll`, extends
* `PrintIRConfiguration`, and overrides `shouldPrintFunction()` to select a subset of functions to * `PrintIRConfiguration`, and overrides `shouldPrintDeclaration()` to select a subset of declarations
* dump. * to dump.
*/ */
private import internal.IRInternal private import internal.IRInternal
@@ -16,7 +16,7 @@ import Imports::IRConfiguration
private newtype TPrintIRConfiguration = MkPrintIRConfiguration() private newtype TPrintIRConfiguration = MkPrintIRConfiguration()
/** /**
* The query can extend this class to control which functions are printed. * The query can extend this class to control which declarations are printed.
*/ */
class PrintIRConfiguration extends TPrintIRConfiguration { class PrintIRConfiguration extends TPrintIRConfiguration {
/** Gets a textual representation of this configuration. */ /** Gets a textual representation of this configuration. */
@@ -24,9 +24,9 @@ class PrintIRConfiguration extends TPrintIRConfiguration {
/** /**
* Holds if the IR for `func` should be printed. By default, holds for all * Holds if the IR for `func` should be printed. By default, holds for all
* functions. * functions, global and namespace variables, and static local variables.
*/ */
predicate shouldPrintFunction(Language::Declaration decl) { any() } predicate shouldPrintDeclaration(Language::Declaration decl) { any() }
} }
/** /**
@@ -34,12 +34,12 @@ class PrintIRConfiguration extends TPrintIRConfiguration {
*/ */
private class FilteredIRConfiguration extends IRConfiguration { private class FilteredIRConfiguration extends IRConfiguration {
override predicate shouldEvaluateDebugStringsForFunction(Language::Declaration func) { override predicate shouldEvaluateDebugStringsForFunction(Language::Declaration func) {
shouldPrintFunction(func) shouldPrintDeclaration(func)
} }
} }
private predicate shouldPrintFunction(Language::Declaration decl) { private predicate shouldPrintDeclaration(Language::Declaration decl) {
exists(PrintIRConfiguration config | config.shouldPrintFunction(decl)) exists(PrintIRConfiguration config | config.shouldPrintDeclaration(decl))
} }
private predicate shouldPrintInstruction(Instruction i) { private predicate shouldPrintInstruction(Instruction i) {
@@ -90,10 +90,10 @@ private string getOperandPropertyString(Operand operand) {
} }
private newtype TPrintableIRNode = private newtype TPrintableIRNode =
TPrintableIRFunction(IRFunction irFunc) { shouldPrintFunction(irFunc.getFunction()) } or TPrintableIRFunction(IRFunction irFunc) { shouldPrintDeclaration(irFunc.getFunction()) } or
TPrintableIRBlock(IRBlock block) { shouldPrintFunction(block.getEnclosingFunction()) } or TPrintableIRBlock(IRBlock block) { shouldPrintDeclaration(block.getEnclosingFunction()) } or
TPrintableInstruction(Instruction instr) { TPrintableInstruction(Instruction instr) {
shouldPrintInstruction(instr) and shouldPrintFunction(instr.getEnclosingFunction()) shouldPrintInstruction(instr) and shouldPrintDeclaration(instr.getEnclosingFunction())
} }
/** /**

View File

@@ -7,5 +7,5 @@ private import semmle.code.cpp.PrintAST
private import PrintConfig private import PrintConfig
private class PrintConfig extends PrintAstConfiguration { private class PrintConfig extends PrintAstConfiguration {
override predicate shouldPrintFunction(Function func) { shouldDumpFunction(func) } override predicate shouldPrintDeclaration(Declaration decl) { shouldDumpDeclaration(decl) }
} }

View File

@@ -8,11 +8,11 @@ predicate locationIsInStandardHeaders(Location loc) {
} }
/** /**
* Holds if the AST or IR for the specified function should be printed in the test output. * Holds if the AST or IR for the specified declaration should be printed in the test output.
* *
* This predicate excludes functions defined in standard headers. * This predicate excludes declarations defined in standard headers.
*/ */
predicate shouldDumpFunction(Declaration decl) { predicate shouldDumpDeclaration(Declaration decl) {
not locationIsInStandardHeaders(decl.getLocation()) and not locationIsInStandardHeaders(decl.getLocation()) and
( (
decl instanceof Function decl instanceof Function

View File

@@ -7,5 +7,5 @@ private import semmle.code.cpp.ir.implementation.raw.PrintIR
private import PrintConfig private import PrintConfig
private class PrintConfig extends PrintIRConfiguration { private class PrintConfig extends PrintIRConfiguration {
override predicate shouldPrintFunction(Declaration decl) { shouldDumpFunction(decl) } override predicate shouldPrintDeclaration(Declaration decl) { shouldDumpDeclaration(decl) }
} }

View File

@@ -4,8 +4,8 @@
* This file contains the actual implementation of `PrintIR.ql`. For test cases and very small * This file contains the actual implementation of `PrintIR.ql`. For test cases and very small
* databases, `PrintIR.ql` can be run directly to dump the IR for the entire database. For most * databases, `PrintIR.ql` can be run directly to dump the IR for the entire database. For most
* uses, however, it is better to write a query that imports `PrintIR.qll`, extends * uses, however, it is better to write a query that imports `PrintIR.qll`, extends
* `PrintIRConfiguration`, and overrides `shouldPrintFunction()` to select a subset of functions to * `PrintIRConfiguration`, and overrides `shouldPrintDeclaration()` to select a subset of declarations
* dump. * to dump.
*/ */
private import internal.IRInternal private import internal.IRInternal
@@ -16,7 +16,7 @@ import Imports::IRConfiguration
private newtype TPrintIRConfiguration = MkPrintIRConfiguration() private newtype TPrintIRConfiguration = MkPrintIRConfiguration()
/** /**
* The query can extend this class to control which functions are printed. * The query can extend this class to control which declarations are printed.
*/ */
class PrintIRConfiguration extends TPrintIRConfiguration { class PrintIRConfiguration extends TPrintIRConfiguration {
/** Gets a textual representation of this configuration. */ /** Gets a textual representation of this configuration. */
@@ -24,9 +24,9 @@ class PrintIRConfiguration extends TPrintIRConfiguration {
/** /**
* Holds if the IR for `func` should be printed. By default, holds for all * Holds if the IR for `func` should be printed. By default, holds for all
* functions. * functions, global and namespace variables, and static local variables.
*/ */
predicate shouldPrintFunction(Language::Declaration decl) { any() } predicate shouldPrintDeclaration(Language::Declaration decl) { any() }
} }
/** /**
@@ -34,12 +34,12 @@ class PrintIRConfiguration extends TPrintIRConfiguration {
*/ */
private class FilteredIRConfiguration extends IRConfiguration { private class FilteredIRConfiguration extends IRConfiguration {
override predicate shouldEvaluateDebugStringsForFunction(Language::Declaration func) { override predicate shouldEvaluateDebugStringsForFunction(Language::Declaration func) {
shouldPrintFunction(func) shouldPrintDeclaration(func)
} }
} }
private predicate shouldPrintFunction(Language::Declaration decl) { private predicate shouldPrintDeclaration(Language::Declaration decl) {
exists(PrintIRConfiguration config | config.shouldPrintFunction(decl)) exists(PrintIRConfiguration config | config.shouldPrintDeclaration(decl))
} }
private predicate shouldPrintInstruction(Instruction i) { private predicate shouldPrintInstruction(Instruction i) {
@@ -90,10 +90,10 @@ private string getOperandPropertyString(Operand operand) {
} }
private newtype TPrintableIRNode = private newtype TPrintableIRNode =
TPrintableIRFunction(IRFunction irFunc) { shouldPrintFunction(irFunc.getFunction()) } or TPrintableIRFunction(IRFunction irFunc) { shouldPrintDeclaration(irFunc.getFunction()) } or
TPrintableIRBlock(IRBlock block) { shouldPrintFunction(block.getEnclosingFunction()) } or TPrintableIRBlock(IRBlock block) { shouldPrintDeclaration(block.getEnclosingFunction()) } or
TPrintableInstruction(Instruction instr) { TPrintableInstruction(Instruction instr) {
shouldPrintInstruction(instr) and shouldPrintFunction(instr.getEnclosingFunction()) shouldPrintInstruction(instr) and shouldPrintDeclaration(instr.getEnclosingFunction())
} }
/** /**

View File

@@ -4,8 +4,8 @@
* This file contains the actual implementation of `PrintIR.ql`. For test cases and very small * This file contains the actual implementation of `PrintIR.ql`. For test cases and very small
* databases, `PrintIR.ql` can be run directly to dump the IR for the entire database. For most * databases, `PrintIR.ql` can be run directly to dump the IR for the entire database. For most
* uses, however, it is better to write a query that imports `PrintIR.qll`, extends * uses, however, it is better to write a query that imports `PrintIR.qll`, extends
* `PrintIRConfiguration`, and overrides `shouldPrintFunction()` to select a subset of functions to * `PrintIRConfiguration`, and overrides `shouldPrintDeclaration()` to select a subset of declarations
* dump. * to dump.
*/ */
private import internal.IRInternal private import internal.IRInternal
@@ -16,7 +16,7 @@ import Imports::IRConfiguration
private newtype TPrintIRConfiguration = MkPrintIRConfiguration() private newtype TPrintIRConfiguration = MkPrintIRConfiguration()
/** /**
* The query can extend this class to control which functions are printed. * The query can extend this class to control which declarations are printed.
*/ */
class PrintIRConfiguration extends TPrintIRConfiguration { class PrintIRConfiguration extends TPrintIRConfiguration {
/** Gets a textual representation of this configuration. */ /** Gets a textual representation of this configuration. */
@@ -24,9 +24,9 @@ class PrintIRConfiguration extends TPrintIRConfiguration {
/** /**
* Holds if the IR for `func` should be printed. By default, holds for all * Holds if the IR for `func` should be printed. By default, holds for all
* functions. * functions, global and namespace variables, and static local variables.
*/ */
predicate shouldPrintFunction(Language::Declaration decl) { any() } predicate shouldPrintDeclaration(Language::Declaration decl) { any() }
} }
/** /**
@@ -34,12 +34,12 @@ class PrintIRConfiguration extends TPrintIRConfiguration {
*/ */
private class FilteredIRConfiguration extends IRConfiguration { private class FilteredIRConfiguration extends IRConfiguration {
override predicate shouldEvaluateDebugStringsForFunction(Language::Declaration func) { override predicate shouldEvaluateDebugStringsForFunction(Language::Declaration func) {
shouldPrintFunction(func) shouldPrintDeclaration(func)
} }
} }
private predicate shouldPrintFunction(Language::Declaration decl) { private predicate shouldPrintDeclaration(Language::Declaration decl) {
exists(PrintIRConfiguration config | config.shouldPrintFunction(decl)) exists(PrintIRConfiguration config | config.shouldPrintDeclaration(decl))
} }
private predicate shouldPrintInstruction(Instruction i) { private predicate shouldPrintInstruction(Instruction i) {
@@ -90,10 +90,10 @@ private string getOperandPropertyString(Operand operand) {
} }
private newtype TPrintableIRNode = private newtype TPrintableIRNode =
TPrintableIRFunction(IRFunction irFunc) { shouldPrintFunction(irFunc.getFunction()) } or TPrintableIRFunction(IRFunction irFunc) { shouldPrintDeclaration(irFunc.getFunction()) } or
TPrintableIRBlock(IRBlock block) { shouldPrintFunction(block.getEnclosingFunction()) } or TPrintableIRBlock(IRBlock block) { shouldPrintDeclaration(block.getEnclosingFunction()) } or
TPrintableInstruction(Instruction instr) { TPrintableInstruction(Instruction instr) {
shouldPrintInstruction(instr) and shouldPrintFunction(instr.getEnclosingFunction()) shouldPrintInstruction(instr) and shouldPrintDeclaration(instr.getEnclosingFunction())
} }
/** /**