From badb11750a1f569ae4cb0d4f443ced7b5b33f2e5 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Mon, 5 Oct 2020 17:53:35 -0400 Subject: [PATCH 01/53] AST and IR support for `TemporaryObjectExpr` --- cpp/ql/src/semmle/code/cpp/exprs/Cast.qll | 21 + .../raw/internal/TranslatedElement.qll | 1 + .../raw/internal/TranslatedExpr.qll | 31 + .../code/cpp/ir/internal/TempVariableTag.qll | 5 +- cpp/ql/src/semmlecode.cpp.dbscheme | 2 + .../library-tests/ir/ir/PrintAST.expected | 551 ++++++++++++++++-- cpp/ql/test/library-tests/ir/ir/ir.cpp | 78 +++ 7 files changed, 634 insertions(+), 55 deletions(-) diff --git a/cpp/ql/src/semmle/code/cpp/exprs/Cast.qll b/cpp/ql/src/semmle/code/cpp/exprs/Cast.qll index e06ed095d401..8496e7976806 100644 --- a/cpp/ql/src/semmle/code/cpp/exprs/Cast.qll +++ b/cpp/ql/src/semmle/code/cpp/exprs/Cast.qll @@ -840,6 +840,27 @@ class ArrayToPointerConversion extends Conversion, @array_to_pointer { override predicate mayBeGloballyImpure() { none() } } +/** + * A node representing a temporary object created as part of an expression. + * + * This is most commonly seen in the following cases (from [class.temporary]/2): + * - when binding a reference to a prvalue + * - when performing member access on a class prvalue + * - when performing an array-to-pointer conversion or subscripting on an array prvalue + * - when initializing an object of type std::initializer_list from a braced-init-list + * - for certain unevaluated operands + * - when a prvalue that has type other than cv void appears as a discarded-value expression + * + * This node will only exist if the object is of class type, and even then only if either the + * object's initialization or destruction is non-trivial. + */ +class TemporaryObjectExpr extends Conversion, @temp_init { + /** Gets a textual representation of this conversion. */ + override string toString() { result = "temporary object" } + + override string getAPrimaryQlClass() { result = "TemporaryObjectExpr" } +} + /** * A node representing the Cast sub-class of entity `cast`. */ diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll index f3c8816c19d6..821e6449bbb0 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll @@ -351,6 +351,7 @@ newtype TTranslatedElement = exists(ConstructorFieldInit fieldInit | fieldInit.getExpr().getFullyConverted() = expr) or exists(NewExpr newExpr | newExpr.getInitializer().getFullyConverted() = expr) or exists(ThrowExpr throw | throw.getExpr().getFullyConverted() = expr) or + exists(TemporaryObjectExpr temp | temp.getExpr() = expr) or exists(LambdaExpression lambda | lambda.getInitializer().getFullyConverted() = expr) ) } or diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll index 6da9193fd580..b4dc524b97e6 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll @@ -2049,6 +2049,37 @@ class TranslatedBinaryConditionalExpr extends TranslatedConditionalExpr { } } +/** + * IR translation of the materialization of a temporary object. + * + * This translation allocates a temporary variable, and initializes it treating `expr.getExpr()` as + * its initializer. + */ +class TranslatedTemporaryObjectExpr extends TranslatedNonConstantExpr, TranslatedVariableInitialization { + override TemporaryObjectExpr expr; + + final override predicate hasTempVariable(TempVariableTag tag, CppType type) { + tag = TempObjectTempVar() and + type = getTypeForPRValue(expr.getType()) + } + + override Type getTargetType() { result = expr.getType() } + + final override TranslatedInitialization getInitialization() { + result = getTranslatedInitialization(expr.getExpr()) + } + + final override IRVariable getIRVariable() { result = getIRTempVariable(expr, TempObjectTempVar()) } + + final override Instruction getInitializationSuccessor() { + result = getParent().getChildSuccessor(this) + } + + final override Instruction getResult() { + result = getTargetAddress() + } +} + /** * IR translation of a `throw` expression. */ diff --git a/cpp/ql/src/semmle/code/cpp/ir/internal/TempVariableTag.qll b/cpp/ql/src/semmle/code/cpp/ir/internal/TempVariableTag.qll index c33280512867..e9fd299da456 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/internal/TempVariableTag.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/internal/TempVariableTag.qll @@ -4,7 +4,8 @@ newtype TTempVariableTag = ThrowTempVar() or LambdaTempVar() or EllipsisTempVar() or - ThisTempVar() + ThisTempVar() or + TempObjectTempVar() string getTempVariableTagId(TTempVariableTag tag) { tag = ConditionValueTempVar() and result = "CondVal" @@ -18,4 +19,6 @@ string getTempVariableTagId(TTempVariableTag tag) { tag = EllipsisTempVar() and result = "Ellipsis" or tag = ThisTempVar() and result = "This" + or + tag = TempObjectTempVar() and result = "Temp" } diff --git a/cpp/ql/src/semmlecode.cpp.dbscheme b/cpp/ql/src/semmlecode.cpp.dbscheme index ef73d8cf906d..c82db4c596b8 100644 --- a/cpp/ql/src/semmlecode.cpp.dbscheme +++ b/cpp/ql/src/semmlecode.cpp.dbscheme @@ -1171,6 +1171,7 @@ conversionkinds( | @parexpr | @reference_to | @ref_indirect + | @temp_init ; /* @@ -1673,6 +1674,7 @@ case @expr.kind of | 326 = @spaceshipexpr | 327 = @co_await | 328 = @co_yield +| 329 = @temp_init ; @var_args_expr = @vastartexpr diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index e58a36e747dc..3caf910d35b6 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -6684,19 +6684,22 @@ ir.cpp: # 809| Conversion = [GlvalueConversion] glvalue conversion # 809| Type = [SpecifiedType] const Base # 809| ValueCategory = lvalue -# 809| expr: [ConstructorCall] call to Base -# 809| Type = [VoidType] void -# 809| ValueCategory = prvalue -# 809| 0: [ReferenceToExpr] (reference to) -# 809| Type = [LValueReferenceType] const Base & +# 809| expr: [TemporaryObjectExpr] temporary object +# 809| Type = [Struct,VirtualBaseClass] Base +# 809| ValueCategory = lvalue +# 809| expr: [ConstructorCall] call to Base +# 809| Type = [VoidType] void # 809| ValueCategory = prvalue -# 809| expr: [CStyleCast] (const Base)... -# 809| Conversion = [BaseClassConversion] base class conversion -# 809| Type = [SpecifiedType] const Base -# 809| ValueCategory = lvalue -# 809| expr: [VariableAccess] m -# 809| Type = [Struct] Middle +# 809| 0: [ReferenceToExpr] (reference to) +# 809| Type = [LValueReferenceType] const Base & +# 809| ValueCategory = prvalue +# 809| expr: [CStyleCast] (const Base)... +# 809| Conversion = [BaseClassConversion] base class conversion +# 809| Type = [SpecifiedType] const Base # 809| ValueCategory = lvalue +# 809| expr: [VariableAccess] m +# 809| Type = [Struct] Middle +# 809| ValueCategory = lvalue # 810| 8: [ExprStmt] ExprStmt # 810| 0: [ReferenceDereferenceExpr] (reference dereference) # 810| Type = [Struct,VirtualBaseClass] Base @@ -6714,19 +6717,22 @@ ir.cpp: # 810| Conversion = [GlvalueConversion] glvalue conversion # 810| Type = [SpecifiedType] const Base # 810| ValueCategory = lvalue -# 810| expr: [ConstructorCall] call to Base -# 810| Type = [VoidType] void -# 810| ValueCategory = prvalue -# 810| 0: [ReferenceToExpr] (reference to) -# 810| Type = [LValueReferenceType] const Base & +# 810| expr: [TemporaryObjectExpr] temporary object +# 810| Type = [Struct,VirtualBaseClass] Base +# 810| ValueCategory = lvalue +# 810| expr: [ConstructorCall] call to Base +# 810| Type = [VoidType] void # 810| ValueCategory = prvalue -# 810| expr: [CStyleCast] (const Base)... -# 810| Conversion = [BaseClassConversion] base class conversion -# 810| Type = [SpecifiedType] const Base -# 810| ValueCategory = lvalue -# 810| expr: [VariableAccess] m -# 810| Type = [Struct] Middle +# 810| 0: [ReferenceToExpr] (reference to) +# 810| Type = [LValueReferenceType] const Base & +# 810| ValueCategory = prvalue +# 810| expr: [CStyleCast] (const Base)... +# 810| Conversion = [BaseClassConversion] base class conversion +# 810| Type = [SpecifiedType] const Base # 810| ValueCategory = lvalue +# 810| expr: [VariableAccess] m +# 810| Type = [Struct] Middle +# 810| ValueCategory = lvalue # 811| 9: [ExprStmt] ExprStmt # 811| 0: [AssignExpr] ... = ... # 811| Type = [PointerType] Base * @@ -6914,23 +6920,26 @@ ir.cpp: # 823| Conversion = [GlvalueConversion] glvalue conversion # 823| Type = [SpecifiedType] const Base # 823| ValueCategory = lvalue -# 823| expr: [ConstructorCall] call to Base -# 823| Type = [VoidType] void -# 823| ValueCategory = prvalue -# 823| 0: [ReferenceToExpr] (reference to) -# 823| Type = [LValueReferenceType] const Base & +# 823| expr: [TemporaryObjectExpr] temporary object +# 823| Type = [Struct,VirtualBaseClass] Base +# 823| ValueCategory = lvalue +# 823| expr: [ConstructorCall] call to Base +# 823| Type = [VoidType] void # 823| ValueCategory = prvalue -# 823| expr: [CStyleCast] (const Base)... -# 823| Conversion = [BaseClassConversion] base class conversion -# 823| Type = [SpecifiedType] const Base -# 823| ValueCategory = lvalue -# 823| expr: [CStyleCast] (const Middle)... +# 823| 0: [ReferenceToExpr] (reference to) +# 823| Type = [LValueReferenceType] const Base & +# 823| ValueCategory = prvalue +# 823| expr: [CStyleCast] (const Base)... # 823| Conversion = [BaseClassConversion] base class conversion -# 823| Type = [SpecifiedType] const Middle +# 823| Type = [SpecifiedType] const Base # 823| ValueCategory = lvalue -# 823| expr: [VariableAccess] d -# 823| Type = [Struct] Derived +# 823| expr: [CStyleCast] (const Middle)... +# 823| Conversion = [BaseClassConversion] base class conversion +# 823| Type = [SpecifiedType] const Middle # 823| ValueCategory = lvalue +# 823| expr: [VariableAccess] d +# 823| Type = [Struct] Derived +# 823| ValueCategory = lvalue # 824| 20: [ExprStmt] ExprStmt # 824| 0: [ReferenceDereferenceExpr] (reference dereference) # 824| Type = [Struct,VirtualBaseClass] Base @@ -6948,23 +6957,26 @@ ir.cpp: # 824| Conversion = [GlvalueConversion] glvalue conversion # 824| Type = [SpecifiedType] const Base # 824| ValueCategory = lvalue -# 824| expr: [ConstructorCall] call to Base -# 824| Type = [VoidType] void -# 824| ValueCategory = prvalue -# 824| 0: [ReferenceToExpr] (reference to) -# 824| Type = [LValueReferenceType] const Base & +# 824| expr: [TemporaryObjectExpr] temporary object +# 824| Type = [Struct,VirtualBaseClass] Base +# 824| ValueCategory = lvalue +# 824| expr: [ConstructorCall] call to Base +# 824| Type = [VoidType] void # 824| ValueCategory = prvalue -# 824| expr: [CStyleCast] (const Base)... -# 824| Conversion = [BaseClassConversion] base class conversion -# 824| Type = [SpecifiedType] const Base -# 824| ValueCategory = lvalue -# 824| expr: [CStyleCast] (const Middle)... +# 824| 0: [ReferenceToExpr] (reference to) +# 824| Type = [LValueReferenceType] const Base & +# 824| ValueCategory = prvalue +# 824| expr: [CStyleCast] (const Base)... # 824| Conversion = [BaseClassConversion] base class conversion -# 824| Type = [SpecifiedType] const Middle +# 824| Type = [SpecifiedType] const Base # 824| ValueCategory = lvalue -# 824| expr: [VariableAccess] d -# 824| Type = [Struct] Derived +# 824| expr: [CStyleCast] (const Middle)... +# 824| Conversion = [BaseClassConversion] base class conversion +# 824| Type = [SpecifiedType] const Middle # 824| ValueCategory = lvalue +# 824| expr: [VariableAccess] d +# 824| Type = [Struct] Derived +# 824| ValueCategory = lvalue # 825| 21: [ExprStmt] ExprStmt # 825| 0: [AssignExpr] ... = ... # 825| Type = [PointerType] Base * @@ -7248,16 +7260,22 @@ ir.cpp: # 850| 0: [VariableDeclarationEntry] definition of b # 850| Type = [Struct] PolymorphicBase # 850| init: [Initializer] initializer for b -#-----| expr: [ConstructorCall] call to PolymorphicBase -#-----| Type = [VoidType] void -#-----| ValueCategory = prvalue +#-----| expr: [TemporaryObjectExpr] temporary object +#-----| Type = [Struct] PolymorphicBase +#-----| ValueCategory = prvalue(load) +#-----| expr: [ConstructorCall] call to PolymorphicBase +#-----| Type = [VoidType] void +#-----| ValueCategory = prvalue # 851| 1: [DeclStmt] declaration # 851| 0: [VariableDeclarationEntry] definition of d # 851| Type = [Struct] PolymorphicDerived # 851| init: [Initializer] initializer for d -#-----| expr: [ConstructorCall] call to PolymorphicDerived -#-----| Type = [VoidType] void -#-----| ValueCategory = prvalue +#-----| expr: [TemporaryObjectExpr] temporary object +#-----| Type = [Struct] PolymorphicDerived +#-----| ValueCategory = prvalue(load) +#-----| expr: [ConstructorCall] call to PolymorphicDerived +#-----| Type = [VoidType] void +#-----| ValueCategory = prvalue # 853| 2: [DeclStmt] declaration # 853| 0: [VariableDeclarationEntry] definition of pb # 853| Type = [PointerType] PolymorphicBase * @@ -10512,6 +10530,431 @@ ir.cpp: # 1322| Type = [IntPointerType] int * # 1322| ValueCategory = prvalue(load) # 1323| 1: [ReturnStmt] return ... +# 1326| [FunctionTemplateInstantiation,TopLevelFunction] String defaultConstruct() +# 1326| params: +# 1326| body: [BlockStmt] { ... } +# 1327| 0: [ReturnStmt] return ... +# 1327| 0: [ConstructorCall] call to String +# 1327| Type = [Struct] String +# 1327| ValueCategory = prvalue +# 1326| [TemplateFunction,TopLevelFunction] T defaultConstruct() +# 1326| params: +# 1326| body: [BlockStmt] { ... } +# 1327| 0: [ReturnStmt] return ... +# 1327| 0: [Literal] 0 +# 1327| Type = [TemplateParameter] T +# 1327| Value = [Literal] 0 +# 1327| ValueCategory = prvalue +# 1326| [FunctionTemplateInstantiation,TopLevelFunction] copy_constructor defaultConstruct() +# 1326| params: +# 1326| body: [BlockStmt] { ... } +# 1327| 0: [ReturnStmt] return ... +# 1327| 0: [ConstructorCall] call to copy_constructor +# 1327| Type = [Class] copy_constructor +# 1327| ValueCategory = prvalue +# 1326| [FunctionTemplateInstantiation,TopLevelFunction] destructor_only defaultConstruct() +# 1326| params: +# 1326| body: [BlockStmt] { ... } +# 1327| 0: [ReturnStmt] return ... +# 1327| 0: [Literal] 0 +# 1327| Type = [RoutineType] ..()(..) +# 1327| Value = [Literal] 0 +# 1327| ValueCategory = prvalue +# 1330| [CopyAssignmentOperator] constructor_only& constructor_only::operator=(constructor_only const&) +# 1330| params: +#-----| 0: [Parameter] p#0 +#-----| Type = [LValueReferenceType] const constructor_only & +# 1330| [MoveAssignmentOperator] constructor_only& constructor_only::operator=(constructor_only&&) +# 1330| params: +#-----| 0: [Parameter] p#0 +#-----| Type = [RValueReferenceType] constructor_only && +# 1330| [CopyConstructor] void constructor_only::constructor_only(constructor_only const&) +# 1330| params: +#-----| 0: [Parameter] p#0 +#-----| Type = [LValueReferenceType] const constructor_only & +# 1330| [MoveConstructor] void constructor_only::constructor_only(constructor_only&&) +# 1330| params: +#-----| 0: [Parameter] p#0 +#-----| Type = [RValueReferenceType] constructor_only && +# 1335| [ConversionConstructor] void constructor_only::constructor_only(int) +# 1335| params: +# 1335| 0: [Parameter] x +# 1335| Type = [IntType] int +# 1338| [CopyAssignmentOperator] copy_constructor& copy_constructor::operator=(copy_constructor const&) +# 1338| params: +#-----| 0: [Parameter] p#0 +#-----| Type = [LValueReferenceType] const copy_constructor & +# 1343| [Constructor] void copy_constructor::copy_constructor() +# 1343| params: +# 1344| [CopyConstructor] void copy_constructor::copy_constructor(copy_constructor const&) +# 1344| params: +# 1344| 0: [Parameter] p#0 +# 1344| Type = [LValueReferenceType] const copy_constructor & +# 1346| [MemberFunction] void copy_constructor::method() +# 1346| params: +# 1349| [CopyAssignmentOperator] destructor_only& destructor_only::operator=(destructor_only const&) +# 1349| params: +#-----| 0: [Parameter] p#0 +#-----| Type = [LValueReferenceType] const destructor_only & +# 1349| [Constructor] void destructor_only::destructor_only() +# 1349| params: +# 1351| [Destructor] void destructor_only::~destructor_only() +# 1351| params: +# 1353| [MemberFunction] void destructor_only::method() +# 1353| params: +# 1357| [FunctionTemplateInstantiation,TopLevelFunction] void acceptRef(String const&) +# 1357| params: +# 1357| 0: [Parameter] v +# 1357| Type = [LValueReferenceType] const String & +# 1357| [TemplateFunction,TopLevelFunction] void acceptRef(T const&) +# 1357| params: +# 1357| 0: [Parameter] v +# 1357| Type = [LValueReferenceType] const T & +# 1357| [FunctionTemplateInstantiation,TopLevelFunction] void acceptRef(copy_constructor const&) +# 1357| params: +# 1357| 0: [Parameter] v +# 1357| Type = [LValueReferenceType] const copy_constructor & +# 1357| [FunctionTemplateInstantiation,TopLevelFunction] void acceptRef(destructor_only const&) +# 1357| params: +# 1357| 0: [Parameter] v +# 1357| Type = [LValueReferenceType] const destructor_only & +# 1360| [FunctionTemplateInstantiation,TopLevelFunction] void acceptValue(String) +# 1360| params: +# 1360| 0: [Parameter] v +# 1360| Type = [Struct] String +# 1360| [TemplateFunction,TopLevelFunction] void acceptValue(T) +# 1360| params: +# 1360| 0: [Parameter] v +# 1360| Type = [TemplateParameter] T +# 1360| [FunctionTemplateInstantiation,TopLevelFunction] void acceptValue(copy_constructor) +# 1360| params: +# 1360| 0: [Parameter] v +# 1360| Type = [Class] copy_constructor +# 1360| [FunctionTemplateInstantiation,TopLevelFunction] void acceptValue(destructor_only) +# 1360| params: +# 1360| 0: [Parameter] v +# 1360| Type = [Class] destructor_only +# 1363| [FunctionTemplateInstantiation,TopLevelFunction] String returnValue() +# 1363| params: +# 1363| [TemplateFunction,TopLevelFunction] T returnValue() +# 1363| params: +# 1363| [FunctionTemplateInstantiation,TopLevelFunction] copy_constructor returnValue() +# 1363| params: +# 1363| [FunctionTemplateInstantiation,TopLevelFunction] destructor_only returnValue() +# 1363| params: +# 1365| [TopLevelFunction] void temporary_string() +# 1365| params: +# 1365| body: [BlockStmt] { ... } +# 1366| 0: [DeclStmt] declaration +# 1366| 0: [VariableDeclarationEntry] definition of s +# 1366| Type = [Struct] String +# 1366| init: [Initializer] initializer for s +# 1366| expr: [FunctionCall] call to returnValue +# 1366| Type = [Struct] String +# 1366| ValueCategory = prvalue +# 1367| 1: [DeclStmt] declaration +# 1367| 0: [VariableDeclarationEntry] definition of rs +# 1367| Type = [LValueReferenceType] const String & +# 1367| init: [Initializer] initializer for rs +# 1367| expr: [ReferenceToExpr] (reference to) +# 1367| Type = [LValueReferenceType] const String & +# 1367| ValueCategory = prvalue +# 1367| expr: [CStyleCast] (const String)... +# 1367| Conversion = [GlvalueConversion] glvalue conversion +# 1367| Type = [SpecifiedType] const String +# 1367| ValueCategory = lvalue +# 1367| expr: [TemporaryObjectExpr] temporary object +# 1367| Type = [Struct] String +# 1367| ValueCategory = lvalue +# 1367| expr: [FunctionCall] call to returnValue +# 1367| Type = [Struct] String +# 1367| ValueCategory = prvalue +# 1369| 2: [ExprStmt] ExprStmt +# 1369| 0: [FunctionCall] call to acceptRef +# 1369| Type = [VoidType] void +# 1369| ValueCategory = prvalue +# 1369| 0: [ReferenceToExpr] (reference to) +# 1369| Type = [LValueReferenceType] const String & +# 1369| ValueCategory = prvalue +# 1369| expr: [CStyleCast] (const String)... +# 1369| Conversion = [GlvalueConversion] glvalue conversion +# 1369| Type = [SpecifiedType] const String +# 1369| ValueCategory = lvalue +# 1369| expr: [VariableAccess] s +# 1369| Type = [Struct] String +# 1369| ValueCategory = lvalue +# 1370| 3: [ExprStmt] ExprStmt +# 1370| 0: [FunctionCall] call to acceptRef +# 1370| Type = [VoidType] void +# 1370| ValueCategory = prvalue +# 1370| 0: [ReferenceToExpr] (reference to) +# 1370| Type = [LValueReferenceType] const String & +# 1370| ValueCategory = prvalue +# 1370| expr: [TemporaryObjectExpr] temporary object +# 1370| Type = [SpecifiedType] const String +# 1370| ValueCategory = lvalue +# 1370| expr: [ConstructorCall] call to String +# 1370| Type = [VoidType] void +# 1370| ValueCategory = prvalue +# 1370| 0: [ArrayToPointerConversion] array to pointer conversion +# 1370| Type = [PointerType] const char * +# 1370| ValueCategory = prvalue +# 1370| expr: foo +# 1370| Type = [ArrayType] const char[4] +# 1370| Value = [StringLiteral] "foo" +# 1370| ValueCategory = lvalue +# 1371| 4: [ExprStmt] ExprStmt +# 1371| 0: [FunctionCall] call to acceptValue +# 1371| Type = [VoidType] void +# 1371| ValueCategory = prvalue +# 1371| 0: [TemporaryObjectExpr] temporary object +# 1371| Type = [Struct] String +# 1371| ValueCategory = lvalue +# 1371| expr: [ConstructorCall] call to String +# 1371| Type = [VoidType] void +# 1371| ValueCategory = prvalue +# 1371| 0: [ReferenceToExpr] (reference to) +# 1371| Type = [LValueReferenceType] const String & +# 1371| ValueCategory = prvalue +# 1371| expr: [CStyleCast] (const String)... +# 1371| Conversion = [GlvalueConversion] glvalue conversion +# 1371| Type = [SpecifiedType] const String +# 1371| ValueCategory = lvalue +# 1371| expr: [VariableAccess] s +# 1371| Type = [Struct] String +# 1371| ValueCategory = lvalue +# 1372| 5: [ExprStmt] ExprStmt +# 1372| 0: [FunctionCall] call to acceptValue +# 1372| Type = [VoidType] void +# 1372| ValueCategory = prvalue +# 1372| 0: [TemporaryObjectExpr] temporary object +# 1372| Type = [Struct] String +# 1372| ValueCategory = lvalue +# 1372| expr: [ConstructorCall] call to String +# 1372| Type = [VoidType] void +# 1372| ValueCategory = prvalue +# 1372| 0: [ArrayToPointerConversion] array to pointer conversion +# 1372| Type = [PointerType] const char * +# 1372| ValueCategory = prvalue +# 1372| expr: foo +# 1372| Type = [ArrayType] const char[4] +# 1372| Value = [StringLiteral] "foo" +# 1372| ValueCategory = lvalue +# 1373| 6: [ExprStmt] ExprStmt +# 1373| 0: [FunctionCall] call to c_str +# 1373| Type = [PointerType] const char * +# 1373| ValueCategory = prvalue +# 1373| -1: [CStyleCast] (const String)... +# 1373| Conversion = [PrvalueAdjustmentConversion] prvalue adjustment conversion +# 1373| Type = [SpecifiedType] const String +# 1373| ValueCategory = prvalue +# 1373| expr: [TemporaryObjectExpr] temporary object +# 1373| Type = [Struct] String +# 1373| ValueCategory = prvalue(load) +# 1373| expr: [ConstructorCall] call to String +# 1373| Type = [VoidType] void +# 1373| ValueCategory = prvalue +# 1374| 7: [ExprStmt] ExprStmt +# 1374| 0: [FunctionCall] call to c_str +# 1374| Type = [PointerType] const char * +# 1374| ValueCategory = prvalue +# 1374| -1: [CStyleCast] (const String)... +# 1374| Conversion = [PrvalueAdjustmentConversion] prvalue adjustment conversion +# 1374| Type = [SpecifiedType] const String +# 1374| ValueCategory = prvalue +# 1374| expr: [TemporaryObjectExpr] temporary object +# 1374| Type = [Struct] String +# 1374| ValueCategory = prvalue(load) +# 1374| expr: [FunctionCall] call to returnValue +# 1374| Type = [Struct] String +# 1374| ValueCategory = prvalue +# 1376| 8: [ExprStmt] ExprStmt +# 1376| 0: [TemporaryObjectExpr] temporary object +# 1376| Type = [Struct] String +# 1376| ValueCategory = prvalue(load) +# 1376| expr: [FunctionCall] call to defaultConstruct +# 1376| Type = [Struct] String +# 1376| ValueCategory = prvalue +# 1377| 9: [ReturnStmt] return ... +# 1379| [TopLevelFunction] void temporary_destructor_only() +# 1379| params: +# 1379| body: [BlockStmt] { ... } +# 1380| 0: [DeclStmt] declaration +# 1380| 0: [VariableDeclarationEntry] definition of d +# 1380| Type = [Class] destructor_only +# 1380| init: [Initializer] initializer for d +# 1380| expr: [FunctionCall] call to returnValue +# 1380| Type = [Class] destructor_only +# 1380| ValueCategory = prvalue +# 1381| 1: [DeclStmt] declaration +# 1381| 0: [VariableDeclarationEntry] definition of rd +# 1381| Type = [LValueReferenceType] const destructor_only & +# 1381| init: [Initializer] initializer for rd +# 1381| expr: [ReferenceToExpr] (reference to) +# 1381| Type = [LValueReferenceType] const destructor_only & +# 1381| ValueCategory = prvalue +# 1381| expr: [CStyleCast] (const destructor_only)... +# 1381| Conversion = [GlvalueConversion] glvalue conversion +# 1381| Type = [SpecifiedType] const destructor_only +# 1381| ValueCategory = lvalue +# 1381| expr: [TemporaryObjectExpr] temporary object +# 1381| Type = [Class] destructor_only +# 1381| ValueCategory = lvalue +# 1381| expr: [FunctionCall] call to returnValue +# 1381| Type = [Class] destructor_only +# 1381| ValueCategory = prvalue +# 1382| 2: [DeclStmt] declaration +# 1382| 0: [VariableDeclarationEntry] definition of d2 +# 1382| Type = [Class] destructor_only +# 1383| 3: [ExprStmt] ExprStmt +# 1383| 0: [FunctionCall] call to acceptRef +# 1383| Type = [VoidType] void +# 1383| ValueCategory = prvalue +# 1383| 0: [ReferenceToExpr] (reference to) +# 1383| Type = [LValueReferenceType] const destructor_only & +# 1383| ValueCategory = prvalue +# 1383| expr: [CStyleCast] (const destructor_only)... +# 1383| Conversion = [GlvalueConversion] glvalue conversion +# 1383| Type = [SpecifiedType] const destructor_only +# 1383| ValueCategory = lvalue +# 1383| expr: [VariableAccess] d +# 1383| Type = [Class] destructor_only +# 1383| ValueCategory = lvalue +# 1384| 4: [ExprStmt] ExprStmt +# 1384| 0: [FunctionCall] call to acceptValue +# 1384| Type = [VoidType] void +# 1384| ValueCategory = prvalue +# 1384| 0: [TemporaryObjectExpr] temporary object +# 1384| Type = [Class] destructor_only +# 1384| ValueCategory = lvalue +# 1384| expr: [VariableAccess] d +# 1384| Type = [Class] destructor_only +# 1384| ValueCategory = prvalue(load) +# 1385| 5: [ExprStmt] ExprStmt +# 1385| 0: [FunctionCall] call to method +# 1385| Type = [VoidType] void +# 1385| ValueCategory = prvalue +# 1385| -1: [TemporaryObjectExpr] temporary object +# 1385| Type = [Class] destructor_only +# 1385| ValueCategory = prvalue(load) +# 1385| expr: [Literal] 0 +# 1385| Type = [Class] destructor_only +# 1385| Value = [Literal] 0 +# 1385| ValueCategory = prvalue +# 1386| 6: [ExprStmt] ExprStmt +# 1386| 0: [FunctionCall] call to method +# 1386| Type = [VoidType] void +# 1386| ValueCategory = prvalue +# 1386| -1: [TemporaryObjectExpr] temporary object +# 1386| Type = [Class] destructor_only +# 1386| ValueCategory = prvalue(load) +# 1386| expr: [FunctionCall] call to returnValue +# 1386| Type = [Class] destructor_only +# 1386| ValueCategory = prvalue +# 1388| 7: [ExprStmt] ExprStmt +# 1388| 0: [TemporaryObjectExpr] temporary object +# 1388| Type = [Class] destructor_only +# 1388| ValueCategory = prvalue(load) +# 1388| expr: [FunctionCall] call to defaultConstruct +# 1388| Type = [Class] destructor_only +# 1388| ValueCategory = prvalue +# 1389| 8: [ReturnStmt] return ... +# 1391| [TopLevelFunction] void temporary_copy_constructor() +# 1391| params: +# 1391| body: [BlockStmt] { ... } +# 1392| 0: [DeclStmt] declaration +# 1392| 0: [VariableDeclarationEntry] definition of d +# 1392| Type = [Class] copy_constructor +# 1392| init: [Initializer] initializer for d +# 1392| expr: [FunctionCall] call to returnValue +# 1392| Type = [Class] copy_constructor +# 1392| ValueCategory = prvalue +# 1393| 1: [DeclStmt] declaration +# 1393| 0: [VariableDeclarationEntry] definition of rd +# 1393| Type = [LValueReferenceType] const copy_constructor & +# 1393| init: [Initializer] initializer for rd +# 1393| expr: [ReferenceToExpr] (reference to) +# 1393| Type = [LValueReferenceType] const copy_constructor & +# 1393| ValueCategory = prvalue +# 1393| expr: [CStyleCast] (const copy_constructor)... +# 1393| Conversion = [GlvalueConversion] glvalue conversion +# 1393| Type = [SpecifiedType] const copy_constructor +# 1393| ValueCategory = lvalue +# 1393| expr: [TemporaryObjectExpr] temporary object +# 1393| Type = [Class] copy_constructor +# 1393| ValueCategory = lvalue +# 1393| expr: [FunctionCall] call to returnValue +# 1393| Type = [Class] copy_constructor +# 1393| ValueCategory = prvalue +# 1394| 2: [DeclStmt] declaration +# 1394| 0: [VariableDeclarationEntry] definition of d2 +# 1394| Type = [Class] copy_constructor +# 1394| init: [Initializer] initializer for d2 +# 1394| expr: [ConstructorCall] call to copy_constructor +# 1394| Type = [VoidType] void +# 1394| ValueCategory = prvalue +# 1395| 3: [ExprStmt] ExprStmt +# 1395| 0: [FunctionCall] call to acceptRef +# 1395| Type = [VoidType] void +# 1395| ValueCategory = prvalue +# 1395| 0: [ReferenceToExpr] (reference to) +# 1395| Type = [LValueReferenceType] const copy_constructor & +# 1395| ValueCategory = prvalue +# 1395| expr: [CStyleCast] (const copy_constructor)... +# 1395| Conversion = [GlvalueConversion] glvalue conversion +# 1395| Type = [SpecifiedType] const copy_constructor +# 1395| ValueCategory = lvalue +# 1395| expr: [VariableAccess] d +# 1395| Type = [Class] copy_constructor +# 1395| ValueCategory = lvalue +# 1396| 4: [ExprStmt] ExprStmt +# 1396| 0: [FunctionCall] call to acceptValue +# 1396| Type = [VoidType] void +# 1396| ValueCategory = prvalue +# 1396| 0: [TemporaryObjectExpr] temporary object +# 1396| Type = [Class] copy_constructor +# 1396| ValueCategory = lvalue +# 1396| expr: [ConstructorCall] call to copy_constructor +# 1396| Type = [VoidType] void +# 1396| ValueCategory = prvalue +# 1396| 0: [ReferenceToExpr] (reference to) +# 1396| Type = [LValueReferenceType] const copy_constructor & +# 1396| ValueCategory = prvalue +# 1396| expr: [CStyleCast] (const copy_constructor)... +# 1396| Conversion = [GlvalueConversion] glvalue conversion +# 1396| Type = [SpecifiedType] const copy_constructor +# 1396| ValueCategory = lvalue +# 1396| expr: [VariableAccess] d +# 1396| Type = [Class] copy_constructor +# 1396| ValueCategory = lvalue +# 1397| 5: [ExprStmt] ExprStmt +# 1397| 0: [FunctionCall] call to method +# 1397| Type = [VoidType] void +# 1397| ValueCategory = prvalue +# 1397| -1: [TemporaryObjectExpr] temporary object +# 1397| Type = [Class] copy_constructor +# 1397| ValueCategory = prvalue(load) +# 1397| expr: [ConstructorCall] call to copy_constructor +# 1397| Type = [VoidType] void +# 1397| ValueCategory = prvalue +# 1398| 6: [ExprStmt] ExprStmt +# 1398| 0: [FunctionCall] call to method +# 1398| Type = [VoidType] void +# 1398| ValueCategory = prvalue +# 1398| -1: [TemporaryObjectExpr] temporary object +# 1398| Type = [Class] copy_constructor +# 1398| ValueCategory = prvalue(load) +# 1398| expr: [FunctionCall] call to returnValue +# 1398| Type = [Class] copy_constructor +# 1398| ValueCategory = prvalue +# 1400| 7: [ExprStmt] ExprStmt +# 1400| 0: [TemporaryObjectExpr] temporary object +# 1400| Type = [Class] copy_constructor +# 1400| ValueCategory = prvalue(load) +# 1400| expr: [FunctionCall] call to defaultConstruct +# 1400| Type = [Class] copy_constructor +# 1400| ValueCategory = prvalue +# 1401| 8: [ReturnStmt] return ... perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| params: diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index 54b198d95375..1712770c8eef 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -1322,4 +1322,82 @@ void f(int* p) new (p) int; } +template +T defaultConstruct() { + return T(); +} + +class constructor_only { +private: + int x; + +public: + constructor_only(int x); +}; + +class copy_constructor { +private: + int y; + +public: + copy_constructor(); + copy_constructor(const copy_constructor&); + + void method(); +}; + +class destructor_only { +public: + ~destructor_only(); + + void method(); +}; + +template +void acceptRef(const T& v); + +template +void acceptValue(T v); + +template +T returnValue(); + +void temporary_string() { + String s = returnValue(); // No temporary + const String& rs = returnValue(); // Binding a reference variable to a temporary + + acceptRef(s); // No temporary + acceptRef("foo"); // Binding a const reference to a temporary + acceptValue(s); + acceptValue("foo"); + String().c_str(); + returnValue().c_str(); // Member access on a temporary + + defaultConstruct(); +} + +void temporary_destructor_only() { + destructor_only d = returnValue(); + const destructor_only& rd = returnValue(); + destructor_only d2; + acceptRef(d); + acceptValue(d); + destructor_only().method(); + returnValue().method(); + + defaultConstruct(); +} + +void temporary_copy_constructor() { + copy_constructor d = returnValue(); + const copy_constructor& rd = returnValue(); + copy_constructor d2; + acceptRef(d); + acceptValue(d); + copy_constructor().method(); + returnValue().method(); + + defaultConstruct(); +} + // semmle-extractor-options: -std=c++17 --clang From 80b832eb499baca69c0492424ea2a6daeb146e95 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Tue, 6 Oct 2020 18:27:33 -0400 Subject: [PATCH 02/53] Fix test expectations --- .../library-tests/ir/ir/PrintAST.expected | 8 +- .../ir/ir/aliased_ssa_consistency.expected | 4 - .../aliased_ssa_consistency_unsound.expected | 4 - .../ir/ir/raw_consistency.expected | 4 - .../test/library-tests/ir/ir/raw_ir.expected | 483 +++++++++++++++--- .../ir/ir/unaliased_ssa_consistency.expected | 4 - ...unaliased_ssa_consistency_unsound.expected | 4 - 7 files changed, 402 insertions(+), 109 deletions(-) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 3caf910d35b6..eef7c2c64cc2 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -9652,7 +9652,7 @@ ir.cpp: # 1178| body: [BlockStmt] { ... } # 1179| 0: [ReturnStmt] return ... # 1179| 0: [ConstructorCall] call to String -# 1179| Type = [Struct] String +# 1179| Type = [VoidType] void # 1179| ValueCategory = prvalue # 1179| 0: [ArrayToPointerConversion] array to pointer conversion # 1179| Type = [PointerType] const char * @@ -10535,7 +10535,7 @@ ir.cpp: # 1326| body: [BlockStmt] { ... } # 1327| 0: [ReturnStmt] return ... # 1327| 0: [ConstructorCall] call to String -# 1327| Type = [Struct] String +# 1327| Type = [VoidType] void # 1327| ValueCategory = prvalue # 1326| [TemplateFunction,TopLevelFunction] T defaultConstruct() # 1326| params: @@ -10550,14 +10550,14 @@ ir.cpp: # 1326| body: [BlockStmt] { ... } # 1327| 0: [ReturnStmt] return ... # 1327| 0: [ConstructorCall] call to copy_constructor -# 1327| Type = [Class] copy_constructor +# 1327| Type = [VoidType] void # 1327| ValueCategory = prvalue # 1326| [FunctionTemplateInstantiation,TopLevelFunction] destructor_only defaultConstruct() # 1326| params: # 1326| body: [BlockStmt] { ... } # 1327| 0: [ReturnStmt] return ... # 1327| 0: [Literal] 0 -# 1327| Type = [RoutineType] ..()(..) +# 1327| Type = [Class] destructor_only # 1327| Value = [Literal] 0 # 1327| ValueCategory = prvalue # 1330| [CopyAssignmentOperator] constructor_only& constructor_only::operator=(constructor_only const&) diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected index 64172ad18738..1c41692bcaad 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected @@ -1,8 +1,4 @@ missingOperand -| ir.cpp:809:7:809:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:810:7:810:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:823:7:823:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:824:7:824:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | unexpectedOperand duplicateOperand missingPhiOperand diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected index 64172ad18738..1c41692bcaad 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected @@ -1,8 +1,4 @@ missingOperand -| ir.cpp:809:7:809:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:810:7:810:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:823:7:823:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:824:7:824:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | unexpectedOperand duplicateOperand missingPhiOperand diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index 64172ad18738..1c41692bcaad 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -1,8 +1,4 @@ missingOperand -| ir.cpp:809:7:809:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:810:7:810:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:823:7:823:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:824:7:824:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | unexpectedOperand duplicateOperand missingPhiOperand diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index a2be838ae483..97fc7662b7c6 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -4522,44 +4522,48 @@ ir.cpp: # 808| r808_12(glval) = CopyValue : r808_6 # 809| r809_1(glval) = VariableAddress[b] : # 809| r809_2(glval) = FunctionAddress[operator=] : -# 809| r809_3(glval) = FunctionAddress[Base] : -# 809| r809_4(glval) = VariableAddress[m] : -# 809| r809_5(glval) = ConvertToNonVirtualBase[Middle : Base] : r809_4 -# 809| r809_6(Base &) = CopyValue : r809_5 -# 809| v809_7(void) = Call : func:r809_3, 0:r809_6 -# 809| mu809_8(unknown) = ^CallSideEffect : ~m? -# 809| mu809_9(Base) = ^IndirectMayWriteSideEffect[-1] : -# 809| v809_10(void) = ^BufferReadSideEffect[0] : &:r809_6, ~m? -# 809| mu809_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r809_6 -# 809| r809_12(glval) = Convert : v809_7 -# 809| r809_13(Base &) = CopyValue : r809_12 -# 809| r809_14(Base &) = Call : func:r809_2, this:r809_1, 0:r809_13 -# 809| mu809_15(unknown) = ^CallSideEffect : ~m? -# 809| v809_16(void) = ^BufferReadSideEffect[-1] : &:r809_1, ~m? -# 809| v809_17(void) = ^BufferReadSideEffect[0] : &:r809_13, ~m? -# 809| mu809_18(Base) = ^IndirectMayWriteSideEffect[-1] : &:r809_1 -# 809| mu809_19(unknown) = ^BufferMayWriteSideEffect[0] : &:r809_13 -# 809| r809_20(glval) = CopyValue : r809_14 +# 809| r809_3(glval) = VariableAddress[#temp809:7] : +# 809| mu809_4(Base) = Uninitialized[#temp809:7] : &:r809_3 +# 809| r809_5(glval) = FunctionAddress[Base] : +# 809| r809_6(glval) = VariableAddress[m] : +# 809| r809_7(glval) = ConvertToNonVirtualBase[Middle : Base] : r809_6 +# 809| r809_8(Base &) = CopyValue : r809_7 +# 809| v809_9(void) = Call : func:r809_5, this:r809_3, 0:r809_8 +# 809| mu809_10(unknown) = ^CallSideEffect : ~m? +# 809| mu809_11(Base) = ^IndirectMayWriteSideEffect[-1] : &:r809_3 +# 809| v809_12(void) = ^BufferReadSideEffect[0] : &:r809_8, ~m? +# 809| mu809_13(unknown) = ^BufferMayWriteSideEffect[0] : &:r809_8 +# 809| r809_14(glval) = Convert : r809_3 +# 809| r809_15(Base &) = CopyValue : r809_14 +# 809| r809_16(Base &) = Call : func:r809_2, this:r809_1, 0:r809_15 +# 809| mu809_17(unknown) = ^CallSideEffect : ~m? +# 809| v809_18(void) = ^BufferReadSideEffect[-1] : &:r809_1, ~m? +# 809| v809_19(void) = ^BufferReadSideEffect[0] : &:r809_15, ~m? +# 809| mu809_20(Base) = ^IndirectMayWriteSideEffect[-1] : &:r809_1 +# 809| mu809_21(unknown) = ^BufferMayWriteSideEffect[0] : &:r809_15 +# 809| r809_22(glval) = CopyValue : r809_16 # 810| r810_1(glval) = VariableAddress[b] : # 810| r810_2(glval) = FunctionAddress[operator=] : -# 810| r810_3(glval) = FunctionAddress[Base] : -# 810| r810_4(glval) = VariableAddress[m] : -# 810| r810_5(glval) = ConvertToNonVirtualBase[Middle : Base] : r810_4 -# 810| r810_6(Base &) = CopyValue : r810_5 -# 810| v810_7(void) = Call : func:r810_3, 0:r810_6 -# 810| mu810_8(unknown) = ^CallSideEffect : ~m? -# 810| mu810_9(Base) = ^IndirectMayWriteSideEffect[-1] : -# 810| v810_10(void) = ^BufferReadSideEffect[0] : &:r810_6, ~m? -# 810| mu810_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r810_6 -# 810| r810_12(glval) = Convert : v810_7 -# 810| r810_13(Base &) = CopyValue : r810_12 -# 810| r810_14(Base &) = Call : func:r810_2, this:r810_1, 0:r810_13 -# 810| mu810_15(unknown) = ^CallSideEffect : ~m? -# 810| v810_16(void) = ^BufferReadSideEffect[-1] : &:r810_1, ~m? -# 810| v810_17(void) = ^BufferReadSideEffect[0] : &:r810_13, ~m? -# 810| mu810_18(Base) = ^IndirectMayWriteSideEffect[-1] : &:r810_1 -# 810| mu810_19(unknown) = ^BufferMayWriteSideEffect[0] : &:r810_13 -# 810| r810_20(glval) = CopyValue : r810_14 +# 810| r810_3(glval) = VariableAddress[#temp810:7] : +# 810| mu810_4(Base) = Uninitialized[#temp810:7] : &:r810_3 +# 810| r810_5(glval) = FunctionAddress[Base] : +# 810| r810_6(glval) = VariableAddress[m] : +# 810| r810_7(glval) = ConvertToNonVirtualBase[Middle : Base] : r810_6 +# 810| r810_8(Base &) = CopyValue : r810_7 +# 810| v810_9(void) = Call : func:r810_5, this:r810_3, 0:r810_8 +# 810| mu810_10(unknown) = ^CallSideEffect : ~m? +# 810| mu810_11(Base) = ^IndirectMayWriteSideEffect[-1] : &:r810_3 +# 810| v810_12(void) = ^BufferReadSideEffect[0] : &:r810_8, ~m? +# 810| mu810_13(unknown) = ^BufferMayWriteSideEffect[0] : &:r810_8 +# 810| r810_14(glval) = Convert : r810_3 +# 810| r810_15(Base &) = CopyValue : r810_14 +# 810| r810_16(Base &) = Call : func:r810_2, this:r810_1, 0:r810_15 +# 810| mu810_17(unknown) = ^CallSideEffect : ~m? +# 810| v810_18(void) = ^BufferReadSideEffect[-1] : &:r810_1, ~m? +# 810| v810_19(void) = ^BufferReadSideEffect[0] : &:r810_15, ~m? +# 810| mu810_20(Base) = ^IndirectMayWriteSideEffect[-1] : &:r810_1 +# 810| mu810_21(unknown) = ^BufferMayWriteSideEffect[0] : &:r810_15 +# 810| r810_22(glval) = CopyValue : r810_16 # 811| r811_1(glval) = VariableAddress[pm] : # 811| r811_2(Middle *) = Load : &:r811_1, ~m? # 811| r811_3(Base *) = ConvertToNonVirtualBase[Middle : Base] : r811_2 @@ -4636,46 +4640,50 @@ ir.cpp: # 822| r822_13(glval) = CopyValue : r822_7 # 823| r823_1(glval) = VariableAddress[b] : # 823| r823_2(glval) = FunctionAddress[operator=] : -# 823| r823_3(glval) = FunctionAddress[Base] : -# 823| r823_4(glval) = VariableAddress[d] : -# 823| r823_5(glval) = ConvertToNonVirtualBase[Derived : Middle] : r823_4 -# 823| r823_6(glval) = ConvertToNonVirtualBase[Middle : Base] : r823_5 -# 823| r823_7(Base &) = CopyValue : r823_6 -# 823| v823_8(void) = Call : func:r823_3, 0:r823_7 -# 823| mu823_9(unknown) = ^CallSideEffect : ~m? -# 823| mu823_10(Base) = ^IndirectMayWriteSideEffect[-1] : -# 823| v823_11(void) = ^BufferReadSideEffect[0] : &:r823_7, ~m? -# 823| mu823_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r823_7 -# 823| r823_13(glval) = Convert : v823_8 -# 823| r823_14(Base &) = CopyValue : r823_13 -# 823| r823_15(Base &) = Call : func:r823_2, this:r823_1, 0:r823_14 -# 823| mu823_16(unknown) = ^CallSideEffect : ~m? -# 823| v823_17(void) = ^BufferReadSideEffect[-1] : &:r823_1, ~m? -# 823| v823_18(void) = ^BufferReadSideEffect[0] : &:r823_14, ~m? -# 823| mu823_19(Base) = ^IndirectMayWriteSideEffect[-1] : &:r823_1 -# 823| mu823_20(unknown) = ^BufferMayWriteSideEffect[0] : &:r823_14 -# 823| r823_21(glval) = CopyValue : r823_15 +# 823| r823_3(glval) = VariableAddress[#temp823:7] : +# 823| mu823_4(Base) = Uninitialized[#temp823:7] : &:r823_3 +# 823| r823_5(glval) = FunctionAddress[Base] : +# 823| r823_6(glval) = VariableAddress[d] : +# 823| r823_7(glval) = ConvertToNonVirtualBase[Derived : Middle] : r823_6 +# 823| r823_8(glval) = ConvertToNonVirtualBase[Middle : Base] : r823_7 +# 823| r823_9(Base &) = CopyValue : r823_8 +# 823| v823_10(void) = Call : func:r823_5, this:r823_3, 0:r823_9 +# 823| mu823_11(unknown) = ^CallSideEffect : ~m? +# 823| mu823_12(Base) = ^IndirectMayWriteSideEffect[-1] : &:r823_3 +# 823| v823_13(void) = ^BufferReadSideEffect[0] : &:r823_9, ~m? +# 823| mu823_14(unknown) = ^BufferMayWriteSideEffect[0] : &:r823_9 +# 823| r823_15(glval) = Convert : r823_3 +# 823| r823_16(Base &) = CopyValue : r823_15 +# 823| r823_17(Base &) = Call : func:r823_2, this:r823_1, 0:r823_16 +# 823| mu823_18(unknown) = ^CallSideEffect : ~m? +# 823| v823_19(void) = ^BufferReadSideEffect[-1] : &:r823_1, ~m? +# 823| v823_20(void) = ^BufferReadSideEffect[0] : &:r823_16, ~m? +# 823| mu823_21(Base) = ^IndirectMayWriteSideEffect[-1] : &:r823_1 +# 823| mu823_22(unknown) = ^BufferMayWriteSideEffect[0] : &:r823_16 +# 823| r823_23(glval) = CopyValue : r823_17 # 824| r824_1(glval) = VariableAddress[b] : # 824| r824_2(glval) = FunctionAddress[operator=] : -# 824| r824_3(glval) = FunctionAddress[Base] : -# 824| r824_4(glval) = VariableAddress[d] : -# 824| r824_5(glval) = ConvertToNonVirtualBase[Derived : Middle] : r824_4 -# 824| r824_6(glval) = ConvertToNonVirtualBase[Middle : Base] : r824_5 -# 824| r824_7(Base &) = CopyValue : r824_6 -# 824| v824_8(void) = Call : func:r824_3, 0:r824_7 -# 824| mu824_9(unknown) = ^CallSideEffect : ~m? -# 824| mu824_10(Base) = ^IndirectMayWriteSideEffect[-1] : -# 824| v824_11(void) = ^BufferReadSideEffect[0] : &:r824_7, ~m? -# 824| mu824_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r824_7 -# 824| r824_13(glval) = Convert : v824_8 -# 824| r824_14(Base &) = CopyValue : r824_13 -# 824| r824_15(Base &) = Call : func:r824_2, this:r824_1, 0:r824_14 -# 824| mu824_16(unknown) = ^CallSideEffect : ~m? -# 824| v824_17(void) = ^BufferReadSideEffect[-1] : &:r824_1, ~m? -# 824| v824_18(void) = ^BufferReadSideEffect[0] : &:r824_14, ~m? -# 824| mu824_19(Base) = ^IndirectMayWriteSideEffect[-1] : &:r824_1 -# 824| mu824_20(unknown) = ^BufferMayWriteSideEffect[0] : &:r824_14 -# 824| r824_21(glval) = CopyValue : r824_15 +# 824| r824_3(glval) = VariableAddress[#temp824:7] : +# 824| mu824_4(Base) = Uninitialized[#temp824:7] : &:r824_3 +# 824| r824_5(glval) = FunctionAddress[Base] : +# 824| r824_6(glval) = VariableAddress[d] : +# 824| r824_7(glval) = ConvertToNonVirtualBase[Derived : Middle] : r824_6 +# 824| r824_8(glval) = ConvertToNonVirtualBase[Middle : Base] : r824_7 +# 824| r824_9(Base &) = CopyValue : r824_8 +# 824| v824_10(void) = Call : func:r824_5, this:r824_3, 0:r824_9 +# 824| mu824_11(unknown) = ^CallSideEffect : ~m? +# 824| mu824_12(Base) = ^IndirectMayWriteSideEffect[-1] : &:r824_3 +# 824| v824_13(void) = ^BufferReadSideEffect[0] : &:r824_9, ~m? +# 824| mu824_14(unknown) = ^BufferMayWriteSideEffect[0] : &:r824_9 +# 824| r824_15(glval) = Convert : r824_3 +# 824| r824_16(Base &) = CopyValue : r824_15 +# 824| r824_17(Base &) = Call : func:r824_2, this:r824_1, 0:r824_16 +# 824| mu824_18(unknown) = ^CallSideEffect : ~m? +# 824| v824_19(void) = ^BufferReadSideEffect[-1] : &:r824_1, ~m? +# 824| v824_20(void) = ^BufferReadSideEffect[0] : &:r824_16, ~m? +# 824| mu824_21(Base) = ^IndirectMayWriteSideEffect[-1] : &:r824_1 +# 824| mu824_22(unknown) = ^BufferMayWriteSideEffect[0] : &:r824_16 +# 824| r824_23(glval) = CopyValue : r824_17 # 825| r825_1(glval) = VariableAddress[pd] : # 825| r825_2(Derived *) = Load : &:r825_1, ~m? # 825| r825_3(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r825_2 @@ -4825,17 +4833,23 @@ ir.cpp: # 849| mu849_2(unknown) = AliasedDefinition : # 849| mu849_3(unknown) = InitializeNonLocal : # 850| r850_1(glval) = VariableAddress[b] : -# 850| mu850_2(PolymorphicBase) = Uninitialized[b] : &:r850_1 -#-----| r0_1(glval) = FunctionAddress[PolymorphicBase] : -#-----| v0_2(void) = Call : func:r0_1, this:r850_1 -#-----| mu0_3(unknown) = ^CallSideEffect : ~m? -#-----| mu0_4(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r850_1 +#-----| r0_1(glval) = VariableAddress[#temp0:0] : +#-----| mu0_2(PolymorphicBase) = Uninitialized[#temp0:0] : &:r0_1 +#-----| r0_3(glval) = FunctionAddress[PolymorphicBase] : +#-----| v0_4(void) = Call : func:r0_3, this:r0_1 +#-----| mu0_5(unknown) = ^CallSideEffect : ~m? +#-----| mu0_6(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r0_1 +#-----| r0_7(PolymorphicBase) = Load : &:r0_1, ~m? +#-----| mu0_8(PolymorphicBase) = Store : &:r850_1, r0_7 # 851| r851_1(glval) = VariableAddress[d] : -# 851| mu851_2(PolymorphicDerived) = Uninitialized[d] : &:r851_1 -#-----| r0_5(glval) = FunctionAddress[PolymorphicDerived] : -#-----| v0_6(void) = Call : func:r0_5, this:r851_1 -#-----| mu0_7(unknown) = ^CallSideEffect : ~m? -#-----| mu0_8(PolymorphicDerived) = ^IndirectMayWriteSideEffect[-1] : &:r851_1 +#-----| r0_9(glval) = VariableAddress[#temp0:0] : +#-----| mu0_10(PolymorphicDerived) = Uninitialized[#temp0:0] : &:r0_9 +#-----| r0_11(glval) = FunctionAddress[PolymorphicDerived] : +#-----| v0_12(void) = Call : func:r0_11, this:r0_9 +#-----| mu0_13(unknown) = ^CallSideEffect : ~m? +#-----| mu0_14(PolymorphicDerived) = ^IndirectMayWriteSideEffect[-1] : &:r0_9 +#-----| r0_15(PolymorphicDerived) = Load : &:r0_9, ~m? +#-----| mu0_16(PolymorphicDerived) = Store : &:r851_1, r0_15 # 853| r853_1(glval) = VariableAddress[pb] : # 853| r853_2(glval) = VariableAddress[b] : # 853| r853_3(PolymorphicBase *) = CopyValue : r853_2 @@ -6616,7 +6630,7 @@ ir.cpp: # 1179| r1179_3(glval) = FunctionAddress[String] : # 1179| r1179_4(glval) = StringConstant["foo"] : # 1179| r1179_5(char *) = Convert : r1179_4 -# 1179| r1179_6(String) = Call : func:r1179_3, this:r1179_1, 0:r1179_5 +# 1179| v1179_6(void) = Call : func:r1179_3, this:r1179_1, 0:r1179_5 # 1179| mu1179_7(unknown) = ^CallSideEffect : ~m? # 1179| mu1179_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r1179_1 # 1179| v1179_9(void) = ^BufferReadSideEffect[0] : &:r1179_5, ~m? @@ -7433,6 +7447,305 @@ ir.cpp: # 1320| v1320_10(void) = AliasedUse : ~m? # 1320| v1320_11(void) = ExitFunction : +# 1326| String defaultConstruct() +# 1326| Block 0 +# 1326| v1326_1(void) = EnterFunction : +# 1326| mu1326_2(unknown) = AliasedDefinition : +# 1326| mu1326_3(unknown) = InitializeNonLocal : +# 1327| r1327_1(glval) = VariableAddress[#return] : +# 1327| mu1327_2(String) = Uninitialized[#return] : &:r1327_1 +# 1327| r1327_3(glval) = FunctionAddress[String] : +# 1327| v1327_4(void) = Call : func:r1327_3, this:r1327_1 +# 1327| mu1327_5(unknown) = ^CallSideEffect : ~m? +# 1327| mu1327_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r1327_1 +# 1326| r1326_4(glval) = VariableAddress[#return] : +# 1326| v1326_5(void) = ReturnValue : &:r1326_4, ~m? +# 1326| v1326_6(void) = AliasedUse : ~m? +# 1326| v1326_7(void) = ExitFunction : + +# 1326| copy_constructor defaultConstruct() +# 1326| Block 0 +# 1326| v1326_1(void) = EnterFunction : +# 1326| mu1326_2(unknown) = AliasedDefinition : +# 1326| mu1326_3(unknown) = InitializeNonLocal : +# 1327| r1327_1(glval) = VariableAddress[#return] : +# 1327| mu1327_2(copy_constructor) = Uninitialized[#return] : &:r1327_1 +# 1327| r1327_3(glval) = FunctionAddress[copy_constructor] : +# 1327| v1327_4(void) = Call : func:r1327_3, this:r1327_1 +# 1327| mu1327_5(unknown) = ^CallSideEffect : ~m? +# 1327| mu1327_6(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1327_1 +# 1326| r1326_4(glval) = VariableAddress[#return] : +# 1326| v1326_5(void) = ReturnValue : &:r1326_4, ~m? +# 1326| v1326_6(void) = AliasedUse : ~m? +# 1326| v1326_7(void) = ExitFunction : + +# 1326| destructor_only defaultConstruct() +# 1326| Block 0 +# 1326| v1326_1(void) = EnterFunction : +# 1326| mu1326_2(unknown) = AliasedDefinition : +# 1326| mu1326_3(unknown) = InitializeNonLocal : +# 1327| r1327_1(glval) = VariableAddress[#return] : +# 1327| r1327_2(destructor_only) = Constant[0] : +# 1327| mu1327_3(destructor_only) = Store : &:r1327_1, r1327_2 +# 1326| r1326_4(glval) = VariableAddress[#return] : +# 1326| v1326_5(void) = ReturnValue : &:r1326_4, ~m? +# 1326| v1326_6(void) = AliasedUse : ~m? +# 1326| v1326_7(void) = ExitFunction : + +# 1365| void temporary_string() +# 1365| Block 0 +# 1365| v1365_1(void) = EnterFunction : +# 1365| mu1365_2(unknown) = AliasedDefinition : +# 1365| mu1365_3(unknown) = InitializeNonLocal : +# 1366| r1366_1(glval) = VariableAddress[s] : +# 1366| r1366_2(glval) = FunctionAddress[returnValue] : +# 1366| r1366_3(String) = Call : func:r1366_2 +# 1366| mu1366_4(unknown) = ^CallSideEffect : ~m? +# 1366| mu1366_5(String) = Store : &:r1366_1, r1366_3 +# 1367| r1367_1(glval) = VariableAddress[rs] : +# 1367| r1367_2(glval) = VariableAddress[#temp1367:24] : +# 1367| r1367_3(glval) = FunctionAddress[returnValue] : +# 1367| r1367_4(String) = Call : func:r1367_3 +# 1367| mu1367_5(unknown) = ^CallSideEffect : ~m? +# 1367| mu1367_6(String) = Store : &:r1367_2, r1367_4 +# 1367| r1367_7(glval) = Convert : r1367_2 +# 1367| r1367_8(String &) = CopyValue : r1367_7 +# 1367| mu1367_9(String &) = Store : &:r1367_1, r1367_8 +# 1369| r1369_1(glval) = FunctionAddress[acceptRef] : +# 1369| r1369_2(glval) = VariableAddress[s] : +# 1369| r1369_3(glval) = Convert : r1369_2 +# 1369| r1369_4(String &) = CopyValue : r1369_3 +# 1369| v1369_5(void) = Call : func:r1369_1, 0:r1369_4 +# 1369| mu1369_6(unknown) = ^CallSideEffect : ~m? +# 1369| v1369_7(void) = ^BufferReadSideEffect[0] : &:r1369_4, ~m? +# 1369| mu1369_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r1369_4 +# 1370| r1370_1(glval) = FunctionAddress[acceptRef] : +# 1370| r1370_2(glval) = VariableAddress[#temp1370:23] : +# 1370| mu1370_3(String) = Uninitialized[#temp1370:23] : &:r1370_2 +# 1370| r1370_4(glval) = FunctionAddress[String] : +# 1370| r1370_5(glval) = StringConstant["foo"] : +# 1370| r1370_6(char *) = Convert : r1370_5 +# 1370| v1370_7(void) = Call : func:r1370_4, this:r1370_2, 0:r1370_6 +# 1370| mu1370_8(unknown) = ^CallSideEffect : ~m? +# 1370| mu1370_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r1370_2 +# 1370| v1370_10(void) = ^BufferReadSideEffect[0] : &:r1370_6, ~m? +# 1370| mu1370_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r1370_6 +# 1370| r1370_12(String &) = CopyValue : r1370_2 +# 1370| v1370_13(void) = Call : func:r1370_1, 0:r1370_12 +# 1370| mu1370_14(unknown) = ^CallSideEffect : ~m? +# 1370| v1370_15(void) = ^BufferReadSideEffect[0] : &:r1370_12, ~m? +# 1370| mu1370_16(unknown) = ^BufferMayWriteSideEffect[0] : &:r1370_12 +# 1371| r1371_1(glval) = FunctionAddress[acceptValue] : +# 1371| r1371_2(glval) = VariableAddress[#temp1371:17] : +# 1371| mu1371_3(String) = Uninitialized[#temp1371:17] : &:r1371_2 +# 1371| r1371_4(glval) = FunctionAddress[String] : +# 1371| r1371_5(glval) = VariableAddress[s] : +# 1371| r1371_6(glval) = Convert : r1371_5 +# 1371| r1371_7(String &) = CopyValue : r1371_6 +# 1371| v1371_8(void) = Call : func:r1371_4, this:r1371_2, 0:r1371_7 +# 1371| mu1371_9(unknown) = ^CallSideEffect : ~m? +# 1371| mu1371_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r1371_2 +# 1371| v1371_11(void) = ^BufferReadSideEffect[0] : &:r1371_7, ~m? +# 1371| mu1371_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r1371_7 +# 1371| v1371_13(void) = Call : func:r1371_1, 0:r1371_2 +# 1371| mu1371_14(unknown) = ^CallSideEffect : ~m? +# 1372| r1372_1(glval) = FunctionAddress[acceptValue] : +# 1372| r1372_2(glval) = VariableAddress[#temp1372:25] : +# 1372| mu1372_3(String) = Uninitialized[#temp1372:25] : &:r1372_2 +# 1372| r1372_4(glval) = FunctionAddress[String] : +# 1372| r1372_5(glval) = StringConstant["foo"] : +# 1372| r1372_6(char *) = Convert : r1372_5 +# 1372| v1372_7(void) = Call : func:r1372_4, this:r1372_2, 0:r1372_6 +# 1372| mu1372_8(unknown) = ^CallSideEffect : ~m? +# 1372| mu1372_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r1372_2 +# 1372| v1372_10(void) = ^BufferReadSideEffect[0] : &:r1372_6, ~m? +# 1372| mu1372_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r1372_6 +# 1372| v1372_12(void) = Call : func:r1372_1, 0:r1372_2 +# 1372| mu1372_13(unknown) = ^CallSideEffect : ~m? +# 1373| r1373_1(glval) = VariableAddress[#temp1373:5] : +# 1373| mu1373_2(String) = Uninitialized[#temp1373:5] : &:r1373_1 +# 1373| r1373_3(glval) = FunctionAddress[String] : +# 1373| v1373_4(void) = Call : func:r1373_3, this:r1373_1 +# 1373| mu1373_5(unknown) = ^CallSideEffect : ~m? +# 1373| mu1373_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r1373_1 +# 1373| r1373_7(String) = Load : &:r1373_1, ~m? +# 1373| r1373_8(String) = Convert : r1373_7 +# 1373| r1373_9(glval) = FunctionAddress[c_str] : +# 1373| r1373_10(char *) = Call : func:r1373_9, this:r1373_8 +# 1373| mu1373_11(unknown) = ^CallSideEffect : ~m? +# 1373| v1373_12(void) = ^BufferReadSideEffect[-1] : &:r1373_8, ~m? +# 1373| mu1373_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r1373_8 +# 1374| r1374_1(glval) = VariableAddress[#temp1374:5] : +# 1374| r1374_2(glval) = FunctionAddress[returnValue] : +# 1374| r1374_3(String) = Call : func:r1374_2 +# 1374| mu1374_4(unknown) = ^CallSideEffect : ~m? +# 1374| mu1374_5(String) = Store : &:r1374_1, r1374_3 +# 1374| r1374_6(String) = Load : &:r1374_1, ~m? +# 1374| r1374_7(String) = Convert : r1374_6 +# 1374| r1374_8(glval) = FunctionAddress[c_str] : +# 1374| r1374_9(char *) = Call : func:r1374_8, this:r1374_7 +# 1374| mu1374_10(unknown) = ^CallSideEffect : ~m? +# 1374| v1374_11(void) = ^BufferReadSideEffect[-1] : &:r1374_7, ~m? +# 1374| mu1374_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r1374_7 +# 1376| r1376_1(glval) = VariableAddress[#temp1376:5] : +# 1376| r1376_2(glval) = FunctionAddress[defaultConstruct] : +# 1376| r1376_3(String) = Call : func:r1376_2 +# 1376| mu1376_4(unknown) = ^CallSideEffect : ~m? +# 1376| mu1376_5(String) = Store : &:r1376_1, r1376_3 +# 1376| r1376_6(String) = Load : &:r1376_1, ~m? +# 1377| v1377_1(void) = NoOp : +# 1365| v1365_4(void) = ReturnVoid : +# 1365| v1365_5(void) = AliasedUse : ~m? +# 1365| v1365_6(void) = ExitFunction : + +# 1379| void temporary_destructor_only() +# 1379| Block 0 +# 1379| v1379_1(void) = EnterFunction : +# 1379| mu1379_2(unknown) = AliasedDefinition : +# 1379| mu1379_3(unknown) = InitializeNonLocal : +# 1380| r1380_1(glval) = VariableAddress[d] : +# 1380| r1380_2(glval) = FunctionAddress[returnValue] : +# 1380| r1380_3(destructor_only) = Call : func:r1380_2 +# 1380| mu1380_4(unknown) = ^CallSideEffect : ~m? +# 1380| mu1380_5(destructor_only) = Store : &:r1380_1, r1380_3 +# 1381| r1381_1(glval) = VariableAddress[rd] : +# 1381| r1381_2(glval) = VariableAddress[#temp1381:33] : +# 1381| r1381_3(glval) = FunctionAddress[returnValue] : +# 1381| r1381_4(destructor_only) = Call : func:r1381_3 +# 1381| mu1381_5(unknown) = ^CallSideEffect : ~m? +# 1381| mu1381_6(destructor_only) = Store : &:r1381_2, r1381_4 +# 1381| r1381_7(glval) = Convert : r1381_2 +# 1381| r1381_8(destructor_only &) = CopyValue : r1381_7 +# 1381| mu1381_9(destructor_only &) = Store : &:r1381_1, r1381_8 +# 1382| r1382_1(glval) = VariableAddress[d2] : +# 1382| mu1382_2(destructor_only) = Uninitialized[d2] : &:r1382_1 +# 1383| r1383_1(glval) = FunctionAddress[acceptRef] : +# 1383| r1383_2(glval) = VariableAddress[d] : +# 1383| r1383_3(glval) = Convert : r1383_2 +# 1383| r1383_4(destructor_only &) = CopyValue : r1383_3 +# 1383| v1383_5(void) = Call : func:r1383_1, 0:r1383_4 +# 1383| mu1383_6(unknown) = ^CallSideEffect : ~m? +# 1383| v1383_7(void) = ^BufferReadSideEffect[0] : &:r1383_4, ~m? +# 1383| mu1383_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r1383_4 +# 1384| r1384_1(glval) = FunctionAddress[acceptValue] : +# 1384| r1384_2(glval) = VariableAddress[#temp1384:17] : +# 1384| r1384_3(glval) = VariableAddress[d] : +# 1384| r1384_4(destructor_only) = Load : &:r1384_3, ~m? +# 1384| mu1384_5(destructor_only) = Store : &:r1384_2, r1384_4 +# 1384| v1384_6(void) = Call : func:r1384_1, 0:r1384_2 +# 1384| mu1384_7(unknown) = ^CallSideEffect : ~m? +# 1385| r1385_1(glval) = VariableAddress[#temp1385:5] : +# 1385| r1385_2(destructor_only) = Constant[0] : +# 1385| mu1385_3(destructor_only) = Store : &:r1385_1, r1385_2 +# 1385| r1385_4(destructor_only) = Load : &:r1385_1, ~m? +# 1385| r1385_5(glval) = FunctionAddress[method] : +# 1385| v1385_6(void) = Call : func:r1385_5, this:r1385_4 +# 1385| mu1385_7(unknown) = ^CallSideEffect : ~m? +# 1385| v1385_8(void) = ^BufferReadSideEffect[-1] : &:r1385_4, ~m? +# 1385| mu1385_9(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1385_4 +# 1386| r1386_1(glval) = VariableAddress[#temp1386:5] : +# 1386| r1386_2(glval) = FunctionAddress[returnValue] : +# 1386| r1386_3(destructor_only) = Call : func:r1386_2 +# 1386| mu1386_4(unknown) = ^CallSideEffect : ~m? +# 1386| mu1386_5(destructor_only) = Store : &:r1386_1, r1386_3 +# 1386| r1386_6(destructor_only) = Load : &:r1386_1, ~m? +# 1386| r1386_7(glval) = FunctionAddress[method] : +# 1386| v1386_8(void) = Call : func:r1386_7, this:r1386_6 +# 1386| mu1386_9(unknown) = ^CallSideEffect : ~m? +# 1386| v1386_10(void) = ^BufferReadSideEffect[-1] : &:r1386_6, ~m? +# 1386| mu1386_11(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1386_6 +# 1388| r1388_1(glval) = VariableAddress[#temp1388:5] : +# 1388| r1388_2(glval) = FunctionAddress[defaultConstruct] : +# 1388| r1388_3(destructor_only) = Call : func:r1388_2 +# 1388| mu1388_4(unknown) = ^CallSideEffect : ~m? +# 1388| mu1388_5(destructor_only) = Store : &:r1388_1, r1388_3 +# 1388| r1388_6(destructor_only) = Load : &:r1388_1, ~m? +# 1389| v1389_1(void) = NoOp : +# 1379| v1379_4(void) = ReturnVoid : +# 1379| v1379_5(void) = AliasedUse : ~m? +# 1379| v1379_6(void) = ExitFunction : + +# 1391| void temporary_copy_constructor() +# 1391| Block 0 +# 1391| v1391_1(void) = EnterFunction : +# 1391| mu1391_2(unknown) = AliasedDefinition : +# 1391| mu1391_3(unknown) = InitializeNonLocal : +# 1392| r1392_1(glval) = VariableAddress[d] : +# 1392| r1392_2(glval) = FunctionAddress[returnValue] : +# 1392| r1392_3(copy_constructor) = Call : func:r1392_2 +# 1392| mu1392_4(unknown) = ^CallSideEffect : ~m? +# 1392| mu1392_5(copy_constructor) = Store : &:r1392_1, r1392_3 +# 1393| r1393_1(glval) = VariableAddress[rd] : +# 1393| r1393_2(glval) = VariableAddress[#temp1393:34] : +# 1393| r1393_3(glval) = FunctionAddress[returnValue] : +# 1393| r1393_4(copy_constructor) = Call : func:r1393_3 +# 1393| mu1393_5(unknown) = ^CallSideEffect : ~m? +# 1393| mu1393_6(copy_constructor) = Store : &:r1393_2, r1393_4 +# 1393| r1393_7(glval) = Convert : r1393_2 +# 1393| r1393_8(copy_constructor &) = CopyValue : r1393_7 +# 1393| mu1393_9(copy_constructor &) = Store : &:r1393_1, r1393_8 +# 1394| r1394_1(glval) = VariableAddress[d2] : +# 1394| mu1394_2(copy_constructor) = Uninitialized[d2] : &:r1394_1 +# 1394| r1394_3(glval) = FunctionAddress[copy_constructor] : +# 1394| v1394_4(void) = Call : func:r1394_3, this:r1394_1 +# 1394| mu1394_5(unknown) = ^CallSideEffect : ~m? +# 1394| mu1394_6(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1394_1 +# 1395| r1395_1(glval) = FunctionAddress[acceptRef] : +# 1395| r1395_2(glval) = VariableAddress[d] : +# 1395| r1395_3(glval) = Convert : r1395_2 +# 1395| r1395_4(copy_constructor &) = CopyValue : r1395_3 +# 1395| v1395_5(void) = Call : func:r1395_1, 0:r1395_4 +# 1395| mu1395_6(unknown) = ^CallSideEffect : ~m? +# 1395| v1395_7(void) = ^BufferReadSideEffect[0] : &:r1395_4, ~m? +# 1395| mu1395_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r1395_4 +# 1396| r1396_1(glval) = FunctionAddress[acceptValue] : +# 1396| r1396_2(glval) = VariableAddress[#temp1396:17] : +# 1396| mu1396_3(copy_constructor) = Uninitialized[#temp1396:17] : &:r1396_2 +# 1396| r1396_4(glval) = FunctionAddress[copy_constructor] : +# 1396| r1396_5(glval) = VariableAddress[d] : +# 1396| r1396_6(glval) = Convert : r1396_5 +# 1396| r1396_7(copy_constructor &) = CopyValue : r1396_6 +# 1396| v1396_8(void) = Call : func:r1396_4, this:r1396_2, 0:r1396_7 +# 1396| mu1396_9(unknown) = ^CallSideEffect : ~m? +# 1396| mu1396_10(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1396_2 +# 1396| v1396_11(void) = ^BufferReadSideEffect[0] : &:r1396_7, ~m? +# 1396| mu1396_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r1396_7 +# 1396| v1396_13(void) = Call : func:r1396_1, 0:r1396_2 +# 1396| mu1396_14(unknown) = ^CallSideEffect : ~m? +# 1397| r1397_1(glval) = VariableAddress[#temp1397:5] : +# 1397| mu1397_2(copy_constructor) = Uninitialized[#temp1397:5] : &:r1397_1 +# 1397| r1397_3(glval) = FunctionAddress[copy_constructor] : +# 1397| v1397_4(void) = Call : func:r1397_3, this:r1397_1 +# 1397| mu1397_5(unknown) = ^CallSideEffect : ~m? +# 1397| mu1397_6(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1397_1 +# 1397| r1397_7(copy_constructor) = Load : &:r1397_1, ~m? +# 1397| r1397_8(glval) = FunctionAddress[method] : +# 1397| v1397_9(void) = Call : func:r1397_8, this:r1397_7 +# 1397| mu1397_10(unknown) = ^CallSideEffect : ~m? +# 1397| v1397_11(void) = ^BufferReadSideEffect[-1] : &:r1397_7, ~m? +# 1397| mu1397_12(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1397_7 +# 1398| r1398_1(glval) = VariableAddress[#temp1398:5] : +# 1398| r1398_2(glval) = FunctionAddress[returnValue] : +# 1398| r1398_3(copy_constructor) = Call : func:r1398_2 +# 1398| mu1398_4(unknown) = ^CallSideEffect : ~m? +# 1398| mu1398_5(copy_constructor) = Store : &:r1398_1, r1398_3 +# 1398| r1398_6(copy_constructor) = Load : &:r1398_1, ~m? +# 1398| r1398_7(glval) = FunctionAddress[method] : +# 1398| v1398_8(void) = Call : func:r1398_7, this:r1398_6 +# 1398| mu1398_9(unknown) = ^CallSideEffect : ~m? +# 1398| v1398_10(void) = ^BufferReadSideEffect[-1] : &:r1398_6, ~m? +# 1398| mu1398_11(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1398_6 +# 1400| r1400_1(glval) = VariableAddress[#temp1400:5] : +# 1400| r1400_2(glval) = FunctionAddress[defaultConstruct] : +# 1400| r1400_3(copy_constructor) = Call : func:r1400_2 +# 1400| mu1400_4(unknown) = ^CallSideEffect : ~m? +# 1400| mu1400_5(copy_constructor) = Store : &:r1400_1, r1400_3 +# 1400| r1400_6(copy_constructor) = Load : &:r1400_1, ~m? +# 1401| v1401_1(void) = NoOp : +# 1391| v1391_4(void) = ReturnVoid : +# 1391| v1391_5(void) = AliasedUse : ~m? +# 1391| v1391_6(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected index 64172ad18738..1c41692bcaad 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected @@ -1,8 +1,4 @@ missingOperand -| ir.cpp:809:7:809:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:810:7:810:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:823:7:823:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:824:7:824:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | unexpectedOperand duplicateOperand missingPhiOperand diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected index 64172ad18738..1c41692bcaad 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected @@ -1,8 +1,4 @@ missingOperand -| ir.cpp:809:7:809:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:810:7:810:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:823:7:823:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:824:7:824:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | unexpectedOperand duplicateOperand missingPhiOperand From bf8340f10215bd82d163ccfe5e7f0b453e5d0ee0 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Wed, 7 Oct 2020 10:26:02 -0400 Subject: [PATCH 03/53] Fix test expectations in `syntax-zoo` --- .../aliased_ssa_consistency.expected | 19 ------------------- .../syntax-zoo/raw_consistency.expected | 19 ------------------- .../unaliased_ssa_consistency.expected | 19 ------------------- 3 files changed, 57 deletions(-) diff --git a/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected index 389b3a9496d3..0b6512a5496a 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected @@ -1,23 +1,4 @@ missingOperand -| conditional_destructors.cpp:30:9:30:13 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:30:18:30:22 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:33:9:33:13 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:33:18:33:22 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:39:9:39:13 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| conditional_destructors.cpp:39:18:39:22 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| conditional_destructors.cpp:42:9:42:13 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| conditional_destructors.cpp:42:18:42:22 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| cpp11.cpp:77:19:77:21 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:76:8:76:8 | void lambda::apply<(void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)>(lambda::Val, (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)) | void lambda::apply<(void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)>(lambda::Val, (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)) | -| cpp11.cpp:82:11:82:14 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:81:8:81:8 | void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val) | void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val) | -| cpp11.cpp:82:45:82:48 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:82:20:82:20 | void (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | void (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | -| cpp11.cpp:82:51:82:51 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:82:20:82:20 | void (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | void (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | -| cpp11.cpp:88:25:88:30 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:87:8:87:11 | void lambda::main() | void lambda::main() | -| cpp11.cpp:88:33:88:38 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:87:8:87:11 | void lambda::main() | void lambda::main() | -| destructors.cpp:51:36:51:38 | IndirectMayWriteSideEffect: call to C | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | destructors.cpp:49:7:49:7 | int cond_destruct::f(int) | int cond_destruct::f(int) | -| ir.cpp:809:7:809:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:810:7:810:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:823:7:823:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:824:7:824:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | | misc.c:125:5:125:11 | CopyValue: (statement expression) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | misc.c:97:6:97:10 | void misc3() | void misc3() | unexpectedOperand duplicateOperand diff --git a/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected index 61da658e201c..54ac1cd96bc7 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected @@ -3,25 +3,6 @@ missingOperand | condition_decls.cpp:26:10:26:24 | CopyValue: (condition decl) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | condition_decls.cpp:25:6:25:21 | void switch_decl_bind(int) | void switch_decl_bind(int) | | condition_decls.cpp:41:9:41:23 | CopyValue: (condition decl) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | condition_decls.cpp:40:6:40:20 | void while_decl_bind(int) | void while_decl_bind(int) | | condition_decls.cpp:48:39:48:53 | CopyValue: (condition decl) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | condition_decls.cpp:47:6:47:18 | void for_decl_bind(int) | void for_decl_bind(int) | -| conditional_destructors.cpp:30:9:30:13 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:30:18:30:22 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:33:9:33:13 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:33:18:33:22 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:39:9:39:13 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| conditional_destructors.cpp:39:18:39:22 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| conditional_destructors.cpp:42:9:42:13 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| conditional_destructors.cpp:42:18:42:22 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| cpp11.cpp:77:19:77:21 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:76:8:76:8 | void lambda::apply<(void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)>(lambda::Val, (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)) | void lambda::apply<(void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)>(lambda::Val, (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)) | -| cpp11.cpp:82:11:82:14 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:81:8:81:8 | void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val) | void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val) | -| cpp11.cpp:82:45:82:48 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:82:20:82:20 | void (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | void (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | -| cpp11.cpp:82:51:82:51 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:82:20:82:20 | void (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | void (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | -| cpp11.cpp:88:25:88:30 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:87:8:87:11 | void lambda::main() | void lambda::main() | -| cpp11.cpp:88:33:88:38 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:87:8:87:11 | void lambda::main() | void lambda::main() | -| destructors.cpp:51:36:51:38 | IndirectMayWriteSideEffect: call to C | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | destructors.cpp:49:7:49:7 | int cond_destruct::f(int) | int cond_destruct::f(int) | -| ir.cpp:809:7:809:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:810:7:810:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:823:7:823:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:824:7:824:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | | misc.c:125:5:125:11 | CopyValue: (statement expression) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | misc.c:97:6:97:10 | void misc3() | void misc3() | | misc.c:220:3:223:3 | Store: ... = ... | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) | | misc.c:220:9:223:3 | FieldAddress: {...} | Instruction 'FieldAddress' is missing an expected operand with tag 'Unary' in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) | diff --git a/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected index 4307483dfee4..124fe8fe6963 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected @@ -1,23 +1,4 @@ missingOperand -| conditional_destructors.cpp:30:9:30:13 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:30:18:30:22 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:33:9:33:13 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:33:18:33:22 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:39:9:39:13 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| conditional_destructors.cpp:39:18:39:22 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| conditional_destructors.cpp:42:9:42:13 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| conditional_destructors.cpp:42:18:42:22 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| cpp11.cpp:77:19:77:21 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:76:8:76:8 | void lambda::apply<(void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)>(lambda::Val, (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)) | void lambda::apply<(void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)>(lambda::Val, (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)) | -| cpp11.cpp:82:11:82:14 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:81:8:81:8 | void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val) | void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val) | -| cpp11.cpp:82:45:82:48 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:82:20:82:20 | void (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | void (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | -| cpp11.cpp:82:51:82:51 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:82:20:82:20 | void (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | void (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | -| cpp11.cpp:88:25:88:30 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:87:8:87:11 | void lambda::main() | void lambda::main() | -| cpp11.cpp:88:33:88:38 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:87:8:87:11 | void lambda::main() | void lambda::main() | -| destructors.cpp:51:36:51:38 | IndirectMayWriteSideEffect: call to C | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | destructors.cpp:49:7:49:7 | int cond_destruct::f(int) | int cond_destruct::f(int) | -| ir.cpp:809:7:809:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:810:7:810:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:823:7:823:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:824:7:824:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | | misc.c:125:5:125:11 | CopyValue: (statement expression) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | misc.c:97:6:97:10 | void misc3() | void misc3() | unexpectedOperand duplicateOperand From 1e455f08a3af21ad671148441483b9d815d5899e Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Wed, 7 Oct 2020 13:14:54 -0400 Subject: [PATCH 04/53] Fix test expectations --- .../classes/variadic/expr.expected | 1 + .../conversions/conversions.expected | 2 +- .../exprs/unevaluated/unevaluated.expected | 1 + .../question_mark_colon/cfg.expected | 1 + .../types/unspecified/exprs.expected | 1 + .../virtual_functions/cfg/cfg.expected | 302 ++++++++-------- .../conditional_destructors/cfg.expected | 336 +++++++++--------- 7 files changed, 330 insertions(+), 314 deletions(-) diff --git a/cpp/ql/test/library-tests/classes/variadic/expr.expected b/cpp/ql/test/library-tests/classes/variadic/expr.expected index a3b685781e36..eaa77968e3fd 100644 --- a/cpp/ql/test/library-tests/classes/variadic/expr.expected +++ b/cpp/ql/test/library-tests/classes/variadic/expr.expected @@ -4,3 +4,4 @@ | test.cpp:4:9:4:9 | this | | test.cpp:4:9:4:11 | call to expression | | test.cpp:10:5:10:11 | call to Foo | +| test.cpp:10:5:10:11 | temporary object | diff --git a/cpp/ql/test/library-tests/conversions/conversions.expected b/cpp/ql/test/library-tests/conversions/conversions.expected index cf7163aa5e16..14c1a1e80cf3 100644 --- a/cpp/ql/test/library-tests/conversions/conversions.expected +++ b/cpp/ql/test/library-tests/conversions/conversions.expected @@ -122,7 +122,7 @@ | conversions.cpp:179:36:179:37 | (..:: *)... | pointer-to-member derived class conversion | prval | ..:: * | ..:: * | | conversions.cpp:180:10:180:47 | static_cast<..:: *>... | pointer-to-member derived class conversion | prval | ..:: * | ..:: * | | conversions.cpp:180:43:180:46 | (..:: *)... | pointer-to-member derived class conversion | prval | ..:: * | ..:: * | -| conversions.cpp:190:22:190:29 | (const String)... | glvalue conversion | lval | const String | void | +| conversions.cpp:190:22:190:29 | (const String)... | glvalue conversion | lval | const String | String | | conversions.cpp:193:20:193:31 | (const Base)... | glvalue conversion | lval | const Base | Base | | conversions.cpp:193:31:193:31 | (Base)... | base class conversion | lval | Base | Middle | | conversions.cpp:193:31:193:31 | (Middle)... | base class conversion | lval | Middle | Derived | diff --git a/cpp/ql/test/library-tests/exprs/unevaluated/unevaluated.expected b/cpp/ql/test/library-tests/exprs/unevaluated/unevaluated.expected index 6015065b4f70..7eaeb6879ec0 100644 --- a/cpp/ql/test/library-tests/exprs/unevaluated/unevaluated.expected +++ b/cpp/ql/test/library-tests/exprs/unevaluated/unevaluated.expected @@ -13,3 +13,4 @@ | test.cpp:42:11:42:11 | x | | test.cpp:57:9:57:9 | 4 | | test.cpp:63:9:63:19 | call to getAVirtual | +| test.cpp:63:9:63:21 | temporary object | diff --git a/cpp/ql/test/library-tests/question_mark_colon/cfg.expected b/cpp/ql/test/library-tests/question_mark_colon/cfg.expected index 82cda5c6f84c..9fa6fa1b53b9 100644 --- a/cpp/ql/test/library-tests/question_mark_colon/cfg.expected +++ b/cpp/ql/test/library-tests/question_mark_colon/cfg.expected @@ -1,3 +1,4 @@ +| 0 | 1 | file://:0:0:0:0 | temporary object | None | | 2 | 1 | question_mark_colon.c:2:7:2:7 | f | None | | 4 | 1 | question_mark_colon.c:4:14:8:1 | { ... } | declaration | | 4 | 17 | question_mark_colon.c:4:6:4:6 | g | None | diff --git a/cpp/ql/test/library-tests/types/unspecified/exprs.expected b/cpp/ql/test/library-tests/types/unspecified/exprs.expected index ac49b6d061b8..93ae19533321 100644 --- a/cpp/ql/test/library-tests/types/unspecified/exprs.expected +++ b/cpp/ql/test/library-tests/types/unspecified/exprs.expected @@ -10,6 +10,7 @@ | test.cpp:13:15:13:15 | constructor init of field d | struct D | struct D | | test.cpp:19:30:19:30 | (reference to) | reference to {const {struct E}} | reference to {struct E} | | test.cpp:19:30:19:30 | call to E | void | void | +| test.cpp:19:30:19:30 | temporary object | const {struct E} | struct E | | test.cpp:19:30:19:30 | w | pointer to {int} | pointer to {int} | | test.cpp:23:12:23:12 | (const F *)... | pointer to {const {struct F}} | pointer to {struct F} | | test.cpp:23:12:23:12 | f | pointer to {struct F} | pointer to {struct F} | diff --git a/cpp/ql/test/library-tests/virtual_functions/cfg/cfg.expected b/cpp/ql/test/library-tests/virtual_functions/cfg/cfg.expected index 9d0e0c7773a7..70f37a3c5795 100644 --- a/cpp/ql/test/library-tests/virtual_functions/cfg/cfg.expected +++ b/cpp/ql/test/library-tests/virtual_functions/cfg/cfg.expected @@ -1,149 +1,153 @@ -| Base::Base | false | 215 | 215 | Base | -| Base::Base | false | 220 | 220 | return ... | -| Base::Base | false | 222 | 222 | { ... } | -| Base::Base | false | 363 | 363 | Base | -| Base::Base | false | 367 | 367 | Base | -| Base::Base | true | 220 | 215 | | -| Base::Base | true | 222 | 220 | | -| Base::Base_f | false | 407 | 407 | Base_f | -| Base::Base_f | false | 412 | 412 | declaration | -| Base::Base_f | false | 416 | 416 | 1 | -| Base::Base_f | false | 417 | 417 | return ... | -| Base::Base_f | false | 419 | 419 | { ... } | -| Base::Base_f | false | 424 | 424 | call to f | -| Base::Base_f | false | 426 | 426 | this | -| Base::Base_f | false | 427 | 427 | initializer for i | -| Base::Base_f | true | 412 | 427 | | -| Base::Base_f | true | 416 | 407 | | -| Base::Base_f | true | 417 | 416 | | -| Base::Base_f | true | 419 | 412 | | -| Base::Base_f | true | 426 | 424 | | -| Base::Base_f | true | 427 | 426 | | -| Base::Base_g | false | 371 | 371 | Base_g | -| Base::Base_g | false | 376 | 376 | declaration | -| Base::Base_g | false | 380 | 380 | 4 | -| Base::Base_g | false | 381 | 381 | return ... | -| Base::Base_g | false | 383 | 383 | { ... } | -| Base::Base_g | false | 388 | 388 | call to g | -| Base::Base_g | false | 391 | 391 | this | -| Base::Base_g | false | 392 | 392 | initializer for i | -| Base::Base_g | true | 376 | 392 | | -| Base::Base_g | true | 380 | 371 | | -| Base::Base_g | true | 381 | 380 | | -| Base::Base_g | true | 383 | 376 | | -| Base::Base_g | true | 388 | 381 | | -| Base::Base_g | true | 391 | 388 | | -| Base::Base_g | true | 392 | 391 | | -| Base::f | false | 301 | 301 | f | -| Base::f | false | 437 | 437 | call to abort | -| Base::f | false | 439 | 439 | ExprStmt | -| Base::f | false | 441 | 441 | return ... | -| Base::f | false | 443 | 443 | { ... } | -| Base::f | true | 439 | 437 | | -| Base::f | true | 441 | 301 | | -| Base::f | true | 443 | 439 | | -| Base::g | false | 230 | 230 | g | -| Base::g | false | 402 | 402 | 3 | -| Base::g | false | 403 | 403 | return ... | -| Base::g | false | 405 | 405 | { ... } | -| Base::g | true | 402 | 230 | | -| Base::g | true | 403 | 402 | | -| Base::g | true | 405 | 403 | | -| Base::operator= | false | 349 | 349 | operator= | -| Base::operator= | false | 359 | 359 | operator= | -| __va_list_tag::operator= | false | 92 | 92 | operator= | -| __va_list_tag::operator= | false | 99 | 99 | operator= | -| abort | false | 345 | 345 | abort | -| fun_f1 | false | 312 | 312 | fun_f1 | -| fun_f1 | false | 317 | 317 | declaration | -| fun_f1 | false | 319 | 319 | declaration | -| fun_f1 | false | 323 | 323 | 2 | -| fun_f1 | false | 324 | 324 | return ... | -| fun_f1 | false | 326 | 326 | { ... } | -| fun_f1 | false | 329 | 329 | call to Base | -| fun_f1 | false | 330 | 330 | new | -| fun_f1 | false | 332 | 332 | initializer for p1 | -| fun_f1 | false | 337 | 337 | call to f | -| fun_f1 | false | 339 | 339 | p1 | -| fun_f1 | false | 341 | 341 | initializer for i | -| fun_f1 | true | 317 | 332 | | -| fun_f1 | true | 319 | 341 | | -| fun_f1 | true | 323 | 312 | | -| fun_f1 | true | 324 | 323 | | -| fun_f1 | true | 326 | 317 | | -| fun_f1 | true | 329 | 330 | | -| fun_f1 | true | 330 | 319 | | -| fun_f1 | true | 332 | 329 | | -| fun_f1 | true | 337 | 324 | | -| fun_f1 | true | 339 | 337 | | -| fun_f1 | true | 341 | 339 | | -| fun_f2 | false | 276 | 276 | fun_f2 | -| fun_f2 | false | 281 | 281 | declaration | -| fun_f2 | false | 283 | 283 | declaration | -| fun_f2 | false | 287 | 287 | 2 | -| fun_f2 | false | 288 | 288 | return ... | -| fun_f2 | false | 290 | 290 | { ... } | -| fun_f2 | false | 293 | 293 | call to Base | -| fun_f2 | false | 294 | 294 | new | -| fun_f2 | false | 296 | 296 | initializer for p1 | -| fun_f2 | false | 304 | 304 | call to f | -| fun_f2 | false | 306 | 306 | p1 | -| fun_f2 | false | 308 | 308 | initializer for i | -| fun_f2 | true | 281 | 296 | | -| fun_f2 | true | 283 | 308 | | -| fun_f2 | true | 287 | 276 | | -| fun_f2 | true | 288 | 287 | | -| fun_f2 | true | 290 | 281 | | -| fun_f2 | true | 293 | 294 | | -| fun_f2 | true | 294 | 283 | | -| fun_f2 | true | 296 | 293 | | -| fun_f2 | true | 306 | 304 | | -| fun_f2 | true | 308 | 306 | | -| fun_g1 | false | 243 | 243 | fun_g1 | -| fun_g1 | false | 248 | 248 | declaration | -| fun_g1 | false | 250 | 250 | declaration | -| fun_g1 | false | 254 | 254 | 2 | -| fun_g1 | false | 255 | 255 | return ... | -| fun_g1 | false | 257 | 257 | { ... } | -| fun_g1 | false | 260 | 260 | call to Base | -| fun_g1 | false | 261 | 261 | new | -| fun_g1 | false | 263 | 263 | initializer for p1 | -| fun_g1 | false | 268 | 268 | call to g | -| fun_g1 | false | 270 | 270 | p1 | -| fun_g1 | false | 272 | 272 | initializer for i | -| fun_g1 | true | 248 | 263 | | -| fun_g1 | true | 250 | 272 | | -| fun_g1 | true | 254 | 243 | | -| fun_g1 | true | 255 | 254 | | -| fun_g1 | true | 257 | 248 | | -| fun_g1 | true | 260 | 261 | | -| fun_g1 | true | 261 | 250 | | -| fun_g1 | true | 263 | 260 | | -| fun_g1 | true | 268 | 255 | | -| fun_g1 | true | 270 | 268 | | -| fun_g1 | true | 272 | 270 | | -| fun_g2 | false | 192 | 192 | fun_g2 | -| fun_g2 | false | 197 | 197 | declaration | -| fun_g2 | false | 199 | 199 | declaration | -| fun_g2 | false | 203 | 203 | 2 | -| fun_g2 | false | 204 | 204 | return ... | -| fun_g2 | false | 206 | 206 | { ... } | -| fun_g2 | false | 214 | 214 | call to Base | -| fun_g2 | false | 223 | 223 | new | -| fun_g2 | false | 225 | 225 | initializer for p1 | -| fun_g2 | false | 235 | 235 | call to g | -| fun_g2 | false | 237 | 237 | p1 | -| fun_g2 | false | 239 | 239 | initializer for i | -| fun_g2 | true | 197 | 225 | | -| fun_g2 | true | 199 | 239 | | -| fun_g2 | true | 203 | 192 | | -| fun_g2 | true | 204 | 203 | | -| fun_g2 | true | 206 | 197 | | -| fun_g2 | true | 214 | 223 | | -| fun_g2 | true | 223 | 199 | | -| fun_g2 | true | 225 | 214 | | -| fun_g2 | true | 235 | 204 | | -| fun_g2 | true | 237 | 235 | | -| fun_g2 | true | 239 | 237 | | -| operator delete | false | 212 | 212 | operator delete | -| operator new | false | 210 | 210 | operator new | +| Base::Base | false | 165 | 165 | Base | +| Base::Base | false | 170 | 170 | return ... | +| Base::Base | false | 172 | 172 | { ... } | +| Base::Base | false | 326 | 326 | Base | +| Base::Base | false | 330 | 330 | Base | +| Base::Base | true | 170 | 165 | | +| Base::Base | true | 172 | 170 | | +| Base::Base_f | false | 369 | 369 | Base_f | +| Base::Base_f | false | 374 | 374 | declaration | +| Base::Base_f | false | 379 | 379 | call to f | +| Base::Base_f | false | 381 | 381 | this | +| Base::Base_f | false | 382 | 382 | initializer for i | +| Base::Base_f | false | 386 | 386 | return ... | +| Base::Base_f | false | 390 | 390 | 1 | +| Base::Base_f | false | 391 | 391 | { ... } | +| Base::Base_f | true | 374 | 382 | | +| Base::Base_f | true | 381 | 379 | | +| Base::Base_f | true | 382 | 381 | | +| Base::Base_f | true | 386 | 390 | | +| Base::Base_f | true | 390 | 369 | | +| Base::Base_f | true | 391 | 374 | | +| Base::Base_g | false | 334 | 334 | Base_g | +| Base::Base_g | false | 339 | 339 | declaration | +| Base::Base_g | false | 344 | 344 | call to g | +| Base::Base_g | false | 346 | 346 | this | +| Base::Base_g | false | 347 | 347 | initializer for i | +| Base::Base_g | false | 351 | 351 | return ... | +| Base::Base_g | false | 355 | 355 | 4 | +| Base::Base_g | false | 356 | 356 | { ... } | +| Base::Base_g | true | 339 | 347 | | +| Base::Base_g | true | 344 | 351 | | +| Base::Base_g | true | 346 | 344 | | +| Base::Base_g | true | 347 | 346 | | +| Base::Base_g | true | 351 | 355 | | +| Base::Base_g | true | 355 | 334 | | +| Base::Base_g | true | 356 | 339 | | +| Base::f | false | 256 | 256 | f | +| Base::f | false | 397 | 397 | ExprStmt | +| Base::f | false | 401 | 401 | call to abort | +| Base::f | false | 403 | 403 | return ... | +| Base::f | false | 405 | 405 | { ... } | +| Base::f | true | 397 | 401 | | +| Base::f | true | 403 | 256 | | +| Base::f | true | 405 | 397 | | +| Base::g | false | 183 | 183 | g | +| Base::g | false | 362 | 362 | return ... | +| Base::g | false | 366 | 366 | 3 | +| Base::g | false | 367 | 367 | { ... } | +| Base::g | true | 362 | 366 | | +| Base::g | true | 366 | 183 | | +| Base::g | true | 367 | 362 | | +| Base::operator= | false | 311 | 311 | operator= | +| Base::operator= | false | 320 | 320 | operator= | +| __va_list_tag::operator= | false | 57 | 57 | operator= | +| __va_list_tag::operator= | false | 63 | 63 | operator= | +| abort | false | 308 | 308 | abort | +| fun_f1 | false | 274 | 274 | fun_f1 | +| fun_f1 | false | 279 | 279 | declaration | +| fun_f1 | false | 282 | 282 | call to Base | +| fun_f1 | false | 283 | 283 | temporary object | +| fun_f1 | false | 284 | 284 | new | +| fun_f1 | false | 286 | 286 | initializer for p1 | +| fun_f1 | false | 290 | 290 | declaration | +| fun_f1 | false | 293 | 293 | call to f | +| fun_f1 | false | 295 | 295 | p1 | +| fun_f1 | false | 297 | 297 | initializer for i | +| fun_f1 | false | 301 | 301 | return ... | +| fun_f1 | false | 305 | 305 | 2 | +| fun_f1 | false | 306 | 306 | { ... } | +| fun_f1 | true | 279 | 286 | | +| fun_f1 | true | 282 | 284 | | +| fun_f1 | true | 284 | 290 | | +| fun_f1 | true | 286 | 282 | | +| fun_f1 | true | 290 | 297 | | +| fun_f1 | true | 293 | 301 | | +| fun_f1 | true | 295 | 293 | | +| fun_f1 | true | 297 | 295 | | +| fun_f1 | true | 301 | 305 | | +| fun_f1 | true | 305 | 274 | | +| fun_f1 | true | 306 | 279 | | +| fun_f2 | false | 237 | 237 | fun_f2 | +| fun_f2 | false | 242 | 242 | declaration | +| fun_f2 | false | 245 | 245 | call to Base | +| fun_f2 | false | 246 | 246 | temporary object | +| fun_f2 | false | 247 | 247 | new | +| fun_f2 | false | 249 | 249 | initializer for p1 | +| fun_f2 | false | 253 | 253 | declaration | +| fun_f2 | false | 259 | 259 | call to f | +| fun_f2 | false | 261 | 261 | p1 | +| fun_f2 | false | 263 | 263 | initializer for i | +| fun_f2 | false | 267 | 267 | return ... | +| fun_f2 | false | 271 | 271 | 2 | +| fun_f2 | false | 272 | 272 | { ... } | +| fun_f2 | true | 242 | 249 | | +| fun_f2 | true | 245 | 247 | | +| fun_f2 | true | 247 | 253 | | +| fun_f2 | true | 249 | 245 | | +| fun_f2 | true | 253 | 263 | | +| fun_f2 | true | 261 | 259 | | +| fun_f2 | true | 263 | 261 | | +| fun_f2 | true | 267 | 271 | | +| fun_f2 | true | 271 | 237 | | +| fun_f2 | true | 272 | 242 | | +| fun_g1 | false | 203 | 203 | fun_g1 | +| fun_g1 | false | 208 | 208 | declaration | +| fun_g1 | false | 211 | 211 | call to Base | +| fun_g1 | false | 212 | 212 | temporary object | +| fun_g1 | false | 213 | 213 | new | +| fun_g1 | false | 215 | 215 | initializer for p1 | +| fun_g1 | false | 219 | 219 | declaration | +| fun_g1 | false | 222 | 222 | call to g | +| fun_g1 | false | 224 | 224 | p1 | +| fun_g1 | false | 226 | 226 | initializer for i | +| fun_g1 | false | 230 | 230 | return ... | +| fun_g1 | false | 234 | 234 | 2 | +| fun_g1 | false | 235 | 235 | { ... } | +| fun_g1 | true | 208 | 215 | | +| fun_g1 | true | 211 | 213 | | +| fun_g1 | true | 213 | 219 | | +| fun_g1 | true | 215 | 211 | | +| fun_g1 | true | 219 | 226 | | +| fun_g1 | true | 222 | 230 | | +| fun_g1 | true | 224 | 222 | | +| fun_g1 | true | 226 | 224 | | +| fun_g1 | true | 230 | 234 | | +| fun_g1 | true | 234 | 203 | | +| fun_g1 | true | 235 | 208 | | +| fun_g2 | false | 151 | 151 | fun_g2 | +| fun_g2 | false | 156 | 156 | declaration | +| fun_g2 | false | 164 | 164 | call to Base | +| fun_g2 | false | 173 | 173 | temporary object | +| fun_g2 | false | 174 | 174 | new | +| fun_g2 | false | 176 | 176 | initializer for p1 | +| fun_g2 | false | 180 | 180 | declaration | +| fun_g2 | false | 188 | 188 | call to g | +| fun_g2 | false | 190 | 190 | p1 | +| fun_g2 | false | 192 | 192 | initializer for i | +| fun_g2 | false | 196 | 196 | return ... | +| fun_g2 | false | 200 | 200 | 2 | +| fun_g2 | false | 201 | 201 | { ... } | +| fun_g2 | true | 156 | 176 | | +| fun_g2 | true | 164 | 174 | | +| fun_g2 | true | 174 | 180 | | +| fun_g2 | true | 176 | 164 | | +| fun_g2 | true | 180 | 192 | | +| fun_g2 | true | 188 | 196 | | +| fun_g2 | true | 190 | 188 | | +| fun_g2 | true | 192 | 190 | | +| fun_g2 | true | 196 | 200 | | +| fun_g2 | true | 200 | 151 | | +| fun_g2 | true | 201 | 156 | | +| operator delete | false | 162 | 162 | operator delete | +| operator new | false | 160 | 160 | operator new | diff --git a/cpp/ql/test/successor-tests/conditional_destructors/cfg.expected b/cpp/ql/test/successor-tests/conditional_destructors/cfg.expected index 2d94b3ca1e40..a47bcaf6fbf4 100644 --- a/cpp/ql/test/successor-tests/conditional_destructors/cfg.expected +++ b/cpp/ql/test/successor-tests/conditional_destructors/cfg.expected @@ -1,167 +1,175 @@ -| C1::C1 | false | 254 | 254 | C1 | -| C1::C1 | false | 420 | 420 | C1 | -| C1::C1 | false | 424 | 424 | C1 | -| C1::C1 | false | 470 | 470 | this | -| C1::C1 | false | 472 | 472 | val | -| C1::C1 | false | 475 | 475 | x | -| C1::C1 | false | 478 | 478 | ... = ... | -| C1::C1 | false | 481 | 481 | ExprStmt | -| C1::C1 | false | 484 | 484 | return ... | -| C1::C1 | false | 487 | 487 | { ... } | -| C1::C1 | true | 470 | 472 | | -| C1::C1 | true | 472 | 478 | | -| C1::C1 | true | 475 | 470 | | -| C1::C1 | true | 478 | 484 | | -| C1::C1 | true | 481 | 475 | | -| C1::C1 | true | 484 | 254 | | -| C1::C1 | true | 487 | 481 | | -| C1::operator= | false | 409 | 409 | operator= | -| C1::operator= | false | 416 | 416 | operator= | -| C1::operator== | false | 241 | 241 | operator== | -| C1::operator== | false | 439 | 439 | this | -| C1::operator== | false | 442 | 442 | val | -| C1::operator== | false | 445 | 445 | other | -| C1::operator== | false | 448 | 448 | (reference dereference) | -| C1::operator== | false | 450 | 450 | val | -| C1::operator== | false | 453 | 453 | ... == ... | -| C1::operator== | false | 456 | 456 | return ... | -| C1::operator== | false | 459 | 459 | { ... } | -| C1::operator== | true | 439 | 442 | | -| C1::operator== | true | 442 | 445 | | -| C1::operator== | true | 445 | 450 | | -| C1::operator== | true | 450 | 453 | | -| C1::operator== | true | 453 | 241 | | -| C1::operator== | true | 456 | 439 | | -| C1::operator== | true | 459 | 456 | | -| C2::C2 | false | 163 | 163 | C2 | -| C2::C2 | false | 329 | 329 | C2 | -| C2::C2 | false | 389 | 389 | this | -| C2::C2 | false | 391 | 391 | val | -| C2::C2 | false | 394 | 394 | x | -| C2::C2 | false | 397 | 397 | ... = ... | -| C2::C2 | false | 400 | 400 | ExprStmt | -| C2::C2 | false | 403 | 403 | return ... | -| C2::C2 | false | 406 | 406 | { ... } | -| C2::C2 | true | 389 | 391 | | -| C2::C2 | true | 391 | 397 | | -| C2::C2 | true | 394 | 389 | | -| C2::C2 | true | 397 | 403 | | -| C2::C2 | true | 400 | 394 | | -| C2::C2 | true | 403 | 163 | | -| C2::C2 | true | 406 | 400 | | -| C2::operator= | false | 323 | 323 | operator= | -| C2::operator== | false | 150 | 150 | operator== | -| C2::operator== | false | 344 | 344 | this | -| C2::operator== | false | 347 | 347 | val | -| C2::operator== | false | 350 | 350 | other | -| C2::operator== | false | 353 | 353 | (reference dereference) | -| C2::operator== | false | 355 | 355 | val | -| C2::operator== | false | 358 | 358 | ... == ... | -| C2::operator== | false | 361 | 361 | return ... | -| C2::operator== | false | 364 | 364 | { ... } | -| C2::operator== | true | 344 | 347 | | -| C2::operator== | true | 347 | 350 | | -| C2::operator== | true | 350 | 355 | | -| C2::operator== | true | 355 | 358 | | -| C2::operator== | true | 358 | 150 | | -| C2::operator== | true | 361 | 344 | | -| C2::operator== | true | 364 | 361 | | -| C2::~C2 | false | 366 | 366 | ~C2 | -| C2::~C2 | false | 372 | 372 | ; | -| C2::~C2 | false | 375 | 375 | return ... | -| C2::~C2 | false | 378 | 378 | { ... } | -| C2::~C2 | true | 372 | 375 | | -| C2::~C2 | true | 375 | 366 | | -| C2::~C2 | true | 378 | 372 | | -| __va_list_tag::operator= | false | 64 | 64 | operator= | -| __va_list_tag::operator= | false | 70 | 70 | operator= | -| f1 | false | 232 | 232 | f1 | -| f1 | false | 250 | 250 | call to operator== | -| f1 | false | 252 | 252 | call to C1 | -| f1 | false | 259 | 259 | 1 | -| f1 | false | 261 | 261 | (const C1)... | -| f1 | false | 263 | 263 | call to C1 | -| f1 | false | 269 | 269 | 2 | -| f1 | false | 271 | 271 | (const C1)... | +| C1::C1 | false | 237 | 237 | C1 | +| C1::C1 | false | 359 | 359 | C1 | +| C1::C1 | false | 363 | 363 | C1 | +| C1::C1 | false | 398 | 398 | ExprStmt | +| C1::C1 | false | 400 | 400 | this | +| C1::C1 | false | 401 | 401 | val | +| C1::C1 | false | 403 | 403 | x | +| C1::C1 | false | 405 | 405 | ... = ... | +| C1::C1 | false | 407 | 407 | return ... | +| C1::C1 | false | 409 | 409 | { ... } | +| C1::C1 | true | 398 | 403 | | +| C1::C1 | true | 400 | 401 | | +| C1::C1 | true | 401 | 405 | | +| C1::C1 | true | 403 | 400 | | +| C1::C1 | true | 405 | 407 | | +| C1::C1 | true | 407 | 237 | | +| C1::C1 | true | 409 | 398 | | +| C1::operator= | false | 348 | 348 | operator= | +| C1::operator= | false | 355 | 355 | operator= | +| C1::operator== | false | 226 | 226 | operator== | +| C1::operator== | false | 376 | 376 | return ... | +| C1::operator== | false | 378 | 378 | this | +| C1::operator== | false | 379 | 379 | val | +| C1::operator== | false | 382 | 382 | other | +| C1::operator== | false | 384 | 384 | (reference dereference) | +| C1::operator== | false | 385 | 385 | val | +| C1::operator== | false | 387 | 387 | ... == ... | +| C1::operator== | false | 389 | 389 | { ... } | +| C1::operator== | true | 376 | 378 | | +| C1::operator== | true | 378 | 379 | | +| C1::operator== | true | 379 | 382 | | +| C1::operator== | true | 382 | 385 | | +| C1::operator== | true | 385 | 387 | | +| C1::operator== | true | 387 | 226 | | +| C1::operator== | true | 389 | 376 | | +| C2::C2 | false | 170 | 170 | C2 | +| C2::C2 | false | 288 | 288 | C2 | +| C2::C2 | false | 334 | 334 | ExprStmt | +| C2::C2 | false | 336 | 336 | this | +| C2::C2 | false | 337 | 337 | val | +| C2::C2 | false | 339 | 339 | x | +| C2::C2 | false | 341 | 341 | ... = ... | +| C2::C2 | false | 343 | 343 | return ... | +| C2::C2 | false | 345 | 345 | { ... } | +| C2::C2 | true | 334 | 339 | | +| C2::C2 | true | 336 | 337 | | +| C2::C2 | true | 337 | 341 | | +| C2::C2 | true | 339 | 336 | | +| C2::C2 | true | 341 | 343 | | +| C2::C2 | true | 343 | 170 | | +| C2::C2 | true | 345 | 334 | | +| C2::operator= | false | 282 | 282 | operator= | +| C2::operator== | false | 159 | 159 | operator== | +| C2::operator== | false | 301 | 301 | return ... | +| C2::operator== | false | 303 | 303 | this | +| C2::operator== | false | 304 | 304 | val | +| C2::operator== | false | 307 | 307 | other | +| C2::operator== | false | 309 | 309 | (reference dereference) | +| C2::operator== | false | 310 | 310 | val | +| C2::operator== | false | 312 | 312 | ... == ... | +| C2::operator== | false | 314 | 314 | { ... } | +| C2::operator== | true | 301 | 303 | | +| C2::operator== | true | 303 | 304 | | +| C2::operator== | true | 304 | 307 | | +| C2::operator== | true | 307 | 310 | | +| C2::operator== | true | 310 | 312 | | +| C2::operator== | true | 312 | 159 | | +| C2::operator== | true | 314 | 301 | | +| C2::~C2 | false | 316 | 316 | ~C2 | +| C2::~C2 | false | 321 | 321 | ; | +| C2::~C2 | false | 323 | 323 | return ... | +| C2::~C2 | false | 325 | 325 | { ... } | +| C2::~C2 | true | 321 | 323 | | +| C2::~C2 | true | 323 | 316 | | +| C2::~C2 | true | 325 | 321 | | +| __va_list_tag::operator= | false | 57 | 57 | operator= | +| __va_list_tag::operator= | false | 63 | 63 | operator= | +| f1 | false | 215 | 215 | f1 | +| f1 | false | 220 | 220 | if (...) ... | +| f1 | false | 234 | 234 | call to operator== | +| f1 | false | 235 | 235 | call to C1 | +| f1 | false | 240 | 240 | 1 | +| f1 | false | 241 | 241 | temporary object | +| f1 | false | 242 | 242 | (const C1)... | +| f1 | false | 243 | 243 | call to C1 | +| f1 | false | 247 | 247 | 2 | +| f1 | false | 248 | 248 | temporary object | +| f1 | false | 249 | 249 | (const C1)... | +| f1 | false | 250 | 250 | (reference to) | +| f1 | false | 251 | 251 | ; | +| f1 | false | 253 | 253 | { ... } | +| f1 | false | 255 | 255 | if (...) ... | +| f1 | false | 258 | 258 | call to operator== | +| f1 | false | 259 | 259 | call to C1 | +| f1 | false | 263 | 263 | 3 | +| f1 | false | 264 | 264 | temporary object | +| f1 | false | 265 | 265 | (const C1)... | +| f1 | false | 266 | 266 | call to C1 | +| f1 | false | 270 | 270 | 3 | +| f1 | false | 271 | 271 | temporary object | +| f1 | false | 272 | 272 | (const C1)... | | f1 | false | 273 | 273 | (reference to) | -| f1 | false | 275 | 275 | ; | -| f1 | false | 278 | 278 | { ... } | -| f1 | false | 281 | 281 | if (...) ... | -| f1 | false | 285 | 285 | call to operator== | -| f1 | false | 287 | 287 | call to C1 | -| f1 | false | 293 | 293 | 3 | -| f1 | false | 295 | 295 | (const C1)... | -| f1 | false | 297 | 297 | call to C1 | -| f1 | false | 303 | 303 | 3 | -| f1 | false | 305 | 305 | (const C1)... | -| f1 | false | 307 | 307 | (reference to) | -| f1 | false | 309 | 309 | ; | -| f1 | false | 312 | 312 | { ... } | -| f1 | false | 315 | 315 | if (...) ... | -| f1 | false | 318 | 318 | return ... | -| f1 | false | 321 | 321 | { ... } | -| f1 | true | 250 | 278 | T | -| f1 | true | 250 | 315 | F | -| f1 | true | 252 | 250 | | -| f1 | true | 259 | 252 | | +| f1 | false | 274 | 274 | ; | +| f1 | false | 276 | 276 | { ... } | +| f1 | false | 278 | 278 | return ... | +| f1 | false | 280 | 280 | { ... } | +| f1 | true | 220 | 247 | | +| f1 | true | 234 | 253 | T | +| f1 | true | 234 | 255 | F | +| f1 | true | 235 | 234 | | +| f1 | true | 240 | 235 | | +| f1 | true | 243 | 240 | | +| f1 | true | 247 | 243 | | +| f1 | true | 251 | 255 | | +| f1 | true | 253 | 251 | | +| f1 | true | 255 | 270 | | +| f1 | true | 258 | 276 | T | +| f1 | true | 258 | 278 | F | +| f1 | true | 259 | 258 | | | f1 | true | 263 | 259 | | -| f1 | true | 269 | 263 | | -| f1 | true | 275 | 315 | | -| f1 | true | 278 | 275 | | -| f1 | true | 281 | 269 | | -| f1 | true | 285 | 312 | T | -| f1 | true | 285 | 318 | F | -| f1 | true | 287 | 285 | | -| f1 | true | 293 | 287 | | -| f1 | true | 297 | 293 | | -| f1 | true | 303 | 297 | | -| f1 | true | 309 | 318 | | -| f1 | true | 312 | 309 | | -| f1 | true | 315 | 303 | | -| f1 | true | 318 | 232 | | -| f1 | true | 321 | 281 | | -| f2 | false | 141 | 141 | f2 | -| f2 | false | 159 | 159 | call to operator== | -| f2 | false | 161 | 161 | call to C2 | -| f2 | false | 168 | 168 | 1 | -| f2 | false | 170 | 170 | (const C2)... | -| f2 | false | 172 | 172 | call to C2 | -| f2 | false | 178 | 178 | 2 | -| f2 | false | 180 | 180 | (const C2)... | -| f2 | false | 182 | 182 | (reference to) | +| f1 | true | 266 | 263 | | +| f1 | true | 270 | 266 | | +| f1 | true | 274 | 278 | | +| f1 | true | 276 | 274 | | +| f1 | true | 278 | 215 | | +| f1 | true | 280 | 220 | | +| f2 | false | 148 | 148 | f2 | +| f2 | false | 153 | 153 | if (...) ... | +| f2 | false | 167 | 167 | call to operator== | +| f2 | false | 168 | 168 | call to C2 | +| f2 | false | 173 | 173 | 1 | +| f2 | false | 174 | 174 | temporary object | +| f2 | false | 175 | 175 | (const C2)... | +| f2 | false | 176 | 176 | call to C2 | +| f2 | false | 180 | 180 | 2 | +| f2 | false | 181 | 181 | temporary object | +| f2 | false | 182 | 182 | (const C2)... | +| f2 | false | 183 | 183 | (reference to) | | f2 | false | 184 | 184 | ; | -| f2 | false | 187 | 187 | { ... } | -| f2 | false | 190 | 190 | if (...) ... | -| f2 | false | 194 | 194 | call to operator== | -| f2 | false | 196 | 196 | call to C2 | -| f2 | false | 202 | 202 | 3 | -| f2 | false | 204 | 204 | (const C2)... | -| f2 | false | 206 | 206 | call to C2 | -| f2 | false | 212 | 212 | 3 | -| f2 | false | 214 | 214 | (const C2)... | -| f2 | false | 216 | 216 | (reference to) | -| f2 | false | 218 | 218 | ; | -| f2 | false | 221 | 221 | { ... } | -| f2 | false | 224 | 224 | if (...) ... | -| f2 | false | 227 | 227 | return ... | -| f2 | false | 230 | 230 | { ... } | -| f2 | true | 159 | 187 | T | -| f2 | true | 159 | 224 | F | -| f2 | true | 161 | 159 | | -| f2 | true | 168 | 161 | | -| f2 | true | 172 | 168 | | -| f2 | true | 178 | 172 | | -| f2 | true | 184 | 224 | | -| f2 | true | 187 | 184 | | -| f2 | true | 190 | 178 | | -| f2 | true | 194 | 221 | T | -| f2 | true | 194 | 227 | F | -| f2 | true | 196 | 194 | | -| f2 | true | 202 | 196 | | -| f2 | true | 206 | 202 | | -| f2 | true | 212 | 206 | | -| f2 | true | 218 | 227 | | -| f2 | true | 221 | 218 | | -| f2 | true | 224 | 212 | | -| f2 | true | 227 | 141 | | -| f2 | true | 230 | 190 | | +| f2 | false | 186 | 186 | { ... } | +| f2 | false | 188 | 188 | if (...) ... | +| f2 | false | 191 | 191 | call to operator== | +| f2 | false | 192 | 192 | call to C2 | +| f2 | false | 196 | 196 | 3 | +| f2 | false | 197 | 197 | temporary object | +| f2 | false | 198 | 198 | (const C2)... | +| f2 | false | 199 | 199 | call to C2 | +| f2 | false | 203 | 203 | 3 | +| f2 | false | 204 | 204 | temporary object | +| f2 | false | 205 | 205 | (const C2)... | +| f2 | false | 206 | 206 | (reference to) | +| f2 | false | 207 | 207 | ; | +| f2 | false | 209 | 209 | { ... } | +| f2 | false | 211 | 211 | return ... | +| f2 | false | 213 | 213 | { ... } | +| f2 | true | 153 | 180 | | +| f2 | true | 167 | 186 | T | +| f2 | true | 167 | 188 | F | +| f2 | true | 168 | 167 | | +| f2 | true | 173 | 168 | | +| f2 | true | 176 | 173 | | +| f2 | true | 180 | 176 | | +| f2 | true | 184 | 188 | | +| f2 | true | 186 | 184 | | +| f2 | true | 188 | 203 | | +| f2 | true | 191 | 209 | T | +| f2 | true | 191 | 211 | F | +| f2 | true | 192 | 191 | | +| f2 | true | 196 | 192 | | +| f2 | true | 199 | 196 | | +| f2 | true | 203 | 199 | | +| f2 | true | 207 | 211 | | +| f2 | true | 209 | 207 | | +| f2 | true | 211 | 148 | | +| f2 | true | 213 | 153 | | From e4bfb75f908399987641fdd2c355f47a8505eda0 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Thu, 8 Oct 2020 12:24:59 -0400 Subject: [PATCH 05/53] C++: Fix pointer flow through temporary objects --- cpp/ql/src/semmle/code/cpp/dataflow/EscapesTree.qll | 2 ++ cpp/ql/src/semmle/code/cpp/dataflow/internal/AddressFlow.qll | 2 ++ 2 files changed, 4 insertions(+) diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/EscapesTree.qll b/cpp/ql/src/semmle/code/cpp/dataflow/EscapesTree.qll index eaa1581078bd..0eb1f700194c 100644 --- a/cpp/ql/src/semmle/code/cpp/dataflow/EscapesTree.qll +++ b/cpp/ql/src/semmle/code/cpp/dataflow/EscapesTree.qll @@ -83,6 +83,8 @@ private predicate pointerToPointerStep(Expr pointerIn, Expr pointerOut) { or pointerIn.getConversion() = pointerOut.(ParenthesisExpr) or + pointerIn.getConversion() = pointerOut.(TemporaryObjectExpr) + or pointerIn = pointerOut.(ConditionalExpr).getThen().getFullyConverted() or pointerIn = pointerOut.(ConditionalExpr).getElse().getFullyConverted() diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/AddressFlow.qll b/cpp/ql/src/semmle/code/cpp/dataflow/internal/AddressFlow.qll index f9677a0654b7..0ef286e8ab5a 100644 --- a/cpp/ql/src/semmle/code/cpp/dataflow/internal/AddressFlow.qll +++ b/cpp/ql/src/semmle/code/cpp/dataflow/internal/AddressFlow.qll @@ -81,6 +81,8 @@ private predicate pointerToPointerStep(Expr pointerIn, Expr pointerOut) { or pointerIn.getConversion() = pointerOut.(ParenthesisExpr) or + pointerIn.getConversion() = pointerOut.(TemporaryObjectExpr) + or pointerIn = pointerOut.(ConditionalExpr).getThen().getFullyConverted() or pointerIn = pointerOut.(ConditionalExpr).getElse().getFullyConverted() From dfe69d8ada355e5a7a6416eb0dabe1751b3511ad Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Tue, 13 Oct 2020 12:06:34 -0400 Subject: [PATCH 06/53] Update taint test to propagate through string constructor --- .../test/library-tests/dataflow/DefaultTaintTracking/stl.cpp | 4 ++-- .../dataflow/DefaultTaintTracking/tainted.expected | 3 +++ .../dataflow/DefaultTaintTracking/test_diff.expected | 2 ++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/stl.cpp b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/stl.cpp index 3454e6ac9472..058dafd4ac0a 100644 --- a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/stl.cpp +++ b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/stl.cpp @@ -16,9 +16,9 @@ namespace std template, class Allocator = allocator > class basic_string { - public: + public: const char* p; explicit basic_string(const Allocator& a = Allocator()); - basic_string(const charT* s, const Allocator& a = Allocator()); + basic_string(const charT* s, const Allocator& a = Allocator()) : p(s) {} const charT* c_str() const; }; diff --git a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/tainted.expected b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/tainted.expected index 83f50d7fe157..294718ea7511 100644 --- a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/tainted.expected +++ b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/tainted.expected @@ -90,6 +90,7 @@ | defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:8:88:32 | (reference dereference) | | defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:18:88:23 | call to getenv | | defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:18:88:30 | (reference to) | +| defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:18:88:30 | temporary object | | defaulttainttracking.cpp:88:18:88:23 | call to getenv | shared.h:5:23:5:31 | sinkparam | | defaulttainttracking.cpp:97:27:97:32 | call to getenv | defaulttainttracking.cpp:91:42:91:44 | arg | | defaulttainttracking.cpp:97:27:97:32 | call to getenv | defaulttainttracking.cpp:92:12:92:14 | arg | @@ -174,6 +175,7 @@ | globals.cpp:23:15:23:20 | call to getenv | globals.cpp:23:15:23:20 | call to getenv | | stl.cpp:62:25:62:30 | call to getenv | shared.h:5:23:5:31 | sinkparam | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:21:29:21:29 | s | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:21:70:21:70 | s | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:43:78:43:104 | p#0 | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:43:114:43:118 | p#1 | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:62:25:62:30 | call to getenv | @@ -221,6 +223,7 @@ | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:19 | call to user_input | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | (const char *)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | call to basic_string | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | temporary object | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:130:7:130:11 | (const basic_string, allocator>)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:130:7:130:11 | path2 | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:132:15:132:24 | call to user_input | diff --git a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/test_diff.expected b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/test_diff.expected index 414ee9623e59..9127984784a4 100644 --- a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/test_diff.expected +++ b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/test_diff.expected @@ -12,6 +12,7 @@ | defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:8:88:32 | (const char *)... | IR only | | defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:8:88:32 | (reference dereference) | IR only | | defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:18:88:30 | (reference to) | IR only | +| defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:18:88:30 | temporary object | IR only | | defaulttainttracking.cpp:88:18:88:23 | call to getenv | shared.h:5:23:5:31 | sinkparam | IR only | | defaulttainttracking.cpp:97:27:97:32 | call to getenv | defaulttainttracking.cpp:91:31:91:33 | ret | AST only | | defaulttainttracking.cpp:97:27:97:32 | call to getenv | defaulttainttracking.cpp:92:5:92:8 | * ... | AST only | @@ -67,6 +68,7 @@ | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:125:16:125:28 | call to basic_string | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:128:9:128:13 | path2 | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | call to basic_string | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | temporary object | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:130:7:130:11 | (const basic_string, allocator>)... | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:130:7:130:11 | path2 | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:132:15:132:27 | call to basic_string | IR only | From 93f5ae47630f0cce1985b74feb5e0f939360e632 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Tue, 13 Oct 2020 12:57:52 -0400 Subject: [PATCH 07/53] Clean up test formatting and accept new lines in results --- .../dataflow/DefaultTaintTracking/stl.cpp | 10 +- .../DefaultTaintTracking/tainted.expected | 134 +++++++++--------- .../DefaultTaintTracking/test_diff.expected | 72 +++++----- 3 files changed, 111 insertions(+), 105 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/stl.cpp b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/stl.cpp index 058dafd4ac0a..c971a1bd87b0 100644 --- a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/stl.cpp +++ b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/stl.cpp @@ -16,9 +16,15 @@ namespace std template, class Allocator = allocator > class basic_string { - public: const char* p; + private: + const char* p; + + public: explicit basic_string(const Allocator& a = Allocator()); - basic_string(const charT* s, const Allocator& a = Allocator()) : p(s) {} + basic_string(const charT* s, const Allocator& a = Allocator()) : + p(s) + { + } const charT* c_str() const; }; diff --git a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/tainted.expected b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/tainted.expected index 294718ea7511..826991ff1376 100644 --- a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/tainted.expected +++ b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/tainted.expected @@ -173,73 +173,73 @@ | globals.cpp:13:15:13:20 | call to getenv | globals.cpp:13:15:13:20 | call to getenv | | globals.cpp:23:15:23:20 | call to getenv | globals.cpp:16:15:16:21 | global2 | | globals.cpp:23:15:23:20 | call to getenv | globals.cpp:23:15:23:20 | call to getenv | -| stl.cpp:62:25:62:30 | call to getenv | shared.h:5:23:5:31 | sinkparam | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:21:29:21:29 | s | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:21:70:21:70 | s | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:43:78:43:104 | p#0 | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:43:114:43:118 | p#1 | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:62:25:62:30 | call to getenv | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:64:36:64:36 | s | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:68:8:68:8 | a | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:68:12:68:17 | call to source | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:70:16:70:21 | call to source | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:70:16:70:23 | (const char *)... | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:70:16:70:24 | call to basic_string | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:72:7:72:7 | (const char *)... | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:72:7:72:7 | a | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:82:16:82:21 | call to source | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:82:16:82:23 | (const char *)... | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:82:16:82:24 | call to basic_string | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:85:6:85:6 | call to operator<< | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:85:6:85:17 | (reference dereference) | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:85:9:85:14 | call to source | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:85:9:85:16 | (const char *)... | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:86:15:86:15 | call to operator<< | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:86:15:86:26 | (reference dereference) | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:86:18:86:23 | call to source | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:86:18:86:25 | (const char *)... | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:6:87:6 | call to operator<< | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:6:87:19 | (reference dereference) | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:6:87:19 | (reference to) | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:9:87:14 | call to source | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:9:87:16 | (const char *)... | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:18:87:18 | call to operator<< | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:18:87:26 | (reference dereference) | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | (const stringstream)... | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | (reference to) | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | ss2 | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | (const stringstream)... | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | (reference to) | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | ss4 | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:96:7:96:9 | (const basic_stringstream, allocator>)... | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:96:7:96:9 | ss2 | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:98:7:98:9 | (const basic_stringstream, allocator>)... | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:98:7:98:9 | ss4 | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:118:10:118:15 | call to source | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:125:16:125:28 | call to basic_string | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:125:17:125:26 | call to user_input | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:125:17:125:28 | (const char *)... | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:128:9:128:13 | path2 | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:19 | call to user_input | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | (const char *)... | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | call to basic_string | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | temporary object | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:130:7:130:11 | (const basic_string, allocator>)... | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:130:7:130:11 | path2 | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:132:15:132:24 | call to user_input | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:132:15:132:26 | (const char *)... | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:132:15:132:27 | call to basic_string | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:138:14:138:15 | cs | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:138:19:138:24 | call to source | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:138:19:138:26 | (const char *)... | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:141:17:141:18 | cs | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:141:17:141:19 | call to basic_string | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:143:7:143:8 | cs | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:149:14:149:15 | cs | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:149:19:149:24 | call to source | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:149:19:149:26 | (const char *)... | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:152:17:152:18 | cs | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:152:17:152:19 | call to basic_string | +| stl.cpp:68:25:68:30 | call to getenv | shared.h:5:23:5:31 | sinkparam | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:24:29:24:29 | s | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:25:6:25:6 | s | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:49:78:49:104 | p#0 | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:49:114:49:118 | p#1 | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:68:25:68:30 | call to getenv | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:70:36:70:36 | s | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:74:8:74:8 | a | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:74:12:74:17 | call to source | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:76:16:76:21 | call to source | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:76:16:76:23 | (const char *)... | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:76:16:76:24 | call to basic_string | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:78:7:78:7 | (const char *)... | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:78:7:78:7 | a | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:88:16:88:21 | call to source | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:88:16:88:23 | (const char *)... | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:88:16:88:24 | call to basic_string | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:91:6:91:6 | call to operator<< | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:91:6:91:17 | (reference dereference) | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:91:9:91:14 | call to source | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:91:9:91:16 | (const char *)... | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:92:15:92:15 | call to operator<< | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:92:15:92:26 | (reference dereference) | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:92:18:92:23 | call to source | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:92:18:92:25 | (const char *)... | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:6:93:6 | call to operator<< | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:6:93:19 | (reference dereference) | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:6:93:19 | (reference to) | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:9:93:14 | call to source | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:9:93:16 | (const char *)... | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:18:93:18 | call to operator<< | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:18:93:26 | (reference dereference) | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:97:7:97:9 | (const stringstream)... | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:97:7:97:9 | (reference to) | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:97:7:97:9 | ss2 | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:99:7:99:9 | (const stringstream)... | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:99:7:99:9 | (reference to) | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:99:7:99:9 | ss4 | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:102:7:102:9 | (const basic_stringstream, allocator>)... | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:102:7:102:9 | ss2 | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:104:7:104:9 | (const basic_stringstream, allocator>)... | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:104:7:104:9 | ss4 | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:124:10:124:15 | call to source | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:131:16:131:28 | call to basic_string | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:131:17:131:26 | call to user_input | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:131:17:131:28 | (const char *)... | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:134:9:134:13 | path2 | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:135:10:135:19 | call to user_input | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:135:10:135:21 | (const char *)... | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:135:10:135:21 | call to basic_string | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:135:10:135:21 | temporary object | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:136:7:136:11 | (const basic_string, allocator>)... | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:136:7:136:11 | path2 | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:138:15:138:24 | call to user_input | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:138:15:138:26 | (const char *)... | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:138:15:138:27 | call to basic_string | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:144:14:144:15 | cs | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:144:19:144:24 | call to source | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:144:19:144:26 | (const char *)... | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:147:17:147:18 | cs | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:147:17:147:19 | call to basic_string | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:149:7:149:8 | cs | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:155:14:155:15 | cs | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:155:19:155:24 | call to source | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:155:19:155:26 | (const char *)... | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:158:17:158:18 | cs | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:158:17:158:19 | call to basic_string | | test_diff.cpp:92:10:92:13 | argv | shared.h:5:23:5:31 | sinkparam | | test_diff.cpp:92:10:92:13 | argv | test_diff.cpp:92:10:92:13 | argv | | test_diff.cpp:92:10:92:13 | argv | test_diff.cpp:92:10:92:16 | (const char *)... | diff --git a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/test_diff.expected b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/test_diff.expected index 9127984784a4..83a1333f1264 100644 --- a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/test_diff.expected +++ b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/test_diff.expected @@ -39,42 +39,42 @@ | defaulttainttracking.cpp:208:27:208:32 | call to getenv | defaulttainttracking.cpp:208:23:208:23 | x | AST only | | globals.cpp:13:15:13:20 | call to getenv | globals.cpp:13:5:13:11 | global1 | AST only | | globals.cpp:23:15:23:20 | call to getenv | globals.cpp:23:5:23:11 | global2 | AST only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:43:78:43:104 | p#0 | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:62:7:62:12 | source | AST only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:64:36:64:36 | s | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:70:16:70:24 | call to basic_string | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:82:16:82:24 | call to basic_string | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:85:6:85:6 | call to operator<< | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:85:6:85:17 | (reference dereference) | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:86:15:86:15 | call to operator<< | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:86:15:86:26 | (reference dereference) | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:6:87:6 | call to operator<< | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:6:87:19 | (reference dereference) | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:6:87:19 | (reference to) | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:9:87:16 | (const char *)... | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:18:87:18 | call to operator<< | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:18:87:26 | (reference dereference) | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | (const stringstream)... | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | (reference to) | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | ss2 | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | (const stringstream)... | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | (reference to) | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | ss4 | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:96:7:96:9 | (const basic_stringstream, allocator>)... | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:96:7:96:9 | ss2 | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:98:7:98:9 | (const basic_stringstream, allocator>)... | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:98:7:98:9 | ss4 | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:117:7:117:16 | user_input | AST only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:125:16:125:28 | call to basic_string | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:128:9:128:13 | path2 | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | call to basic_string | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | temporary object | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:130:7:130:11 | (const basic_string, allocator>)... | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:130:7:130:11 | path2 | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:132:15:132:27 | call to basic_string | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:141:17:141:19 | call to basic_string | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:152:17:152:19 | call to basic_string | IR only | -| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:157:7:157:8 | cs | AST only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:49:78:49:104 | p#0 | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:68:7:68:12 | source | AST only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:70:36:70:36 | s | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:76:16:76:24 | call to basic_string | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:88:16:88:24 | call to basic_string | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:91:6:91:6 | call to operator<< | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:91:6:91:17 | (reference dereference) | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:92:15:92:15 | call to operator<< | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:92:15:92:26 | (reference dereference) | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:6:93:6 | call to operator<< | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:6:93:19 | (reference dereference) | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:6:93:19 | (reference to) | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:9:93:16 | (const char *)... | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:18:93:18 | call to operator<< | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:18:93:26 | (reference dereference) | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:97:7:97:9 | (const stringstream)... | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:97:7:97:9 | (reference to) | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:97:7:97:9 | ss2 | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:99:7:99:9 | (const stringstream)... | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:99:7:99:9 | (reference to) | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:99:7:99:9 | ss4 | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:102:7:102:9 | (const basic_stringstream, allocator>)... | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:102:7:102:9 | ss2 | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:104:7:104:9 | (const basic_stringstream, allocator>)... | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:104:7:104:9 | ss4 | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:123:7:123:16 | user_input | AST only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:131:16:131:28 | call to basic_string | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:134:9:134:13 | path2 | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:135:10:135:21 | call to basic_string | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:135:10:135:21 | temporary object | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:136:7:136:11 | (const basic_string, allocator>)... | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:136:7:136:11 | path2 | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:138:15:138:27 | call to basic_string | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:147:17:147:19 | call to basic_string | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:158:17:158:19 | call to basic_string | IR only | +| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:163:7:163:8 | cs | AST only | | test_diff.cpp:104:12:104:15 | argv | test_diff.cpp:104:11:104:20 | (...) | IR only | | test_diff.cpp:108:10:108:13 | argv | test_diff.cpp:36:24:36:24 | p | AST only | | test_diff.cpp:111:10:111:13 | argv | shared.h:5:23:5:31 | sinkparam | AST only | From 794a6729bccb0bd43244cc0690563d293224b069 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Wed, 14 Oct 2020 18:02:45 -0400 Subject: [PATCH 08/53] C++: Add ability to dump local dataflow info in IR dumps This change adds a new module, `PrintIRLocalFlow.qll`, which can be imported into any query that uses both `PrintIR.qll` and the IR dataflow library. The IR dump printed by `PrintIR.qll` will be annotated with information about how each operand and instruction participates in dataflow. For each operand and instruction, the following propeties are displayed: - `flow`: Which local operands/instructions have flow to this node, and which local operands/instruction this node has flow to. - `source`: `true` if this node is a source - `sink`: `true` if this node is a sink - `barrier`: Lists which kinds of barrier this node is. Can be zero or more of `full`, `in`, `out`, and `guard`. If the node is a guard barrier, the IR of the guarding instruction is also printed. We already had a way to print additional properties for instructions and blocks, but not for operands. I added support for operand properties to `IRPropertyProvider`. These are now printed in a curly-brace-enclosed list immediately after the corresponding operand. When printing flow, instructions are identified by their result ID (e.g., `m128`). Operands are identified by both the result ID of their instruction and their kind (e.g., `r145.left`). For flow from an operand to its use instruction, it just prints `result` at the operand, and prints only the operand kind on the instruction. Example output: ``` # 344| m344_34(vector>) = Chi : total:m344_20{flow:def->@, @->result}, partial:m344_33{flow:def->@, @->result} # 344| flow = total->@, partial->@, +m344_33->@, @->+r347_3, @->v347_7.side_effect, @->m347_9.total, @->m344_20.1 ``` The `+` annotations indicate when the flow came from `isAdditionalFlowStep()`, rather than built-in local flow. --- .../ir/dataflow/internal/PrintIRLocalFlow.qll | 152 ++++++++++++++++++ .../cpp/ir/implementation/aliased_ssa/IR.qll | 5 + .../ir/implementation/aliased_ssa/Operand.qll | 11 ++ .../ir/implementation/aliased_ssa/PrintIR.qll | 42 ++++- .../ir/implementation/internal/OperandTag.qll | 58 ++++++- .../code/cpp/ir/implementation/raw/IR.qll | 5 + .../cpp/ir/implementation/raw/Operand.qll | 11 ++ .../cpp/ir/implementation/raw/PrintIR.qll | 42 ++++- .../ir/implementation/unaliased_ssa/IR.qll | 5 + .../implementation/unaliased_ssa/Operand.qll | 11 ++ .../implementation/unaliased_ssa/PrintIR.qll | 42 ++++- .../ir/implementation/internal/OperandTag.qll | 58 ++++++- .../experimental/ir/implementation/raw/IR.qll | 5 + .../ir/implementation/raw/Operand.qll | 11 ++ .../ir/implementation/raw/PrintIR.qll | 42 ++++- .../ir/implementation/unaliased_ssa/IR.qll | 5 + .../implementation/unaliased_ssa/Operand.qll | 11 ++ .../implementation/unaliased_ssa/PrintIR.qll | 42 ++++- 18 files changed, 537 insertions(+), 21 deletions(-) create mode 100644 cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/PrintIRLocalFlow.qll diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/PrintIRLocalFlow.qll b/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/PrintIRLocalFlow.qll new file mode 100644 index 000000000000..edbb11db2f37 --- /dev/null +++ b/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/PrintIRLocalFlow.qll @@ -0,0 +1,152 @@ +private import cpp +// The `ValueNumbering` library has to be imported right after `cpp` to ensure +// that the cached IR gets the same checksum here as it does in queries that use +// `ValueNumbering` without `DataFlow`. +private import semmle.code.cpp.ir.ValueNumbering +private import semmle.code.cpp.ir.IR +private import semmle.code.cpp.ir.dataflow.DataFlow +private import semmle.code.cpp.ir.dataflow.internal.DataFlowUtil + +/** + * Gets a short ID for an IR dataflow node. + * - For `Instruction`s, this is just the result ID of the instruction (e.g. `m128`). + * - For `Operand`s, this is the label of the operand, prefixed with the result ID of the + * instruction and a dot (e.g. `m128.left`). + * - For `Variable`s, this is the qualified name of the variable. + */ +private string nodeId(DataFlow::Node node, int order1, int order2) { + exists(Instruction instruction | instruction = node.asInstruction() | + result = instruction.getResultId() and + order1 = instruction.getBlock().getDisplayIndex() and + order2 = instruction.getDisplayIndexInBlock() + ) + or + exists(Operand operand, Instruction instruction | + operand = node.asOperand() and + instruction = operand.getUse() + | + result = instruction.getResultId() + "." + operand.getDumpId() and + order1 = instruction.getBlock().getDisplayIndex() and + order2 = instruction.getDisplayIndexInBlock() + ) + or + result = "var(" + node.asVariable().getQualifiedName() + ")" and + order1 = 1000000 and + order2 = 0 +} + +/** + * Gets the local dataflow from other nodes in the same function to this node. + */ +private string getFromFlow(DataFlow::Node useNode, int order1, int order2) { + exists(DataFlow::Node defNode, string prefix | + ( + simpleLocalFlowStep(defNode, useNode) and prefix = "" + or + any(DataFlow::Configuration cfg).isAdditionalFlowStep(defNode, useNode) and + defNode.getEnclosingCallable() = useNode.getEnclosingCallable() and + prefix = "+" + ) and + if defNode.asInstruction() = useNode.asOperand().getAnyDef() + then + // Shorthand for flow from the def of this operand. + result = prefix + "def" and + order1 = -1 and + order2 = 0 + else + if defNode.asOperand().getUse() = useNode.asInstruction() + then + // Shorthand for flow from an operand of this instruction + result = prefix + defNode.asOperand().getDumpId() and + order1 = -1 and + order2 = defNode.asOperand().getDumpSortOrder() + else result = prefix + nodeId(defNode, order1, order2) + ) +} + +/** + * Gets the local dataflow from this node to other nodes in the same function. + */ +private string getToFlow(DataFlow::Node defNode, int order1, int order2) { + exists(DataFlow::Node useNode, string prefix | + ( + simpleLocalFlowStep(defNode, useNode) and prefix = "" + or + any(DataFlow::Configuration cfg).isAdditionalFlowStep(defNode, useNode) and + defNode.getEnclosingCallable() = useNode.getEnclosingCallable() and + prefix = "+" + ) and + if useNode.asInstruction() = defNode.asOperand().getUse() + then + // Shorthand for flow to this operand's instruction. + result = prefix + "result" and + order1 = -1 and + order2 = 0 + else result = prefix + nodeId(useNode, order1, order2) + ) +} + +/** + * Gets the properties of the dataflow node `node`. + */ +private string getNodeProperty(DataFlow::Node node, string key) { + // List dataflow into and out of this node. Flow into this node is printed as `src->@`, and flow + // out of this node is printed as `@->dest`. + key = "flow" and + result = + strictconcat(string flow, boolean to, int order1, int order2 | + flow = getFromFlow(node, order1, order2) + "->@" and to = false + or + flow = "@->" + getToFlow(node, order1, order2) and to = true + | + flow, ", " order by to, order1, order2, flow + ) + or + // Is this node a dataflow sink? + key = "sink" and + any(DataFlow::Configuration cfg).isSink(node) and + result = "true" + or + // Is this node a dataflow source? + key = "source" and + any(DataFlow::Configuration cfg).isSource(node) and + result = "true" + or + // Is this node a dataflow barrier, and if so, what kind? + key = "barrier" and + result = + strictconcat(string kind | + any(DataFlow::Configuration cfg).isBarrier(node) and kind = "full" + or + any(DataFlow::Configuration cfg).isBarrierIn(node) and kind = "in" + or + any(DataFlow::Configuration cfg).isBarrierOut(node) and kind = "out" + or + exists(DataFlow::BarrierGuard guard | + any(DataFlow::Configuration cfg).isBarrierGuard(guard) and + node = guard.getAGuardedNode() and + kind = "guard(" + guard.getResultId() + ")" + ) + | + kind, ", " + ) +} + +/** + * Property provider for local IR dataflow. + */ +class LocalFlowPropertyProvider extends IRPropertyProvider { + override string getOperandProperty(Operand operand, string key) { + exists(DataFlow::Node node | + operand = node.asOperand() and + result = getNodeProperty(node, key) + ) + } + + override string getInstructionProperty(Instruction instruction, string key) { + exists(DataFlow::Node node | + instruction = node.asInstruction() and + result = getNodeProperty(node, key) + ) + } +} diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IR.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IR.qll index 3fa0f1b78be7..c96783fe6e81 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IR.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IR.qll @@ -72,4 +72,9 @@ class IRPropertyProvider extends TIRPropertyProvider { * Gets the value of the property named `key` for the specified block. */ string getBlockProperty(IRBlock block, string key) { none() } + + /** + * Gets the value of the property named `key` for the specified operand. + */ + string getOperandProperty(Operand operand, string key) { none() } } diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll index e476aec60afe..d8ae610b2f09 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll @@ -151,6 +151,11 @@ class Operand extends TOperand { */ string getDumpLabel() { result = "" } + /** + * Gets a string that uniquely identifies this operand on its use instruction. + */ + string getDumpId() { result = "" } + /** * Gets a string describing this operand, suitable for display in IR dumps. This consists of the * result ID of the instruction consumed by the operand, plus a label identifying the operand @@ -280,6 +285,8 @@ class NonPhiOperand extends Operand { final override string getDumpLabel() { result = tag.getLabel() } + final override string getDumpId() { result = tag.getId() } + final override int getDumpSortOrder() { result = tag.getSortOrder() } /** @@ -477,6 +484,10 @@ class PhiInputOperand extends MemoryOperand, PhiOperandBase { result = "from " + getPredecessorBlock().getDisplayIndex().toString() + ":" } + final override string getDumpId() { + result = getPredecessorBlock().getDisplayIndex().toString() + } + /** * Gets the predecessor block from which this value comes. */ diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/PrintIR.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/PrintIR.qll index b3e3a5b11952..b26cf972ce41 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/PrintIR.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/PrintIR.qll @@ -50,6 +50,32 @@ private string getAdditionalBlockProperty(IRBlock block, string key) { exists(IRPropertyProvider provider | result = provider.getBlockProperty(block, key)) } +/** + * Gets the properties of an operand from any active property providers. + */ +private string getAdditionalOperandProperty(Operand operand, string key) { + exists(IRPropertyProvider provider | result = provider.getOperandProperty(operand, key)) +} + +/** + * Gets a string listing the properties of the operand and their corresponding values. If the + * operand has no properties, this predicate has no result. + */ +private string getOperandPropertyListString(Operand operand) { + result = strictconcat(string key, string value | value = getAdditionalOperandProperty(operand, key) | key + ":" + value, ", ") +} + +/** + * Gets a string listing the properties of the operand and their corresponding values. The list is + * surrounded by curly braces. If the operand has no properties, this predicate returns an empty + * string. + */ +private string getOperandPropertyString(Operand operand) { + result = "{" + getOperandPropertyListString(operand) + "}" + or + not exists(getOperandPropertyListString(operand)) and result = "" +} + private newtype TPrintableIRNode = TPrintableIRFunction(IRFunction irFunc) { shouldPrintFunction(irFunc.getFunction()) } or TPrintableIRBlock(IRBlock block) { shouldPrintFunction(block.getEnclosingFunction()) } or @@ -190,7 +216,7 @@ private class PrintableInstruction extends PrintableIRNode, TPrintableInstructio | resultString = instr.getResultString() and operationString = instr.getOperationString() and - operandsString = instr.getOperandsString() and + operandsString = getOperandsString() and columnWidths(block, resultWidth, operationWidth) and result = resultString + getPaddingString(resultWidth - resultString.length()) + " = " + @@ -210,6 +236,20 @@ private class PrintableInstruction extends PrintableIRNode, TPrintableInstructio result = PrintableIRNode.super.getProperty(key) or result = getAdditionalInstructionProperty(instr, key) } + + /** + * Gets the string representation of the operand list. This is the same as + * `Instruction::getOperandsString()`, except that each operand is annotated with any properties + * provided by active `IRPropertyProvider` instances. + */ + private string getOperandsString() { + result = + concat(Operand operand | + operand = instr.getAnOperand() + | + operand.getDumpString() + getOperandPropertyString(operand), ", " order by operand.getDumpSortOrder() + ) + } } private predicate columnWidths(IRBlock block, int resultWidth, int operationWidth) { diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/internal/OperandTag.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/internal/OperandTag.qll index ac284440648d..274b6510bd61 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/internal/OperandTag.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/internal/OperandTag.qll @@ -40,7 +40,19 @@ abstract class OperandTag extends TOperandTag { /** * Gets a label that will appear before the operand when the IR is printed. */ - string getLabel() { result = "" } + final string getLabel() { + if alwaysPrintLabel() then result = getId() + ":" else result = "" + } + + /** + * Gets an identifier that uniquely identifies this operand within its instruction. + */ + abstract string getId(); + + /** + * Holds if the operand should always be prefixed with its label in the dump of its instruction. + */ + predicate alwaysPrintLabel() { none() } } /** @@ -69,7 +81,9 @@ class AddressOperandTag extends RegisterOperandTag, TAddressOperand { final override int getSortOrder() { result = 0 } - final override string getLabel() { result = "&:" } + final override predicate alwaysPrintLabel() { any() } + + final override string getId() { result = "&" } } AddressOperandTag addressOperand() { result = TAddressOperand() } @@ -82,6 +96,8 @@ class BufferSizeOperandTag extends RegisterOperandTag, TBufferSizeOperand { final override string toString() { result = "BufferSize" } final override int getSortOrder() { result = 1 } + + final override string getId() { result = "size" } } BufferSizeOperandTag bufferSizeOperand() { result = TBufferSizeOperand() } @@ -93,6 +109,8 @@ class SideEffectOperandTag extends TypedOperandTag, TSideEffectOperand { final override string toString() { result = "SideEffect" } final override int getSortOrder() { result = 2 } + + final override string getId() { result = "side_effect" } } SideEffectOperandTag sideEffectOperand() { result = TSideEffectOperand() } @@ -105,6 +123,8 @@ class LoadOperandTag extends TypedOperandTag, TLoadOperand { final override string toString() { result = "Load" } final override int getSortOrder() { result = 3 } + + final override string getId() { result = "load" } } LoadOperandTag loadOperand() { result = TLoadOperand() } @@ -116,6 +136,8 @@ class StoreValueOperandTag extends RegisterOperandTag, TStoreValueOperand { final override string toString() { result = "StoreValue" } final override int getSortOrder() { result = 4 } + + final override string getId() { result = "store" } } StoreValueOperandTag storeValueOperand() { result = TStoreValueOperand() } @@ -127,6 +149,8 @@ class UnaryOperandTag extends RegisterOperandTag, TUnaryOperand { final override string toString() { result = "Unary" } final override int getSortOrder() { result = 5 } + + final override string getId() { result = "unary" } } UnaryOperandTag unaryOperand() { result = TUnaryOperand() } @@ -138,6 +162,8 @@ class LeftOperandTag extends RegisterOperandTag, TLeftOperand { final override string toString() { result = "Left" } final override int getSortOrder() { result = 6 } + + final override string getId() { result = "left" } } LeftOperandTag leftOperand() { result = TLeftOperand() } @@ -149,6 +175,8 @@ class RightOperandTag extends RegisterOperandTag, TRightOperand { final override string toString() { result = "Right" } final override int getSortOrder() { result = 7 } + + final override string getId() { result = "right" } } RightOperandTag rightOperand() { result = TRightOperand() } @@ -160,6 +188,8 @@ class ConditionOperandTag extends RegisterOperandTag, TConditionOperand { final override string toString() { result = "Condition" } final override int getSortOrder() { result = 8 } + + final override string getId() { result = "cond" } } ConditionOperandTag conditionOperand() { result = TConditionOperand() } @@ -172,7 +202,9 @@ class CallTargetOperandTag extends RegisterOperandTag, TCallTargetOperand { final override int getSortOrder() { result = 10 } - final override string getLabel() { result = "func:" } + final override predicate alwaysPrintLabel() { any() } + + final override string getId() { result = "func" } } CallTargetOperandTag callTargetOperand() { result = TCallTargetOperand() } @@ -195,7 +227,9 @@ class ThisArgumentOperandTag extends ArgumentOperandTag, TThisArgumentOperand { final override int getSortOrder() { result = 11 } - final override string getLabel() { result = "this:" } + final override predicate alwaysPrintLabel() { any() } + + final override string getId() { result = "this" } } ThisArgumentOperandTag thisArgumentOperand() { result = TThisArgumentOperand() } @@ -212,9 +246,11 @@ class PositionalArgumentOperandTag extends ArgumentOperandTag, TPositionalArgume final override int getSortOrder() { result = 12 + argIndex } - final override string getLabel() { result = argIndex.toString() + ":" } + final override predicate alwaysPrintLabel() { any() } final int getArgIndex() { result = argIndex } + + final override string getId() { result = argIndex.toString() } } PositionalArgumentOperandTag positionalArgumentOperand(int argIndex) { @@ -228,7 +264,9 @@ class ChiTotalOperandTag extends ChiOperandTag, TChiTotalOperand { final override int getSortOrder() { result = 13 } - final override string getLabel() { result = "total:" } + final override predicate alwaysPrintLabel() { any() } + + final override string getId() { result = "total" } } ChiTotalOperandTag chiTotalOperand() { result = TChiTotalOperand() } @@ -238,7 +276,9 @@ class ChiPartialOperandTag extends ChiOperandTag, TChiPartialOperand { final override int getSortOrder() { result = 14 } - final override string getLabel() { result = "partial:" } + final override predicate alwaysPrintLabel() { any() } + + final override string getId() { result = "partial" } } ChiPartialOperandTag chiPartialOperand() { result = TChiPartialOperand() } @@ -252,7 +292,9 @@ class AsmOperandTag extends RegisterOperandTag, TAsmOperand { final override int getSortOrder() { result = 15 + index } - final override string getLabel() { result = index.toString() + ":" } + final override predicate alwaysPrintLabel() { any() } + + final override string getId() { result = index.toString() } } AsmOperandTag asmOperand(int index) { result = TAsmOperand(index) } diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IR.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IR.qll index 3fa0f1b78be7..c96783fe6e81 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IR.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IR.qll @@ -72,4 +72,9 @@ class IRPropertyProvider extends TIRPropertyProvider { * Gets the value of the property named `key` for the specified block. */ string getBlockProperty(IRBlock block, string key) { none() } + + /** + * Gets the value of the property named `key` for the specified operand. + */ + string getOperandProperty(Operand operand, string key) { none() } } diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Operand.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Operand.qll index e476aec60afe..d8ae610b2f09 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Operand.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Operand.qll @@ -151,6 +151,11 @@ class Operand extends TOperand { */ string getDumpLabel() { result = "" } + /** + * Gets a string that uniquely identifies this operand on its use instruction. + */ + string getDumpId() { result = "" } + /** * Gets a string describing this operand, suitable for display in IR dumps. This consists of the * result ID of the instruction consumed by the operand, plus a label identifying the operand @@ -280,6 +285,8 @@ class NonPhiOperand extends Operand { final override string getDumpLabel() { result = tag.getLabel() } + final override string getDumpId() { result = tag.getId() } + final override int getDumpSortOrder() { result = tag.getSortOrder() } /** @@ -477,6 +484,10 @@ class PhiInputOperand extends MemoryOperand, PhiOperandBase { result = "from " + getPredecessorBlock().getDisplayIndex().toString() + ":" } + final override string getDumpId() { + result = getPredecessorBlock().getDisplayIndex().toString() + } + /** * Gets the predecessor block from which this value comes. */ diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/PrintIR.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/PrintIR.qll index b3e3a5b11952..b26cf972ce41 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/PrintIR.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/PrintIR.qll @@ -50,6 +50,32 @@ private string getAdditionalBlockProperty(IRBlock block, string key) { exists(IRPropertyProvider provider | result = provider.getBlockProperty(block, key)) } +/** + * Gets the properties of an operand from any active property providers. + */ +private string getAdditionalOperandProperty(Operand operand, string key) { + exists(IRPropertyProvider provider | result = provider.getOperandProperty(operand, key)) +} + +/** + * Gets a string listing the properties of the operand and their corresponding values. If the + * operand has no properties, this predicate has no result. + */ +private string getOperandPropertyListString(Operand operand) { + result = strictconcat(string key, string value | value = getAdditionalOperandProperty(operand, key) | key + ":" + value, ", ") +} + +/** + * Gets a string listing the properties of the operand and their corresponding values. The list is + * surrounded by curly braces. If the operand has no properties, this predicate returns an empty + * string. + */ +private string getOperandPropertyString(Operand operand) { + result = "{" + getOperandPropertyListString(operand) + "}" + or + not exists(getOperandPropertyListString(operand)) and result = "" +} + private newtype TPrintableIRNode = TPrintableIRFunction(IRFunction irFunc) { shouldPrintFunction(irFunc.getFunction()) } or TPrintableIRBlock(IRBlock block) { shouldPrintFunction(block.getEnclosingFunction()) } or @@ -190,7 +216,7 @@ private class PrintableInstruction extends PrintableIRNode, TPrintableInstructio | resultString = instr.getResultString() and operationString = instr.getOperationString() and - operandsString = instr.getOperandsString() and + operandsString = getOperandsString() and columnWidths(block, resultWidth, operationWidth) and result = resultString + getPaddingString(resultWidth - resultString.length()) + " = " + @@ -210,6 +236,20 @@ private class PrintableInstruction extends PrintableIRNode, TPrintableInstructio result = PrintableIRNode.super.getProperty(key) or result = getAdditionalInstructionProperty(instr, key) } + + /** + * Gets the string representation of the operand list. This is the same as + * `Instruction::getOperandsString()`, except that each operand is annotated with any properties + * provided by active `IRPropertyProvider` instances. + */ + private string getOperandsString() { + result = + concat(Operand operand | + operand = instr.getAnOperand() + | + operand.getDumpString() + getOperandPropertyString(operand), ", " order by operand.getDumpSortOrder() + ) + } } private predicate columnWidths(IRBlock block, int resultWidth, int operationWidth) { diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IR.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IR.qll index 3fa0f1b78be7..c96783fe6e81 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IR.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IR.qll @@ -72,4 +72,9 @@ class IRPropertyProvider extends TIRPropertyProvider { * Gets the value of the property named `key` for the specified block. */ string getBlockProperty(IRBlock block, string key) { none() } + + /** + * Gets the value of the property named `key` for the specified operand. + */ + string getOperandProperty(Operand operand, string key) { none() } } diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll index e476aec60afe..d8ae610b2f09 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll @@ -151,6 +151,11 @@ class Operand extends TOperand { */ string getDumpLabel() { result = "" } + /** + * Gets a string that uniquely identifies this operand on its use instruction. + */ + string getDumpId() { result = "" } + /** * Gets a string describing this operand, suitable for display in IR dumps. This consists of the * result ID of the instruction consumed by the operand, plus a label identifying the operand @@ -280,6 +285,8 @@ class NonPhiOperand extends Operand { final override string getDumpLabel() { result = tag.getLabel() } + final override string getDumpId() { result = tag.getId() } + final override int getDumpSortOrder() { result = tag.getSortOrder() } /** @@ -477,6 +484,10 @@ class PhiInputOperand extends MemoryOperand, PhiOperandBase { result = "from " + getPredecessorBlock().getDisplayIndex().toString() + ":" } + final override string getDumpId() { + result = getPredecessorBlock().getDisplayIndex().toString() + } + /** * Gets the predecessor block from which this value comes. */ diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/PrintIR.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/PrintIR.qll index b3e3a5b11952..b26cf972ce41 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/PrintIR.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/PrintIR.qll @@ -50,6 +50,32 @@ private string getAdditionalBlockProperty(IRBlock block, string key) { exists(IRPropertyProvider provider | result = provider.getBlockProperty(block, key)) } +/** + * Gets the properties of an operand from any active property providers. + */ +private string getAdditionalOperandProperty(Operand operand, string key) { + exists(IRPropertyProvider provider | result = provider.getOperandProperty(operand, key)) +} + +/** + * Gets a string listing the properties of the operand and their corresponding values. If the + * operand has no properties, this predicate has no result. + */ +private string getOperandPropertyListString(Operand operand) { + result = strictconcat(string key, string value | value = getAdditionalOperandProperty(operand, key) | key + ":" + value, ", ") +} + +/** + * Gets a string listing the properties of the operand and their corresponding values. The list is + * surrounded by curly braces. If the operand has no properties, this predicate returns an empty + * string. + */ +private string getOperandPropertyString(Operand operand) { + result = "{" + getOperandPropertyListString(operand) + "}" + or + not exists(getOperandPropertyListString(operand)) and result = "" +} + private newtype TPrintableIRNode = TPrintableIRFunction(IRFunction irFunc) { shouldPrintFunction(irFunc.getFunction()) } or TPrintableIRBlock(IRBlock block) { shouldPrintFunction(block.getEnclosingFunction()) } or @@ -190,7 +216,7 @@ private class PrintableInstruction extends PrintableIRNode, TPrintableInstructio | resultString = instr.getResultString() and operationString = instr.getOperationString() and - operandsString = instr.getOperandsString() and + operandsString = getOperandsString() and columnWidths(block, resultWidth, operationWidth) and result = resultString + getPaddingString(resultWidth - resultString.length()) + " = " + @@ -210,6 +236,20 @@ private class PrintableInstruction extends PrintableIRNode, TPrintableInstructio result = PrintableIRNode.super.getProperty(key) or result = getAdditionalInstructionProperty(instr, key) } + + /** + * Gets the string representation of the operand list. This is the same as + * `Instruction::getOperandsString()`, except that each operand is annotated with any properties + * provided by active `IRPropertyProvider` instances. + */ + private string getOperandsString() { + result = + concat(Operand operand | + operand = instr.getAnOperand() + | + operand.getDumpString() + getOperandPropertyString(operand), ", " order by operand.getDumpSortOrder() + ) + } } private predicate columnWidths(IRBlock block, int resultWidth, int operationWidth) { diff --git a/csharp/ql/src/experimental/ir/implementation/internal/OperandTag.qll b/csharp/ql/src/experimental/ir/implementation/internal/OperandTag.qll index ac284440648d..274b6510bd61 100644 --- a/csharp/ql/src/experimental/ir/implementation/internal/OperandTag.qll +++ b/csharp/ql/src/experimental/ir/implementation/internal/OperandTag.qll @@ -40,7 +40,19 @@ abstract class OperandTag extends TOperandTag { /** * Gets a label that will appear before the operand when the IR is printed. */ - string getLabel() { result = "" } + final string getLabel() { + if alwaysPrintLabel() then result = getId() + ":" else result = "" + } + + /** + * Gets an identifier that uniquely identifies this operand within its instruction. + */ + abstract string getId(); + + /** + * Holds if the operand should always be prefixed with its label in the dump of its instruction. + */ + predicate alwaysPrintLabel() { none() } } /** @@ -69,7 +81,9 @@ class AddressOperandTag extends RegisterOperandTag, TAddressOperand { final override int getSortOrder() { result = 0 } - final override string getLabel() { result = "&:" } + final override predicate alwaysPrintLabel() { any() } + + final override string getId() { result = "&" } } AddressOperandTag addressOperand() { result = TAddressOperand() } @@ -82,6 +96,8 @@ class BufferSizeOperandTag extends RegisterOperandTag, TBufferSizeOperand { final override string toString() { result = "BufferSize" } final override int getSortOrder() { result = 1 } + + final override string getId() { result = "size" } } BufferSizeOperandTag bufferSizeOperand() { result = TBufferSizeOperand() } @@ -93,6 +109,8 @@ class SideEffectOperandTag extends TypedOperandTag, TSideEffectOperand { final override string toString() { result = "SideEffect" } final override int getSortOrder() { result = 2 } + + final override string getId() { result = "side_effect" } } SideEffectOperandTag sideEffectOperand() { result = TSideEffectOperand() } @@ -105,6 +123,8 @@ class LoadOperandTag extends TypedOperandTag, TLoadOperand { final override string toString() { result = "Load" } final override int getSortOrder() { result = 3 } + + final override string getId() { result = "load" } } LoadOperandTag loadOperand() { result = TLoadOperand() } @@ -116,6 +136,8 @@ class StoreValueOperandTag extends RegisterOperandTag, TStoreValueOperand { final override string toString() { result = "StoreValue" } final override int getSortOrder() { result = 4 } + + final override string getId() { result = "store" } } StoreValueOperandTag storeValueOperand() { result = TStoreValueOperand() } @@ -127,6 +149,8 @@ class UnaryOperandTag extends RegisterOperandTag, TUnaryOperand { final override string toString() { result = "Unary" } final override int getSortOrder() { result = 5 } + + final override string getId() { result = "unary" } } UnaryOperandTag unaryOperand() { result = TUnaryOperand() } @@ -138,6 +162,8 @@ class LeftOperandTag extends RegisterOperandTag, TLeftOperand { final override string toString() { result = "Left" } final override int getSortOrder() { result = 6 } + + final override string getId() { result = "left" } } LeftOperandTag leftOperand() { result = TLeftOperand() } @@ -149,6 +175,8 @@ class RightOperandTag extends RegisterOperandTag, TRightOperand { final override string toString() { result = "Right" } final override int getSortOrder() { result = 7 } + + final override string getId() { result = "right" } } RightOperandTag rightOperand() { result = TRightOperand() } @@ -160,6 +188,8 @@ class ConditionOperandTag extends RegisterOperandTag, TConditionOperand { final override string toString() { result = "Condition" } final override int getSortOrder() { result = 8 } + + final override string getId() { result = "cond" } } ConditionOperandTag conditionOperand() { result = TConditionOperand() } @@ -172,7 +202,9 @@ class CallTargetOperandTag extends RegisterOperandTag, TCallTargetOperand { final override int getSortOrder() { result = 10 } - final override string getLabel() { result = "func:" } + final override predicate alwaysPrintLabel() { any() } + + final override string getId() { result = "func" } } CallTargetOperandTag callTargetOperand() { result = TCallTargetOperand() } @@ -195,7 +227,9 @@ class ThisArgumentOperandTag extends ArgumentOperandTag, TThisArgumentOperand { final override int getSortOrder() { result = 11 } - final override string getLabel() { result = "this:" } + final override predicate alwaysPrintLabel() { any() } + + final override string getId() { result = "this" } } ThisArgumentOperandTag thisArgumentOperand() { result = TThisArgumentOperand() } @@ -212,9 +246,11 @@ class PositionalArgumentOperandTag extends ArgumentOperandTag, TPositionalArgume final override int getSortOrder() { result = 12 + argIndex } - final override string getLabel() { result = argIndex.toString() + ":" } + final override predicate alwaysPrintLabel() { any() } final int getArgIndex() { result = argIndex } + + final override string getId() { result = argIndex.toString() } } PositionalArgumentOperandTag positionalArgumentOperand(int argIndex) { @@ -228,7 +264,9 @@ class ChiTotalOperandTag extends ChiOperandTag, TChiTotalOperand { final override int getSortOrder() { result = 13 } - final override string getLabel() { result = "total:" } + final override predicate alwaysPrintLabel() { any() } + + final override string getId() { result = "total" } } ChiTotalOperandTag chiTotalOperand() { result = TChiTotalOperand() } @@ -238,7 +276,9 @@ class ChiPartialOperandTag extends ChiOperandTag, TChiPartialOperand { final override int getSortOrder() { result = 14 } - final override string getLabel() { result = "partial:" } + final override predicate alwaysPrintLabel() { any() } + + final override string getId() { result = "partial" } } ChiPartialOperandTag chiPartialOperand() { result = TChiPartialOperand() } @@ -252,7 +292,9 @@ class AsmOperandTag extends RegisterOperandTag, TAsmOperand { final override int getSortOrder() { result = 15 + index } - final override string getLabel() { result = index.toString() + ":" } + final override predicate alwaysPrintLabel() { any() } + + final override string getId() { result = index.toString() } } AsmOperandTag asmOperand(int index) { result = TAsmOperand(index) } diff --git a/csharp/ql/src/experimental/ir/implementation/raw/IR.qll b/csharp/ql/src/experimental/ir/implementation/raw/IR.qll index 3fa0f1b78be7..c96783fe6e81 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/IR.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/IR.qll @@ -72,4 +72,9 @@ class IRPropertyProvider extends TIRPropertyProvider { * Gets the value of the property named `key` for the specified block. */ string getBlockProperty(IRBlock block, string key) { none() } + + /** + * Gets the value of the property named `key` for the specified operand. + */ + string getOperandProperty(Operand operand, string key) { none() } } diff --git a/csharp/ql/src/experimental/ir/implementation/raw/Operand.qll b/csharp/ql/src/experimental/ir/implementation/raw/Operand.qll index e476aec60afe..d8ae610b2f09 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/Operand.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/Operand.qll @@ -151,6 +151,11 @@ class Operand extends TOperand { */ string getDumpLabel() { result = "" } + /** + * Gets a string that uniquely identifies this operand on its use instruction. + */ + string getDumpId() { result = "" } + /** * Gets a string describing this operand, suitable for display in IR dumps. This consists of the * result ID of the instruction consumed by the operand, plus a label identifying the operand @@ -280,6 +285,8 @@ class NonPhiOperand extends Operand { final override string getDumpLabel() { result = tag.getLabel() } + final override string getDumpId() { result = tag.getId() } + final override int getDumpSortOrder() { result = tag.getSortOrder() } /** @@ -477,6 +484,10 @@ class PhiInputOperand extends MemoryOperand, PhiOperandBase { result = "from " + getPredecessorBlock().getDisplayIndex().toString() + ":" } + final override string getDumpId() { + result = getPredecessorBlock().getDisplayIndex().toString() + } + /** * Gets the predecessor block from which this value comes. */ diff --git a/csharp/ql/src/experimental/ir/implementation/raw/PrintIR.qll b/csharp/ql/src/experimental/ir/implementation/raw/PrintIR.qll index b3e3a5b11952..b26cf972ce41 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/PrintIR.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/PrintIR.qll @@ -50,6 +50,32 @@ private string getAdditionalBlockProperty(IRBlock block, string key) { exists(IRPropertyProvider provider | result = provider.getBlockProperty(block, key)) } +/** + * Gets the properties of an operand from any active property providers. + */ +private string getAdditionalOperandProperty(Operand operand, string key) { + exists(IRPropertyProvider provider | result = provider.getOperandProperty(operand, key)) +} + +/** + * Gets a string listing the properties of the operand and their corresponding values. If the + * operand has no properties, this predicate has no result. + */ +private string getOperandPropertyListString(Operand operand) { + result = strictconcat(string key, string value | value = getAdditionalOperandProperty(operand, key) | key + ":" + value, ", ") +} + +/** + * Gets a string listing the properties of the operand and their corresponding values. The list is + * surrounded by curly braces. If the operand has no properties, this predicate returns an empty + * string. + */ +private string getOperandPropertyString(Operand operand) { + result = "{" + getOperandPropertyListString(operand) + "}" + or + not exists(getOperandPropertyListString(operand)) and result = "" +} + private newtype TPrintableIRNode = TPrintableIRFunction(IRFunction irFunc) { shouldPrintFunction(irFunc.getFunction()) } or TPrintableIRBlock(IRBlock block) { shouldPrintFunction(block.getEnclosingFunction()) } or @@ -190,7 +216,7 @@ private class PrintableInstruction extends PrintableIRNode, TPrintableInstructio | resultString = instr.getResultString() and operationString = instr.getOperationString() and - operandsString = instr.getOperandsString() and + operandsString = getOperandsString() and columnWidths(block, resultWidth, operationWidth) and result = resultString + getPaddingString(resultWidth - resultString.length()) + " = " + @@ -210,6 +236,20 @@ private class PrintableInstruction extends PrintableIRNode, TPrintableInstructio result = PrintableIRNode.super.getProperty(key) or result = getAdditionalInstructionProperty(instr, key) } + + /** + * Gets the string representation of the operand list. This is the same as + * `Instruction::getOperandsString()`, except that each operand is annotated with any properties + * provided by active `IRPropertyProvider` instances. + */ + private string getOperandsString() { + result = + concat(Operand operand | + operand = instr.getAnOperand() + | + operand.getDumpString() + getOperandPropertyString(operand), ", " order by operand.getDumpSortOrder() + ) + } } private predicate columnWidths(IRBlock block, int resultWidth, int operationWidth) { diff --git a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IR.qll b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IR.qll index 3fa0f1b78be7..c96783fe6e81 100644 --- a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IR.qll +++ b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IR.qll @@ -72,4 +72,9 @@ class IRPropertyProvider extends TIRPropertyProvider { * Gets the value of the property named `key` for the specified block. */ string getBlockProperty(IRBlock block, string key) { none() } + + /** + * Gets the value of the property named `key` for the specified operand. + */ + string getOperandProperty(Operand operand, string key) { none() } } diff --git a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Operand.qll b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Operand.qll index e476aec60afe..d8ae610b2f09 100644 --- a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Operand.qll +++ b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Operand.qll @@ -151,6 +151,11 @@ class Operand extends TOperand { */ string getDumpLabel() { result = "" } + /** + * Gets a string that uniquely identifies this operand on its use instruction. + */ + string getDumpId() { result = "" } + /** * Gets a string describing this operand, suitable for display in IR dumps. This consists of the * result ID of the instruction consumed by the operand, plus a label identifying the operand @@ -280,6 +285,8 @@ class NonPhiOperand extends Operand { final override string getDumpLabel() { result = tag.getLabel() } + final override string getDumpId() { result = tag.getId() } + final override int getDumpSortOrder() { result = tag.getSortOrder() } /** @@ -477,6 +484,10 @@ class PhiInputOperand extends MemoryOperand, PhiOperandBase { result = "from " + getPredecessorBlock().getDisplayIndex().toString() + ":" } + final override string getDumpId() { + result = getPredecessorBlock().getDisplayIndex().toString() + } + /** * Gets the predecessor block from which this value comes. */ diff --git a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/PrintIR.qll b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/PrintIR.qll index b3e3a5b11952..b26cf972ce41 100644 --- a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/PrintIR.qll +++ b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/PrintIR.qll @@ -50,6 +50,32 @@ private string getAdditionalBlockProperty(IRBlock block, string key) { exists(IRPropertyProvider provider | result = provider.getBlockProperty(block, key)) } +/** + * Gets the properties of an operand from any active property providers. + */ +private string getAdditionalOperandProperty(Operand operand, string key) { + exists(IRPropertyProvider provider | result = provider.getOperandProperty(operand, key)) +} + +/** + * Gets a string listing the properties of the operand and their corresponding values. If the + * operand has no properties, this predicate has no result. + */ +private string getOperandPropertyListString(Operand operand) { + result = strictconcat(string key, string value | value = getAdditionalOperandProperty(operand, key) | key + ":" + value, ", ") +} + +/** + * Gets a string listing the properties of the operand and their corresponding values. The list is + * surrounded by curly braces. If the operand has no properties, this predicate returns an empty + * string. + */ +private string getOperandPropertyString(Operand operand) { + result = "{" + getOperandPropertyListString(operand) + "}" + or + not exists(getOperandPropertyListString(operand)) and result = "" +} + private newtype TPrintableIRNode = TPrintableIRFunction(IRFunction irFunc) { shouldPrintFunction(irFunc.getFunction()) } or TPrintableIRBlock(IRBlock block) { shouldPrintFunction(block.getEnclosingFunction()) } or @@ -190,7 +216,7 @@ private class PrintableInstruction extends PrintableIRNode, TPrintableInstructio | resultString = instr.getResultString() and operationString = instr.getOperationString() and - operandsString = instr.getOperandsString() and + operandsString = getOperandsString() and columnWidths(block, resultWidth, operationWidth) and result = resultString + getPaddingString(resultWidth - resultString.length()) + " = " + @@ -210,6 +236,20 @@ private class PrintableInstruction extends PrintableIRNode, TPrintableInstructio result = PrintableIRNode.super.getProperty(key) or result = getAdditionalInstructionProperty(instr, key) } + + /** + * Gets the string representation of the operand list. This is the same as + * `Instruction::getOperandsString()`, except that each operand is annotated with any properties + * provided by active `IRPropertyProvider` instances. + */ + private string getOperandsString() { + result = + concat(Operand operand | + operand = instr.getAnOperand() + | + operand.getDumpString() + getOperandPropertyString(operand), ", " order by operand.getDumpSortOrder() + ) + } } private predicate columnWidths(IRBlock block, int resultWidth, int operationWidth) { From ceea5b3ec6fbcd126c6787e79d0c7935300b6e5d Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Thu, 15 Oct 2020 13:37:20 -0400 Subject: [PATCH 09/53] Fix test code that returns reference to local --- .../test/library-tests/dataflow/taint-tests/movableclass.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/movableclass.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/movableclass.cpp index c0003388307a..e8b87edf0dd5 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/movableclass.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/movableclass.cpp @@ -19,8 +19,8 @@ class MyMovableClass { int v; }; -MyMovableClass &&getUnTainted() { return MyMovableClass(1); } -MyMovableClass &&getTainted() { return MyMovableClass(source()); } +MyMovableClass getUnTainted() { return MyMovableClass(1); } +MyMovableClass getTainted() { return MyMovableClass(source()); } void test_copyableclass() { From 3767a52e9a71cfd780305e7efb9822d3967edfb3 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Thu, 15 Oct 2020 17:54:48 -0400 Subject: [PATCH 10/53] Fix ODR violations in test code --- .../test/library-tests/dataflow/taint-tests/copyableclass.cpp | 2 +- .../dataflow/taint-tests/copyableclass_declonly.cpp | 4 ++-- cpp/ql/test/library-tests/dataflow/taint-tests/format.cpp | 2 +- .../test/library-tests/dataflow/taint-tests/movableclass.cpp | 2 +- cpp/ql/test/library-tests/dataflow/taint-tests/string.cpp | 2 +- .../library-tests/dataflow/taint-tests/structlikeclass.cpp | 2 +- cpp/ql/test/library-tests/dataflow/taint-tests/swap1.cpp | 4 +++- cpp/ql/test/library-tests/dataflow/taint-tests/swap2.cpp | 4 +++- cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp | 2 +- cpp/ql/test/library-tests/dataflow/taint-tests/vector.cpp | 2 +- 10 files changed, 15 insertions(+), 11 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/copyableclass.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/copyableclass.cpp index d5745bcb7133..ee1278e0e45e 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/copyableclass.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/copyableclass.cpp @@ -1,6 +1,6 @@ int source(); -void sink(...) {}; +void sink(...); class MyCopyableClass { public: diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/copyableclass_declonly.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/copyableclass_declonly.cpp index 67f6a45fbe7c..74b1cd1009d9 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/copyableclass_declonly.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/copyableclass_declonly.cpp @@ -1,6 +1,6 @@ int source(); -void sink(...) {}; +void sink(...); class MyCopyableClassDeclOnly { public: @@ -15,7 +15,7 @@ class MyCopyableClassDeclOnly { int v; }; -void test_copyableclass() +void test_copyableclass_declonly() { { MyCopyableClassDeclOnly s1(1); diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/format.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/format.cpp index fbe78cf02e10..820a9ada465a 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/format.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/format.cpp @@ -30,7 +30,7 @@ int sscanf(const char *s, const char *format, ...); // ---------- int source(); -void sink(...) {}; +void sink(...); namespace string { diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/movableclass.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/movableclass.cpp index e8b87edf0dd5..7f121bb27c9e 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/movableclass.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/movableclass.cpp @@ -22,7 +22,7 @@ class MyMovableClass { MyMovableClass getUnTainted() { return MyMovableClass(1); } MyMovableClass getTainted() { return MyMovableClass(source()); } -void test_copyableclass() +void test_movableclass() { { MyMovableClass s1(1); diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/string.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/string.cpp index 6a0bf47e4d7d..3d54fdb215a2 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/string.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/string.cpp @@ -499,7 +499,7 @@ void test_string_iterator_methods() } } -void test_constructors_more() { +void test_string_constructors_more() { char *cs1 = "abc"; char *cs2 = source(); std::string s1(cs1); diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/structlikeclass.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/structlikeclass.cpp index 727a0fff53b9..e4d54bb264da 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/structlikeclass.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/structlikeclass.cpp @@ -1,6 +1,6 @@ int source(); -void sink(...) {}; +void sink(...); class StructLikeClass { public: diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/swap1.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/swap1.cpp index 7ba05b86f729..f06fbd6aacff 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/swap1.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/swap1.cpp @@ -13,7 +13,7 @@ namespace std template T &&move(T &t) noexcept { return static_cast(t); } // simplified signature (and implementation) } // namespace std - +namespace Swap1 { namespace IntWrapper { struct Class @@ -144,3 +144,5 @@ void test_move_assignment_method() sink(y.data1); // tainted sink(x.data1); // tainted } + +} diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/swap2.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/swap2.cpp index e5203f344f2e..b477ee0f38d8 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/swap2.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/swap2.cpp @@ -13,7 +13,7 @@ namespace std template T &&move(T &t) noexcept { return static_cast(t); } // simplified signature (and implementation) } // namespace std - +namespace Swap2 { namespace IntWrapper { struct Class @@ -144,3 +144,5 @@ void test_move_assignment_method() sink(y.data1); // tainted sink(x.data1); // tainted } + +} diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp index 48e78c62147f..12bbf21bda43 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp @@ -1,5 +1,5 @@ int source(); -void sink(...) {}; +void sink(...); void arithAssignments(int source1, int clean1) { sink(clean1); // clean diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/vector.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/vector.cpp index b5dad8119989..5f7197498737 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/vector.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/vector.cpp @@ -312,7 +312,7 @@ void test_vector_insert() { sink(d); // tainted } -void test_constructors_more() { +void test_vector_constructors_more() { std::vector v1; std::vector v2; v2.push_back(source()); From 14ac9859c1842e081cf31e38123e85674af279c1 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Fri, 16 Oct 2020 10:26:42 -0400 Subject: [PATCH 11/53] Remove more ODR violations from test code. PrintAST now works on `library-tests/dataflow/taint-tests`. --- cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp | 4 ++-- cpp/ql/test/library-tests/dataflow/taint-tests/set.cpp | 4 ++-- cpp/ql/test/library-tests/dataflow/taint-tests/string.cpp | 4 ++-- .../test/library-tests/dataflow/taint-tests/stringstream.cpp | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp index 6b4d32f074f4..0f3a371c67c9 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp @@ -2,9 +2,9 @@ #include "stl.h" using namespace std; - +namespace { char *source(); - +} void sink(char *); void sink(const char *); void sink(bool); diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/set.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/set.cpp index b6d19ab16475..7d415a3b6693 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/set.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/set.cpp @@ -2,9 +2,9 @@ #include "stl.h" using namespace std; - +namespace { char *source(); - +} void sink(char *); void sink(std::set); void sink(std::set::iterator); diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/string.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/string.cpp index 3d54fdb215a2..3c56fcb5f05d 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/string.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/string.cpp @@ -2,9 +2,9 @@ #include "stl.h" using namespace std; - +namespace { char *source(); - +} namespace ns_char { char source(); diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/stringstream.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/stringstream.cpp index e700bccb9300..5414f976a374 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/stringstream.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/stringstream.cpp @@ -2,9 +2,9 @@ #include "stl.h" using namespace std; - +namespace { char *source(); - +} namespace ns_char { char source(); From 6a9ecf7ba2f7628062ca9bf95ebf8e53d49c07e6 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Fri, 16 Oct 2020 11:53:27 -0400 Subject: [PATCH 12/53] Dump static call target for Call instructions --- .../aliased_ssa/Instruction.qll | 6 + .../cpp/ir/implementation/raw/Instruction.qll | 6 + .../unaliased_ssa/Instruction.qll | 6 + .../test/library-tests/ir/ir/raw_ir.expected | 420 +++++++++--------- .../ir/ssa/aliased_ssa_ir.expected | 58 +-- .../ir/ssa/aliased_ssa_ir_unsound.expected | 58 +-- .../ir/ssa/unaliased_ssa_ir.expected | 58 +-- .../ir/ssa/unaliased_ssa_ir_unsound.expected | 58 +-- .../GlobalValueNumbering/ir_gvn.expected | 6 +- .../ir/implementation/raw/Instruction.qll | 6 + .../unaliased_ssa/Instruction.qll | 6 + .../test/experimental/ir/ir/raw_ir.expected | 136 +++--- 12 files changed, 426 insertions(+), 398 deletions(-) diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll index 620b23b942e0..135b91c0decd 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll @@ -1501,6 +1501,12 @@ class SwitchInstruction extends Instruction { class CallInstruction extends Instruction { CallInstruction() { getOpcode() instanceof Opcode::Call } + final override string getImmediateString() { + result = getStaticCallTarget().toString() + or + not exists(getStaticCallTarget()) and result = "?" + } + /** * Gets the operand the specifies the target function of the call. */ diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Instruction.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Instruction.qll index 620b23b942e0..135b91c0decd 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Instruction.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Instruction.qll @@ -1501,6 +1501,12 @@ class SwitchInstruction extends Instruction { class CallInstruction extends Instruction { CallInstruction() { getOpcode() instanceof Opcode::Call } + final override string getImmediateString() { + result = getStaticCallTarget().toString() + or + not exists(getStaticCallTarget()) and result = "?" + } + /** * Gets the operand the specifies the target function of the call. */ diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll index 620b23b942e0..135b91c0decd 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll @@ -1501,6 +1501,12 @@ class SwitchInstruction extends Instruction { class CallInstruction extends Instruction { CallInstruction() { getOpcode() instanceof Opcode::Call } + final override string getImmediateString() { + result = getStaticCallTarget().toString() + or + not exists(getStaticCallTarget()) and result = "?" + } + /** * Gets the operand the specifies the target function of the call. */ diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 97fc7662b7c6..c441b347cea4 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -40,7 +40,7 @@ bad_asts.cpp: # 16| r16_1(glval) = VariableAddress[s] : # 16| r16_2(glval) = FunctionAddress[MemberFunction] : # 16| r16_3(int) = Constant[1] : -# 16| r16_4(int) = Call : func:r16_2, this:r16_1, 0:r16_3 +# 16| r16_4(int) = Call[MemberFunction] : func:r16_2, this:r16_1, 0:r16_3 # 16| mu16_5(unknown) = ^CallSideEffect : ~m? # 16| v16_6(void) = ^BufferReadSideEffect[-1] : &:r16_1, ~m? # 16| mu16_7(S) = ^IndirectMayWriteSideEffect[-1] : &:r16_1 @@ -2304,7 +2304,7 @@ ir.cpp: # 372| mu372_2(unknown) = AliasedDefinition : # 372| mu372_3(unknown) = InitializeNonLocal : # 373| r373_1(glval) = FunctionAddress[VoidFunc] : -# 373| v373_2(void) = Call : func:r373_1 +# 373| v373_2(void) = Call[VoidFunc] : func:r373_1 # 373| mu373_3(unknown) = ^CallSideEffect : ~m? # 374| v374_1(void) = NoOp : # 372| v372_4(void) = ReturnVoid : @@ -2326,7 +2326,7 @@ ir.cpp: # 377| r377_4(int) = Load : &:r377_3, ~m? # 377| r377_5(glval) = VariableAddress[y] : # 377| r377_6(int) = Load : &:r377_5, ~m? -# 377| r377_7(int) = Call : func:r377_2, 0:r377_4, 1:r377_6 +# 377| r377_7(int) = Call[Add] : func:r377_2, 0:r377_4, 1:r377_6 # 377| mu377_8(unknown) = ^CallSideEffect : ~m? # 377| mu377_9(int) = Store : &:r377_1, r377_7 # 376| r376_8(glval) = VariableAddress[#return] : @@ -2345,14 +2345,14 @@ ir.cpp: # 380| mu380_7(int) = InitializeParameter[y] : &:r380_6 # 381| r381_1(glval) = VariableAddress[#return] : # 381| r381_2(glval) = FunctionAddress[VoidFunc] : -# 381| v381_3(void) = Call : func:r381_2 +# 381| v381_3(void) = Call[VoidFunc] : func:r381_2 # 381| mu381_4(unknown) = ^CallSideEffect : ~m? # 381| r381_5(glval) = FunctionAddress[CallAdd] : # 381| r381_6(glval) = VariableAddress[x] : # 381| r381_7(int) = Load : &:r381_6, ~m? # 381| r381_8(glval) = VariableAddress[y] : # 381| r381_9(int) = Load : &:r381_8, ~m? -# 381| r381_10(int) = Call : func:r381_5, 0:r381_7, 1:r381_9 +# 381| r381_10(int) = Call[CallAdd] : func:r381_5, 0:r381_7, 1:r381_9 # 381| mu381_11(unknown) = ^CallSideEffect : ~m? # 381| r381_12(int) = CopyValue : r381_10 # 381| mu381_13(int) = Store : &:r381_1, r381_12 @@ -2866,7 +2866,7 @@ ir.cpp: # 493| Block 1 # 493| r493_4(glval) = FunctionAddress[VoidFunc] : -# 493| v493_5(void) = Call : func:r493_4 +# 493| v493_5(void) = Call[VoidFunc] : func:r493_4 # 493| mu493_6(unknown) = ^CallSideEffect : ~m? #-----| Goto -> Block 2 @@ -2878,7 +2878,7 @@ ir.cpp: # 493| Block 3 # 493| r493_7(glval) = FunctionAddress[VoidFunc] : -# 493| v493_8(void) = Call : func:r493_7 +# 493| v493_8(void) = Call[VoidFunc] : func:r493_7 # 493| mu493_9(unknown) = ^CallSideEffect : ~m? #-----| Goto -> Block 2 @@ -3185,7 +3185,7 @@ ir.cpp: # 552| r552_2(glval<..(*)(..)>) = VariableAddress[pfn] : # 552| r552_3(..(*)(..)) = Load : &:r552_2, ~m? # 552| r552_4(int) = Constant[5] : -# 552| r552_5(int) = Call : func:r552_3, 0:r552_4 +# 552| r552_5(int) = Call[?] : func:r552_3, 0:r552_4 # 552| mu552_6(unknown) = ^CallSideEffect : ~m? # 552| mu552_7(int) = Store : &:r552_1, r552_5 # 551| r551_6(glval) = VariableAddress[#return] : @@ -3306,7 +3306,7 @@ ir.cpp: # 585| r585_4(int) = Constant[1] : # 585| r585_5(glval) = StringConstant["string"] : # 585| r585_6(char *) = Convert : r585_5 -# 585| v585_7(void) = Call : func:r585_1, 0:r585_3, 1:r585_4, 2:r585_6 +# 585| v585_7(void) = Call[VarArgFunction] : func:r585_1, 0:r585_3, 1:r585_4, 2:r585_6 # 585| mu585_8(unknown) = ^CallSideEffect : ~m? # 585| v585_9(void) = ^BufferReadSideEffect[0] : &:r585_3, ~m? # 585| v585_10(void) = ^BufferReadSideEffect[2] : &:r585_6, ~m? @@ -3353,7 +3353,7 @@ ir.cpp: # 616| r616_1(glval) = VariableAddress[s1] : # 616| mu616_2(String) = Uninitialized[s1] : &:r616_1 # 616| r616_3(glval) = FunctionAddress[String] : -# 616| v616_4(void) = Call : func:r616_3, this:r616_1 +# 616| v616_4(void) = Call[String] : func:r616_3, this:r616_1 # 616| mu616_5(unknown) = ^CallSideEffect : ~m? # 616| mu616_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r616_1 # 617| r617_1(glval) = VariableAddress[s2] : @@ -3361,14 +3361,14 @@ ir.cpp: # 617| r617_3(glval) = FunctionAddress[String] : # 617| r617_4(glval) = StringConstant["hello"] : # 617| r617_5(char *) = Convert : r617_4 -# 617| v617_6(void) = Call : func:r617_3, this:r617_1, 0:r617_5 +# 617| v617_6(void) = Call[String] : func:r617_3, this:r617_1, 0:r617_5 # 617| mu617_7(unknown) = ^CallSideEffect : ~m? # 617| mu617_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r617_1 # 617| v617_9(void) = ^BufferReadSideEffect[0] : &:r617_5, ~m? # 617| mu617_10(unknown) = ^BufferMayWriteSideEffect[0] : &:r617_5 # 618| r618_1(glval) = VariableAddress[s3] : # 618| r618_2(glval) = FunctionAddress[ReturnObject] : -# 618| r618_3(String) = Call : func:r618_2 +# 618| r618_3(String) = Call[ReturnObject] : func:r618_2 # 618| mu618_4(unknown) = ^CallSideEffect : ~m? # 618| mu618_5(String) = Store : &:r618_1, r618_3 # 619| r619_1(glval) = VariableAddress[s4] : @@ -3376,7 +3376,7 @@ ir.cpp: # 619| r619_3(glval) = FunctionAddress[String] : # 619| r619_4(glval) = StringConstant["test"] : # 619| r619_5(char *) = Convert : r619_4 -# 619| v619_6(void) = Call : func:r619_3, this:r619_1, 0:r619_5 +# 619| v619_6(void) = Call[String] : func:r619_3, this:r619_1, 0:r619_5 # 619| mu619_7(unknown) = ^CallSideEffect : ~m? # 619| mu619_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r619_1 # 619| v619_9(void) = ^BufferReadSideEffect[0] : &:r619_5, ~m? @@ -3406,7 +3406,7 @@ ir.cpp: # 623| r623_3(glval) = CopyValue : r623_2 # 623| r623_4(glval) = Convert : r623_3 # 623| r623_5(glval) = FunctionAddress[c_str] : -# 623| r623_6(char *) = Call : func:r623_5, this:r623_4 +# 623| r623_6(char *) = Call[c_str] : func:r623_5, this:r623_4 # 623| mu623_7(unknown) = ^CallSideEffect : ~m? # 623| v623_8(void) = ^BufferReadSideEffect[-1] : &:r623_4, ~m? # 623| mu623_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r623_4 @@ -3414,14 +3414,14 @@ ir.cpp: # 624| r624_2(String *) = Load : &:r624_1, ~m? # 624| r624_3(String *) = Convert : r624_2 # 624| r624_4(glval) = FunctionAddress[c_str] : -# 624| r624_5(char *) = Call : func:r624_4, this:r624_3 +# 624| r624_5(char *) = Call[c_str] : func:r624_4, this:r624_3 # 624| mu624_6(unknown) = ^CallSideEffect : ~m? # 624| v624_7(void) = ^BufferReadSideEffect[-1] : &:r624_3, ~m? # 624| mu624_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r624_3 # 625| r625_1(glval) = VariableAddress[s] : # 625| r625_2(glval) = Convert : r625_1 # 625| r625_3(glval) = FunctionAddress[c_str] : -# 625| r625_4(char *) = Call : func:r625_3, this:r625_2 +# 625| r625_4(char *) = Call[c_str] : func:r625_3, this:r625_2 # 625| mu625_5(unknown) = ^CallSideEffect : ~m? # 625| v625_6(void) = ^BufferReadSideEffect[-1] : &:r625_2, ~m? # 625| mu625_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r625_2 @@ -3444,11 +3444,11 @@ ir.cpp: #-----| v0_1(void) = NoOp : # 628| r628_8(glval) = FieldAddress[m_f] : mu628_5 # 628| r628_9(glval) = FunctionAddress[~String] : -# 628| v628_10(void) = Call : func:r628_9, this:r628_8 +# 628| v628_10(void) = Call[~String] : func:r628_9, this:r628_8 # 628| mu628_11(unknown) = ^CallSideEffect : ~m? # 628| r628_12(glval) = FieldAddress[m_b] : mu628_5 # 628| r628_13(glval) = FunctionAddress[~String] : -# 628| v628_14(void) = Call : func:r628_13, this:r628_12 +# 628| v628_14(void) = Call[~String] : func:r628_13, this:r628_12 # 628| mu628_15(unknown) = ^CallSideEffect : ~m? # 628| v628_16(void) = ReturnIndirection[#this] : &:r628_6, ~m? # 628| v628_17(void) = ReturnVoid : @@ -3578,7 +3578,7 @@ ir.cpp: # 653| r653_2(C *) = Load : &:r653_1, ~m? # 653| r653_3(glval) = FunctionAddress[InstanceMemberFunction] : # 653| r653_4(int) = Constant[0] : -# 653| r653_5(int) = Call : func:r653_3, this:r653_2, 0:r653_4 +# 653| r653_5(int) = Call[InstanceMemberFunction] : func:r653_3, this:r653_2, 0:r653_4 # 653| mu653_6(unknown) = ^CallSideEffect : ~m? # 653| v653_7(void) = ^BufferReadSideEffect[-1] : &:r653_2, ~m? # 653| mu653_8(C) = ^IndirectMayWriteSideEffect[-1] : &:r653_2 @@ -3587,7 +3587,7 @@ ir.cpp: # 654| r654_3(glval) = CopyValue : r654_2 # 654| r654_4(glval) = FunctionAddress[InstanceMemberFunction] : # 654| r654_5(int) = Constant[1] : -# 654| r654_6(int) = Call : func:r654_4, this:r654_3, 0:r654_5 +# 654| r654_6(int) = Call[InstanceMemberFunction] : func:r654_4, this:r654_3, 0:r654_5 # 654| mu654_7(unknown) = ^CallSideEffect : ~m? # 654| v654_8(void) = ^BufferReadSideEffect[-1] : &:r654_3, ~m? # 654| mu654_9(C) = ^IndirectMayWriteSideEffect[-1] : &:r654_3 @@ -3595,7 +3595,7 @@ ir.cpp: # 655| r655_2(C *) = Load : &:r655_1, ~m? # 655| r655_3(glval) = FunctionAddress[InstanceMemberFunction] : # 655| r655_4(int) = Constant[2] : -# 655| r655_5(int) = Call : func:r655_3, this:r655_2, 0:r655_4 +# 655| r655_5(int) = Call[InstanceMemberFunction] : func:r655_3, this:r655_2, 0:r655_4 # 655| mu655_6(unknown) = ^CallSideEffect : ~m? # 655| v655_7(void) = ^BufferReadSideEffect[-1] : &:r655_2, ~m? # 655| mu655_8(C) = ^IndirectMayWriteSideEffect[-1] : &:r655_2 @@ -3619,7 +3619,7 @@ ir.cpp: # 659| mu659_3(int) = Store : &:r659_1, r659_2 # 663| r663_1(glval) = FieldAddress[m_b] : mu658_5 # 663| r663_2(glval) = FunctionAddress[String] : -# 663| v663_3(void) = Call : func:r663_2, this:r663_1 +# 663| v663_3(void) = Call[String] : func:r663_2, this:r663_1 # 663| mu663_4(unknown) = ^CallSideEffect : ~m? # 663| mu663_5(String) = ^IndirectMayWriteSideEffect[-1] : &:r663_1 # 660| r660_1(glval) = FieldAddress[m_c] : mu658_5 @@ -3632,7 +3632,7 @@ ir.cpp: # 662| r662_2(glval) = FunctionAddress[String] : # 662| r662_3(glval) = StringConstant["test"] : # 662| r662_4(char *) = Convert : r662_3 -# 662| v662_5(void) = Call : func:r662_2, this:r662_1, 0:r662_4 +# 662| v662_5(void) = Call[String] : func:r662_2, this:r662_1, 0:r662_4 # 662| mu662_6(unknown) = ^CallSideEffect : ~m? # 662| mu662_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r662_1 # 662| v662_8(void) = ^BufferReadSideEffect[0] : &:r662_4, ~m? @@ -3696,7 +3696,7 @@ ir.cpp: # 687| mu687_6(int &) = Store : &:r687_1, r687_5 # 688| r688_1(glval) = VariableAddress[r3] : # 688| r688_2(glval) = FunctionAddress[ReturnReference] : -# 688| r688_3(String &) = Call : func:r688_2 +# 688| r688_3(String &) = Call[ReturnReference] : func:r688_2 # 688| mu688_4(unknown) = ^CallSideEffect : ~m? # 688| r688_5(glval) = CopyValue : r688_3 # 688| r688_6(glval) = Convert : r688_5 @@ -3750,7 +3750,7 @@ ir.cpp: # 700| r700_2(..(&)(..)) = Load : &:r700_1, ~m? # 700| r700_3(..(*)(..)) = CopyValue : r700_2 # 700| r700_4(int) = Constant[5] : -# 700| r700_5(int) = Call : func:r700_3, 0:r700_4 +# 700| r700_5(int) = Call[?] : func:r700_3, 0:r700_4 # 700| mu700_6(unknown) = ^CallSideEffect : ~m? # 701| v701_1(void) = NoOp : # 697| v697_4(void) = ReturnVoid : @@ -3814,7 +3814,7 @@ ir.cpp: # 709| r709_4(int) = Load : &:r709_3, ~m? # 709| r709_5(glval) = VariableAddress[y] : # 709| r709_6(int) = Load : &:r709_5, ~m? -# 709| r709_7(int) = Call : func:r709_2, 0:r709_4, 1:r709_6 +# 709| r709_7(int) = Call[min] : func:r709_2, 0:r709_4, 1:r709_6 # 709| mu709_8(unknown) = ^CallSideEffect : ~m? # 709| mu709_9(int) = Store : &:r709_1, r709_7 # 708| r708_8(glval) = VariableAddress[#return] : @@ -3851,7 +3851,7 @@ ir.cpp: # 721| r721_2(glval) = FunctionAddress[Func] : # 721| r721_3(void *) = Constant[0] : # 721| r721_4(char) = Constant[111] : -# 721| r721_5(long) = Call : func:r721_2, 0:r721_3, 1:r721_4 +# 721| r721_5(long) = Call[Func] : func:r721_2, 0:r721_3, 1:r721_4 # 721| mu721_6(unknown) = ^CallSideEffect : ~m? # 721| v721_7(void) = ^BufferReadSideEffect[0] : &:r721_3, ~m? # 721| mu721_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r721_3 @@ -3926,7 +3926,7 @@ ir.cpp: # 731| r731_13(glval) = FunctionAddress[String] : # 731| r731_14(glval) = StringConstant["String object"] : # 731| r731_15(char *) = Convert : r731_14 -# 731| v731_16(void) = Call : func:r731_13, this:r731_11, 0:r731_15 +# 731| v731_16(void) = Call[String] : func:r731_13, this:r731_11, 0:r731_15 # 731| mu731_17(unknown) = ^CallSideEffect : ~m? # 731| mu731_18(String) = ^IndirectMayWriteSideEffect[-1] : &:r731_11 # 731| v731_19(void) = ^BufferReadSideEffect[0] : &:r731_15, ~m? @@ -3955,7 +3955,7 @@ ir.cpp: # 736| r736_3(glval) = FunctionAddress[String] : # 736| r736_4(glval) = VariableAddress[s] : # 736| r736_5(char *) = Load : &:r736_4, ~m? -# 736| v736_6(void) = Call : func:r736_3, this:r736_1, 0:r736_5 +# 736| v736_6(void) = Call[String] : func:r736_3, this:r736_1, 0:r736_5 # 736| mu736_7(unknown) = ^CallSideEffect : ~m? # 736| mu736_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r736_1 # 736| v736_9(void) = ^BufferReadSideEffect[0] : &:r736_5, ~m? @@ -4009,7 +4009,7 @@ ir.cpp: #-----| r0_5(glval) = CopyValue : r745_14 # 745| r745_15(glval) = FieldAddress[base_s] : r0_5 #-----| r0_6(String &) = CopyValue : r745_15 -# 745| r745_16(String &) = Call : func:r745_12, this:r745_11, 0:r0_6 +# 745| r745_16(String &) = Call[operator=] : func:r745_12, this:r745_11, 0:r0_6 # 745| mu745_17(unknown) = ^CallSideEffect : ~m? # 745| v745_18(void) = ^BufferReadSideEffect[-1] : &:r745_11, ~m? #-----| v0_7(void) = ^BufferReadSideEffect[0] : &:r0_6, ~m? @@ -4044,7 +4044,7 @@ ir.cpp: #-----| mu0_4(unknown) = InitializeIndirection[p#0] : &:r0_3 # 745| r745_8(glval) = FieldAddress[base_s] : mu745_5 # 745| r745_9(glval) = FunctionAddress[String] : -# 745| v745_10(void) = Call : func:r745_9, this:r745_8 +# 745| v745_10(void) = Call[String] : func:r745_9, this:r745_8 # 745| mu745_11(unknown) = ^CallSideEffect : ~m? # 745| mu745_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r745_8 # 745| v745_13(void) = NoOp : @@ -4065,7 +4065,7 @@ ir.cpp: # 748| mu748_7(Base) = InitializeIndirection[#this] : &:r748_6 # 748| r748_8(glval) = FieldAddress[base_s] : mu748_5 # 748| r748_9(glval) = FunctionAddress[String] : -# 748| v748_10(void) = Call : func:r748_9, this:r748_8 +# 748| v748_10(void) = Call[String] : func:r748_9, this:r748_8 # 748| mu748_11(unknown) = ^CallSideEffect : ~m? # 748| mu748_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r748_8 # 749| v749_1(void) = NoOp : @@ -4086,7 +4086,7 @@ ir.cpp: # 751| v751_1(void) = NoOp : # 751| r751_2(glval) = FieldAddress[base_s] : mu750_5 # 751| r751_3(glval) = FunctionAddress[~String] : -# 751| v751_4(void) = Call : func:r751_3, this:r751_2 +# 751| v751_4(void) = Call[~String] : func:r751_3, this:r751_2 # 751| mu751_5(unknown) = ^CallSideEffect : ~m? # 750| v750_8(void) = ReturnIndirection[#this] : &:r750_6, ~m? # 750| v750_9(void) = ReturnVoid : @@ -4117,7 +4117,7 @@ ir.cpp: #-----| r0_7(Base *) = ConvertToNonVirtualBase[Middle : Base] : r754_13 # 754| r754_14(glval) = CopyValue : r0_7 #-----| r0_8(Base &) = CopyValue : r754_14 -# 754| r754_15(Base &) = Call : func:r754_10, this:r0_5, 0:r0_8 +# 754| r754_15(Base &) = Call[operator=] : func:r754_10, this:r0_5, 0:r0_8 # 754| mu754_16(unknown) = ^CallSideEffect : ~m? #-----| v0_9(void) = ^BufferReadSideEffect[-1] : &:r0_5, ~m? #-----| v0_10(void) = ^BufferReadSideEffect[0] : &:r0_8, ~m? @@ -4134,7 +4134,7 @@ ir.cpp: #-----| r0_14(glval) = CopyValue : r754_23 # 754| r754_24(glval) = FieldAddress[middle_s] : r0_14 #-----| r0_15(String &) = CopyValue : r754_24 -# 754| r754_25(String &) = Call : func:r754_21, this:r754_20, 0:r0_15 +# 754| r754_25(String &) = Call[operator=] : func:r754_21, this:r754_20, 0:r0_15 # 754| mu754_26(unknown) = ^CallSideEffect : ~m? # 754| v754_27(void) = ^BufferReadSideEffect[-1] : &:r754_20, ~m? #-----| v0_16(void) = ^BufferReadSideEffect[0] : &:r0_15, ~m? @@ -4165,12 +4165,12 @@ ir.cpp: # 757| mu757_7(Middle) = InitializeIndirection[#this] : &:r757_6 # 757| r757_8(glval) = ConvertToNonVirtualBase[Middle : Base] : mu757_5 # 757| r757_9(glval) = FunctionAddress[Base] : -# 757| v757_10(void) = Call : func:r757_9, this:r757_8 +# 757| v757_10(void) = Call[Base] : func:r757_9, this:r757_8 # 757| mu757_11(unknown) = ^CallSideEffect : ~m? # 757| mu757_12(Base) = ^IndirectMayWriteSideEffect[-1] : &:r757_8 # 757| r757_13(glval) = FieldAddress[middle_s] : mu757_5 # 757| r757_14(glval) = FunctionAddress[String] : -# 757| v757_15(void) = Call : func:r757_14, this:r757_13 +# 757| v757_15(void) = Call[String] : func:r757_14, this:r757_13 # 757| mu757_16(unknown) = ^CallSideEffect : ~m? # 757| mu757_17(String) = ^IndirectMayWriteSideEffect[-1] : &:r757_13 # 758| v758_1(void) = NoOp : @@ -4191,11 +4191,11 @@ ir.cpp: # 760| v760_1(void) = NoOp : # 760| r760_2(glval) = FieldAddress[middle_s] : mu759_5 # 760| r760_3(glval) = FunctionAddress[~String] : -# 760| v760_4(void) = Call : func:r760_3, this:r760_2 +# 760| v760_4(void) = Call[~String] : func:r760_3, this:r760_2 # 760| mu760_5(unknown) = ^CallSideEffect : ~m? # 760| r760_6(glval) = ConvertToNonVirtualBase[Middle : Base] : mu759_5 # 760| r760_7(glval) = FunctionAddress[~Base] : -# 760| v760_8(void) = Call : func:r760_7, this:r760_6 +# 760| v760_8(void) = Call[~Base] : func:r760_7, this:r760_6 # 760| mu760_9(unknown) = ^CallSideEffect : ~m? # 759| v759_8(void) = ReturnIndirection[#this] : &:r759_6, ~m? # 759| v759_9(void) = ReturnVoid : @@ -4226,7 +4226,7 @@ ir.cpp: #-----| r0_7(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r763_13 # 763| r763_14(glval) = CopyValue : r0_7 #-----| r0_8(Middle &) = CopyValue : r763_14 -# 763| r763_15(Middle &) = Call : func:r763_10, this:r0_5, 0:r0_8 +# 763| r763_15(Middle &) = Call[operator=] : func:r763_10, this:r0_5, 0:r0_8 # 763| mu763_16(unknown) = ^CallSideEffect : ~m? #-----| v0_9(void) = ^BufferReadSideEffect[-1] : &:r0_5, ~m? #-----| v0_10(void) = ^BufferReadSideEffect[0] : &:r0_8, ~m? @@ -4243,7 +4243,7 @@ ir.cpp: #-----| r0_14(glval) = CopyValue : r763_23 # 763| r763_24(glval) = FieldAddress[derived_s] : r0_14 #-----| r0_15(String &) = CopyValue : r763_24 -# 763| r763_25(String &) = Call : func:r763_21, this:r763_20, 0:r0_15 +# 763| r763_25(String &) = Call[operator=] : func:r763_21, this:r763_20, 0:r0_15 # 763| mu763_26(unknown) = ^CallSideEffect : ~m? # 763| v763_27(void) = ^BufferReadSideEffect[-1] : &:r763_20, ~m? #-----| v0_16(void) = ^BufferReadSideEffect[0] : &:r0_15, ~m? @@ -4274,12 +4274,12 @@ ir.cpp: # 766| mu766_7(Derived) = InitializeIndirection[#this] : &:r766_6 # 766| r766_8(glval) = ConvertToNonVirtualBase[Derived : Middle] : mu766_5 # 766| r766_9(glval) = FunctionAddress[Middle] : -# 766| v766_10(void) = Call : func:r766_9, this:r766_8 +# 766| v766_10(void) = Call[Middle] : func:r766_9, this:r766_8 # 766| mu766_11(unknown) = ^CallSideEffect : ~m? # 766| mu766_12(Middle) = ^IndirectMayWriteSideEffect[-1] : &:r766_8 # 766| r766_13(glval) = FieldAddress[derived_s] : mu766_5 # 766| r766_14(glval) = FunctionAddress[String] : -# 766| v766_15(void) = Call : func:r766_14, this:r766_13 +# 766| v766_15(void) = Call[String] : func:r766_14, this:r766_13 # 766| mu766_16(unknown) = ^CallSideEffect : ~m? # 766| mu766_17(String) = ^IndirectMayWriteSideEffect[-1] : &:r766_13 # 767| v767_1(void) = NoOp : @@ -4300,11 +4300,11 @@ ir.cpp: # 769| v769_1(void) = NoOp : # 769| r769_2(glval) = FieldAddress[derived_s] : mu768_5 # 769| r769_3(glval) = FunctionAddress[~String] : -# 769| v769_4(void) = Call : func:r769_3, this:r769_2 +# 769| v769_4(void) = Call[~String] : func:r769_3, this:r769_2 # 769| mu769_5(unknown) = ^CallSideEffect : ~m? # 769| r769_6(glval) = ConvertToNonVirtualBase[Derived : Middle] : mu768_5 # 769| r769_7(glval) = FunctionAddress[~Middle] : -# 769| v769_8(void) = Call : func:r769_7, this:r769_6 +# 769| v769_8(void) = Call[~Middle] : func:r769_7, this:r769_6 # 769| mu769_9(unknown) = ^CallSideEffect : ~m? # 768| v768_8(void) = ReturnIndirection[#this] : &:r768_6, ~m? # 768| v768_9(void) = ReturnVoid : @@ -4322,12 +4322,12 @@ ir.cpp: # 775| mu775_7(MiddleVB1) = InitializeIndirection[#this] : &:r775_6 # 775| r775_8(glval) = ConvertToNonVirtualBase[MiddleVB1 : Base] : mu775_5 # 775| r775_9(glval) = FunctionAddress[Base] : -# 775| v775_10(void) = Call : func:r775_9, this:r775_8 +# 775| v775_10(void) = Call[Base] : func:r775_9, this:r775_8 # 775| mu775_11(unknown) = ^CallSideEffect : ~m? # 775| mu775_12(Base) = ^IndirectMayWriteSideEffect[-1] : &:r775_8 # 775| r775_13(glval) = FieldAddress[middlevb1_s] : mu775_5 # 775| r775_14(glval) = FunctionAddress[String] : -# 775| v775_15(void) = Call : func:r775_14, this:r775_13 +# 775| v775_15(void) = Call[String] : func:r775_14, this:r775_13 # 775| mu775_16(unknown) = ^CallSideEffect : ~m? # 775| mu775_17(String) = ^IndirectMayWriteSideEffect[-1] : &:r775_13 # 776| v776_1(void) = NoOp : @@ -4348,11 +4348,11 @@ ir.cpp: # 778| v778_1(void) = NoOp : # 778| r778_2(glval) = FieldAddress[middlevb1_s] : mu777_5 # 778| r778_3(glval) = FunctionAddress[~String] : -# 778| v778_4(void) = Call : func:r778_3, this:r778_2 +# 778| v778_4(void) = Call[~String] : func:r778_3, this:r778_2 # 778| mu778_5(unknown) = ^CallSideEffect : ~m? # 778| r778_6(glval) = ConvertToNonVirtualBase[MiddleVB1 : Base] : mu777_5 # 778| r778_7(glval) = FunctionAddress[~Base] : -# 778| v778_8(void) = Call : func:r778_7, this:r778_6 +# 778| v778_8(void) = Call[~Base] : func:r778_7, this:r778_6 # 778| mu778_9(unknown) = ^CallSideEffect : ~m? # 777| v777_8(void) = ReturnIndirection[#this] : &:r777_6, ~m? # 777| v777_9(void) = ReturnVoid : @@ -4370,12 +4370,12 @@ ir.cpp: # 784| mu784_7(MiddleVB2) = InitializeIndirection[#this] : &:r784_6 # 784| r784_8(glval) = ConvertToNonVirtualBase[MiddleVB2 : Base] : mu784_5 # 784| r784_9(glval) = FunctionAddress[Base] : -# 784| v784_10(void) = Call : func:r784_9, this:r784_8 +# 784| v784_10(void) = Call[Base] : func:r784_9, this:r784_8 # 784| mu784_11(unknown) = ^CallSideEffect : ~m? # 784| mu784_12(Base) = ^IndirectMayWriteSideEffect[-1] : &:r784_8 # 784| r784_13(glval) = FieldAddress[middlevb2_s] : mu784_5 # 784| r784_14(glval) = FunctionAddress[String] : -# 784| v784_15(void) = Call : func:r784_14, this:r784_13 +# 784| v784_15(void) = Call[String] : func:r784_14, this:r784_13 # 784| mu784_16(unknown) = ^CallSideEffect : ~m? # 784| mu784_17(String) = ^IndirectMayWriteSideEffect[-1] : &:r784_13 # 785| v785_1(void) = NoOp : @@ -4396,11 +4396,11 @@ ir.cpp: # 787| v787_1(void) = NoOp : # 787| r787_2(glval) = FieldAddress[middlevb2_s] : mu786_5 # 787| r787_3(glval) = FunctionAddress[~String] : -# 787| v787_4(void) = Call : func:r787_3, this:r787_2 +# 787| v787_4(void) = Call[~String] : func:r787_3, this:r787_2 # 787| mu787_5(unknown) = ^CallSideEffect : ~m? # 787| r787_6(glval) = ConvertToNonVirtualBase[MiddleVB2 : Base] : mu786_5 # 787| r787_7(glval) = FunctionAddress[~Base] : -# 787| v787_8(void) = Call : func:r787_7, this:r787_6 +# 787| v787_8(void) = Call[~Base] : func:r787_7, this:r787_6 # 787| mu787_9(unknown) = ^CallSideEffect : ~m? # 786| v786_8(void) = ReturnIndirection[#this] : &:r786_6, ~m? # 786| v786_9(void) = ReturnVoid : @@ -4418,22 +4418,22 @@ ir.cpp: # 793| mu793_7(DerivedVB) = InitializeIndirection[#this] : &:r793_6 # 793| r793_8(glval) = ConvertToNonVirtualBase[DerivedVB : Base] : mu793_5 # 793| r793_9(glval) = FunctionAddress[Base] : -# 793| v793_10(void) = Call : func:r793_9, this:r793_8 +# 793| v793_10(void) = Call[Base] : func:r793_9, this:r793_8 # 793| mu793_11(unknown) = ^CallSideEffect : ~m? # 793| mu793_12(Base) = ^IndirectMayWriteSideEffect[-1] : &:r793_8 # 793| r793_13(glval) = ConvertToNonVirtualBase[DerivedVB : MiddleVB1] : mu793_5 # 793| r793_14(glval) = FunctionAddress[MiddleVB1] : -# 793| v793_15(void) = Call : func:r793_14, this:r793_13 +# 793| v793_15(void) = Call[MiddleVB1] : func:r793_14, this:r793_13 # 793| mu793_16(unknown) = ^CallSideEffect : ~m? # 793| mu793_17(MiddleVB1) = ^IndirectMayWriteSideEffect[-1] : &:r793_13 # 793| r793_18(glval) = ConvertToNonVirtualBase[DerivedVB : MiddleVB2] : mu793_5 # 793| r793_19(glval) = FunctionAddress[MiddleVB2] : -# 793| v793_20(void) = Call : func:r793_19, this:r793_18 +# 793| v793_20(void) = Call[MiddleVB2] : func:r793_19, this:r793_18 # 793| mu793_21(unknown) = ^CallSideEffect : ~m? # 793| mu793_22(MiddleVB2) = ^IndirectMayWriteSideEffect[-1] : &:r793_18 # 793| r793_23(glval) = FieldAddress[derivedvb_s] : mu793_5 # 793| r793_24(glval) = FunctionAddress[String] : -# 793| v793_25(void) = Call : func:r793_24, this:r793_23 +# 793| v793_25(void) = Call[String] : func:r793_24, this:r793_23 # 793| mu793_26(unknown) = ^CallSideEffect : ~m? # 793| mu793_27(String) = ^IndirectMayWriteSideEffect[-1] : &:r793_23 # 794| v794_1(void) = NoOp : @@ -4454,19 +4454,19 @@ ir.cpp: # 796| v796_1(void) = NoOp : # 796| r796_2(glval) = FieldAddress[derivedvb_s] : mu795_5 # 796| r796_3(glval) = FunctionAddress[~String] : -# 796| v796_4(void) = Call : func:r796_3, this:r796_2 +# 796| v796_4(void) = Call[~String] : func:r796_3, this:r796_2 # 796| mu796_5(unknown) = ^CallSideEffect : ~m? # 796| r796_6(glval) = ConvertToNonVirtualBase[DerivedVB : MiddleVB2] : mu795_5 # 796| r796_7(glval) = FunctionAddress[~MiddleVB2] : -# 796| v796_8(void) = Call : func:r796_7, this:r796_6 +# 796| v796_8(void) = Call[~MiddleVB2] : func:r796_7, this:r796_6 # 796| mu796_9(unknown) = ^CallSideEffect : ~m? # 796| r796_10(glval) = ConvertToNonVirtualBase[DerivedVB : MiddleVB1] : mu795_5 # 796| r796_11(glval) = FunctionAddress[~MiddleVB1] : -# 796| v796_12(void) = Call : func:r796_11, this:r796_10 +# 796| v796_12(void) = Call[~MiddleVB1] : func:r796_11, this:r796_10 # 796| mu796_13(unknown) = ^CallSideEffect : ~m? # 796| r796_14(glval) = ConvertToNonVirtualBase[DerivedVB : Base] : mu795_5 # 796| r796_15(glval) = FunctionAddress[~Base] : -# 796| v796_16(void) = Call : func:r796_15, this:r796_14 +# 796| v796_16(void) = Call[~Base] : func:r796_15, this:r796_14 # 796| mu796_17(unknown) = ^CallSideEffect : ~m? # 795| v795_8(void) = ReturnIndirection[#this] : &:r795_6, ~m? # 795| v795_9(void) = ReturnVoid : @@ -4481,19 +4481,19 @@ ir.cpp: # 800| r800_1(glval) = VariableAddress[b] : # 800| mu800_2(Base) = Uninitialized[b] : &:r800_1 # 800| r800_3(glval) = FunctionAddress[Base] : -# 800| v800_4(void) = Call : func:r800_3, this:r800_1 +# 800| v800_4(void) = Call[Base] : func:r800_3, this:r800_1 # 800| mu800_5(unknown) = ^CallSideEffect : ~m? # 800| mu800_6(Base) = ^IndirectMayWriteSideEffect[-1] : &:r800_1 # 801| r801_1(glval) = VariableAddress[m] : # 801| mu801_2(Middle) = Uninitialized[m] : &:r801_1 # 801| r801_3(glval) = FunctionAddress[Middle] : -# 801| v801_4(void) = Call : func:r801_3, this:r801_1 +# 801| v801_4(void) = Call[Middle] : func:r801_3, this:r801_1 # 801| mu801_5(unknown) = ^CallSideEffect : ~m? # 801| mu801_6(Middle) = ^IndirectMayWriteSideEffect[-1] : &:r801_1 # 802| r802_1(glval) = VariableAddress[d] : # 802| mu802_2(Derived) = Uninitialized[d] : &:r802_1 # 802| r802_3(glval) = FunctionAddress[Derived] : -# 802| v802_4(void) = Call : func:r802_3, this:r802_1 +# 802| v802_4(void) = Call[Derived] : func:r802_3, this:r802_1 # 802| mu802_5(unknown) = ^CallSideEffect : ~m? # 802| mu802_6(Derived) = ^IndirectMayWriteSideEffect[-1] : &:r802_1 # 804| r804_1(glval) = VariableAddress[pb] : @@ -4513,7 +4513,7 @@ ir.cpp: # 808| r808_3(glval) = VariableAddress[m] : # 808| r808_4(glval) = ConvertToNonVirtualBase[Middle : Base] : r808_3 # 808| r808_5(Base &) = CopyValue : r808_4 -# 808| r808_6(Base &) = Call : func:r808_2, this:r808_1, 0:r808_5 +# 808| r808_6(Base &) = Call[operator=] : func:r808_2, this:r808_1, 0:r808_5 # 808| mu808_7(unknown) = ^CallSideEffect : ~m? # 808| v808_8(void) = ^BufferReadSideEffect[-1] : &:r808_1, ~m? # 808| v808_9(void) = ^BufferReadSideEffect[0] : &:r808_5, ~m? @@ -4528,14 +4528,14 @@ ir.cpp: # 809| r809_6(glval) = VariableAddress[m] : # 809| r809_7(glval) = ConvertToNonVirtualBase[Middle : Base] : r809_6 # 809| r809_8(Base &) = CopyValue : r809_7 -# 809| v809_9(void) = Call : func:r809_5, this:r809_3, 0:r809_8 +# 809| v809_9(void) = Call[Base] : func:r809_5, this:r809_3, 0:r809_8 # 809| mu809_10(unknown) = ^CallSideEffect : ~m? # 809| mu809_11(Base) = ^IndirectMayWriteSideEffect[-1] : &:r809_3 # 809| v809_12(void) = ^BufferReadSideEffect[0] : &:r809_8, ~m? # 809| mu809_13(unknown) = ^BufferMayWriteSideEffect[0] : &:r809_8 # 809| r809_14(glval) = Convert : r809_3 # 809| r809_15(Base &) = CopyValue : r809_14 -# 809| r809_16(Base &) = Call : func:r809_2, this:r809_1, 0:r809_15 +# 809| r809_16(Base &) = Call[operator=] : func:r809_2, this:r809_1, 0:r809_15 # 809| mu809_17(unknown) = ^CallSideEffect : ~m? # 809| v809_18(void) = ^BufferReadSideEffect[-1] : &:r809_1, ~m? # 809| v809_19(void) = ^BufferReadSideEffect[0] : &:r809_15, ~m? @@ -4550,14 +4550,14 @@ ir.cpp: # 810| r810_6(glval) = VariableAddress[m] : # 810| r810_7(glval) = ConvertToNonVirtualBase[Middle : Base] : r810_6 # 810| r810_8(Base &) = CopyValue : r810_7 -# 810| v810_9(void) = Call : func:r810_5, this:r810_3, 0:r810_8 +# 810| v810_9(void) = Call[Base] : func:r810_5, this:r810_3, 0:r810_8 # 810| mu810_10(unknown) = ^CallSideEffect : ~m? # 810| mu810_11(Base) = ^IndirectMayWriteSideEffect[-1] : &:r810_3 # 810| v810_12(void) = ^BufferReadSideEffect[0] : &:r810_8, ~m? # 810| mu810_13(unknown) = ^BufferMayWriteSideEffect[0] : &:r810_8 # 810| r810_14(glval) = Convert : r810_3 # 810| r810_15(Base &) = CopyValue : r810_14 -# 810| r810_16(Base &) = Call : func:r810_2, this:r810_1, 0:r810_15 +# 810| r810_16(Base &) = Call[operator=] : func:r810_2, this:r810_1, 0:r810_15 # 810| mu810_17(unknown) = ^CallSideEffect : ~m? # 810| v810_18(void) = ^BufferReadSideEffect[-1] : &:r810_1, ~m? # 810| v810_19(void) = ^BufferReadSideEffect[0] : &:r810_15, ~m? @@ -4590,7 +4590,7 @@ ir.cpp: # 816| r816_4(glval) = ConvertToDerived[Middle : Base] : r816_3 # 816| r816_5(glval) = Convert : r816_4 # 816| r816_6(Middle &) = CopyValue : r816_5 -# 816| r816_7(Middle &) = Call : func:r816_2, this:r816_1, 0:r816_6 +# 816| r816_7(Middle &) = Call[operator=] : func:r816_2, this:r816_1, 0:r816_6 # 816| mu816_8(unknown) = ^CallSideEffect : ~m? # 816| v816_9(void) = ^BufferReadSideEffect[-1] : &:r816_1, ~m? # 816| v816_10(void) = ^BufferReadSideEffect[0] : &:r816_6, ~m? @@ -4603,7 +4603,7 @@ ir.cpp: # 817| r817_4(glval) = ConvertToDerived[Middle : Base] : r817_3 # 817| r817_5(glval) = Convert : r817_4 # 817| r817_6(Middle &) = CopyValue : r817_5 -# 817| r817_7(Middle &) = Call : func:r817_2, this:r817_1, 0:r817_6 +# 817| r817_7(Middle &) = Call[operator=] : func:r817_2, this:r817_1, 0:r817_6 # 817| mu817_8(unknown) = ^CallSideEffect : ~m? # 817| v817_9(void) = ^BufferReadSideEffect[-1] : &:r817_1, ~m? # 817| v817_10(void) = ^BufferReadSideEffect[0] : &:r817_6, ~m? @@ -4631,7 +4631,7 @@ ir.cpp: # 822| r822_4(glval) = ConvertToNonVirtualBase[Derived : Middle] : r822_3 # 822| r822_5(glval) = ConvertToNonVirtualBase[Middle : Base] : r822_4 # 822| r822_6(Base &) = CopyValue : r822_5 -# 822| r822_7(Base &) = Call : func:r822_2, this:r822_1, 0:r822_6 +# 822| r822_7(Base &) = Call[operator=] : func:r822_2, this:r822_1, 0:r822_6 # 822| mu822_8(unknown) = ^CallSideEffect : ~m? # 822| v822_9(void) = ^BufferReadSideEffect[-1] : &:r822_1, ~m? # 822| v822_10(void) = ^BufferReadSideEffect[0] : &:r822_6, ~m? @@ -4647,14 +4647,14 @@ ir.cpp: # 823| r823_7(glval) = ConvertToNonVirtualBase[Derived : Middle] : r823_6 # 823| r823_8(glval) = ConvertToNonVirtualBase[Middle : Base] : r823_7 # 823| r823_9(Base &) = CopyValue : r823_8 -# 823| v823_10(void) = Call : func:r823_5, this:r823_3, 0:r823_9 +# 823| v823_10(void) = Call[Base] : func:r823_5, this:r823_3, 0:r823_9 # 823| mu823_11(unknown) = ^CallSideEffect : ~m? # 823| mu823_12(Base) = ^IndirectMayWriteSideEffect[-1] : &:r823_3 # 823| v823_13(void) = ^BufferReadSideEffect[0] : &:r823_9, ~m? # 823| mu823_14(unknown) = ^BufferMayWriteSideEffect[0] : &:r823_9 # 823| r823_15(glval) = Convert : r823_3 # 823| r823_16(Base &) = CopyValue : r823_15 -# 823| r823_17(Base &) = Call : func:r823_2, this:r823_1, 0:r823_16 +# 823| r823_17(Base &) = Call[operator=] : func:r823_2, this:r823_1, 0:r823_16 # 823| mu823_18(unknown) = ^CallSideEffect : ~m? # 823| v823_19(void) = ^BufferReadSideEffect[-1] : &:r823_1, ~m? # 823| v823_20(void) = ^BufferReadSideEffect[0] : &:r823_16, ~m? @@ -4670,14 +4670,14 @@ ir.cpp: # 824| r824_7(glval) = ConvertToNonVirtualBase[Derived : Middle] : r824_6 # 824| r824_8(glval) = ConvertToNonVirtualBase[Middle : Base] : r824_7 # 824| r824_9(Base &) = CopyValue : r824_8 -# 824| v824_10(void) = Call : func:r824_5, this:r824_3, 0:r824_9 +# 824| v824_10(void) = Call[Base] : func:r824_5, this:r824_3, 0:r824_9 # 824| mu824_11(unknown) = ^CallSideEffect : ~m? # 824| mu824_12(Base) = ^IndirectMayWriteSideEffect[-1] : &:r824_3 # 824| v824_13(void) = ^BufferReadSideEffect[0] : &:r824_9, ~m? # 824| mu824_14(unknown) = ^BufferMayWriteSideEffect[0] : &:r824_9 # 824| r824_15(glval) = Convert : r824_3 # 824| r824_16(Base &) = CopyValue : r824_15 -# 824| r824_17(Base &) = Call : func:r824_2, this:r824_1, 0:r824_16 +# 824| r824_17(Base &) = Call[operator=] : func:r824_2, this:r824_1, 0:r824_16 # 824| mu824_18(unknown) = ^CallSideEffect : ~m? # 824| v824_19(void) = ^BufferReadSideEffect[-1] : &:r824_1, ~m? # 824| v824_20(void) = ^BufferReadSideEffect[0] : &:r824_16, ~m? @@ -4714,7 +4714,7 @@ ir.cpp: # 830| r830_5(glval) = ConvertToDerived[Derived : Middle] : r830_4 # 830| r830_6(glval) = Convert : r830_5 # 830| r830_7(Derived &) = CopyValue : r830_6 -# 830| r830_8(Derived &) = Call : func:r830_2, this:r830_1, 0:r830_7 +# 830| r830_8(Derived &) = Call[operator=] : func:r830_2, this:r830_1, 0:r830_7 # 830| mu830_9(unknown) = ^CallSideEffect : ~m? # 830| v830_10(void) = ^BufferReadSideEffect[-1] : &:r830_1, ~m? # 830| v830_11(void) = ^BufferReadSideEffect[0] : &:r830_7, ~m? @@ -4728,7 +4728,7 @@ ir.cpp: # 831| r831_5(glval) = ConvertToDerived[Derived : Middle] : r831_4 # 831| r831_6(glval) = Convert : r831_5 # 831| r831_7(Derived &) = CopyValue : r831_6 -# 831| r831_8(Derived &) = Call : func:r831_2, this:r831_1, 0:r831_7 +# 831| r831_8(Derived &) = Call[operator=] : func:r831_2, this:r831_1, 0:r831_7 # 831| mu831_9(unknown) = ^CallSideEffect : ~m? # 831| v831_10(void) = ^BufferReadSideEffect[-1] : &:r831_1, ~m? # 831| v831_11(void) = ^BufferReadSideEffect[0] : &:r831_7, ~m? @@ -4799,7 +4799,7 @@ ir.cpp: # 846| mu846_7(PolymorphicDerived) = InitializeIndirection[#this] : &:r846_6 # 846| r846_8(glval) = ConvertToNonVirtualBase[PolymorphicDerived : PolymorphicBase] : mu846_5 # 846| r846_9(glval) = FunctionAddress[PolymorphicBase] : -# 846| v846_10(void) = Call : func:r846_9, this:r846_8 +# 846| v846_10(void) = Call[PolymorphicBase] : func:r846_9, this:r846_8 # 846| mu846_11(unknown) = ^CallSideEffect : ~m? # 846| mu846_12(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r846_8 # 846| v846_13(void) = NoOp : @@ -4820,7 +4820,7 @@ ir.cpp: #-----| v0_1(void) = NoOp : # 846| r846_8(glval) = ConvertToNonVirtualBase[PolymorphicDerived : PolymorphicBase] : mu846_5 # 846| r846_9(glval) = FunctionAddress[~PolymorphicBase] : -# 846| v846_10(void) = Call : func:r846_9, this:r846_8 +# 846| v846_10(void) = Call[~PolymorphicBase] : func:r846_9, this:r846_8 # 846| mu846_11(unknown) = ^CallSideEffect : ~m? # 846| v846_12(void) = ReturnIndirection[#this] : &:r846_6, ~m? # 846| v846_13(void) = ReturnVoid : @@ -4833,23 +4833,17 @@ ir.cpp: # 849| mu849_2(unknown) = AliasedDefinition : # 849| mu849_3(unknown) = InitializeNonLocal : # 850| r850_1(glval) = VariableAddress[b] : -#-----| r0_1(glval) = VariableAddress[#temp0:0] : -#-----| mu0_2(PolymorphicBase) = Uninitialized[#temp0:0] : &:r0_1 -#-----| r0_3(glval) = FunctionAddress[PolymorphicBase] : -#-----| v0_4(void) = Call : func:r0_3, this:r0_1 -#-----| mu0_5(unknown) = ^CallSideEffect : ~m? -#-----| mu0_6(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r0_1 -#-----| r0_7(PolymorphicBase) = Load : &:r0_1, ~m? -#-----| mu0_8(PolymorphicBase) = Store : &:r850_1, r0_7 +# 850| mu850_2(PolymorphicBase) = Uninitialized[b] : &:r850_1 +# 850| r850_3(glval) = FunctionAddress[PolymorphicBase] : +# 850| v850_4(void) = Call[PolymorphicBase] : func:r850_3, this:r850_1 +# 850| mu850_5(unknown) = ^CallSideEffect : ~m? +# 850| mu850_6(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r850_1 # 851| r851_1(glval) = VariableAddress[d] : -#-----| r0_9(glval) = VariableAddress[#temp0:0] : -#-----| mu0_10(PolymorphicDerived) = Uninitialized[#temp0:0] : &:r0_9 -#-----| r0_11(glval) = FunctionAddress[PolymorphicDerived] : -#-----| v0_12(void) = Call : func:r0_11, this:r0_9 -#-----| mu0_13(unknown) = ^CallSideEffect : ~m? -#-----| mu0_14(PolymorphicDerived) = ^IndirectMayWriteSideEffect[-1] : &:r0_9 -#-----| r0_15(PolymorphicDerived) = Load : &:r0_9, ~m? -#-----| mu0_16(PolymorphicDerived) = Store : &:r851_1, r0_15 +# 851| mu851_2(PolymorphicDerived) = Uninitialized[d] : &:r851_1 +# 851| r851_3(glval) = FunctionAddress[PolymorphicDerived] : +# 851| v851_4(void) = Call[PolymorphicDerived] : func:r851_3, this:r851_1 +# 851| mu851_5(unknown) = ^CallSideEffect : ~m? +# 851| mu851_6(PolymorphicDerived) = ^IndirectMayWriteSideEffect[-1] : &:r851_1 # 853| r853_1(glval) = VariableAddress[pb] : # 853| r853_2(glval) = VariableAddress[b] : # 853| r853_3(PolymorphicBase *) = CopyValue : r853_2 @@ -4905,7 +4899,7 @@ ir.cpp: # 868| r868_1(glval) = FunctionAddress[String] : # 868| r868_2(glval) = StringConstant[""] : # 868| r868_3(char *) = Convert : r868_2 -# 868| v868_4(void) = Call : func:r868_1, this:mu867_5, 0:r868_3 +# 868| v868_4(void) = Call[String] : func:r868_1, this:mu867_5, 0:r868_3 # 868| mu868_5(unknown) = ^CallSideEffect : ~m? # 868| mu868_6(String) = ^IndirectMayWriteSideEffect[-1] : &:mu867_5 # 868| v868_7(void) = ^BufferReadSideEffect[0] : &:r868_3, ~m? @@ -5096,7 +5090,7 @@ ir.cpp: # 905| r905_3(int) = Load : &:r905_2, ~m? # 905| r905_4(glval<__va_list_tag[1]>) = VariableAddress[args2] : # 905| r905_5(__va_list_tag *) = Convert : r905_4 -# 905| v905_6(void) = Call : func:r905_1, 0:r905_3, 1:r905_5 +# 905| v905_6(void) = Call[VAListUsage] : func:r905_1, 0:r905_3, 1:r905_5 # 905| mu905_7(unknown) = ^CallSideEffect : ~m? # 905| v905_8(void) = ^BufferReadSideEffect[1] : &:r905_5, ~m? # 905| mu905_9(unknown) = ^BufferMayWriteSideEffect[1] : &:r905_5 @@ -5168,20 +5162,20 @@ ir.cpp: # 949| mu949_3(unknown) = InitializeNonLocal : # 950| r950_1(glval) = FunctionAddress[operator new] : # 950| r950_2(unsigned long) = Constant[4] : -# 950| r950_3(void *) = Call : func:r950_1, 0:r950_2 +# 950| r950_3(void *) = Call[operator new] : func:r950_1, 0:r950_2 # 950| mu950_4(unknown) = ^CallSideEffect : ~m? # 950| mu950_5(unknown) = ^InitializeDynamicAllocation : &:r950_3 # 950| r950_6(int *) = Convert : r950_3 # 951| r951_1(glval) = FunctionAddress[operator new] : # 951| r951_2(unsigned long) = Constant[4] : # 951| r951_3(float) = Constant[1.0] : -# 951| r951_4(void *) = Call : func:r951_1, 0:r951_2, 1:r951_3 +# 951| r951_4(void *) = Call[operator new] : func:r951_1, 0:r951_2, 1:r951_3 # 951| mu951_5(unknown) = ^CallSideEffect : ~m? # 951| mu951_6(unknown) = ^InitializeDynamicAllocation : &:r951_4 # 951| r951_7(int *) = Convert : r951_4 # 952| r952_1(glval) = FunctionAddress[operator new] : # 952| r952_2(unsigned long) = Constant[4] : -# 952| r952_3(void *) = Call : func:r952_1, 0:r952_2 +# 952| r952_3(void *) = Call[operator new] : func:r952_1, 0:r952_2 # 952| mu952_4(unknown) = ^CallSideEffect : ~m? # 952| mu952_5(unknown) = ^InitializeDynamicAllocation : &:r952_3 # 952| r952_6(int *) = Convert : r952_3 @@ -5189,25 +5183,25 @@ ir.cpp: # 952| mu952_8(int) = Store : &:r952_6, r952_7 # 953| r953_1(glval) = FunctionAddress[operator new] : # 953| r953_2(unsigned long) = Constant[8] : -# 953| r953_3(void *) = Call : func:r953_1, 0:r953_2 +# 953| r953_3(void *) = Call[operator new] : func:r953_1, 0:r953_2 # 953| mu953_4(unknown) = ^CallSideEffect : ~m? # 953| mu953_5(unknown) = ^InitializeDynamicAllocation : &:r953_3 # 953| r953_6(String *) = Convert : r953_3 # 953| r953_7(glval) = FunctionAddress[String] : -# 953| v953_8(void) = Call : func:r953_7, this:r953_6 +# 953| v953_8(void) = Call[String] : func:r953_7, this:r953_6 # 953| mu953_9(unknown) = ^CallSideEffect : ~m? # 953| mu953_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r953_6 # 954| r954_1(glval) = FunctionAddress[operator new] : # 954| r954_2(unsigned long) = Constant[8] : # 954| r954_3(float) = Constant[1.0] : -# 954| r954_4(void *) = Call : func:r954_1, 0:r954_2, 1:r954_3 +# 954| r954_4(void *) = Call[operator new] : func:r954_1, 0:r954_2, 1:r954_3 # 954| mu954_5(unknown) = ^CallSideEffect : ~m? # 954| mu954_6(unknown) = ^InitializeDynamicAllocation : &:r954_4 # 954| r954_7(String *) = Convert : r954_4 # 954| r954_8(glval) = FunctionAddress[String] : # 954| r954_9(glval) = StringConstant["hello"] : # 954| r954_10(char *) = Convert : r954_9 -# 954| v954_11(void) = Call : func:r954_8, this:r954_7, 0:r954_10 +# 954| v954_11(void) = Call[String] : func:r954_8, this:r954_7, 0:r954_10 # 954| mu954_12(unknown) = ^CallSideEffect : ~m? # 954| mu954_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r954_7 # 954| v954_14(void) = ^BufferReadSideEffect[0] : &:r954_10, ~m? @@ -5215,7 +5209,7 @@ ir.cpp: # 955| r955_1(glval) = FunctionAddress[operator new] : # 955| r955_2(unsigned long) = Constant[256] : # 955| r955_3(align_val_t) = Constant[128] : -# 955| r955_4(void *) = Call : func:r955_1, 0:r955_2, 1:r955_3 +# 955| r955_4(void *) = Call[operator new] : func:r955_1, 0:r955_2, 1:r955_3 # 955| mu955_5(unknown) = ^CallSideEffect : ~m? # 955| mu955_6(unknown) = ^InitializeDynamicAllocation : &:r955_4 # 955| r955_7(Overaligned *) = Convert : r955_4 @@ -5223,7 +5217,7 @@ ir.cpp: # 956| r956_2(unsigned long) = Constant[256] : # 956| r956_3(align_val_t) = Constant[128] : # 956| r956_4(float) = Constant[1.0] : -# 956| r956_5(void *) = Call : func:r956_1, 0:r956_2, 1:r956_3, 2:r956_4 +# 956| r956_5(void *) = Call[operator new] : func:r956_1, 0:r956_2, 1:r956_3, 2:r956_4 # 956| mu956_6(unknown) = ^CallSideEffect : ~m? # 956| mu956_7(unknown) = ^InitializeDynamicAllocation : &:r956_5 # 956| r956_8(Overaligned *) = Convert : r956_5 @@ -5243,7 +5237,7 @@ ir.cpp: # 959| mu959_5(int) = InitializeParameter[n] : &:r959_4 # 960| r960_1(glval) = FunctionAddress[operator new[]] : # 960| r960_2(unsigned long) = Constant[40] : -# 960| r960_3(void *) = Call : func:r960_1, 0:r960_2 +# 960| r960_3(void *) = Call[operator new[]] : func:r960_1, 0:r960_2 # 960| mu960_4(unknown) = ^CallSideEffect : ~m? # 960| mu960_5(unknown) = ^InitializeDynamicAllocation : &:r960_3 # 960| r960_6(int *) = Convert : r960_3 @@ -5253,7 +5247,7 @@ ir.cpp: # 961| r961_4(unsigned long) = Convert : r961_3 # 961| r961_5(unsigned long) = Constant[4] : # 961| r961_6(unsigned long) = Mul : r961_4, r961_5 -# 961| r961_7(void *) = Call : func:r961_1, 0:r961_6 +# 961| r961_7(void *) = Call[operator new[]] : func:r961_1, 0:r961_6 # 961| mu961_8(unknown) = ^CallSideEffect : ~m? # 961| mu961_9(unknown) = ^InitializeDynamicAllocation : &:r961_7 # 961| r961_10(int *) = Convert : r961_7 @@ -5264,7 +5258,7 @@ ir.cpp: # 962| r962_5(unsigned long) = Constant[4] : # 962| r962_6(unsigned long) = Mul : r962_4, r962_5 # 962| r962_7(float) = Constant[1.0] : -# 962| r962_8(void *) = Call : func:r962_1, 0:r962_6, 1:r962_7 +# 962| r962_8(void *) = Call[operator new[]] : func:r962_1, 0:r962_6, 1:r962_7 # 962| mu962_9(unknown) = ^CallSideEffect : ~m? # 962| mu962_10(unknown) = ^InitializeDynamicAllocation : &:r962_8 # 962| r962_11(int *) = Convert : r962_8 @@ -5274,7 +5268,7 @@ ir.cpp: # 963| r963_4(unsigned long) = Convert : r963_3 # 963| r963_5(unsigned long) = Constant[8] : # 963| r963_6(unsigned long) = Mul : r963_4, r963_5 -# 963| r963_7(void *) = Call : func:r963_1, 0:r963_6 +# 963| r963_7(void *) = Call[operator new[]] : func:r963_1, 0:r963_6 # 963| mu963_8(unknown) = ^CallSideEffect : ~m? # 963| mu963_9(unknown) = ^InitializeDynamicAllocation : &:r963_7 # 963| r963_10(String *) = Convert : r963_7 @@ -5285,7 +5279,7 @@ ir.cpp: # 964| r964_5(unsigned long) = Constant[256] : # 964| r964_6(unsigned long) = Mul : r964_4, r964_5 # 964| r964_7(align_val_t) = Constant[128] : -# 964| r964_8(void *) = Call : func:r964_1, 0:r964_6, 1:r964_7 +# 964| r964_8(void *) = Call[operator new[]] : func:r964_1, 0:r964_6, 1:r964_7 # 964| mu964_9(unknown) = ^CallSideEffect : ~m? # 964| mu964_10(unknown) = ^InitializeDynamicAllocation : &:r964_8 # 964| r964_11(Overaligned *) = Convert : r964_8 @@ -5293,7 +5287,7 @@ ir.cpp: # 965| r965_2(unsigned long) = Constant[2560] : # 965| r965_3(align_val_t) = Constant[128] : # 965| r965_4(float) = Constant[1.0] : -# 965| r965_5(void *) = Call : func:r965_1, 0:r965_2, 1:r965_3, 2:r965_4 +# 965| r965_5(void *) = Call[operator new[]] : func:r965_1, 0:r965_2, 1:r965_3, 2:r965_4 # 965| mu965_6(unknown) = ^CallSideEffect : ~m? # 965| mu965_7(unknown) = ^InitializeDynamicAllocation : &:r965_5 # 965| r965_8(Overaligned *) = Convert : r965_5 @@ -5303,7 +5297,7 @@ ir.cpp: # 966| r966_4(unsigned long) = Convert : r966_3 # 966| r966_5(unsigned long) = Constant[1] : # 966| r966_6(unsigned long) = Mul : r966_4, r966_5 -# 966| r966_7(void *) = Call : func:r966_1, 0:r966_6 +# 966| r966_7(void *) = Call[operator new[]] : func:r966_1, 0:r966_6 # 966| mu966_8(unknown) = ^CallSideEffect : ~m? # 966| mu966_9(unknown) = ^InitializeDynamicAllocation : &:r966_7 # 966| r966_10(DefaultCtorWithDefaultParam *) = Convert : r966_7 @@ -5313,7 +5307,7 @@ ir.cpp: # 967| r967_4(unsigned long) = Convert : r967_3 # 967| r967_5(unsigned long) = Constant[4] : # 967| r967_6(unsigned long) = Mul : r967_4, r967_5 -# 967| r967_7(void *) = Call : func:r967_1, 0:r967_6 +# 967| r967_7(void *) = Call[operator new[]] : func:r967_1, 0:r967_6 # 967| mu967_8(unknown) = ^CallSideEffect : ~m? # 967| mu967_9(unknown) = ^InitializeDynamicAllocation : &:r967_7 # 967| r967_10(int *) = Convert : r967_7 @@ -5536,7 +5530,7 @@ ir.cpp: # 997| r997_7(glval<..(*)(..)>) = VariableAddress[fn] : # 997| r997_8(..(*)(..)) = Load : &:r997_7, ~m? # 997| r997_9(float) = Constant[1.0] : -# 997| r997_10(int) = Call : func:r997_8, 0:r997_9 +# 997| r997_10(int) = Call[?] : func:r997_8, 0:r997_9 # 997| mu997_11(unknown) = ^CallSideEffect : ~m? # 997| r997_12(int) = Add : r997_6, r997_10 # 997| mu997_13(int) = Store : &:r997_1, r997_12 @@ -5718,7 +5712,7 @@ ir.cpp: # 1044| r1044_2(glval) = Convert : r1044_1 # 1044| r1044_3(glval) = FunctionAddress[operator()] : # 1044| r1044_4(float) = Constant[1.0] : -# 1044| r1044_5(char) = Call : func:r1044_3, this:r1044_2, 0:r1044_4 +# 1044| r1044_5(char) = Call[operator()] : func:r1044_3, this:r1044_2, 0:r1044_4 # 1044| mu1044_6(unknown) = ^CallSideEffect : ~m? # 1044| v1044_7(void) = ^BufferReadSideEffect[-1] : &:r1044_2, ~m? # 1044| mu1044_8(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1044_2 @@ -5727,7 +5721,7 @@ ir.cpp: # 1045| mu1045_3(decltype([...](...){...})) = Uninitialized[#temp1045:20] : &:r1045_2 # 1045| r1045_4(glval) = FieldAddress[s] : r1045_2 # 1045| r1045_5(glval) = FunctionAddress[String] : -# 1045| v1045_6(void) = Call : func:r1045_5, this:r1045_4 +# 1045| v1045_6(void) = Call[String] : func:r1045_5, this:r1045_4 # 1045| mu1045_7(unknown) = ^CallSideEffect : ~m? # 1045| mu1045_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r1045_4 # 1045| r1045_9(glval) = FieldAddress[x] : r1045_2 @@ -5740,7 +5734,7 @@ ir.cpp: # 1046| r1046_2(glval) = Convert : r1046_1 # 1046| r1046_3(glval) = FunctionAddress[operator()] : # 1046| r1046_4(float) = Constant[2.0] : -# 1046| r1046_5(char) = Call : func:r1046_3, this:r1046_2, 0:r1046_4 +# 1046| r1046_5(char) = Call[operator()] : func:r1046_3, this:r1046_2, 0:r1046_4 # 1046| mu1046_6(unknown) = ^CallSideEffect : ~m? # 1046| v1046_7(void) = ^BufferReadSideEffect[-1] : &:r1046_2, ~m? # 1046| mu1046_8(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1046_2 @@ -5759,7 +5753,7 @@ ir.cpp: # 1048| r1048_2(glval) = Convert : r1048_1 # 1048| r1048_3(glval) = FunctionAddress[operator()] : # 1048| r1048_4(float) = Constant[3.0] : -# 1048| r1048_5(char) = Call : func:r1048_3, this:r1048_2, 0:r1048_4 +# 1048| r1048_5(char) = Call[operator()] : func:r1048_3, this:r1048_2, 0:r1048_4 # 1048| mu1048_6(unknown) = ^CallSideEffect : ~m? # 1048| v1048_7(void) = ^BufferReadSideEffect[-1] : &:r1048_2, ~m? # 1048| mu1048_8(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1048_2 @@ -5768,7 +5762,7 @@ ir.cpp: # 1049| mu1049_3(decltype([...](...){...})) = Uninitialized[#temp1049:29] : &:r1049_2 # 1049| r1049_4(glval) = FieldAddress[s] : r1049_2 # 1049| r1049_5(glval) = FunctionAddress[String] : -# 1049| v1049_6(void) = Call : func:r1049_5, this:r1049_4 +# 1049| v1049_6(void) = Call[String] : func:r1049_5, this:r1049_4 # 1049| mu1049_7(unknown) = ^CallSideEffect : ~m? # 1049| mu1049_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r1049_4 # 1049| r1049_9(decltype([...](...){...})) = Load : &:r1049_2, ~m? @@ -5777,7 +5771,7 @@ ir.cpp: # 1050| r1050_2(glval) = Convert : r1050_1 # 1050| r1050_3(glval) = FunctionAddress[operator()] : # 1050| r1050_4(float) = Constant[4.0] : -# 1050| r1050_5(char) = Call : func:r1050_3, this:r1050_2, 0:r1050_4 +# 1050| r1050_5(char) = Call[operator()] : func:r1050_3, this:r1050_2, 0:r1050_4 # 1050| mu1050_6(unknown) = ^CallSideEffect : ~m? # 1050| v1050_7(void) = ^BufferReadSideEffect[-1] : &:r1050_2, ~m? # 1050| mu1050_8(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1050_2 @@ -5800,7 +5794,7 @@ ir.cpp: # 1052| r1052_2(glval) = Convert : r1052_1 # 1052| r1052_3(glval) = FunctionAddress[operator()] : # 1052| r1052_4(float) = Constant[5.0] : -# 1052| r1052_5(char) = Call : func:r1052_3, this:r1052_2, 0:r1052_4 +# 1052| r1052_5(char) = Call[operator()] : func:r1052_3, this:r1052_2, 0:r1052_4 # 1052| mu1052_6(unknown) = ^CallSideEffect : ~m? # 1052| v1052_7(void) = ^BufferReadSideEffect[-1] : &:r1052_2, ~m? # 1052| mu1052_8(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1052_2 @@ -5839,7 +5833,7 @@ ir.cpp: # 1055| r1055_2(glval) = Convert : r1055_1 # 1055| r1055_3(glval) = FunctionAddress[operator()] : # 1055| r1055_4(float) = Constant[6.0] : -# 1055| r1055_5(char) = Call : func:r1055_3, this:r1055_2, 0:r1055_4 +# 1055| r1055_5(char) = Call[operator()] : func:r1055_3, this:r1055_2, 0:r1055_4 # 1055| mu1055_6(unknown) = ^CallSideEffect : ~m? # 1055| v1055_7(void) = ^BufferReadSideEffect[-1] : &:r1055_2, ~m? # 1055| mu1055_8(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1055_2 @@ -5905,7 +5899,7 @@ ir.cpp: # 1043| r1043_14(String &) = Load : &:r1043_13, ~m? # 1043| r1043_15(glval) = CopyValue : r1043_14 # 1043| r1043_16(glval) = FunctionAddress[c_str] : -# 1043| r1043_17(char *) = Call : func:r1043_16, this:r1043_15 +# 1043| r1043_17(char *) = Call[c_str] : func:r1043_16, this:r1043_15 # 1043| mu1043_18(unknown) = ^CallSideEffect : ~m? # 1043| v1043_19(void) = ^BufferReadSideEffect[-1] : &:r1043_15, ~m? # 1043| mu1043_20(String) = ^IndirectMayWriteSideEffect[-1] : &:r1043_15 @@ -5935,7 +5929,7 @@ ir.cpp: #-----| v0_1(void) = NoOp : # 1045| r1045_8(glval) = FieldAddress[s] : mu1045_5 # 1045| r1045_9(glval) = FunctionAddress[~String] : -# 1045| v1045_10(void) = Call : func:r1045_9, this:r1045_8 +# 1045| v1045_10(void) = Call[~String] : func:r1045_9, this:r1045_8 # 1045| mu1045_11(unknown) = ^CallSideEffect : ~m? # 1045| v1045_12(void) = ReturnIndirection[#this] : &:r1045_6, ~m? # 1045| v1045_13(void) = ReturnVoid : @@ -5958,7 +5952,7 @@ ir.cpp: # 1045| r1045_12(lambda [] type at line 1045, col. 21 *) = Load : &:r1045_11, ~m? # 1045| r1045_13(glval) = FieldAddress[s] : r1045_12 # 1045| r1045_14(glval) = FunctionAddress[c_str] : -# 1045| r1045_15(char *) = Call : func:r1045_14, this:r1045_13 +# 1045| r1045_15(char *) = Call[c_str] : func:r1045_14, this:r1045_13 # 1045| mu1045_16(unknown) = ^CallSideEffect : ~m? # 1045| v1045_17(void) = ^BufferReadSideEffect[-1] : &:r1045_13, ~m? # 1045| mu1045_18(String) = ^IndirectMayWriteSideEffect[-1] : &:r1045_13 @@ -5993,7 +5987,7 @@ ir.cpp: # 1047| r1047_14(String &) = Load : &:r1047_13, ~m? # 1047| r1047_15(glval) = CopyValue : r1047_14 # 1047| r1047_16(glval) = FunctionAddress[c_str] : -# 1047| r1047_17(char *) = Call : func:r1047_16, this:r1047_15 +# 1047| r1047_17(char *) = Call[c_str] : func:r1047_16, this:r1047_15 # 1047| mu1047_18(unknown) = ^CallSideEffect : ~m? # 1047| v1047_19(void) = ^BufferReadSideEffect[-1] : &:r1047_15, ~m? # 1047| mu1047_20(String) = ^IndirectMayWriteSideEffect[-1] : &:r1047_15 @@ -6019,7 +6013,7 @@ ir.cpp: #-----| v0_1(void) = NoOp : # 1049| r1049_8(glval) = FieldAddress[s] : mu1049_5 # 1049| r1049_9(glval) = FunctionAddress[~String] : -# 1049| v1049_10(void) = Call : func:r1049_9, this:r1049_8 +# 1049| v1049_10(void) = Call[~String] : func:r1049_9, this:r1049_8 # 1049| mu1049_11(unknown) = ^CallSideEffect : ~m? # 1049| v1049_12(void) = ReturnIndirection[#this] : &:r1049_6, ~m? # 1049| v1049_13(void) = ReturnVoid : @@ -6042,7 +6036,7 @@ ir.cpp: # 1049| r1049_12(lambda [] type at line 1049, col. 30 *) = Load : &:r1049_11, ~m? # 1049| r1049_13(glval) = FieldAddress[s] : r1049_12 # 1049| r1049_14(glval) = FunctionAddress[c_str] : -# 1049| r1049_15(char *) = Call : func:r1049_14, this:r1049_13 +# 1049| r1049_15(char *) = Call[c_str] : func:r1049_14, this:r1049_13 # 1049| mu1049_16(unknown) = ^CallSideEffect : ~m? # 1049| v1049_17(void) = ^BufferReadSideEffect[-1] : &:r1049_13, ~m? # 1049| mu1049_18(String) = ^IndirectMayWriteSideEffect[-1] : &:r1049_13 @@ -6074,7 +6068,7 @@ ir.cpp: # 1051| r1051_14(String &) = Load : &:r1051_13, ~m? # 1051| r1051_15(glval) = CopyValue : r1051_14 # 1051| r1051_16(glval) = FunctionAddress[c_str] : -# 1051| r1051_17(char *) = Call : func:r1051_16, this:r1051_15 +# 1051| r1051_17(char *) = Call[c_str] : func:r1051_16, this:r1051_15 # 1051| mu1051_18(unknown) = ^CallSideEffect : ~m? # 1051| v1051_19(void) = ^BufferReadSideEffect[-1] : &:r1051_15, ~m? # 1051| mu1051_20(String) = ^IndirectMayWriteSideEffect[-1] : &:r1051_15 @@ -6109,7 +6103,7 @@ ir.cpp: # 1054| r1054_14(String &) = Load : &:r1054_13, ~m? # 1054| r1054_15(glval) = CopyValue : r1054_14 # 1054| r1054_16(glval) = FunctionAddress[c_str] : -# 1054| r1054_17(char *) = Call : func:r1054_16, this:r1054_15 +# 1054| r1054_17(char *) = Call[c_str] : func:r1054_16, this:r1054_15 # 1054| mu1054_18(unknown) = ^CallSideEffect : ~m? # 1054| v1054_19(void) = ^BufferReadSideEffect[-1] : &:r1054_15, ~m? # 1054| mu1054_20(String) = ^IndirectMayWriteSideEffect[-1] : &:r1054_15 @@ -6157,7 +6151,7 @@ ir.cpp: # 1078| r1078_9(vector &) = Load : &:r1078_8, ~m? #-----| r0_1(glval>) = CopyValue : r1078_9 # 1078| r1078_10(glval) = FunctionAddress[begin] : -# 1078| r1078_11(iterator) = Call : func:r1078_10, this:r0_1 +# 1078| r1078_11(iterator) = Call[begin] : func:r1078_10, this:r0_1 # 1078| mu1078_12(unknown) = ^CallSideEffect : ~m? #-----| v0_2(void) = ^BufferReadSideEffect[-1] : &:r0_1, ~m? #-----| mu0_3(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_1 @@ -6167,7 +6161,7 @@ ir.cpp: # 1078| r1078_16(vector &) = Load : &:r1078_15, ~m? #-----| r0_4(glval>) = CopyValue : r1078_16 # 1078| r1078_17(glval) = FunctionAddress[end] : -# 1078| r1078_18(iterator) = Call : func:r1078_17, this:r0_4 +# 1078| r1078_18(iterator) = Call[end] : func:r1078_17, this:r0_4 # 1078| mu1078_19(unknown) = ^CallSideEffect : ~m? #-----| v0_5(void) = ^BufferReadSideEffect[-1] : &:r0_4, ~m? #-----| mu0_6(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_4 @@ -6180,7 +6174,7 @@ ir.cpp: # 1084| r1084_2(glval) = FunctionAddress[operator!=] : # 1084| r1084_3(glval) = VariableAddress[(__end)] : # 1084| r1084_4(iterator) = Load : &:r1084_3, ~m? -# 1084| r1084_5(bool) = Call : func:r1084_2, this:r0_7, 0:r1084_4 +# 1084| r1084_5(bool) = Call[operator!=] : func:r1084_2, this:r0_7, 0:r1084_4 # 1084| mu1084_6(unknown) = ^CallSideEffect : ~m? #-----| v0_8(void) = ^BufferReadSideEffect[-1] : &:r0_7, ~m? #-----| mu0_9(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_7 @@ -6191,7 +6185,7 @@ ir.cpp: # 1084| Block 2 # 1084| r1084_8(glval) = VariableAddress[(__begin)] : # 1084| r1084_9(glval) = FunctionAddress[operator++] : -# 1084| r1084_10(iterator &) = Call : func:r1084_9, this:r1084_8 +# 1084| r1084_10(iterator &) = Call[operator++] : func:r1084_9, this:r1084_8 # 1084| mu1084_11(unknown) = ^CallSideEffect : ~m? # 1084| v1084_12(void) = ^BufferReadSideEffect[-1] : &:r1084_8, ~m? # 1084| mu1084_13(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r1084_8 @@ -6203,7 +6197,7 @@ ir.cpp: # 1084| r1084_16(glval) = VariableAddress[(__begin)] : #-----| r0_10(glval) = Convert : r1084_16 # 1084| r1084_17(glval) = FunctionAddress[operator*] : -# 1084| r1084_18(int &) = Call : func:r1084_17, this:r0_10 +# 1084| r1084_18(int &) = Call[operator*] : func:r1084_17, this:r0_10 # 1084| mu1084_19(unknown) = ^CallSideEffect : ~m? #-----| v0_11(void) = ^BufferReadSideEffect[-1] : &:r0_10, ~m? #-----| mu0_12(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_10 @@ -6238,7 +6232,7 @@ ir.cpp: # 1078| r1078_22(glval) = FunctionAddress[operator!=] : # 1078| r1078_23(glval) = VariableAddress[(__end)] : # 1078| r1078_24(iterator) = Load : &:r1078_23, ~m? -# 1078| r1078_25(bool) = Call : func:r1078_22, this:r0_13, 0:r1078_24 +# 1078| r1078_25(bool) = Call[operator!=] : func:r1078_22, this:r0_13, 0:r1078_24 # 1078| mu1078_26(unknown) = ^CallSideEffect : ~m? #-----| v0_14(void) = ^BufferReadSideEffect[-1] : &:r0_13, ~m? #-----| mu0_15(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_13 @@ -6251,7 +6245,7 @@ ir.cpp: # 1078| r1078_29(glval) = VariableAddress[(__begin)] : #-----| r0_16(glval) = Convert : r1078_29 # 1078| r1078_30(glval) = FunctionAddress[operator*] : -# 1078| r1078_31(int &) = Call : func:r1078_30, this:r0_16 +# 1078| r1078_31(int &) = Call[operator*] : func:r1078_30, this:r0_16 # 1078| mu1078_32(unknown) = ^CallSideEffect : ~m? #-----| v0_17(void) = ^BufferReadSideEffect[-1] : &:r0_16, ~m? #-----| mu0_18(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_16 @@ -6273,7 +6267,7 @@ ir.cpp: # 1078| v1078_35(void) = NoOp : # 1078| r1078_36(glval) = VariableAddress[(__begin)] : # 1078| r1078_37(glval) = FunctionAddress[operator++] : -# 1078| r1078_38(iterator &) = Call : func:r1078_37, this:r1078_36 +# 1078| r1078_38(iterator &) = Call[operator++] : func:r1078_37, this:r1078_36 # 1078| mu1078_39(unknown) = ^CallSideEffect : ~m? # 1078| v1078_40(void) = ^BufferReadSideEffect[-1] : &:r1078_36, ~m? # 1078| mu1078_41(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r1078_36 @@ -6292,7 +6286,7 @@ ir.cpp: # 1084| r1084_32(vector &) = Load : &:r1084_31, ~m? #-----| r0_19(glval>) = CopyValue : r1084_32 # 1084| r1084_33(glval) = FunctionAddress[begin] : -# 1084| r1084_34(iterator) = Call : func:r1084_33, this:r0_19 +# 1084| r1084_34(iterator) = Call[begin] : func:r1084_33, this:r0_19 # 1084| mu1084_35(unknown) = ^CallSideEffect : ~m? #-----| v0_20(void) = ^BufferReadSideEffect[-1] : &:r0_19, ~m? #-----| mu0_21(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_19 @@ -6302,7 +6296,7 @@ ir.cpp: # 1084| r1084_39(vector &) = Load : &:r1084_38, ~m? #-----| r0_22(glval>) = CopyValue : r1084_39 # 1084| r1084_40(glval) = FunctionAddress[end] : -# 1084| r1084_41(iterator) = Call : func:r1084_40, this:r0_22 +# 1084| r1084_41(iterator) = Call[end] : func:r1084_40, this:r0_22 # 1084| mu1084_42(unknown) = ^CallSideEffect : ~m? #-----| v0_23(void) = ^BufferReadSideEffect[-1] : &:r0_22, ~m? #-----| mu0_24(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_22 @@ -6474,7 +6468,7 @@ ir.cpp: # 1149| r1149_13(glval) = FunctionAddress[String] : # 1149| r1149_14(glval) = StringConstant["String object"] : # 1149| r1149_15(char *) = Convert : r1149_14 -# 1149| v1149_16(void) = Call : func:r1149_13, this:r1149_11, 0:r1149_15 +# 1149| v1149_16(void) = Call[String] : func:r1149_13, this:r1149_11, 0:r1149_15 # 1149| mu1149_17(unknown) = ^CallSideEffect : ~m? # 1149| mu1149_18(String) = ^IndirectMayWriteSideEffect[-1] : &:r1149_11 # 1149| v1149_19(void) = ^BufferReadSideEffect[0] : &:r1149_15, ~m? @@ -6503,7 +6497,7 @@ ir.cpp: # 1154| r1154_3(glval) = FunctionAddress[String] : # 1154| r1154_4(glval) = VariableAddress[s] : # 1154| r1154_5(char *) = Load : &:r1154_4, ~m? -# 1154| v1154_6(void) = Call : func:r1154_3, this:r1154_1, 0:r1154_5 +# 1154| v1154_6(void) = Call[String] : func:r1154_3, this:r1154_1, 0:r1154_5 # 1154| mu1154_7(unknown) = ^CallSideEffect : ~m? # 1154| mu1154_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r1154_1 # 1154| v1154_9(void) = ^BufferReadSideEffect[0] : &:r1154_5, ~m? @@ -6608,7 +6602,7 @@ ir.cpp: # 1174| r1174_6(int *) = CopyValue : r1174_5 # 1174| r1174_7(void *) = Convert : r1174_6 # 1174| r1174_8(int) = Constant[4] : -# 1174| r1174_9(void *) = Call : func:r1174_1, 0:r1174_4, 1:r1174_7, 2:r1174_8 +# 1174| r1174_9(void *) = Call[memcpy] : func:r1174_1, 0:r1174_4, 1:r1174_7, 2:r1174_8 # 1174| v1174_10(void) = ^SizedBufferReadSideEffect[1] : &:r1174_7, r1174_8, ~m? # 1174| mu1174_11(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r1174_4, r1174_8 # 1175| r1175_1(glval) = VariableAddress[#return] : @@ -6630,7 +6624,7 @@ ir.cpp: # 1179| r1179_3(glval) = FunctionAddress[String] : # 1179| r1179_4(glval) = StringConstant["foo"] : # 1179| r1179_5(char *) = Convert : r1179_4 -# 1179| v1179_6(void) = Call : func:r1179_3, this:r1179_1, 0:r1179_5 +# 1179| v1179_6(void) = Call[String] : func:r1179_3, this:r1179_1, 0:r1179_5 # 1179| mu1179_7(unknown) = ^CallSideEffect : ~m? # 1179| mu1179_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r1179_1 # 1179| v1179_9(void) = ^BufferReadSideEffect[0] : &:r1179_5, ~m? @@ -6876,7 +6870,7 @@ ir.cpp: # 1242| r1242_5(glval) = FunctionAddress[String] : # 1242| r1242_6(glval) = StringConstant["static"] : # 1242| r1242_7(char *) = Convert : r1242_6 -# 1242| v1242_8(void) = Call : func:r1242_5, this:r1242_4, 0:r1242_7 +# 1242| v1242_8(void) = Call[String] : func:r1242_5, this:r1242_4, 0:r1242_7 # 1242| mu1242_9(unknown) = ^CallSideEffect : ~m? # 1242| mu1242_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r1242_4 # 1242| v1242_11(void) = ^BufferReadSideEffect[0] : &:r1242_7, ~m? @@ -6897,7 +6891,7 @@ ir.cpp: # 1243| r1243_5(glval) = FunctionAddress[String] : # 1243| r1243_6(glval) = VariableAddress[dynamic] : # 1243| r1243_7(char *) = Load : &:r1243_6, ~m? -# 1243| v1243_8(void) = Call : func:r1243_5, this:r1243_4, 0:r1243_7 +# 1243| v1243_8(void) = Call[String] : func:r1243_5, this:r1243_4, 0:r1243_7 # 1243| mu1243_9(unknown) = ^CallSideEffect : ~m? # 1243| mu1243_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r1243_4 # 1243| v1243_11(void) = ^BufferReadSideEffect[0] : &:r1243_7, ~m? @@ -6916,7 +6910,7 @@ ir.cpp: # 1241| Block 6 # 1241| r1241_4(glval) = VariableAddress[a] : #-----| r0_1(glval) = FunctionAddress[String] : -#-----| v0_2(void) = Call : func:r0_1, this:r1241_4 +#-----| v0_2(void) = Call[String] : func:r0_1, this:r1241_4 #-----| mu0_3(unknown) = ^CallSideEffect : ~m? #-----| mu0_4(String) = ^IndirectMayWriteSideEffect[-1] : &:r1241_4 # 1241| r1241_5(bool) = Constant[1] : @@ -6952,7 +6946,7 @@ ir.cpp: # 1254| r1254_4(glval) = VariableAddress[s1] : # 1254| r1254_5(char *) = Load : &:r1254_4, ~m? # 1254| r1254_6(char *) = Convert : r1254_5 -# 1254| r1254_7(char *) = Call : func:r1254_1, 0:r1254_3, 1:r1254_6 +# 1254| r1254_7(char *) = Call[strcpy] : func:r1254_1, 0:r1254_3, 1:r1254_6 # 1254| v1254_8(void) = ^BufferReadSideEffect[1] : &:r1254_6, ~m? # 1254| mu1254_9(unknown) = ^BufferMayWriteSideEffect[0] : &:r1254_3 # 1255| r1255_1(glval) = FunctionAddress[strcat] : @@ -6961,7 +6955,7 @@ ir.cpp: # 1255| r1255_4(glval) = VariableAddress[s2] : # 1255| r1255_5(char *) = Load : &:r1255_4, ~m? # 1255| r1255_6(char *) = Convert : r1255_5 -# 1255| r1255_7(char *) = Call : func:r1255_1, 0:r1255_3, 1:r1255_6 +# 1255| r1255_7(char *) = Call[strcat] : func:r1255_1, 0:r1255_3, 1:r1255_6 # 1255| v1255_8(void) = ^BufferReadSideEffect[0] : &:r1255_3, ~m? # 1255| v1255_9(void) = ^BufferReadSideEffect[1] : &:r1255_6, ~m? # 1255| mu1255_10(unknown) = ^BufferMayWriteSideEffect[0] : &:r1255_3 @@ -7009,17 +7003,17 @@ ir.cpp: # 1271| r1271_1(glval) = VariableAddress[c] : # 1271| mu1271_2(C) = Uninitialized[c] : &:r1271_1 # 1271| r1271_3(glval) = FunctionAddress[C] : -# 1271| v1271_4(void) = Call : func:r1271_3, this:r1271_1 +# 1271| v1271_4(void) = Call[C] : func:r1271_3, this:r1271_1 # 1271| mu1271_5(unknown) = ^CallSideEffect : ~m? # 1271| mu1271_6(C) = ^IndirectMayWriteSideEffect[-1] : &:r1271_1 # 1272| r1272_1(glval) = VariableAddress[c] : # 1272| r1272_2(glval) = FunctionAddress[StaticMemberFunction] : # 1272| r1272_3(int) = Constant[10] : -# 1272| r1272_4(int) = Call : func:r1272_2, 0:r1272_3 +# 1272| r1272_4(int) = Call[StaticMemberFunction] : func:r1272_2, 0:r1272_3 # 1272| mu1272_5(unknown) = ^CallSideEffect : ~m? # 1273| r1273_1(glval) = FunctionAddress[StaticMemberFunction] : # 1273| r1273_2(int) = Constant[10] : -# 1273| r1273_3(int) = Call : func:r1273_1, 0:r1273_2 +# 1273| r1273_3(int) = Call[StaticMemberFunction] : func:r1273_1, 0:r1273_2 # 1273| mu1273_4(unknown) = ^CallSideEffect : ~m? # 1275| r1275_1(glval) = VariableAddress[a] : # 1275| mu1275_2(A) = Uninitialized[a] : &:r1275_1 @@ -7029,7 +7023,7 @@ ir.cpp: # 1276| r1276_4(A *) = CopyValue : r1276_3 # 1276| r1276_5(glval) = VariableAddress[int_arg] : # 1276| r1276_6(int) = Load : &:r1276_5, ~m? -# 1276| v1276_7(void) = Call : func:r1276_2, 0:r1276_4, 1:r1276_6 +# 1276| v1276_7(void) = Call[static_member] : func:r1276_2, 0:r1276_4, 1:r1276_6 # 1276| mu1276_8(unknown) = ^CallSideEffect : ~m? # 1276| v1276_9(void) = ^BufferReadSideEffect[0] : &:r1276_4, ~m? # 1276| mu1276_10(unknown) = ^BufferMayWriteSideEffect[0] : &:r1276_4 @@ -7038,7 +7032,7 @@ ir.cpp: # 1277| r1277_3(A *) = CopyValue : r1277_2 # 1277| r1277_4(glval) = VariableAddress[int_arg] : # 1277| r1277_5(int) = Load : &:r1277_4, ~m? -# 1277| v1277_6(void) = Call : func:r1277_1, 0:r1277_3, 1:r1277_5 +# 1277| v1277_6(void) = Call[static_member] : func:r1277_1, 0:r1277_3, 1:r1277_5 # 1277| mu1277_7(unknown) = ^CallSideEffect : ~m? # 1277| v1277_8(void) = ^BufferReadSideEffect[0] : &:r1277_3, ~m? # 1277| mu1277_9(unknown) = ^BufferMayWriteSideEffect[0] : &:r1277_3 @@ -7051,7 +7045,7 @@ ir.cpp: # 1279| r1279_7(int) = Load : &:r1279_6, ~m? # 1279| r1279_8(int) = Constant[2] : # 1279| r1279_9(int) = Add : r1279_7, r1279_8 -# 1279| v1279_10(void) = Call : func:r1279_3, 0:r1279_5, 1:r1279_9 +# 1279| v1279_10(void) = Call[static_member] : func:r1279_3, 0:r1279_5, 1:r1279_9 # 1279| mu1279_11(unknown) = ^CallSideEffect : ~m? # 1279| v1279_12(void) = ^BufferReadSideEffect[0] : &:r1279_5, ~m? # 1279| mu1279_13(unknown) = ^BufferMayWriteSideEffect[0] : &:r1279_5 @@ -7062,7 +7056,7 @@ ir.cpp: # 1280| r1280_5(glval) = VariableAddress[a] : # 1280| r1280_6(A *) = CopyValue : r1280_5 # 1280| r1280_7(int) = Constant[99] : -# 1280| v1280_8(void) = Call : func:r1280_4, 0:r1280_6, 1:r1280_7 +# 1280| v1280_8(void) = Call[static_member] : func:r1280_4, 0:r1280_6, 1:r1280_7 # 1280| mu1280_9(unknown) = ^CallSideEffect : ~m? # 1280| v1280_10(void) = ^BufferReadSideEffect[0] : &:r1280_6, ~m? # 1280| mu1280_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r1280_6 @@ -7072,22 +7066,22 @@ ir.cpp: # 1281| r1281_4(glval) = VariableAddress[a_arg] : # 1281| r1281_5(A *) = Load : &:r1281_4, ~m? # 1281| r1281_6(int) = Constant[-1] : -# 1281| v1281_7(void) = Call : func:r1281_3, 0:r1281_5, 1:r1281_6 +# 1281| v1281_7(void) = Call[static_member] : func:r1281_3, 0:r1281_5, 1:r1281_6 # 1281| mu1281_8(unknown) = ^CallSideEffect : ~m? # 1281| v1281_9(void) = ^BufferReadSideEffect[0] : &:r1281_5, ~m? # 1281| mu1281_10(unknown) = ^BufferMayWriteSideEffect[0] : &:r1281_5 # 1283| r1283_1(glval) = VariableAddress[a] : # 1283| r1283_2(glval) = FunctionAddress[static_member_without_def] : -# 1283| v1283_3(void) = Call : func:r1283_2 +# 1283| v1283_3(void) = Call[static_member_without_def] : func:r1283_2 # 1283| mu1283_4(unknown) = ^CallSideEffect : ~m? # 1284| r1284_1(glval) = FunctionAddress[static_member_without_def] : -# 1284| v1284_2(void) = Call : func:r1284_1 +# 1284| v1284_2(void) = Call[static_member_without_def] : func:r1284_1 # 1284| mu1284_3(unknown) = ^CallSideEffect : ~m? # 1286| r1286_1(glval) = FunctionAddress[getAnInstanceOfA] : -# 1286| r1286_2(A *) = Call : func:r1286_1 +# 1286| r1286_2(A *) = Call[getAnInstanceOfA] : func:r1286_1 # 1286| mu1286_3(unknown) = ^CallSideEffect : ~m? # 1286| r1286_4(glval) = FunctionAddress[static_member_without_def] : -# 1286| v1286_5(void) = Call : func:r1286_4 +# 1286| v1286_5(void) = Call[static_member_without_def] : func:r1286_4 # 1286| mu1286_6(unknown) = ^CallSideEffect : ~m? # 1287| v1287_1(void) = NoOp : # 1270| v1270_10(void) = ReturnIndirection[a_arg] : &:r1270_8, ~m? @@ -7137,7 +7131,7 @@ ir.cpp: # 1296| r1296_3(int) = Load : &:r1296_2, ~m? # 1296| r1296_4(glval) = VariableAddress[y] : # 1296| r1296_5(int) = Load : &:r1296_4, ~m? -# 1296| v1296_6(void) = Call : func:r1296_1, 0:r1296_3, 1:r1296_5 +# 1296| v1296_6(void) = Call[IntegerOps] : func:r1296_1, 0:r1296_3, 1:r1296_5 # 1296| mu1296_7(unknown) = ^CallSideEffect : ~m? # 1296| v1296_8(void) = NoOp : # 1295| v1295_8(void) = ReturnVoid : @@ -7386,7 +7380,7 @@ ir.cpp: # 1314| mu1314_7(int) = InitializeParameter[y] : &:r1314_6 # 1315| r1315_1(glval) = VariableAddress[#return] : # 1315| r1315_2(glval) = FunctionAddress[predicateA] : -# 1315| r1315_3(bool) = Call : func:r1315_2 +# 1315| r1315_3(bool) = Call[predicateA] : func:r1315_2 # 1315| mu1315_4(unknown) = ^CallSideEffect : ~m? # 1315| v1315_5(void) = ConditionalBranch : r1315_3 #-----| False -> Block 3 @@ -7394,7 +7388,7 @@ ir.cpp: # 1315| Block 1 # 1315| r1315_6(glval) = FunctionAddress[predicateB] : -# 1315| r1315_7(bool) = Call : func:r1315_6 +# 1315| r1315_7(bool) = Call[predicateB] : func:r1315_6 # 1315| mu1315_8(unknown) = ^CallSideEffect : ~m? # 1315| v1315_9(void) = ConditionalBranch : r1315_7 #-----| False -> Block 3 @@ -7437,7 +7431,7 @@ ir.cpp: # 1322| r1322_3(glval) = VariableAddress[p] : # 1322| r1322_4(int *) = Load : &:r1322_3, ~m? # 1322| r1322_5(void *) = Convert : r1322_4 -# 1322| r1322_6(void *) = Call : func:r1322_1, 0:r1322_2, 1:r1322_5 +# 1322| r1322_6(void *) = Call[operator new] : func:r1322_1, 0:r1322_2, 1:r1322_5 # 1322| mu1322_7(unknown) = ^CallSideEffect : ~m? # 1322| mu1322_8(unknown) = ^InitializeDynamicAllocation : &:r1322_6 # 1322| r1322_9(int *) = Convert : r1322_6 @@ -7455,7 +7449,7 @@ ir.cpp: # 1327| r1327_1(glval) = VariableAddress[#return] : # 1327| mu1327_2(String) = Uninitialized[#return] : &:r1327_1 # 1327| r1327_3(glval) = FunctionAddress[String] : -# 1327| v1327_4(void) = Call : func:r1327_3, this:r1327_1 +# 1327| v1327_4(void) = Call[String] : func:r1327_3, this:r1327_1 # 1327| mu1327_5(unknown) = ^CallSideEffect : ~m? # 1327| mu1327_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r1327_1 # 1326| r1326_4(glval) = VariableAddress[#return] : @@ -7471,7 +7465,7 @@ ir.cpp: # 1327| r1327_1(glval) = VariableAddress[#return] : # 1327| mu1327_2(copy_constructor) = Uninitialized[#return] : &:r1327_1 # 1327| r1327_3(glval) = FunctionAddress[copy_constructor] : -# 1327| v1327_4(void) = Call : func:r1327_3, this:r1327_1 +# 1327| v1327_4(void) = Call[copy_constructor] : func:r1327_3, this:r1327_1 # 1327| mu1327_5(unknown) = ^CallSideEffect : ~m? # 1327| mu1327_6(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1327_1 # 1326| r1326_4(glval) = VariableAddress[#return] : @@ -7499,13 +7493,13 @@ ir.cpp: # 1365| mu1365_3(unknown) = InitializeNonLocal : # 1366| r1366_1(glval) = VariableAddress[s] : # 1366| r1366_2(glval) = FunctionAddress[returnValue] : -# 1366| r1366_3(String) = Call : func:r1366_2 +# 1366| r1366_3(String) = Call[returnValue] : func:r1366_2 # 1366| mu1366_4(unknown) = ^CallSideEffect : ~m? # 1366| mu1366_5(String) = Store : &:r1366_1, r1366_3 # 1367| r1367_1(glval) = VariableAddress[rs] : # 1367| r1367_2(glval) = VariableAddress[#temp1367:24] : # 1367| r1367_3(glval) = FunctionAddress[returnValue] : -# 1367| r1367_4(String) = Call : func:r1367_3 +# 1367| r1367_4(String) = Call[returnValue] : func:r1367_3 # 1367| mu1367_5(unknown) = ^CallSideEffect : ~m? # 1367| mu1367_6(String) = Store : &:r1367_2, r1367_4 # 1367| r1367_7(glval) = Convert : r1367_2 @@ -7515,7 +7509,7 @@ ir.cpp: # 1369| r1369_2(glval) = VariableAddress[s] : # 1369| r1369_3(glval) = Convert : r1369_2 # 1369| r1369_4(String &) = CopyValue : r1369_3 -# 1369| v1369_5(void) = Call : func:r1369_1, 0:r1369_4 +# 1369| v1369_5(void) = Call[acceptRef] : func:r1369_1, 0:r1369_4 # 1369| mu1369_6(unknown) = ^CallSideEffect : ~m? # 1369| v1369_7(void) = ^BufferReadSideEffect[0] : &:r1369_4, ~m? # 1369| mu1369_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r1369_4 @@ -7525,13 +7519,13 @@ ir.cpp: # 1370| r1370_4(glval) = FunctionAddress[String] : # 1370| r1370_5(glval) = StringConstant["foo"] : # 1370| r1370_6(char *) = Convert : r1370_5 -# 1370| v1370_7(void) = Call : func:r1370_4, this:r1370_2, 0:r1370_6 +# 1370| v1370_7(void) = Call[String] : func:r1370_4, this:r1370_2, 0:r1370_6 # 1370| mu1370_8(unknown) = ^CallSideEffect : ~m? # 1370| mu1370_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r1370_2 # 1370| v1370_10(void) = ^BufferReadSideEffect[0] : &:r1370_6, ~m? # 1370| mu1370_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r1370_6 # 1370| r1370_12(String &) = CopyValue : r1370_2 -# 1370| v1370_13(void) = Call : func:r1370_1, 0:r1370_12 +# 1370| v1370_13(void) = Call[acceptRef] : func:r1370_1, 0:r1370_12 # 1370| mu1370_14(unknown) = ^CallSideEffect : ~m? # 1370| v1370_15(void) = ^BufferReadSideEffect[0] : &:r1370_12, ~m? # 1370| mu1370_16(unknown) = ^BufferMayWriteSideEffect[0] : &:r1370_12 @@ -7542,54 +7536,56 @@ ir.cpp: # 1371| r1371_5(glval) = VariableAddress[s] : # 1371| r1371_6(glval) = Convert : r1371_5 # 1371| r1371_7(String &) = CopyValue : r1371_6 -# 1371| v1371_8(void) = Call : func:r1371_4, this:r1371_2, 0:r1371_7 +# 1371| v1371_8(void) = Call[String] : func:r1371_4, this:r1371_2, 0:r1371_7 # 1371| mu1371_9(unknown) = ^CallSideEffect : ~m? # 1371| mu1371_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r1371_2 # 1371| v1371_11(void) = ^BufferReadSideEffect[0] : &:r1371_7, ~m? # 1371| mu1371_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r1371_7 -# 1371| v1371_13(void) = Call : func:r1371_1, 0:r1371_2 -# 1371| mu1371_14(unknown) = ^CallSideEffect : ~m? +# 1371| r1371_13(String) = Load : &:r1371_2, ~m? +# 1371| v1371_14(void) = Call[acceptValue] : func:r1371_1, 0:r1371_13 +# 1371| mu1371_15(unknown) = ^CallSideEffect : ~m? # 1372| r1372_1(glval) = FunctionAddress[acceptValue] : # 1372| r1372_2(glval) = VariableAddress[#temp1372:25] : # 1372| mu1372_3(String) = Uninitialized[#temp1372:25] : &:r1372_2 # 1372| r1372_4(glval) = FunctionAddress[String] : # 1372| r1372_5(glval) = StringConstant["foo"] : # 1372| r1372_6(char *) = Convert : r1372_5 -# 1372| v1372_7(void) = Call : func:r1372_4, this:r1372_2, 0:r1372_6 +# 1372| v1372_7(void) = Call[String] : func:r1372_4, this:r1372_2, 0:r1372_6 # 1372| mu1372_8(unknown) = ^CallSideEffect : ~m? # 1372| mu1372_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r1372_2 # 1372| v1372_10(void) = ^BufferReadSideEffect[0] : &:r1372_6, ~m? # 1372| mu1372_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r1372_6 -# 1372| v1372_12(void) = Call : func:r1372_1, 0:r1372_2 -# 1372| mu1372_13(unknown) = ^CallSideEffect : ~m? +# 1372| r1372_12(String) = Load : &:r1372_2, ~m? +# 1372| v1372_13(void) = Call[acceptValue] : func:r1372_1, 0:r1372_12 +# 1372| mu1372_14(unknown) = ^CallSideEffect : ~m? # 1373| r1373_1(glval) = VariableAddress[#temp1373:5] : # 1373| mu1373_2(String) = Uninitialized[#temp1373:5] : &:r1373_1 # 1373| r1373_3(glval) = FunctionAddress[String] : -# 1373| v1373_4(void) = Call : func:r1373_3, this:r1373_1 +# 1373| v1373_4(void) = Call[String] : func:r1373_3, this:r1373_1 # 1373| mu1373_5(unknown) = ^CallSideEffect : ~m? # 1373| mu1373_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r1373_1 # 1373| r1373_7(String) = Load : &:r1373_1, ~m? # 1373| r1373_8(String) = Convert : r1373_7 # 1373| r1373_9(glval) = FunctionAddress[c_str] : -# 1373| r1373_10(char *) = Call : func:r1373_9, this:r1373_8 +# 1373| r1373_10(char *) = Call[c_str] : func:r1373_9, this:r1373_8 # 1373| mu1373_11(unknown) = ^CallSideEffect : ~m? # 1373| v1373_12(void) = ^BufferReadSideEffect[-1] : &:r1373_8, ~m? # 1373| mu1373_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r1373_8 # 1374| r1374_1(glval) = VariableAddress[#temp1374:5] : # 1374| r1374_2(glval) = FunctionAddress[returnValue] : -# 1374| r1374_3(String) = Call : func:r1374_2 +# 1374| r1374_3(String) = Call[returnValue] : func:r1374_2 # 1374| mu1374_4(unknown) = ^CallSideEffect : ~m? # 1374| mu1374_5(String) = Store : &:r1374_1, r1374_3 # 1374| r1374_6(String) = Load : &:r1374_1, ~m? # 1374| r1374_7(String) = Convert : r1374_6 # 1374| r1374_8(glval) = FunctionAddress[c_str] : -# 1374| r1374_9(char *) = Call : func:r1374_8, this:r1374_7 +# 1374| r1374_9(char *) = Call[c_str] : func:r1374_8, this:r1374_7 # 1374| mu1374_10(unknown) = ^CallSideEffect : ~m? # 1374| v1374_11(void) = ^BufferReadSideEffect[-1] : &:r1374_7, ~m? # 1374| mu1374_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r1374_7 # 1376| r1376_1(glval) = VariableAddress[#temp1376:5] : # 1376| r1376_2(glval) = FunctionAddress[defaultConstruct] : -# 1376| r1376_3(String) = Call : func:r1376_2 +# 1376| r1376_3(String) = Call[defaultConstruct] : func:r1376_2 # 1376| mu1376_4(unknown) = ^CallSideEffect : ~m? # 1376| mu1376_5(String) = Store : &:r1376_1, r1376_3 # 1376| r1376_6(String) = Load : &:r1376_1, ~m? @@ -7605,13 +7601,13 @@ ir.cpp: # 1379| mu1379_3(unknown) = InitializeNonLocal : # 1380| r1380_1(glval) = VariableAddress[d] : # 1380| r1380_2(glval) = FunctionAddress[returnValue] : -# 1380| r1380_3(destructor_only) = Call : func:r1380_2 +# 1380| r1380_3(destructor_only) = Call[returnValue] : func:r1380_2 # 1380| mu1380_4(unknown) = ^CallSideEffect : ~m? # 1380| mu1380_5(destructor_only) = Store : &:r1380_1, r1380_3 # 1381| r1381_1(glval) = VariableAddress[rd] : # 1381| r1381_2(glval) = VariableAddress[#temp1381:33] : # 1381| r1381_3(glval) = FunctionAddress[returnValue] : -# 1381| r1381_4(destructor_only) = Call : func:r1381_3 +# 1381| r1381_4(destructor_only) = Call[returnValue] : func:r1381_3 # 1381| mu1381_5(unknown) = ^CallSideEffect : ~m? # 1381| mu1381_6(destructor_only) = Store : &:r1381_2, r1381_4 # 1381| r1381_7(glval) = Convert : r1381_2 @@ -7623,7 +7619,7 @@ ir.cpp: # 1383| r1383_2(glval) = VariableAddress[d] : # 1383| r1383_3(glval) = Convert : r1383_2 # 1383| r1383_4(destructor_only &) = CopyValue : r1383_3 -# 1383| v1383_5(void) = Call : func:r1383_1, 0:r1383_4 +# 1383| v1383_5(void) = Call[acceptRef] : func:r1383_1, 0:r1383_4 # 1383| mu1383_6(unknown) = ^CallSideEffect : ~m? # 1383| v1383_7(void) = ^BufferReadSideEffect[0] : &:r1383_4, ~m? # 1383| mu1383_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r1383_4 @@ -7632,31 +7628,32 @@ ir.cpp: # 1384| r1384_3(glval) = VariableAddress[d] : # 1384| r1384_4(destructor_only) = Load : &:r1384_3, ~m? # 1384| mu1384_5(destructor_only) = Store : &:r1384_2, r1384_4 -# 1384| v1384_6(void) = Call : func:r1384_1, 0:r1384_2 -# 1384| mu1384_7(unknown) = ^CallSideEffect : ~m? +# 1384| r1384_6(destructor_only) = Load : &:r1384_2, ~m? +# 1384| v1384_7(void) = Call[acceptValue] : func:r1384_1, 0:r1384_6 +# 1384| mu1384_8(unknown) = ^CallSideEffect : ~m? # 1385| r1385_1(glval) = VariableAddress[#temp1385:5] : # 1385| r1385_2(destructor_only) = Constant[0] : # 1385| mu1385_3(destructor_only) = Store : &:r1385_1, r1385_2 # 1385| r1385_4(destructor_only) = Load : &:r1385_1, ~m? # 1385| r1385_5(glval) = FunctionAddress[method] : -# 1385| v1385_6(void) = Call : func:r1385_5, this:r1385_4 +# 1385| v1385_6(void) = Call[method] : func:r1385_5, this:r1385_4 # 1385| mu1385_7(unknown) = ^CallSideEffect : ~m? # 1385| v1385_8(void) = ^BufferReadSideEffect[-1] : &:r1385_4, ~m? # 1385| mu1385_9(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1385_4 # 1386| r1386_1(glval) = VariableAddress[#temp1386:5] : # 1386| r1386_2(glval) = FunctionAddress[returnValue] : -# 1386| r1386_3(destructor_only) = Call : func:r1386_2 +# 1386| r1386_3(destructor_only) = Call[returnValue] : func:r1386_2 # 1386| mu1386_4(unknown) = ^CallSideEffect : ~m? # 1386| mu1386_5(destructor_only) = Store : &:r1386_1, r1386_3 # 1386| r1386_6(destructor_only) = Load : &:r1386_1, ~m? # 1386| r1386_7(glval) = FunctionAddress[method] : -# 1386| v1386_8(void) = Call : func:r1386_7, this:r1386_6 +# 1386| v1386_8(void) = Call[method] : func:r1386_7, this:r1386_6 # 1386| mu1386_9(unknown) = ^CallSideEffect : ~m? # 1386| v1386_10(void) = ^BufferReadSideEffect[-1] : &:r1386_6, ~m? # 1386| mu1386_11(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1386_6 # 1388| r1388_1(glval) = VariableAddress[#temp1388:5] : # 1388| r1388_2(glval) = FunctionAddress[defaultConstruct] : -# 1388| r1388_3(destructor_only) = Call : func:r1388_2 +# 1388| r1388_3(destructor_only) = Call[defaultConstruct] : func:r1388_2 # 1388| mu1388_4(unknown) = ^CallSideEffect : ~m? # 1388| mu1388_5(destructor_only) = Store : &:r1388_1, r1388_3 # 1388| r1388_6(destructor_only) = Load : &:r1388_1, ~m? @@ -7672,13 +7669,13 @@ ir.cpp: # 1391| mu1391_3(unknown) = InitializeNonLocal : # 1392| r1392_1(glval) = VariableAddress[d] : # 1392| r1392_2(glval) = FunctionAddress[returnValue] : -# 1392| r1392_3(copy_constructor) = Call : func:r1392_2 +# 1392| r1392_3(copy_constructor) = Call[returnValue] : func:r1392_2 # 1392| mu1392_4(unknown) = ^CallSideEffect : ~m? # 1392| mu1392_5(copy_constructor) = Store : &:r1392_1, r1392_3 # 1393| r1393_1(glval) = VariableAddress[rd] : # 1393| r1393_2(glval) = VariableAddress[#temp1393:34] : # 1393| r1393_3(glval) = FunctionAddress[returnValue] : -# 1393| r1393_4(copy_constructor) = Call : func:r1393_3 +# 1393| r1393_4(copy_constructor) = Call[returnValue] : func:r1393_3 # 1393| mu1393_5(unknown) = ^CallSideEffect : ~m? # 1393| mu1393_6(copy_constructor) = Store : &:r1393_2, r1393_4 # 1393| r1393_7(glval) = Convert : r1393_2 @@ -7687,14 +7684,14 @@ ir.cpp: # 1394| r1394_1(glval) = VariableAddress[d2] : # 1394| mu1394_2(copy_constructor) = Uninitialized[d2] : &:r1394_1 # 1394| r1394_3(glval) = FunctionAddress[copy_constructor] : -# 1394| v1394_4(void) = Call : func:r1394_3, this:r1394_1 +# 1394| v1394_4(void) = Call[copy_constructor] : func:r1394_3, this:r1394_1 # 1394| mu1394_5(unknown) = ^CallSideEffect : ~m? # 1394| mu1394_6(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1394_1 # 1395| r1395_1(glval) = FunctionAddress[acceptRef] : # 1395| r1395_2(glval) = VariableAddress[d] : # 1395| r1395_3(glval) = Convert : r1395_2 # 1395| r1395_4(copy_constructor &) = CopyValue : r1395_3 -# 1395| v1395_5(void) = Call : func:r1395_1, 0:r1395_4 +# 1395| v1395_5(void) = Call[acceptRef] : func:r1395_1, 0:r1395_4 # 1395| mu1395_6(unknown) = ^CallSideEffect : ~m? # 1395| v1395_7(void) = ^BufferReadSideEffect[0] : &:r1395_4, ~m? # 1395| mu1395_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r1395_4 @@ -7705,39 +7702,40 @@ ir.cpp: # 1396| r1396_5(glval) = VariableAddress[d] : # 1396| r1396_6(glval) = Convert : r1396_5 # 1396| r1396_7(copy_constructor &) = CopyValue : r1396_6 -# 1396| v1396_8(void) = Call : func:r1396_4, this:r1396_2, 0:r1396_7 +# 1396| v1396_8(void) = Call[copy_constructor] : func:r1396_4, this:r1396_2, 0:r1396_7 # 1396| mu1396_9(unknown) = ^CallSideEffect : ~m? # 1396| mu1396_10(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1396_2 # 1396| v1396_11(void) = ^BufferReadSideEffect[0] : &:r1396_7, ~m? # 1396| mu1396_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r1396_7 -# 1396| v1396_13(void) = Call : func:r1396_1, 0:r1396_2 -# 1396| mu1396_14(unknown) = ^CallSideEffect : ~m? +# 1396| r1396_13(copy_constructor) = Load : &:r1396_2, ~m? +# 1396| v1396_14(void) = Call[acceptValue] : func:r1396_1, 0:r1396_13 +# 1396| mu1396_15(unknown) = ^CallSideEffect : ~m? # 1397| r1397_1(glval) = VariableAddress[#temp1397:5] : # 1397| mu1397_2(copy_constructor) = Uninitialized[#temp1397:5] : &:r1397_1 # 1397| r1397_3(glval) = FunctionAddress[copy_constructor] : -# 1397| v1397_4(void) = Call : func:r1397_3, this:r1397_1 +# 1397| v1397_4(void) = Call[copy_constructor] : func:r1397_3, this:r1397_1 # 1397| mu1397_5(unknown) = ^CallSideEffect : ~m? # 1397| mu1397_6(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1397_1 # 1397| r1397_7(copy_constructor) = Load : &:r1397_1, ~m? # 1397| r1397_8(glval) = FunctionAddress[method] : -# 1397| v1397_9(void) = Call : func:r1397_8, this:r1397_7 +# 1397| v1397_9(void) = Call[method] : func:r1397_8, this:r1397_7 # 1397| mu1397_10(unknown) = ^CallSideEffect : ~m? # 1397| v1397_11(void) = ^BufferReadSideEffect[-1] : &:r1397_7, ~m? # 1397| mu1397_12(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1397_7 # 1398| r1398_1(glval) = VariableAddress[#temp1398:5] : # 1398| r1398_2(glval) = FunctionAddress[returnValue] : -# 1398| r1398_3(copy_constructor) = Call : func:r1398_2 +# 1398| r1398_3(copy_constructor) = Call[returnValue] : func:r1398_2 # 1398| mu1398_4(unknown) = ^CallSideEffect : ~m? # 1398| mu1398_5(copy_constructor) = Store : &:r1398_1, r1398_3 # 1398| r1398_6(copy_constructor) = Load : &:r1398_1, ~m? # 1398| r1398_7(glval) = FunctionAddress[method] : -# 1398| v1398_8(void) = Call : func:r1398_7, this:r1398_6 +# 1398| v1398_8(void) = Call[method] : func:r1398_7, this:r1398_6 # 1398| mu1398_9(unknown) = ^CallSideEffect : ~m? # 1398| v1398_10(void) = ^BufferReadSideEffect[-1] : &:r1398_6, ~m? # 1398| mu1398_11(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1398_6 # 1400| r1400_1(glval) = VariableAddress[#temp1400:5] : # 1400| r1400_2(glval) = FunctionAddress[defaultConstruct] : -# 1400| r1400_3(copy_constructor) = Call : func:r1400_2 +# 1400| r1400_3(copy_constructor) = Call[defaultConstruct] : func:r1400_2 # 1400| mu1400_4(unknown) = ^CallSideEffect : ~m? # 1400| mu1400_5(copy_constructor) = Store : &:r1400_1, r1400_3 # 1400| r1400_6(copy_constructor) = Load : &:r1400_1, ~m? @@ -7775,12 +7773,12 @@ perf-regression.cpp: # 10| r10_1(glval) = VariableAddress[big] : # 10| r10_2(glval) = FunctionAddress[operator new] : # 10| r10_3(unsigned long) = Constant[1073741824] : -# 10| r10_4(void *) = Call : func:r10_2, 0:r10_3 +# 10| r10_4(void *) = Call[operator new] : func:r10_2, 0:r10_3 # 10| mu10_5(unknown) = ^CallSideEffect : ~m? # 10| mu10_6(unknown) = ^InitializeDynamicAllocation : &:r10_4 # 10| r10_7(Big *) = Convert : r10_4 # 10| r10_8(glval) = FunctionAddress[Big] : -# 10| v10_9(void) = Call : func:r10_8, this:r10_7 +# 10| v10_9(void) = Call[Big] : func:r10_8, this:r10_7 # 10| mu10_10(unknown) = ^CallSideEffect : ~m? # 10| mu10_11(Big) = ^IndirectMayWriteSideEffect[-1] : &:r10_7 # 10| mu10_12(Big *) = Store : &:r10_1, r10_7 @@ -7820,7 +7818,7 @@ struct_init.cpp: # 25| r25_1(glval) = FunctionAddress[let_info_escape] : # 25| r25_2(glval) = VariableAddress[static_infos] : # 25| r25_3(Info *) = Convert : r25_2 -# 25| v25_4(void) = Call : func:r25_1, 0:r25_3 +# 25| v25_4(void) = Call[let_info_escape] : func:r25_1, 0:r25_3 # 25| mu25_5(unknown) = ^CallSideEffect : ~m? # 25| v25_6(void) = ^BufferReadSideEffect[0] : &:r25_3, ~m? # 25| mu25_7(unknown) = ^BufferMayWriteSideEffect[0] : &:r25_3 @@ -7858,7 +7856,7 @@ struct_init.cpp: # 33| r33_1(glval) = FunctionAddress[let_info_escape] : # 33| r33_2(glval) = VariableAddress[local_infos] : # 33| r33_3(Info *) = Convert : r33_2 -# 33| v33_4(void) = Call : func:r33_1, 0:r33_3 +# 33| v33_4(void) = Call[let_info_escape] : func:r33_1, 0:r33_3 # 33| mu33_5(unknown) = ^CallSideEffect : ~m? # 33| v33_6(void) = ^BufferReadSideEffect[0] : &:r33_3, ~m? # 33| mu33_7(unknown) = ^BufferMayWriteSideEffect[0] : &:r33_3 @@ -7886,7 +7884,7 @@ struct_init.cpp: # 41| r41_1(glval) = FunctionAddress[let_info_escape] : # 41| r41_2(glval) = VariableAddress[static_infos] : # 41| r41_3(Info *) = Convert : r41_2 -# 41| v41_4(void) = Call : func:r41_1, 0:r41_3 +# 41| v41_4(void) = Call[let_info_escape] : func:r41_1, 0:r41_3 # 41| mu41_5(unknown) = ^CallSideEffect : ~m? # 41| v41_6(void) = ^BufferReadSideEffect[0] : &:r41_3, ~m? # 41| mu41_7(unknown) = ^BufferMayWriteSideEffect[0] : &:r41_3 diff --git a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected index 43b8116d85fa..ae579bbbbdcf 100644 --- a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected +++ b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected @@ -346,7 +346,7 @@ ssa.cpp: # 97| r97_2(glval) = VariableAddress[a] : # 97| r97_3(Point *) = CopyValue : r97_2 # 97| r97_4(void *) = Convert : r97_3 -# 97| v97_5(void) = Call : func:r97_1, 0:r97_4 +# 97| v97_5(void) = Call[Escape] : func:r97_1, 0:r97_4 # 97| m97_6(unknown) = ^CallSideEffect : ~m95_7 # 97| m97_7(unknown) = Chi : total:m95_7, partial:m97_6 # 97| v97_8(void) = ^BufferReadSideEffect[0] : &:r97_4, ~m97_7 @@ -403,7 +403,7 @@ ssa.cpp: # 108| r108_2(glval) = VariableAddress[a] : # 108| r108_3(Point *) = CopyValue : r108_2 # 108| r108_4(void *) = Convert : r108_3 -# 108| v108_5(void) = Call : func:r108_1, 0:r108_4 +# 108| v108_5(void) = Call[Escape] : func:r108_1, 0:r108_4 # 108| m108_6(unknown) = ^CallSideEffect : ~m105_7 # 108| m108_7(unknown) = Chi : total:m105_7, partial:m108_6 # 108| v108_8(void) = ^BufferReadSideEffect[0] : &:r108_4, ~m108_7 @@ -476,7 +476,7 @@ ssa.cpp: # 119| r119_2(glval) = VariableAddress[a] : # 119| r119_3(Point *) = CopyValue : r119_2 # 119| r119_4(void *) = Convert : r119_3 -# 119| v119_5(void) = Call : func:r119_1, 0:r119_4 +# 119| v119_5(void) = Call[Escape] : func:r119_1, 0:r119_4 # 119| m119_6(unknown) = ^CallSideEffect : ~m117_13 # 119| m119_7(unknown) = Chi : total:m117_13, partial:m119_6 # 119| v119_8(void) = ^BufferReadSideEffect[0] : &:r119_4, ~m119_7 @@ -848,7 +848,7 @@ ssa.cpp: # 199| r199_6(glval) = VariableAddress[str2] : # 199| r199_7(char *) = Load : &:r199_6, m198_10 # 199| r199_8(char *) = Convert : r199_7 -# 199| r199_9(int) = Call : func:r199_2, 0:r199_5, 1:r199_8 +# 199| r199_9(int) = Call[strcmp] : func:r199_2, 0:r199_5, 1:r199_8 # 199| v199_10(void) = ^BufferReadSideEffect[0] : &:r199_5, ~m198_8 # 199| v199_11(void) = ^BufferReadSideEffect[1] : &:r199_8, ~m198_12 # 199| m199_12(int) = Store : &:r199_1, r199_9 @@ -856,7 +856,7 @@ ssa.cpp: # 200| r200_2(glval) = VariableAddress[str1] : # 200| r200_3(char *) = Load : &:r200_2, m198_6 # 200| r200_4(char *) = Convert : r200_3 -# 200| r200_5(int) = Call : func:r200_1, 0:r200_4 +# 200| r200_5(int) = Call[strlen] : func:r200_1, 0:r200_4 # 200| v200_6(void) = ^BufferReadSideEffect[0] : &:r200_4, ~m198_8 # 200| r200_7(glval) = VariableAddress[ret] : # 200| r200_8(int) = Load : &:r200_7, m199_12 @@ -865,7 +865,7 @@ ssa.cpp: # 201| r201_1(glval) = FunctionAddress[abs] : # 201| r201_2(glval) = VariableAddress[x] : # 201| r201_3(int) = Load : &:r201_2, m198_14 -# 201| r201_4(int) = Call : func:r201_1, 0:r201_3 +# 201| r201_4(int) = Call[abs] : func:r201_1, 0:r201_3 # 201| r201_5(glval) = VariableAddress[ret] : # 201| r201_6(int) = Load : &:r201_5, m200_10 # 201| r201_7(int) = Add : r201_6, r201_4 @@ -901,7 +901,7 @@ ssa.cpp: # 209| r209_6(int *) = CopyValue : r209_5 # 209| r209_7(void *) = Convert : r209_6 # 209| r209_8(int) = Constant[4] : -# 209| r209_9(void *) = Call : func:r209_1, 0:r209_4, 1:r209_7, 2:r209_8 +# 209| r209_9(void *) = Call[memcpy] : func:r209_1, 0:r209_4, 1:r209_7, 2:r209_8 # 209| v209_10(void) = ^SizedBufferReadSideEffect[1] : &:r209_7, r209_8, ~m207_6 # 209| m209_11(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r209_4, r209_8 # 209| m209_12(unknown) = Chi : total:m208_3, partial:m209_11 @@ -988,7 +988,7 @@ ssa.cpp: # 226| m226_3(unknown) = InitializeNonLocal : # 226| m226_4(unknown) = Chi : total:m226_2, partial:m226_3 # 227| r227_1(glval) = FunctionAddress[ExternalFunc] : -# 227| v227_2(void) = Call : func:r227_1 +# 227| v227_2(void) = Call[ExternalFunc] : func:r227_1 # 227| m227_3(unknown) = ^CallSideEffect : ~m226_4 # 227| m227_4(unknown) = Chi : total:m226_4, partial:m227_3 # 229| r229_1(glval) = VariableAddress[s] : @@ -1051,14 +1051,14 @@ ssa.cpp: # 240| m240_2(Constructible) = Uninitialized[c] : &:r240_1 # 240| r240_3(glval) = FunctionAddress[Constructible] : # 240| r240_4(int) = Constant[1] : -# 240| v240_5(void) = Call : func:r240_3, this:r240_1, 0:r240_4 +# 240| v240_5(void) = Call[Constructible] : func:r240_3, this:r240_1, 0:r240_4 # 240| m240_6(unknown) = ^CallSideEffect : ~m239_4 # 240| m240_7(unknown) = Chi : total:m239_4, partial:m240_6 # 240| m240_8(Constructible) = ^IndirectMayWriteSideEffect[-1] : &:r240_1 # 240| m240_9(Constructible) = Chi : total:m240_2, partial:m240_8 # 241| r241_1(glval) = VariableAddress[c] : # 241| r241_2(glval) = FunctionAddress[g] : -# 241| v241_3(void) = Call : func:r241_2, this:r241_1 +# 241| v241_3(void) = Call[g] : func:r241_2, this:r241_1 # 241| m241_4(unknown) = ^CallSideEffect : ~m240_7 # 241| m241_5(unknown) = Chi : total:m240_7, partial:m241_4 # 241| v241_6(void) = ^BufferReadSideEffect[-1] : &:r241_1, ~m240_9 @@ -1066,7 +1066,7 @@ ssa.cpp: # 241| m241_8(Constructible) = Chi : total:m240_9, partial:m241_7 # 242| r242_1(glval) = VariableAddress[c] : # 242| r242_2(glval) = FunctionAddress[g] : -# 242| v242_3(void) = Call : func:r242_2, this:r242_1 +# 242| v242_3(void) = Call[g] : func:r242_2, this:r242_1 # 242| m242_4(unknown) = ^CallSideEffect : ~m241_5 # 242| m242_5(unknown) = Chi : total:m241_5, partial:m242_4 # 242| v242_6(void) = ^BufferReadSideEffect[-1] : &:r242_1, ~m241_8 @@ -1076,14 +1076,14 @@ ssa.cpp: # 243| m243_2(Constructible) = Uninitialized[c2] : &:r243_1 # 243| r243_3(glval) = FunctionAddress[Constructible] : # 243| r243_4(int) = Constant[2] : -# 243| v243_5(void) = Call : func:r243_3, this:r243_1, 0:r243_4 +# 243| v243_5(void) = Call[Constructible] : func:r243_3, this:r243_1, 0:r243_4 # 243| m243_6(unknown) = ^CallSideEffect : ~m242_5 # 243| m243_7(unknown) = Chi : total:m242_5, partial:m243_6 # 243| m243_8(Constructible) = ^IndirectMayWriteSideEffect[-1] : &:r243_1 # 243| m243_9(Constructible) = Chi : total:m243_2, partial:m243_8 # 244| r244_1(glval) = VariableAddress[c2] : # 244| r244_2(glval) = FunctionAddress[g] : -# 244| v244_3(void) = Call : func:r244_2, this:r244_1 +# 244| v244_3(void) = Call[g] : func:r244_2, this:r244_1 # 244| m244_4(unknown) = ^CallSideEffect : ~m243_7 # 244| m244_5(unknown) = Chi : total:m243_7, partial:m244_4 # 244| v244_6(void) = ^BufferReadSideEffect[-1] : &:r244_1, ~m243_9 @@ -1114,7 +1114,7 @@ ssa.cpp: # 248| r248_5(unsigned long) = Convert : r248_4 # 248| r248_6(unsigned long) = Constant[1] : # 248| r248_7(unsigned long) = Mul : r248_5, r248_6 -# 248| r248_8(void *) = Call : func:r248_2, 0:r248_7 +# 248| r248_8(void *) = Call[operator new[]] : func:r248_2, 0:r248_7 # 248| m248_9(unknown) = ^CallSideEffect : ~m247_9 # 248| m248_10(unknown) = Chi : total:m247_9, partial:m248_9 # 248| m248_11(unknown) = ^InitializeDynamicAllocation : &:r248_8 @@ -1136,7 +1136,7 @@ ssa.cpp: # 250| r250_7(void *) = Convert : r250_6 # 250| r250_8(glval) = VariableAddress[size] : # 250| r250_9(int) = Load : &:r250_8, m247_11 -# 250| r250_10(void *) = Call : func:r250_1, 0:r250_4, 1:r250_7, 2:r250_9 +# 250| r250_10(void *) = Call[memcpy] : func:r250_1, 0:r250_4, 1:r250_7, 2:r250_9 # 250| v250_11(void) = ^SizedBufferReadSideEffect[1] : &:r250_7, r250_9, ~m249_6 # 250| m250_12(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r250_4, r250_9 # 250| m250_13(unknown) = Chi : total:m249_6, partial:m250_12 @@ -1166,14 +1166,14 @@ ssa.cpp: # 256| Block 1 # 256| r256_1(glval) = FunctionAddress[ExternalFunc] : -# 256| v256_2(void) = Call : func:r256_1 +# 256| v256_2(void) = Call[ExternalFunc] : func:r256_1 # 256| m256_3(unknown) = ^CallSideEffect : ~m254_4 # 256| m256_4(unknown) = Chi : total:m254_4, partial:m256_3 #-----| Goto -> Block 3 # 259| Block 2 # 259| r259_1(glval) = FunctionAddress[ExternalFunc] : -# 259| v259_2(void) = Call : func:r259_1 +# 259| v259_2(void) = Call[ExternalFunc] : func:r259_1 # 259| m259_3(unknown) = ^CallSideEffect : ~m254_4 # 259| m259_4(unknown) = Chi : total:m254_4, partial:m259_3 #-----| Goto -> Block 3 @@ -1213,7 +1213,7 @@ ssa.cpp: # 269| r269_2(glval) = FunctionAddress[malloc] : # 269| r269_3(glval) = VariableAddress[size] : # 269| r269_4(int) = Load : &:r269_3, m268_11 -# 269| r269_5(void *) = Call : func:r269_2, 0:r269_4 +# 269| r269_5(void *) = Call[malloc] : func:r269_2, 0:r269_4 # 269| m269_6(unknown) = ^CallSideEffect : ~m268_9 # 269| m269_7(unknown) = Chi : total:m268_9, partial:m269_6 # 269| m269_8(unknown) = ^InitializeDynamicAllocation : &:r269_5 @@ -1226,7 +1226,7 @@ ssa.cpp: # 270| r270_5(void *) = Load : &:r270_4, m268_6 # 270| r270_6(glval) = VariableAddress[size] : # 270| r270_7(int) = Load : &:r270_6, m268_11 -# 270| r270_8(void *) = Call : func:r270_1, 0:r270_3, 1:r270_5, 2:r270_7 +# 270| r270_8(void *) = Call[memcpy] : func:r270_1, 0:r270_3, 1:r270_5, 2:r270_7 # 270| v270_9(void) = ^SizedBufferReadSideEffect[1] : &:r270_5, r270_7, ~m269_7 # 270| m270_10(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r270_3, r270_7 # 270| m270_11(unknown) = Chi : total:m269_9, partial:m270_10 @@ -1362,7 +1362,7 @@ ssa.cpp: # 292| r292_1(glval) = VariableAddress[p] : # 292| r292_2(glval) = FunctionAddress[operator new] : # 292| r292_3(unsigned long) = Constant[8] : -# 292| r292_4(void *) = Call : func:r292_2, 0:r292_3 +# 292| r292_4(void *) = Call[operator new] : func:r292_2, 0:r292_3 # 292| m292_5(unknown) = ^CallSideEffect : ~m291_4 # 292| m292_6(unknown) = Chi : total:m291_4, partial:m292_5 # 292| m292_7(unknown) = ^InitializeDynamicAllocation : &:r292_4 @@ -1371,7 +1371,7 @@ ssa.cpp: # 293| r293_1(glval) = VariableAddress[q] : # 293| r293_2(glval) = FunctionAddress[operator new] : # 293| r293_3(unsigned long) = Constant[8] : -# 293| r293_4(void *) = Call : func:r293_2, 0:r293_3 +# 293| r293_4(void *) = Call[operator new] : func:r293_2, 0:r293_3 # 293| m293_5(unknown) = ^CallSideEffect : ~m292_6 # 293| m293_6(unknown) = Chi : total:m292_6, partial:m293_5 # 293| m293_7(unknown) = ^InitializeDynamicAllocation : &:r293_4 @@ -1380,7 +1380,7 @@ ssa.cpp: # 294| r294_1(glval) = VariableAddress[j] : # 294| r294_2(glval) = FunctionAddress[operator new] : # 294| r294_3(unsigned long) = Constant[4] : -# 294| r294_4(void *) = Call : func:r294_2, 0:r294_3 +# 294| r294_4(void *) = Call[operator new] : func:r294_2, 0:r294_3 # 294| m294_5(unknown) = ^CallSideEffect : ~m293_6 # 294| m294_6(unknown) = Chi : total:m293_6, partial:m294_5 # 294| m294_7(unknown) = ^InitializeDynamicAllocation : &:r294_4 @@ -1388,7 +1388,7 @@ ssa.cpp: # 294| r294_9(glval) = FunctionAddress[A] : # 294| r294_10(glval) = FunctionAddress[operator new] : # 294| r294_11(unsigned long) = Constant[4] : -# 294| r294_12(void *) = Call : func:r294_10, 0:r294_11 +# 294| r294_12(void *) = Call[operator new] : func:r294_10, 0:r294_11 # 294| m294_13(unknown) = ^CallSideEffect : ~m294_6 # 294| m294_14(unknown) = Chi : total:m294_6, partial:m294_13 # 294| m294_15(unknown) = ^InitializeDynamicAllocation : &:r294_12 @@ -1396,12 +1396,12 @@ ssa.cpp: # 294| r294_17(glval) = FunctionAddress[A] : # 294| r294_18(glval) = VariableAddress[x] : # 294| r294_19(int) = Load : &:r294_18, m291_6 -# 294| v294_20(void) = Call : func:r294_17, this:r294_16, 0:r294_19 +# 294| v294_20(void) = Call[A] : func:r294_17, this:r294_16, 0:r294_19 # 294| m294_21(unknown) = ^CallSideEffect : ~m294_14 # 294| m294_22(unknown) = Chi : total:m294_14, partial:m294_21 # 294| m294_23(A) = ^IndirectMayWriteSideEffect[-1] : &:r294_16 # 294| m294_24(unknown) = Chi : total:m294_15, partial:m294_23 -# 294| v294_25(void) = Call : func:r294_9, this:r294_8, 0:r294_16 +# 294| v294_25(void) = Call[A] : func:r294_9, this:r294_8, 0:r294_16 # 294| m294_26(unknown) = ^CallSideEffect : ~m294_22 # 294| m294_27(unknown) = Chi : total:m294_22, partial:m294_26 # 294| m294_28(A) = ^IndirectMayWriteSideEffect[-1] : &:r294_8 @@ -1415,13 +1415,13 @@ ssa.cpp: # 295| r295_1(glval) = VariableAddress[a] : # 295| r295_2(glval) = FunctionAddress[operator new] : # 295| r295_3(unsigned long) = Constant[4] : -# 295| r295_4(void *) = Call : func:r295_2, 0:r295_3 +# 295| r295_4(void *) = Call[operator new] : func:r295_2, 0:r295_3 # 295| m295_5(unknown) = ^CallSideEffect : ~m294_27 # 295| m295_6(unknown) = Chi : total:m294_27, partial:m295_5 # 295| m295_7(unknown) = ^InitializeDynamicAllocation : &:r295_4 # 295| r295_8(A *) = Convert : r295_4 # 295| r295_9(glval) = FunctionAddress[A] : -# 295| v295_10(void) = Call : func:r295_9, this:r295_8 +# 295| v295_10(void) = Call[A] : func:r295_9, this:r295_8 # 295| m295_11(unknown) = ^CallSideEffect : ~m295_6 # 295| m295_12(unknown) = Chi : total:m295_6, partial:m295_11 # 295| m295_13(A) = ^IndirectMayWriteSideEffect[-1] : &:r295_8 @@ -1454,7 +1454,7 @@ ssa.cpp: # 302| r302_3(int) = Load : &:r302_2, m301_6 # 302| r302_4(glval) = VariableAddress[argv] : # 302| r302_5(char **) = Load : &:r302_4, m301_8 -# 302| v302_6(void) = Call : func:r302_1, 0:r302_3, 1:r302_5 +# 302| v302_6(void) = Call[unknownFunction] : func:r302_1, 0:r302_3, 1:r302_5 # 302| m302_7(unknown) = ^CallSideEffect : ~m301_11 # 302| m302_8(unknown) = Chi : total:m301_11, partial:m302_7 # 302| v302_9(void) = ^BufferReadSideEffect[1] : &:r302_5, ~m302_8 @@ -1465,7 +1465,7 @@ ssa.cpp: # 303| r303_3(int) = Load : &:r303_2, m301_6 # 303| r303_4(glval) = VariableAddress[argv] : # 303| r303_5(char **) = Load : &:r303_4, m301_8 -# 303| v303_6(void) = Call : func:r303_1, 0:r303_3, 1:r303_5 +# 303| v303_6(void) = Call[unknownFunction] : func:r303_1, 0:r303_3, 1:r303_5 # 303| m303_7(unknown) = ^CallSideEffect : ~m302_11 # 303| m303_8(unknown) = Chi : total:m302_11, partial:m303_7 # 303| v303_9(void) = ^BufferReadSideEffect[1] : &:r303_5, ~m303_8 diff --git a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir_unsound.expected b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir_unsound.expected index ef07fde174d5..0e486a792897 100644 --- a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir_unsound.expected @@ -345,7 +345,7 @@ ssa.cpp: # 97| r97_2(glval) = VariableAddress[a] : # 97| r97_3(Point *) = CopyValue : r97_2 # 97| r97_4(void *) = Convert : r97_3 -# 97| v97_5(void) = Call : func:r97_1, 0:r97_4 +# 97| v97_5(void) = Call[Escape] : func:r97_1, 0:r97_4 # 97| m97_6(unknown) = ^CallSideEffect : ~m95_4 # 97| m97_7(unknown) = Chi : total:m95_4, partial:m97_6 # 97| v97_8(void) = ^BufferReadSideEffect[0] : &:r97_4, ~m95_6 @@ -401,7 +401,7 @@ ssa.cpp: # 108| r108_2(glval) = VariableAddress[a] : # 108| r108_3(Point *) = CopyValue : r108_2 # 108| r108_4(void *) = Convert : r108_3 -# 108| v108_5(void) = Call : func:r108_1, 0:r108_4 +# 108| v108_5(void) = Call[Escape] : func:r108_1, 0:r108_4 # 108| m108_6(unknown) = ^CallSideEffect : ~m105_4 # 108| m108_7(unknown) = Chi : total:m105_4, partial:m108_6 # 108| v108_8(void) = ^BufferReadSideEffect[0] : &:r108_4, ~m105_6 @@ -473,7 +473,7 @@ ssa.cpp: # 119| r119_2(glval) = VariableAddress[a] : # 119| r119_3(Point *) = CopyValue : r119_2 # 119| r119_4(void *) = Convert : r119_3 -# 119| v119_5(void) = Call : func:r119_1, 0:r119_4 +# 119| v119_5(void) = Call[Escape] : func:r119_1, 0:r119_4 # 119| m119_6(unknown) = ^CallSideEffect : ~m116_4 # 119| m119_7(unknown) = Chi : total:m116_4, partial:m119_6 # 119| v119_8(void) = ^BufferReadSideEffect[0] : &:r119_4, ~m117_12 @@ -843,7 +843,7 @@ ssa.cpp: # 199| r199_6(glval) = VariableAddress[str2] : # 199| r199_7(char *) = Load : &:r199_6, m198_10 # 199| r199_8(char *) = Convert : r199_7 -# 199| r199_9(int) = Call : func:r199_2, 0:r199_5, 1:r199_8 +# 199| r199_9(int) = Call[strcmp] : func:r199_2, 0:r199_5, 1:r199_8 # 199| v199_10(void) = ^BufferReadSideEffect[0] : &:r199_5, ~m198_8 # 199| v199_11(void) = ^BufferReadSideEffect[1] : &:r199_8, ~m198_12 # 199| m199_12(int) = Store : &:r199_1, r199_9 @@ -851,7 +851,7 @@ ssa.cpp: # 200| r200_2(glval) = VariableAddress[str1] : # 200| r200_3(char *) = Load : &:r200_2, m198_6 # 200| r200_4(char *) = Convert : r200_3 -# 200| r200_5(int) = Call : func:r200_1, 0:r200_4 +# 200| r200_5(int) = Call[strlen] : func:r200_1, 0:r200_4 # 200| v200_6(void) = ^BufferReadSideEffect[0] : &:r200_4, ~m198_8 # 200| r200_7(glval) = VariableAddress[ret] : # 200| r200_8(int) = Load : &:r200_7, m199_12 @@ -860,7 +860,7 @@ ssa.cpp: # 201| r201_1(glval) = FunctionAddress[abs] : # 201| r201_2(glval) = VariableAddress[x] : # 201| r201_3(int) = Load : &:r201_2, m198_14 -# 201| r201_4(int) = Call : func:r201_1, 0:r201_3 +# 201| r201_4(int) = Call[abs] : func:r201_1, 0:r201_3 # 201| r201_5(glval) = VariableAddress[ret] : # 201| r201_6(int) = Load : &:r201_5, m200_10 # 201| r201_7(int) = Add : r201_6, r201_4 @@ -894,7 +894,7 @@ ssa.cpp: # 209| r209_6(int *) = CopyValue : r209_5 # 209| r209_7(void *) = Convert : r209_6 # 209| r209_8(int) = Constant[4] : -# 209| r209_9(void *) = Call : func:r209_1, 0:r209_4, 1:r209_7, 2:r209_8 +# 209| r209_9(void *) = Call[memcpy] : func:r209_1, 0:r209_4, 1:r209_7, 2:r209_8 # 209| v209_10(void) = ^SizedBufferReadSideEffect[1] : &:r209_7, r209_8, ~m207_6 # 209| m209_11(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r209_4, r209_8 # 209| m209_12(int) = Chi : total:m208_2, partial:m209_11 @@ -981,7 +981,7 @@ ssa.cpp: # 226| m226_3(unknown) = InitializeNonLocal : # 226| m226_4(unknown) = Chi : total:m226_2, partial:m226_3 # 227| r227_1(glval) = FunctionAddress[ExternalFunc] : -# 227| v227_2(void) = Call : func:r227_1 +# 227| v227_2(void) = Call[ExternalFunc] : func:r227_1 # 227| m227_3(unknown) = ^CallSideEffect : ~m226_4 # 227| m227_4(unknown) = Chi : total:m226_4, partial:m227_3 # 229| r229_1(glval) = VariableAddress[s] : @@ -1044,14 +1044,14 @@ ssa.cpp: # 240| m240_2(Constructible) = Uninitialized[c] : &:r240_1 # 240| r240_3(glval) = FunctionAddress[Constructible] : # 240| r240_4(int) = Constant[1] : -# 240| v240_5(void) = Call : func:r240_3, this:r240_1, 0:r240_4 +# 240| v240_5(void) = Call[Constructible] : func:r240_3, this:r240_1, 0:r240_4 # 240| m240_6(unknown) = ^CallSideEffect : ~m239_4 # 240| m240_7(unknown) = Chi : total:m239_4, partial:m240_6 # 240| m240_8(Constructible) = ^IndirectMayWriteSideEffect[-1] : &:r240_1 # 240| m240_9(Constructible) = Chi : total:m240_2, partial:m240_8 # 241| r241_1(glval) = VariableAddress[c] : # 241| r241_2(glval) = FunctionAddress[g] : -# 241| v241_3(void) = Call : func:r241_2, this:r241_1 +# 241| v241_3(void) = Call[g] : func:r241_2, this:r241_1 # 241| m241_4(unknown) = ^CallSideEffect : ~m240_7 # 241| m241_5(unknown) = Chi : total:m240_7, partial:m241_4 # 241| v241_6(void) = ^BufferReadSideEffect[-1] : &:r241_1, ~m240_9 @@ -1059,7 +1059,7 @@ ssa.cpp: # 241| m241_8(Constructible) = Chi : total:m240_9, partial:m241_7 # 242| r242_1(glval) = VariableAddress[c] : # 242| r242_2(glval) = FunctionAddress[g] : -# 242| v242_3(void) = Call : func:r242_2, this:r242_1 +# 242| v242_3(void) = Call[g] : func:r242_2, this:r242_1 # 242| m242_4(unknown) = ^CallSideEffect : ~m241_5 # 242| m242_5(unknown) = Chi : total:m241_5, partial:m242_4 # 242| v242_6(void) = ^BufferReadSideEffect[-1] : &:r242_1, ~m241_8 @@ -1069,14 +1069,14 @@ ssa.cpp: # 243| m243_2(Constructible) = Uninitialized[c2] : &:r243_1 # 243| r243_3(glval) = FunctionAddress[Constructible] : # 243| r243_4(int) = Constant[2] : -# 243| v243_5(void) = Call : func:r243_3, this:r243_1, 0:r243_4 +# 243| v243_5(void) = Call[Constructible] : func:r243_3, this:r243_1, 0:r243_4 # 243| m243_6(unknown) = ^CallSideEffect : ~m242_5 # 243| m243_7(unknown) = Chi : total:m242_5, partial:m243_6 # 243| m243_8(Constructible) = ^IndirectMayWriteSideEffect[-1] : &:r243_1 # 243| m243_9(Constructible) = Chi : total:m243_2, partial:m243_8 # 244| r244_1(glval) = VariableAddress[c2] : # 244| r244_2(glval) = FunctionAddress[g] : -# 244| v244_3(void) = Call : func:r244_2, this:r244_1 +# 244| v244_3(void) = Call[g] : func:r244_2, this:r244_1 # 244| m244_4(unknown) = ^CallSideEffect : ~m243_7 # 244| m244_5(unknown) = Chi : total:m243_7, partial:m244_4 # 244| v244_6(void) = ^BufferReadSideEffect[-1] : &:r244_1, ~m243_9 @@ -1106,7 +1106,7 @@ ssa.cpp: # 248| r248_5(unsigned long) = Convert : r248_4 # 248| r248_6(unsigned long) = Constant[1] : # 248| r248_7(unsigned long) = Mul : r248_5, r248_6 -# 248| r248_8(void *) = Call : func:r248_2, 0:r248_7 +# 248| r248_8(void *) = Call[operator new[]] : func:r248_2, 0:r248_7 # 248| m248_9(unknown) = ^CallSideEffect : ~m247_4 # 248| m248_10(unknown) = Chi : total:m247_4, partial:m248_9 # 248| m248_11(unknown) = ^InitializeDynamicAllocation : &:r248_8 @@ -1127,7 +1127,7 @@ ssa.cpp: # 250| r250_7(void *) = Convert : r250_6 # 250| r250_8(glval) = VariableAddress[size] : # 250| r250_9(int) = Load : &:r250_8, m247_10 -# 250| r250_10(void *) = Call : func:r250_1, 0:r250_4, 1:r250_7, 2:r250_9 +# 250| r250_10(void *) = Call[memcpy] : func:r250_1, 0:r250_4, 1:r250_7, 2:r250_9 # 250| v250_11(void) = ^SizedBufferReadSideEffect[1] : &:r250_7, r250_9, ~m249_6 # 250| m250_12(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r250_4, r250_9 # 250| m250_13(unknown) = Chi : total:m248_11, partial:m250_12 @@ -1157,14 +1157,14 @@ ssa.cpp: # 256| Block 1 # 256| r256_1(glval) = FunctionAddress[ExternalFunc] : -# 256| v256_2(void) = Call : func:r256_1 +# 256| v256_2(void) = Call[ExternalFunc] : func:r256_1 # 256| m256_3(unknown) = ^CallSideEffect : ~m254_4 # 256| m256_4(unknown) = Chi : total:m254_4, partial:m256_3 #-----| Goto -> Block 3 # 259| Block 2 # 259| r259_1(glval) = FunctionAddress[ExternalFunc] : -# 259| v259_2(void) = Call : func:r259_1 +# 259| v259_2(void) = Call[ExternalFunc] : func:r259_1 # 259| m259_3(unknown) = ^CallSideEffect : ~m254_4 # 259| m259_4(unknown) = Chi : total:m254_4, partial:m259_3 #-----| Goto -> Block 3 @@ -1203,7 +1203,7 @@ ssa.cpp: # 269| r269_2(glval) = FunctionAddress[malloc] : # 269| r269_3(glval) = VariableAddress[size] : # 269| r269_4(int) = Load : &:r269_3, m268_10 -# 269| r269_5(void *) = Call : func:r269_2, 0:r269_4 +# 269| r269_5(void *) = Call[malloc] : func:r269_2, 0:r269_4 # 269| m269_6(unknown) = ^CallSideEffect : ~m268_4 # 269| m269_7(unknown) = Chi : total:m268_4, partial:m269_6 # 269| m269_8(unknown) = ^InitializeDynamicAllocation : &:r269_5 @@ -1215,7 +1215,7 @@ ssa.cpp: # 270| r270_5(void *) = Load : &:r270_4, m268_6 # 270| r270_6(glval) = VariableAddress[size] : # 270| r270_7(int) = Load : &:r270_6, m268_10 -# 270| r270_8(void *) = Call : func:r270_1, 0:r270_3, 1:r270_5, 2:r270_7 +# 270| r270_8(void *) = Call[memcpy] : func:r270_1, 0:r270_3, 1:r270_5, 2:r270_7 # 270| v270_9(void) = ^SizedBufferReadSideEffect[1] : &:r270_5, r270_7, ~m268_8 # 270| m270_10(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r270_3, r270_7 # 270| m270_11(unknown) = Chi : total:m269_8, partial:m270_10 @@ -1350,7 +1350,7 @@ ssa.cpp: # 292| r292_1(glval) = VariableAddress[p] : # 292| r292_2(glval) = FunctionAddress[operator new] : # 292| r292_3(unsigned long) = Constant[8] : -# 292| r292_4(void *) = Call : func:r292_2, 0:r292_3 +# 292| r292_4(void *) = Call[operator new] : func:r292_2, 0:r292_3 # 292| m292_5(unknown) = ^CallSideEffect : ~m291_4 # 292| m292_6(unknown) = Chi : total:m291_4, partial:m292_5 # 292| m292_7(unknown) = ^InitializeDynamicAllocation : &:r292_4 @@ -1359,7 +1359,7 @@ ssa.cpp: # 293| r293_1(glval) = VariableAddress[q] : # 293| r293_2(glval) = FunctionAddress[operator new] : # 293| r293_3(unsigned long) = Constant[8] : -# 293| r293_4(void *) = Call : func:r293_2, 0:r293_3 +# 293| r293_4(void *) = Call[operator new] : func:r293_2, 0:r293_3 # 293| m293_5(unknown) = ^CallSideEffect : ~m292_6 # 293| m293_6(unknown) = Chi : total:m292_6, partial:m293_5 # 293| m293_7(unknown) = ^InitializeDynamicAllocation : &:r293_4 @@ -1368,7 +1368,7 @@ ssa.cpp: # 294| r294_1(glval) = VariableAddress[j] : # 294| r294_2(glval) = FunctionAddress[operator new] : # 294| r294_3(unsigned long) = Constant[4] : -# 294| r294_4(void *) = Call : func:r294_2, 0:r294_3 +# 294| r294_4(void *) = Call[operator new] : func:r294_2, 0:r294_3 # 294| m294_5(unknown) = ^CallSideEffect : ~m293_6 # 294| m294_6(unknown) = Chi : total:m293_6, partial:m294_5 # 294| m294_7(unknown) = ^InitializeDynamicAllocation : &:r294_4 @@ -1376,7 +1376,7 @@ ssa.cpp: # 294| r294_9(glval) = FunctionAddress[A] : # 294| r294_10(glval) = FunctionAddress[operator new] : # 294| r294_11(unsigned long) = Constant[4] : -# 294| r294_12(void *) = Call : func:r294_10, 0:r294_11 +# 294| r294_12(void *) = Call[operator new] : func:r294_10, 0:r294_11 # 294| m294_13(unknown) = ^CallSideEffect : ~m294_6 # 294| m294_14(unknown) = Chi : total:m294_6, partial:m294_13 # 294| m294_15(unknown) = ^InitializeDynamicAllocation : &:r294_12 @@ -1384,12 +1384,12 @@ ssa.cpp: # 294| r294_17(glval) = FunctionAddress[A] : # 294| r294_18(glval) = VariableAddress[x] : # 294| r294_19(int) = Load : &:r294_18, m291_6 -# 294| v294_20(void) = Call : func:r294_17, this:r294_16, 0:r294_19 +# 294| v294_20(void) = Call[A] : func:r294_17, this:r294_16, 0:r294_19 # 294| m294_21(unknown) = ^CallSideEffect : ~m294_14 # 294| m294_22(unknown) = Chi : total:m294_14, partial:m294_21 # 294| m294_23(A) = ^IndirectMayWriteSideEffect[-1] : &:r294_16 # 294| m294_24(unknown) = Chi : total:m294_15, partial:m294_23 -# 294| v294_25(void) = Call : func:r294_9, this:r294_8, 0:r294_16 +# 294| v294_25(void) = Call[A] : func:r294_9, this:r294_8, 0:r294_16 # 294| m294_26(unknown) = ^CallSideEffect : ~m294_22 # 294| m294_27(unknown) = Chi : total:m294_22, partial:m294_26 # 294| m294_28(A) = ^IndirectMayWriteSideEffect[-1] : &:r294_8 @@ -1403,13 +1403,13 @@ ssa.cpp: # 295| r295_1(glval) = VariableAddress[a] : # 295| r295_2(glval) = FunctionAddress[operator new] : # 295| r295_3(unsigned long) = Constant[4] : -# 295| r295_4(void *) = Call : func:r295_2, 0:r295_3 +# 295| r295_4(void *) = Call[operator new] : func:r295_2, 0:r295_3 # 295| m295_5(unknown) = ^CallSideEffect : ~m294_27 # 295| m295_6(unknown) = Chi : total:m294_27, partial:m295_5 # 295| m295_7(unknown) = ^InitializeDynamicAllocation : &:r295_4 # 295| r295_8(A *) = Convert : r295_4 # 295| r295_9(glval) = FunctionAddress[A] : -# 295| v295_10(void) = Call : func:r295_9, this:r295_8 +# 295| v295_10(void) = Call[A] : func:r295_9, this:r295_8 # 295| m295_11(unknown) = ^CallSideEffect : ~m295_6 # 295| m295_12(unknown) = Chi : total:m295_6, partial:m295_11 # 295| m295_13(A) = ^IndirectMayWriteSideEffect[-1] : &:r295_8 @@ -1441,7 +1441,7 @@ ssa.cpp: # 302| r302_3(int) = Load : &:r302_2, m301_6 # 302| r302_4(glval) = VariableAddress[argv] : # 302| r302_5(char **) = Load : &:r302_4, m301_8 -# 302| v302_6(void) = Call : func:r302_1, 0:r302_3, 1:r302_5 +# 302| v302_6(void) = Call[unknownFunction] : func:r302_1, 0:r302_3, 1:r302_5 # 302| m302_7(unknown) = ^CallSideEffect : ~m301_4 # 302| m302_8(unknown) = Chi : total:m301_4, partial:m302_7 # 302| v302_9(void) = ^BufferReadSideEffect[1] : &:r302_5, ~m301_10 @@ -1452,7 +1452,7 @@ ssa.cpp: # 303| r303_3(int) = Load : &:r303_2, m301_6 # 303| r303_4(glval) = VariableAddress[argv] : # 303| r303_5(char **) = Load : &:r303_4, m301_8 -# 303| v303_6(void) = Call : func:r303_1, 0:r303_3, 1:r303_5 +# 303| v303_6(void) = Call[unknownFunction] : func:r303_1, 0:r303_3, 1:r303_5 # 303| m303_7(unknown) = ^CallSideEffect : ~m302_8 # 303| m303_8(unknown) = Chi : total:m302_8, partial:m303_7 # 303| v303_9(void) = ^BufferReadSideEffect[1] : &:r303_5, ~m302_11 diff --git a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected index 1d155eaf30d6..9157b211d5b8 100644 --- a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected +++ b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected @@ -334,7 +334,7 @@ ssa.cpp: # 97| r97_2(glval) = VariableAddress[a] : # 97| r97_3(Point *) = CopyValue : r97_2 # 97| r97_4(void *) = Convert : r97_3 -# 97| v97_5(void) = Call : func:r97_1, 0:r97_4 +# 97| v97_5(void) = Call[Escape] : func:r97_1, 0:r97_4 # 97| mu97_6(unknown) = ^CallSideEffect : ~m? # 97| v97_7(void) = ^BufferReadSideEffect[0] : &:r97_4, ~m? # 97| mu97_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r97_4 @@ -386,7 +386,7 @@ ssa.cpp: # 108| r108_2(glval) = VariableAddress[a] : # 108| r108_3(Point *) = CopyValue : r108_2 # 108| r108_4(void *) = Convert : r108_3 -# 108| v108_5(void) = Call : func:r108_1, 0:r108_4 +# 108| v108_5(void) = Call[Escape] : func:r108_1, 0:r108_4 # 108| mu108_6(unknown) = ^CallSideEffect : ~m? # 108| v108_7(void) = ^BufferReadSideEffect[0] : &:r108_4, ~m? # 108| mu108_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r108_4 @@ -450,7 +450,7 @@ ssa.cpp: # 119| r119_2(glval) = VariableAddress[a] : # 119| r119_3(Point *) = CopyValue : r119_2 # 119| r119_4(void *) = Convert : r119_3 -# 119| v119_5(void) = Call : func:r119_1, 0:r119_4 +# 119| v119_5(void) = Call[Escape] : func:r119_1, 0:r119_4 # 119| mu119_6(unknown) = ^CallSideEffect : ~m? # 119| v119_7(void) = ^BufferReadSideEffect[0] : &:r119_4, ~m? # 119| mu119_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r119_4 @@ -789,7 +789,7 @@ ssa.cpp: # 199| r199_6(glval) = VariableAddress[str2] : # 199| r199_7(char *) = Load : &:r199_6, m198_9 # 199| r199_8(char *) = Convert : r199_7 -# 199| r199_9(int) = Call : func:r199_2, 0:r199_5, 1:r199_8 +# 199| r199_9(int) = Call[strcmp] : func:r199_2, 0:r199_5, 1:r199_8 # 199| v199_10(void) = ^BufferReadSideEffect[0] : &:r199_5, ~m? # 199| v199_11(void) = ^BufferReadSideEffect[1] : &:r199_8, ~m? # 199| m199_12(int) = Store : &:r199_1, r199_9 @@ -797,7 +797,7 @@ ssa.cpp: # 200| r200_2(glval) = VariableAddress[str1] : # 200| r200_3(char *) = Load : &:r200_2, m198_5 # 200| r200_4(char *) = Convert : r200_3 -# 200| r200_5(int) = Call : func:r200_1, 0:r200_4 +# 200| r200_5(int) = Call[strlen] : func:r200_1, 0:r200_4 # 200| v200_6(void) = ^BufferReadSideEffect[0] : &:r200_4, ~m? # 200| r200_7(glval) = VariableAddress[ret] : # 200| r200_8(int) = Load : &:r200_7, m199_12 @@ -806,7 +806,7 @@ ssa.cpp: # 201| r201_1(glval) = FunctionAddress[abs] : # 201| r201_2(glval) = VariableAddress[x] : # 201| r201_3(int) = Load : &:r201_2, m198_13 -# 201| r201_4(int) = Call : func:r201_1, 0:r201_3 +# 201| r201_4(int) = Call[abs] : func:r201_1, 0:r201_3 # 201| r201_5(glval) = VariableAddress[ret] : # 201| r201_6(int) = Load : &:r201_5, m200_10 # 201| r201_7(int) = Add : r201_6, r201_4 @@ -839,7 +839,7 @@ ssa.cpp: # 209| r209_6(int *) = CopyValue : r209_5 # 209| r209_7(void *) = Convert : r209_6 # 209| r209_8(int) = Constant[4] : -# 209| r209_9(void *) = Call : func:r209_1, 0:r209_4, 1:r209_7, 2:r209_8 +# 209| r209_9(void *) = Call[memcpy] : func:r209_1, 0:r209_4, 1:r209_7, 2:r209_8 # 209| v209_10(void) = ^SizedBufferReadSideEffect[1] : &:r209_7, r209_8, ~m? # 209| mu209_11(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r209_4, r209_8 # 210| r210_1(glval) = VariableAddress[#return] : @@ -917,7 +917,7 @@ ssa.cpp: # 226| mu226_2(unknown) = AliasedDefinition : # 226| mu226_3(unknown) = InitializeNonLocal : # 227| r227_1(glval) = FunctionAddress[ExternalFunc] : -# 227| v227_2(void) = Call : func:r227_1 +# 227| v227_2(void) = Call[ExternalFunc] : func:r227_1 # 227| mu227_3(unknown) = ^CallSideEffect : ~m? # 229| r229_1(glval) = VariableAddress[s] : # 229| r229_2(glval) = StringConstant["Literal"] : @@ -976,18 +976,18 @@ ssa.cpp: # 240| mu240_2(Constructible) = Uninitialized[c] : &:r240_1 # 240| r240_3(glval) = FunctionAddress[Constructible] : # 240| r240_4(int) = Constant[1] : -# 240| v240_5(void) = Call : func:r240_3, this:r240_1, 0:r240_4 +# 240| v240_5(void) = Call[Constructible] : func:r240_3, this:r240_1, 0:r240_4 # 240| mu240_6(unknown) = ^CallSideEffect : ~m? # 240| mu240_7(Constructible) = ^IndirectMayWriteSideEffect[-1] : &:r240_1 # 241| r241_1(glval) = VariableAddress[c] : # 241| r241_2(glval) = FunctionAddress[g] : -# 241| v241_3(void) = Call : func:r241_2, this:r241_1 +# 241| v241_3(void) = Call[g] : func:r241_2, this:r241_1 # 241| mu241_4(unknown) = ^CallSideEffect : ~m? # 241| v241_5(void) = ^BufferReadSideEffect[-1] : &:r241_1, ~m? # 241| mu241_6(Constructible) = ^IndirectMayWriteSideEffect[-1] : &:r241_1 # 242| r242_1(glval) = VariableAddress[c] : # 242| r242_2(glval) = FunctionAddress[g] : -# 242| v242_3(void) = Call : func:r242_2, this:r242_1 +# 242| v242_3(void) = Call[g] : func:r242_2, this:r242_1 # 242| mu242_4(unknown) = ^CallSideEffect : ~m? # 242| v242_5(void) = ^BufferReadSideEffect[-1] : &:r242_1, ~m? # 242| mu242_6(Constructible) = ^IndirectMayWriteSideEffect[-1] : &:r242_1 @@ -995,12 +995,12 @@ ssa.cpp: # 243| mu243_2(Constructible) = Uninitialized[c2] : &:r243_1 # 243| r243_3(glval) = FunctionAddress[Constructible] : # 243| r243_4(int) = Constant[2] : -# 243| v243_5(void) = Call : func:r243_3, this:r243_1, 0:r243_4 +# 243| v243_5(void) = Call[Constructible] : func:r243_3, this:r243_1, 0:r243_4 # 243| mu243_6(unknown) = ^CallSideEffect : ~m? # 243| mu243_7(Constructible) = ^IndirectMayWriteSideEffect[-1] : &:r243_1 # 244| r244_1(glval) = VariableAddress[c2] : # 244| r244_2(glval) = FunctionAddress[g] : -# 244| v244_3(void) = Call : func:r244_2, this:r244_1 +# 244| v244_3(void) = Call[g] : func:r244_2, this:r244_1 # 244| mu244_4(unknown) = ^CallSideEffect : ~m? # 244| v244_5(void) = ^BufferReadSideEffect[-1] : &:r244_1, ~m? # 244| mu244_6(Constructible) = ^IndirectMayWriteSideEffect[-1] : &:r244_1 @@ -1027,7 +1027,7 @@ ssa.cpp: # 248| r248_5(unsigned long) = Convert : r248_4 # 248| r248_6(unsigned long) = Constant[1] : # 248| r248_7(unsigned long) = Mul : r248_5, r248_6 -# 248| r248_8(void *) = Call : func:r248_2, 0:r248_7 +# 248| r248_8(void *) = Call[operator new[]] : func:r248_2, 0:r248_7 # 248| mu248_9(unknown) = ^CallSideEffect : ~m? # 248| mu248_10(unknown) = ^InitializeDynamicAllocation : &:r248_8 # 248| r248_11(char *) = Convert : r248_8 @@ -1046,7 +1046,7 @@ ssa.cpp: # 250| r250_7(void *) = Convert : r250_6 # 250| r250_8(glval) = VariableAddress[size] : # 250| r250_9(int) = Load : &:r250_8, m247_9 -# 250| r250_10(void *) = Call : func:r250_1, 0:r250_4, 1:r250_7, 2:r250_9 +# 250| r250_10(void *) = Call[memcpy] : func:r250_1, 0:r250_4, 1:r250_7, 2:r250_9 # 250| v250_11(void) = ^SizedBufferReadSideEffect[1] : &:r250_7, r250_9, ~m? # 250| mu250_12(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r250_4, r250_9 # 251| r251_1(glval) = VariableAddress[#return] : @@ -1074,13 +1074,13 @@ ssa.cpp: # 256| Block 1 # 256| r256_1(glval) = FunctionAddress[ExternalFunc] : -# 256| v256_2(void) = Call : func:r256_1 +# 256| v256_2(void) = Call[ExternalFunc] : func:r256_1 # 256| mu256_3(unknown) = ^CallSideEffect : ~m? #-----| Goto -> Block 3 # 259| Block 2 # 259| r259_1(glval) = FunctionAddress[ExternalFunc] : -# 259| v259_2(void) = Call : func:r259_1 +# 259| v259_2(void) = Call[ExternalFunc] : func:r259_1 # 259| mu259_3(unknown) = ^CallSideEffect : ~m? #-----| Goto -> Block 3 @@ -1116,7 +1116,7 @@ ssa.cpp: # 269| r269_2(glval) = FunctionAddress[malloc] : # 269| r269_3(glval) = VariableAddress[size] : # 269| r269_4(int) = Load : &:r269_3, m268_9 -# 269| r269_5(void *) = Call : func:r269_2, 0:r269_4 +# 269| r269_5(void *) = Call[malloc] : func:r269_2, 0:r269_4 # 269| mu269_6(unknown) = ^CallSideEffect : ~m? # 269| mu269_7(unknown) = ^InitializeDynamicAllocation : &:r269_5 # 269| m269_8(void *) = Store : &:r269_1, r269_5 @@ -1127,7 +1127,7 @@ ssa.cpp: # 270| r270_5(void *) = Load : &:r270_4, m268_5 # 270| r270_6(glval) = VariableAddress[size] : # 270| r270_7(int) = Load : &:r270_6, m268_9 -# 270| r270_8(void *) = Call : func:r270_1, 0:r270_3, 1:r270_5, 2:r270_7 +# 270| r270_8(void *) = Call[memcpy] : func:r270_1, 0:r270_3, 1:r270_5, 2:r270_7 # 270| v270_9(void) = ^SizedBufferReadSideEffect[1] : &:r270_5, r270_7, ~m? # 270| mu270_10(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r270_3, r270_7 # 271| r271_1(glval) = VariableAddress[#return] : @@ -1250,7 +1250,7 @@ ssa.cpp: # 292| r292_1(glval) = VariableAddress[p] : # 292| r292_2(glval) = FunctionAddress[operator new] : # 292| r292_3(unsigned long) = Constant[8] : -# 292| r292_4(void *) = Call : func:r292_2, 0:r292_3 +# 292| r292_4(void *) = Call[operator new] : func:r292_2, 0:r292_3 # 292| mu292_5(unknown) = ^CallSideEffect : ~m? # 292| mu292_6(unknown) = ^InitializeDynamicAllocation : &:r292_4 # 292| r292_7(Point *) = Convert : r292_4 @@ -1258,7 +1258,7 @@ ssa.cpp: # 293| r293_1(glval) = VariableAddress[q] : # 293| r293_2(glval) = FunctionAddress[operator new] : # 293| r293_3(unsigned long) = Constant[8] : -# 293| r293_4(void *) = Call : func:r293_2, 0:r293_3 +# 293| r293_4(void *) = Call[operator new] : func:r293_2, 0:r293_3 # 293| mu293_5(unknown) = ^CallSideEffect : ~m? # 293| mu293_6(unknown) = ^InitializeDynamicAllocation : &:r293_4 # 293| r293_7(Point *) = Convert : r293_4 @@ -1266,24 +1266,24 @@ ssa.cpp: # 294| r294_1(glval) = VariableAddress[j] : # 294| r294_2(glval) = FunctionAddress[operator new] : # 294| r294_3(unsigned long) = Constant[4] : -# 294| r294_4(void *) = Call : func:r294_2, 0:r294_3 +# 294| r294_4(void *) = Call[operator new] : func:r294_2, 0:r294_3 # 294| mu294_5(unknown) = ^CallSideEffect : ~m? # 294| mu294_6(unknown) = ^InitializeDynamicAllocation : &:r294_4 # 294| r294_7(A *) = Convert : r294_4 # 294| r294_8(glval) = FunctionAddress[A] : # 294| r294_9(glval) = FunctionAddress[operator new] : # 294| r294_10(unsigned long) = Constant[4] : -# 294| r294_11(void *) = Call : func:r294_9, 0:r294_10 +# 294| r294_11(void *) = Call[operator new] : func:r294_9, 0:r294_10 # 294| mu294_12(unknown) = ^CallSideEffect : ~m? # 294| mu294_13(unknown) = ^InitializeDynamicAllocation : &:r294_11 # 294| r294_14(A *) = Convert : r294_11 # 294| r294_15(glval) = FunctionAddress[A] : # 294| r294_16(glval) = VariableAddress[x] : # 294| r294_17(int) = Load : &:r294_16, m291_5 -# 294| v294_18(void) = Call : func:r294_15, this:r294_14, 0:r294_17 +# 294| v294_18(void) = Call[A] : func:r294_15, this:r294_14, 0:r294_17 # 294| mu294_19(unknown) = ^CallSideEffect : ~m? # 294| mu294_20(A) = ^IndirectMayWriteSideEffect[-1] : &:r294_14 -# 294| v294_21(void) = Call : func:r294_8, this:r294_7, 0:r294_14 +# 294| v294_21(void) = Call[A] : func:r294_8, this:r294_7, 0:r294_14 # 294| mu294_22(unknown) = ^CallSideEffect : ~m? # 294| mu294_23(A) = ^IndirectMayWriteSideEffect[-1] : &:r294_7 # 294| v294_24(void) = ^BufferReadSideEffect[0] : &:r294_14, ~m? @@ -1294,12 +1294,12 @@ ssa.cpp: # 295| r295_1(glval) = VariableAddress[a] : # 295| r295_2(glval) = FunctionAddress[operator new] : # 295| r295_3(unsigned long) = Constant[4] : -# 295| r295_4(void *) = Call : func:r295_2, 0:r295_3 +# 295| r295_4(void *) = Call[operator new] : func:r295_2, 0:r295_3 # 295| mu295_5(unknown) = ^CallSideEffect : ~m? # 295| mu295_6(unknown) = ^InitializeDynamicAllocation : &:r295_4 # 295| r295_7(A *) = Convert : r295_4 # 295| r295_8(glval) = FunctionAddress[A] : -# 295| v295_9(void) = Call : func:r295_8, this:r295_7 +# 295| v295_9(void) = Call[A] : func:r295_8, this:r295_7 # 295| mu295_10(unknown) = ^CallSideEffect : ~m? # 295| mu295_11(A) = ^IndirectMayWriteSideEffect[-1] : &:r295_7 # 295| m295_12(A *) = Store : &:r295_1, r295_7 @@ -1328,7 +1328,7 @@ ssa.cpp: # 302| r302_3(int) = Load : &:r302_2, m301_5 # 302| r302_4(glval) = VariableAddress[argv] : # 302| r302_5(char **) = Load : &:r302_4, m301_7 -# 302| v302_6(void) = Call : func:r302_1, 0:r302_3, 1:r302_5 +# 302| v302_6(void) = Call[unknownFunction] : func:r302_1, 0:r302_3, 1:r302_5 # 302| mu302_7(unknown) = ^CallSideEffect : ~m? # 302| v302_8(void) = ^BufferReadSideEffect[1] : &:r302_5, ~m? # 302| mu302_9(unknown) = ^BufferMayWriteSideEffect[1] : &:r302_5 @@ -1337,7 +1337,7 @@ ssa.cpp: # 303| r303_3(int) = Load : &:r303_2, m301_5 # 303| r303_4(glval) = VariableAddress[argv] : # 303| r303_5(char **) = Load : &:r303_4, m301_7 -# 303| v303_6(void) = Call : func:r303_1, 0:r303_3, 1:r303_5 +# 303| v303_6(void) = Call[unknownFunction] : func:r303_1, 0:r303_3, 1:r303_5 # 303| mu303_7(unknown) = ^CallSideEffect : ~m? # 303| v303_8(void) = ^BufferReadSideEffect[1] : &:r303_5, ~m? # 303| mu303_9(unknown) = ^BufferMayWriteSideEffect[1] : &:r303_5 diff --git a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir_unsound.expected b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir_unsound.expected index 1d155eaf30d6..9157b211d5b8 100644 --- a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir_unsound.expected @@ -334,7 +334,7 @@ ssa.cpp: # 97| r97_2(glval) = VariableAddress[a] : # 97| r97_3(Point *) = CopyValue : r97_2 # 97| r97_4(void *) = Convert : r97_3 -# 97| v97_5(void) = Call : func:r97_1, 0:r97_4 +# 97| v97_5(void) = Call[Escape] : func:r97_1, 0:r97_4 # 97| mu97_6(unknown) = ^CallSideEffect : ~m? # 97| v97_7(void) = ^BufferReadSideEffect[0] : &:r97_4, ~m? # 97| mu97_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r97_4 @@ -386,7 +386,7 @@ ssa.cpp: # 108| r108_2(glval) = VariableAddress[a] : # 108| r108_3(Point *) = CopyValue : r108_2 # 108| r108_4(void *) = Convert : r108_3 -# 108| v108_5(void) = Call : func:r108_1, 0:r108_4 +# 108| v108_5(void) = Call[Escape] : func:r108_1, 0:r108_4 # 108| mu108_6(unknown) = ^CallSideEffect : ~m? # 108| v108_7(void) = ^BufferReadSideEffect[0] : &:r108_4, ~m? # 108| mu108_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r108_4 @@ -450,7 +450,7 @@ ssa.cpp: # 119| r119_2(glval) = VariableAddress[a] : # 119| r119_3(Point *) = CopyValue : r119_2 # 119| r119_4(void *) = Convert : r119_3 -# 119| v119_5(void) = Call : func:r119_1, 0:r119_4 +# 119| v119_5(void) = Call[Escape] : func:r119_1, 0:r119_4 # 119| mu119_6(unknown) = ^CallSideEffect : ~m? # 119| v119_7(void) = ^BufferReadSideEffect[0] : &:r119_4, ~m? # 119| mu119_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r119_4 @@ -789,7 +789,7 @@ ssa.cpp: # 199| r199_6(glval) = VariableAddress[str2] : # 199| r199_7(char *) = Load : &:r199_6, m198_9 # 199| r199_8(char *) = Convert : r199_7 -# 199| r199_9(int) = Call : func:r199_2, 0:r199_5, 1:r199_8 +# 199| r199_9(int) = Call[strcmp] : func:r199_2, 0:r199_5, 1:r199_8 # 199| v199_10(void) = ^BufferReadSideEffect[0] : &:r199_5, ~m? # 199| v199_11(void) = ^BufferReadSideEffect[1] : &:r199_8, ~m? # 199| m199_12(int) = Store : &:r199_1, r199_9 @@ -797,7 +797,7 @@ ssa.cpp: # 200| r200_2(glval) = VariableAddress[str1] : # 200| r200_3(char *) = Load : &:r200_2, m198_5 # 200| r200_4(char *) = Convert : r200_3 -# 200| r200_5(int) = Call : func:r200_1, 0:r200_4 +# 200| r200_5(int) = Call[strlen] : func:r200_1, 0:r200_4 # 200| v200_6(void) = ^BufferReadSideEffect[0] : &:r200_4, ~m? # 200| r200_7(glval) = VariableAddress[ret] : # 200| r200_8(int) = Load : &:r200_7, m199_12 @@ -806,7 +806,7 @@ ssa.cpp: # 201| r201_1(glval) = FunctionAddress[abs] : # 201| r201_2(glval) = VariableAddress[x] : # 201| r201_3(int) = Load : &:r201_2, m198_13 -# 201| r201_4(int) = Call : func:r201_1, 0:r201_3 +# 201| r201_4(int) = Call[abs] : func:r201_1, 0:r201_3 # 201| r201_5(glval) = VariableAddress[ret] : # 201| r201_6(int) = Load : &:r201_5, m200_10 # 201| r201_7(int) = Add : r201_6, r201_4 @@ -839,7 +839,7 @@ ssa.cpp: # 209| r209_6(int *) = CopyValue : r209_5 # 209| r209_7(void *) = Convert : r209_6 # 209| r209_8(int) = Constant[4] : -# 209| r209_9(void *) = Call : func:r209_1, 0:r209_4, 1:r209_7, 2:r209_8 +# 209| r209_9(void *) = Call[memcpy] : func:r209_1, 0:r209_4, 1:r209_7, 2:r209_8 # 209| v209_10(void) = ^SizedBufferReadSideEffect[1] : &:r209_7, r209_8, ~m? # 209| mu209_11(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r209_4, r209_8 # 210| r210_1(glval) = VariableAddress[#return] : @@ -917,7 +917,7 @@ ssa.cpp: # 226| mu226_2(unknown) = AliasedDefinition : # 226| mu226_3(unknown) = InitializeNonLocal : # 227| r227_1(glval) = FunctionAddress[ExternalFunc] : -# 227| v227_2(void) = Call : func:r227_1 +# 227| v227_2(void) = Call[ExternalFunc] : func:r227_1 # 227| mu227_3(unknown) = ^CallSideEffect : ~m? # 229| r229_1(glval) = VariableAddress[s] : # 229| r229_2(glval) = StringConstant["Literal"] : @@ -976,18 +976,18 @@ ssa.cpp: # 240| mu240_2(Constructible) = Uninitialized[c] : &:r240_1 # 240| r240_3(glval) = FunctionAddress[Constructible] : # 240| r240_4(int) = Constant[1] : -# 240| v240_5(void) = Call : func:r240_3, this:r240_1, 0:r240_4 +# 240| v240_5(void) = Call[Constructible] : func:r240_3, this:r240_1, 0:r240_4 # 240| mu240_6(unknown) = ^CallSideEffect : ~m? # 240| mu240_7(Constructible) = ^IndirectMayWriteSideEffect[-1] : &:r240_1 # 241| r241_1(glval) = VariableAddress[c] : # 241| r241_2(glval) = FunctionAddress[g] : -# 241| v241_3(void) = Call : func:r241_2, this:r241_1 +# 241| v241_3(void) = Call[g] : func:r241_2, this:r241_1 # 241| mu241_4(unknown) = ^CallSideEffect : ~m? # 241| v241_5(void) = ^BufferReadSideEffect[-1] : &:r241_1, ~m? # 241| mu241_6(Constructible) = ^IndirectMayWriteSideEffect[-1] : &:r241_1 # 242| r242_1(glval) = VariableAddress[c] : # 242| r242_2(glval) = FunctionAddress[g] : -# 242| v242_3(void) = Call : func:r242_2, this:r242_1 +# 242| v242_3(void) = Call[g] : func:r242_2, this:r242_1 # 242| mu242_4(unknown) = ^CallSideEffect : ~m? # 242| v242_5(void) = ^BufferReadSideEffect[-1] : &:r242_1, ~m? # 242| mu242_6(Constructible) = ^IndirectMayWriteSideEffect[-1] : &:r242_1 @@ -995,12 +995,12 @@ ssa.cpp: # 243| mu243_2(Constructible) = Uninitialized[c2] : &:r243_1 # 243| r243_3(glval) = FunctionAddress[Constructible] : # 243| r243_4(int) = Constant[2] : -# 243| v243_5(void) = Call : func:r243_3, this:r243_1, 0:r243_4 +# 243| v243_5(void) = Call[Constructible] : func:r243_3, this:r243_1, 0:r243_4 # 243| mu243_6(unknown) = ^CallSideEffect : ~m? # 243| mu243_7(Constructible) = ^IndirectMayWriteSideEffect[-1] : &:r243_1 # 244| r244_1(glval) = VariableAddress[c2] : # 244| r244_2(glval) = FunctionAddress[g] : -# 244| v244_3(void) = Call : func:r244_2, this:r244_1 +# 244| v244_3(void) = Call[g] : func:r244_2, this:r244_1 # 244| mu244_4(unknown) = ^CallSideEffect : ~m? # 244| v244_5(void) = ^BufferReadSideEffect[-1] : &:r244_1, ~m? # 244| mu244_6(Constructible) = ^IndirectMayWriteSideEffect[-1] : &:r244_1 @@ -1027,7 +1027,7 @@ ssa.cpp: # 248| r248_5(unsigned long) = Convert : r248_4 # 248| r248_6(unsigned long) = Constant[1] : # 248| r248_7(unsigned long) = Mul : r248_5, r248_6 -# 248| r248_8(void *) = Call : func:r248_2, 0:r248_7 +# 248| r248_8(void *) = Call[operator new[]] : func:r248_2, 0:r248_7 # 248| mu248_9(unknown) = ^CallSideEffect : ~m? # 248| mu248_10(unknown) = ^InitializeDynamicAllocation : &:r248_8 # 248| r248_11(char *) = Convert : r248_8 @@ -1046,7 +1046,7 @@ ssa.cpp: # 250| r250_7(void *) = Convert : r250_6 # 250| r250_8(glval) = VariableAddress[size] : # 250| r250_9(int) = Load : &:r250_8, m247_9 -# 250| r250_10(void *) = Call : func:r250_1, 0:r250_4, 1:r250_7, 2:r250_9 +# 250| r250_10(void *) = Call[memcpy] : func:r250_1, 0:r250_4, 1:r250_7, 2:r250_9 # 250| v250_11(void) = ^SizedBufferReadSideEffect[1] : &:r250_7, r250_9, ~m? # 250| mu250_12(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r250_4, r250_9 # 251| r251_1(glval) = VariableAddress[#return] : @@ -1074,13 +1074,13 @@ ssa.cpp: # 256| Block 1 # 256| r256_1(glval) = FunctionAddress[ExternalFunc] : -# 256| v256_2(void) = Call : func:r256_1 +# 256| v256_2(void) = Call[ExternalFunc] : func:r256_1 # 256| mu256_3(unknown) = ^CallSideEffect : ~m? #-----| Goto -> Block 3 # 259| Block 2 # 259| r259_1(glval) = FunctionAddress[ExternalFunc] : -# 259| v259_2(void) = Call : func:r259_1 +# 259| v259_2(void) = Call[ExternalFunc] : func:r259_1 # 259| mu259_3(unknown) = ^CallSideEffect : ~m? #-----| Goto -> Block 3 @@ -1116,7 +1116,7 @@ ssa.cpp: # 269| r269_2(glval) = FunctionAddress[malloc] : # 269| r269_3(glval) = VariableAddress[size] : # 269| r269_4(int) = Load : &:r269_3, m268_9 -# 269| r269_5(void *) = Call : func:r269_2, 0:r269_4 +# 269| r269_5(void *) = Call[malloc] : func:r269_2, 0:r269_4 # 269| mu269_6(unknown) = ^CallSideEffect : ~m? # 269| mu269_7(unknown) = ^InitializeDynamicAllocation : &:r269_5 # 269| m269_8(void *) = Store : &:r269_1, r269_5 @@ -1127,7 +1127,7 @@ ssa.cpp: # 270| r270_5(void *) = Load : &:r270_4, m268_5 # 270| r270_6(glval) = VariableAddress[size] : # 270| r270_7(int) = Load : &:r270_6, m268_9 -# 270| r270_8(void *) = Call : func:r270_1, 0:r270_3, 1:r270_5, 2:r270_7 +# 270| r270_8(void *) = Call[memcpy] : func:r270_1, 0:r270_3, 1:r270_5, 2:r270_7 # 270| v270_9(void) = ^SizedBufferReadSideEffect[1] : &:r270_5, r270_7, ~m? # 270| mu270_10(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r270_3, r270_7 # 271| r271_1(glval) = VariableAddress[#return] : @@ -1250,7 +1250,7 @@ ssa.cpp: # 292| r292_1(glval) = VariableAddress[p] : # 292| r292_2(glval) = FunctionAddress[operator new] : # 292| r292_3(unsigned long) = Constant[8] : -# 292| r292_4(void *) = Call : func:r292_2, 0:r292_3 +# 292| r292_4(void *) = Call[operator new] : func:r292_2, 0:r292_3 # 292| mu292_5(unknown) = ^CallSideEffect : ~m? # 292| mu292_6(unknown) = ^InitializeDynamicAllocation : &:r292_4 # 292| r292_7(Point *) = Convert : r292_4 @@ -1258,7 +1258,7 @@ ssa.cpp: # 293| r293_1(glval) = VariableAddress[q] : # 293| r293_2(glval) = FunctionAddress[operator new] : # 293| r293_3(unsigned long) = Constant[8] : -# 293| r293_4(void *) = Call : func:r293_2, 0:r293_3 +# 293| r293_4(void *) = Call[operator new] : func:r293_2, 0:r293_3 # 293| mu293_5(unknown) = ^CallSideEffect : ~m? # 293| mu293_6(unknown) = ^InitializeDynamicAllocation : &:r293_4 # 293| r293_7(Point *) = Convert : r293_4 @@ -1266,24 +1266,24 @@ ssa.cpp: # 294| r294_1(glval) = VariableAddress[j] : # 294| r294_2(glval) = FunctionAddress[operator new] : # 294| r294_3(unsigned long) = Constant[4] : -# 294| r294_4(void *) = Call : func:r294_2, 0:r294_3 +# 294| r294_4(void *) = Call[operator new] : func:r294_2, 0:r294_3 # 294| mu294_5(unknown) = ^CallSideEffect : ~m? # 294| mu294_6(unknown) = ^InitializeDynamicAllocation : &:r294_4 # 294| r294_7(A *) = Convert : r294_4 # 294| r294_8(glval) = FunctionAddress[A] : # 294| r294_9(glval) = FunctionAddress[operator new] : # 294| r294_10(unsigned long) = Constant[4] : -# 294| r294_11(void *) = Call : func:r294_9, 0:r294_10 +# 294| r294_11(void *) = Call[operator new] : func:r294_9, 0:r294_10 # 294| mu294_12(unknown) = ^CallSideEffect : ~m? # 294| mu294_13(unknown) = ^InitializeDynamicAllocation : &:r294_11 # 294| r294_14(A *) = Convert : r294_11 # 294| r294_15(glval) = FunctionAddress[A] : # 294| r294_16(glval) = VariableAddress[x] : # 294| r294_17(int) = Load : &:r294_16, m291_5 -# 294| v294_18(void) = Call : func:r294_15, this:r294_14, 0:r294_17 +# 294| v294_18(void) = Call[A] : func:r294_15, this:r294_14, 0:r294_17 # 294| mu294_19(unknown) = ^CallSideEffect : ~m? # 294| mu294_20(A) = ^IndirectMayWriteSideEffect[-1] : &:r294_14 -# 294| v294_21(void) = Call : func:r294_8, this:r294_7, 0:r294_14 +# 294| v294_21(void) = Call[A] : func:r294_8, this:r294_7, 0:r294_14 # 294| mu294_22(unknown) = ^CallSideEffect : ~m? # 294| mu294_23(A) = ^IndirectMayWriteSideEffect[-1] : &:r294_7 # 294| v294_24(void) = ^BufferReadSideEffect[0] : &:r294_14, ~m? @@ -1294,12 +1294,12 @@ ssa.cpp: # 295| r295_1(glval) = VariableAddress[a] : # 295| r295_2(glval) = FunctionAddress[operator new] : # 295| r295_3(unsigned long) = Constant[4] : -# 295| r295_4(void *) = Call : func:r295_2, 0:r295_3 +# 295| r295_4(void *) = Call[operator new] : func:r295_2, 0:r295_3 # 295| mu295_5(unknown) = ^CallSideEffect : ~m? # 295| mu295_6(unknown) = ^InitializeDynamicAllocation : &:r295_4 # 295| r295_7(A *) = Convert : r295_4 # 295| r295_8(glval) = FunctionAddress[A] : -# 295| v295_9(void) = Call : func:r295_8, this:r295_7 +# 295| v295_9(void) = Call[A] : func:r295_8, this:r295_7 # 295| mu295_10(unknown) = ^CallSideEffect : ~m? # 295| mu295_11(A) = ^IndirectMayWriteSideEffect[-1] : &:r295_7 # 295| m295_12(A *) = Store : &:r295_1, r295_7 @@ -1328,7 +1328,7 @@ ssa.cpp: # 302| r302_3(int) = Load : &:r302_2, m301_5 # 302| r302_4(glval) = VariableAddress[argv] : # 302| r302_5(char **) = Load : &:r302_4, m301_7 -# 302| v302_6(void) = Call : func:r302_1, 0:r302_3, 1:r302_5 +# 302| v302_6(void) = Call[unknownFunction] : func:r302_1, 0:r302_3, 1:r302_5 # 302| mu302_7(unknown) = ^CallSideEffect : ~m? # 302| v302_8(void) = ^BufferReadSideEffect[1] : &:r302_5, ~m? # 302| mu302_9(unknown) = ^BufferMayWriteSideEffect[1] : &:r302_5 @@ -1337,7 +1337,7 @@ ssa.cpp: # 303| r303_3(int) = Load : &:r303_2, m301_5 # 303| r303_4(glval) = VariableAddress[argv] : # 303| r303_5(char **) = Load : &:r303_4, m301_7 -# 303| v303_6(void) = Call : func:r303_1, 0:r303_3, 1:r303_5 +# 303| v303_6(void) = Call[unknownFunction] : func:r303_1, 0:r303_3, 1:r303_5 # 303| mu303_7(unknown) = ^CallSideEffect : ~m? # 303| v303_8(void) = ^BufferReadSideEffect[1] : &:r303_5, ~m? # 303| mu303_9(unknown) = ^BufferMayWriteSideEffect[1] : &:r303_5 diff --git a/cpp/ql/test/library-tests/valuenumbering/GlobalValueNumbering/ir_gvn.expected b/cpp/ql/test/library-tests/valuenumbering/GlobalValueNumbering/ir_gvn.expected index b5d596594600..0f8f7079b40f 100644 --- a/cpp/ql/test/library-tests/valuenumbering/GlobalValueNumbering/ir_gvn.expected +++ b/cpp/ql/test/library-tests/valuenumbering/GlobalValueNumbering/ir_gvn.expected @@ -202,7 +202,7 @@ test.cpp: # 29| valnum = m29_10, r29_8 # 30| r30_1(glval) = FunctionAddress[change_global02] : # 30| valnum = unique -# 30| v30_2(void) = Call : func:r30_1 +# 30| v30_2(void) = Call[change_global02] : func:r30_1 # 30| m30_3(unknown) = ^CallSideEffect : ~m25_4 # 30| valnum = unique # 30| m30_4(unknown) = Chi : total:m25_4, partial:m30_3 @@ -538,7 +538,7 @@ test.cpp: # 77| valnum = r77_1, r79_1, r80_6 # 77| r77_2(glval) = FunctionAddress[getAValue] : # 77| valnum = unique -# 77| r77_3(int) = Call : func:r77_2 +# 77| r77_3(int) = Call[getAValue] : func:r77_2 # 77| valnum = unique # 77| m77_4(unknown) = ^CallSideEffect : ~m75_4 # 77| valnum = unique @@ -585,7 +585,7 @@ test.cpp: # 80| Block 1 # 80| r80_1(glval) = FunctionAddress[getAValue] : # 80| valnum = unique -# 80| r80_2(int) = Call : func:r80_1 +# 80| r80_2(int) = Call[getAValue] : func:r80_1 # 80| valnum = unique # 80| m80_3(unknown) = ^CallSideEffect : ~m77_5 # 80| valnum = unique diff --git a/csharp/ql/src/experimental/ir/implementation/raw/Instruction.qll b/csharp/ql/src/experimental/ir/implementation/raw/Instruction.qll index 620b23b942e0..135b91c0decd 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/Instruction.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/Instruction.qll @@ -1501,6 +1501,12 @@ class SwitchInstruction extends Instruction { class CallInstruction extends Instruction { CallInstruction() { getOpcode() instanceof Opcode::Call } + final override string getImmediateString() { + result = getStaticCallTarget().toString() + or + not exists(getStaticCallTarget()) and result = "?" + } + /** * Gets the operand the specifies the target function of the call. */ diff --git a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Instruction.qll b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Instruction.qll index 620b23b942e0..135b91c0decd 100644 --- a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Instruction.qll +++ b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Instruction.qll @@ -1501,6 +1501,12 @@ class SwitchInstruction extends Instruction { class CallInstruction extends Instruction { CallInstruction() { getOpcode() instanceof Opcode::Call } + final override string getImmediateString() { + result = getStaticCallTarget().toString() + or + not exists(getStaticCallTarget()) and result = "?" + } + /** * Gets the operand the specifies the target function of the call. */ diff --git a/csharp/ql/test/experimental/ir/ir/raw_ir.expected b/csharp/ql/test/experimental/ir/ir/raw_ir.expected index e426955f9da3..e0586a0adcd1 100644 --- a/csharp/ql/test/experimental/ir/ir/raw_ir.expected +++ b/csharp/ql/test/experimental/ir/ir/raw_ir.expected @@ -222,7 +222,7 @@ casts.cs: # 13| r13_1(glval) = VariableAddress[Aobj] : # 13| r13_2(Casts_A) = NewObj : # 13| r13_3() = FunctionAddress[Casts_A] : -# 13| v13_4(Void) = Call : func:r13_3, this:r13_2 +# 13| v13_4(Void) = Call[Casts_A] : func:r13_3, this:r13_2 # 13| mu13_5() = ^CallSideEffect : ~m? # 13| mu13_6(Casts_A) = Store : &:r13_1, r13_2 # 14| r14_1(glval) = VariableAddress[bobjCE] : @@ -247,13 +247,13 @@ collections.cs: # 13| r13_1(glval>) = VariableAddress[dict] : # 13| r13_2(Dictionary) = NewObj : # 13| r13_3() = FunctionAddress[Dictionary] : -# 13| v13_4(Void) = Call : func:r13_3, this:r13_2 +# 13| v13_4(Void) = Call[Dictionary] : func:r13_3, this:r13_2 # 13| mu13_5() = ^CallSideEffect : ~m? # 15| r15_1() = FunctionAddress[Add] : # 15| r15_2(Int32) = Constant[0] : # 15| r15_3(MyClass) = NewObj : # 15| r15_4() = FunctionAddress[MyClass] : -# 15| v15_5(Void) = Call : func:r15_4, this:r15_3 +# 15| v15_5(Void) = Call[MyClass] : func:r15_4, this:r15_3 # 15| mu15_6() = ^CallSideEffect : ~m? # 15| r15_7(String) = StringConstant["Hello"] : # 15| r15_8(glval) = FieldAddress[a] : r15_3 @@ -261,13 +261,13 @@ collections.cs: # 15| r15_10(String) = StringConstant["World"] : # 15| r15_11(glval) = FieldAddress[b] : r15_3 # 15| mu15_12(String) = Store : &:r15_11, r15_10 -# 15| v15_13(Void) = Call : func:r15_1, this:r13_2, 0:r15_2, 1:r15_3 +# 15| v15_13(Void) = Call[Add] : func:r15_1, this:r13_2, 0:r15_2, 1:r15_3 # 15| mu15_14() = ^CallSideEffect : ~m? # 16| r16_1() = FunctionAddress[Add] : # 16| r16_2(Int32) = Constant[1] : # 16| r16_3(MyClass) = NewObj : # 16| r16_4() = FunctionAddress[MyClass] : -# 16| v16_5(Void) = Call : func:r16_4, this:r16_3 +# 16| v16_5(Void) = Call[MyClass] : func:r16_4, this:r16_3 # 16| mu16_6() = ^CallSideEffect : ~m? # 16| r16_7(String) = StringConstant["Foo"] : # 16| r16_8(glval) = FieldAddress[a] : r16_3 @@ -275,7 +275,7 @@ collections.cs: # 16| r16_10(String) = StringConstant["Bar"] : # 16| r16_11(glval) = FieldAddress[b] : r16_3 # 16| mu16_12(String) = Store : &:r16_11, r16_10 -# 16| v16_13(Void) = Call : func:r16_1, this:r13_2, 0:r16_2, 1:r16_3 +# 16| v16_13(Void) = Call[Add] : func:r16_1, this:r13_2, 0:r16_2, 1:r16_3 # 16| mu16_14() = ^CallSideEffect : ~m? # 13| mu13_6(Dictionary) = Store : &:r13_1, r13_2 # 11| v11_3(Void) = ReturnVoid : @@ -316,7 +316,7 @@ constructor_init.cs: # 17| r17_3(glval) = InitializeThis : # 17| r17_4(glval) = Convert[DerivedClass : BaseClass] : r17_3 # 17| r17_5() = FunctionAddress[BaseClass] : -# 17| v17_6(Void) = Call : func:r17_5, this:r17_4 +# 17| v17_6(Void) = Call[BaseClass] : func:r17_5, this:r17_4 # 17| mu17_7() = ^CallSideEffect : ~m? # 18| v18_1(Void) = NoOp : # 17| v17_8(Void) = ReturnVoid : @@ -334,7 +334,7 @@ constructor_init.cs: # 21| r21_7() = FunctionAddress[BaseClass] : # 21| r21_8(glval) = VariableAddress[i] : # 21| r21_9(Int32) = Load : &:r21_8, ~m? -# 21| v21_10(Void) = Call : func:r21_7, this:r21_6, 0:r21_9 +# 21| v21_10(Void) = Call[BaseClass] : func:r21_7, this:r21_6, 0:r21_9 # 21| mu21_11() = ^CallSideEffect : ~m? # 22| v22_1(Void) = NoOp : # 21| v21_12(Void) = ReturnVoid : @@ -353,7 +353,7 @@ constructor_init.cs: # 25| r25_8() = FunctionAddress[DerivedClass] : # 25| r25_9(glval) = VariableAddress[i] : # 25| r25_10(Int32) = Load : &:r25_9, ~m? -# 25| v25_11(Void) = Call : func:r25_8, this:r25_3, 0:r25_10 +# 25| v25_11(Void) = Call[DerivedClass] : func:r25_8, this:r25_3, 0:r25_10 # 25| mu25_12() = ^CallSideEffect : ~m? # 26| v26_1(Void) = NoOp : # 25| v25_13(Void) = ReturnVoid : @@ -367,14 +367,14 @@ constructor_init.cs: # 31| r31_1(glval) = VariableAddress[obj1] : # 31| r31_2(DerivedClass) = NewObj : # 31| r31_3() = FunctionAddress[DerivedClass] : -# 31| v31_4(Void) = Call : func:r31_3, this:r31_2 +# 31| v31_4(Void) = Call[DerivedClass] : func:r31_3, this:r31_2 # 31| mu31_5() = ^CallSideEffect : ~m? # 31| mu31_6(DerivedClass) = Store : &:r31_1, r31_2 # 32| r32_1(glval) = VariableAddress[obj2] : # 32| r32_2(DerivedClass) = NewObj : # 32| r32_3() = FunctionAddress[DerivedClass] : # 32| r32_4(Int32) = Constant[1] : -# 32| v32_5(Void) = Call : func:r32_3, this:r32_2, 0:r32_4 +# 32| v32_5(Void) = Call[DerivedClass] : func:r32_3, this:r32_2, 0:r32_4 # 32| mu32_6() = ^CallSideEffect : ~m? # 32| mu32_7(DerivedClass) = Store : &:r32_1, r32_2 # 33| r33_1(glval) = VariableAddress[obj3] : @@ -382,7 +382,7 @@ constructor_init.cs: # 33| r33_3() = FunctionAddress[DerivedClass] : # 33| r33_4(Int32) = Constant[1] : # 33| r33_5(Int32) = Constant[2] : -# 33| v33_6(Void) = Call : func:r33_3, this:r33_2, 0:r33_4, 1:r33_5 +# 33| v33_6(Void) = Call[DerivedClass] : func:r33_3, this:r33_2, 0:r33_4, 1:r33_5 # 33| mu33_7() = ^CallSideEffect : ~m? # 33| mu33_8(DerivedClass) = Store : &:r33_1, r33_2 # 29| v29_3(Void) = ReturnVoid : @@ -453,14 +453,14 @@ delegates.cs: # 12| r12_2(Del) = NewObj : # 12| r12_3() = FunctionAddress[Del] : # 12| r12_4(glval) = FunctionAddress[returns] : -# 12| v12_5(Void) = Call : func:r12_3, this:r12_2, 0:r12_4 +# 12| v12_5(Void) = Call[Del] : func:r12_3, this:r12_2, 0:r12_4 # 12| mu12_6() = ^CallSideEffect : ~m? # 12| mu12_7(Del) = Store : &:r12_1, r12_2 # 13| r13_1(glval) = VariableAddress[del1] : # 13| r13_2(Del) = Load : &:r13_1, ~m? # 13| r13_3() = FunctionAddress[Invoke] : # 13| r13_4(Int32) = Constant[5] : -# 13| v13_5(Void) = Call : func:r13_3, this:r13_2, 0:r13_4 +# 13| v13_5(Void) = Call[Invoke] : func:r13_3, this:r13_2, 0:r13_4 # 13| mu13_6() = ^CallSideEffect : ~m? # 11| v11_3(Void) = ReturnVoid : # 11| v11_4(Void) = AliasedUse : ~m? @@ -475,7 +475,7 @@ events.cs: # 10| r10_1(MyDel) = NewObj : # 10| r10_2() = FunctionAddress[MyDel] : # 10| r10_3(glval) = FunctionAddress[Fun] : -# 10| v10_4(Void) = Call : func:r10_2, this:r10_1, 0:r10_3 +# 10| v10_4(Void) = Call[MyDel] : func:r10_2, this:r10_1, 0:r10_3 # 10| mu10_5() = ^CallSideEffect : ~m? # 10| r10_6(Events) = CopyValue : r8_3 # 10| r10_7(glval) = FieldAddress[Inst] : r10_6 @@ -494,7 +494,7 @@ events.cs: # 15| r15_3(Events) = CopyValue : r13_3 # 15| r15_4(glval) = FieldAddress[Inst] : r15_3 # 15| r15_5(MyDel) = Load : &:r15_4, ~m? -# 15| v15_6(Void) = Call : func:r15_2, this:r15_1, 0:r15_5 +# 15| v15_6(Void) = Call[add_MyEvent] : func:r15_2, this:r15_1, 0:r15_5 # 15| mu15_7() = ^CallSideEffect : ~m? # 13| v13_4(Void) = ReturnVoid : # 13| v13_5(Void) = AliasedUse : ~m? @@ -510,7 +510,7 @@ events.cs: # 20| r20_3(Events) = CopyValue : r18_3 # 20| r20_4(glval) = FieldAddress[Inst] : r20_3 # 20| r20_5(MyDel) = Load : &:r20_4, ~m? -# 20| v20_6(Void) = Call : func:r20_2, this:r20_1, 0:r20_5 +# 20| v20_6(Void) = Call[remove_MyEvent] : func:r20_2, this:r20_1, 0:r20_5 # 20| mu20_7() = ^CallSideEffect : ~m? # 18| v18_4(Void) = ReturnVoid : # 18| v18_5(Void) = AliasedUse : ~m? @@ -541,26 +541,26 @@ events.cs: # 30| r30_1(glval) = VariableAddress[obj] : # 30| r30_2(Events) = NewObj : # 30| r30_3() = FunctionAddress[Events] : -# 30| v30_4(Void) = Call : func:r30_3, this:r30_2 +# 30| v30_4(Void) = Call[Events] : func:r30_3, this:r30_2 # 30| mu30_5() = ^CallSideEffect : ~m? # 30| mu30_6(Events) = Store : &:r30_1, r30_2 # 31| r31_1(glval) = VariableAddress[obj] : # 31| r31_2(Events) = Load : &:r31_1, ~m? # 31| r31_3() = FunctionAddress[AddEvent] : -# 31| v31_4(Void) = Call : func:r31_3, this:r31_2 +# 31| v31_4(Void) = Call[AddEvent] : func:r31_3, this:r31_2 # 31| mu31_5() = ^CallSideEffect : ~m? # 32| r32_1(glval) = VariableAddress[result] : # 32| r32_2(glval) = VariableAddress[obj] : # 32| r32_3(Events) = Load : &:r32_2, ~m? # 32| r32_4() = FunctionAddress[Invoke] : # 32| r32_5(String) = StringConstant["string"] : -# 32| v32_6(Void) = Call : func:r32_4, this:r32_3, 0:r32_5 +# 32| v32_6(Void) = Call[Invoke] : func:r32_4, this:r32_3, 0:r32_5 # 32| mu32_7() = ^CallSideEffect : ~m? # 32| mu32_8(String) = Store : &:r32_1, v32_6 # 33| r33_1(glval) = VariableAddress[obj] : # 33| r33_2(Events) = Load : &:r33_1, ~m? # 33| r33_3() = FunctionAddress[RemoveEvent] : -# 33| v33_4(Void) = Call : func:r33_3, this:r33_2 +# 33| v33_4(Void) = Call[RemoveEvent] : func:r33_3, this:r33_2 # 33| mu33_5() = ^CallSideEffect : ~m? # 28| v28_5(Void) = ReturnVoid : # 28| v28_6(Void) = AliasedUse : ~m? @@ -605,7 +605,7 @@ foreach.cs: # 7| r7_2(glval) = VariableAddress[a_array] : # 7| r7_3(Int32[]) = Load : &:r7_2, ~m? # 7| r7_4() = FunctionAddress[GetEnumerator] : -# 7| r7_5(IEnumerator) = Call : func:r7_4, this:r7_3 +# 7| r7_5(IEnumerator) = Call[GetEnumerator] : func:r7_4, this:r7_3 # 7| mu7_6() = ^CallSideEffect : ~m? # 7| mu7_7(IEnumerator) = Store : &:r7_1, r7_5 #-----| Goto -> Block 1 @@ -614,7 +614,7 @@ foreach.cs: # 7| r7_8(glval) = VariableAddress[#temp7:9] : # 7| r7_9(Boolean) = Load : &:r7_8, ~m? # 7| r7_10() = FunctionAddress[MoveNext] : -# 7| r7_11(Boolean) = Call : func:r7_10, this:r7_9 +# 7| r7_11(Boolean) = Call[MoveNext] : func:r7_10, this:r7_9 # 7| mu7_12() = ^CallSideEffect : ~m? # 7| v7_13(Void) = ConditionalBranch : r7_11 #-----| False -> Block 3 @@ -625,7 +625,7 @@ foreach.cs: # 7| r7_15(glval) = VariableAddress[#temp7:9] : # 7| r7_16(Boolean) = Load : &:r7_15, ~m? # 7| r7_17() = FunctionAddress[get_Current] : -# 7| r7_18(Int32) = Call : func:r7_17, this:r7_16 +# 7| r7_18(Int32) = Call[get_Current] : func:r7_17, this:r7_16 # 7| mu7_19() = ^CallSideEffect : ~m? # 7| mu7_20(Int32) = Store : &:r7_14, r7_18 # 9| r9_1(glval) = VariableAddress[x] : @@ -638,7 +638,7 @@ foreach.cs: # 7| r7_21(glval) = VariableAddress[#temp7:9] : # 7| r7_22(Boolean) = Load : &:r7_21, ~m? # 7| r7_23() = FunctionAddress[Dispose] : -# 7| v7_24(Void) = Call : func:r7_23, this:r7_22 +# 7| v7_24(Void) = Call[Dispose] : func:r7_23, this:r7_22 # 7| mu7_25() = ^CallSideEffect : ~m? # 4| v4_3(Void) = ReturnVoid : # 4| v4_4(Void) = AliasedUse : ~m? @@ -673,7 +673,7 @@ func_with_param_call.cs: # 12| r12_2() = FunctionAddress[f] : # 12| r12_3(Int32) = Constant[2] : # 12| r12_4(Int32) = Constant[3] : -# 12| r12_5(Int32) = Call : func:r12_2, 0:r12_3, 1:r12_4 +# 12| r12_5(Int32) = Call[f] : func:r12_2, 0:r12_3, 1:r12_4 # 12| mu12_6() = ^CallSideEffect : ~m? # 12| mu12_7(Int32) = Store : &:r12_1, r12_5 # 10| r10_3(glval) = VariableAddress[#return] : @@ -732,7 +732,7 @@ indexers.cs: # 21| r21_1(glval) = VariableAddress[inst] : # 21| r21_2(MyClass) = NewObj : # 21| r21_3() = FunctionAddress[MyClass] : -# 21| v21_4(Void) = Call : func:r21_3, this:r21_2 +# 21| v21_4(Void) = Call[MyClass] : func:r21_3, this:r21_2 # 21| mu21_5() = ^CallSideEffect : ~m? # 21| mu21_6(MyClass) = Store : &:r21_1, r21_2 # 22| r22_1(glval) = VariableAddress[inst] : @@ -740,14 +740,14 @@ indexers.cs: # 22| r22_3() = FunctionAddress[set_Item] : # 22| r22_4(Int32) = Constant[0] : # 22| r22_5(String) = StringConstant["str1"] : -# 22| v22_6(Void) = Call : func:r22_3, this:r22_2, 0:r22_4, 1:r22_5 +# 22| v22_6(Void) = Call[set_Item] : func:r22_3, this:r22_2, 0:r22_4, 1:r22_5 # 22| mu22_7() = ^CallSideEffect : ~m? # 23| r23_1(glval) = VariableAddress[inst] : # 23| r23_2(MyClass) = Load : &:r23_1, ~m? # 23| r23_3() = FunctionAddress[set_Item] : # 23| r23_4(Int32) = Constant[1] : # 23| r23_5(String) = StringConstant["str1"] : -# 23| v23_6(Void) = Call : func:r23_3, this:r23_2, 0:r23_4, 1:r23_5 +# 23| v23_6(Void) = Call[set_Item] : func:r23_3, this:r23_2, 0:r23_4, 1:r23_5 # 23| mu23_7() = ^CallSideEffect : ~m? # 24| r24_1(glval) = VariableAddress[inst] : # 24| r24_2(MyClass) = Load : &:r24_1, ~m? @@ -757,9 +757,9 @@ indexers.cs: # 24| r24_6(MyClass) = Load : &:r24_5, ~m? # 24| r24_7() = FunctionAddress[get_Item] : # 24| r24_8(Int32) = Constant[0] : -# 24| r24_9(String) = Call : func:r24_7, this:r24_6, 0:r24_8 +# 24| r24_9(String) = Call[get_Item] : func:r24_7, this:r24_6, 0:r24_8 # 24| mu24_10() = ^CallSideEffect : ~m? -# 24| v24_11(Void) = Call : func:r24_3, this:r24_2, 0:r24_4, 1:r24_9 +# 24| v24_11(Void) = Call[set_Item] : func:r24_3, this:r24_2, 0:r24_4, 1:r24_9 # 24| mu24_12() = ^CallSideEffect : ~m? # 19| v19_3(Void) = ReturnVoid : # 19| v19_4(Void) = AliasedUse : ~m? @@ -799,13 +799,13 @@ inheritance_polymorphism.cs: # 25| r25_1(glval) = VariableAddress[objB] : # 25| r25_2(B) = NewObj : # 25| r25_3() = FunctionAddress[B] : -# 25| v25_4(Void) = Call : func:r25_3, this:r25_2 +# 25| v25_4(Void) = Call[B] : func:r25_3, this:r25_2 # 25| mu25_5() = ^CallSideEffect : ~m? # 25| mu25_6(B) = Store : &:r25_1, r25_2 # 26| r26_1(glval) = VariableAddress[objB] : # 26| r26_2(B) = Load : &:r26_1, ~m? # 26| r26_3() = FunctionAddress[function] : -# 26| r26_4(Int32) = Call : func:r26_3, this:r26_2 +# 26| r26_4(Int32) = Call[function] : func:r26_3, this:r26_2 # 26| mu26_5() = ^CallSideEffect : ~m? # 29| r29_1(glval) = VariableAddress[objA] : # 29| mu29_2(A) = Uninitialized[objA] : &:r29_1 @@ -817,19 +817,19 @@ inheritance_polymorphism.cs: # 31| r31_1(glval) = VariableAddress[objA] : # 31| r31_2(A) = Load : &:r31_1, ~m? # 31| r31_3() = FunctionAddress[function] : -# 31| r31_4(Int32) = Call : func:r31_3, this:r31_2 +# 31| r31_4(Int32) = Call[function] : func:r31_3, this:r31_2 # 31| mu31_5() = ^CallSideEffect : ~m? # 33| r33_1(glval) = VariableAddress[objC] : # 33| r33_2(C) = NewObj : # 33| r33_3() = FunctionAddress[C] : -# 33| v33_4(Void) = Call : func:r33_3, this:r33_2 +# 33| v33_4(Void) = Call[C] : func:r33_3, this:r33_2 # 33| mu33_5() = ^CallSideEffect : ~m? # 33| r33_6(A) = Convert : r33_2 # 33| mu33_7(A) = Store : &:r33_1, r33_2 # 34| r34_1(glval) = VariableAddress[objC] : # 34| r34_2(A) = Load : &:r34_1, ~m? # 34| r34_3() = FunctionAddress[function] : -# 34| r34_4(Int32) = Call : func:r34_3, this:r34_2 +# 34| r34_4(Int32) = Call[function] : func:r34_3, this:r34_2 # 34| mu34_5() = ^CallSideEffect : ~m? # 23| v23_3(Void) = ReturnVoid : # 23| v23_4(Void) = AliasedUse : ~m? @@ -905,7 +905,7 @@ inoutref.cs: # 26| r26_4(glval) = VariableAddress[c1] : # 26| r26_5(MyClass) = Load : &:r26_4, ~m? # 26| r26_6(MyClass) = Load : &:r26_5, ~m? -# 26| v26_7(Void) = Call : func:r26_1, 0:r26_3, 1:r26_6 +# 26| v26_7(Void) = Call[set] : func:r26_1, 0:r26_3, 1:r26_6 # 26| mu26_8() = ^CallSideEffect : ~m? # 16| v16_13(Void) = ReturnVoid : # 16| v16_14(Void) = AliasedUse : ~m? @@ -921,14 +921,14 @@ inoutref.cs: # 32| r32_1(glval) = VariableAddress[b] : # 32| r32_2(MyStruct) = NewObj : # 32| r32_3() = FunctionAddress[MyStruct] : -# 32| v32_4(Void) = Call : func:r32_3, this:r32_2 +# 32| v32_4(Void) = Call[MyStruct] : func:r32_3, this:r32_2 # 32| mu32_5() = ^CallSideEffect : ~m? # 32| r32_6(MyStruct) = Load : &:r32_2, ~m? # 32| mu32_7(MyStruct) = Store : &:r32_1, r32_6 # 33| r33_1(glval) = VariableAddress[c] : # 33| r33_2(MyClass) = NewObj : # 33| r33_3() = FunctionAddress[MyClass] : -# 33| v33_4(Void) = Call : func:r33_3, this:r33_2 +# 33| v33_4(Void) = Call[MyClass] : func:r33_3, this:r33_2 # 33| mu33_5() = ^CallSideEffect : ~m? # 33| mu33_6(MyClass) = Store : &:r33_1, r33_2 # 34| r34_1() = FunctionAddress[F] : @@ -937,7 +937,7 @@ inoutref.cs: # 34| r34_4(glval) = VariableAddress[b] : # 34| r34_5(glval) = VariableAddress[c] : # 34| r34_6(glval) = VariableAddress[c] : -# 34| v34_7(Void) = Call : func:r34_1, 0:r34_2, 1:r34_3, 2:r34_4, 3:r34_5, 4:r34_6 +# 34| v34_7(Void) = Call[F] : func:r34_1, 0:r34_2, 1:r34_3, 2:r34_4, 3:r34_5, 4:r34_6 # 34| mu34_8() = ^CallSideEffect : ~m? # 36| r36_1(glval) = VariableAddress[x] : # 36| r36_2(glval) = VariableAddress[b] : @@ -1058,7 +1058,7 @@ jumps.cs: # 13| Block 6 # 13| r13_1() = FunctionAddress[WriteLine] : # 13| r13_2(String) = StringConstant["BreakAndContinue"] : -# 13| v13_3(Void) = Call : func:r13_1, 0:r13_2 +# 13| v13_3(Void) = Call[WriteLine] : func:r13_1, 0:r13_2 # 13| mu13_4() = ^CallSideEffect : ~m? #-----| Goto -> Block 19 @@ -1177,7 +1177,7 @@ jumps.cs: # 37| v37_1(Void) = NoOp : # 38| r38_1() = FunctionAddress[WriteLine] : # 38| r38_2(String) = StringConstant["Done"] : -# 38| v38_3(Void) = Call : func:r38_1, 0:r38_2 +# 38| v38_3(Void) = Call[WriteLine] : func:r38_1, 0:r38_2 # 38| mu38_4() = ^CallSideEffect : ~m? # 5| v5_3(Void) = ReturnVoid : # 5| v5_4(Void) = AliasedUse : ~m? @@ -1191,7 +1191,7 @@ lock.cs: # 7| r7_1(glval) = VariableAddress[object] : # 7| r7_2(Object) = NewObj : # 7| r7_3() = FunctionAddress[Object] : -# 7| v7_4(Void) = Call : func:r7_3, this:r7_2 +# 7| v7_4(Void) = Call[Object] : func:r7_3, this:r7_2 # 7| mu7_5() = ^CallSideEffect : ~m? # 7| mu7_6(Object) = Store : &:r7_1, r7_2 # 8| r8_1(glval) = VariableAddress[#temp8:9] : @@ -1205,15 +1205,15 @@ lock.cs: # 8| r8_9(glval) = VariableAddress[#temp8:9] : # 8| r8_10(Object) = Load : &:r8_9, ~m? # 8| r8_11(glval) = VariableAddress[#temp8:9] : -# 8| v8_12(Void) = Call : func:r8_8, 0:r8_10, 1:r8_11 +# 8| v8_12(Void) = Call[Enter] : func:r8_8, 0:r8_10, 1:r8_11 # 8| mu8_13() = ^CallSideEffect : ~m? # 10| r10_1() = FunctionAddress[WriteLine] : # 10| r10_2(glval) = VariableAddress[object] : # 10| r10_3(Object) = Load : &:r10_2, ~m? # 10| r10_4() = FunctionAddress[ToString] : -# 10| r10_5(String) = Call : func:r10_4, this:r10_3 +# 10| r10_5(String) = Call[ToString] : func:r10_4, this:r10_3 # 10| mu10_6() = ^CallSideEffect : ~m? -# 10| v10_7(Void) = Call : func:r10_1, 0:r10_5 +# 10| v10_7(Void) = Call[WriteLine] : func:r10_1, 0:r10_5 # 10| mu10_8() = ^CallSideEffect : ~m? # 8| r8_14(glval) = VariableAddress[#temp8:9] : # 8| r8_15(Boolean) = Load : &:r8_14, ~m? @@ -1230,7 +1230,7 @@ lock.cs: # 8| r8_17() = FunctionAddress[Exit] : # 8| r8_18(glval) = VariableAddress[#temp8:9] : # 8| r8_19(Object) = Load : &:r8_18, ~m? -# 8| v8_20(Void) = Call : func:r8_17, 0:r8_19 +# 8| v8_20(Void) = Call[Exit] : func:r8_17, 0:r8_19 # 8| mu8_21() = ^CallSideEffect : ~m? #-----| Goto -> Block 1 @@ -1280,13 +1280,13 @@ obj_creation.cs: # 23| r23_2(MyClass) = NewObj : # 23| r23_3() = FunctionAddress[MyClass] : # 23| r23_4(Int32) = Constant[100] : -# 23| v23_5(Void) = Call : func:r23_3, this:r23_2, 0:r23_4 +# 23| v23_5(Void) = Call[MyClass] : func:r23_3, this:r23_2, 0:r23_4 # 23| mu23_6() = ^CallSideEffect : ~m? # 23| mu23_7(MyClass) = Store : &:r23_1, r23_2 # 24| r24_1(glval) = VariableAddress[obj_initlist] : # 24| r24_2(MyClass) = NewObj : # 24| r24_3() = FunctionAddress[MyClass] : -# 24| v24_4(Void) = Call : func:r24_3, this:r24_2 +# 24| v24_4(Void) = Call[MyClass] : func:r24_3, this:r24_2 # 24| mu24_5() = ^CallSideEffect : ~m? # 24| r24_6(Int32) = Constant[101] : # 24| r24_7(glval) = FieldAddress[x] : r24_2 @@ -1302,9 +1302,9 @@ obj_creation.cs: # 27| r27_2(MyClass) = NewObj : # 27| r27_3() = FunctionAddress[MyClass] : # 27| r27_4(Int32) = Constant[100] : -# 27| v27_5(Void) = Call : func:r27_3, this:r27_2, 0:r27_4 +# 27| v27_5(Void) = Call[MyClass] : func:r27_3, this:r27_2, 0:r27_4 # 27| mu27_6() = ^CallSideEffect : ~m? -# 27| v27_7(Void) = Call : func:r27_1, 0:r27_2 +# 27| v27_7(Void) = Call[SomeFun] : func:r27_1, 0:r27_2 # 27| mu27_8() = ^CallSideEffect : ~m? # 21| v21_3(Void) = ReturnVoid : # 21| v21_4(Void) = AliasedUse : ~m? @@ -1321,7 +1321,7 @@ pointers.cs: # 5| r5_2(glval) = VariableAddress[arr] : # 5| r5_3(Int32[]) = Load : &:r5_2, ~m? # 5| r5_4() = FunctionAddress[get_Length] : -# 5| r5_5(Int32) = Call : func:r5_4, this:r5_3 +# 5| r5_5(Int32) = Call[get_Length] : func:r5_4, this:r5_3 # 5| mu5_6() = ^CallSideEffect : ~m? # 5| mu5_7(Int32) = Store : &:r5_1, r5_5 # 6| r6_1(glval) = VariableAddress[b] : @@ -1377,13 +1377,13 @@ pointers.cs: # 26| r26_1(glval) = VariableAddress[o] : # 26| r26_2(MyClass) = NewObj : # 26| r26_3() = FunctionAddress[MyClass] : -# 26| v26_4(Void) = Call : func:r26_3, this:r26_2 +# 26| v26_4(Void) = Call[MyClass] : func:r26_3, this:r26_2 # 26| mu26_5() = ^CallSideEffect : ~m? # 26| mu26_6(MyClass) = Store : &:r26_1, r26_2 # 27| r27_1(glval) = VariableAddress[s] : # 27| r27_2(MyStruct) = NewObj : # 27| r27_3() = FunctionAddress[MyStruct] : -# 27| v27_4(Void) = Call : func:r27_3, this:r27_2 +# 27| v27_4(Void) = Call[MyStruct] : func:r27_3, this:r27_2 # 27| mu27_5() = ^CallSideEffect : ~m? # 27| r27_6(MyStruct) = Load : &:r27_2, ~m? # 27| mu27_7(MyStruct) = Store : &:r27_1, r27_6 @@ -1431,7 +1431,7 @@ pointers.cs: # 40| r40_1() = FunctionAddress[addone] : # 40| r40_2(glval) = VariableAddress[arr] : # 40| r40_3(Int32[]) = Load : &:r40_2, ~m? -# 40| v40_4(Void) = Call : func:r40_1, 0:r40_3 +# 40| v40_4(Void) = Call[addone] : func:r40_1, 0:r40_3 # 40| mu40_5() = ^CallSideEffect : ~m? # 25| v25_3(Void) = ReturnVoid : # 25| v25_4(Void) = AliasedUse : ~m? @@ -1446,7 +1446,7 @@ prop.cs: # 9| r9_1(glval) = VariableAddress[#return] : # 9| r9_2(PropClass) = CopyValue : r7_3 # 9| r9_3() = FunctionAddress[func] : -# 9| r9_4(Int32) = Call : func:r9_3, this:r9_2 +# 9| r9_4(Int32) = Call[func] : func:r9_3, this:r9_2 # 9| mu9_5() = ^CallSideEffect : ~m? # 9| mu9_6(Int32) = Store : &:r9_1, r9_4 # 7| r7_4(glval) = VariableAddress[#return] : @@ -1489,20 +1489,20 @@ prop.cs: # 28| r28_1(glval) = VariableAddress[obj] : # 28| r28_2(PropClass) = NewObj : # 28| r28_3() = FunctionAddress[PropClass] : -# 28| v28_4(Void) = Call : func:r28_3, this:r28_2 +# 28| v28_4(Void) = Call[PropClass] : func:r28_3, this:r28_2 # 28| mu28_5() = ^CallSideEffect : ~m? # 28| mu28_6(PropClass) = Store : &:r28_1, r28_2 # 29| r29_1(glval) = VariableAddress[obj] : # 29| r29_2(PropClass) = Load : &:r29_1, ~m? # 29| r29_3() = FunctionAddress[set_Prop] : # 29| r29_4(Int32) = Constant[5] : -# 29| v29_5(Void) = Call : func:r29_3, this:r29_2, 0:r29_4 +# 29| v29_5(Void) = Call[set_Prop] : func:r29_3, this:r29_2, 0:r29_4 # 29| mu29_6() = ^CallSideEffect : ~m? # 30| r30_1(glval) = VariableAddress[x] : # 30| r30_2(glval) = VariableAddress[obj] : # 30| r30_3(PropClass) = Load : &:r30_2, ~m? # 30| r30_4() = FunctionAddress[get_Prop] : -# 30| r30_5(Int32) = Call : func:r30_4, this:r30_3 +# 30| r30_5(Int32) = Call[get_Prop] : func:r30_4, this:r30_3 # 30| mu30_6() = ^CallSideEffect : ~m? # 30| mu30_7(Int32) = Store : &:r30_1, r30_5 # 26| v26_3(Void) = ReturnVoid : @@ -1529,7 +1529,7 @@ simple_call.cs: # 10| r10_3(glval) = InitializeThis : # 12| r12_1(glval) = VariableAddress[#return] : # 12| r12_2() = FunctionAddress[f] : -# 12| r12_3(Int32) = Call : func:r12_2 +# 12| r12_3(Int32) = Call[f] : func:r12_2 # 12| mu12_4() = ^CallSideEffect : ~m? # 12| mu12_5(Int32) = Store : &:r12_1, r12_3 # 10| r10_4(glval) = VariableAddress[#return] : @@ -1624,7 +1624,7 @@ stmts.cs: # 24| r24_1(glval) = VariableAddress[caseSwitch] : # 24| r24_2(Object) = NewObj : # 24| r24_3() = FunctionAddress[Object] : -# 24| v24_4(Void) = Call : func:r24_3, this:r24_2 +# 24| v24_4(Void) = Call[Object] : func:r24_3, this:r24_2 # 24| mu24_5() = ^CallSideEffect : ~m? # 24| mu24_6(Object) = Store : &:r24_1, r24_2 # 25| r25_1(glval) = VariableAddress[select] : @@ -1709,7 +1709,7 @@ stmts.cs: # 52| r52_1(glval) = VariableAddress[#throw52:17] : # 52| r52_2(Exception) = NewObj : # 52| r52_3() = FunctionAddress[Exception] : -# 52| v52_4(Void) = Call : func:r52_3, this:r52_2 +# 52| v52_4(Void) = Call[Exception] : func:r52_3, this:r52_2 # 52| mu52_5() = ^CallSideEffect : ~m? # 52| mu52_6(Exception) = Store : &:r52_1, r52_2 # 52| v52_7(Void) = ThrowValue : &:r52_1, ~m? @@ -1919,35 +1919,35 @@ using.cs: # 14| r14_1(glval) = VariableAddress[o1] : # 14| r14_2(MyDisposable) = NewObj : # 14| r14_3() = FunctionAddress[MyDisposable] : -# 14| v14_4(Void) = Call : func:r14_3, this:r14_2 +# 14| v14_4(Void) = Call[MyDisposable] : func:r14_3, this:r14_2 # 14| mu14_5() = ^CallSideEffect : ~m? # 14| mu14_6(MyDisposable) = Store : &:r14_1, r14_2 # 16| r16_1(glval) = VariableAddress[o1] : # 16| r16_2(MyDisposable) = Load : &:r16_1, ~m? # 16| r16_3() = FunctionAddress[DoSomething] : -# 16| v16_4(Void) = Call : func:r16_3, this:r16_2 +# 16| v16_4(Void) = Call[DoSomething] : func:r16_3, this:r16_2 # 16| mu16_5() = ^CallSideEffect : ~m? # 19| r19_1(glval) = VariableAddress[o2] : # 19| r19_2(MyDisposable) = NewObj : # 19| r19_3() = FunctionAddress[MyDisposable] : -# 19| v19_4(Void) = Call : func:r19_3, this:r19_2 +# 19| v19_4(Void) = Call[MyDisposable] : func:r19_3, this:r19_2 # 19| mu19_5() = ^CallSideEffect : ~m? # 19| mu19_6(MyDisposable) = Store : &:r19_1, r19_2 # 22| r22_1(glval) = VariableAddress[o2] : # 22| r22_2(MyDisposable) = Load : &:r22_1, ~m? # 22| r22_3() = FunctionAddress[DoSomething] : -# 22| v22_4(Void) = Call : func:r22_3, this:r22_2 +# 22| v22_4(Void) = Call[DoSomething] : func:r22_3, this:r22_2 # 22| mu22_5() = ^CallSideEffect : ~m? # 25| r25_1(glval) = VariableAddress[o3] : # 25| r25_2(MyDisposable) = NewObj : # 25| r25_3() = FunctionAddress[MyDisposable] : -# 25| v25_4(Void) = Call : func:r25_3, this:r25_2 +# 25| v25_4(Void) = Call[MyDisposable] : func:r25_3, this:r25_2 # 25| mu25_5() = ^CallSideEffect : ~m? # 25| mu25_6(MyDisposable) = Store : &:r25_1, r25_2 # 26| r26_1(glval) = VariableAddress[o3] : # 26| r26_2(MyDisposable) = Load : &:r26_1, ~m? # 26| r26_3() = FunctionAddress[DoSomething] : -# 26| v26_4(Void) = Call : func:r26_3, this:r26_2 +# 26| v26_4(Void) = Call[DoSomething] : func:r26_3, this:r26_2 # 26| mu26_5() = ^CallSideEffect : ~m? # 12| v12_3(Void) = ReturnVoid : # 12| v12_4(Void) = AliasedUse : ~m? From 9afddf0dadde118459dda789d149a2434b515dde Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Fri, 16 Oct 2020 12:56:46 -0400 Subject: [PATCH 13/53] Insert a load of the temporary object for arguments passed by value --- .../raw/internal/TranslatedElement.qll | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll index 821e6449bbb0..79552db90e50 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll @@ -256,7 +256,17 @@ private predicate ignoreLoad(Expr expr) { private predicate needsLoadForParentExpr(Expr expr) { exists(CrementOperation crement | expr = crement.getOperand().getFullyConverted()) or - exists(AssignOperation ao | expr = ao.getLValue().getFullyConverted()) + exists(AssignOperation ao | expr = ao.getLValue().getFullyConverted()) or + // For arguments that are passed by value but require a constructor call, the extractor emits a + // `TemporaryObjectExpr` as the argument, and marks it as a glvalue. This is roughly how a code- + // generating compiler would implement this, passing the address of the temporary so that the + // callee is using the exact same memory location allocated by the caller. We don't fully model + // this yet, though, so we'll synthesize a load so that we appear to be passing the temporary + // object via a bitwise copy. + exists(Call call | + expr = call.getAnArgument().getFullyConverted().(TemporaryObjectExpr) and + expr.isGLValueCategory() + ) } /** From cf19fcf4c07f37c4a88bb7516ed89f2a75ff292a Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Fri, 16 Oct 2020 16:55:59 -0400 Subject: [PATCH 14/53] C++: Improve dataflow model for copy/move constructors --- .../cpp/models/implementations/MemberFunction.qll | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/MemberFunction.qll b/cpp/ql/src/semmle/code/cpp/models/implementations/MemberFunction.qll index 0e4812cc25cc..70bf37a96d38 100644 --- a/cpp/ql/src/semmle/code/cpp/models/implementations/MemberFunction.qll +++ b/cpp/ql/src/semmle/code/cpp/models/implementations/MemberFunction.qll @@ -35,7 +35,11 @@ class ConversionConstructorModel extends Constructor, TaintFunction { class CopyConstructorModel extends CopyConstructor, DataFlowFunction { override predicate hasDataFlow(FunctionInput input, FunctionOutput output) { // data flow from the first constructor argument to the returned object - input.isParameter(0) and + ( + input.isParameter(0) + or + input.isParameterDeref(0) + ) and ( output.isReturnValue() or @@ -50,7 +54,11 @@ class CopyConstructorModel extends CopyConstructor, DataFlowFunction { class MoveConstructorModel extends MoveConstructor, DataFlowFunction { override predicate hasDataFlow(FunctionInput input, FunctionOutput output) { // data flow from the first constructor argument to the returned object - input.isParameter(0) and + ( + input.isParameter(0) + or + input.isParameterDeref(0) + ) and ( output.isReturnValue() or From af799a79da5c8ad9274a2e81be351b77041abb3e Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Fri, 16 Oct 2020 17:07:46 -0400 Subject: [PATCH 15/53] Accept good test diffs --- .../dataflow/taint-tests/test_ir.expected | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected index 811f5d1bdbd0..4db82a358910 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected @@ -26,6 +26,7 @@ | copyableclass.cpp:67:11:67:21 | (reference dereference) | copyableclass.cpp:67:13:67:18 | call to source | | copyableclass_declonly.cpp:40:8:40:9 | s1 | copyableclass_declonly.cpp:34:30:34:35 | call to source | | copyableclass_declonly.cpp:41:8:41:9 | s2 | copyableclass_declonly.cpp:35:32:35:37 | call to source | +| copyableclass_declonly.cpp:42:8:42:9 | s3 | copyableclass_declonly.cpp:34:30:34:35 | call to source | | copyableclass_declonly.cpp:43:8:43:9 | s4 | copyableclass_declonly.cpp:38:8:38:13 | call to source | | copyableclass_declonly.cpp:65:8:65:9 | s1 | copyableclass_declonly.cpp:60:56:60:61 | call to source | | copyableclass_declonly.cpp:66:8:66:9 | s2 | copyableclass_declonly.cpp:63:32:63:37 | call to source | @@ -179,9 +180,13 @@ | string.cpp:130:8:130:8 | c | string.cpp:120:16:120:21 | call to source | | string.cpp:135:8:135:8 | (reference dereference) | string.cpp:133:28:133:33 | call to source | | string.cpp:135:8:135:8 | c | string.cpp:133:28:133:33 | call to source | +| string.cpp:145:8:145:14 | Argument 0 indirection | string.cpp:142:18:142:23 | call to source | | string.cpp:145:11:145:11 | call to operator+ | string.cpp:142:18:142:23 | call to source | +| string.cpp:146:8:146:14 | Argument 0 indirection | string.cpp:142:18:142:23 | call to source | | string.cpp:146:11:146:11 | call to operator+ | string.cpp:142:18:142:23 | call to source | +| string.cpp:147:8:147:14 | Argument 0 indirection | string.cpp:142:18:142:23 | call to source | | string.cpp:147:11:147:11 | call to operator+ | string.cpp:142:18:142:23 | call to source | +| string.cpp:150:8:150:20 | Argument 0 indirection | string.cpp:150:13:150:18 | call to source | | string.cpp:150:11:150:11 | call to operator+ | string.cpp:150:13:150:18 | call to source | | string.cpp:159:8:159:9 | Argument 0 indirection | string.cpp:155:18:155:23 | call to source | | string.cpp:163:8:163:9 | Argument 0 indirection | string.cpp:155:18:155:23 | call to source | @@ -210,6 +215,7 @@ | string.cpp:295:7:295:8 | Argument 0 indirection | string.cpp:291:17:291:22 | call to source | | string.cpp:301:7:301:8 | Argument 0 indirection | string.cpp:289:17:289:22 | call to source | | string.cpp:303:7:303:8 | Argument 0 indirection | string.cpp:291:17:291:22 | call to source | +| string.cpp:323:7:323:29 | Argument 0 indirection | string.cpp:320:16:320:21 | call to source | | string.cpp:323:9:323:14 | call to substr | string.cpp:320:16:320:21 | call to source | | string.cpp:364:8:364:9 | Argument 0 indirection | string.cpp:358:18:358:23 | call to source | | string.cpp:382:8:382:8 | call to operator* | string.cpp:374:18:374:23 | call to source | @@ -222,6 +228,8 @@ | string.cpp:407:8:407:11 | (reference dereference) | string.cpp:389:18:389:23 | call to source | | string.cpp:415:8:415:8 | call to operator* | string.cpp:389:18:389:23 | call to source | | string.cpp:415:8:415:11 | (reference dereference) | string.cpp:389:18:389:23 | call to source | +| string.cpp:419:8:419:10 | call to iterator | string.cpp:389:18:389:23 | call to source | +| string.cpp:422:8:422:10 | call to iterator | string.cpp:389:18:389:23 | call to source | | string.cpp:437:7:437:8 | Argument 0 indirection | string.cpp:431:14:431:19 | call to source | | string.cpp:450:8:450:8 | Argument 0 indirection | string.cpp:449:32:449:46 | call to source | | string.cpp:463:8:463:8 | Argument 0 indirection | string.cpp:457:18:457:23 | call to source | @@ -244,13 +252,16 @@ | stringstream.cpp:34:23:34:31 | (reference dereference) | stringstream.cpp:34:14:34:19 | call to source | | stringstream.cpp:38:7:38:9 | Argument 0 indirection | stringstream.cpp:32:14:32:19 | call to source | | stringstream.cpp:40:7:40:9 | Argument 0 indirection | stringstream.cpp:34:14:34:19 | call to source | +| stringstream.cpp:43:7:43:15 | Argument 0 indirection | stringstream.cpp:32:14:32:19 | call to source | | stringstream.cpp:43:11:43:13 | call to str | stringstream.cpp:32:14:32:19 | call to source | +| stringstream.cpp:45:7:45:15 | Argument 0 indirection | stringstream.cpp:34:14:34:19 | call to source | | stringstream.cpp:45:11:45:13 | call to str | stringstream.cpp:34:14:34:19 | call to source | | stringstream.cpp:52:7:52:9 | Argument 0 indirection | stringstream.cpp:49:10:49:15 | call to source | | stringstream.cpp:53:7:53:9 | Argument 0 indirection | stringstream.cpp:50:10:50:15 | call to source | | stringstream.cpp:59:7:59:9 | Argument 0 indirection | stringstream.cpp:56:15:56:29 | call to source | | stringstream.cpp:66:7:66:10 | Argument 0 indirection | stringstream.cpp:63:18:63:23 | call to source | | stringstream.cpp:81:7:81:9 | Argument 0 indirection | stringstream.cpp:70:32:70:37 | source | +| stringstream.cpp:83:7:83:15 | Argument 0 indirection | stringstream.cpp:70:32:70:37 | source | | stringstream.cpp:83:11:83:13 | call to str | stringstream.cpp:70:32:70:37 | source | | stringstream.cpp:85:7:85:8 | v2 | stringstream.cpp:70:32:70:37 | source | | stringstream.cpp:103:7:103:9 | Argument 0 indirection | stringstream.cpp:91:19:91:24 | call to source | @@ -264,10 +275,15 @@ | stringstream.cpp:143:11:143:22 | (reference dereference) | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:149:7:149:8 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:150:7:150:8 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source | +| stringstream.cpp:157:7:157:8 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:157:7:157:8 | call to basic_string | stringstream.cpp:143:14:143:19 | call to source | +| stringstream.cpp:158:7:158:8 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:158:7:158:8 | call to basic_string | stringstream.cpp:143:14:143:19 | call to source | +| stringstream.cpp:168:7:168:8 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:168:7:168:8 | call to basic_string | stringstream.cpp:143:14:143:19 | call to source | +| stringstream.cpp:170:7:170:8 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:170:7:170:8 | call to basic_string | stringstream.cpp:143:14:143:19 | call to source | +| stringstream.cpp:172:7:172:9 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:172:7:172:9 | call to basic_string | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:175:7:175:20 | ... = ... | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:177:7:177:21 | ... = ... | stringstream.cpp:143:14:143:19 | call to source | @@ -275,16 +291,22 @@ | stringstream.cpp:183:7:183:8 | c4 | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:185:7:185:8 | c6 | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:197:10:197:12 | call to get | stringstream.cpp:196:18:196:32 | call to source | +| stringstream.cpp:219:7:219:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:219:7:219:8 | call to basic_string | stringstream.cpp:203:24:203:29 | call to source | +| stringstream.cpp:220:7:220:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:220:7:220:8 | call to basic_string | stringstream.cpp:203:24:203:29 | call to source | +| stringstream.cpp:227:7:227:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:227:7:227:8 | call to basic_string | stringstream.cpp:203:24:203:29 | call to source | +| stringstream.cpp:228:7:228:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:228:7:228:8 | call to basic_string | stringstream.cpp:203:24:203:29 | call to source | +| stringstream.cpp:231:7:231:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:231:7:231:8 | call to basic_string | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:239:7:239:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:240:7:240:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:247:7:247:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:248:7:248:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:251:7:251:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | +| stringstream.cpp:263:7:263:8 | Argument 0 indirection | stringstream.cpp:257:24:257:29 | call to source | | stringstream.cpp:263:7:263:8 | call to basic_string | stringstream.cpp:257:24:257:29 | call to source | | structlikeclass.cpp:35:8:35:9 | s1 | structlikeclass.cpp:29:22:29:27 | call to source | | structlikeclass.cpp:36:8:36:9 | s2 | structlikeclass.cpp:30:24:30:29 | call to source | @@ -297,6 +319,7 @@ | swap1.cpp:78:12:78:16 | data1 | swap1.cpp:71:15:71:20 | call to source | | swap1.cpp:79:12:79:16 | data1 | swap1.cpp:71:15:71:20 | call to source | | swap1.cpp:83:13:83:17 | data1 | swap1.cpp:82:16:82:21 | call to source | +| swap1.cpp:87:13:87:17 | data1 | swap1.cpp:82:16:82:21 | call to source | | swap1.cpp:88:13:88:17 | data1 | swap1.cpp:82:16:82:21 | call to source | | swap1.cpp:97:12:97:16 | data1 | swap1.cpp:95:15:95:20 | call to source | | swap1.cpp:102:12:102:16 | data1 | swap1.cpp:95:15:95:20 | call to source | @@ -313,6 +336,7 @@ | swap2.cpp:78:12:78:16 | data1 | swap2.cpp:71:15:71:20 | call to source | | swap2.cpp:79:12:79:16 | data1 | swap2.cpp:71:15:71:20 | call to source | | swap2.cpp:83:13:83:17 | data1 | swap2.cpp:82:16:82:21 | call to source | +| swap2.cpp:87:13:87:17 | data1 | swap2.cpp:82:16:82:21 | call to source | | swap2.cpp:88:13:88:17 | data1 | swap2.cpp:82:16:82:21 | call to source | | swap2.cpp:97:12:97:16 | data1 | swap2.cpp:95:15:95:20 | call to source | | swap2.cpp:102:12:102:16 | data1 | swap2.cpp:95:15:95:20 | call to source | @@ -398,6 +422,7 @@ | vector.cpp:258:8:258:9 | Argument 0 indirection | vector.cpp:239:15:239:20 | call to source | | vector.cpp:259:8:259:9 | Argument 0 indirection | vector.cpp:239:15:239:20 | call to source | | vector.cpp:260:8:260:9 | Argument 0 indirection | vector.cpp:239:15:239:20 | call to source | +| vector.cpp:261:8:261:9 | Argument 0 indirection | vector.cpp:239:15:239:20 | call to source | | vector.cpp:273:8:273:9 | Argument 0 indirection | vector.cpp:269:18:269:31 | call to source | | vector.cpp:274:8:274:9 | Argument 0 indirection | vector.cpp:270:18:270:35 | call to source | | vector.cpp:275:8:275:9 | Argument 0 indirection | vector.cpp:271:18:271:34 | call to source | From 675256acab1e97cc779cd756d98cca772a6ec81e Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Fri, 16 Oct 2020 17:14:41 -0400 Subject: [PATCH 16/53] Accept test diffs from `set.cpp` (50 new good results!) --- .../dataflow/taint-tests/test_ir.expected | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected index 4db82a358910..c8eabde99a58 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected @@ -137,26 +137,76 @@ | movableclass.cpp:65:11:65:21 | (reference dereference) | movableclass.cpp:65:13:65:18 | call to source | | set.cpp:20:7:20:31 | call to iterator | set.cpp:20:17:20:22 | call to source | | set.cpp:22:10:22:15 | call to insert | set.cpp:22:29:22:34 | call to source | +| set.cpp:26:7:26:8 | call to set | set.cpp:20:17:20:22 | call to source | +| set.cpp:28:7:28:8 | call to set | set.cpp:22:29:22:34 | call to source | +| set.cpp:30:7:30:8 | call to set | set.cpp:20:17:20:22 | call to source | | set.cpp:32:10:32:13 | call to find | set.cpp:20:17:20:22 | call to source | | set.cpp:34:10:34:13 | call to find | set.cpp:22:29:22:34 | call to source | | set.cpp:36:10:36:13 | call to find | set.cpp:20:17:20:22 | call to source | +| set.cpp:44:7:44:8 | call to set | set.cpp:20:17:20:22 | call to source | +| set.cpp:45:7:45:8 | call to set | set.cpp:20:17:20:22 | call to source | +| set.cpp:46:7:46:8 | call to set | set.cpp:20:17:20:22 | call to source | +| set.cpp:47:7:47:9 | call to set | set.cpp:20:17:20:22 | call to source | +| set.cpp:48:10:48:13 | call to find | set.cpp:20:17:20:22 | call to source | +| set.cpp:49:10:49:13 | call to find | set.cpp:20:17:20:22 | call to source | | set.cpp:50:10:50:13 | call to find | set.cpp:20:17:20:22 | call to source | | set.cpp:51:11:51:14 | call to find | set.cpp:20:17:20:22 | call to source | | set.cpp:61:8:61:8 | call to operator* | set.cpp:20:17:20:22 | call to source | | set.cpp:61:8:61:11 | (reference dereference) | set.cpp:20:17:20:22 | call to source | +| set.cpp:78:7:78:9 | call to set | set.cpp:76:13:76:18 | call to source | +| set.cpp:81:7:81:9 | call to set | set.cpp:77:13:77:18 | call to source | +| set.cpp:84:7:84:9 | call to set | set.cpp:76:13:76:18 | call to source | +| set.cpp:85:7:85:9 | call to set | set.cpp:76:13:76:18 | call to source | +| set.cpp:86:7:86:9 | call to set | set.cpp:77:13:77:18 | call to source | +| set.cpp:87:7:87:9 | call to set | set.cpp:77:13:77:18 | call to source | +| set.cpp:95:7:95:9 | call to set | set.cpp:91:13:91:18 | call to source | +| set.cpp:98:7:98:9 | call to set | set.cpp:94:13:94:18 | call to source | +| set.cpp:101:7:101:9 | call to set | set.cpp:91:13:91:18 | call to source | +| set.cpp:104:7:104:9 | call to set | set.cpp:94:13:94:18 | call to source | +| set.cpp:110:7:110:9 | call to set | set.cpp:108:13:108:18 | call to source | +| set.cpp:110:7:110:9 | call to set | set.cpp:109:13:109:18 | call to source | | set.cpp:111:11:111:15 | call to erase | set.cpp:108:13:108:18 | call to source | | set.cpp:111:11:111:15 | call to erase | set.cpp:109:13:109:18 | call to source | +| set.cpp:112:7:112:9 | call to set | set.cpp:108:13:108:18 | call to source | +| set.cpp:112:7:112:9 | call to set | set.cpp:109:13:109:18 | call to source | +| set.cpp:114:7:114:9 | call to set | set.cpp:108:13:108:18 | call to source | +| set.cpp:114:7:114:9 | call to set | set.cpp:109:13:109:18 | call to source | | set.cpp:134:7:134:31 | call to iterator | set.cpp:134:17:134:22 | call to source | | set.cpp:136:10:136:15 | call to insert | set.cpp:136:29:136:34 | call to source | +| set.cpp:140:7:140:8 | call to unordered_set | set.cpp:134:17:134:22 | call to source | +| set.cpp:142:7:142:8 | call to unordered_set | set.cpp:136:29:136:34 | call to source | +| set.cpp:144:7:144:8 | call to unordered_set | set.cpp:134:17:134:22 | call to source | | set.cpp:146:10:146:13 | call to find | set.cpp:134:17:134:22 | call to source | | set.cpp:148:10:148:13 | call to find | set.cpp:136:29:136:34 | call to source | | set.cpp:150:10:150:13 | call to find | set.cpp:134:17:134:22 | call to source | +| set.cpp:158:7:158:8 | call to unordered_set | set.cpp:134:17:134:22 | call to source | +| set.cpp:159:7:159:8 | call to unordered_set | set.cpp:134:17:134:22 | call to source | +| set.cpp:160:7:160:8 | call to unordered_set | set.cpp:134:17:134:22 | call to source | +| set.cpp:161:7:161:9 | call to unordered_set | set.cpp:134:17:134:22 | call to source | +| set.cpp:162:10:162:13 | call to find | set.cpp:134:17:134:22 | call to source | +| set.cpp:163:10:163:13 | call to find | set.cpp:134:17:134:22 | call to source | | set.cpp:164:10:164:13 | call to find | set.cpp:134:17:134:22 | call to source | | set.cpp:165:11:165:14 | call to find | set.cpp:134:17:134:22 | call to source | | set.cpp:175:8:175:8 | call to operator* | set.cpp:134:17:134:22 | call to source | | set.cpp:175:8:175:11 | (reference dereference) | set.cpp:134:17:134:22 | call to source | +| set.cpp:190:7:190:9 | call to unordered_set | set.cpp:188:13:188:18 | call to source | +| set.cpp:193:7:193:9 | call to unordered_set | set.cpp:189:13:189:18 | call to source | +| set.cpp:196:7:196:9 | call to unordered_set | set.cpp:188:13:188:18 | call to source | +| set.cpp:197:7:197:9 | call to unordered_set | set.cpp:188:13:188:18 | call to source | +| set.cpp:198:7:198:9 | call to unordered_set | set.cpp:189:13:189:18 | call to source | +| set.cpp:199:7:199:9 | call to unordered_set | set.cpp:189:13:189:18 | call to source | +| set.cpp:207:7:207:9 | call to unordered_set | set.cpp:203:13:203:18 | call to source | +| set.cpp:210:7:210:9 | call to unordered_set | set.cpp:206:13:206:18 | call to source | +| set.cpp:213:7:213:9 | call to unordered_set | set.cpp:203:13:203:18 | call to source | +| set.cpp:216:7:216:9 | call to unordered_set | set.cpp:206:13:206:18 | call to source | +| set.cpp:222:7:222:9 | call to unordered_set | set.cpp:220:13:220:18 | call to source | +| set.cpp:222:7:222:9 | call to unordered_set | set.cpp:221:13:221:18 | call to source | | set.cpp:223:11:223:15 | call to erase | set.cpp:220:13:220:18 | call to source | | set.cpp:223:11:223:15 | call to erase | set.cpp:221:13:221:18 | call to source | +| set.cpp:224:7:224:9 | call to unordered_set | set.cpp:220:13:220:18 | call to source | +| set.cpp:224:7:224:9 | call to unordered_set | set.cpp:221:13:221:18 | call to source | +| set.cpp:226:7:226:9 | call to unordered_set | set.cpp:220:13:220:18 | call to source | +| set.cpp:226:7:226:9 | call to unordered_set | set.cpp:221:13:221:18 | call to source | | smart_pointer.cpp:13:10:13:10 | Argument 0 indirection | smart_pointer.cpp:11:52:11:57 | call to source | | smart_pointer.cpp:25:10:25:10 | Argument 0 indirection | smart_pointer.cpp:23:52:23:57 | call to source | | smart_pointer.cpp:52:12:52:14 | call to get | smart_pointer.cpp:51:52:51:57 | call to source | From 7da4eef90d58e930d4ff62b6bbb97c72179a7509 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Sat, 17 Oct 2020 08:53:20 -0400 Subject: [PATCH 17/53] Fix subtle typing issue with `std::makr_pair` --- .../library-tests/dataflow/taint-tests/stl.h | 36 +++++++++---------- .../dataflow/taint-tests/type_traits.h | 35 ++++++++++++++++++ 2 files changed, 53 insertions(+), 18 deletions(-) create mode 100644 cpp/ql/test/library-tests/dataflow/taint-tests/type_traits.h diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/stl.h b/cpp/ql/test/library-tests/dataflow/taint-tests/stl.h index d767218c1007..f16ad32c5f8b 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/stl.h +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/stl.h @@ -1,28 +1,28 @@ typedef unsigned long size_t; -template -struct remove_const { typedef T type; }; -template -struct remove_const { typedef T type; }; -// `remove_const_t` removes any `const` specifier from `T` -template -using remove_const_t = typename remove_const::type; -template -struct remove_reference { typedef T type; }; -template -struct remove_reference { typedef T type; }; -template -struct remove_reference { typedef T type; }; -// `remove_reference_t` removes any `&` from `T` -template -using remove_reference_t = typename remove_reference::type; + + + + + + + + + + + + + + + +#include "type_traits.h" namespace std { @@ -344,8 +344,8 @@ namespace std { void swap(pair& p) /*noexcept(...)*/; }; - template constexpr pair, remove_reference_t> make_pair(T1&& x, T2&& y) { - return pair(std::forward(x), std::forward(y)); + template constexpr pair, decay_t> make_pair(T1&& x, T2&& y) { + return pair, decay_t>(std::forward(x), std::forward(y)); } } diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/type_traits.h b/cpp/ql/test/library-tests/dataflow/taint-tests/type_traits.h new file mode 100644 index 000000000000..448b6e85acb9 --- /dev/null +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/type_traits.h @@ -0,0 +1,35 @@ +template +struct remove_const { typedef T type; }; + +template +struct remove_const { typedef T type; }; + +// `remove_const_t` removes any `const` specifier from `T` +template +using remove_const_t = typename remove_const::type; + +template +struct remove_reference { typedef T type; }; + +template +struct remove_reference { typedef T type; }; + +template +struct remove_reference { typedef T type; }; + +// `remove_reference_t` removes any `&` from `T` +template +using remove_reference_t = typename remove_reference::type; + +template +struct decay_impl { + typedef T type; +}; + +template +struct decay_impl { + typedef T* type; +}; + +template +using decay_t = typename decay_impl>::type; From 686f5aa8ed90e7838be037ad0b171e4bc8e23056 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Sat, 17 Oct 2020 08:53:55 -0400 Subject: [PATCH 18/53] Handle parameter indirections in `make_shared` and `make_unique` --- .../semmle/code/cpp/models/implementations/SmartPointer.qll | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/SmartPointer.qll b/cpp/ql/src/semmle/code/cpp/models/implementations/SmartPointer.qll index 7dde921bfa1f..b7177cc13966 100644 --- a/cpp/ql/src/semmle/code/cpp/models/implementations/SmartPointer.qll +++ b/cpp/ql/src/semmle/code/cpp/models/implementations/SmartPointer.qll @@ -17,7 +17,11 @@ class MakeUniqueOrShared extends TaintFunction { // Exclude the specializations of `std::make_shared` and `std::make_unique` that allocate arrays // since these just take a size argument, which we don't want to propagate taint through. not this.isArray() and - input.isParameter(_) and + ( + input.isParameter(_) + or + input.isParameterDeref(_) + ) and output.isReturnValue() } From 1b53c4684dff709560daff9bcb1f48e43574ca15 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Sat, 17 Oct 2020 09:00:46 -0400 Subject: [PATCH 19/53] Fix test expectations due to `pair`/`make_pair` fixes --- .../dataflow/taint-tests/localTaint.expected | 186 ++++++++---------- 1 file changed, 80 insertions(+), 106 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected index 8c564569605c..786165fe9590 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected @@ -260,6 +260,10 @@ | file://:0:0:0:0 | p#0 | file://:0:0:0:0 | p#0 | | | file://:0:0:0:0 | p#0 | file://:0:0:0:0 | p#0 | | | file://:0:0:0:0 | p#0 | file://:0:0:0:0 | p#0 | | +| file://:0:0:0:0 | p#0 | file://:0:0:0:0 | p#0 | | +| file://:0:0:0:0 | p#0 | file://:0:0:0:0 | p#0 | | +| file://:0:0:0:0 | p#0 | file://:0:0:0:0 | p#0 | | +| file://:0:0:0:0 | p#0 | file://:0:0:0:0 | p#0 | | | format.cpp:16:21:16:21 | s | format.cpp:22:22:22:22 | s | | | format.cpp:16:31:16:31 | n | format.cpp:22:25:22:25 | n | | | format.cpp:16:46:16:51 | format | format.cpp:22:28:22:33 | format | | @@ -2060,8 +2064,8 @@ | movableclass.cpp:15:3:15:13 | ... = ... | movableclass.cpp:15:9:15:9 | v [post update] | | | movableclass.cpp:15:13:15:13 | 0 | movableclass.cpp:15:3:15:13 | ... = ... | | | movableclass.cpp:16:11:16:14 | this | movableclass.cpp:16:10:16:14 | * ... | TAINT | -| movableclass.cpp:22:57:22:57 | 1 | movableclass.cpp:22:42:22:58 | call to MyMovableClass | TAINT | -| movableclass.cpp:23:55:23:60 | call to source | movableclass.cpp:23:40:23:63 | call to MyMovableClass | TAINT | +| movableclass.cpp:22:57:22:57 | 1 | movableclass.cpp:22:35:22:59 | call to MyMovableClass | TAINT | +| movableclass.cpp:23:55:23:60 | call to source | movableclass.cpp:23:33:23:64 | call to MyMovableClass | TAINT | | movableclass.cpp:28:21:28:21 | 1 | movableclass.cpp:28:21:28:22 | call to MyMovableClass | TAINT | | movableclass.cpp:28:21:28:22 | call to MyMovableClass | movableclass.cpp:33:8:33:9 | s1 | | | movableclass.cpp:29:22:29:23 | call to MyMovableClass | movableclass.cpp:34:8:34:9 | s2 | | @@ -2090,10 +2094,8 @@ | movableclass.cpp:52:8:52:31 | call to MyMovableClass | movableclass.cpp:52:3:52:4 | ref arg s2 | TAINT | | movableclass.cpp:52:8:52:31 | call to MyMovableClass | movableclass.cpp:52:6:52:6 | call to operator= | TAINT | | movableclass.cpp:52:23:52:28 | call to source | movableclass.cpp:52:8:52:31 | call to MyMovableClass | TAINT | -| movableclass.cpp:59:21:59:32 | call to getUnTainted | movableclass.cpp:59:21:59:35 | call to MyMovableClass | | -| movableclass.cpp:59:21:59:35 | call to MyMovableClass | movableclass.cpp:63:8:63:9 | s1 | | -| movableclass.cpp:60:21:60:30 | call to getTainted | movableclass.cpp:60:21:60:33 | call to MyMovableClass | | -| movableclass.cpp:60:21:60:33 | call to MyMovableClass | movableclass.cpp:64:8:64:9 | s2 | | +| movableclass.cpp:59:21:59:32 | call to getUnTainted | movableclass.cpp:63:8:63:9 | s1 | | +| movableclass.cpp:60:21:60:30 | call to getTainted | movableclass.cpp:64:8:64:9 | s2 | | | movableclass.cpp:61:18:61:19 | call to MyMovableClass | movableclass.cpp:65:8:65:9 | s3 | | | movableclass.cpp:65:13:65:18 | call to source | movableclass.cpp:65:13:65:20 | call to MyMovableClass | TAINT | | movableclass.cpp:65:13:65:20 | call to MyMovableClass | movableclass.cpp:65:8:65:9 | ref arg s3 | TAINT | @@ -3110,36 +3112,42 @@ | stl.h:241:30:241:40 | call to allocator | stl.h:241:21:241:41 | noexcept(...) | TAINT | | stl.h:241:53:241:63 | 0 | stl.h:241:46:241:64 | (no string representation) | TAINT | | stl.h:334:9:334:9 | Unknown literal | stl.h:334:9:334:9 | constructor init of field first | TAINT | +| stl.h:334:9:334:9 | Unknown literal | stl.h:334:9:334:9 | constructor init of field first | TAINT | +| stl.h:334:9:334:9 | Unknown literal | stl.h:334:9:334:9 | constructor init of field first | TAINT | +| stl.h:334:9:334:9 | Unknown literal | stl.h:334:9:334:9 | constructor init of field first | TAINT | +| stl.h:334:9:334:9 | Unknown literal | stl.h:334:9:334:9 | constructor init of field first | TAINT | +| stl.h:334:9:334:9 | Unknown literal | stl.h:334:9:334:9 | constructor init of field second | TAINT | +| stl.h:334:9:334:9 | Unknown literal | stl.h:334:9:334:9 | constructor init of field second | TAINT | | stl.h:334:9:334:9 | Unknown literal | stl.h:334:9:334:9 | constructor init of field second | TAINT | +| stl.h:334:9:334:9 | Unknown literal | stl.h:334:9:334:9 | constructor init of field second | TAINT | +| stl.h:334:9:334:9 | Unknown literal | stl.h:334:9:334:9 | constructor init of field second | TAINT | +| stl.h:334:9:334:9 | constructor init of field first [post-this] | stl.h:334:9:334:9 | constructor init of field second [pre-this] | | +| stl.h:334:9:334:9 | constructor init of field first [post-this] | stl.h:334:9:334:9 | constructor init of field second [pre-this] | | +| stl.h:334:9:334:9 | constructor init of field first [post-this] | stl.h:334:9:334:9 | constructor init of field second [pre-this] | | | stl.h:334:9:334:9 | constructor init of field first [post-this] | stl.h:334:9:334:9 | constructor init of field second [pre-this] | | +| stl.h:334:9:334:9 | constructor init of field first [post-this] | stl.h:334:9:334:9 | constructor init of field second [pre-this] | | +| stl.h:334:9:334:9 | constructor init of field first [pre-this] | stl.h:334:9:334:9 | constructor init of field second [pre-this] | | +| stl.h:334:9:334:9 | constructor init of field first [pre-this] | stl.h:334:9:334:9 | constructor init of field second [pre-this] | | +| stl.h:334:9:334:9 | constructor init of field first [pre-this] | stl.h:334:9:334:9 | constructor init of field second [pre-this] | | +| stl.h:334:9:334:9 | constructor init of field first [pre-this] | stl.h:334:9:334:9 | constructor init of field second [pre-this] | | | stl.h:334:9:334:9 | constructor init of field first [pre-this] | stl.h:334:9:334:9 | constructor init of field second [pre-this] | | | stl.h:334:9:334:9 | this | stl.h:334:9:334:9 | constructor init of field first [pre-this] | | -| stl.h:341:3:341:3 | this | stl.h:341:36:341:43 | constructor init of field first [pre-this] | | -| stl.h:341:3:341:3 | this | stl.h:341:36:341:43 | constructor init of field first [pre-this] | | +| stl.h:334:9:334:9 | this | stl.h:334:9:334:9 | constructor init of field first [pre-this] | | +| stl.h:334:9:334:9 | this | stl.h:334:9:334:9 | constructor init of field first [pre-this] | | +| stl.h:334:9:334:9 | this | stl.h:334:9:334:9 | constructor init of field first [pre-this] | | +| stl.h:334:9:334:9 | this | stl.h:334:9:334:9 | constructor init of field first [pre-this] | | | stl.h:341:3:341:3 | this | stl.h:341:36:341:43 | constructor init of field first [pre-this] | | | stl.h:341:3:341:3 | this | stl.h:341:36:341:43 | constructor init of field first [pre-this] | | | stl.h:341:3:341:3 | this | stl.h:341:36:341:43 | constructor init of field first [pre-this] | | | stl.h:341:3:341:3 | this | stl.h:341:36:341:43 | constructor init of field first [pre-this] | | | stl.h:341:3:341:3 | this | stl.h:341:36:341:43 | constructor init of field first [pre-this] | | | stl.h:341:3:341:6 | this | stl.h:341:36:341:43 | constructor init of field first [pre-this] | | -| stl.h:341:18:341:18 | x | stl.h:341:18:341:18 | x | | -| stl.h:341:18:341:18 | x | stl.h:341:18:341:18 | x | | -| stl.h:341:18:341:18 | x | stl.h:341:18:341:18 | x | | -| stl.h:341:18:341:18 | x | stl.h:341:18:341:18 | x | | -| stl.h:341:18:341:18 | x | stl.h:341:42:341:42 | x | | | stl.h:341:18:341:18 | x | stl.h:341:42:341:42 | x | | | stl.h:341:18:341:18 | x | stl.h:341:42:341:42 | x | | | stl.h:341:18:341:18 | x | stl.h:341:42:341:42 | x | | | stl.h:341:18:341:18 | x | stl.h:341:42:341:42 | x | | | stl.h:341:18:341:18 | x | stl.h:341:42:341:42 | x | | | stl.h:341:18:341:18 | x | stl.h:341:42:341:42 | x | | -| stl.h:341:18:341:18 | x | stl.h:341:42:341:42 | x | | -| stl.h:341:31:341:31 | y | stl.h:341:31:341:31 | y | | -| stl.h:341:31:341:31 | y | stl.h:341:31:341:31 | y | | -| stl.h:341:31:341:31 | y | stl.h:341:31:341:31 | y | | -| stl.h:341:31:341:31 | y | stl.h:341:31:341:31 | y | | -| stl.h:341:31:341:31 | y | stl.h:341:53:341:53 | y | | -| stl.h:341:31:341:31 | y | stl.h:341:53:341:53 | y | | | stl.h:341:31:341:31 | y | stl.h:341:53:341:53 | y | | | stl.h:341:31:341:31 | y | stl.h:341:53:341:53 | y | | | stl.h:341:31:341:31 | y | stl.h:341:53:341:53 | y | | @@ -3153,10 +3161,6 @@ | stl.h:341:36:341:43 | constructor init of field first [post-this] | stl.h:341:46:341:54 | constructor init of field second [pre-this] | | | stl.h:341:36:341:43 | constructor init of field first [post-this] | stl.h:341:46:341:54 | constructor init of field second [pre-this] | | | stl.h:341:36:341:43 | constructor init of field first [post-this] | stl.h:341:46:341:54 | constructor init of field second [pre-this] | | -| stl.h:341:36:341:43 | constructor init of field first [post-this] | stl.h:341:46:341:54 | constructor init of field second [pre-this] | | -| stl.h:341:36:341:43 | constructor init of field first [post-this] | stl.h:341:46:341:54 | constructor init of field second [pre-this] | | -| stl.h:341:36:341:43 | constructor init of field first [pre-this] | stl.h:341:46:341:54 | constructor init of field second [pre-this] | | -| stl.h:341:36:341:43 | constructor init of field first [pre-this] | stl.h:341:46:341:54 | constructor init of field second [pre-this] | | | stl.h:341:36:341:43 | constructor init of field first [pre-this] | stl.h:341:46:341:54 | constructor init of field second [pre-this] | | | stl.h:341:36:341:43 | constructor init of field first [pre-this] | stl.h:341:46:341:54 | constructor init of field second [pre-this] | | | stl.h:341:36:341:43 | constructor init of field first [pre-this] | stl.h:341:46:341:54 | constructor init of field second [pre-this] | | @@ -3168,82 +3172,64 @@ | stl.h:341:42:341:42 | x | stl.h:341:36:341:43 | constructor init of field first | TAINT | | stl.h:341:42:341:42 | x | stl.h:341:36:341:43 | constructor init of field first | TAINT | | stl.h:341:42:341:42 | x | stl.h:341:36:341:43 | constructor init of field first | TAINT | -| stl.h:341:42:341:42 | x | stl.h:341:36:341:43 | constructor init of field first | TAINT | -| stl.h:341:42:341:42 | x | stl.h:341:36:341:43 | constructor init of field first | TAINT | | stl.h:341:46:341:54 | call to unknown function | stl.h:341:46:341:54 | constructor init of field second | TAINT | | stl.h:341:53:341:53 | y | stl.h:341:46:341:54 | constructor init of field second | TAINT | | stl.h:341:53:341:53 | y | stl.h:341:46:341:54 | constructor init of field second | TAINT | | stl.h:341:53:341:53 | y | stl.h:341:46:341:54 | constructor init of field second | TAINT | | stl.h:341:53:341:53 | y | stl.h:341:46:341:54 | constructor init of field second | TAINT | | stl.h:341:53:341:53 | y | stl.h:341:46:341:54 | constructor init of field second | TAINT | -| stl.h:341:53:341:53 | y | stl.h:341:46:341:54 | constructor init of field second | TAINT | -| stl.h:341:53:341:53 | y | stl.h:341:46:341:54 | constructor init of field second | TAINT | -| stl.h:347:109:347:109 | x | stl.h:347:109:347:109 | x | | -| stl.h:347:109:347:109 | x | stl.h:347:109:347:109 | x | | -| stl.h:347:109:347:109 | x | stl.h:347:109:347:109 | x | | -| stl.h:347:109:347:109 | x | stl.h:347:109:347:109 | x | | -| stl.h:347:109:347:109 | x | stl.h:347:109:347:109 | x | | -| stl.h:347:109:347:109 | x | stl.h:347:109:347:109 | x | | -| stl.h:347:109:347:109 | x | stl.h:347:109:347:109 | x | | -| stl.h:347:109:347:109 | x | stl.h:348:40:348:40 | x | | -| stl.h:347:109:347:109 | x | stl.h:348:40:348:40 | x | | -| stl.h:347:109:347:109 | x | stl.h:348:40:348:40 | x | | -| stl.h:347:109:347:109 | x | stl.h:348:40:348:40 | x | | -| stl.h:347:109:347:109 | x | stl.h:348:40:348:40 | x | | -| stl.h:347:109:347:109 | x | stl.h:348:40:348:40 | x | | -| stl.h:347:109:347:109 | x | stl.h:348:40:348:40 | x | | -| stl.h:347:117:347:117 | y | stl.h:347:117:347:117 | y | | -| stl.h:347:117:347:117 | y | stl.h:347:117:347:117 | y | | -| stl.h:347:117:347:117 | y | stl.h:347:117:347:117 | y | | -| stl.h:347:117:347:117 | y | stl.h:347:117:347:117 | y | | -| stl.h:347:117:347:117 | y | stl.h:347:117:347:117 | y | | -| stl.h:347:117:347:117 | y | stl.h:347:117:347:117 | y | | -| stl.h:347:117:347:117 | y | stl.h:347:117:347:117 | y | | -| stl.h:347:117:347:117 | y | stl.h:348:61:348:61 | y | | -| stl.h:347:117:347:117 | y | stl.h:348:61:348:61 | y | | -| stl.h:347:117:347:117 | y | stl.h:348:61:348:61 | y | | -| stl.h:347:117:347:117 | y | stl.h:348:61:348:61 | y | | -| stl.h:347:117:347:117 | y | stl.h:348:61:348:61 | y | | -| stl.h:347:117:347:117 | y | stl.h:348:61:348:61 | y | | -| stl.h:347:117:347:117 | y | stl.h:348:61:348:61 | y | | -| stl.h:348:10:348:63 | call to pair | stl.h:348:10:348:63 | call to pair | TAINT | -| stl.h:348:10:348:63 | call to pair | stl.h:348:10:348:63 | call to pair | TAINT | -| stl.h:348:10:348:63 | call to pair | stl.h:348:10:348:63 | call to pair | TAINT | -| stl.h:348:10:348:63 | call to pair | stl.h:348:10:348:63 | call to pair | TAINT | -| stl.h:348:10:348:63 | call to pair | stl.h:348:10:348:63 | call to pair | TAINT | -| stl.h:348:10:348:63 | call to pair | stl.h:348:10:348:63 | call to pair | TAINT | -| stl.h:348:23:348:38 | ref arg call to forward | stl.h:347:109:347:109 | x | | -| stl.h:348:23:348:38 | ref arg call to forward | stl.h:347:109:347:109 | x | | -| stl.h:348:23:348:38 | ref arg call to forward | stl.h:347:109:347:109 | x | | -| stl.h:348:23:348:38 | ref arg call to forward | stl.h:347:109:347:109 | x | | -| stl.h:348:23:348:38 | ref arg call to forward | stl.h:348:40:348:40 | x [inner post update] | | -| stl.h:348:23:348:38 | ref arg call to forward | stl.h:348:40:348:40 | x [inner post update] | | -| stl.h:348:23:348:38 | ref arg call to forward | stl.h:348:40:348:40 | x [inner post update] | | -| stl.h:348:23:348:38 | ref arg call to forward | stl.h:348:40:348:40 | x [inner post update] | | -| stl.h:348:40:348:40 | x | stl.h:348:23:348:38 | call to forward | | -| stl.h:348:40:348:40 | x | stl.h:348:23:348:38 | call to forward | | -| stl.h:348:40:348:40 | x | stl.h:348:23:348:38 | call to forward | | -| stl.h:348:40:348:40 | x | stl.h:348:23:348:38 | call to forward | | -| stl.h:348:40:348:40 | x | stl.h:348:23:348:38 | call to forward | | -| stl.h:348:40:348:40 | x | stl.h:348:23:348:38 | call to forward | | -| stl.h:348:44:348:59 | call to forward | stl.h:348:10:348:63 | call to pair | TAINT | -| stl.h:348:44:348:59 | call to forward | stl.h:348:10:348:63 | call to pair | TAINT | -| stl.h:348:44:348:59 | ref arg call to forward | stl.h:347:117:347:117 | y | | -| stl.h:348:44:348:59 | ref arg call to forward | stl.h:347:117:347:117 | y | | -| stl.h:348:44:348:59 | ref arg call to forward | stl.h:347:117:347:117 | y | | -| stl.h:348:44:348:59 | ref arg call to forward | stl.h:347:117:347:117 | y | | -| stl.h:348:44:348:59 | ref arg call to forward | stl.h:348:61:348:61 | y [inner post update] | | -| stl.h:348:44:348:59 | ref arg call to forward | stl.h:348:61:348:61 | y [inner post update] | | -| stl.h:348:44:348:59 | ref arg call to forward | stl.h:348:61:348:61 | y [inner post update] | | -| stl.h:348:44:348:59 | ref arg call to forward | stl.h:348:61:348:61 | y [inner post update] | | -| stl.h:348:61:348:61 | y | stl.h:348:10:348:63 | call to pair | TAINT | -| stl.h:348:61:348:61 | y | stl.h:348:10:348:63 | call to pair | TAINT | -| stl.h:348:61:348:61 | y | stl.h:348:44:348:59 | call to forward | | -| stl.h:348:61:348:61 | y | stl.h:348:44:348:59 | call to forward | | -| stl.h:348:61:348:61 | y | stl.h:348:44:348:59 | call to forward | | -| stl.h:348:61:348:61 | y | stl.h:348:44:348:59 | call to forward | | -| stl.h:348:61:348:61 | y | stl.h:348:44:348:59 | call to forward | | -| stl.h:348:61:348:61 | y | stl.h:348:44:348:59 | call to forward | | +| stl.h:347:87:347:87 | x | stl.h:347:87:347:87 | x | | +| stl.h:347:87:347:87 | x | stl.h:347:87:347:87 | x | | +| stl.h:347:87:347:87 | x | stl.h:347:87:347:87 | x | | +| stl.h:347:87:347:87 | x | stl.h:347:87:347:87 | x | | +| stl.h:347:87:347:87 | x | stl.h:347:87:347:87 | x | | +| stl.h:347:87:347:87 | x | stl.h:347:87:347:87 | x | | +| stl.h:347:87:347:87 | x | stl.h:347:87:347:87 | x | | +| stl.h:347:87:347:87 | x | stl.h:348:58:348:58 | x | | +| stl.h:347:87:347:87 | x | stl.h:348:58:348:58 | x | | +| stl.h:347:87:347:87 | x | stl.h:348:58:348:58 | x | | +| stl.h:347:87:347:87 | x | stl.h:348:58:348:58 | x | | +| stl.h:347:87:347:87 | x | stl.h:348:58:348:58 | x | | +| stl.h:347:87:347:87 | x | stl.h:348:58:348:58 | x | | +| stl.h:347:87:347:87 | x | stl.h:348:58:348:58 | x | | +| stl.h:347:95:347:95 | y | stl.h:347:95:347:95 | y | | +| stl.h:347:95:347:95 | y | stl.h:347:95:347:95 | y | | +| stl.h:347:95:347:95 | y | stl.h:347:95:347:95 | y | | +| stl.h:347:95:347:95 | y | stl.h:347:95:347:95 | y | | +| stl.h:347:95:347:95 | y | stl.h:347:95:347:95 | y | | +| stl.h:347:95:347:95 | y | stl.h:347:95:347:95 | y | | +| stl.h:347:95:347:95 | y | stl.h:347:95:347:95 | y | | +| stl.h:347:95:347:95 | y | stl.h:348:79:348:79 | y | | +| stl.h:347:95:347:95 | y | stl.h:348:79:348:79 | y | | +| stl.h:347:95:347:95 | y | stl.h:348:79:348:79 | y | | +| stl.h:347:95:347:95 | y | stl.h:348:79:348:79 | y | | +| stl.h:347:95:347:95 | y | stl.h:348:79:348:79 | y | | +| stl.h:347:95:347:95 | y | stl.h:348:79:348:79 | y | | +| stl.h:347:95:347:95 | y | stl.h:348:79:348:79 | y | | +| stl.h:348:58:348:58 | x | stl.h:348:41:348:56 | call to forward | | +| stl.h:348:58:348:58 | x | stl.h:348:41:348:56 | call to forward | | +| stl.h:348:58:348:58 | x | stl.h:348:41:348:56 | call to forward | | +| stl.h:348:58:348:58 | x | stl.h:348:41:348:56 | call to forward | | +| stl.h:348:58:348:58 | x | stl.h:348:41:348:56 | call to forward | | +| stl.h:348:58:348:58 | x | stl.h:348:41:348:56 | call to forward | | +| stl.h:348:62:348:77 | call to forward | stl.h:348:3:348:82 | call to pair | TAINT | +| stl.h:348:62:348:77 | call to forward | stl.h:348:3:348:82 | call to pair | TAINT | +| stl.h:348:62:348:77 | call to forward | stl.h:348:3:348:82 | call to pair | TAINT | +| stl.h:348:62:348:77 | call to forward | stl.h:348:3:348:82 | call to pair | TAINT | +| stl.h:348:62:348:77 | call to forward | stl.h:348:3:348:82 | call to pair | TAINT | +| stl.h:348:62:348:77 | call to forward | stl.h:348:3:348:82 | call to pair | TAINT | +| stl.h:348:79:348:79 | y | stl.h:348:3:348:82 | call to pair | TAINT | +| stl.h:348:79:348:79 | y | stl.h:348:3:348:82 | call to pair | TAINT | +| stl.h:348:79:348:79 | y | stl.h:348:3:348:82 | call to pair | TAINT | +| stl.h:348:79:348:79 | y | stl.h:348:3:348:82 | call to pair | TAINT | +| stl.h:348:79:348:79 | y | stl.h:348:3:348:82 | call to pair | TAINT | +| stl.h:348:79:348:79 | y | stl.h:348:3:348:82 | call to pair | TAINT | +| stl.h:348:79:348:79 | y | stl.h:348:62:348:77 | call to forward | | +| stl.h:348:79:348:79 | y | stl.h:348:62:348:77 | call to forward | | +| stl.h:348:79:348:79 | y | stl.h:348:62:348:77 | call to forward | | +| stl.h:348:79:348:79 | y | stl.h:348:62:348:77 | call to forward | | +| stl.h:348:79:348:79 | y | stl.h:348:62:348:77 | call to forward | | +| stl.h:348:79:348:79 | y | stl.h:348:62:348:77 | call to forward | | | string.cpp:25:12:25:17 | call to source | string.cpp:29:7:29:7 | a | | | string.cpp:26:16:26:20 | 123 | string.cpp:26:16:26:21 | call to basic_string | TAINT | | string.cpp:26:16:26:21 | call to basic_string | string.cpp:30:7:30:7 | b | | @@ -4981,16 +4967,10 @@ | swap1.cpp:56:30:56:34 | data1 | swap1.cpp:56:18:56:22 | ref arg data1 | | | swap1.cpp:61:22:61:22 | x | swap1.cpp:61:22:61:22 | x | | | swap1.cpp:61:22:61:22 | x | swap1.cpp:63:9:63:9 | x | | -| swap1.cpp:61:22:61:22 | x | swap2.cpp:61:22:61:22 | x | | -| swap1.cpp:61:22:61:22 | x | swap2.cpp:63:9:63:9 | x | | | swap1.cpp:61:32:61:32 | y | swap1.cpp:61:32:61:32 | y | | | swap1.cpp:61:32:61:32 | y | swap1.cpp:63:16:63:16 | y | | -| swap1.cpp:61:32:61:32 | y | swap2.cpp:61:32:61:32 | y | | -| swap1.cpp:61:32:61:32 | y | swap2.cpp:63:16:63:16 | y | | | swap1.cpp:63:9:63:9 | ref arg x | swap1.cpp:61:22:61:22 | x | | -| swap1.cpp:63:9:63:9 | ref arg x | swap2.cpp:61:22:61:22 | x | | | swap1.cpp:63:16:63:16 | ref arg y | swap1.cpp:61:32:61:32 | y | | -| swap1.cpp:63:16:63:16 | ref arg y | swap2.cpp:61:32:61:32 | y | | | swap1.cpp:69:23:69:23 | x | swap1.cpp:71:5:71:5 | x | | | swap1.cpp:69:23:69:23 | x | swap1.cpp:73:10:73:10 | x | | | swap1.cpp:69:23:69:23 | x | swap1.cpp:76:9:76:9 | x | | @@ -5151,17 +5131,11 @@ | swap2.cpp:56:50:56:53 | that | swap2.cpp:56:43:56:47 | ref arg data2 | | | swap2.cpp:56:50:56:53 | that [post update] | swap2.cpp:53:26:53:29 | that | | | swap2.cpp:56:55:56:59 | data2 | swap2.cpp:56:43:56:47 | ref arg data2 | | -| swap2.cpp:61:22:61:22 | x | swap1.cpp:61:22:61:22 | x | | -| swap2.cpp:61:22:61:22 | x | swap1.cpp:63:9:63:9 | x | | | swap2.cpp:61:22:61:22 | x | swap2.cpp:61:22:61:22 | x | | | swap2.cpp:61:22:61:22 | x | swap2.cpp:63:9:63:9 | x | | -| swap2.cpp:61:32:61:32 | y | swap1.cpp:61:32:61:32 | y | | -| swap2.cpp:61:32:61:32 | y | swap1.cpp:63:16:63:16 | y | | | swap2.cpp:61:32:61:32 | y | swap2.cpp:61:32:61:32 | y | | | swap2.cpp:61:32:61:32 | y | swap2.cpp:63:16:63:16 | y | | -| swap2.cpp:63:9:63:9 | ref arg x | swap1.cpp:61:22:61:22 | x | | | swap2.cpp:63:9:63:9 | ref arg x | swap2.cpp:61:22:61:22 | x | | -| swap2.cpp:63:16:63:16 | ref arg y | swap1.cpp:61:32:61:32 | y | | | swap2.cpp:63:16:63:16 | ref arg y | swap2.cpp:61:32:61:32 | y | | | swap2.cpp:69:23:69:23 | x | swap2.cpp:71:5:71:5 | x | | | swap2.cpp:69:23:69:23 | x | swap2.cpp:73:10:73:10 | x | | From 1dae8f62c13be20c503f7442b07a60308625bd9d Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Sat, 17 Oct 2020 11:33:20 -0400 Subject: [PATCH 20/53] Model copy-ish constructors for `std::pair` --- .../cpp/models/implementations/StdPair.qll | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/StdPair.qll b/cpp/ql/src/semmle/code/cpp/models/implementations/StdPair.qll index b36f7ab3325d..b75963d9c69d 100644 --- a/cpp/ql/src/semmle/code/cpp/models/implementations/StdPair.qll +++ b/cpp/ql/src/semmle/code/cpp/models/implementations/StdPair.qll @@ -4,6 +4,37 @@ import semmle.code.cpp.models.interfaces.Taint +/** + * An instantiation of `std::pair`. + */ +class StdPairClass extends ClassTemplateInstantiation { + StdPairClass() { getTemplate().hasQualifiedName("std", "pair") } +} + +/** + * Any of the single-parameter constructors of `std::pair` that takes a reference to an + * instantiation of `std::pair`. These constructors allow conversion between pair types when the + * underlying element types are convertible. + */ +class StdPairCopyishConstructor extends Constructor, TaintFunction { + StdPairCopyishConstructor() { + this.getDeclaringType() instanceof StdPairClass and + this.getNumberOfParameters() = 1 and + this.getParameter(0).getUnspecifiedType().(ReferenceType).getBaseType().getUnspecifiedType() + instanceof StdPairClass + } + + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { + // taint flow from the source object to the constructed object + input.isParameterDeref(0) and + ( + output.isReturnValue() + or + output.isQualifierObject() + ) + } +} + /** * Additional model for `std::pair` constructors. */ From 4814dcf145427526b72008b65dbe0d829f02dee9 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Sat, 17 Oct 2020 14:32:31 -0400 Subject: [PATCH 21/53] Print partial flow info in `PrintIRLocalFlow.qll` --- .../cpp/ir/dataflow/internal/PrintIRLocalFlow.qll | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/PrintIRLocalFlow.qll b/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/PrintIRLocalFlow.qll index edbb11db2f37..40d9992e65e4 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/PrintIRLocalFlow.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/PrintIRLocalFlow.qll @@ -130,6 +130,19 @@ private string getNodeProperty(DataFlow::Node node, string key) { | kind, ", " ) + or + key = "pflow" and + result = + strictconcat(DataFlow::PartialPathNode sourceNode, DataFlow::PartialPathNode destNode, int dist, + int order1, int order2 | + any(DataFlow::Configuration cfg).hasPartialFlow(sourceNode, destNode, dist) and + destNode.getNode() = node and + sourceNode.getNode().getEnclosingCallable() = node.getEnclosingCallable() + | + nodeId(sourceNode.getNode(), order1, order2) + "+" + dist.toString(), ", " + order by + order1, order2, dist desc + ) } /** From e4fdf699ad76c09f1305173e308cf4f5bcf525c9 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Sat, 17 Oct 2020 14:33:10 -0400 Subject: [PATCH 22/53] Accept improved test results --- .../dataflow/taint-tests/taint.expected | 2 + .../dataflow/taint-tests/test_diff.expected | 139 ++---------------- .../dataflow/taint-tests/test_ir.expected | 73 +++++++++ 3 files changed, 86 insertions(+), 128 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/taint.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/taint.expected index a74fb3e1d106..a20e4bfc1cd8 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/taint.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/taint.expected @@ -48,7 +48,9 @@ | map.cpp:77:9:77:14 | second | map.cpp:66:37:66:42 | call to source | | map.cpp:78:7:78:7 | k | map.cpp:66:37:66:42 | call to source | | map.cpp:81:7:81:7 | l | map.cpp:66:37:66:42 | call to source | +| map.cpp:87:34:87:38 | first | map.cpp:87:17:87:22 | call to source | | map.cpp:89:7:89:32 | call to pair | map.cpp:89:24:89:29 | call to source | +| map.cpp:91:34:91:39 | second | map.cpp:91:24:91:29 | call to source | | map.cpp:110:10:110:15 | call to insert | map.cpp:110:62:110:67 | call to source | | map.cpp:112:10:112:25 | call to insert_or_assign | map.cpp:112:46:112:51 | call to source | | map.cpp:114:7:114:8 | call to map | map.cpp:108:39:108:44 | call to source | diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/test_diff.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/test_diff.expected index a68c1dc85f1e..f04210a1b87d 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/test_diff.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/test_diff.expected @@ -15,7 +15,6 @@ | arrayassignment.cpp:146:7:146:13 | arrayassignment.cpp:144:12:144:17 | IR only | | copyableclass.cpp:67:11:67:11 | copyableclass.cpp:67:13:67:18 | AST only | | copyableclass.cpp:67:11:67:21 | copyableclass.cpp:67:13:67:18 | IR only | -| copyableclass_declonly.cpp:42:8:42:9 | copyableclass_declonly.cpp:34:30:34:35 | AST only | | copyableclass_declonly.cpp:67:11:67:11 | copyableclass_declonly.cpp:67:13:67:18 | AST only | | map.cpp:49:9:49:13 | map.cpp:48:37:48:42 | IR only | | map.cpp:54:9:54:13 | map.cpp:48:37:48:42 | IR only | @@ -26,23 +25,10 @@ | map.cpp:76:9:76:13 | map.cpp:66:37:66:42 | IR only | | map.cpp:79:9:79:13 | map.cpp:66:37:66:42 | IR only | | map.cpp:80:9:80:14 | map.cpp:66:37:66:42 | IR only | +| map.cpp:87:34:87:38 | map.cpp:87:17:87:22 | AST only | | map.cpp:90:34:90:38 | map.cpp:90:24:90:29 | IR only | -| map.cpp:91:34:91:39 | map.cpp:91:24:91:29 | IR only | | map.cpp:108:7:108:54 | map.cpp:108:39:108:44 | IR only | | map.cpp:111:7:111:48 | map.cpp:111:34:111:39 | IR only | -| map.cpp:114:7:114:8 | map.cpp:108:39:108:44 | AST only | -| map.cpp:116:7:116:8 | map.cpp:110:62:110:67 | AST only | -| map.cpp:117:7:117:8 | map.cpp:111:34:111:39 | AST only | -| map.cpp:118:7:118:8 | map.cpp:112:46:112:51 | AST only | -| map.cpp:123:10:123:13 | map.cpp:111:34:111:39 | AST only | -| map.cpp:124:10:124:13 | map.cpp:112:46:112:51 | AST only | -| map.cpp:129:10:129:13 | map.cpp:111:34:111:39 | AST only | -| map.cpp:130:10:130:13 | map.cpp:112:46:112:51 | AST only | -| map.cpp:137:7:137:8 | map.cpp:108:39:108:44 | AST only | -| map.cpp:138:7:138:8 | map.cpp:108:39:108:44 | AST only | -| map.cpp:139:7:139:8 | map.cpp:108:39:108:44 | AST only | -| map.cpp:140:10:140:13 | map.cpp:108:39:108:44 | AST only | -| map.cpp:141:10:141:13 | map.cpp:108:39:108:44 | AST only | | map.cpp:155:12:155:16 | map.cpp:108:39:108:44 | IR only | | map.cpp:156:12:156:17 | map.cpp:108:39:108:44 | IR only | | map.cpp:161:12:161:16 | map.cpp:108:39:108:44 | IR only | @@ -52,44 +38,10 @@ | map.cpp:184:7:184:31 | map.cpp:108:39:108:44 | IR only | | map.cpp:185:7:185:32 | map.cpp:108:39:108:44 | IR only | | map.cpp:187:7:187:32 | map.cpp:108:39:108:44 | IR only | -| map.cpp:193:7:193:9 | map.cpp:191:49:191:54 | AST only | -| map.cpp:196:7:196:9 | map.cpp:192:49:192:54 | AST only | -| map.cpp:199:7:199:9 | map.cpp:191:49:191:54 | AST only | -| map.cpp:200:7:200:9 | map.cpp:191:49:191:54 | AST only | -| map.cpp:201:7:201:9 | map.cpp:192:49:192:54 | AST only | -| map.cpp:202:7:202:9 | map.cpp:192:49:192:54 | AST only | -| map.cpp:210:7:210:9 | map.cpp:206:49:206:54 | AST only | -| map.cpp:213:7:213:9 | map.cpp:209:49:209:54 | AST only | -| map.cpp:216:7:216:9 | map.cpp:206:49:206:54 | AST only | -| map.cpp:218:7:218:9 | map.cpp:209:49:209:54 | AST only | -| map.cpp:219:7:219:9 | map.cpp:209:49:209:54 | AST only | -| map.cpp:225:7:225:9 | map.cpp:223:49:223:54 | AST only | -| map.cpp:225:7:225:9 | map.cpp:224:49:224:54 | AST only | -| map.cpp:227:7:227:9 | map.cpp:223:49:223:54 | AST only | -| map.cpp:227:7:227:9 | map.cpp:224:49:224:54 | AST only | -| map.cpp:229:7:229:9 | map.cpp:223:49:223:54 | AST only | -| map.cpp:229:7:229:9 | map.cpp:224:49:224:54 | AST only | | map.cpp:235:7:235:40 | map.cpp:235:26:235:31 | IR only | -| map.cpp:236:7:236:9 | map.cpp:235:26:235:31 | AST only | -| map.cpp:240:7:240:9 | map.cpp:239:44:239:49 | AST only | | map.cpp:246:7:246:44 | map.cpp:246:30:246:35 | IR only | -| map.cpp:247:7:247:9 | map.cpp:246:30:246:35 | AST only | -| map.cpp:251:7:251:9 | map.cpp:250:43:250:48 | AST only | | map.cpp:260:7:260:54 | map.cpp:260:39:260:44 | IR only | | map.cpp:263:7:263:48 | map.cpp:263:34:263:39 | IR only | -| map.cpp:266:7:266:8 | map.cpp:260:39:260:44 | AST only | -| map.cpp:268:7:268:8 | map.cpp:262:62:262:67 | AST only | -| map.cpp:269:7:269:8 | map.cpp:263:34:263:39 | AST only | -| map.cpp:270:7:270:8 | map.cpp:264:46:264:51 | AST only | -| map.cpp:275:10:275:13 | map.cpp:263:34:263:39 | AST only | -| map.cpp:276:10:276:13 | map.cpp:264:46:264:51 | AST only | -| map.cpp:281:10:281:13 | map.cpp:263:34:263:39 | AST only | -| map.cpp:282:10:282:13 | map.cpp:264:46:264:51 | AST only | -| map.cpp:289:7:289:8 | map.cpp:260:39:260:44 | AST only | -| map.cpp:290:7:290:8 | map.cpp:260:39:260:44 | AST only | -| map.cpp:291:7:291:8 | map.cpp:260:39:260:44 | AST only | -| map.cpp:292:10:292:13 | map.cpp:260:39:260:44 | AST only | -| map.cpp:293:10:293:13 | map.cpp:260:39:260:44 | AST only | | map.cpp:307:12:307:16 | map.cpp:260:39:260:44 | IR only | | map.cpp:308:12:308:17 | map.cpp:260:39:260:44 | IR only | | map.cpp:313:12:313:16 | map.cpp:260:39:260:44 | IR only | @@ -99,93 +51,19 @@ | map.cpp:334:7:334:31 | map.cpp:260:39:260:44 | IR only | | map.cpp:335:7:335:32 | map.cpp:260:39:260:44 | IR only | | map.cpp:336:7:336:32 | map.cpp:260:39:260:44 | IR only | -| map.cpp:342:7:342:9 | map.cpp:340:49:340:54 | AST only | -| map.cpp:345:7:345:9 | map.cpp:341:49:341:54 | AST only | -| map.cpp:348:7:348:9 | map.cpp:340:49:340:54 | AST only | -| map.cpp:349:7:349:9 | map.cpp:340:49:340:54 | AST only | -| map.cpp:350:7:350:9 | map.cpp:341:49:341:54 | AST only | -| map.cpp:351:7:351:9 | map.cpp:341:49:341:54 | AST only | -| map.cpp:359:7:359:9 | map.cpp:355:49:355:54 | AST only | -| map.cpp:362:7:362:9 | map.cpp:358:49:358:54 | AST only | -| map.cpp:365:7:365:9 | map.cpp:355:49:355:54 | AST only | -| map.cpp:367:7:367:9 | map.cpp:358:49:358:54 | AST only | -| map.cpp:368:7:368:9 | map.cpp:358:49:358:54 | AST only | -| map.cpp:374:7:374:9 | map.cpp:372:49:372:54 | AST only | -| map.cpp:374:7:374:9 | map.cpp:373:49:373:54 | AST only | -| map.cpp:376:7:376:9 | map.cpp:372:49:372:54 | AST only | -| map.cpp:376:7:376:9 | map.cpp:373:49:373:54 | AST only | -| map.cpp:378:7:378:9 | map.cpp:372:49:372:54 | AST only | -| map.cpp:378:7:378:9 | map.cpp:373:49:373:54 | AST only | | map.cpp:384:7:384:40 | map.cpp:384:26:384:31 | IR only | -| map.cpp:385:7:385:9 | map.cpp:384:26:384:31 | AST only | -| map.cpp:389:7:389:9 | map.cpp:388:44:388:49 | AST only | | map.cpp:396:7:396:44 | map.cpp:396:30:396:35 | IR only | +| map.cpp:397:40:397:45 | map.cpp:396:30:396:35 | IR only | | map.cpp:397:40:397:45 | map.cpp:397:30:397:35 | IR only | -| map.cpp:398:7:398:9 | map.cpp:396:30:396:35 | AST only | -| map.cpp:398:7:398:9 | map.cpp:397:30:397:35 | AST only | -| map.cpp:402:7:402:9 | map.cpp:401:43:401:48 | AST only | -| map.cpp:417:7:417:9 | map.cpp:416:30:416:35 | AST only | | map.cpp:418:7:418:16 | map.cpp:416:30:416:35 | AST only | -| map.cpp:420:7:420:9 | map.cpp:419:33:419:38 | AST only | | map.cpp:421:7:421:16 | map.cpp:419:33:419:38 | AST only | | map.cpp:431:7:431:67 | map.cpp:431:52:431:57 | IR only | -| map.cpp:432:7:432:9 | map.cpp:431:52:431:57 | AST only | | movableclass.cpp:65:11:65:11 | movableclass.cpp:65:13:65:18 | AST only | | movableclass.cpp:65:11:65:21 | movableclass.cpp:65:13:65:18 | IR only | | set.cpp:20:7:20:31 | set.cpp:20:17:20:22 | IR only | -| set.cpp:26:7:26:8 | set.cpp:20:17:20:22 | AST only | -| set.cpp:28:7:28:8 | set.cpp:22:29:22:34 | AST only | -| set.cpp:30:7:30:8 | set.cpp:20:17:20:22 | AST only | -| set.cpp:44:7:44:8 | set.cpp:20:17:20:22 | AST only | -| set.cpp:45:7:45:8 | set.cpp:20:17:20:22 | AST only | -| set.cpp:46:7:46:8 | set.cpp:20:17:20:22 | AST only | -| set.cpp:47:7:47:9 | set.cpp:20:17:20:22 | AST only | -| set.cpp:48:10:48:13 | set.cpp:20:17:20:22 | AST only | -| set.cpp:49:10:49:13 | set.cpp:20:17:20:22 | AST only | | set.cpp:61:8:61:11 | set.cpp:20:17:20:22 | IR only | -| set.cpp:78:7:78:9 | set.cpp:76:13:76:18 | AST only | -| set.cpp:81:7:81:9 | set.cpp:77:13:77:18 | AST only | -| set.cpp:84:7:84:9 | set.cpp:76:13:76:18 | AST only | -| set.cpp:85:7:85:9 | set.cpp:76:13:76:18 | AST only | -| set.cpp:86:7:86:9 | set.cpp:77:13:77:18 | AST only | -| set.cpp:87:7:87:9 | set.cpp:77:13:77:18 | AST only | -| set.cpp:95:7:95:9 | set.cpp:91:13:91:18 | AST only | -| set.cpp:98:7:98:9 | set.cpp:94:13:94:18 | AST only | -| set.cpp:101:7:101:9 | set.cpp:91:13:91:18 | AST only | -| set.cpp:104:7:104:9 | set.cpp:94:13:94:18 | AST only | -| set.cpp:110:7:110:9 | set.cpp:108:13:108:18 | AST only | -| set.cpp:110:7:110:9 | set.cpp:109:13:109:18 | AST only | -| set.cpp:112:7:112:9 | set.cpp:108:13:108:18 | AST only | -| set.cpp:112:7:112:9 | set.cpp:109:13:109:18 | AST only | -| set.cpp:114:7:114:9 | set.cpp:108:13:108:18 | AST only | -| set.cpp:114:7:114:9 | set.cpp:109:13:109:18 | AST only | | set.cpp:134:7:134:31 | set.cpp:134:17:134:22 | IR only | -| set.cpp:140:7:140:8 | set.cpp:134:17:134:22 | AST only | -| set.cpp:142:7:142:8 | set.cpp:136:29:136:34 | AST only | -| set.cpp:144:7:144:8 | set.cpp:134:17:134:22 | AST only | -| set.cpp:158:7:158:8 | set.cpp:134:17:134:22 | AST only | -| set.cpp:159:7:159:8 | set.cpp:134:17:134:22 | AST only | -| set.cpp:160:7:160:8 | set.cpp:134:17:134:22 | AST only | -| set.cpp:161:7:161:9 | set.cpp:134:17:134:22 | AST only | -| set.cpp:162:10:162:13 | set.cpp:134:17:134:22 | AST only | -| set.cpp:163:10:163:13 | set.cpp:134:17:134:22 | AST only | | set.cpp:175:8:175:11 | set.cpp:134:17:134:22 | IR only | -| set.cpp:190:7:190:9 | set.cpp:188:13:188:18 | AST only | -| set.cpp:193:7:193:9 | set.cpp:189:13:189:18 | AST only | -| set.cpp:196:7:196:9 | set.cpp:188:13:188:18 | AST only | -| set.cpp:197:7:197:9 | set.cpp:188:13:188:18 | AST only | -| set.cpp:198:7:198:9 | set.cpp:189:13:189:18 | AST only | -| set.cpp:199:7:199:9 | set.cpp:189:13:189:18 | AST only | -| set.cpp:207:7:207:9 | set.cpp:203:13:203:18 | AST only | -| set.cpp:210:7:210:9 | set.cpp:206:13:206:18 | AST only | -| set.cpp:213:7:213:9 | set.cpp:203:13:203:18 | AST only | -| set.cpp:216:7:216:9 | set.cpp:206:13:206:18 | AST only | -| set.cpp:222:7:222:9 | set.cpp:220:13:220:18 | AST only | -| set.cpp:222:7:222:9 | set.cpp:221:13:221:18 | AST only | -| set.cpp:224:7:224:9 | set.cpp:220:13:220:18 | AST only | -| set.cpp:224:7:224:9 | set.cpp:221:13:221:18 | AST only | -| set.cpp:226:7:226:9 | set.cpp:220:13:220:18 | AST only | -| set.cpp:226:7:226:9 | set.cpp:221:13:221:18 | AST only | | smart_pointer.cpp:12:10:12:10 | smart_pointer.cpp:11:52:11:57 | AST only | | smart_pointer.cpp:24:10:24:10 | smart_pointer.cpp:23:52:23:57 | AST only | | standalone_iterators.cpp:41:10:41:10 | standalone_iterators.cpp:39:45:39:51 | AST only | @@ -198,6 +76,10 @@ | string.cpp:46:13:46:17 | string.cpp:14:10:14:15 | AST only | | string.cpp:70:7:70:8 | string.cpp:62:19:62:24 | AST only | | string.cpp:126:8:126:11 | string.cpp:120:16:120:21 | IR only | +| string.cpp:145:8:145:14 | string.cpp:142:18:142:23 | IR only | +| string.cpp:146:8:146:14 | string.cpp:142:18:142:23 | IR only | +| string.cpp:147:8:147:14 | string.cpp:142:18:142:23 | IR only | +| string.cpp:150:8:150:20 | string.cpp:150:13:150:18 | IR only | | string.cpp:162:11:162:11 | string.cpp:155:18:155:23 | AST only | | string.cpp:166:11:166:11 | string.cpp:166:14:166:19 | AST only | | string.cpp:167:11:167:11 | string.cpp:166:14:166:19 | AST only | @@ -210,6 +92,7 @@ | string.cpp:247:10:247:16 | string.cpp:234:17:234:22 | AST only | | string.cpp:251:10:251:16 | string.cpp:235:11:235:25 | AST only | | string.cpp:312:9:312:12 | string.cpp:309:16:309:21 | AST only | +| string.cpp:323:7:323:29 | string.cpp:320:16:320:21 | IR only | | string.cpp:340:7:340:7 | string.cpp:336:9:336:23 | AST only | | string.cpp:341:7:341:7 | string.cpp:337:12:337:26 | AST only | | string.cpp:342:7:342:7 | string.cpp:336:9:336:23 | AST only | @@ -228,9 +111,7 @@ | string.cpp:411:8:411:8 | string.cpp:389:18:389:23 | AST only | | string.cpp:415:8:415:11 | string.cpp:389:18:389:23 | IR only | | string.cpp:418:8:418:8 | string.cpp:389:18:389:23 | AST only | -| string.cpp:419:8:419:10 | string.cpp:389:18:389:23 | AST only | | string.cpp:421:8:421:8 | string.cpp:389:18:389:23 | AST only | -| string.cpp:422:8:422:10 | string.cpp:389:18:389:23 | AST only | | string.cpp:436:10:436:15 | string.cpp:431:14:431:19 | AST only | | string.cpp:449:10:449:15 | string.cpp:449:32:449:46 | AST only | | string.cpp:462:10:462:15 | string.cpp:457:18:457:23 | AST only | @@ -255,7 +136,9 @@ | stringstream.cpp:35:11:35:11 | stringstream.cpp:29:16:29:21 | AST only | | stringstream.cpp:39:7:39:9 | stringstream.cpp:33:23:33:28 | AST only | | stringstream.cpp:41:7:41:9 | stringstream.cpp:29:16:29:21 | AST only | +| stringstream.cpp:43:7:43:15 | stringstream.cpp:32:14:32:19 | IR only | | stringstream.cpp:44:11:44:13 | stringstream.cpp:33:23:33:28 | AST only | +| stringstream.cpp:45:7:45:15 | stringstream.cpp:34:14:34:19 | IR only | | stringstream.cpp:46:11:46:13 | stringstream.cpp:29:16:29:21 | AST only | | stringstream.cpp:56:11:56:13 | stringstream.cpp:56:15:56:29 | AST only | | stringstream.cpp:57:44:57:46 | stringstream.cpp:57:25:57:39 | AST only | @@ -265,6 +148,7 @@ | stringstream.cpp:67:7:67:10 | stringstream.cpp:64:36:64:41 | AST only | | stringstream.cpp:76:11:76:11 | stringstream.cpp:70:32:70:37 | AST only | | stringstream.cpp:78:11:78:11 | stringstream.cpp:70:32:70:37 | AST only | +| stringstream.cpp:83:7:83:15 | stringstream.cpp:70:32:70:37 | IR only | | stringstream.cpp:100:11:100:11 | stringstream.cpp:100:31:100:36 | AST only | | stringstream.cpp:143:11:143:22 | stringstream.cpp:143:14:143:19 | IR only | | stringstream.cpp:146:11:146:11 | stringstream.cpp:143:14:143:19 | AST only | @@ -294,13 +178,13 @@ | stringstream.cpp:266:62:266:66 | stringstream.cpp:266:41:266:46 | AST only | | stringstream.cpp:267:7:267:9 | stringstream.cpp:266:41:266:46 | AST only | | swap1.cpp:78:12:78:16 | swap1.cpp:69:23:69:23 | AST only | -| swap1.cpp:87:13:87:17 | swap1.cpp:82:16:82:21 | AST only | | swap1.cpp:88:13:88:17 | swap1.cpp:81:27:81:28 | AST only | | swap1.cpp:102:12:102:16 | swap1.cpp:93:23:93:23 | AST only | | swap1.cpp:115:18:115:22 | swap1.cpp:108:23:108:31 | AST only | | swap1.cpp:129:12:129:16 | swap1.cpp:120:23:120:23 | AST only | | swap1.cpp:144:12:144:16 | swap1.cpp:135:23:135:23 | AST only | | swap2.cpp:78:12:78:16 | swap2.cpp:69:23:69:23 | AST only | +| swap2.cpp:87:13:87:17 | swap2.cpp:82:16:82:21 | IR only | | swap2.cpp:88:13:88:17 | swap2.cpp:81:27:81:28 | AST only | | swap2.cpp:102:12:102:16 | swap2.cpp:93:23:93:23 | AST only | | swap2.cpp:115:18:115:22 | swap2.cpp:108:23:108:31 | AST only | @@ -345,7 +229,6 @@ | vector.cpp:171:13:171:13 | vector.cpp:170:14:170:19 | AST only | | vector.cpp:180:13:180:13 | vector.cpp:179:14:179:19 | AST only | | vector.cpp:201:13:201:13 | vector.cpp:200:14:200:19 | AST only | -| vector.cpp:261:8:261:9 | vector.cpp:239:15:239:20 | AST only | | vector.cpp:286:10:286:13 | vector.cpp:284:15:284:20 | AST only | | vector.cpp:287:7:287:18 | vector.cpp:284:15:284:20 | AST only | | vector.cpp:290:7:290:8 | vector.cpp:289:17:289:30 | AST only | diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected index c8eabde99a58..8020f2149df0 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected @@ -74,10 +74,23 @@ | map.cpp:110:10:110:15 | call to insert | map.cpp:110:62:110:67 | call to source | | map.cpp:111:7:111:48 | call to iterator | map.cpp:111:34:111:39 | call to source | | map.cpp:112:10:112:25 | call to insert_or_assign | map.cpp:112:46:112:51 | call to source | +| map.cpp:114:7:114:8 | call to map | map.cpp:108:39:108:44 | call to source | +| map.cpp:116:7:116:8 | call to map | map.cpp:110:62:110:67 | call to source | +| map.cpp:117:7:117:8 | call to map | map.cpp:111:34:111:39 | call to source | +| map.cpp:118:7:118:8 | call to map | map.cpp:112:46:112:51 | call to source | | map.cpp:120:10:120:13 | call to find | map.cpp:108:39:108:44 | call to source | | map.cpp:122:10:122:13 | call to find | map.cpp:110:62:110:67 | call to source | +| map.cpp:123:10:123:13 | call to find | map.cpp:111:34:111:39 | call to source | +| map.cpp:124:10:124:13 | call to find | map.cpp:112:46:112:51 | call to source | | map.cpp:126:10:126:13 | call to find | map.cpp:108:39:108:44 | call to source | | map.cpp:128:10:128:13 | call to find | map.cpp:110:62:110:67 | call to source | +| map.cpp:129:10:129:13 | call to find | map.cpp:111:34:111:39 | call to source | +| map.cpp:130:10:130:13 | call to find | map.cpp:112:46:112:51 | call to source | +| map.cpp:137:7:137:8 | call to map | map.cpp:108:39:108:44 | call to source | +| map.cpp:138:7:138:8 | call to map | map.cpp:108:39:108:44 | call to source | +| map.cpp:139:7:139:8 | call to map | map.cpp:108:39:108:44 | call to source | +| map.cpp:140:10:140:13 | call to find | map.cpp:108:39:108:44 | call to source | +| map.cpp:141:10:141:13 | call to find | map.cpp:108:39:108:44 | call to source | | map.cpp:142:10:142:13 | call to find | map.cpp:108:39:108:44 | call to source | | map.cpp:154:8:154:10 | call to pair | map.cpp:108:39:108:44 | call to source | | map.cpp:155:12:155:16 | first | map.cpp:108:39:108:44 | call to source | @@ -92,20 +105,54 @@ | map.cpp:185:7:185:32 | call to iterator | map.cpp:108:39:108:44 | call to source | | map.cpp:186:10:186:20 | call to upper_bound | map.cpp:108:39:108:44 | call to source | | map.cpp:187:7:187:32 | call to iterator | map.cpp:108:39:108:44 | call to source | +| map.cpp:193:7:193:9 | call to map | map.cpp:191:49:191:54 | call to source | +| map.cpp:196:7:196:9 | call to map | map.cpp:192:49:192:54 | call to source | +| map.cpp:199:7:199:9 | call to map | map.cpp:191:49:191:54 | call to source | +| map.cpp:200:7:200:9 | call to map | map.cpp:191:49:191:54 | call to source | +| map.cpp:201:7:201:9 | call to map | map.cpp:192:49:192:54 | call to source | +| map.cpp:202:7:202:9 | call to map | map.cpp:192:49:192:54 | call to source | +| map.cpp:210:7:210:9 | call to map | map.cpp:206:49:206:54 | call to source | +| map.cpp:213:7:213:9 | call to map | map.cpp:209:49:209:54 | call to source | +| map.cpp:216:7:216:9 | call to map | map.cpp:206:49:206:54 | call to source | +| map.cpp:218:7:218:9 | call to map | map.cpp:209:49:209:54 | call to source | +| map.cpp:219:7:219:9 | call to map | map.cpp:209:49:209:54 | call to source | +| map.cpp:225:7:225:9 | call to map | map.cpp:223:49:223:54 | call to source | +| map.cpp:225:7:225:9 | call to map | map.cpp:224:49:224:54 | call to source | | map.cpp:226:11:226:15 | call to erase | map.cpp:223:49:223:54 | call to source | | map.cpp:226:11:226:15 | call to erase | map.cpp:224:49:224:54 | call to source | +| map.cpp:227:7:227:9 | call to map | map.cpp:223:49:223:54 | call to source | +| map.cpp:227:7:227:9 | call to map | map.cpp:224:49:224:54 | call to source | +| map.cpp:229:7:229:9 | call to map | map.cpp:223:49:223:54 | call to source | +| map.cpp:229:7:229:9 | call to map | map.cpp:224:49:224:54 | call to source | | map.cpp:235:7:235:40 | call to iterator | map.cpp:235:26:235:31 | call to source | +| map.cpp:236:7:236:9 | call to map | map.cpp:235:26:235:31 | call to source | | map.cpp:239:11:239:22 | call to emplace_hint | map.cpp:239:44:239:49 | call to source | +| map.cpp:240:7:240:9 | call to map | map.cpp:239:44:239:49 | call to source | | map.cpp:246:7:246:44 | call to iterator | map.cpp:246:30:246:35 | call to source | +| map.cpp:247:7:247:9 | call to map | map.cpp:246:30:246:35 | call to source | | map.cpp:250:11:250:21 | call to try_emplace | map.cpp:250:43:250:48 | call to source | +| map.cpp:251:7:251:9 | call to map | map.cpp:250:43:250:48 | call to source | | map.cpp:260:7:260:54 | call to iterator | map.cpp:260:39:260:44 | call to source | | map.cpp:262:10:262:15 | call to insert | map.cpp:262:62:262:67 | call to source | | map.cpp:263:7:263:48 | call to iterator | map.cpp:263:34:263:39 | call to source | | map.cpp:264:10:264:25 | call to insert_or_assign | map.cpp:264:46:264:51 | call to source | +| map.cpp:266:7:266:8 | call to unordered_map | map.cpp:260:39:260:44 | call to source | +| map.cpp:268:7:268:8 | call to unordered_map | map.cpp:262:62:262:67 | call to source | +| map.cpp:269:7:269:8 | call to unordered_map | map.cpp:263:34:263:39 | call to source | +| map.cpp:270:7:270:8 | call to unordered_map | map.cpp:264:46:264:51 | call to source | | map.cpp:272:10:272:13 | call to find | map.cpp:260:39:260:44 | call to source | | map.cpp:274:10:274:13 | call to find | map.cpp:262:62:262:67 | call to source | +| map.cpp:275:10:275:13 | call to find | map.cpp:263:34:263:39 | call to source | +| map.cpp:276:10:276:13 | call to find | map.cpp:264:46:264:51 | call to source | | map.cpp:278:10:278:13 | call to find | map.cpp:260:39:260:44 | call to source | | map.cpp:280:10:280:13 | call to find | map.cpp:262:62:262:67 | call to source | +| map.cpp:281:10:281:13 | call to find | map.cpp:263:34:263:39 | call to source | +| map.cpp:282:10:282:13 | call to find | map.cpp:264:46:264:51 | call to source | +| map.cpp:289:7:289:8 | call to unordered_map | map.cpp:260:39:260:44 | call to source | +| map.cpp:290:7:290:8 | call to unordered_map | map.cpp:260:39:260:44 | call to source | +| map.cpp:291:7:291:8 | call to unordered_map | map.cpp:260:39:260:44 | call to source | +| map.cpp:292:10:292:13 | call to find | map.cpp:260:39:260:44 | call to source | +| map.cpp:293:10:293:13 | call to find | map.cpp:260:39:260:44 | call to source | | map.cpp:294:10:294:13 | call to find | map.cpp:260:39:260:44 | call to source | | map.cpp:306:8:306:10 | call to pair | map.cpp:260:39:260:44 | call to source | | map.cpp:307:12:307:16 | first | map.cpp:260:39:260:44 | call to source | @@ -117,16 +164,42 @@ | map.cpp:334:7:334:31 | call to iterator | map.cpp:260:39:260:44 | call to source | | map.cpp:335:7:335:32 | call to iterator | map.cpp:260:39:260:44 | call to source | | map.cpp:336:7:336:32 | call to iterator | map.cpp:260:39:260:44 | call to source | +| map.cpp:342:7:342:9 | call to unordered_map | map.cpp:340:49:340:54 | call to source | +| map.cpp:345:7:345:9 | call to unordered_map | map.cpp:341:49:341:54 | call to source | +| map.cpp:348:7:348:9 | call to unordered_map | map.cpp:340:49:340:54 | call to source | +| map.cpp:349:7:349:9 | call to unordered_map | map.cpp:340:49:340:54 | call to source | +| map.cpp:350:7:350:9 | call to unordered_map | map.cpp:341:49:341:54 | call to source | +| map.cpp:351:7:351:9 | call to unordered_map | map.cpp:341:49:341:54 | call to source | +| map.cpp:359:7:359:9 | call to unordered_map | map.cpp:355:49:355:54 | call to source | +| map.cpp:362:7:362:9 | call to unordered_map | map.cpp:358:49:358:54 | call to source | +| map.cpp:365:7:365:9 | call to unordered_map | map.cpp:355:49:355:54 | call to source | +| map.cpp:367:7:367:9 | call to unordered_map | map.cpp:358:49:358:54 | call to source | +| map.cpp:368:7:368:9 | call to unordered_map | map.cpp:358:49:358:54 | call to source | +| map.cpp:374:7:374:9 | call to unordered_map | map.cpp:372:49:372:54 | call to source | +| map.cpp:374:7:374:9 | call to unordered_map | map.cpp:373:49:373:54 | call to source | | map.cpp:375:11:375:15 | call to erase | map.cpp:372:49:372:54 | call to source | | map.cpp:375:11:375:15 | call to erase | map.cpp:373:49:373:54 | call to source | +| map.cpp:376:7:376:9 | call to unordered_map | map.cpp:372:49:372:54 | call to source | +| map.cpp:376:7:376:9 | call to unordered_map | map.cpp:373:49:373:54 | call to source | +| map.cpp:378:7:378:9 | call to unordered_map | map.cpp:372:49:372:54 | call to source | +| map.cpp:378:7:378:9 | call to unordered_map | map.cpp:373:49:373:54 | call to source | | map.cpp:384:7:384:40 | call to iterator | map.cpp:384:26:384:31 | call to source | +| map.cpp:385:7:385:9 | call to unordered_map | map.cpp:384:26:384:31 | call to source | | map.cpp:388:11:388:22 | call to emplace_hint | map.cpp:388:44:388:49 | call to source | +| map.cpp:389:7:389:9 | call to unordered_map | map.cpp:388:44:388:49 | call to source | | map.cpp:396:7:396:44 | call to iterator | map.cpp:396:30:396:35 | call to source | +| map.cpp:397:40:397:45 | second | map.cpp:396:30:396:35 | call to source | | map.cpp:397:40:397:45 | second | map.cpp:397:30:397:35 | call to source | +| map.cpp:398:7:398:9 | call to unordered_map | map.cpp:396:30:396:35 | call to source | +| map.cpp:398:7:398:9 | call to unordered_map | map.cpp:397:30:397:35 | call to source | | map.cpp:401:11:401:21 | call to try_emplace | map.cpp:401:43:401:48 | call to source | +| map.cpp:402:7:402:9 | call to unordered_map | map.cpp:401:43:401:48 | call to source | | map.cpp:416:7:416:41 | call to pair | map.cpp:416:30:416:35 | call to source | +| map.cpp:417:7:417:9 | call to unordered_map | map.cpp:416:30:416:35 | call to source | | map.cpp:419:7:419:41 | call to pair | map.cpp:419:33:419:38 | call to source | +| map.cpp:420:7:420:9 | call to unordered_map | map.cpp:419:33:419:38 | call to source | | map.cpp:431:7:431:67 | call to iterator | map.cpp:431:52:431:57 | call to source | +| map.cpp:432:7:432:9 | call to unordered_map | map.cpp:431:52:431:57 | call to source | | map.cpp:433:11:433:22 | call to emplace_hint | map.cpp:431:52:431:57 | call to source | | movableclass.cpp:44:8:44:9 | s1 | movableclass.cpp:39:21:39:26 | call to source | | movableclass.cpp:45:8:45:9 | s2 | movableclass.cpp:40:23:40:28 | call to source | From 4e0afb0dc31043e781971aafff72eb539be276eb Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Sat, 17 Oct 2020 15:01:45 -0400 Subject: [PATCH 23/53] Print targets of `Load` and `Store` instructions in IR dump --- .../aliased_ssa/Instruction.qll | 18 + .../cpp/ir/implementation/raw/Instruction.qll | 18 + .../unaliased_ssa/Instruction.qll | 18 + .../test/library-tests/ir/ir/raw_ir.expected | 2678 ++++++++--------- .../ir/ssa/aliased_ssa_ir.expected | 458 +-- .../ir/ssa/aliased_ssa_ir_unsound.expected | 458 +-- .../ir/ssa/unaliased_ssa_ir.expected | 462 +-- .../ir/ssa/unaliased_ssa_ir_unsound.expected | 462 +-- .../GlobalValueNumbering/ir_gvn.expected | 286 +- .../ir/implementation/raw/Instruction.qll | 18 + .../unaliased_ssa/Instruction.qll | 18 + .../test/experimental/ir/ir/raw_ir.expected | 630 ++-- 12 files changed, 2807 insertions(+), 2717 deletions(-) diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll index 135b91c0decd..e73054b03340 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll @@ -804,12 +804,26 @@ class CopyValueInstruction extends CopyInstruction, UnaryInstruction { final override UnaryOperand getSourceValueOperand() { result = getAnOperand() } } +/** + * Gets a string describing the location pointed to by the specified address operand. + */ +private string getAddressOperandDescription(AddressOperand operand) { + result = operand.getDef().(VariableAddressInstruction).getIRVariable().toString() + or + not operand.getDef() instanceof VariableAddressInstruction and + result = "?" +} + /** * An instruction that returns a register result containing a copy of its memory operand. */ class LoadInstruction extends CopyInstruction { LoadInstruction() { getOpcode() instanceof Opcode::Load } + final override string getImmediateString() { + result = getAddressOperandDescription(getSourceAddressOperand()) + } + /** * Gets the operand that provides the address of the value being loaded. */ @@ -829,6 +843,10 @@ class LoadInstruction extends CopyInstruction { class StoreInstruction extends CopyInstruction { StoreInstruction() { getOpcode() instanceof Opcode::Store } + final override string getImmediateString() { + result = getAddressOperandDescription(getDestinationAddressOperand()) + } + /** * Gets the operand that provides the address of the location to which the value will be stored. */ diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Instruction.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Instruction.qll index 135b91c0decd..e73054b03340 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Instruction.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Instruction.qll @@ -804,12 +804,26 @@ class CopyValueInstruction extends CopyInstruction, UnaryInstruction { final override UnaryOperand getSourceValueOperand() { result = getAnOperand() } } +/** + * Gets a string describing the location pointed to by the specified address operand. + */ +private string getAddressOperandDescription(AddressOperand operand) { + result = operand.getDef().(VariableAddressInstruction).getIRVariable().toString() + or + not operand.getDef() instanceof VariableAddressInstruction and + result = "?" +} + /** * An instruction that returns a register result containing a copy of its memory operand. */ class LoadInstruction extends CopyInstruction { LoadInstruction() { getOpcode() instanceof Opcode::Load } + final override string getImmediateString() { + result = getAddressOperandDescription(getSourceAddressOperand()) + } + /** * Gets the operand that provides the address of the value being loaded. */ @@ -829,6 +843,10 @@ class LoadInstruction extends CopyInstruction { class StoreInstruction extends CopyInstruction { StoreInstruction() { getOpcode() instanceof Opcode::Store } + final override string getImmediateString() { + result = getAddressOperandDescription(getDestinationAddressOperand()) + } + /** * Gets the operand that provides the address of the location to which the value will be stored. */ diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll index 135b91c0decd..e73054b03340 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll @@ -804,12 +804,26 @@ class CopyValueInstruction extends CopyInstruction, UnaryInstruction { final override UnaryOperand getSourceValueOperand() { result = getAnOperand() } } +/** + * Gets a string describing the location pointed to by the specified address operand. + */ +private string getAddressOperandDescription(AddressOperand operand) { + result = operand.getDef().(VariableAddressInstruction).getIRVariable().toString() + or + not operand.getDef() instanceof VariableAddressInstruction and + result = "?" +} + /** * An instruction that returns a register result containing a copy of its memory operand. */ class LoadInstruction extends CopyInstruction { LoadInstruction() { getOpcode() instanceof Opcode::Load } + final override string getImmediateString() { + result = getAddressOperandDescription(getSourceAddressOperand()) + } + /** * Gets the operand that provides the address of the value being loaded. */ @@ -829,6 +843,10 @@ class LoadInstruction extends CopyInstruction { class StoreInstruction extends CopyInstruction { StoreInstruction() { getOpcode() instanceof Opcode::Store } + final override string getImmediateString() { + result = getAddressOperandDescription(getDestinationAddressOperand()) + } + /** * Gets the operand that provides the address of the location to which the value will be stored. */ diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index c441b347cea4..9bdc66b16e6e 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -6,21 +6,21 @@ bad_asts.cpp: # 9| mu9_3(unknown) = InitializeNonLocal : # 9| r9_4(glval) = VariableAddress[#this] : # 9| mu9_5(glval) = InitializeParameter[#this] : &:r9_4 -# 9| r9_6(glval) = Load : &:r9_4, ~m? +# 9| r9_6(glval) = Load[#this] : &:r9_4, ~m? # 9| mu9_7(S) = InitializeIndirection[#this] : &:r9_6 # 9| r9_8(glval) = VariableAddress[y] : # 9| mu9_9(int) = InitializeParameter[y] : &:r9_8 # 10| r10_1(glval) = VariableAddress[#return] : # 10| r10_2(int) = Constant[6] : # 10| r10_3(glval) = VariableAddress[#this] : -# 10| r10_4(S *) = Load : &:r10_3, ~m? +# 10| r10_4(S *) = Load[#this] : &:r10_3, ~m? # 10| r10_5(glval) = FieldAddress[x] : r10_4 -# 10| r10_6(int) = Load : &:r10_5, ~m? +# 10| r10_6(int) = Load[?] : &:r10_5, ~m? # 10| r10_7(int) = Add : r10_2, r10_6 # 10| r10_8(glval) = VariableAddress[y] : -# 10| r10_9(int) = Load : &:r10_8, ~m? +# 10| r10_9(int) = Load[y] : &:r10_8, ~m? # 10| r10_10(int) = Add : r10_7, r10_9 -# 10| mu10_11(int) = Store : &:r10_1, r10_10 +# 10| mu10_11(int) = Store[#return] : &:r10_1, r10_10 # 9| v9_10(void) = ReturnIndirection[#this] : &:r9_6, ~m? # 9| r9_11(glval) = VariableAddress[#return] : # 9| v9_12(void) = ReturnValue : &:r9_11, ~m? @@ -36,7 +36,7 @@ bad_asts.cpp: # 15| mu15_2(S) = Uninitialized[s] : &:r15_1 # 15| r15_3(glval) = FieldAddress[x] : r15_1 # 15| r15_4(int) = Constant[0] : -# 15| mu15_5(int) = Store : &:r15_3, r15_4 +# 15| mu15_5(int) = Store[?] : &:r15_3, r15_4 # 16| r16_1(glval) = VariableAddress[s] : # 16| r16_2(glval) = FunctionAddress[MemberFunction] : # 16| r16_3(int) = Constant[1] : @@ -56,7 +56,7 @@ bad_asts.cpp: # 22| mu22_3(unknown) = InitializeNonLocal : # 22| r22_4(glval) = VariableAddress[#this] : # 22| mu22_5(glval) = InitializeParameter[#this] : &:r22_4 -# 22| r22_6(glval) = Load : &:r22_4, ~m? +# 22| r22_6(glval) = Load[#this] : &:r22_4, ~m? # 22| mu22_7(Point) = InitializeIndirection[#this] : &:r22_6 # 23| v23_1(void) = NoOp : # 22| v22_8(void) = ReturnIndirection[#this] : &:r22_6, ~m? @@ -71,15 +71,15 @@ bad_asts.cpp: # 26| mu26_3(unknown) = InitializeNonLocal : # 26| r26_4(glval) = VariableAddress[a] : # 26| mu26_5(Point &) = InitializeParameter[a] : &:r26_4 -# 26| r26_6(Point &) = Load : &:r26_4, ~m? +# 26| r26_6(Point &) = Load[a] : &:r26_4, ~m? # 26| mu26_7(unknown) = InitializeIndirection[a] : &:r26_6 # 27| r27_1(glval) = VariableAddress[b] : # 27| r27_2(glval) = VariableAddress[a] : -# 27| r27_3(Point &) = Load : &:r27_2, ~m? +# 27| r27_3(Point &) = Load[a] : &:r27_2, ~m? # 27| r27_4(glval) = CopyValue : r27_3 # 27| r27_5(glval) = Convert : r27_4 -# 27| r27_6(Point) = Load : &:r27_5, ~m? -# 27| mu27_7(Point) = Store : &:r27_1, r27_6 +# 27| r27_6(Point) = Load[?] : &:r27_5, ~m? +# 27| mu27_7(Point) = Store[b] : &:r27_1, r27_6 # 28| v28_1(void) = NoOp : # 26| v26_8(void) = ReturnIndirection[a] : &:r26_6, ~m? # 26| v26_9(void) = ReturnVoid : @@ -93,14 +93,14 @@ bad_asts.cpp: # 30| mu30_3(unknown) = InitializeNonLocal : # 31| r31_1(glval) = VariableAddress[intref] : # 31| r31_2(error) = Error : -# 31| mu31_3(int &) = Store : &:r31_1, r31_2 +# 31| mu31_3(int &) = Store[intref] : &:r31_1, r31_2 # 32| r32_1(glval) = VariableAddress[x] : # 32| r32_2(error) = Error : -# 32| mu32_3(int) = Store : &:r32_1, r32_2 +# 32| mu32_3(int) = Store[x] : &:r32_1, r32_2 # 33| r33_1(glval) = Error : -# 33| r33_2(error) = Load : &:r33_1, ~m? +# 33| r33_2(error) = Load[?] : &:r33_1, ~m? # 33| r33_3(glval) = VariableAddress[x] : -# 33| mu33_4(int) = Store : &:r33_3, r33_2 +# 33| mu33_4(int) = Store[x] : &:r33_3, r33_2 # 34| v34_1(void) = NoOp : # 30| v30_4(void) = ReturnVoid : # 30| v30_5(void) = AliasedUse : ~m? @@ -115,7 +115,7 @@ clang.cpp: # 6| r6_1(glval) = VariableAddress[#return] : # 6| r6_2(glval) = VariableAddress[globalInt] : # 6| r6_3(int *) = CopyValue : r6_2 -# 6| mu6_4(int *) = Store : &:r6_1, r6_3 +# 6| mu6_4(int *) = Store[#return] : &:r6_1, r6_3 # 5| r5_4(glval) = VariableAddress[#return] : # 5| v5_5(void) = ReturnValue : &:r5_4, ~m? # 5| v5_6(void) = AliasedUse : ~m? @@ -130,38 +130,38 @@ complex.c: # 2| r2_1(glval<_Complex float>) = VariableAddress[cf] : # 2| r2_2(double) = Constant[2.0] : # 2| r2_3(_Complex float) = Convert : r2_2 -# 2| mu2_4(_Complex float) = Store : &:r2_1, r2_3 +# 2| mu2_4(_Complex float) = Store[cf] : &:r2_1, r2_3 # 3| r3_1(_Imaginary float) = Constant[1.0i] : # 3| r3_2(_Complex float) = Convert : r3_1 # 3| r3_3(glval<_Complex float>) = VariableAddress[cf] : -# 3| mu3_4(_Complex float) = Store : &:r3_3, r3_2 +# 3| mu3_4(_Complex float) = Store[cf] : &:r3_3, r3_2 # 4| r4_1(glval<_Complex double>) = VariableAddress[cd] : # 4| r4_2(double) = Constant[3.0] : # 4| r4_3(_Complex double) = Convert : r4_2 -# 4| mu4_4(_Complex double) = Store : &:r4_1, r4_3 +# 4| mu4_4(_Complex double) = Store[cd] : &:r4_1, r4_3 # 5| r5_1(_Imaginary float) = Constant[1.0i] : # 5| r5_2(_Complex double) = Convert : r5_1 # 5| r5_3(glval<_Complex double>) = VariableAddress[cd] : -# 5| mu5_4(_Complex double) = Store : &:r5_3, r5_2 +# 5| mu5_4(_Complex double) = Store[cd] : &:r5_3, r5_2 # 6| r6_1(glval<_Complex long double>) = VariableAddress[cld] : # 6| r6_2(double) = Constant[5.0] : # 6| r6_3(_Complex long double) = Convert : r6_2 -# 6| mu6_4(_Complex long double) = Store : &:r6_1, r6_3 +# 6| mu6_4(_Complex long double) = Store[cld] : &:r6_1, r6_3 # 7| r7_1(_Imaginary float) = Constant[1.0i] : # 7| r7_2(_Complex long double) = Convert : r7_1 # 7| r7_3(glval<_Complex long double>) = VariableAddress[cld] : -# 7| mu7_4(_Complex long double) = Store : &:r7_3, r7_2 +# 7| mu7_4(_Complex long double) = Store[cld] : &:r7_3, r7_2 # 9| r9_1(glval<_Imaginary float>) = VariableAddress[jf] : # 9| r9_2(_Imaginary float) = Constant[1.0i] : -# 9| mu9_3(_Imaginary float) = Store : &:r9_1, r9_2 +# 9| mu9_3(_Imaginary float) = Store[jf] : &:r9_1, r9_2 # 10| r10_1(glval<_Imaginary double>) = VariableAddress[jd] : # 10| r10_2(_Imaginary float) = Constant[1.0i] : # 10| r10_3(_Imaginary double) = Convert : r10_2 -# 10| mu10_4(_Imaginary double) = Store : &:r10_1, r10_3 +# 10| mu10_4(_Imaginary double) = Store[jd] : &:r10_1, r10_3 # 11| r11_1(glval<_Imaginary long double>) = VariableAddress[jld] : # 11| r11_2(_Imaginary float) = Constant[1.0i] : # 11| r11_3(_Imaginary long double) = Convert : r11_2 -# 11| mu11_4(_Imaginary long double) = Store : &:r11_1, r11_3 +# 11| mu11_4(_Imaginary long double) = Store[jld] : &:r11_1, r11_3 # 12| v12_1(void) = NoOp : # 1| v1_4(void) = ReturnVoid : # 1| v1_5(void) = AliasedUse : ~m? @@ -174,162 +174,162 @@ complex.c: # 14| mu14_3(unknown) = InitializeNonLocal : # 15| r15_1(glval) = VariableAddress[f1] : # 15| r15_2(float) = Constant[5.0] : -# 15| mu15_3(float) = Store : &:r15_1, r15_2 +# 15| mu15_3(float) = Store[f1] : &:r15_1, r15_2 # 16| r16_1(glval) = VariableAddress[f2] : # 16| r16_2(float) = Constant[7.0] : -# 16| mu16_3(float) = Store : &:r16_1, r16_2 +# 16| mu16_3(float) = Store[f2] : &:r16_1, r16_2 # 17| r17_1(glval) = VariableAddress[f3] : # 17| mu17_2(float) = Uninitialized[f3] : &:r17_1 # 18| r18_1(glval<_Complex float>) = VariableAddress[cf1] : # 18| r18_2(double) = Constant[2.0] : # 18| r18_3(_Complex float) = Convert : r18_2 -# 18| mu18_4(_Complex float) = Store : &:r18_1, r18_3 +# 18| mu18_4(_Complex float) = Store[cf1] : &:r18_1, r18_3 # 19| r19_1(glval<_Complex float>) = VariableAddress[cf2] : # 19| r19_2(_Imaginary float) = Constant[1.0i] : # 19| r19_3(_Complex float) = Convert : r19_2 -# 19| mu19_4(_Complex float) = Store : &:r19_1, r19_3 +# 19| mu19_4(_Complex float) = Store[cf2] : &:r19_1, r19_3 # 20| r20_1(glval<_Complex float>) = VariableAddress[cf3] : # 20| mu20_2(_Complex float) = Uninitialized[cf3] : &:r20_1 # 21| r21_1(glval<_Imaginary float>) = VariableAddress[jf1] : # 21| r21_2(_Imaginary float) = Constant[1.0i] : -# 21| mu21_3(_Imaginary float) = Store : &:r21_1, r21_2 +# 21| mu21_3(_Imaginary float) = Store[jf1] : &:r21_1, r21_2 # 22| r22_1(glval<_Imaginary float>) = VariableAddress[jf2] : # 22| r22_2(_Imaginary float) = Constant[1.0i] : -# 22| mu22_3(_Imaginary float) = Store : &:r22_1, r22_2 +# 22| mu22_3(_Imaginary float) = Store[jf2] : &:r22_1, r22_2 # 23| r23_1(glval<_Imaginary float>) = VariableAddress[jf3] : # 23| mu23_2(_Imaginary float) = Uninitialized[jf3] : &:r23_1 # 26| r26_1(glval<_Complex float>) = VariableAddress[cf1] : -# 26| r26_2(_Complex float) = Load : &:r26_1, ~m? +# 26| r26_2(_Complex float) = Load[cf1] : &:r26_1, ~m? # 26| r26_3(_Complex float) = CopyValue : r26_2 # 26| r26_4(glval<_Complex float>) = VariableAddress[cf3] : -# 26| mu26_5(_Complex float) = Store : &:r26_4, r26_3 +# 26| mu26_5(_Complex float) = Store[cf3] : &:r26_4, r26_3 # 27| r27_1(glval<_Complex float>) = VariableAddress[cf1] : -# 27| r27_2(_Complex float) = Load : &:r27_1, ~m? +# 27| r27_2(_Complex float) = Load[cf1] : &:r27_1, ~m? # 27| r27_3(_Complex float) = Negate : r27_2 # 27| r27_4(glval<_Complex float>) = VariableAddress[cf3] : -# 27| mu27_5(_Complex float) = Store : &:r27_4, r27_3 +# 27| mu27_5(_Complex float) = Store[cf3] : &:r27_4, r27_3 # 30| r30_1(glval<_Complex float>) = VariableAddress[cf1] : -# 30| r30_2(_Complex float) = Load : &:r30_1, ~m? +# 30| r30_2(_Complex float) = Load[cf1] : &:r30_1, ~m? # 30| r30_3(glval<_Complex float>) = VariableAddress[cf2] : -# 30| r30_4(_Complex float) = Load : &:r30_3, ~m? +# 30| r30_4(_Complex float) = Load[cf2] : &:r30_3, ~m? # 30| r30_5(_Complex float) = Add : r30_2, r30_4 # 30| r30_6(glval<_Complex float>) = VariableAddress[cf3] : -# 30| mu30_7(_Complex float) = Store : &:r30_6, r30_5 +# 30| mu30_7(_Complex float) = Store[cf3] : &:r30_6, r30_5 # 31| r31_1(glval<_Complex float>) = VariableAddress[cf1] : -# 31| r31_2(_Complex float) = Load : &:r31_1, ~m? +# 31| r31_2(_Complex float) = Load[cf1] : &:r31_1, ~m? # 31| r31_3(glval<_Complex float>) = VariableAddress[cf2] : -# 31| r31_4(_Complex float) = Load : &:r31_3, ~m? +# 31| r31_4(_Complex float) = Load[cf2] : &:r31_3, ~m? # 31| r31_5(_Complex float) = Sub : r31_2, r31_4 # 31| r31_6(glval<_Complex float>) = VariableAddress[cf3] : -# 31| mu31_7(_Complex float) = Store : &:r31_6, r31_5 +# 31| mu31_7(_Complex float) = Store[cf3] : &:r31_6, r31_5 # 32| r32_1(glval<_Complex float>) = VariableAddress[cf1] : -# 32| r32_2(_Complex float) = Load : &:r32_1, ~m? +# 32| r32_2(_Complex float) = Load[cf1] : &:r32_1, ~m? # 32| r32_3(glval<_Complex float>) = VariableAddress[cf2] : -# 32| r32_4(_Complex float) = Load : &:r32_3, ~m? +# 32| r32_4(_Complex float) = Load[cf2] : &:r32_3, ~m? # 32| r32_5(_Complex float) = Mul : r32_2, r32_4 # 32| r32_6(glval<_Complex float>) = VariableAddress[cf3] : -# 32| mu32_7(_Complex float) = Store : &:r32_6, r32_5 +# 32| mu32_7(_Complex float) = Store[cf3] : &:r32_6, r32_5 # 33| r33_1(glval<_Complex float>) = VariableAddress[cf1] : -# 33| r33_2(_Complex float) = Load : &:r33_1, ~m? +# 33| r33_2(_Complex float) = Load[cf1] : &:r33_1, ~m? # 33| r33_3(glval<_Complex float>) = VariableAddress[cf2] : -# 33| r33_4(_Complex float) = Load : &:r33_3, ~m? +# 33| r33_4(_Complex float) = Load[cf2] : &:r33_3, ~m? # 33| r33_5(_Complex float) = Div : r33_2, r33_4 # 33| r33_6(glval<_Complex float>) = VariableAddress[cf3] : -# 33| mu33_7(_Complex float) = Store : &:r33_6, r33_5 +# 33| mu33_7(_Complex float) = Store[cf3] : &:r33_6, r33_5 # 36| r36_1(glval<_Imaginary float>) = VariableAddress[jf1] : -# 36| r36_2(_Imaginary float) = Load : &:r36_1, ~m? +# 36| r36_2(_Imaginary float) = Load[jf1] : &:r36_1, ~m? # 36| r36_3(_Imaginary float) = CopyValue : r36_2 # 36| r36_4(glval<_Imaginary float>) = VariableAddress[jf3] : -# 36| mu36_5(_Imaginary float) = Store : &:r36_4, r36_3 +# 36| mu36_5(_Imaginary float) = Store[jf3] : &:r36_4, r36_3 # 37| r37_1(glval<_Imaginary float>) = VariableAddress[jf1] : -# 37| r37_2(_Imaginary float) = Load : &:r37_1, ~m? +# 37| r37_2(_Imaginary float) = Load[jf1] : &:r37_1, ~m? # 37| r37_3(_Imaginary float) = Negate : r37_2 # 37| r37_4(glval<_Imaginary float>) = VariableAddress[jf3] : -# 37| mu37_5(_Imaginary float) = Store : &:r37_4, r37_3 +# 37| mu37_5(_Imaginary float) = Store[jf3] : &:r37_4, r37_3 # 40| r40_1(glval<_Imaginary float>) = VariableAddress[jf1] : -# 40| r40_2(_Imaginary float) = Load : &:r40_1, ~m? +# 40| r40_2(_Imaginary float) = Load[jf1] : &:r40_1, ~m? # 40| r40_3(glval<_Imaginary float>) = VariableAddress[jf2] : -# 40| r40_4(_Imaginary float) = Load : &:r40_3, ~m? +# 40| r40_4(_Imaginary float) = Load[jf2] : &:r40_3, ~m? # 40| r40_5(_Imaginary float) = Add : r40_2, r40_4 # 40| r40_6(glval<_Imaginary float>) = VariableAddress[jf3] : -# 40| mu40_7(_Imaginary float) = Store : &:r40_6, r40_5 +# 40| mu40_7(_Imaginary float) = Store[jf3] : &:r40_6, r40_5 # 41| r41_1(glval<_Imaginary float>) = VariableAddress[jf1] : -# 41| r41_2(_Imaginary float) = Load : &:r41_1, ~m? +# 41| r41_2(_Imaginary float) = Load[jf1] : &:r41_1, ~m? # 41| r41_3(glval<_Imaginary float>) = VariableAddress[jf2] : -# 41| r41_4(_Imaginary float) = Load : &:r41_3, ~m? +# 41| r41_4(_Imaginary float) = Load[jf2] : &:r41_3, ~m? # 41| r41_5(_Imaginary float) = Sub : r41_2, r41_4 # 41| r41_6(glval<_Imaginary float>) = VariableAddress[jf3] : -# 41| mu41_7(_Imaginary float) = Store : &:r41_6, r41_5 +# 41| mu41_7(_Imaginary float) = Store[jf3] : &:r41_6, r41_5 # 42| r42_1(glval<_Imaginary float>) = VariableAddress[jf1] : -# 42| r42_2(_Imaginary float) = Load : &:r42_1, ~m? +# 42| r42_2(_Imaginary float) = Load[jf1] : &:r42_1, ~m? # 42| r42_3(glval<_Imaginary float>) = VariableAddress[jf2] : -# 42| r42_4(_Imaginary float) = Load : &:r42_3, ~m? +# 42| r42_4(_Imaginary float) = Load[jf2] : &:r42_3, ~m? # 42| r42_5(float) = Mul : r42_2, r42_4 # 42| r42_6(glval) = VariableAddress[f3] : -# 42| mu42_7(float) = Store : &:r42_6, r42_5 +# 42| mu42_7(float) = Store[f3] : &:r42_6, r42_5 # 43| r43_1(glval<_Imaginary float>) = VariableAddress[jf1] : -# 43| r43_2(_Imaginary float) = Load : &:r43_1, ~m? +# 43| r43_2(_Imaginary float) = Load[jf1] : &:r43_1, ~m? # 43| r43_3(glval<_Imaginary float>) = VariableAddress[jf2] : -# 43| r43_4(_Imaginary float) = Load : &:r43_3, ~m? +# 43| r43_4(_Imaginary float) = Load[jf2] : &:r43_3, ~m? # 43| r43_5(float) = Div : r43_2, r43_4 # 43| r43_6(glval) = VariableAddress[f3] : -# 43| mu43_7(float) = Store : &:r43_6, r43_5 +# 43| mu43_7(float) = Store[f3] : &:r43_6, r43_5 # 46| r46_1(glval<_Imaginary float>) = VariableAddress[jf1] : -# 46| r46_2(_Imaginary float) = Load : &:r46_1, ~m? +# 46| r46_2(_Imaginary float) = Load[jf1] : &:r46_1, ~m? # 46| r46_3(glval) = VariableAddress[f2] : -# 46| r46_4(float) = Load : &:r46_3, ~m? +# 46| r46_4(float) = Load[f2] : &:r46_3, ~m? # 46| r46_5(_Complex float) = Add : r46_2, r46_4 # 46| r46_6(glval<_Complex float>) = VariableAddress[cf3] : -# 46| mu46_7(_Complex float) = Store : &:r46_6, r46_5 +# 46| mu46_7(_Complex float) = Store[cf3] : &:r46_6, r46_5 # 47| r47_1(glval<_Imaginary float>) = VariableAddress[jf1] : -# 47| r47_2(_Imaginary float) = Load : &:r47_1, ~m? +# 47| r47_2(_Imaginary float) = Load[jf1] : &:r47_1, ~m? # 47| r47_3(glval) = VariableAddress[f2] : -# 47| r47_4(float) = Load : &:r47_3, ~m? +# 47| r47_4(float) = Load[f2] : &:r47_3, ~m? # 47| r47_5(_Complex float) = Sub : r47_2, r47_4 # 47| r47_6(glval<_Complex float>) = VariableAddress[cf3] : -# 47| mu47_7(_Complex float) = Store : &:r47_6, r47_5 +# 47| mu47_7(_Complex float) = Store[cf3] : &:r47_6, r47_5 # 48| r48_1(glval<_Imaginary float>) = VariableAddress[jf1] : -# 48| r48_2(_Imaginary float) = Load : &:r48_1, ~m? +# 48| r48_2(_Imaginary float) = Load[jf1] : &:r48_1, ~m? # 48| r48_3(glval) = VariableAddress[f2] : -# 48| r48_4(float) = Load : &:r48_3, ~m? +# 48| r48_4(float) = Load[f2] : &:r48_3, ~m? # 48| r48_5(_Imaginary float) = Mul : r48_2, r48_4 # 48| r48_6(glval<_Imaginary float>) = VariableAddress[jf3] : -# 48| mu48_7(_Imaginary float) = Store : &:r48_6, r48_5 +# 48| mu48_7(_Imaginary float) = Store[jf3] : &:r48_6, r48_5 # 49| r49_1(glval<_Imaginary float>) = VariableAddress[jf1] : -# 49| r49_2(_Imaginary float) = Load : &:r49_1, ~m? +# 49| r49_2(_Imaginary float) = Load[jf1] : &:r49_1, ~m? # 49| r49_3(glval) = VariableAddress[f2] : -# 49| r49_4(float) = Load : &:r49_3, ~m? +# 49| r49_4(float) = Load[f2] : &:r49_3, ~m? # 49| r49_5(_Imaginary float) = Div : r49_2, r49_4 # 49| r49_6(glval<_Imaginary float>) = VariableAddress[jf3] : -# 49| mu49_7(_Imaginary float) = Store : &:r49_6, r49_5 +# 49| mu49_7(_Imaginary float) = Store[jf3] : &:r49_6, r49_5 # 52| r52_1(glval) = VariableAddress[f1] : -# 52| r52_2(float) = Load : &:r52_1, ~m? +# 52| r52_2(float) = Load[f1] : &:r52_1, ~m? # 52| r52_3(glval<_Imaginary float>) = VariableAddress[jf2] : -# 52| r52_4(_Imaginary float) = Load : &:r52_3, ~m? +# 52| r52_4(_Imaginary float) = Load[jf2] : &:r52_3, ~m? # 52| r52_5(_Complex float) = Add : r52_2, r52_4 # 52| r52_6(glval<_Complex float>) = VariableAddress[cf3] : -# 52| mu52_7(_Complex float) = Store : &:r52_6, r52_5 +# 52| mu52_7(_Complex float) = Store[cf3] : &:r52_6, r52_5 # 53| r53_1(glval) = VariableAddress[f1] : -# 53| r53_2(float) = Load : &:r53_1, ~m? +# 53| r53_2(float) = Load[f1] : &:r53_1, ~m? # 53| r53_3(glval<_Imaginary float>) = VariableAddress[jf2] : -# 53| r53_4(_Imaginary float) = Load : &:r53_3, ~m? +# 53| r53_4(_Imaginary float) = Load[jf2] : &:r53_3, ~m? # 53| r53_5(_Complex float) = Sub : r53_2, r53_4 # 53| r53_6(glval<_Complex float>) = VariableAddress[cf3] : -# 53| mu53_7(_Complex float) = Store : &:r53_6, r53_5 +# 53| mu53_7(_Complex float) = Store[cf3] : &:r53_6, r53_5 # 54| r54_1(glval) = VariableAddress[f1] : -# 54| r54_2(float) = Load : &:r54_1, ~m? +# 54| r54_2(float) = Load[f1] : &:r54_1, ~m? # 54| r54_3(glval<_Imaginary float>) = VariableAddress[jf2] : -# 54| r54_4(_Imaginary float) = Load : &:r54_3, ~m? +# 54| r54_4(_Imaginary float) = Load[jf2] : &:r54_3, ~m? # 54| r54_5(_Imaginary float) = Mul : r54_2, r54_4 # 54| r54_6(glval<_Imaginary float>) = VariableAddress[jf3] : -# 54| mu54_7(_Imaginary float) = Store : &:r54_6, r54_5 +# 54| mu54_7(_Imaginary float) = Store[jf3] : &:r54_6, r54_5 # 55| r55_1(glval) = VariableAddress[f1] : -# 55| r55_2(float) = Load : &:r55_1, ~m? +# 55| r55_2(float) = Load[f1] : &:r55_1, ~m? # 55| r55_3(glval<_Imaginary float>) = VariableAddress[jf2] : -# 55| r55_4(_Imaginary float) = Load : &:r55_3, ~m? +# 55| r55_4(_Imaginary float) = Load[jf2] : &:r55_3, ~m? # 55| r55_5(_Imaginary float) = Div : r55_2, r55_4 # 55| r55_6(glval<_Imaginary float>) = VariableAddress[jf3] : -# 55| mu55_7(_Imaginary float) = Store : &:r55_6, r55_5 +# 55| mu55_7(_Imaginary float) = Store[jf3] : &:r55_6, r55_5 # 56| v56_1(void) = NoOp : # 14| v14_4(void) = ReturnVoid : # 14| v14_5(void) = AliasedUse : ~m? @@ -342,348 +342,348 @@ complex.c: # 58| mu58_3(unknown) = InitializeNonLocal : # 59| r59_1(glval) = VariableAddress[f] : # 59| r59_2(float) = Constant[2.0] : -# 59| mu59_3(float) = Store : &:r59_1, r59_2 +# 59| mu59_3(float) = Store[f] : &:r59_1, r59_2 # 60| r60_1(glval) = VariableAddress[d] : # 60| r60_2(double) = Constant[3.0] : -# 60| mu60_3(double) = Store : &:r60_1, r60_2 +# 60| mu60_3(double) = Store[d] : &:r60_1, r60_2 # 61| r61_1(glval) = VariableAddress[ld] : # 61| r61_2(long double) = Constant[5.0] : -# 61| mu61_3(long double) = Store : &:r61_1, r61_2 +# 61| mu61_3(long double) = Store[ld] : &:r61_1, r61_2 # 62| r62_1(glval<_Complex float>) = VariableAddress[cf] : # 62| r62_2(double) = Constant[7.0] : # 62| r62_3(_Complex float) = Convert : r62_2 -# 62| mu62_4(_Complex float) = Store : &:r62_1, r62_3 +# 62| mu62_4(_Complex float) = Store[cf] : &:r62_1, r62_3 # 63| r63_1(glval<_Complex double>) = VariableAddress[cd] : # 63| r63_2(double) = Constant[11.0] : # 63| r63_3(_Complex double) = Convert : r63_2 -# 63| mu63_4(_Complex double) = Store : &:r63_1, r63_3 +# 63| mu63_4(_Complex double) = Store[cd] : &:r63_1, r63_3 # 64| r64_1(glval<_Complex long double>) = VariableAddress[cld] : # 64| r64_2(double) = Constant[13.0] : # 64| r64_3(_Complex long double) = Convert : r64_2 -# 64| mu64_4(_Complex long double) = Store : &:r64_1, r64_3 +# 64| mu64_4(_Complex long double) = Store[cld] : &:r64_1, r64_3 # 65| r65_1(glval<_Imaginary float>) = VariableAddress[jf] : # 65| r65_2(_Imaginary float) = Constant[1.0i] : -# 65| mu65_3(_Imaginary float) = Store : &:r65_1, r65_2 +# 65| mu65_3(_Imaginary float) = Store[jf] : &:r65_1, r65_2 # 66| r66_1(glval<_Imaginary double>) = VariableAddress[jd] : # 66| r66_2(_Imaginary float) = Constant[1.0i] : # 66| r66_3(_Imaginary double) = Convert : r66_2 -# 66| mu66_4(_Imaginary double) = Store : &:r66_1, r66_3 +# 66| mu66_4(_Imaginary double) = Store[jd] : &:r66_1, r66_3 # 67| r67_1(glval<_Imaginary long double>) = VariableAddress[jld] : # 67| r67_2(_Imaginary float) = Constant[1.0i] : # 67| r67_3(_Imaginary long double) = Convert : r67_2 -# 67| mu67_4(_Imaginary long double) = Store : &:r67_1, r67_3 +# 67| mu67_4(_Imaginary long double) = Store[jld] : &:r67_1, r67_3 # 70| r70_1(glval<_Complex float>) = VariableAddress[cf] : -# 70| r70_2(_Complex float) = Load : &:r70_1, ~m? +# 70| r70_2(_Complex float) = Load[cf] : &:r70_1, ~m? # 70| r70_3(glval<_Complex float>) = VariableAddress[cf] : -# 70| mu70_4(_Complex float) = Store : &:r70_3, r70_2 +# 70| mu70_4(_Complex float) = Store[cf] : &:r70_3, r70_2 # 71| r71_1(glval<_Complex double>) = VariableAddress[cd] : -# 71| r71_2(_Complex double) = Load : &:r71_1, ~m? +# 71| r71_2(_Complex double) = Load[cd] : &:r71_1, ~m? # 71| r71_3(_Complex float) = Convert : r71_2 # 71| r71_4(glval<_Complex float>) = VariableAddress[cf] : -# 71| mu71_5(_Complex float) = Store : &:r71_4, r71_3 +# 71| mu71_5(_Complex float) = Store[cf] : &:r71_4, r71_3 # 72| r72_1(glval<_Complex long double>) = VariableAddress[cld] : -# 72| r72_2(_Complex long double) = Load : &:r72_1, ~m? +# 72| r72_2(_Complex long double) = Load[cld] : &:r72_1, ~m? # 72| r72_3(_Complex float) = Convert : r72_2 # 72| r72_4(glval<_Complex float>) = VariableAddress[cf] : -# 72| mu72_5(_Complex float) = Store : &:r72_4, r72_3 +# 72| mu72_5(_Complex float) = Store[cf] : &:r72_4, r72_3 # 73| r73_1(glval<_Complex float>) = VariableAddress[cf] : -# 73| r73_2(_Complex float) = Load : &:r73_1, ~m? +# 73| r73_2(_Complex float) = Load[cf] : &:r73_1, ~m? # 73| r73_3(_Complex double) = Convert : r73_2 # 73| r73_4(glval<_Complex double>) = VariableAddress[cd] : -# 73| mu73_5(_Complex double) = Store : &:r73_4, r73_3 +# 73| mu73_5(_Complex double) = Store[cd] : &:r73_4, r73_3 # 74| r74_1(glval<_Complex double>) = VariableAddress[cd] : -# 74| r74_2(_Complex double) = Load : &:r74_1, ~m? +# 74| r74_2(_Complex double) = Load[cd] : &:r74_1, ~m? # 74| r74_3(glval<_Complex double>) = VariableAddress[cd] : -# 74| mu74_4(_Complex double) = Store : &:r74_3, r74_2 +# 74| mu74_4(_Complex double) = Store[cd] : &:r74_3, r74_2 # 75| r75_1(glval<_Complex long double>) = VariableAddress[cld] : -# 75| r75_2(_Complex long double) = Load : &:r75_1, ~m? +# 75| r75_2(_Complex long double) = Load[cld] : &:r75_1, ~m? # 75| r75_3(_Complex double) = Convert : r75_2 # 75| r75_4(glval<_Complex double>) = VariableAddress[cd] : -# 75| mu75_5(_Complex double) = Store : &:r75_4, r75_3 +# 75| mu75_5(_Complex double) = Store[cd] : &:r75_4, r75_3 # 76| r76_1(glval<_Complex float>) = VariableAddress[cf] : -# 76| r76_2(_Complex float) = Load : &:r76_1, ~m? +# 76| r76_2(_Complex float) = Load[cf] : &:r76_1, ~m? # 76| r76_3(_Complex long double) = Convert : r76_2 # 76| r76_4(glval<_Complex long double>) = VariableAddress[cld] : -# 76| mu76_5(_Complex long double) = Store : &:r76_4, r76_3 +# 76| mu76_5(_Complex long double) = Store[cld] : &:r76_4, r76_3 # 77| r77_1(glval<_Complex double>) = VariableAddress[cd] : -# 77| r77_2(_Complex double) = Load : &:r77_1, ~m? +# 77| r77_2(_Complex double) = Load[cd] : &:r77_1, ~m? # 77| r77_3(_Complex long double) = Convert : r77_2 # 77| r77_4(glval<_Complex long double>) = VariableAddress[cld] : -# 77| mu77_5(_Complex long double) = Store : &:r77_4, r77_3 +# 77| mu77_5(_Complex long double) = Store[cld] : &:r77_4, r77_3 # 78| r78_1(glval<_Complex long double>) = VariableAddress[cld] : -# 78| r78_2(_Complex long double) = Load : &:r78_1, ~m? +# 78| r78_2(_Complex long double) = Load[cld] : &:r78_1, ~m? # 78| r78_3(glval<_Complex long double>) = VariableAddress[cld] : -# 78| mu78_4(_Complex long double) = Store : &:r78_3, r78_2 +# 78| mu78_4(_Complex long double) = Store[cld] : &:r78_3, r78_2 # 81| r81_1(glval) = VariableAddress[f] : -# 81| r81_2(float) = Load : &:r81_1, ~m? +# 81| r81_2(float) = Load[f] : &:r81_1, ~m? # 81| r81_3(_Complex float) = Convert : r81_2 # 81| r81_4(glval<_Complex float>) = VariableAddress[cf] : -# 81| mu81_5(_Complex float) = Store : &:r81_4, r81_3 +# 81| mu81_5(_Complex float) = Store[cf] : &:r81_4, r81_3 # 82| r82_1(glval) = VariableAddress[d] : -# 82| r82_2(double) = Load : &:r82_1, ~m? +# 82| r82_2(double) = Load[d] : &:r82_1, ~m? # 82| r82_3(_Complex float) = Convert : r82_2 # 82| r82_4(glval<_Complex float>) = VariableAddress[cf] : -# 82| mu82_5(_Complex float) = Store : &:r82_4, r82_3 +# 82| mu82_5(_Complex float) = Store[cf] : &:r82_4, r82_3 # 83| r83_1(glval) = VariableAddress[ld] : -# 83| r83_2(long double) = Load : &:r83_1, ~m? +# 83| r83_2(long double) = Load[ld] : &:r83_1, ~m? # 83| r83_3(_Complex float) = Convert : r83_2 # 83| r83_4(glval<_Complex float>) = VariableAddress[cf] : -# 83| mu83_5(_Complex float) = Store : &:r83_4, r83_3 +# 83| mu83_5(_Complex float) = Store[cf] : &:r83_4, r83_3 # 84| r84_1(glval) = VariableAddress[f] : -# 84| r84_2(float) = Load : &:r84_1, ~m? +# 84| r84_2(float) = Load[f] : &:r84_1, ~m? # 84| r84_3(_Complex double) = Convert : r84_2 # 84| r84_4(glval<_Complex double>) = VariableAddress[cd] : -# 84| mu84_5(_Complex double) = Store : &:r84_4, r84_3 +# 84| mu84_5(_Complex double) = Store[cd] : &:r84_4, r84_3 # 85| r85_1(glval) = VariableAddress[d] : -# 85| r85_2(double) = Load : &:r85_1, ~m? +# 85| r85_2(double) = Load[d] : &:r85_1, ~m? # 85| r85_3(_Complex double) = Convert : r85_2 # 85| r85_4(glval<_Complex double>) = VariableAddress[cd] : -# 85| mu85_5(_Complex double) = Store : &:r85_4, r85_3 +# 85| mu85_5(_Complex double) = Store[cd] : &:r85_4, r85_3 # 86| r86_1(glval) = VariableAddress[ld] : -# 86| r86_2(long double) = Load : &:r86_1, ~m? +# 86| r86_2(long double) = Load[ld] : &:r86_1, ~m? # 86| r86_3(_Complex double) = Convert : r86_2 # 86| r86_4(glval<_Complex double>) = VariableAddress[cd] : -# 86| mu86_5(_Complex double) = Store : &:r86_4, r86_3 +# 86| mu86_5(_Complex double) = Store[cd] : &:r86_4, r86_3 # 87| r87_1(glval) = VariableAddress[f] : -# 87| r87_2(float) = Load : &:r87_1, ~m? +# 87| r87_2(float) = Load[f] : &:r87_1, ~m? # 87| r87_3(_Complex long double) = Convert : r87_2 # 87| r87_4(glval<_Complex long double>) = VariableAddress[cld] : -# 87| mu87_5(_Complex long double) = Store : &:r87_4, r87_3 +# 87| mu87_5(_Complex long double) = Store[cld] : &:r87_4, r87_3 # 88| r88_1(glval) = VariableAddress[d] : -# 88| r88_2(double) = Load : &:r88_1, ~m? +# 88| r88_2(double) = Load[d] : &:r88_1, ~m? # 88| r88_3(_Complex long double) = Convert : r88_2 # 88| r88_4(glval<_Complex long double>) = VariableAddress[cld] : -# 88| mu88_5(_Complex long double) = Store : &:r88_4, r88_3 +# 88| mu88_5(_Complex long double) = Store[cld] : &:r88_4, r88_3 # 89| r89_1(glval) = VariableAddress[ld] : -# 89| r89_2(long double) = Load : &:r89_1, ~m? +# 89| r89_2(long double) = Load[ld] : &:r89_1, ~m? # 89| r89_3(_Complex long double) = Convert : r89_2 # 89| r89_4(glval<_Complex long double>) = VariableAddress[cld] : -# 89| mu89_5(_Complex long double) = Store : &:r89_4, r89_3 +# 89| mu89_5(_Complex long double) = Store[cld] : &:r89_4, r89_3 # 92| r92_1(glval<_Complex float>) = VariableAddress[cf] : -# 92| r92_2(_Complex float) = Load : &:r92_1, ~m? +# 92| r92_2(_Complex float) = Load[cf] : &:r92_1, ~m? # 92| r92_3(float) = Convert : r92_2 # 92| r92_4(glval) = VariableAddress[f] : -# 92| mu92_5(float) = Store : &:r92_4, r92_3 +# 92| mu92_5(float) = Store[f] : &:r92_4, r92_3 # 93| r93_1(glval<_Complex double>) = VariableAddress[cd] : -# 93| r93_2(_Complex double) = Load : &:r93_1, ~m? +# 93| r93_2(_Complex double) = Load[cd] : &:r93_1, ~m? # 93| r93_3(float) = Convert : r93_2 # 93| r93_4(glval) = VariableAddress[f] : -# 93| mu93_5(float) = Store : &:r93_4, r93_3 +# 93| mu93_5(float) = Store[f] : &:r93_4, r93_3 # 94| r94_1(glval<_Complex long double>) = VariableAddress[cld] : -# 94| r94_2(_Complex long double) = Load : &:r94_1, ~m? +# 94| r94_2(_Complex long double) = Load[cld] : &:r94_1, ~m? # 94| r94_3(float) = Convert : r94_2 # 94| r94_4(glval) = VariableAddress[f] : -# 94| mu94_5(float) = Store : &:r94_4, r94_3 +# 94| mu94_5(float) = Store[f] : &:r94_4, r94_3 # 95| r95_1(glval<_Complex float>) = VariableAddress[cf] : -# 95| r95_2(_Complex float) = Load : &:r95_1, ~m? +# 95| r95_2(_Complex float) = Load[cf] : &:r95_1, ~m? # 95| r95_3(double) = Convert : r95_2 # 95| r95_4(glval) = VariableAddress[d] : -# 95| mu95_5(double) = Store : &:r95_4, r95_3 +# 95| mu95_5(double) = Store[d] : &:r95_4, r95_3 # 96| r96_1(glval<_Complex double>) = VariableAddress[cd] : -# 96| r96_2(_Complex double) = Load : &:r96_1, ~m? +# 96| r96_2(_Complex double) = Load[cd] : &:r96_1, ~m? # 96| r96_3(double) = Convert : r96_2 # 96| r96_4(glval) = VariableAddress[d] : -# 96| mu96_5(double) = Store : &:r96_4, r96_3 +# 96| mu96_5(double) = Store[d] : &:r96_4, r96_3 # 97| r97_1(glval<_Complex long double>) = VariableAddress[cld] : -# 97| r97_2(_Complex long double) = Load : &:r97_1, ~m? +# 97| r97_2(_Complex long double) = Load[cld] : &:r97_1, ~m? # 97| r97_3(double) = Convert : r97_2 # 97| r97_4(glval) = VariableAddress[d] : -# 97| mu97_5(double) = Store : &:r97_4, r97_3 +# 97| mu97_5(double) = Store[d] : &:r97_4, r97_3 # 98| r98_1(glval<_Complex float>) = VariableAddress[cf] : -# 98| r98_2(_Complex float) = Load : &:r98_1, ~m? +# 98| r98_2(_Complex float) = Load[cf] : &:r98_1, ~m? # 98| r98_3(long double) = Convert : r98_2 # 98| r98_4(glval) = VariableAddress[ld] : -# 98| mu98_5(long double) = Store : &:r98_4, r98_3 +# 98| mu98_5(long double) = Store[ld] : &:r98_4, r98_3 # 99| r99_1(glval<_Complex double>) = VariableAddress[cd] : -# 99| r99_2(_Complex double) = Load : &:r99_1, ~m? +# 99| r99_2(_Complex double) = Load[cd] : &:r99_1, ~m? # 99| r99_3(long double) = Convert : r99_2 # 99| r99_4(glval) = VariableAddress[ld] : -# 99| mu99_5(long double) = Store : &:r99_4, r99_3 +# 99| mu99_5(long double) = Store[ld] : &:r99_4, r99_3 # 100| r100_1(glval<_Complex long double>) = VariableAddress[cld] : -# 100| r100_2(_Complex long double) = Load : &:r100_1, ~m? +# 100| r100_2(_Complex long double) = Load[cld] : &:r100_1, ~m? # 100| r100_3(long double) = Convert : r100_2 # 100| r100_4(glval) = VariableAddress[ld] : -# 100| mu100_5(long double) = Store : &:r100_4, r100_3 +# 100| mu100_5(long double) = Store[ld] : &:r100_4, r100_3 # 103| r103_1(glval<_Imaginary float>) = VariableAddress[jf] : -# 103| r103_2(_Imaginary float) = Load : &:r103_1, ~m? +# 103| r103_2(_Imaginary float) = Load[jf] : &:r103_1, ~m? # 103| r103_3(_Complex float) = Convert : r103_2 # 103| r103_4(glval<_Complex float>) = VariableAddress[cf] : -# 103| mu103_5(_Complex float) = Store : &:r103_4, r103_3 +# 103| mu103_5(_Complex float) = Store[cf] : &:r103_4, r103_3 # 104| r104_1(glval<_Imaginary double>) = VariableAddress[jd] : -# 104| r104_2(_Imaginary double) = Load : &:r104_1, ~m? +# 104| r104_2(_Imaginary double) = Load[jd] : &:r104_1, ~m? # 104| r104_3(_Complex float) = Convert : r104_2 # 104| r104_4(glval<_Complex float>) = VariableAddress[cf] : -# 104| mu104_5(_Complex float) = Store : &:r104_4, r104_3 +# 104| mu104_5(_Complex float) = Store[cf] : &:r104_4, r104_3 # 105| r105_1(glval<_Imaginary long double>) = VariableAddress[jld] : -# 105| r105_2(_Imaginary long double) = Load : &:r105_1, ~m? +# 105| r105_2(_Imaginary long double) = Load[jld] : &:r105_1, ~m? # 105| r105_3(_Complex float) = Convert : r105_2 # 105| r105_4(glval<_Complex float>) = VariableAddress[cf] : -# 105| mu105_5(_Complex float) = Store : &:r105_4, r105_3 +# 105| mu105_5(_Complex float) = Store[cf] : &:r105_4, r105_3 # 106| r106_1(glval<_Imaginary float>) = VariableAddress[jf] : -# 106| r106_2(_Imaginary float) = Load : &:r106_1, ~m? +# 106| r106_2(_Imaginary float) = Load[jf] : &:r106_1, ~m? # 106| r106_3(_Complex double) = Convert : r106_2 # 106| r106_4(glval<_Complex double>) = VariableAddress[cd] : -# 106| mu106_5(_Complex double) = Store : &:r106_4, r106_3 +# 106| mu106_5(_Complex double) = Store[cd] : &:r106_4, r106_3 # 107| r107_1(glval<_Imaginary double>) = VariableAddress[jd] : -# 107| r107_2(_Imaginary double) = Load : &:r107_1, ~m? +# 107| r107_2(_Imaginary double) = Load[jd] : &:r107_1, ~m? # 107| r107_3(_Complex double) = Convert : r107_2 # 107| r107_4(glval<_Complex double>) = VariableAddress[cd] : -# 107| mu107_5(_Complex double) = Store : &:r107_4, r107_3 +# 107| mu107_5(_Complex double) = Store[cd] : &:r107_4, r107_3 # 108| r108_1(glval<_Imaginary long double>) = VariableAddress[jld] : -# 108| r108_2(_Imaginary long double) = Load : &:r108_1, ~m? +# 108| r108_2(_Imaginary long double) = Load[jld] : &:r108_1, ~m? # 108| r108_3(_Complex double) = Convert : r108_2 # 108| r108_4(glval<_Complex double>) = VariableAddress[cd] : -# 108| mu108_5(_Complex double) = Store : &:r108_4, r108_3 +# 108| mu108_5(_Complex double) = Store[cd] : &:r108_4, r108_3 # 109| r109_1(glval<_Imaginary float>) = VariableAddress[jf] : -# 109| r109_2(_Imaginary float) = Load : &:r109_1, ~m? +# 109| r109_2(_Imaginary float) = Load[jf] : &:r109_1, ~m? # 109| r109_3(_Complex long double) = Convert : r109_2 # 109| r109_4(glval<_Complex long double>) = VariableAddress[cld] : -# 109| mu109_5(_Complex long double) = Store : &:r109_4, r109_3 +# 109| mu109_5(_Complex long double) = Store[cld] : &:r109_4, r109_3 # 110| r110_1(glval<_Imaginary double>) = VariableAddress[jd] : -# 110| r110_2(_Imaginary double) = Load : &:r110_1, ~m? +# 110| r110_2(_Imaginary double) = Load[jd] : &:r110_1, ~m? # 110| r110_3(_Complex long double) = Convert : r110_2 # 110| r110_4(glval<_Complex long double>) = VariableAddress[cld] : -# 110| mu110_5(_Complex long double) = Store : &:r110_4, r110_3 +# 110| mu110_5(_Complex long double) = Store[cld] : &:r110_4, r110_3 # 111| r111_1(glval<_Imaginary long double>) = VariableAddress[jld] : -# 111| r111_2(_Imaginary long double) = Load : &:r111_1, ~m? +# 111| r111_2(_Imaginary long double) = Load[jld] : &:r111_1, ~m? # 111| r111_3(_Complex long double) = Convert : r111_2 # 111| r111_4(glval<_Complex long double>) = VariableAddress[cld] : -# 111| mu111_5(_Complex long double) = Store : &:r111_4, r111_3 +# 111| mu111_5(_Complex long double) = Store[cld] : &:r111_4, r111_3 # 114| r114_1(glval<_Complex float>) = VariableAddress[cf] : -# 114| r114_2(_Complex float) = Load : &:r114_1, ~m? +# 114| r114_2(_Complex float) = Load[cf] : &:r114_1, ~m? # 114| r114_3(_Imaginary float) = Convert : r114_2 # 114| r114_4(glval<_Imaginary float>) = VariableAddress[jf] : -# 114| mu114_5(_Imaginary float) = Store : &:r114_4, r114_3 +# 114| mu114_5(_Imaginary float) = Store[jf] : &:r114_4, r114_3 # 115| r115_1(glval<_Complex double>) = VariableAddress[cd] : -# 115| r115_2(_Complex double) = Load : &:r115_1, ~m? +# 115| r115_2(_Complex double) = Load[cd] : &:r115_1, ~m? # 115| r115_3(_Imaginary float) = Convert : r115_2 # 115| r115_4(glval<_Imaginary float>) = VariableAddress[jf] : -# 115| mu115_5(_Imaginary float) = Store : &:r115_4, r115_3 +# 115| mu115_5(_Imaginary float) = Store[jf] : &:r115_4, r115_3 # 116| r116_1(glval<_Complex long double>) = VariableAddress[cld] : -# 116| r116_2(_Complex long double) = Load : &:r116_1, ~m? +# 116| r116_2(_Complex long double) = Load[cld] : &:r116_1, ~m? # 116| r116_3(_Imaginary float) = Convert : r116_2 # 116| r116_4(glval<_Imaginary float>) = VariableAddress[jf] : -# 116| mu116_5(_Imaginary float) = Store : &:r116_4, r116_3 +# 116| mu116_5(_Imaginary float) = Store[jf] : &:r116_4, r116_3 # 117| r117_1(glval<_Complex float>) = VariableAddress[cf] : -# 117| r117_2(_Complex float) = Load : &:r117_1, ~m? +# 117| r117_2(_Complex float) = Load[cf] : &:r117_1, ~m? # 117| r117_3(_Imaginary double) = Convert : r117_2 # 117| r117_4(glval<_Imaginary double>) = VariableAddress[jd] : -# 117| mu117_5(_Imaginary double) = Store : &:r117_4, r117_3 +# 117| mu117_5(_Imaginary double) = Store[jd] : &:r117_4, r117_3 # 118| r118_1(glval<_Complex double>) = VariableAddress[cd] : -# 118| r118_2(_Complex double) = Load : &:r118_1, ~m? +# 118| r118_2(_Complex double) = Load[cd] : &:r118_1, ~m? # 118| r118_3(_Imaginary double) = Convert : r118_2 # 118| r118_4(glval<_Imaginary double>) = VariableAddress[jd] : -# 118| mu118_5(_Imaginary double) = Store : &:r118_4, r118_3 +# 118| mu118_5(_Imaginary double) = Store[jd] : &:r118_4, r118_3 # 119| r119_1(glval<_Complex long double>) = VariableAddress[cld] : -# 119| r119_2(_Complex long double) = Load : &:r119_1, ~m? +# 119| r119_2(_Complex long double) = Load[cld] : &:r119_1, ~m? # 119| r119_3(_Imaginary double) = Convert : r119_2 # 119| r119_4(glval<_Imaginary double>) = VariableAddress[jd] : -# 119| mu119_5(_Imaginary double) = Store : &:r119_4, r119_3 +# 119| mu119_5(_Imaginary double) = Store[jd] : &:r119_4, r119_3 # 120| r120_1(glval<_Complex float>) = VariableAddress[cf] : -# 120| r120_2(_Complex float) = Load : &:r120_1, ~m? +# 120| r120_2(_Complex float) = Load[cf] : &:r120_1, ~m? # 120| r120_3(_Imaginary long double) = Convert : r120_2 # 120| r120_4(glval<_Imaginary long double>) = VariableAddress[jld] : -# 120| mu120_5(_Imaginary long double) = Store : &:r120_4, r120_3 +# 120| mu120_5(_Imaginary long double) = Store[jld] : &:r120_4, r120_3 # 121| r121_1(glval<_Complex double>) = VariableAddress[cd] : -# 121| r121_2(_Complex double) = Load : &:r121_1, ~m? +# 121| r121_2(_Complex double) = Load[cd] : &:r121_1, ~m? # 121| r121_3(_Imaginary long double) = Convert : r121_2 # 121| r121_4(glval<_Imaginary long double>) = VariableAddress[jld] : -# 121| mu121_5(_Imaginary long double) = Store : &:r121_4, r121_3 +# 121| mu121_5(_Imaginary long double) = Store[jld] : &:r121_4, r121_3 # 122| r122_1(glval<_Complex long double>) = VariableAddress[cld] : -# 122| r122_2(_Complex long double) = Load : &:r122_1, ~m? +# 122| r122_2(_Complex long double) = Load[cld] : &:r122_1, ~m? # 122| r122_3(_Imaginary long double) = Convert : r122_2 # 122| r122_4(glval<_Imaginary long double>) = VariableAddress[jld] : -# 122| mu122_5(_Imaginary long double) = Store : &:r122_4, r122_3 +# 122| mu122_5(_Imaginary long double) = Store[jld] : &:r122_4, r122_3 # 125| r125_1(glval) = VariableAddress[f] : -# 125| r125_2(float) = Load : &:r125_1, ~m? +# 125| r125_2(float) = Load[f] : &:r125_1, ~m? # 125| r125_3(_Imaginary float) = Convert : r125_2 # 125| r125_4(glval<_Imaginary float>) = VariableAddress[jf] : -# 125| mu125_5(_Imaginary float) = Store : &:r125_4, r125_3 +# 125| mu125_5(_Imaginary float) = Store[jf] : &:r125_4, r125_3 # 126| r126_1(glval) = VariableAddress[d] : -# 126| r126_2(double) = Load : &:r126_1, ~m? +# 126| r126_2(double) = Load[d] : &:r126_1, ~m? # 126| r126_3(_Imaginary float) = Convert : r126_2 # 126| r126_4(glval<_Imaginary float>) = VariableAddress[jf] : -# 126| mu126_5(_Imaginary float) = Store : &:r126_4, r126_3 +# 126| mu126_5(_Imaginary float) = Store[jf] : &:r126_4, r126_3 # 127| r127_1(glval) = VariableAddress[ld] : -# 127| r127_2(long double) = Load : &:r127_1, ~m? +# 127| r127_2(long double) = Load[ld] : &:r127_1, ~m? # 127| r127_3(_Imaginary float) = Convert : r127_2 # 127| r127_4(glval<_Imaginary float>) = VariableAddress[jf] : -# 127| mu127_5(_Imaginary float) = Store : &:r127_4, r127_3 +# 127| mu127_5(_Imaginary float) = Store[jf] : &:r127_4, r127_3 # 128| r128_1(glval) = VariableAddress[f] : -# 128| r128_2(float) = Load : &:r128_1, ~m? +# 128| r128_2(float) = Load[f] : &:r128_1, ~m? # 128| r128_3(_Imaginary double) = Convert : r128_2 # 128| r128_4(glval<_Imaginary double>) = VariableAddress[jd] : -# 128| mu128_5(_Imaginary double) = Store : &:r128_4, r128_3 +# 128| mu128_5(_Imaginary double) = Store[jd] : &:r128_4, r128_3 # 129| r129_1(glval) = VariableAddress[d] : -# 129| r129_2(double) = Load : &:r129_1, ~m? +# 129| r129_2(double) = Load[d] : &:r129_1, ~m? # 129| r129_3(_Imaginary double) = Convert : r129_2 # 129| r129_4(glval<_Imaginary double>) = VariableAddress[jd] : -# 129| mu129_5(_Imaginary double) = Store : &:r129_4, r129_3 +# 129| mu129_5(_Imaginary double) = Store[jd] : &:r129_4, r129_3 # 130| r130_1(glval) = VariableAddress[ld] : -# 130| r130_2(long double) = Load : &:r130_1, ~m? +# 130| r130_2(long double) = Load[ld] : &:r130_1, ~m? # 130| r130_3(_Imaginary double) = Convert : r130_2 # 130| r130_4(glval<_Imaginary double>) = VariableAddress[jd] : -# 130| mu130_5(_Imaginary double) = Store : &:r130_4, r130_3 +# 130| mu130_5(_Imaginary double) = Store[jd] : &:r130_4, r130_3 # 131| r131_1(glval) = VariableAddress[f] : -# 131| r131_2(float) = Load : &:r131_1, ~m? +# 131| r131_2(float) = Load[f] : &:r131_1, ~m? # 131| r131_3(_Imaginary long double) = Convert : r131_2 # 131| r131_4(glval<_Imaginary long double>) = VariableAddress[jld] : -# 131| mu131_5(_Imaginary long double) = Store : &:r131_4, r131_3 +# 131| mu131_5(_Imaginary long double) = Store[jld] : &:r131_4, r131_3 # 132| r132_1(glval) = VariableAddress[d] : -# 132| r132_2(double) = Load : &:r132_1, ~m? +# 132| r132_2(double) = Load[d] : &:r132_1, ~m? # 132| r132_3(_Imaginary long double) = Convert : r132_2 # 132| r132_4(glval<_Imaginary long double>) = VariableAddress[jld] : -# 132| mu132_5(_Imaginary long double) = Store : &:r132_4, r132_3 +# 132| mu132_5(_Imaginary long double) = Store[jld] : &:r132_4, r132_3 # 133| r133_1(glval) = VariableAddress[ld] : -# 133| r133_2(long double) = Load : &:r133_1, ~m? +# 133| r133_2(long double) = Load[ld] : &:r133_1, ~m? # 133| r133_3(_Imaginary long double) = Convert : r133_2 # 133| r133_4(glval<_Imaginary long double>) = VariableAddress[jld] : -# 133| mu133_5(_Imaginary long double) = Store : &:r133_4, r133_3 +# 133| mu133_5(_Imaginary long double) = Store[jld] : &:r133_4, r133_3 # 136| r136_1(glval<_Imaginary float>) = VariableAddress[jf] : -# 136| r136_2(_Imaginary float) = Load : &:r136_1, ~m? +# 136| r136_2(_Imaginary float) = Load[jf] : &:r136_1, ~m? # 136| r136_3(float) = Convert : r136_2 # 136| r136_4(glval) = VariableAddress[f] : -# 136| mu136_5(float) = Store : &:r136_4, r136_3 +# 136| mu136_5(float) = Store[f] : &:r136_4, r136_3 # 137| r137_1(glval<_Imaginary double>) = VariableAddress[jd] : -# 137| r137_2(_Imaginary double) = Load : &:r137_1, ~m? +# 137| r137_2(_Imaginary double) = Load[jd] : &:r137_1, ~m? # 137| r137_3(float) = Convert : r137_2 # 137| r137_4(glval) = VariableAddress[f] : -# 137| mu137_5(float) = Store : &:r137_4, r137_3 +# 137| mu137_5(float) = Store[f] : &:r137_4, r137_3 # 138| r138_1(glval<_Imaginary long double>) = VariableAddress[jld] : -# 138| r138_2(_Imaginary long double) = Load : &:r138_1, ~m? +# 138| r138_2(_Imaginary long double) = Load[jld] : &:r138_1, ~m? # 138| r138_3(float) = Convert : r138_2 # 138| r138_4(glval) = VariableAddress[f] : -# 138| mu138_5(float) = Store : &:r138_4, r138_3 +# 138| mu138_5(float) = Store[f] : &:r138_4, r138_3 # 139| r139_1(glval<_Imaginary float>) = VariableAddress[jf] : -# 139| r139_2(_Imaginary float) = Load : &:r139_1, ~m? +# 139| r139_2(_Imaginary float) = Load[jf] : &:r139_1, ~m? # 139| r139_3(double) = Convert : r139_2 # 139| r139_4(glval) = VariableAddress[d] : -# 139| mu139_5(double) = Store : &:r139_4, r139_3 +# 139| mu139_5(double) = Store[d] : &:r139_4, r139_3 # 140| r140_1(glval<_Imaginary double>) = VariableAddress[jd] : -# 140| r140_2(_Imaginary double) = Load : &:r140_1, ~m? +# 140| r140_2(_Imaginary double) = Load[jd] : &:r140_1, ~m? # 140| r140_3(double) = Convert : r140_2 # 140| r140_4(glval) = VariableAddress[d] : -# 140| mu140_5(double) = Store : &:r140_4, r140_3 +# 140| mu140_5(double) = Store[d] : &:r140_4, r140_3 # 141| r141_1(glval<_Imaginary long double>) = VariableAddress[jld] : -# 141| r141_2(_Imaginary long double) = Load : &:r141_1, ~m? +# 141| r141_2(_Imaginary long double) = Load[jld] : &:r141_1, ~m? # 141| r141_3(double) = Convert : r141_2 # 141| r141_4(glval) = VariableAddress[d] : -# 141| mu141_5(double) = Store : &:r141_4, r141_3 +# 141| mu141_5(double) = Store[d] : &:r141_4, r141_3 # 142| r142_1(glval<_Imaginary float>) = VariableAddress[jf] : -# 142| r142_2(_Imaginary float) = Load : &:r142_1, ~m? +# 142| r142_2(_Imaginary float) = Load[jf] : &:r142_1, ~m? # 142| r142_3(long double) = Convert : r142_2 # 142| r142_4(glval) = VariableAddress[ld] : -# 142| mu142_5(long double) = Store : &:r142_4, r142_3 +# 142| mu142_5(long double) = Store[ld] : &:r142_4, r142_3 # 143| r143_1(glval<_Imaginary double>) = VariableAddress[jd] : -# 143| r143_2(_Imaginary double) = Load : &:r143_1, ~m? +# 143| r143_2(_Imaginary double) = Load[jd] : &:r143_1, ~m? # 143| r143_3(long double) = Convert : r143_2 # 143| r143_4(glval) = VariableAddress[ld] : -# 143| mu143_5(long double) = Store : &:r143_4, r143_3 +# 143| mu143_5(long double) = Store[ld] : &:r143_4, r143_3 # 144| r144_1(glval<_Imaginary long double>) = VariableAddress[jld] : -# 144| r144_2(_Imaginary long double) = Load : &:r144_1, ~m? +# 144| r144_2(_Imaginary long double) = Load[jld] : &:r144_1, ~m? # 144| r144_3(long double) = Convert : r144_2 # 144| r144_4(glval) = VariableAddress[ld] : -# 144| mu144_5(long double) = Store : &:r144_4, r144_3 +# 144| mu144_5(long double) = Store[ld] : &:r144_4, r144_3 # 145| v145_1(void) = NoOp : # 58| v58_4(void) = ReturnVoid : # 58| v58_5(void) = AliasedUse : ~m? @@ -697,88 +697,88 @@ ir.cpp: # 1| mu1_3(unknown) = InitializeNonLocal : # 2| r2_1(glval) = VariableAddress[c_i] : # 2| r2_2(char) = Constant[1] : -# 2| mu2_3(char) = Store : &:r2_1, r2_2 +# 2| mu2_3(char) = Store[c_i] : &:r2_1, r2_2 # 3| r3_1(glval) = VariableAddress[c_c] : # 3| r3_2(char) = Constant[65] : -# 3| mu3_3(char) = Store : &:r3_1, r3_2 +# 3| mu3_3(char) = Store[c_c] : &:r3_1, r3_2 # 5| r5_1(glval) = VariableAddress[sc_i] : # 5| r5_2(signed char) = Constant[-1] : -# 5| mu5_3(signed char) = Store : &:r5_1, r5_2 +# 5| mu5_3(signed char) = Store[sc_i] : &:r5_1, r5_2 # 6| r6_1(glval) = VariableAddress[sc_c] : # 6| r6_2(signed char) = Constant[65] : -# 6| mu6_3(signed char) = Store : &:r6_1, r6_2 +# 6| mu6_3(signed char) = Store[sc_c] : &:r6_1, r6_2 # 8| r8_1(glval) = VariableAddress[uc_i] : # 8| r8_2(unsigned char) = Constant[5] : -# 8| mu8_3(unsigned char) = Store : &:r8_1, r8_2 +# 8| mu8_3(unsigned char) = Store[uc_i] : &:r8_1, r8_2 # 9| r9_1(glval) = VariableAddress[uc_c] : # 9| r9_2(unsigned char) = Constant[65] : -# 9| mu9_3(unsigned char) = Store : &:r9_1, r9_2 +# 9| mu9_3(unsigned char) = Store[uc_c] : &:r9_1, r9_2 # 11| r11_1(glval) = VariableAddress[s] : # 11| r11_2(short) = Constant[5] : -# 11| mu11_3(short) = Store : &:r11_1, r11_2 +# 11| mu11_3(short) = Store[s] : &:r11_1, r11_2 # 12| r12_1(glval) = VariableAddress[us] : # 12| r12_2(unsigned short) = Constant[5] : -# 12| mu12_3(unsigned short) = Store : &:r12_1, r12_2 +# 12| mu12_3(unsigned short) = Store[us] : &:r12_1, r12_2 # 14| r14_1(glval) = VariableAddress[i] : # 14| r14_2(int) = Constant[5] : -# 14| mu14_3(int) = Store : &:r14_1, r14_2 +# 14| mu14_3(int) = Store[i] : &:r14_1, r14_2 # 15| r15_1(glval) = VariableAddress[ui] : # 15| r15_2(unsigned int) = Constant[5] : -# 15| mu15_3(unsigned int) = Store : &:r15_1, r15_2 +# 15| mu15_3(unsigned int) = Store[ui] : &:r15_1, r15_2 # 17| r17_1(glval) = VariableAddress[l] : # 17| r17_2(long) = Constant[5] : -# 17| mu17_3(long) = Store : &:r17_1, r17_2 +# 17| mu17_3(long) = Store[l] : &:r17_1, r17_2 # 18| r18_1(glval) = VariableAddress[ul] : # 18| r18_2(unsigned long) = Constant[5] : -# 18| mu18_3(unsigned long) = Store : &:r18_1, r18_2 +# 18| mu18_3(unsigned long) = Store[ul] : &:r18_1, r18_2 # 20| r20_1(glval) = VariableAddress[ll_i] : # 20| r20_2(long long) = Constant[5] : -# 20| mu20_3(long long) = Store : &:r20_1, r20_2 +# 20| mu20_3(long long) = Store[ll_i] : &:r20_1, r20_2 # 21| r21_1(glval) = VariableAddress[ll_ll] : # 21| r21_2(long long) = Constant[5] : -# 21| mu21_3(long long) = Store : &:r21_1, r21_2 +# 21| mu21_3(long long) = Store[ll_ll] : &:r21_1, r21_2 # 22| r22_1(glval) = VariableAddress[ull_i] : # 22| r22_2(unsigned long long) = Constant[5] : -# 22| mu22_3(unsigned long long) = Store : &:r22_1, r22_2 +# 22| mu22_3(unsigned long long) = Store[ull_i] : &:r22_1, r22_2 # 23| r23_1(glval) = VariableAddress[ull_ull] : # 23| r23_2(unsigned long long) = Constant[5] : -# 23| mu23_3(unsigned long long) = Store : &:r23_1, r23_2 +# 23| mu23_3(unsigned long long) = Store[ull_ull] : &:r23_1, r23_2 # 25| r25_1(glval) = VariableAddress[b_t] : # 25| r25_2(bool) = Constant[1] : -# 25| mu25_3(bool) = Store : &:r25_1, r25_2 +# 25| mu25_3(bool) = Store[b_t] : &:r25_1, r25_2 # 26| r26_1(glval) = VariableAddress[b_f] : # 26| r26_2(bool) = Constant[0] : -# 26| mu26_3(bool) = Store : &:r26_1, r26_2 +# 26| mu26_3(bool) = Store[b_f] : &:r26_1, r26_2 # 28| r28_1(glval) = VariableAddress[wc_i] : # 28| r28_2(wchar_t) = Constant[5] : -# 28| mu28_3(wchar_t) = Store : &:r28_1, r28_2 +# 28| mu28_3(wchar_t) = Store[wc_i] : &:r28_1, r28_2 # 29| r29_1(glval) = VariableAddress[wc_c] : # 29| r29_2(wchar_t) = Constant[65] : -# 29| mu29_3(wchar_t) = Store : &:r29_1, r29_2 +# 29| mu29_3(wchar_t) = Store[wc_c] : &:r29_1, r29_2 # 31| r31_1(glval) = VariableAddress[c16] : # 31| r31_2(char16_t) = Constant[65] : -# 31| mu31_3(char16_t) = Store : &:r31_1, r31_2 +# 31| mu31_3(char16_t) = Store[c16] : &:r31_1, r31_2 # 32| r32_1(glval) = VariableAddress[c32] : # 32| r32_2(char32_t) = Constant[65] : -# 32| mu32_3(char32_t) = Store : &:r32_1, r32_2 +# 32| mu32_3(char32_t) = Store[c32] : &:r32_1, r32_2 # 34| r34_1(glval) = VariableAddress[f_i] : # 34| r34_2(float) = Constant[1.0] : -# 34| mu34_3(float) = Store : &:r34_1, r34_2 +# 34| mu34_3(float) = Store[f_i] : &:r34_1, r34_2 # 35| r35_1(glval) = VariableAddress[f_f] : # 35| r35_2(float) = Constant[1.0] : -# 35| mu35_3(float) = Store : &:r35_1, r35_2 +# 35| mu35_3(float) = Store[f_f] : &:r35_1, r35_2 # 36| r36_1(glval) = VariableAddress[f_d] : # 36| r36_2(float) = Constant[1.0] : -# 36| mu36_3(float) = Store : &:r36_1, r36_2 +# 36| mu36_3(float) = Store[f_d] : &:r36_1, r36_2 # 38| r38_1(glval) = VariableAddress[d_i] : # 38| r38_2(double) = Constant[1.0] : -# 38| mu38_3(double) = Store : &:r38_1, r38_2 +# 38| mu38_3(double) = Store[d_i] : &:r38_1, r38_2 # 39| r39_1(glval) = VariableAddress[d_f] : # 39| r39_2(double) = Constant[1.0] : -# 39| mu39_3(double) = Store : &:r39_1, r39_2 +# 39| mu39_3(double) = Store[d_f] : &:r39_1, r39_2 # 40| r40_1(glval) = VariableAddress[d_d] : # 40| r40_2(double) = Constant[1.0] : -# 40| mu40_3(double) = Store : &:r40_1, r40_2 +# 40| mu40_3(double) = Store[d_d] : &:r40_1, r40_2 # 41| v41_1(void) = NoOp : # 1| v1_4(void) = ReturnVoid : # 1| v1_5(void) = AliasedUse : ~m? @@ -791,27 +791,27 @@ ir.cpp: # 43| mu43_3(unknown) = InitializeNonLocal : # 44| r44_1(glval) = VariableAddress[x] : # 44| r44_2(int) = Constant[17] : -# 44| mu44_3(int) = Store : &:r44_1, r44_2 +# 44| mu44_3(int) = Store[x] : &:r44_1, r44_2 # 45| r45_1(glval) = VariableAddress[y] : # 45| r45_2(short) = Constant[7] : -# 45| mu45_3(short) = Store : &:r45_1, r45_2 +# 45| mu45_3(short) = Store[y] : &:r45_1, r45_2 # 46| r46_1(glval) = VariableAddress[x] : -# 46| r46_2(int) = Load : &:r46_1, ~m? +# 46| r46_2(int) = Load[x] : &:r46_1, ~m? # 46| r46_3(glval) = VariableAddress[y] : -# 46| r46_4(short) = Load : &:r46_3, ~m? +# 46| r46_4(short) = Load[y] : &:r46_3, ~m? # 46| r46_5(int) = Convert : r46_4 # 46| r46_6(int) = Add : r46_2, r46_5 # 46| r46_7(short) = Convert : r46_6 # 46| r46_8(glval) = VariableAddress[y] : -# 46| mu46_9(short) = Store : &:r46_8, r46_7 +# 46| mu46_9(short) = Store[y] : &:r46_8, r46_7 # 47| r47_1(glval) = VariableAddress[x] : -# 47| r47_2(int) = Load : &:r47_1, ~m? +# 47| r47_2(int) = Load[x] : &:r47_1, ~m? # 47| r47_3(glval) = VariableAddress[y] : -# 47| r47_4(short) = Load : &:r47_3, ~m? +# 47| r47_4(short) = Load[y] : &:r47_3, ~m? # 47| r47_5(int) = Convert : r47_4 # 47| r47_6(int) = Mul : r47_2, r47_5 # 47| r47_7(glval) = VariableAddress[x] : -# 47| mu47_8(int) = Store : &:r47_7, r47_6 +# 47| mu47_8(int) = Store[x] : &:r47_7, r47_6 # 48| v48_1(void) = NoOp : # 43| v43_4(void) = ReturnVoid : # 43| v43_5(void) = AliasedUse : ~m? @@ -829,162 +829,162 @@ ir.cpp: # 51| r51_1(glval) = VariableAddress[z] : # 51| mu51_2(int) = Uninitialized[z] : &:r51_1 # 53| r53_1(glval) = VariableAddress[x] : -# 53| r53_2(int) = Load : &:r53_1, ~m? +# 53| r53_2(int) = Load[x] : &:r53_1, ~m? # 53| r53_3(glval) = VariableAddress[y] : -# 53| r53_4(int) = Load : &:r53_3, ~m? +# 53| r53_4(int) = Load[y] : &:r53_3, ~m? # 53| r53_5(int) = Add : r53_2, r53_4 # 53| r53_6(glval) = VariableAddress[z] : -# 53| mu53_7(int) = Store : &:r53_6, r53_5 +# 53| mu53_7(int) = Store[z] : &:r53_6, r53_5 # 54| r54_1(glval) = VariableAddress[x] : -# 54| r54_2(int) = Load : &:r54_1, ~m? +# 54| r54_2(int) = Load[x] : &:r54_1, ~m? # 54| r54_3(glval) = VariableAddress[y] : -# 54| r54_4(int) = Load : &:r54_3, ~m? +# 54| r54_4(int) = Load[y] : &:r54_3, ~m? # 54| r54_5(int) = Sub : r54_2, r54_4 # 54| r54_6(glval) = VariableAddress[z] : -# 54| mu54_7(int) = Store : &:r54_6, r54_5 +# 54| mu54_7(int) = Store[z] : &:r54_6, r54_5 # 55| r55_1(glval) = VariableAddress[x] : -# 55| r55_2(int) = Load : &:r55_1, ~m? +# 55| r55_2(int) = Load[x] : &:r55_1, ~m? # 55| r55_3(glval) = VariableAddress[y] : -# 55| r55_4(int) = Load : &:r55_3, ~m? +# 55| r55_4(int) = Load[y] : &:r55_3, ~m? # 55| r55_5(int) = Mul : r55_2, r55_4 # 55| r55_6(glval) = VariableAddress[z] : -# 55| mu55_7(int) = Store : &:r55_6, r55_5 +# 55| mu55_7(int) = Store[z] : &:r55_6, r55_5 # 56| r56_1(glval) = VariableAddress[x] : -# 56| r56_2(int) = Load : &:r56_1, ~m? +# 56| r56_2(int) = Load[x] : &:r56_1, ~m? # 56| r56_3(glval) = VariableAddress[y] : -# 56| r56_4(int) = Load : &:r56_3, ~m? +# 56| r56_4(int) = Load[y] : &:r56_3, ~m? # 56| r56_5(int) = Div : r56_2, r56_4 # 56| r56_6(glval) = VariableAddress[z] : -# 56| mu56_7(int) = Store : &:r56_6, r56_5 +# 56| mu56_7(int) = Store[z] : &:r56_6, r56_5 # 57| r57_1(glval) = VariableAddress[x] : -# 57| r57_2(int) = Load : &:r57_1, ~m? +# 57| r57_2(int) = Load[x] : &:r57_1, ~m? # 57| r57_3(glval) = VariableAddress[y] : -# 57| r57_4(int) = Load : &:r57_3, ~m? +# 57| r57_4(int) = Load[y] : &:r57_3, ~m? # 57| r57_5(int) = Rem : r57_2, r57_4 # 57| r57_6(glval) = VariableAddress[z] : -# 57| mu57_7(int) = Store : &:r57_6, r57_5 +# 57| mu57_7(int) = Store[z] : &:r57_6, r57_5 # 59| r59_1(glval) = VariableAddress[x] : -# 59| r59_2(int) = Load : &:r59_1, ~m? +# 59| r59_2(int) = Load[x] : &:r59_1, ~m? # 59| r59_3(glval) = VariableAddress[y] : -# 59| r59_4(int) = Load : &:r59_3, ~m? +# 59| r59_4(int) = Load[y] : &:r59_3, ~m? # 59| r59_5(int) = BitAnd : r59_2, r59_4 # 59| r59_6(glval) = VariableAddress[z] : -# 59| mu59_7(int) = Store : &:r59_6, r59_5 +# 59| mu59_7(int) = Store[z] : &:r59_6, r59_5 # 60| r60_1(glval) = VariableAddress[x] : -# 60| r60_2(int) = Load : &:r60_1, ~m? +# 60| r60_2(int) = Load[x] : &:r60_1, ~m? # 60| r60_3(glval) = VariableAddress[y] : -# 60| r60_4(int) = Load : &:r60_3, ~m? +# 60| r60_4(int) = Load[y] : &:r60_3, ~m? # 60| r60_5(int) = BitOr : r60_2, r60_4 # 60| r60_6(glval) = VariableAddress[z] : -# 60| mu60_7(int) = Store : &:r60_6, r60_5 +# 60| mu60_7(int) = Store[z] : &:r60_6, r60_5 # 61| r61_1(glval) = VariableAddress[x] : -# 61| r61_2(int) = Load : &:r61_1, ~m? +# 61| r61_2(int) = Load[x] : &:r61_1, ~m? # 61| r61_3(glval) = VariableAddress[y] : -# 61| r61_4(int) = Load : &:r61_3, ~m? +# 61| r61_4(int) = Load[y] : &:r61_3, ~m? # 61| r61_5(int) = BitXor : r61_2, r61_4 # 61| r61_6(glval) = VariableAddress[z] : -# 61| mu61_7(int) = Store : &:r61_6, r61_5 +# 61| mu61_7(int) = Store[z] : &:r61_6, r61_5 # 63| r63_1(glval) = VariableAddress[x] : -# 63| r63_2(int) = Load : &:r63_1, ~m? +# 63| r63_2(int) = Load[x] : &:r63_1, ~m? # 63| r63_3(glval) = VariableAddress[y] : -# 63| r63_4(int) = Load : &:r63_3, ~m? +# 63| r63_4(int) = Load[y] : &:r63_3, ~m? # 63| r63_5(int) = ShiftLeft : r63_2, r63_4 # 63| r63_6(glval) = VariableAddress[z] : -# 63| mu63_7(int) = Store : &:r63_6, r63_5 +# 63| mu63_7(int) = Store[z] : &:r63_6, r63_5 # 64| r64_1(glval) = VariableAddress[x] : -# 64| r64_2(int) = Load : &:r64_1, ~m? +# 64| r64_2(int) = Load[x] : &:r64_1, ~m? # 64| r64_3(glval) = VariableAddress[y] : -# 64| r64_4(int) = Load : &:r64_3, ~m? +# 64| r64_4(int) = Load[y] : &:r64_3, ~m? # 64| r64_5(int) = ShiftRight : r64_2, r64_4 # 64| r64_6(glval) = VariableAddress[z] : -# 64| mu64_7(int) = Store : &:r64_6, r64_5 +# 64| mu64_7(int) = Store[z] : &:r64_6, r64_5 # 66| r66_1(glval) = VariableAddress[x] : -# 66| r66_2(int) = Load : &:r66_1, ~m? +# 66| r66_2(int) = Load[x] : &:r66_1, ~m? # 66| r66_3(glval) = VariableAddress[z] : -# 66| mu66_4(int) = Store : &:r66_3, r66_2 +# 66| mu66_4(int) = Store[z] : &:r66_3, r66_2 # 68| r68_1(glval) = VariableAddress[x] : -# 68| r68_2(int) = Load : &:r68_1, ~m? +# 68| r68_2(int) = Load[x] : &:r68_1, ~m? # 68| r68_3(glval) = VariableAddress[z] : -# 68| r68_4(int) = Load : &:r68_3, ~m? +# 68| r68_4(int) = Load[z] : &:r68_3, ~m? # 68| r68_5(int) = Add : r68_4, r68_2 -# 68| mu68_6(int) = Store : &:r68_3, r68_5 +# 68| mu68_6(int) = Store[z] : &:r68_3, r68_5 # 69| r69_1(glval) = VariableAddress[x] : -# 69| r69_2(int) = Load : &:r69_1, ~m? +# 69| r69_2(int) = Load[x] : &:r69_1, ~m? # 69| r69_3(glval) = VariableAddress[z] : -# 69| r69_4(int) = Load : &:r69_3, ~m? +# 69| r69_4(int) = Load[z] : &:r69_3, ~m? # 69| r69_5(int) = Sub : r69_4, r69_2 -# 69| mu69_6(int) = Store : &:r69_3, r69_5 +# 69| mu69_6(int) = Store[z] : &:r69_3, r69_5 # 70| r70_1(glval) = VariableAddress[x] : -# 70| r70_2(int) = Load : &:r70_1, ~m? +# 70| r70_2(int) = Load[x] : &:r70_1, ~m? # 70| r70_3(glval) = VariableAddress[z] : -# 70| r70_4(int) = Load : &:r70_3, ~m? +# 70| r70_4(int) = Load[z] : &:r70_3, ~m? # 70| r70_5(int) = Mul : r70_4, r70_2 -# 70| mu70_6(int) = Store : &:r70_3, r70_5 +# 70| mu70_6(int) = Store[z] : &:r70_3, r70_5 # 71| r71_1(glval) = VariableAddress[x] : -# 71| r71_2(int) = Load : &:r71_1, ~m? +# 71| r71_2(int) = Load[x] : &:r71_1, ~m? # 71| r71_3(glval) = VariableAddress[z] : -# 71| r71_4(int) = Load : &:r71_3, ~m? +# 71| r71_4(int) = Load[z] : &:r71_3, ~m? # 71| r71_5(int) = Div : r71_4, r71_2 -# 71| mu71_6(int) = Store : &:r71_3, r71_5 +# 71| mu71_6(int) = Store[z] : &:r71_3, r71_5 # 72| r72_1(glval) = VariableAddress[x] : -# 72| r72_2(int) = Load : &:r72_1, ~m? +# 72| r72_2(int) = Load[x] : &:r72_1, ~m? # 72| r72_3(glval) = VariableAddress[z] : -# 72| r72_4(int) = Load : &:r72_3, ~m? +# 72| r72_4(int) = Load[z] : &:r72_3, ~m? # 72| r72_5(int) = Rem : r72_4, r72_2 -# 72| mu72_6(int) = Store : &:r72_3, r72_5 +# 72| mu72_6(int) = Store[z] : &:r72_3, r72_5 # 74| r74_1(glval) = VariableAddress[x] : -# 74| r74_2(int) = Load : &:r74_1, ~m? +# 74| r74_2(int) = Load[x] : &:r74_1, ~m? # 74| r74_3(glval) = VariableAddress[z] : -# 74| r74_4(int) = Load : &:r74_3, ~m? +# 74| r74_4(int) = Load[z] : &:r74_3, ~m? # 74| r74_5(int) = BitAnd : r74_4, r74_2 -# 74| mu74_6(int) = Store : &:r74_3, r74_5 +# 74| mu74_6(int) = Store[z] : &:r74_3, r74_5 # 75| r75_1(glval) = VariableAddress[x] : -# 75| r75_2(int) = Load : &:r75_1, ~m? +# 75| r75_2(int) = Load[x] : &:r75_1, ~m? # 75| r75_3(glval) = VariableAddress[z] : -# 75| r75_4(int) = Load : &:r75_3, ~m? +# 75| r75_4(int) = Load[z] : &:r75_3, ~m? # 75| r75_5(int) = BitOr : r75_4, r75_2 -# 75| mu75_6(int) = Store : &:r75_3, r75_5 +# 75| mu75_6(int) = Store[z] : &:r75_3, r75_5 # 76| r76_1(glval) = VariableAddress[x] : -# 76| r76_2(int) = Load : &:r76_1, ~m? +# 76| r76_2(int) = Load[x] : &:r76_1, ~m? # 76| r76_3(glval) = VariableAddress[z] : -# 76| r76_4(int) = Load : &:r76_3, ~m? +# 76| r76_4(int) = Load[z] : &:r76_3, ~m? # 76| r76_5(int) = BitXor : r76_4, r76_2 -# 76| mu76_6(int) = Store : &:r76_3, r76_5 +# 76| mu76_6(int) = Store[z] : &:r76_3, r76_5 # 78| r78_1(glval) = VariableAddress[x] : -# 78| r78_2(int) = Load : &:r78_1, ~m? +# 78| r78_2(int) = Load[x] : &:r78_1, ~m? # 78| r78_3(glval) = VariableAddress[z] : -# 78| r78_4(int) = Load : &:r78_3, ~m? +# 78| r78_4(int) = Load[z] : &:r78_3, ~m? # 78| r78_5(int) = ShiftLeft : r78_4, r78_2 -# 78| mu78_6(int) = Store : &:r78_3, r78_5 +# 78| mu78_6(int) = Store[z] : &:r78_3, r78_5 # 79| r79_1(glval) = VariableAddress[x] : -# 79| r79_2(int) = Load : &:r79_1, ~m? +# 79| r79_2(int) = Load[x] : &:r79_1, ~m? # 79| r79_3(glval) = VariableAddress[z] : -# 79| r79_4(int) = Load : &:r79_3, ~m? +# 79| r79_4(int) = Load[z] : &:r79_3, ~m? # 79| r79_5(int) = ShiftRight : r79_4, r79_2 -# 79| mu79_6(int) = Store : &:r79_3, r79_5 +# 79| mu79_6(int) = Store[z] : &:r79_3, r79_5 # 81| r81_1(glval) = VariableAddress[x] : -# 81| r81_2(int) = Load : &:r81_1, ~m? +# 81| r81_2(int) = Load[x] : &:r81_1, ~m? # 81| r81_3(int) = CopyValue : r81_2 # 81| r81_4(glval) = VariableAddress[z] : -# 81| mu81_5(int) = Store : &:r81_4, r81_3 +# 81| mu81_5(int) = Store[z] : &:r81_4, r81_3 # 82| r82_1(glval) = VariableAddress[x] : -# 82| r82_2(int) = Load : &:r82_1, ~m? +# 82| r82_2(int) = Load[x] : &:r82_1, ~m? # 82| r82_3(int) = Negate : r82_2 # 82| r82_4(glval) = VariableAddress[z] : -# 82| mu82_5(int) = Store : &:r82_4, r82_3 +# 82| mu82_5(int) = Store[z] : &:r82_4, r82_3 # 83| r83_1(glval) = VariableAddress[x] : -# 83| r83_2(int) = Load : &:r83_1, ~m? +# 83| r83_2(int) = Load[x] : &:r83_1, ~m? # 83| r83_3(int) = BitComplement : r83_2 # 83| r83_4(glval) = VariableAddress[z] : -# 83| mu83_5(int) = Store : &:r83_4, r83_3 +# 83| mu83_5(int) = Store[z] : &:r83_4, r83_3 # 84| r84_1(glval) = VariableAddress[x] : -# 84| r84_2(int) = Load : &:r84_1, ~m? +# 84| r84_2(int) = Load[x] : &:r84_1, ~m? # 84| r84_3(int) = Constant[0] : # 84| r84_4(bool) = CompareNE : r84_2, r84_3 # 84| r84_5(bool) = LogicalNot : r84_4 # 84| r84_6(int) = Convert : r84_5 # 84| r84_7(glval) = VariableAddress[z] : -# 84| mu84_8(int) = Store : &:r84_7, r84_6 +# 84| mu84_8(int) = Store[z] : &:r84_7, r84_6 # 85| v85_1(void) = NoOp : # 50| v50_8(void) = ReturnVoid : # 50| v50_9(void) = AliasedUse : ~m? @@ -1002,47 +1002,47 @@ ir.cpp: # 88| r88_1(glval) = VariableAddress[b] : # 88| mu88_2(bool) = Uninitialized[b] : &:r88_1 # 90| r90_1(glval) = VariableAddress[x] : -# 90| r90_2(int) = Load : &:r90_1, ~m? +# 90| r90_2(int) = Load[x] : &:r90_1, ~m? # 90| r90_3(glval) = VariableAddress[y] : -# 90| r90_4(int) = Load : &:r90_3, ~m? +# 90| r90_4(int) = Load[y] : &:r90_3, ~m? # 90| r90_5(bool) = CompareEQ : r90_2, r90_4 # 90| r90_6(glval) = VariableAddress[b] : -# 90| mu90_7(bool) = Store : &:r90_6, r90_5 +# 90| mu90_7(bool) = Store[b] : &:r90_6, r90_5 # 91| r91_1(glval) = VariableAddress[x] : -# 91| r91_2(int) = Load : &:r91_1, ~m? +# 91| r91_2(int) = Load[x] : &:r91_1, ~m? # 91| r91_3(glval) = VariableAddress[y] : -# 91| r91_4(int) = Load : &:r91_3, ~m? +# 91| r91_4(int) = Load[y] : &:r91_3, ~m? # 91| r91_5(bool) = CompareNE : r91_2, r91_4 # 91| r91_6(glval) = VariableAddress[b] : -# 91| mu91_7(bool) = Store : &:r91_6, r91_5 +# 91| mu91_7(bool) = Store[b] : &:r91_6, r91_5 # 92| r92_1(glval) = VariableAddress[x] : -# 92| r92_2(int) = Load : &:r92_1, ~m? +# 92| r92_2(int) = Load[x] : &:r92_1, ~m? # 92| r92_3(glval) = VariableAddress[y] : -# 92| r92_4(int) = Load : &:r92_3, ~m? +# 92| r92_4(int) = Load[y] : &:r92_3, ~m? # 92| r92_5(bool) = CompareLT : r92_2, r92_4 # 92| r92_6(glval) = VariableAddress[b] : -# 92| mu92_7(bool) = Store : &:r92_6, r92_5 +# 92| mu92_7(bool) = Store[b] : &:r92_6, r92_5 # 93| r93_1(glval) = VariableAddress[x] : -# 93| r93_2(int) = Load : &:r93_1, ~m? +# 93| r93_2(int) = Load[x] : &:r93_1, ~m? # 93| r93_3(glval) = VariableAddress[y] : -# 93| r93_4(int) = Load : &:r93_3, ~m? +# 93| r93_4(int) = Load[y] : &:r93_3, ~m? # 93| r93_5(bool) = CompareGT : r93_2, r93_4 # 93| r93_6(glval) = VariableAddress[b] : -# 93| mu93_7(bool) = Store : &:r93_6, r93_5 +# 93| mu93_7(bool) = Store[b] : &:r93_6, r93_5 # 94| r94_1(glval) = VariableAddress[x] : -# 94| r94_2(int) = Load : &:r94_1, ~m? +# 94| r94_2(int) = Load[x] : &:r94_1, ~m? # 94| r94_3(glval) = VariableAddress[y] : -# 94| r94_4(int) = Load : &:r94_3, ~m? +# 94| r94_4(int) = Load[y] : &:r94_3, ~m? # 94| r94_5(bool) = CompareLE : r94_2, r94_4 # 94| r94_6(glval) = VariableAddress[b] : -# 94| mu94_7(bool) = Store : &:r94_6, r94_5 +# 94| mu94_7(bool) = Store[b] : &:r94_6, r94_5 # 95| r95_1(glval) = VariableAddress[x] : -# 95| r95_2(int) = Load : &:r95_1, ~m? +# 95| r95_2(int) = Load[x] : &:r95_1, ~m? # 95| r95_3(glval) = VariableAddress[y] : -# 95| r95_4(int) = Load : &:r95_3, ~m? +# 95| r95_4(int) = Load[y] : &:r95_3, ~m? # 95| r95_5(bool) = CompareGE : r95_2, r95_4 # 95| r95_6(glval) = VariableAddress[b] : -# 95| mu95_7(bool) = Store : &:r95_6, r95_5 +# 95| mu95_7(bool) = Store[b] : &:r95_6, r95_5 # 96| v96_1(void) = NoOp : # 87| v87_8(void) = ReturnVoid : # 87| v87_9(void) = AliasedUse : ~m? @@ -1058,35 +1058,35 @@ ir.cpp: # 99| r99_1(glval) = VariableAddress[y] : # 99| mu99_2(int) = Uninitialized[y] : &:r99_1 # 101| r101_1(glval) = VariableAddress[x] : -# 101| r101_2(int) = Load : &:r101_1, ~m? +# 101| r101_2(int) = Load[x] : &:r101_1, ~m? # 101| r101_3(int) = Constant[1] : # 101| r101_4(int) = Add : r101_2, r101_3 -# 101| mu101_5(int) = Store : &:r101_1, r101_4 +# 101| mu101_5(int) = Store[x] : &:r101_1, r101_4 # 101| r101_6(glval) = VariableAddress[y] : -# 101| mu101_7(int) = Store : &:r101_6, r101_4 +# 101| mu101_7(int) = Store[y] : &:r101_6, r101_4 # 102| r102_1(glval) = VariableAddress[x] : -# 102| r102_2(int) = Load : &:r102_1, ~m? +# 102| r102_2(int) = Load[x] : &:r102_1, ~m? # 102| r102_3(int) = Constant[1] : # 102| r102_4(int) = Sub : r102_2, r102_3 -# 102| mu102_5(int) = Store : &:r102_1, r102_4 +# 102| mu102_5(int) = Store[x] : &:r102_1, r102_4 # 102| r102_6(glval) = VariableAddress[y] : -# 102| mu102_7(int) = Store : &:r102_6, r102_4 +# 102| mu102_7(int) = Store[y] : &:r102_6, r102_4 # 103| r103_1(glval) = VariableAddress[x] : -# 103| r103_2(int) = Load : &:r103_1, ~m? +# 103| r103_2(int) = Load[x] : &:r103_1, ~m? # 103| r103_3(int) = Constant[1] : # 103| r103_4(int) = Add : r103_2, r103_3 -# 103| mu103_5(int) = Store : &:r103_1, r103_4 +# 103| mu103_5(int) = Store[x] : &:r103_1, r103_4 # 103| r103_6(int) = CopyValue : r103_2 # 103| r103_7(glval) = VariableAddress[y] : -# 103| mu103_8(int) = Store : &:r103_7, r103_6 +# 103| mu103_8(int) = Store[y] : &:r103_7, r103_6 # 104| r104_1(glval) = VariableAddress[x] : -# 104| r104_2(int) = Load : &:r104_1, ~m? +# 104| r104_2(int) = Load[x] : &:r104_1, ~m? # 104| r104_3(int) = Constant[1] : # 104| r104_4(int) = Sub : r104_2, r104_3 -# 104| mu104_5(int) = Store : &:r104_1, r104_4 +# 104| mu104_5(int) = Store[x] : &:r104_1, r104_4 # 104| r104_6(int) = CopyValue : r104_2 # 104| r104_7(glval) = VariableAddress[y] : -# 104| mu104_8(int) = Store : &:r104_7, r104_6 +# 104| mu104_8(int) = Store[y] : &:r104_7, r104_6 # 105| v105_1(void) = NoOp : # 98| v98_6(void) = ReturnVoid : # 98| v98_7(void) = AliasedUse : ~m? @@ -1102,23 +1102,23 @@ ir.cpp: # 108| r108_1(glval) = VariableAddress[p] : # 108| mu108_2(int *) = Uninitialized[p] : &:r108_1 # 110| r110_1(glval) = VariableAddress[x] : -# 110| r110_2(int) = Load : &:r110_1, ~m? +# 110| r110_2(int) = Load[x] : &:r110_1, ~m? # 110| r110_3(int) = Constant[1] : # 110| r110_4(int) = Add : r110_2, r110_3 -# 110| mu110_5(int) = Store : &:r110_1, r110_4 +# 110| mu110_5(int) = Store[x] : &:r110_1, r110_4 # 110| r110_6(glval) = CopyValue : r110_1 # 110| r110_7(int *) = CopyValue : r110_6 # 110| r110_8(glval) = VariableAddress[p] : -# 110| mu110_9(int *) = Store : &:r110_8, r110_7 +# 110| mu110_9(int *) = Store[p] : &:r110_8, r110_7 # 111| r111_1(glval) = VariableAddress[x] : -# 111| r111_2(int) = Load : &:r111_1, ~m? +# 111| r111_2(int) = Load[x] : &:r111_1, ~m? # 111| r111_3(int) = Constant[1] : # 111| r111_4(int) = Sub : r111_2, r111_3 -# 111| mu111_5(int) = Store : &:r111_1, r111_4 +# 111| mu111_5(int) = Store[x] : &:r111_1, r111_4 # 111| r111_6(glval) = CopyValue : r111_1 # 111| r111_7(int *) = CopyValue : r111_6 # 111| r111_8(glval) = VariableAddress[p] : -# 111| mu111_9(int *) = Store : &:r111_8, r111_7 +# 111| mu111_9(int *) = Store[p] : &:r111_8, r111_7 # 112| v112_1(void) = NoOp : # 107| v107_6(void) = ReturnVoid : # 107| v107_7(void) = AliasedUse : ~m? @@ -1136,71 +1136,71 @@ ir.cpp: # 115| r115_1(glval) = VariableAddress[z] : # 115| mu115_2(double) = Uninitialized[z] : &:r115_1 # 117| r117_1(glval) = VariableAddress[x] : -# 117| r117_2(double) = Load : &:r117_1, ~m? +# 117| r117_2(double) = Load[x] : &:r117_1, ~m? # 117| r117_3(glval) = VariableAddress[y] : -# 117| r117_4(double) = Load : &:r117_3, ~m? +# 117| r117_4(double) = Load[y] : &:r117_3, ~m? # 117| r117_5(double) = Add : r117_2, r117_4 # 117| r117_6(glval) = VariableAddress[z] : -# 117| mu117_7(double) = Store : &:r117_6, r117_5 +# 117| mu117_7(double) = Store[z] : &:r117_6, r117_5 # 118| r118_1(glval) = VariableAddress[x] : -# 118| r118_2(double) = Load : &:r118_1, ~m? +# 118| r118_2(double) = Load[x] : &:r118_1, ~m? # 118| r118_3(glval) = VariableAddress[y] : -# 118| r118_4(double) = Load : &:r118_3, ~m? +# 118| r118_4(double) = Load[y] : &:r118_3, ~m? # 118| r118_5(double) = Sub : r118_2, r118_4 # 118| r118_6(glval) = VariableAddress[z] : -# 118| mu118_7(double) = Store : &:r118_6, r118_5 +# 118| mu118_7(double) = Store[z] : &:r118_6, r118_5 # 119| r119_1(glval) = VariableAddress[x] : -# 119| r119_2(double) = Load : &:r119_1, ~m? +# 119| r119_2(double) = Load[x] : &:r119_1, ~m? # 119| r119_3(glval) = VariableAddress[y] : -# 119| r119_4(double) = Load : &:r119_3, ~m? +# 119| r119_4(double) = Load[y] : &:r119_3, ~m? # 119| r119_5(double) = Mul : r119_2, r119_4 # 119| r119_6(glval) = VariableAddress[z] : -# 119| mu119_7(double) = Store : &:r119_6, r119_5 +# 119| mu119_7(double) = Store[z] : &:r119_6, r119_5 # 120| r120_1(glval) = VariableAddress[x] : -# 120| r120_2(double) = Load : &:r120_1, ~m? +# 120| r120_2(double) = Load[x] : &:r120_1, ~m? # 120| r120_3(glval) = VariableAddress[y] : -# 120| r120_4(double) = Load : &:r120_3, ~m? +# 120| r120_4(double) = Load[y] : &:r120_3, ~m? # 120| r120_5(double) = Div : r120_2, r120_4 # 120| r120_6(glval) = VariableAddress[z] : -# 120| mu120_7(double) = Store : &:r120_6, r120_5 +# 120| mu120_7(double) = Store[z] : &:r120_6, r120_5 # 122| r122_1(glval) = VariableAddress[x] : -# 122| r122_2(double) = Load : &:r122_1, ~m? +# 122| r122_2(double) = Load[x] : &:r122_1, ~m? # 122| r122_3(glval) = VariableAddress[z] : -# 122| mu122_4(double) = Store : &:r122_3, r122_2 +# 122| mu122_4(double) = Store[z] : &:r122_3, r122_2 # 124| r124_1(glval) = VariableAddress[x] : -# 124| r124_2(double) = Load : &:r124_1, ~m? +# 124| r124_2(double) = Load[x] : &:r124_1, ~m? # 124| r124_3(glval) = VariableAddress[z] : -# 124| r124_4(double) = Load : &:r124_3, ~m? +# 124| r124_4(double) = Load[z] : &:r124_3, ~m? # 124| r124_5(double) = Add : r124_4, r124_2 -# 124| mu124_6(double) = Store : &:r124_3, r124_5 +# 124| mu124_6(double) = Store[z] : &:r124_3, r124_5 # 125| r125_1(glval) = VariableAddress[x] : -# 125| r125_2(double) = Load : &:r125_1, ~m? +# 125| r125_2(double) = Load[x] : &:r125_1, ~m? # 125| r125_3(glval) = VariableAddress[z] : -# 125| r125_4(double) = Load : &:r125_3, ~m? +# 125| r125_4(double) = Load[z] : &:r125_3, ~m? # 125| r125_5(double) = Sub : r125_4, r125_2 -# 125| mu125_6(double) = Store : &:r125_3, r125_5 +# 125| mu125_6(double) = Store[z] : &:r125_3, r125_5 # 126| r126_1(glval) = VariableAddress[x] : -# 126| r126_2(double) = Load : &:r126_1, ~m? +# 126| r126_2(double) = Load[x] : &:r126_1, ~m? # 126| r126_3(glval) = VariableAddress[z] : -# 126| r126_4(double) = Load : &:r126_3, ~m? +# 126| r126_4(double) = Load[z] : &:r126_3, ~m? # 126| r126_5(double) = Mul : r126_4, r126_2 -# 126| mu126_6(double) = Store : &:r126_3, r126_5 +# 126| mu126_6(double) = Store[z] : &:r126_3, r126_5 # 127| r127_1(glval) = VariableAddress[x] : -# 127| r127_2(double) = Load : &:r127_1, ~m? +# 127| r127_2(double) = Load[x] : &:r127_1, ~m? # 127| r127_3(glval) = VariableAddress[z] : -# 127| r127_4(double) = Load : &:r127_3, ~m? +# 127| r127_4(double) = Load[z] : &:r127_3, ~m? # 127| r127_5(double) = Div : r127_4, r127_2 -# 127| mu127_6(double) = Store : &:r127_3, r127_5 +# 127| mu127_6(double) = Store[z] : &:r127_3, r127_5 # 129| r129_1(glval) = VariableAddress[x] : -# 129| r129_2(double) = Load : &:r129_1, ~m? +# 129| r129_2(double) = Load[x] : &:r129_1, ~m? # 129| r129_3(double) = CopyValue : r129_2 # 129| r129_4(glval) = VariableAddress[z] : -# 129| mu129_5(double) = Store : &:r129_4, r129_3 +# 129| mu129_5(double) = Store[z] : &:r129_4, r129_3 # 130| r130_1(glval) = VariableAddress[x] : -# 130| r130_2(double) = Load : &:r130_1, ~m? +# 130| r130_2(double) = Load[x] : &:r130_1, ~m? # 130| r130_3(double) = Negate : r130_2 # 130| r130_4(glval) = VariableAddress[z] : -# 130| mu130_5(double) = Store : &:r130_4, r130_3 +# 130| mu130_5(double) = Store[z] : &:r130_4, r130_3 # 131| v131_1(void) = NoOp : # 114| v114_8(void) = ReturnVoid : # 114| v114_9(void) = AliasedUse : ~m? @@ -1218,47 +1218,47 @@ ir.cpp: # 134| r134_1(glval) = VariableAddress[b] : # 134| mu134_2(bool) = Uninitialized[b] : &:r134_1 # 136| r136_1(glval) = VariableAddress[x] : -# 136| r136_2(double) = Load : &:r136_1, ~m? +# 136| r136_2(double) = Load[x] : &:r136_1, ~m? # 136| r136_3(glval) = VariableAddress[y] : -# 136| r136_4(double) = Load : &:r136_3, ~m? +# 136| r136_4(double) = Load[y] : &:r136_3, ~m? # 136| r136_5(bool) = CompareEQ : r136_2, r136_4 # 136| r136_6(glval) = VariableAddress[b] : -# 136| mu136_7(bool) = Store : &:r136_6, r136_5 +# 136| mu136_7(bool) = Store[b] : &:r136_6, r136_5 # 137| r137_1(glval) = VariableAddress[x] : -# 137| r137_2(double) = Load : &:r137_1, ~m? +# 137| r137_2(double) = Load[x] : &:r137_1, ~m? # 137| r137_3(glval) = VariableAddress[y] : -# 137| r137_4(double) = Load : &:r137_3, ~m? +# 137| r137_4(double) = Load[y] : &:r137_3, ~m? # 137| r137_5(bool) = CompareNE : r137_2, r137_4 # 137| r137_6(glval) = VariableAddress[b] : -# 137| mu137_7(bool) = Store : &:r137_6, r137_5 +# 137| mu137_7(bool) = Store[b] : &:r137_6, r137_5 # 138| r138_1(glval) = VariableAddress[x] : -# 138| r138_2(double) = Load : &:r138_1, ~m? +# 138| r138_2(double) = Load[x] : &:r138_1, ~m? # 138| r138_3(glval) = VariableAddress[y] : -# 138| r138_4(double) = Load : &:r138_3, ~m? +# 138| r138_4(double) = Load[y] : &:r138_3, ~m? # 138| r138_5(bool) = CompareLT : r138_2, r138_4 # 138| r138_6(glval) = VariableAddress[b] : -# 138| mu138_7(bool) = Store : &:r138_6, r138_5 +# 138| mu138_7(bool) = Store[b] : &:r138_6, r138_5 # 139| r139_1(glval) = VariableAddress[x] : -# 139| r139_2(double) = Load : &:r139_1, ~m? +# 139| r139_2(double) = Load[x] : &:r139_1, ~m? # 139| r139_3(glval) = VariableAddress[y] : -# 139| r139_4(double) = Load : &:r139_3, ~m? +# 139| r139_4(double) = Load[y] : &:r139_3, ~m? # 139| r139_5(bool) = CompareGT : r139_2, r139_4 # 139| r139_6(glval) = VariableAddress[b] : -# 139| mu139_7(bool) = Store : &:r139_6, r139_5 +# 139| mu139_7(bool) = Store[b] : &:r139_6, r139_5 # 140| r140_1(glval) = VariableAddress[x] : -# 140| r140_2(double) = Load : &:r140_1, ~m? +# 140| r140_2(double) = Load[x] : &:r140_1, ~m? # 140| r140_3(glval) = VariableAddress[y] : -# 140| r140_4(double) = Load : &:r140_3, ~m? +# 140| r140_4(double) = Load[y] : &:r140_3, ~m? # 140| r140_5(bool) = CompareLE : r140_2, r140_4 # 140| r140_6(glval) = VariableAddress[b] : -# 140| mu140_7(bool) = Store : &:r140_6, r140_5 +# 140| mu140_7(bool) = Store[b] : &:r140_6, r140_5 # 141| r141_1(glval) = VariableAddress[x] : -# 141| r141_2(double) = Load : &:r141_1, ~m? +# 141| r141_2(double) = Load[x] : &:r141_1, ~m? # 141| r141_3(glval) = VariableAddress[y] : -# 141| r141_4(double) = Load : &:r141_3, ~m? +# 141| r141_4(double) = Load[y] : &:r141_3, ~m? # 141| r141_5(bool) = CompareGE : r141_2, r141_4 # 141| r141_6(glval) = VariableAddress[b] : -# 141| mu141_7(bool) = Store : &:r141_6, r141_5 +# 141| mu141_7(bool) = Store[b] : &:r141_6, r141_5 # 142| v142_1(void) = NoOp : # 133| v133_8(void) = ReturnVoid : # 133| v133_9(void) = AliasedUse : ~m? @@ -1274,35 +1274,35 @@ ir.cpp: # 145| r145_1(glval) = VariableAddress[y] : # 145| mu145_2(float) = Uninitialized[y] : &:r145_1 # 147| r147_1(glval) = VariableAddress[x] : -# 147| r147_2(float) = Load : &:r147_1, ~m? +# 147| r147_2(float) = Load[x] : &:r147_1, ~m? # 147| r147_3(float) = Constant[1.0] : # 147| r147_4(float) = Add : r147_2, r147_3 -# 147| mu147_5(float) = Store : &:r147_1, r147_4 +# 147| mu147_5(float) = Store[x] : &:r147_1, r147_4 # 147| r147_6(glval) = VariableAddress[y] : -# 147| mu147_7(float) = Store : &:r147_6, r147_4 +# 147| mu147_7(float) = Store[y] : &:r147_6, r147_4 # 148| r148_1(glval) = VariableAddress[x] : -# 148| r148_2(float) = Load : &:r148_1, ~m? +# 148| r148_2(float) = Load[x] : &:r148_1, ~m? # 148| r148_3(float) = Constant[1.0] : # 148| r148_4(float) = Sub : r148_2, r148_3 -# 148| mu148_5(float) = Store : &:r148_1, r148_4 +# 148| mu148_5(float) = Store[x] : &:r148_1, r148_4 # 148| r148_6(glval) = VariableAddress[y] : -# 148| mu148_7(float) = Store : &:r148_6, r148_4 +# 148| mu148_7(float) = Store[y] : &:r148_6, r148_4 # 149| r149_1(glval) = VariableAddress[x] : -# 149| r149_2(float) = Load : &:r149_1, ~m? +# 149| r149_2(float) = Load[x] : &:r149_1, ~m? # 149| r149_3(float) = Constant[1.0] : # 149| r149_4(float) = Add : r149_2, r149_3 -# 149| mu149_5(float) = Store : &:r149_1, r149_4 +# 149| mu149_5(float) = Store[x] : &:r149_1, r149_4 # 149| r149_6(float) = CopyValue : r149_2 # 149| r149_7(glval) = VariableAddress[y] : -# 149| mu149_8(float) = Store : &:r149_7, r149_6 +# 149| mu149_8(float) = Store[y] : &:r149_7, r149_6 # 150| r150_1(glval) = VariableAddress[x] : -# 150| r150_2(float) = Load : &:r150_1, ~m? +# 150| r150_2(float) = Load[x] : &:r150_1, ~m? # 150| r150_3(float) = Constant[1.0] : # 150| r150_4(float) = Sub : r150_2, r150_3 -# 150| mu150_5(float) = Store : &:r150_1, r150_4 +# 150| mu150_5(float) = Store[x] : &:r150_1, r150_4 # 150| r150_6(float) = CopyValue : r150_2 # 150| r150_7(glval) = VariableAddress[y] : -# 150| mu150_8(float) = Store : &:r150_7, r150_6 +# 150| mu150_8(float) = Store[y] : &:r150_7, r150_6 # 151| v151_1(void) = NoOp : # 144| v144_6(void) = ReturnVoid : # 144| v144_7(void) = AliasedUse : ~m? @@ -1315,7 +1315,7 @@ ir.cpp: # 153| mu153_3(unknown) = InitializeNonLocal : # 153| r153_4(glval) = VariableAddress[p] : # 153| mu153_5(int *) = InitializeParameter[p] : &:r153_4 -# 153| r153_6(int *) = Load : &:r153_4, ~m? +# 153| r153_6(int *) = Load[p] : &:r153_4, ~m? # 153| mu153_7(unknown) = InitializeIndirection[p] : &:r153_6 # 153| r153_8(glval) = VariableAddress[i] : # 153| mu153_9(int) = InitializeParameter[i] : &:r153_8 @@ -1324,63 +1324,63 @@ ir.cpp: # 155| r155_1(glval) = VariableAddress[b] : # 155| mu155_2(bool) = Uninitialized[b] : &:r155_1 # 157| r157_1(glval) = VariableAddress[p] : -# 157| r157_2(int *) = Load : &:r157_1, ~m? +# 157| r157_2(int *) = Load[p] : &:r157_1, ~m? # 157| r157_3(glval) = VariableAddress[i] : -# 157| r157_4(int) = Load : &:r157_3, ~m? +# 157| r157_4(int) = Load[i] : &:r157_3, ~m? # 157| r157_5(int *) = PointerAdd[4] : r157_2, r157_4 # 157| r157_6(glval) = VariableAddress[q] : -# 157| mu157_7(int *) = Store : &:r157_6, r157_5 +# 157| mu157_7(int *) = Store[q] : &:r157_6, r157_5 # 158| r158_1(glval) = VariableAddress[i] : -# 158| r158_2(int) = Load : &:r158_1, ~m? +# 158| r158_2(int) = Load[i] : &:r158_1, ~m? # 158| r158_3(glval) = VariableAddress[p] : -# 158| r158_4(int *) = Load : &:r158_3, ~m? +# 158| r158_4(int *) = Load[p] : &:r158_3, ~m? # 158| r158_5(int *) = PointerAdd[4] : r158_4, r158_2 # 158| r158_6(glval) = VariableAddress[q] : -# 158| mu158_7(int *) = Store : &:r158_6, r158_5 +# 158| mu158_7(int *) = Store[q] : &:r158_6, r158_5 # 159| r159_1(glval) = VariableAddress[p] : -# 159| r159_2(int *) = Load : &:r159_1, ~m? +# 159| r159_2(int *) = Load[p] : &:r159_1, ~m? # 159| r159_3(glval) = VariableAddress[i] : -# 159| r159_4(int) = Load : &:r159_3, ~m? +# 159| r159_4(int) = Load[i] : &:r159_3, ~m? # 159| r159_5(int *) = PointerSub[4] : r159_2, r159_4 # 159| r159_6(glval) = VariableAddress[q] : -# 159| mu159_7(int *) = Store : &:r159_6, r159_5 +# 159| mu159_7(int *) = Store[q] : &:r159_6, r159_5 # 160| r160_1(glval) = VariableAddress[p] : -# 160| r160_2(int *) = Load : &:r160_1, ~m? +# 160| r160_2(int *) = Load[p] : &:r160_1, ~m? # 160| r160_3(glval) = VariableAddress[q] : -# 160| r160_4(int *) = Load : &:r160_3, ~m? +# 160| r160_4(int *) = Load[q] : &:r160_3, ~m? # 160| r160_5(long) = PointerDiff[4] : r160_2, r160_4 # 160| r160_6(int) = Convert : r160_5 # 160| r160_7(glval) = VariableAddress[i] : -# 160| mu160_8(int) = Store : &:r160_7, r160_6 +# 160| mu160_8(int) = Store[i] : &:r160_7, r160_6 # 162| r162_1(glval) = VariableAddress[p] : -# 162| r162_2(int *) = Load : &:r162_1, ~m? +# 162| r162_2(int *) = Load[p] : &:r162_1, ~m? # 162| r162_3(glval) = VariableAddress[q] : -# 162| mu162_4(int *) = Store : &:r162_3, r162_2 +# 162| mu162_4(int *) = Store[q] : &:r162_3, r162_2 # 164| r164_1(glval) = VariableAddress[i] : -# 164| r164_2(int) = Load : &:r164_1, ~m? +# 164| r164_2(int) = Load[i] : &:r164_1, ~m? # 164| r164_3(glval) = VariableAddress[q] : -# 164| r164_4(int *) = Load : &:r164_3, ~m? +# 164| r164_4(int *) = Load[q] : &:r164_3, ~m? # 164| r164_5(int *) = PointerAdd[4] : r164_4, r164_2 -# 164| mu164_6(int *) = Store : &:r164_3, r164_5 +# 164| mu164_6(int *) = Store[q] : &:r164_3, r164_5 # 165| r165_1(glval) = VariableAddress[i] : -# 165| r165_2(int) = Load : &:r165_1, ~m? +# 165| r165_2(int) = Load[i] : &:r165_1, ~m? # 165| r165_3(glval) = VariableAddress[q] : -# 165| r165_4(int *) = Load : &:r165_3, ~m? +# 165| r165_4(int *) = Load[q] : &:r165_3, ~m? # 165| r165_5(int *) = PointerSub[4] : r165_4, r165_2 -# 165| mu165_6(int *) = Store : &:r165_3, r165_5 +# 165| mu165_6(int *) = Store[q] : &:r165_3, r165_5 # 167| r167_1(glval) = VariableAddress[p] : -# 167| r167_2(int *) = Load : &:r167_1, ~m? +# 167| r167_2(int *) = Load[p] : &:r167_1, ~m? # 167| r167_3(int *) = Constant[0] : # 167| r167_4(bool) = CompareNE : r167_2, r167_3 # 167| r167_5(glval) = VariableAddress[b] : -# 167| mu167_6(bool) = Store : &:r167_5, r167_4 +# 167| mu167_6(bool) = Store[b] : &:r167_5, r167_4 # 168| r168_1(glval) = VariableAddress[p] : -# 168| r168_2(int *) = Load : &:r168_1, ~m? +# 168| r168_2(int *) = Load[p] : &:r168_1, ~m? # 168| r168_3(int *) = Constant[0] : # 168| r168_4(bool) = CompareNE : r168_2, r168_3 # 168| r168_5(bool) = LogicalNot : r168_4 # 168| r168_6(glval) = VariableAddress[b] : -# 168| mu168_7(bool) = Store : &:r168_6, r168_5 +# 168| mu168_7(bool) = Store[b] : &:r168_6, r168_5 # 169| v169_1(void) = NoOp : # 153| v153_10(void) = ReturnIndirection[p] : &:r153_6, ~m? # 153| v153_11(void) = ReturnVoid : @@ -1394,78 +1394,78 @@ ir.cpp: # 171| mu171_3(unknown) = InitializeNonLocal : # 171| r171_4(glval) = VariableAddress[p] : # 171| mu171_5(int *) = InitializeParameter[p] : &:r171_4 -# 171| r171_6(int *) = Load : &:r171_4, ~m? +# 171| r171_6(int *) = Load[p] : &:r171_4, ~m? # 171| mu171_7(unknown) = InitializeIndirection[p] : &:r171_6 # 171| r171_8(glval) = VariableAddress[i] : # 171| mu171_9(int) = InitializeParameter[i] : &:r171_8 # 172| r172_1(glval) = VariableAddress[x] : # 172| mu172_2(int) = Uninitialized[x] : &:r172_1 # 174| r174_1(glval) = VariableAddress[p] : -# 174| r174_2(int *) = Load : &:r174_1, ~m? +# 174| r174_2(int *) = Load[p] : &:r174_1, ~m? # 174| r174_3(glval) = VariableAddress[i] : -# 174| r174_4(int) = Load : &:r174_3, ~m? +# 174| r174_4(int) = Load[i] : &:r174_3, ~m? # 174| r174_5(glval) = PointerAdd[4] : r174_2, r174_4 -# 174| r174_6(int) = Load : &:r174_5, ~m? +# 174| r174_6(int) = Load[?] : &:r174_5, ~m? # 174| r174_7(glval) = VariableAddress[x] : -# 174| mu174_8(int) = Store : &:r174_7, r174_6 +# 174| mu174_8(int) = Store[x] : &:r174_7, r174_6 # 175| r175_1(glval) = VariableAddress[p] : -# 175| r175_2(int *) = Load : &:r175_1, ~m? +# 175| r175_2(int *) = Load[p] : &:r175_1, ~m? # 175| r175_3(glval) = VariableAddress[i] : -# 175| r175_4(int) = Load : &:r175_3, ~m? +# 175| r175_4(int) = Load[i] : &:r175_3, ~m? # 175| r175_5(glval) = PointerAdd[4] : r175_2, r175_4 -# 175| r175_6(int) = Load : &:r175_5, ~m? +# 175| r175_6(int) = Load[?] : &:r175_5, ~m? # 175| r175_7(glval) = VariableAddress[x] : -# 175| mu175_8(int) = Store : &:r175_7, r175_6 +# 175| mu175_8(int) = Store[x] : &:r175_7, r175_6 # 177| r177_1(glval) = VariableAddress[x] : -# 177| r177_2(int) = Load : &:r177_1, ~m? +# 177| r177_2(int) = Load[x] : &:r177_1, ~m? # 177| r177_3(glval) = VariableAddress[p] : -# 177| r177_4(int *) = Load : &:r177_3, ~m? +# 177| r177_4(int *) = Load[p] : &:r177_3, ~m? # 177| r177_5(glval) = VariableAddress[i] : -# 177| r177_6(int) = Load : &:r177_5, ~m? +# 177| r177_6(int) = Load[i] : &:r177_5, ~m? # 177| r177_7(glval) = PointerAdd[4] : r177_4, r177_6 -# 177| mu177_8(int) = Store : &:r177_7, r177_2 +# 177| mu177_8(int) = Store[?] : &:r177_7, r177_2 # 178| r178_1(glval) = VariableAddress[x] : -# 178| r178_2(int) = Load : &:r178_1, ~m? +# 178| r178_2(int) = Load[x] : &:r178_1, ~m? # 178| r178_3(glval) = VariableAddress[p] : -# 178| r178_4(int *) = Load : &:r178_3, ~m? +# 178| r178_4(int *) = Load[p] : &:r178_3, ~m? # 178| r178_5(glval) = VariableAddress[i] : -# 178| r178_6(int) = Load : &:r178_5, ~m? +# 178| r178_6(int) = Load[i] : &:r178_5, ~m? # 178| r178_7(glval) = PointerAdd[4] : r178_4, r178_6 -# 178| mu178_8(int) = Store : &:r178_7, r178_2 +# 178| mu178_8(int) = Store[?] : &:r178_7, r178_2 # 180| r180_1(glval) = VariableAddress[a] : # 180| mu180_2(int[10]) = Uninitialized[a] : &:r180_1 # 181| r181_1(glval) = VariableAddress[a] : # 181| r181_2(int *) = Convert : r181_1 # 181| r181_3(glval) = VariableAddress[i] : -# 181| r181_4(int) = Load : &:r181_3, ~m? +# 181| r181_4(int) = Load[i] : &:r181_3, ~m? # 181| r181_5(glval) = PointerAdd[4] : r181_2, r181_4 -# 181| r181_6(int) = Load : &:r181_5, ~m? +# 181| r181_6(int) = Load[?] : &:r181_5, ~m? # 181| r181_7(glval) = VariableAddress[x] : -# 181| mu181_8(int) = Store : &:r181_7, r181_6 +# 181| mu181_8(int) = Store[x] : &:r181_7, r181_6 # 182| r182_1(glval) = VariableAddress[a] : # 182| r182_2(int *) = Convert : r182_1 # 182| r182_3(glval) = VariableAddress[i] : -# 182| r182_4(int) = Load : &:r182_3, ~m? +# 182| r182_4(int) = Load[i] : &:r182_3, ~m? # 182| r182_5(glval) = PointerAdd[4] : r182_2, r182_4 -# 182| r182_6(int) = Load : &:r182_5, ~m? +# 182| r182_6(int) = Load[?] : &:r182_5, ~m? # 182| r182_7(glval) = VariableAddress[x] : -# 182| mu182_8(int) = Store : &:r182_7, r182_6 +# 182| mu182_8(int) = Store[x] : &:r182_7, r182_6 # 183| r183_1(glval) = VariableAddress[x] : -# 183| r183_2(int) = Load : &:r183_1, ~m? +# 183| r183_2(int) = Load[x] : &:r183_1, ~m? # 183| r183_3(glval) = VariableAddress[a] : # 183| r183_4(int *) = Convert : r183_3 # 183| r183_5(glval) = VariableAddress[i] : -# 183| r183_6(int) = Load : &:r183_5, ~m? +# 183| r183_6(int) = Load[i] : &:r183_5, ~m? # 183| r183_7(glval) = PointerAdd[4] : r183_4, r183_6 -# 183| mu183_8(int) = Store : &:r183_7, r183_2 +# 183| mu183_8(int) = Store[?] : &:r183_7, r183_2 # 184| r184_1(glval) = VariableAddress[x] : -# 184| r184_2(int) = Load : &:r184_1, ~m? +# 184| r184_2(int) = Load[x] : &:r184_1, ~m? # 184| r184_3(glval) = VariableAddress[a] : # 184| r184_4(int *) = Convert : r184_3 # 184| r184_5(glval) = VariableAddress[i] : -# 184| r184_6(int) = Load : &:r184_5, ~m? +# 184| r184_6(int) = Load[i] : &:r184_5, ~m? # 184| r184_7(glval) = PointerAdd[4] : r184_4, r184_6 -# 184| mu184_8(int) = Store : &:r184_7, r184_2 +# 184| mu184_8(int) = Store[?] : &:r184_7, r184_2 # 185| v185_1(void) = NoOp : # 171| v171_10(void) = ReturnIndirection[p] : &:r171_6, ~m? # 171| v171_11(void) = ReturnVoid : @@ -1483,23 +1483,23 @@ ir.cpp: # 188| r188_2(glval) = StringConstant["Foo"] : # 188| r188_3(char *) = Convert : r188_2 # 188| r188_4(glval) = VariableAddress[i] : -# 188| r188_5(int) = Load : &:r188_4, ~m? +# 188| r188_5(int) = Load[i] : &:r188_4, ~m? # 188| r188_6(glval) = PointerAdd[1] : r188_3, r188_5 -# 188| r188_7(char) = Load : &:r188_6, ~m? -# 188| mu188_8(char) = Store : &:r188_1, r188_7 +# 188| r188_7(char) = Load[?] : &:r188_6, ~m? +# 188| mu188_8(char) = Store[c] : &:r188_1, r188_7 # 189| r189_1(glval) = VariableAddress[pwc] : # 189| r189_2(glval) = StringConstant[L"Bar"] : # 189| r189_3(wchar_t *) = Convert : r189_2 # 189| r189_4(wchar_t *) = Convert : r189_3 -# 189| mu189_5(wchar_t *) = Store : &:r189_1, r189_4 +# 189| mu189_5(wchar_t *) = Store[pwc] : &:r189_1, r189_4 # 190| r190_1(glval) = VariableAddress[wc] : # 190| r190_2(glval) = VariableAddress[pwc] : -# 190| r190_3(wchar_t *) = Load : &:r190_2, ~m? +# 190| r190_3(wchar_t *) = Load[pwc] : &:r190_2, ~m? # 190| r190_4(glval) = VariableAddress[i] : -# 190| r190_5(int) = Load : &:r190_4, ~m? +# 190| r190_5(int) = Load[i] : &:r190_4, ~m? # 190| r190_6(glval) = PointerAdd[4] : r190_3, r190_5 -# 190| r190_7(wchar_t) = Load : &:r190_6, ~m? -# 190| mu190_8(wchar_t) = Store : &:r190_1, r190_7 +# 190| r190_7(wchar_t) = Load[?] : &:r190_6, ~m? +# 190| mu190_8(wchar_t) = Store[wc] : &:r190_1, r190_7 # 191| v191_1(void) = NoOp : # 187| v187_6(void) = ReturnVoid : # 187| v187_7(void) = AliasedUse : ~m? @@ -1512,56 +1512,56 @@ ir.cpp: # 193| mu193_3(unknown) = InitializeNonLocal : # 193| r193_4(glval) = VariableAddress[p] : # 193| mu193_5(int *) = InitializeParameter[p] : &:r193_4 -# 193| r193_6(int *) = Load : &:r193_4, ~m? +# 193| r193_6(int *) = Load[p] : &:r193_4, ~m? # 193| mu193_7(unknown) = InitializeIndirection[p] : &:r193_6 # 193| r193_8(glval) = VariableAddress[q] : # 193| mu193_9(int *) = InitializeParameter[q] : &:r193_8 -# 193| r193_10(int *) = Load : &:r193_8, ~m? +# 193| r193_10(int *) = Load[q] : &:r193_8, ~m? # 193| mu193_11(unknown) = InitializeIndirection[q] : &:r193_10 # 194| r194_1(glval) = VariableAddress[b] : # 194| mu194_2(bool) = Uninitialized[b] : &:r194_1 # 196| r196_1(glval) = VariableAddress[p] : -# 196| r196_2(int *) = Load : &:r196_1, ~m? +# 196| r196_2(int *) = Load[p] : &:r196_1, ~m? # 196| r196_3(glval) = VariableAddress[q] : -# 196| r196_4(int *) = Load : &:r196_3, ~m? +# 196| r196_4(int *) = Load[q] : &:r196_3, ~m? # 196| r196_5(bool) = CompareEQ : r196_2, r196_4 # 196| r196_6(glval) = VariableAddress[b] : -# 196| mu196_7(bool) = Store : &:r196_6, r196_5 +# 196| mu196_7(bool) = Store[b] : &:r196_6, r196_5 # 197| r197_1(glval) = VariableAddress[p] : -# 197| r197_2(int *) = Load : &:r197_1, ~m? +# 197| r197_2(int *) = Load[p] : &:r197_1, ~m? # 197| r197_3(glval) = VariableAddress[q] : -# 197| r197_4(int *) = Load : &:r197_3, ~m? +# 197| r197_4(int *) = Load[q] : &:r197_3, ~m? # 197| r197_5(bool) = CompareNE : r197_2, r197_4 # 197| r197_6(glval) = VariableAddress[b] : -# 197| mu197_7(bool) = Store : &:r197_6, r197_5 +# 197| mu197_7(bool) = Store[b] : &:r197_6, r197_5 # 198| r198_1(glval) = VariableAddress[p] : -# 198| r198_2(int *) = Load : &:r198_1, ~m? +# 198| r198_2(int *) = Load[p] : &:r198_1, ~m? # 198| r198_3(glval) = VariableAddress[q] : -# 198| r198_4(int *) = Load : &:r198_3, ~m? +# 198| r198_4(int *) = Load[q] : &:r198_3, ~m? # 198| r198_5(bool) = CompareLT : r198_2, r198_4 # 198| r198_6(glval) = VariableAddress[b] : -# 198| mu198_7(bool) = Store : &:r198_6, r198_5 +# 198| mu198_7(bool) = Store[b] : &:r198_6, r198_5 # 199| r199_1(glval) = VariableAddress[p] : -# 199| r199_2(int *) = Load : &:r199_1, ~m? +# 199| r199_2(int *) = Load[p] : &:r199_1, ~m? # 199| r199_3(glval) = VariableAddress[q] : -# 199| r199_4(int *) = Load : &:r199_3, ~m? +# 199| r199_4(int *) = Load[q] : &:r199_3, ~m? # 199| r199_5(bool) = CompareGT : r199_2, r199_4 # 199| r199_6(glval) = VariableAddress[b] : -# 199| mu199_7(bool) = Store : &:r199_6, r199_5 +# 199| mu199_7(bool) = Store[b] : &:r199_6, r199_5 # 200| r200_1(glval) = VariableAddress[p] : -# 200| r200_2(int *) = Load : &:r200_1, ~m? +# 200| r200_2(int *) = Load[p] : &:r200_1, ~m? # 200| r200_3(glval) = VariableAddress[q] : -# 200| r200_4(int *) = Load : &:r200_3, ~m? +# 200| r200_4(int *) = Load[q] : &:r200_3, ~m? # 200| r200_5(bool) = CompareLE : r200_2, r200_4 # 200| r200_6(glval) = VariableAddress[b] : -# 200| mu200_7(bool) = Store : &:r200_6, r200_5 +# 200| mu200_7(bool) = Store[b] : &:r200_6, r200_5 # 201| r201_1(glval) = VariableAddress[p] : -# 201| r201_2(int *) = Load : &:r201_1, ~m? +# 201| r201_2(int *) = Load[p] : &:r201_1, ~m? # 201| r201_3(glval) = VariableAddress[q] : -# 201| r201_4(int *) = Load : &:r201_3, ~m? +# 201| r201_4(int *) = Load[q] : &:r201_3, ~m? # 201| r201_5(bool) = CompareGE : r201_2, r201_4 # 201| r201_6(glval) = VariableAddress[b] : -# 201| mu201_7(bool) = Store : &:r201_6, r201_5 +# 201| mu201_7(bool) = Store[b] : &:r201_6, r201_5 # 202| v202_1(void) = NoOp : # 193| v193_12(void) = ReturnIndirection[p] : &:r193_6, ~m? # 193| v193_13(void) = ReturnIndirection[q] : &:r193_10, ~m? @@ -1576,40 +1576,40 @@ ir.cpp: # 204| mu204_3(unknown) = InitializeNonLocal : # 204| r204_4(glval) = VariableAddress[p] : # 204| mu204_5(int *) = InitializeParameter[p] : &:r204_4 -# 204| r204_6(int *) = Load : &:r204_4, ~m? +# 204| r204_6(int *) = Load[p] : &:r204_4, ~m? # 204| mu204_7(unknown) = InitializeIndirection[p] : &:r204_6 # 205| r205_1(glval) = VariableAddress[q] : # 205| mu205_2(int *) = Uninitialized[q] : &:r205_1 # 207| r207_1(glval) = VariableAddress[p] : -# 207| r207_2(int *) = Load : &:r207_1, ~m? +# 207| r207_2(int *) = Load[p] : &:r207_1, ~m? # 207| r207_3(int) = Constant[1] : # 207| r207_4(int *) = PointerAdd[4] : r207_2, r207_3 -# 207| mu207_5(int *) = Store : &:r207_1, r207_4 +# 207| mu207_5(int *) = Store[p] : &:r207_1, r207_4 # 207| r207_6(glval) = VariableAddress[q] : -# 207| mu207_7(int *) = Store : &:r207_6, r207_4 +# 207| mu207_7(int *) = Store[q] : &:r207_6, r207_4 # 208| r208_1(glval) = VariableAddress[p] : -# 208| r208_2(int *) = Load : &:r208_1, ~m? +# 208| r208_2(int *) = Load[p] : &:r208_1, ~m? # 208| r208_3(int) = Constant[1] : # 208| r208_4(int *) = PointerSub[4] : r208_2, r208_3 -# 208| mu208_5(int *) = Store : &:r208_1, r208_4 +# 208| mu208_5(int *) = Store[p] : &:r208_1, r208_4 # 208| r208_6(glval) = VariableAddress[q] : -# 208| mu208_7(int *) = Store : &:r208_6, r208_4 +# 208| mu208_7(int *) = Store[q] : &:r208_6, r208_4 # 209| r209_1(glval) = VariableAddress[p] : -# 209| r209_2(int *) = Load : &:r209_1, ~m? +# 209| r209_2(int *) = Load[p] : &:r209_1, ~m? # 209| r209_3(int) = Constant[1] : # 209| r209_4(int *) = PointerAdd[4] : r209_2, r209_3 -# 209| mu209_5(int *) = Store : &:r209_1, r209_4 +# 209| mu209_5(int *) = Store[p] : &:r209_1, r209_4 # 209| r209_6(int *) = CopyValue : r209_2 # 209| r209_7(glval) = VariableAddress[q] : -# 209| mu209_8(int *) = Store : &:r209_7, r209_6 +# 209| mu209_8(int *) = Store[q] : &:r209_7, r209_6 # 210| r210_1(glval) = VariableAddress[p] : -# 210| r210_2(int *) = Load : &:r210_1, ~m? +# 210| r210_2(int *) = Load[p] : &:r210_1, ~m? # 210| r210_3(int) = Constant[1] : # 210| r210_4(int *) = PointerSub[4] : r210_2, r210_3 -# 210| mu210_5(int *) = Store : &:r210_1, r210_4 +# 210| mu210_5(int *) = Store[p] : &:r210_1, r210_4 # 210| r210_6(int *) = CopyValue : r210_2 # 210| r210_7(glval) = VariableAddress[q] : -# 210| mu210_8(int *) = Store : &:r210_7, r210_6 +# 210| mu210_8(int *) = Store[q] : &:r210_7, r210_6 # 211| v211_1(void) = NoOp : # 204| v204_8(void) = ReturnIndirection[p] : &:r204_6, ~m? # 204| v204_9(void) = ReturnVoid : @@ -1623,38 +1623,38 @@ ir.cpp: # 213| mu213_3(unknown) = InitializeNonLocal : # 215| r215_1(glval) = VariableAddress[x] : # 215| r215_2(int) = Constant[5] : -# 215| mu215_3(int) = Store : &:r215_1, r215_2 +# 215| mu215_3(int) = Store[x] : &:r215_1, r215_2 # 216| r216_1(int) = Constant[7] : # 216| r216_2(glval) = VariableAddress[x] : -# 216| r216_3(int) = Load : &:r216_2, ~m? +# 216| r216_3(int) = Load[x] : &:r216_2, ~m? # 216| r216_4(int) = Add : r216_3, r216_1 -# 216| mu216_5(int) = Store : &:r216_2, r216_4 +# 216| mu216_5(int) = Store[x] : &:r216_2, r216_4 # 219| r219_1(glval) = VariableAddress[y] : # 219| r219_2(short) = Constant[5] : -# 219| mu219_3(short) = Store : &:r219_1, r219_2 +# 219| mu219_3(short) = Store[y] : &:r219_1, r219_2 # 220| r220_1(glval) = VariableAddress[x] : -# 220| r220_2(int) = Load : &:r220_1, ~m? +# 220| r220_2(int) = Load[x] : &:r220_1, ~m? # 220| r220_3(glval) = VariableAddress[y] : -# 220| r220_4(short) = Load : &:r220_3, ~m? +# 220| r220_4(short) = Load[y] : &:r220_3, ~m? # 220| r220_5(int) = Convert : r220_4 # 220| r220_6(int) = Add : r220_5, r220_2 # 220| r220_7(short) = Convert : r220_6 -# 220| mu220_8(short) = Store : &:r220_3, r220_7 +# 220| mu220_8(short) = Store[y] : &:r220_3, r220_7 # 223| r223_1(int) = Constant[1] : # 223| r223_2(glval) = VariableAddress[y] : -# 223| r223_3(short) = Load : &:r223_2, ~m? +# 223| r223_3(short) = Load[y] : &:r223_2, ~m? # 223| r223_4(short) = ShiftLeft : r223_3, r223_1 -# 223| mu223_5(short) = Store : &:r223_2, r223_4 +# 223| mu223_5(short) = Store[y] : &:r223_2, r223_4 # 226| r226_1(glval) = VariableAddress[z] : # 226| r226_2(long) = Constant[7] : -# 226| mu226_3(long) = Store : &:r226_1, r226_2 +# 226| mu226_3(long) = Store[z] : &:r226_1, r226_2 # 227| r227_1(float) = Constant[2.0] : # 227| r227_2(glval) = VariableAddress[z] : -# 227| r227_3(long) = Load : &:r227_2, ~m? +# 227| r227_3(long) = Load[z] : &:r227_2, ~m? # 227| r227_4(float) = Convert : r227_3 # 227| r227_5(float) = Add : r227_4, r227_1 # 227| r227_6(long) = Convert : r227_5 -# 227| mu227_7(long) = Store : &:r227_2, r227_6 +# 227| mu227_7(long) = Store[z] : &:r227_2, r227_6 # 228| v228_1(void) = NoOp : # 213| v213_4(void) = ReturnVoid : # 213| v213_5(void) = AliasedUse : ~m? @@ -1669,8 +1669,8 @@ ir.cpp: # 231| mu231_2(int) = Uninitialized[x] : &:r231_1 # 232| r232_1(glval) = VariableAddress[y] : # 232| r232_2(glval) = VariableAddress[x] : -# 232| r232_3(int) = Load : &:r232_2, ~m? -# 232| mu232_4(int) = Store : &:r232_1, r232_3 +# 232| r232_3(int) = Load[x] : &:r232_2, ~m? +# 232| mu232_4(int) = Store[y] : &:r232_1, r232_3 # 233| v233_1(void) = NoOp : # 230| v230_4(void) = ReturnVoid : # 230| v230_5(void) = AliasedUse : ~m? @@ -1687,11 +1687,11 @@ ir.cpp: # 235| mu235_7(int) = InitializeParameter[y] : &:r235_6 # 236| r236_1(glval) = VariableAddress[#return] : # 236| r236_2(glval) = VariableAddress[x] : -# 236| r236_3(int) = Load : &:r236_2, ~m? +# 236| r236_3(int) = Load[x] : &:r236_2, ~m? # 236| r236_4(glval) = VariableAddress[y] : -# 236| r236_5(int) = Load : &:r236_4, ~m? +# 236| r236_5(int) = Load[y] : &:r236_4, ~m? # 236| r236_6(int) = Rem : r236_3, r236_5 -# 236| mu236_7(int) = Store : &:r236_1, r236_6 +# 236| mu236_7(int) = Store[#return] : &:r236_1, r236_6 # 235| r235_8(glval) = VariableAddress[#return] : # 235| v235_9(void) = ReturnValue : &:r235_8, ~m? # 235| v235_10(void) = AliasedUse : ~m? @@ -1709,28 +1709,28 @@ ir.cpp: # 239| r239_8(glval) = VariableAddress[y] : # 239| mu239_9(int) = InitializeParameter[y] : &:r239_8 # 240| r240_1(glval) = VariableAddress[b] : -# 240| r240_2(bool) = Load : &:r240_1, ~m? +# 240| r240_2(bool) = Load[b] : &:r240_1, ~m? # 240| v240_3(void) = ConditionalBranch : r240_2 #-----| False -> Block 1 #-----| True -> Block 7 # 243| Block 1 # 243| r243_1(glval) = VariableAddress[b] : -# 243| r243_2(bool) = Load : &:r243_1, ~m? +# 243| r243_2(bool) = Load[b] : &:r243_1, ~m? # 243| v243_3(void) = ConditionalBranch : r243_2 #-----| False -> Block 3 #-----| True -> Block 2 # 244| Block 2 # 244| r244_1(glval) = VariableAddress[y] : -# 244| r244_2(int) = Load : &:r244_1, ~m? +# 244| r244_2(int) = Load[y] : &:r244_1, ~m? # 244| r244_3(glval) = VariableAddress[x] : -# 244| mu244_4(int) = Store : &:r244_3, r244_2 +# 244| mu244_4(int) = Store[x] : &:r244_3, r244_2 #-----| Goto -> Block 3 # 247| Block 3 # 247| r247_1(glval) = VariableAddress[x] : -# 247| r247_2(int) = Load : &:r247_1, ~m? +# 247| r247_2(int) = Load[x] : &:r247_1, ~m? # 247| r247_3(int) = Constant[7] : # 247| r247_4(bool) = CompareLT : r247_2, r247_3 # 247| v247_5(void) = ConditionalBranch : r247_4 @@ -1740,13 +1740,13 @@ ir.cpp: # 248| Block 4 # 248| r248_1(int) = Constant[2] : # 248| r248_2(glval) = VariableAddress[x] : -# 248| mu248_3(int) = Store : &:r248_2, r248_1 +# 248| mu248_3(int) = Store[x] : &:r248_2, r248_1 #-----| Goto -> Block 6 # 250| Block 5 # 250| r250_1(int) = Constant[7] : # 250| r250_2(glval) = VariableAddress[x] : -# 250| mu250_3(int) = Store : &:r250_2, r250_1 +# 250| mu250_3(int) = Store[x] : &:r250_2, r250_1 #-----| Goto -> Block 6 # 251| Block 6 @@ -1771,9 +1771,9 @@ ir.cpp: # 255| Block 1 # 255| r255_1(int) = Constant[1] : # 255| r255_2(glval) = VariableAddress[n] : -# 255| r255_3(int) = Load : &:r255_2, ~m? +# 255| r255_3(int) = Load[n] : &:r255_2, ~m? # 255| r255_4(int) = Sub : r255_3, r255_1 -# 255| mu255_5(int) = Store : &:r255_2, r255_4 +# 255| mu255_5(int) = Store[n] : &:r255_2, r255_4 #-----| Goto (back edge) -> Block 3 # 257| Block 2 @@ -1784,7 +1784,7 @@ ir.cpp: # 254| Block 3 # 254| r254_1(glval) = VariableAddress[n] : -# 254| r254_2(int) = Load : &:r254_1, ~m? +# 254| r254_2(int) = Load[n] : &:r254_1, ~m? # 254| r254_3(int) = Constant[0] : # 254| r254_4(bool) = CompareGT : r254_2, r254_3 # 254| v254_5(void) = ConditionalBranch : r254_4 @@ -1803,11 +1803,11 @@ ir.cpp: # 261| Block 1 # 261| r261_1(int) = Constant[1] : # 261| r261_2(glval) = VariableAddress[n] : -# 261| r261_3(int) = Load : &:r261_2, ~m? +# 261| r261_3(int) = Load[n] : &:r261_2, ~m? # 261| r261_4(int) = Sub : r261_3, r261_1 -# 261| mu261_5(int) = Store : &:r261_2, r261_4 +# 261| mu261_5(int) = Store[n] : &:r261_2, r261_4 # 262| r262_1(glval) = VariableAddress[n] : -# 262| r262_2(int) = Load : &:r262_1, ~m? +# 262| r262_2(int) = Load[n] : &:r262_1, ~m? # 262| r262_3(int) = Constant[0] : # 262| r262_4(bool) = CompareGT : r262_2, r262_3 # 262| v262_5(void) = ConditionalBranch : r262_4 @@ -1845,7 +1845,7 @@ ir.cpp: # 272| mu272_3(unknown) = InitializeNonLocal : # 273| r273_1(glval) = VariableAddress[i] : # 273| r273_2(int) = Constant[0] : -# 273| mu273_3(int) = Store : &:r273_1, r273_2 +# 273| mu273_3(int) = Store[i] : &:r273_1, r273_2 #-----| Goto -> Block 2 # 272| Block 1 @@ -1864,12 +1864,12 @@ ir.cpp: # 278| mu278_3(unknown) = InitializeNonLocal : # 279| r279_1(glval) = VariableAddress[i] : # 279| r279_2(int) = Constant[0] : -# 279| mu279_3(int) = Store : &:r279_1, r279_2 +# 279| mu279_3(int) = Store[i] : &:r279_1, r279_2 #-----| Goto -> Block 1 # 280| Block 1 # 280| r280_1(glval) = VariableAddress[i] : -# 280| r280_2(int) = Load : &:r280_1, ~m? +# 280| r280_2(int) = Load[i] : &:r280_1, ~m? # 280| r280_3(int) = Constant[10] : # 280| r280_4(bool) = CompareLT : r280_2, r280_3 # 280| v280_5(void) = ConditionalBranch : r280_4 @@ -1893,7 +1893,7 @@ ir.cpp: # 285| mu285_3(unknown) = InitializeNonLocal : # 286| r286_1(glval) = VariableAddress[i] : # 286| r286_2(int) = Constant[0] : -# 286| mu286_3(int) = Store : &:r286_1, r286_2 +# 286| mu286_3(int) = Store[i] : &:r286_1, r286_2 #-----| Goto -> Block 2 # 285| Block 1 @@ -1905,9 +1905,9 @@ ir.cpp: # 288| v288_1(void) = NoOp : # 287| r287_1(int) = Constant[1] : # 287| r287_2(glval) = VariableAddress[i] : -# 287| r287_3(int) = Load : &:r287_2, ~m? +# 287| r287_3(int) = Load[i] : &:r287_2, ~m? # 287| r287_4(int) = Add : r287_3, r287_1 -# 287| mu287_5(int) = Store : &:r287_2, r287_4 +# 287| mu287_5(int) = Store[i] : &:r287_2, r287_4 #-----| Goto (back edge) -> Block 2 # 292| void For_InitCondition() @@ -1917,12 +1917,12 @@ ir.cpp: # 292| mu292_3(unknown) = InitializeNonLocal : # 293| r293_1(glval) = VariableAddress[i] : # 293| r293_2(int) = Constant[0] : -# 293| mu293_3(int) = Store : &:r293_1, r293_2 +# 293| mu293_3(int) = Store[i] : &:r293_1, r293_2 #-----| Goto -> Block 1 # 293| Block 1 # 293| r293_4(glval) = VariableAddress[i] : -# 293| r293_5(int) = Load : &:r293_4, ~m? +# 293| r293_5(int) = Load[i] : &:r293_4, ~m? # 293| r293_6(int) = Constant[10] : # 293| r293_7(bool) = CompareLT : r293_5, r293_6 # 293| v293_8(void) = ConditionalBranch : r293_7 @@ -1946,7 +1946,7 @@ ir.cpp: # 298| mu298_3(unknown) = InitializeNonLocal : # 299| r299_1(glval) = VariableAddress[i] : # 299| r299_2(int) = Constant[0] : -# 299| mu299_3(int) = Store : &:r299_1, r299_2 +# 299| mu299_3(int) = Store[i] : &:r299_1, r299_2 #-----| Goto -> Block 2 # 298| Block 1 @@ -1958,9 +1958,9 @@ ir.cpp: # 300| v300_1(void) = NoOp : # 299| r299_4(int) = Constant[1] : # 299| r299_5(glval) = VariableAddress[i] : -# 299| r299_6(int) = Load : &:r299_5, ~m? +# 299| r299_6(int) = Load[i] : &:r299_5, ~m? # 299| r299_7(int) = Add : r299_6, r299_4 -# 299| mu299_8(int) = Store : &:r299_5, r299_7 +# 299| mu299_8(int) = Store[i] : &:r299_5, r299_7 #-----| Goto (back edge) -> Block 2 # 304| void For_ConditionUpdate() @@ -1970,12 +1970,12 @@ ir.cpp: # 304| mu304_3(unknown) = InitializeNonLocal : # 305| r305_1(glval) = VariableAddress[i] : # 305| r305_2(int) = Constant[0] : -# 305| mu305_3(int) = Store : &:r305_1, r305_2 +# 305| mu305_3(int) = Store[i] : &:r305_1, r305_2 #-----| Goto -> Block 1 # 306| Block 1 # 306| r306_1(glval) = VariableAddress[i] : -# 306| r306_2(int) = Load : &:r306_1, ~m? +# 306| r306_2(int) = Load[i] : &:r306_1, ~m? # 306| r306_3(int) = Constant[10] : # 306| r306_4(bool) = CompareLT : r306_2, r306_3 # 306| v306_5(void) = ConditionalBranch : r306_4 @@ -1986,9 +1986,9 @@ ir.cpp: # 307| v307_1(void) = NoOp : # 306| r306_6(int) = Constant[1] : # 306| r306_7(glval) = VariableAddress[i] : -# 306| r306_8(int) = Load : &:r306_7, ~m? +# 306| r306_8(int) = Load[i] : &:r306_7, ~m? # 306| r306_9(int) = Add : r306_8, r306_6 -# 306| mu306_10(int) = Store : &:r306_7, r306_9 +# 306| mu306_10(int) = Store[i] : &:r306_7, r306_9 #-----| Goto (back edge) -> Block 1 # 309| Block 3 @@ -2004,12 +2004,12 @@ ir.cpp: # 311| mu311_3(unknown) = InitializeNonLocal : # 312| r312_1(glval) = VariableAddress[i] : # 312| r312_2(int) = Constant[0] : -# 312| mu312_3(int) = Store : &:r312_1, r312_2 +# 312| mu312_3(int) = Store[i] : &:r312_1, r312_2 #-----| Goto -> Block 1 # 312| Block 1 # 312| r312_4(glval) = VariableAddress[i] : -# 312| r312_5(int) = Load : &:r312_4, ~m? +# 312| r312_5(int) = Load[i] : &:r312_4, ~m? # 312| r312_6(int) = Constant[10] : # 312| r312_7(bool) = CompareLT : r312_5, r312_6 # 312| v312_8(void) = ConditionalBranch : r312_7 @@ -2020,9 +2020,9 @@ ir.cpp: # 313| v313_1(void) = NoOp : # 312| r312_9(int) = Constant[1] : # 312| r312_10(glval) = VariableAddress[i] : -# 312| r312_11(int) = Load : &:r312_10, ~m? +# 312| r312_11(int) = Load[i] : &:r312_10, ~m? # 312| r312_12(int) = Add : r312_11, r312_9 -# 312| mu312_13(int) = Store : &:r312_10, r312_12 +# 312| mu312_13(int) = Store[i] : &:r312_10, r312_12 #-----| Goto (back edge) -> Block 1 # 315| Block 3 @@ -2038,12 +2038,12 @@ ir.cpp: # 317| mu317_3(unknown) = InitializeNonLocal : # 318| r318_1(glval) = VariableAddress[i] : # 318| r318_2(int) = Constant[0] : -# 318| mu318_3(int) = Store : &:r318_1, r318_2 +# 318| mu318_3(int) = Store[i] : &:r318_1, r318_2 #-----| Goto -> Block 1 # 318| Block 1 # 318| r318_4(glval) = VariableAddress[i] : -# 318| r318_5(int) = Load : &:r318_4, ~m? +# 318| r318_5(int) = Load[i] : &:r318_4, ~m? # 318| r318_6(int) = Constant[10] : # 318| r318_7(bool) = CompareLT : r318_5, r318_6 # 318| v318_8(void) = ConditionalBranch : r318_7 @@ -2053,14 +2053,14 @@ ir.cpp: # 318| Block 2 # 318| r318_9(int) = Constant[1] : # 318| r318_10(glval) = VariableAddress[i] : -# 318| r318_11(int) = Load : &:r318_10, ~m? +# 318| r318_11(int) = Load[i] : &:r318_10, ~m? # 318| r318_12(int) = Add : r318_11, r318_9 -# 318| mu318_13(int) = Store : &:r318_10, r318_12 +# 318| mu318_13(int) = Store[i] : &:r318_10, r318_12 #-----| Goto (back edge) -> Block 1 # 319| Block 3 # 319| r319_1(glval) = VariableAddress[i] : -# 319| r319_2(int) = Load : &:r319_1, ~m? +# 319| r319_2(int) = Load[i] : &:r319_1, ~m? # 319| r319_3(int) = Constant[5] : # 319| r319_4(bool) = CompareEQ : r319_2, r319_3 # 319| v319_5(void) = ConditionalBranch : r319_4 @@ -2085,12 +2085,12 @@ ir.cpp: # 325| mu325_3(unknown) = InitializeNonLocal : # 326| r326_1(glval) = VariableAddress[i] : # 326| r326_2(int) = Constant[0] : -# 326| mu326_3(int) = Store : &:r326_1, r326_2 +# 326| mu326_3(int) = Store[i] : &:r326_1, r326_2 #-----| Goto -> Block 1 # 326| Block 1 # 326| r326_4(glval) = VariableAddress[i] : -# 326| r326_5(int) = Load : &:r326_4, ~m? +# 326| r326_5(int) = Load[i] : &:r326_4, ~m? # 326| r326_6(int) = Constant[10] : # 326| r326_7(bool) = CompareLT : r326_5, r326_6 # 326| v326_8(void) = ConditionalBranch : r326_7 @@ -2099,7 +2099,7 @@ ir.cpp: # 327| Block 2 # 327| r327_1(glval) = VariableAddress[i] : -# 327| r327_2(int) = Load : &:r327_1, ~m? +# 327| r327_2(int) = Load[i] : &:r327_1, ~m? # 327| r327_3(int) = Constant[5] : # 327| r327_4(bool) = CompareEQ : r327_2, r327_3 # 327| v327_5(void) = ConditionalBranch : r327_4 @@ -2114,9 +2114,9 @@ ir.cpp: # 326| v326_9(void) = NoOp : # 326| r326_10(int) = Constant[1] : # 326| r326_11(glval) = VariableAddress[i] : -# 326| r326_12(int) = Load : &:r326_11, ~m? +# 326| r326_12(int) = Load[i] : &:r326_11, ~m? # 326| r326_13(int) = Add : r326_12, r326_10 -# 326| mu326_14(int) = Store : &:r326_11, r326_13 +# 326| mu326_14(int) = Store[i] : &:r326_11, r326_13 #-----| Goto (back edge) -> Block 1 # 331| Block 5 @@ -2132,12 +2132,12 @@ ir.cpp: # 333| mu333_3(unknown) = InitializeNonLocal : # 334| r334_1(glval) = VariableAddress[i] : # 334| r334_2(int) = Constant[0] : -# 334| mu334_3(int) = Store : &:r334_1, r334_2 +# 334| mu334_3(int) = Store[i] : &:r334_1, r334_2 #-----| Goto -> Block 1 # 334| Block 1 # 334| r334_4(glval) = VariableAddress[i] : -# 334| r334_5(int) = Load : &:r334_4, ~m? +# 334| r334_5(int) = Load[i] : &:r334_4, ~m? # 334| r334_6(int) = Constant[10] : # 334| r334_7(bool) = CompareLT : r334_5, r334_6 # 334| v334_8(void) = ConditionalBranch : r334_7 @@ -2146,7 +2146,7 @@ ir.cpp: # 335| Block 2 # 335| r335_1(glval) = VariableAddress[i] : -# 335| r335_2(int) = Load : &:r335_1, ~m? +# 335| r335_2(int) = Load[i] : &:r335_1, ~m? # 335| r335_3(int) = Constant[5] : # 335| r335_4(bool) = CompareEQ : r335_2, r335_3 # 335| v335_5(void) = ConditionalBranch : r335_4 @@ -2174,18 +2174,18 @@ ir.cpp: # 341| mu341_3(unknown) = InitializeNonLocal : # 341| r341_4(glval) = VariableAddress[p] : # 341| mu341_5(int *) = InitializeParameter[p] : &:r341_4 -# 341| r341_6(int *) = Load : &:r341_4, ~m? +# 341| r341_6(int *) = Load[p] : &:r341_4, ~m? # 341| mu341_7(unknown) = InitializeIndirection[p] : &:r341_6 # 342| r342_1(int) = Constant[1] : # 342| r342_2(glval) = VariableAddress[p] : -# 342| r342_3(int *) = Load : &:r342_2, ~m? +# 342| r342_3(int *) = Load[p] : &:r342_2, ~m? # 342| r342_4(glval) = CopyValue : r342_3 -# 342| mu342_5(int) = Store : &:r342_4, r342_1 +# 342| mu342_5(int) = Store[?] : &:r342_4, r342_1 # 343| r343_1(glval) = VariableAddress[#return] : # 343| r343_2(glval) = VariableAddress[p] : -# 343| r343_3(int *) = Load : &:r343_2, ~m? -# 343| r343_4(int) = Load : &:r343_3, ~m? -# 343| mu343_5(int) = Store : &:r343_1, r343_4 +# 343| r343_3(int *) = Load[p] : &:r343_2, ~m? +# 343| r343_4(int) = Load[?] : &:r343_3, ~m? +# 343| mu343_5(int) = Store[#return] : &:r343_1, r343_4 # 341| v341_8(void) = ReturnIndirection[p] : &:r341_6, ~m? # 341| r341_9(glval) = VariableAddress[#return] : # 341| v341_10(void) = ReturnValue : &:r341_9, ~m? @@ -2200,7 +2200,7 @@ ir.cpp: # 349| r349_1(glval) = VariableAddress[#return] : # 349| r349_2(glval) = VariableAddress[g] : # 349| r349_3(int *) = CopyValue : r349_2 -# 349| mu349_4(int *) = Store : &:r349_1, r349_3 +# 349| mu349_4(int *) = Store[#return] : &:r349_1, r349_3 # 348| r348_4(glval) = VariableAddress[#return] : # 348| v348_5(void) = ReturnValue : &:r348_4, ~m? # 348| v348_6(void) = AliasedUse : ~m? @@ -2217,7 +2217,7 @@ ir.cpp: # 354| Block 1 # 354| r354_1(glval) = VariableAddress[n] : -# 354| r354_2(int) = Load : &:r354_1, ~m? +# 354| r354_2(int) = Load[n] : &:r354_1, ~m? # 354| r354_3(int) = Constant[1] : # 354| r354_4(bool) = CompareEQ : r354_2, r354_3 # 354| v354_5(void) = ConditionalBranch : r354_4 @@ -2231,9 +2231,9 @@ ir.cpp: # 356| Block 3 # 356| r356_1(int) = Constant[1] : # 356| r356_2(glval) = VariableAddress[n] : -# 356| r356_3(int) = Load : &:r356_2, ~m? +# 356| r356_3(int) = Load[n] : &:r356_2, ~m? # 356| r356_4(int) = Sub : r356_3, r356_1 -# 356| mu356_5(int) = Store : &:r356_2, r356_4 +# 356| mu356_5(int) = Store[n] : &:r356_2, r356_4 #-----| Goto (back edge) -> Block 5 # 357| Block 4 @@ -2245,7 +2245,7 @@ ir.cpp: # 353| Block 5 # 353| r353_1(glval) = VariableAddress[n] : -# 353| r353_2(int) = Load : &:r353_1, ~m? +# 353| r353_2(int) = Load[n] : &:r353_1, ~m? # 353| r353_3(int) = Constant[0] : # 353| r353_4(bool) = CompareGT : r353_2, r353_3 # 353| v353_5(void) = ConditionalBranch : r353_4 @@ -2263,7 +2263,7 @@ ir.cpp: # 362| Block 1 # 362| r362_1(glval) = VariableAddress[n] : -# 362| r362_2(int) = Load : &:r362_1, ~m? +# 362| r362_2(int) = Load[n] : &:r362_1, ~m? # 362| r362_3(int) = Constant[1] : # 362| r362_4(bool) = CompareEQ : r362_2, r362_3 # 362| v362_5(void) = ConditionalBranch : r362_4 @@ -2277,15 +2277,15 @@ ir.cpp: # 365| Block 3 # 365| r365_1(int) = Constant[1] : # 365| r365_2(glval) = VariableAddress[n] : -# 365| r365_3(int) = Load : &:r365_2, ~m? +# 365| r365_3(int) = Load[n] : &:r365_2, ~m? # 365| r365_4(int) = Sub : r365_3, r365_1 -# 365| mu365_5(int) = Store : &:r365_2, r365_4 +# 365| mu365_5(int) = Store[n] : &:r365_2, r365_4 #-----| Goto -> Block 4 # 361| Block 4 # 361| v361_1(void) = NoOp : # 366| r366_1(glval) = VariableAddress[n] : -# 366| r366_2(int) = Load : &:r366_1, ~m? +# 366| r366_2(int) = Load[n] : &:r366_1, ~m? # 366| r366_3(int) = Constant[0] : # 366| r366_4(bool) = CompareGT : r366_2, r366_3 # 366| v366_5(void) = ConditionalBranch : r366_4 @@ -2323,12 +2323,12 @@ ir.cpp: # 377| r377_1(glval) = VariableAddress[#return] : # 377| r377_2(glval) = FunctionAddress[Add] : # 377| r377_3(glval) = VariableAddress[x] : -# 377| r377_4(int) = Load : &:r377_3, ~m? +# 377| r377_4(int) = Load[x] : &:r377_3, ~m? # 377| r377_5(glval) = VariableAddress[y] : -# 377| r377_6(int) = Load : &:r377_5, ~m? +# 377| r377_6(int) = Load[y] : &:r377_5, ~m? # 377| r377_7(int) = Call[Add] : func:r377_2, 0:r377_4, 1:r377_6 # 377| mu377_8(unknown) = ^CallSideEffect : ~m? -# 377| mu377_9(int) = Store : &:r377_1, r377_7 +# 377| mu377_9(int) = Store[#return] : &:r377_1, r377_7 # 376| r376_8(glval) = VariableAddress[#return] : # 376| v376_9(void) = ReturnValue : &:r376_8, ~m? # 376| v376_10(void) = AliasedUse : ~m? @@ -2349,13 +2349,13 @@ ir.cpp: # 381| mu381_4(unknown) = ^CallSideEffect : ~m? # 381| r381_5(glval) = FunctionAddress[CallAdd] : # 381| r381_6(glval) = VariableAddress[x] : -# 381| r381_7(int) = Load : &:r381_6, ~m? +# 381| r381_7(int) = Load[x] : &:r381_6, ~m? # 381| r381_8(glval) = VariableAddress[y] : -# 381| r381_9(int) = Load : &:r381_8, ~m? +# 381| r381_9(int) = Load[y] : &:r381_8, ~m? # 381| r381_10(int) = Call[CallAdd] : func:r381_5, 0:r381_7, 1:r381_9 # 381| mu381_11(unknown) = ^CallSideEffect : ~m? # 381| r381_12(int) = CopyValue : r381_10 -# 381| mu381_13(int) = Store : &:r381_1, r381_12 +# 381| mu381_13(int) = Store[#return] : &:r381_1, r381_12 # 380| r380_8(glval) = VariableAddress[#return] : # 380| v380_9(void) = ReturnValue : &:r380_8, ~m? # 380| v380_10(void) = AliasedUse : ~m? @@ -2371,7 +2371,7 @@ ir.cpp: # 385| r385_1(glval) = VariableAddress[y] : # 385| mu385_2(int) = Uninitialized[y] : &:r385_1 # 386| r386_1(glval) = VariableAddress[x] : -# 386| r386_2(int) = Load : &:r386_1, ~m? +# 386| r386_2(int) = Load[x] : &:r386_1, ~m? # 386| v386_3(void) = Switch : r386_2 #-----| Case[-1] -> Block 2 #-----| Case[1] -> Block 3 @@ -2383,14 +2383,14 @@ ir.cpp: # 387| Block 1 # 387| r387_1(int) = Constant[1234] : # 387| r387_2(glval) = VariableAddress[y] : -# 387| mu387_3(int) = Store : &:r387_2, r387_1 +# 387| mu387_3(int) = Store[y] : &:r387_2, r387_1 #-----| Goto -> Block 2 # 389| Block 2 # 389| v389_1(void) = NoOp : # 390| r390_1(int) = Constant[-1] : # 390| r390_2(glval) = VariableAddress[y] : -# 390| mu390_3(int) = Store : &:r390_2, r390_1 +# 390| mu390_3(int) = Store[y] : &:r390_2, r390_1 # 391| v391_1(void) = NoOp : #-----| Goto -> Block 9 @@ -2402,7 +2402,7 @@ ir.cpp: # 394| v394_1(void) = NoOp : # 395| r395_1(int) = Constant[1] : # 395| r395_2(glval) = VariableAddress[y] : -# 395| mu395_3(int) = Store : &:r395_2, r395_1 +# 395| mu395_3(int) = Store[y] : &:r395_2, r395_1 # 396| v396_1(void) = NoOp : #-----| Goto -> Block 9 @@ -2410,14 +2410,14 @@ ir.cpp: # 398| v398_1(void) = NoOp : # 399| r399_1(int) = Constant[3] : # 399| r399_2(glval) = VariableAddress[y] : -# 399| mu399_3(int) = Store : &:r399_2, r399_1 +# 399| mu399_3(int) = Store[y] : &:r399_2, r399_1 #-----| Goto -> Block 6 # 400| Block 6 # 400| v400_1(void) = NoOp : # 401| r401_1(int) = Constant[4] : # 401| r401_2(glval) = VariableAddress[y] : -# 401| mu401_3(int) = Store : &:r401_2, r401_1 +# 401| mu401_3(int) = Store[y] : &:r401_2, r401_1 # 402| v402_1(void) = NoOp : #-----| Goto -> Block 9 @@ -2425,14 +2425,14 @@ ir.cpp: # 404| v404_1(void) = NoOp : # 405| r405_1(int) = Constant[0] : # 405| r405_2(glval) = VariableAddress[y] : -# 405| mu405_3(int) = Store : &:r405_2, r405_1 +# 405| mu405_3(int) = Store[y] : &:r405_2, r405_1 # 406| v406_1(void) = NoOp : #-----| Goto -> Block 9 # 408| Block 8 # 408| r408_1(int) = Constant[5678] : # 408| r408_2(glval) = VariableAddress[y] : -# 408| mu408_3(int) = Store : &:r408_2, r408_1 +# 408| mu408_3(int) = Store[y] : &:r408_2, r408_1 #-----| Goto -> Block 9 # 409| Block 9 @@ -2451,8 +2451,8 @@ ir.cpp: # 422| mu422_5(Point) = InitializeParameter[pt] : &:r422_4 # 423| r423_1(glval) = VariableAddress[#return] : # 423| r423_2(glval) = VariableAddress[pt] : -# 423| r423_3(Point) = Load : &:r423_2, ~m? -# 423| mu423_4(Point) = Store : &:r423_1, r423_3 +# 423| r423_3(Point) = Load[pt] : &:r423_2, ~m? +# 423| mu423_4(Point) = Store[#return] : &:r423_1, r423_3 # 422| r422_6(glval) = VariableAddress[#return] : # 422| v422_7(void) = ReturnValue : &:r422_6, ~m? # 422| v422_8(void) = AliasedUse : ~m? @@ -2468,18 +2468,18 @@ ir.cpp: # 428| r428_1(int) = Constant[5] : # 428| r428_2(glval) = VariableAddress[pt] : # 428| r428_3(glval) = FieldAddress[x] : r428_2 -# 428| mu428_4(int) = Store : &:r428_3, r428_1 +# 428| mu428_4(int) = Store[?] : &:r428_3, r428_1 # 429| r429_1(glval) = VariableAddress[pt] : # 429| r429_2(glval) = FieldAddress[x] : r429_1 -# 429| r429_3(int) = Load : &:r429_2, ~m? +# 429| r429_3(int) = Load[?] : &:r429_2, ~m? # 429| r429_4(glval) = VariableAddress[pt] : # 429| r429_5(glval) = FieldAddress[y] : r429_4 -# 429| mu429_6(int) = Store : &:r429_5, r429_3 +# 429| mu429_6(int) = Store[?] : &:r429_5, r429_3 # 430| r430_1(glval) = VariableAddress[p] : # 430| r430_2(glval) = VariableAddress[pt] : # 430| r430_3(glval) = FieldAddress[y] : r430_2 # 430| r430_4(int *) = CopyValue : r430_3 -# 430| mu430_5(int *) = Store : &:r430_1, r430_4 +# 430| mu430_5(int *) = Store[p] : &:r430_1, r430_4 # 431| v431_1(void) = NoOp : # 426| v426_4(void) = ReturnVoid : # 426| v426_5(void) = AliasedUse : ~m? @@ -2497,14 +2497,14 @@ ir.cpp: # 434| r434_1(glval) = VariableAddress[x] : # 434| mu434_2(int) = Uninitialized[x] : &:r434_1 # 435| r435_1(glval) = VariableAddress[a] : -# 435| r435_2(bool) = Load : &:r435_1, ~m? +# 435| r435_2(bool) = Load[a] : &:r435_1, ~m? # 435| v435_3(void) = ConditionalBranch : r435_2 #-----| False -> Block 1 #-----| True -> Block 2 # 435| Block 1 # 435| r435_4(glval) = VariableAddress[b] : -# 435| r435_5(bool) = Load : &:r435_4, ~m? +# 435| r435_5(bool) = Load[b] : &:r435_4, ~m? # 435| v435_6(void) = ConditionalBranch : r435_5 #-----| False -> Block 3 #-----| True -> Block 2 @@ -2512,19 +2512,19 @@ ir.cpp: # 436| Block 2 # 436| r436_1(int) = Constant[7] : # 436| r436_2(glval) = VariableAddress[x] : -# 436| mu436_3(int) = Store : &:r436_2, r436_1 +# 436| mu436_3(int) = Store[x] : &:r436_2, r436_1 #-----| Goto -> Block 3 # 439| Block 3 # 439| r439_1(glval) = VariableAddress[a] : -# 439| r439_2(bool) = Load : &:r439_1, ~m? +# 439| r439_2(bool) = Load[a] : &:r439_1, ~m? # 439| v439_3(void) = ConditionalBranch : r439_2 #-----| False -> Block 4 #-----| True -> Block 5 # 439| Block 4 # 439| r439_4(glval) = VariableAddress[b] : -# 439| r439_5(bool) = Load : &:r439_4, ~m? +# 439| r439_5(bool) = Load[b] : &:r439_4, ~m? # 439| v439_6(void) = ConditionalBranch : r439_5 #-----| False -> Block 6 #-----| True -> Block 5 @@ -2532,13 +2532,13 @@ ir.cpp: # 440| Block 5 # 440| r440_1(int) = Constant[1] : # 440| r440_2(glval) = VariableAddress[x] : -# 440| mu440_3(int) = Store : &:r440_2, r440_1 +# 440| mu440_3(int) = Store[x] : &:r440_2, r440_1 #-----| Goto -> Block 7 # 443| Block 6 # 443| r443_1(int) = Constant[5] : # 443| r443_2(glval) = VariableAddress[x] : -# 443| mu443_3(int) = Store : &:r443_2, r443_1 +# 443| mu443_3(int) = Store[x] : &:r443_2, r443_1 #-----| Goto -> Block 7 # 445| Block 7 @@ -2559,14 +2559,14 @@ ir.cpp: # 448| r448_1(glval) = VariableAddress[x] : # 448| mu448_2(int) = Uninitialized[x] : &:r448_1 # 449| r449_1(glval) = VariableAddress[a] : -# 449| r449_2(bool) = Load : &:r449_1, ~m? +# 449| r449_2(bool) = Load[a] : &:r449_1, ~m? # 449| v449_3(void) = ConditionalBranch : r449_2 #-----| False -> Block 3 #-----| True -> Block 1 # 449| Block 1 # 449| r449_4(glval) = VariableAddress[b] : -# 449| r449_5(bool) = Load : &:r449_4, ~m? +# 449| r449_5(bool) = Load[b] : &:r449_4, ~m? # 449| v449_6(void) = ConditionalBranch : r449_5 #-----| False -> Block 3 #-----| True -> Block 2 @@ -2574,19 +2574,19 @@ ir.cpp: # 450| Block 2 # 450| r450_1(int) = Constant[7] : # 450| r450_2(glval) = VariableAddress[x] : -# 450| mu450_3(int) = Store : &:r450_2, r450_1 +# 450| mu450_3(int) = Store[x] : &:r450_2, r450_1 #-----| Goto -> Block 3 # 453| Block 3 # 453| r453_1(glval) = VariableAddress[a] : -# 453| r453_2(bool) = Load : &:r453_1, ~m? +# 453| r453_2(bool) = Load[a] : &:r453_1, ~m? # 453| v453_3(void) = ConditionalBranch : r453_2 #-----| False -> Block 6 #-----| True -> Block 4 # 453| Block 4 # 453| r453_4(glval) = VariableAddress[b] : -# 453| r453_5(bool) = Load : &:r453_4, ~m? +# 453| r453_5(bool) = Load[b] : &:r453_4, ~m? # 453| v453_6(void) = ConditionalBranch : r453_5 #-----| False -> Block 6 #-----| True -> Block 5 @@ -2594,13 +2594,13 @@ ir.cpp: # 454| Block 5 # 454| r454_1(int) = Constant[1] : # 454| r454_2(glval) = VariableAddress[x] : -# 454| mu454_3(int) = Store : &:r454_2, r454_1 +# 454| mu454_3(int) = Store[x] : &:r454_2, r454_1 #-----| Goto -> Block 7 # 457| Block 6 # 457| r457_1(int) = Constant[5] : # 457| r457_2(glval) = VariableAddress[x] : -# 457| mu457_3(int) = Store : &:r457_2, r457_1 +# 457| mu457_3(int) = Store[x] : &:r457_2, r457_1 #-----| Goto -> Block 7 # 459| Block 7 @@ -2621,7 +2621,7 @@ ir.cpp: # 462| r462_1(glval) = VariableAddress[x] : # 462| mu462_2(int) = Uninitialized[x] : &:r462_1 # 463| r463_1(glval) = VariableAddress[a] : -# 463| r463_2(bool) = Load : &:r463_1, ~m? +# 463| r463_2(bool) = Load[a] : &:r463_1, ~m? # 463| v463_3(void) = ConditionalBranch : r463_2 #-----| False -> Block 1 #-----| True -> Block 2 @@ -2629,19 +2629,19 @@ ir.cpp: # 464| Block 1 # 464| r464_1(int) = Constant[1] : # 464| r464_2(glval) = VariableAddress[x] : -# 464| mu464_3(int) = Store : &:r464_2, r464_1 +# 464| mu464_3(int) = Store[x] : &:r464_2, r464_1 #-----| Goto -> Block 2 # 467| Block 2 # 467| r467_1(glval) = VariableAddress[a] : -# 467| r467_2(bool) = Load : &:r467_1, ~m? +# 467| r467_2(bool) = Load[a] : &:r467_1, ~m? # 467| v467_3(void) = ConditionalBranch : r467_2 #-----| False -> Block 4 #-----| True -> Block 3 # 467| Block 3 # 467| r467_4(glval) = VariableAddress[b] : -# 467| r467_5(bool) = Load : &:r467_4, ~m? +# 467| r467_5(bool) = Load[b] : &:r467_4, ~m? # 467| v467_6(void) = ConditionalBranch : r467_5 #-----| False -> Block 4 #-----| True -> Block 5 @@ -2649,13 +2649,13 @@ ir.cpp: # 468| Block 4 # 468| r468_1(int) = Constant[2] : # 468| r468_2(glval) = VariableAddress[x] : -# 468| mu468_3(int) = Store : &:r468_2, r468_1 +# 468| mu468_3(int) = Store[x] : &:r468_2, r468_1 #-----| Goto -> Block 6 # 471| Block 5 # 471| r471_1(int) = Constant[3] : # 471| r471_2(glval) = VariableAddress[x] : -# 471| mu471_3(int) = Store : &:r471_2, r471_1 +# 471| mu471_3(int) = Store[x] : &:r471_2, r471_1 #-----| Goto -> Block 6 # 473| Block 6 @@ -2676,14 +2676,14 @@ ir.cpp: # 476| r476_1(glval) = VariableAddress[x] : # 476| mu476_2(bool) = Uninitialized[x] : &:r476_1 # 477| r477_1(glval) = VariableAddress[a] : -# 477| r477_2(bool) = Load : &:r477_1, ~m? +# 477| r477_2(bool) = Load[a] : &:r477_1, ~m? # 477| v477_3(void) = ConditionalBranch : r477_2 #-----| False -> Block 10 #-----| True -> Block 1 # 477| Block 1 # 477| r477_4(glval) = VariableAddress[b] : -# 477| r477_5(bool) = Load : &:r477_4, ~m? +# 477| r477_5(bool) = Load[b] : &:r477_4, ~m? # 477| v477_6(void) = ConditionalBranch : r477_5 #-----| False -> Block 10 #-----| True -> Block 12 @@ -2691,16 +2691,16 @@ ir.cpp: # 478| Block 2 # 478| r478_1(glval) = VariableAddress[#temp478:9] : # 478| r478_2(bool) = Constant[0] : -# 478| mu478_3(bool) = Store : &:r478_1, r478_2 +# 478| mu478_3(bool) = Store[#temp478:9] : &:r478_1, r478_2 #-----| Goto -> Block 3 # 478| Block 3 # 478| r478_4(glval) = VariableAddress[#temp478:9] : -# 478| r478_5(bool) = Load : &:r478_4, ~m? +# 478| r478_5(bool) = Load[#temp478:9] : &:r478_4, ~m? # 478| r478_6(glval) = VariableAddress[x] : -# 478| mu478_7(bool) = Store : &:r478_6, r478_5 +# 478| mu478_7(bool) = Store[x] : &:r478_6, r478_5 # 479| r479_1(glval) = VariableAddress[a] : -# 479| r479_2(bool) = Load : &:r479_1, ~m? +# 479| r479_2(bool) = Load[a] : &:r479_1, ~m? # 479| v479_3(void) = ConditionalBranch : r479_2 #-----| False -> Block 9 #-----| True -> Block 8 @@ -2708,12 +2708,12 @@ ir.cpp: # 478| Block 4 # 478| r478_8(glval) = VariableAddress[#temp478:9] : # 478| r478_9(bool) = Constant[1] : -# 478| mu478_10(bool) = Store : &:r478_8, r478_9 +# 478| mu478_10(bool) = Store[#temp478:9] : &:r478_8, r478_9 #-----| Goto -> Block 3 # 478| Block 5 # 478| r478_11(glval) = VariableAddress[b] : -# 478| r478_12(bool) = Load : &:r478_11, ~m? +# 478| r478_12(bool) = Load[b] : &:r478_11, ~m? # 478| v478_13(void) = ConditionalBranch : r478_12 #-----| False -> Block 2 #-----| True -> Block 4 @@ -2721,15 +2721,15 @@ ir.cpp: # 479| Block 6 # 479| r479_4(glval) = VariableAddress[#temp479:11] : # 479| r479_5(bool) = Constant[0] : -# 479| mu479_6(bool) = Store : &:r479_4, r479_5 +# 479| mu479_6(bool) = Store[#temp479:11] : &:r479_4, r479_5 #-----| Goto -> Block 7 # 479| Block 7 # 479| r479_7(glval) = VariableAddress[#temp479:11] : -# 479| r479_8(bool) = Load : &:r479_7, ~m? +# 479| r479_8(bool) = Load[#temp479:11] : &:r479_7, ~m? # 479| r479_9(bool) = LogicalNot : r479_8 # 479| r479_10(glval) = VariableAddress[x] : -# 479| mu479_11(bool) = Store : &:r479_10, r479_9 +# 479| mu479_11(bool) = Store[x] : &:r479_10, r479_9 # 480| v480_1(void) = NoOp : # 475| v475_8(void) = ReturnVoid : # 475| v475_9(void) = AliasedUse : ~m? @@ -2738,12 +2738,12 @@ ir.cpp: # 479| Block 8 # 479| r479_12(glval) = VariableAddress[#temp479:11] : # 479| r479_13(bool) = Constant[1] : -# 479| mu479_14(bool) = Store : &:r479_12, r479_13 +# 479| mu479_14(bool) = Store[#temp479:11] : &:r479_12, r479_13 #-----| Goto -> Block 7 # 479| Block 9 # 479| r479_15(glval) = VariableAddress[b] : -# 479| r479_16(bool) = Load : &:r479_15, ~m? +# 479| r479_16(bool) = Load[b] : &:r479_15, ~m? # 479| v479_17(void) = ConditionalBranch : r479_16 #-----| False -> Block 6 #-----| True -> Block 8 @@ -2751,16 +2751,16 @@ ir.cpp: # 477| Block 10 # 477| r477_7(glval) = VariableAddress[#temp477:9] : # 477| r477_8(bool) = Constant[0] : -# 477| mu477_9(bool) = Store : &:r477_7, r477_8 +# 477| mu477_9(bool) = Store[#temp477:9] : &:r477_7, r477_8 #-----| Goto -> Block 11 # 477| Block 11 # 477| r477_10(glval) = VariableAddress[#temp477:9] : -# 477| r477_11(bool) = Load : &:r477_10, ~m? +# 477| r477_11(bool) = Load[#temp477:9] : &:r477_10, ~m? # 477| r477_12(glval) = VariableAddress[x] : -# 477| mu477_13(bool) = Store : &:r477_12, r477_11 +# 477| mu477_13(bool) = Store[x] : &:r477_12, r477_11 # 478| r478_14(glval) = VariableAddress[a] : -# 478| r478_15(bool) = Load : &:r478_14, ~m? +# 478| r478_15(bool) = Load[a] : &:r478_14, ~m? # 478| v478_16(void) = ConditionalBranch : r478_15 #-----| False -> Block 5 #-----| True -> Block 4 @@ -2768,7 +2768,7 @@ ir.cpp: # 477| Block 12 # 477| r477_14(glval) = VariableAddress[#temp477:9] : # 477| r477_15(bool) = Constant[1] : -# 477| mu477_16(bool) = Store : &:r477_14, r477_15 +# 477| mu477_16(bool) = Store[#temp477:9] : &:r477_14, r477_15 #-----| Goto -> Block 11 # 482| void Conditional(bool, int, int) @@ -2784,29 +2784,29 @@ ir.cpp: # 482| mu482_9(int) = InitializeParameter[y] : &:r482_8 # 483| r483_1(glval) = VariableAddress[z] : # 483| r483_2(glval) = VariableAddress[a] : -# 483| r483_3(bool) = Load : &:r483_2, ~m? +# 483| r483_3(bool) = Load[a] : &:r483_2, ~m? # 483| v483_4(void) = ConditionalBranch : r483_3 #-----| False -> Block 2 #-----| True -> Block 1 # 483| Block 1 # 483| r483_5(glval) = VariableAddress[x] : -# 483| r483_6(int) = Load : &:r483_5, ~m? +# 483| r483_6(int) = Load[x] : &:r483_5, ~m? # 483| r483_7(glval) = VariableAddress[#temp483:13] : -# 483| mu483_8(int) = Store : &:r483_7, r483_6 +# 483| mu483_8(int) = Store[#temp483:13] : &:r483_7, r483_6 #-----| Goto -> Block 3 # 483| Block 2 # 483| r483_9(glval) = VariableAddress[y] : -# 483| r483_10(int) = Load : &:r483_9, ~m? +# 483| r483_10(int) = Load[y] : &:r483_9, ~m? # 483| r483_11(glval) = VariableAddress[#temp483:13] : -# 483| mu483_12(int) = Store : &:r483_11, r483_10 +# 483| mu483_12(int) = Store[#temp483:13] : &:r483_11, r483_10 #-----| Goto -> Block 3 # 483| Block 3 # 483| r483_13(glval) = VariableAddress[#temp483:13] : -# 483| r483_14(int) = Load : &:r483_13, ~m? -# 483| mu483_15(int) = Store : &:r483_1, r483_14 +# 483| r483_14(int) = Load[#temp483:13] : &:r483_13, ~m? +# 483| mu483_15(int) = Store[z] : &:r483_1, r483_14 # 484| v484_1(void) = NoOp : # 482| v482_10(void) = ReturnVoid : # 482| v482_11(void) = AliasedUse : ~m? @@ -2825,15 +2825,15 @@ ir.cpp: # 488| mu488_2(int) = Uninitialized[y] : &:r488_1 # 489| r489_1(int) = Constant[5] : # 489| r489_2(glval) = VariableAddress[a] : -# 489| r489_3(bool) = Load : &:r489_2, ~m? +# 489| r489_3(bool) = Load[a] : &:r489_2, ~m? # 489| v489_4(void) = ConditionalBranch : r489_3 #-----| False -> Block 3 #-----| True -> Block 2 # 489| Block 1 # 489| r489_5(glval) = VariableAddress[#temp489:6] : -# 489| r489_6(glval) = Load : &:r489_5, ~m? -# 489| mu489_7(int) = Store : &:r489_6, r489_1 +# 489| r489_6(glval) = Load[#temp489:6] : &:r489_5, ~m? +# 489| mu489_7(int) = Store[?] : &:r489_6, r489_1 # 490| v490_1(void) = NoOp : # 486| v486_6(void) = ReturnVoid : # 486| v486_7(void) = AliasedUse : ~m? @@ -2842,13 +2842,13 @@ ir.cpp: # 489| Block 2 # 489| r489_8(glval) = VariableAddress[x] : # 489| r489_9(glval) = VariableAddress[#temp489:6] : -# 489| mu489_10(glval) = Store : &:r489_9, r489_8 +# 489| mu489_10(glval) = Store[#temp489:6] : &:r489_9, r489_8 #-----| Goto -> Block 1 # 489| Block 3 # 489| r489_11(glval) = VariableAddress[y] : # 489| r489_12(glval) = VariableAddress[#temp489:6] : -# 489| mu489_13(glval) = Store : &:r489_12, r489_11 +# 489| mu489_13(glval) = Store[#temp489:6] : &:r489_12, r489_11 #-----| Goto -> Block 1 # 492| void Conditional_Void(bool) @@ -2859,7 +2859,7 @@ ir.cpp: # 492| r492_4(glval) = VariableAddress[a] : # 492| mu492_5(bool) = InitializeParameter[a] : &:r492_4 # 493| r493_1(glval) = VariableAddress[a] : -# 493| r493_2(bool) = Load : &:r493_1, ~m? +# 493| r493_2(bool) = Load[a] : &:r493_1, ~m? # 493| v493_3(void) = ConditionalBranch : r493_2 #-----| False -> Block 1 #-----| True -> Block 3 @@ -2889,16 +2889,16 @@ ir.cpp: # 496| mu496_3(unknown) = InitializeNonLocal : # 497| r497_1(glval) = VariableAddress[p] : # 497| r497_2(int *) = Constant[0] : -# 497| mu497_3(int *) = Store : &:r497_1, r497_2 +# 497| mu497_3(int *) = Store[p] : &:r497_1, r497_2 # 498| r498_1(glval) = VariableAddress[q] : # 498| r498_2(int *) = Constant[0] : -# 498| mu498_3(int *) = Store : &:r498_1, r498_2 +# 498| mu498_3(int *) = Store[q] : &:r498_1, r498_2 # 499| r499_1(int *) = Constant[0] : # 499| r499_2(glval) = VariableAddress[p] : -# 499| mu499_3(int *) = Store : &:r499_2, r499_1 +# 499| mu499_3(int *) = Store[p] : &:r499_2, r499_1 # 500| r500_1(int *) = Constant[0] : # 500| r500_2(glval) = VariableAddress[q] : -# 500| mu500_3(int *) = Store : &:r500_2, r500_1 +# 500| mu500_3(int *) = Store[q] : &:r500_2, r500_1 # 501| v501_1(void) = NoOp : # 496| v496_4(void) = ReturnVoid : # 496| v496_5(void) = AliasedUse : ~m? @@ -2917,36 +2917,36 @@ ir.cpp: # 504| mu504_2(Point) = Uninitialized[pt1] : &:r504_1 # 504| r504_3(glval) = FieldAddress[x] : r504_1 # 504| r504_4(glval) = VariableAddress[x] : -# 504| r504_5(int) = Load : &:r504_4, ~m? -# 504| mu504_6(int) = Store : &:r504_3, r504_5 +# 504| r504_5(int) = Load[x] : &:r504_4, ~m? +# 504| mu504_6(int) = Store[?] : &:r504_3, r504_5 # 504| r504_7(glval) = FieldAddress[y] : r504_1 # 504| r504_8(glval) = VariableAddress[f] : -# 504| r504_9(float) = Load : &:r504_8, ~m? +# 504| r504_9(float) = Load[f] : &:r504_8, ~m? # 504| r504_10(int) = Convert : r504_9 -# 504| mu504_11(int) = Store : &:r504_7, r504_10 +# 504| mu504_11(int) = Store[?] : &:r504_7, r504_10 # 505| r505_1(glval) = VariableAddress[pt2] : # 505| mu505_2(Point) = Uninitialized[pt2] : &:r505_1 # 505| r505_3(glval) = FieldAddress[x] : r505_1 # 505| r505_4(glval) = VariableAddress[x] : -# 505| r505_5(int) = Load : &:r505_4, ~m? -# 505| mu505_6(int) = Store : &:r505_3, r505_5 +# 505| r505_5(int) = Load[x] : &:r505_4, ~m? +# 505| mu505_6(int) = Store[?] : &:r505_3, r505_5 # 505| r505_7(glval) = FieldAddress[y] : r505_1 # 505| r505_8(int) = Constant[0] : -# 505| mu505_9(int) = Store : &:r505_7, r505_8 +# 505| mu505_9(int) = Store[?] : &:r505_7, r505_8 # 506| r506_1(glval) = VariableAddress[pt3] : # 506| mu506_2(Point) = Uninitialized[pt3] : &:r506_1 # 506| r506_3(glval) = FieldAddress[x] : r506_1 # 506| r506_4(int) = Constant[0] : -# 506| mu506_5(int) = Store : &:r506_3, r506_4 +# 506| mu506_5(int) = Store[?] : &:r506_3, r506_4 # 506| r506_6(glval) = FieldAddress[y] : r506_1 # 506| r506_7(int) = Constant[0] : -# 506| mu506_8(int) = Store : &:r506_6, r506_7 +# 506| mu506_8(int) = Store[?] : &:r506_6, r506_7 # 508| r508_1(glval) = VariableAddress[x1] : # 508| r508_2(int) = Constant[1] : -# 508| mu508_3(int) = Store : &:r508_1, r508_2 +# 508| mu508_3(int) = Store[x1] : &:r508_1, r508_2 # 509| r509_1(glval) = VariableAddress[x2] : # 509| r509_2(int) = Constant[0] : -# 509| mu509_3(int) = Store : &:r509_1, r509_2 +# 509| mu509_3(int) = Store[x2] : &:r509_1, r509_2 # 510| v510_1(void) = NoOp : # 503| v503_8(void) = ReturnVoid : # 503| v503_9(void) = AliasedUse : ~m? @@ -2965,65 +2965,65 @@ ir.cpp: # 513| mu513_2(Rect) = Uninitialized[r1] : &:r513_1 # 513| r513_3(glval) = FieldAddress[topLeft] : r513_1 # 513| r513_4(Point) = Constant[0] : -# 513| mu513_5(Point) = Store : &:r513_3, r513_4 +# 513| mu513_5(Point) = Store[?] : &:r513_3, r513_4 # 513| r513_6(glval) = FieldAddress[bottomRight] : r513_1 # 513| r513_7(Point) = Constant[0] : -# 513| mu513_8(Point) = Store : &:r513_6, r513_7 +# 513| mu513_8(Point) = Store[?] : &:r513_6, r513_7 # 514| r514_1(glval) = VariableAddress[r2] : # 514| mu514_2(Rect) = Uninitialized[r2] : &:r514_1 # 514| r514_3(glval) = FieldAddress[topLeft] : r514_1 # 514| r514_4(glval) = FieldAddress[x] : r514_3 # 514| r514_5(glval) = VariableAddress[x] : -# 514| r514_6(int) = Load : &:r514_5, ~m? -# 514| mu514_7(int) = Store : &:r514_4, r514_6 +# 514| r514_6(int) = Load[x] : &:r514_5, ~m? +# 514| mu514_7(int) = Store[?] : &:r514_4, r514_6 # 514| r514_8(glval) = FieldAddress[y] : r514_3 # 514| r514_9(glval) = VariableAddress[f] : -# 514| r514_10(float) = Load : &:r514_9, ~m? +# 514| r514_10(float) = Load[f] : &:r514_9, ~m? # 514| r514_11(int) = Convert : r514_10 -# 514| mu514_12(int) = Store : &:r514_8, r514_11 +# 514| mu514_12(int) = Store[?] : &:r514_8, r514_11 # 514| r514_13(glval) = FieldAddress[bottomRight] : r514_1 # 514| r514_14(Point) = Constant[0] : -# 514| mu514_15(Point) = Store : &:r514_13, r514_14 +# 514| mu514_15(Point) = Store[?] : &:r514_13, r514_14 # 515| r515_1(glval) = VariableAddress[r3] : # 515| mu515_2(Rect) = Uninitialized[r3] : &:r515_1 # 515| r515_3(glval) = FieldAddress[topLeft] : r515_1 # 515| r515_4(glval) = FieldAddress[x] : r515_3 # 515| r515_5(glval) = VariableAddress[x] : -# 515| r515_6(int) = Load : &:r515_5, ~m? -# 515| mu515_7(int) = Store : &:r515_4, r515_6 +# 515| r515_6(int) = Load[x] : &:r515_5, ~m? +# 515| mu515_7(int) = Store[?] : &:r515_4, r515_6 # 515| r515_8(glval) = FieldAddress[y] : r515_3 # 515| r515_9(glval) = VariableAddress[f] : -# 515| r515_10(float) = Load : &:r515_9, ~m? +# 515| r515_10(float) = Load[f] : &:r515_9, ~m? # 515| r515_11(int) = Convert : r515_10 -# 515| mu515_12(int) = Store : &:r515_8, r515_11 +# 515| mu515_12(int) = Store[?] : &:r515_8, r515_11 # 515| r515_13(glval) = FieldAddress[bottomRight] : r515_1 # 515| r515_14(glval) = FieldAddress[x] : r515_13 # 515| r515_15(glval) = VariableAddress[x] : -# 515| r515_16(int) = Load : &:r515_15, ~m? -# 515| mu515_17(int) = Store : &:r515_14, r515_16 +# 515| r515_16(int) = Load[x] : &:r515_15, ~m? +# 515| mu515_17(int) = Store[?] : &:r515_14, r515_16 # 515| r515_18(glval) = FieldAddress[y] : r515_13 # 515| r515_19(glval) = VariableAddress[f] : -# 515| r515_20(float) = Load : &:r515_19, ~m? +# 515| r515_20(float) = Load[f] : &:r515_19, ~m? # 515| r515_21(int) = Convert : r515_20 -# 515| mu515_22(int) = Store : &:r515_18, r515_21 +# 515| mu515_22(int) = Store[?] : &:r515_18, r515_21 # 516| r516_1(glval) = VariableAddress[r4] : # 516| mu516_2(Rect) = Uninitialized[r4] : &:r516_1 # 516| r516_3(glval) = FieldAddress[topLeft] : r516_1 # 516| r516_4(glval) = FieldAddress[x] : r516_3 # 516| r516_5(glval) = VariableAddress[x] : -# 516| r516_6(int) = Load : &:r516_5, ~m? -# 516| mu516_7(int) = Store : &:r516_4, r516_6 +# 516| r516_6(int) = Load[x] : &:r516_5, ~m? +# 516| mu516_7(int) = Store[?] : &:r516_4, r516_6 # 516| r516_8(glval) = FieldAddress[y] : r516_3 # 516| r516_9(int) = Constant[0] : -# 516| mu516_10(int) = Store : &:r516_8, r516_9 +# 516| mu516_10(int) = Store[?] : &:r516_8, r516_9 # 516| r516_11(glval) = FieldAddress[bottomRight] : r516_1 # 516| r516_12(glval) = FieldAddress[x] : r516_11 # 516| r516_13(glval) = VariableAddress[x] : -# 516| r516_14(int) = Load : &:r516_13, ~m? -# 516| mu516_15(int) = Store : &:r516_12, r516_14 +# 516| r516_14(int) = Load[x] : &:r516_13, ~m? +# 516| mu516_15(int) = Store[?] : &:r516_12, r516_14 # 516| r516_16(glval) = FieldAddress[y] : r516_11 # 516| r516_17(int) = Constant[0] : -# 516| mu516_18(int) = Store : &:r516_16, r516_17 +# 516| mu516_18(int) = Store[?] : &:r516_16, r516_17 # 517| v517_1(void) = NoOp : # 512| v512_8(void) = ReturnVoid : # 512| v512_9(void) = AliasedUse : ~m? @@ -3043,35 +3043,35 @@ ir.cpp: # 520| r520_3(int) = Constant[0] : # 520| r520_4(glval) = PointerAdd[4] : r520_1, r520_3 # 520| r520_5(unknown[12]) = Constant[0] : -# 520| mu520_6(unknown[12]) = Store : &:r520_4, r520_5 +# 520| mu520_6(unknown[12]) = Store[?] : &:r520_4, r520_5 # 521| r521_1(glval) = VariableAddress[a2] : # 521| mu521_2(int[3]) = Uninitialized[a2] : &:r521_1 # 521| r521_3(int) = Constant[0] : # 521| r521_4(glval) = PointerAdd[4] : r521_1, r521_3 # 521| r521_5(glval) = VariableAddress[x] : -# 521| r521_6(int) = Load : &:r521_5, ~m? -# 521| mu521_7(int) = Store : &:r521_4, r521_6 +# 521| r521_6(int) = Load[x] : &:r521_5, ~m? +# 521| mu521_7(int) = Store[?] : &:r521_4, r521_6 # 521| r521_8(int) = Constant[1] : # 521| r521_9(glval) = PointerAdd[4] : r521_1, r521_8 # 521| r521_10(glval) = VariableAddress[f] : -# 521| r521_11(float) = Load : &:r521_10, ~m? +# 521| r521_11(float) = Load[f] : &:r521_10, ~m? # 521| r521_12(int) = Convert : r521_11 -# 521| mu521_13(int) = Store : &:r521_9, r521_12 +# 521| mu521_13(int) = Store[?] : &:r521_9, r521_12 # 521| r521_14(int) = Constant[2] : # 521| r521_15(glval) = PointerAdd[4] : r521_1, r521_14 # 521| r521_16(int) = Constant[0] : -# 521| mu521_17(int) = Store : &:r521_15, r521_16 +# 521| mu521_17(int) = Store[?] : &:r521_15, r521_16 # 522| r522_1(glval) = VariableAddress[a3] : # 522| mu522_2(int[3]) = Uninitialized[a3] : &:r522_1 # 522| r522_3(int) = Constant[0] : # 522| r522_4(glval) = PointerAdd[4] : r522_1, r522_3 # 522| r522_5(glval) = VariableAddress[x] : -# 522| r522_6(int) = Load : &:r522_5, ~m? -# 522| mu522_7(int) = Store : &:r522_4, r522_6 +# 522| r522_6(int) = Load[x] : &:r522_5, ~m? +# 522| mu522_7(int) = Store[?] : &:r522_4, r522_6 # 522| r522_8(int) = Constant[1] : # 522| r522_9(glval) = PointerAdd[4] : r522_1, r522_8 # 522| r522_10(unknown[8]) = Constant[0] : -# 522| mu522_11(unknown[8]) = Store : &:r522_9, r522_10 +# 522| mu522_11(unknown[8]) = Store[?] : &:r522_9, r522_10 # 523| v523_1(void) = NoOp : # 519| v519_8(void) = ReturnVoid : # 519| v519_9(void) = AliasedUse : ~m? @@ -3090,9 +3090,9 @@ ir.cpp: # 531| mu531_2(U) = Uninitialized[u1] : &:r531_1 # 531| r531_3(glval) = FieldAddress[d] : r531_1 # 531| r531_4(glval) = VariableAddress[f] : -# 531| r531_5(float) = Load : &:r531_4, ~m? +# 531| r531_5(float) = Load[f] : &:r531_4, ~m? # 531| r531_6(double) = Convert : r531_5 -# 531| mu531_7(double) = Store : &:r531_3, r531_6 +# 531| mu531_7(double) = Store[?] : &:r531_3, r531_6 # 533| v533_1(void) = NoOp : # 530| v530_8(void) = ReturnVoid : # 530| v530_9(void) = AliasedUse : ~m? @@ -3108,9 +3108,9 @@ ir.cpp: # 535| r535_6(glval) = VariableAddress[y] : # 535| mu535_7(int) = InitializeParameter[y] : &:r535_6 # 536| r536_1(glval) = VariableAddress[x] : -# 536| r536_2(int) = Load : &:r536_1, ~m? +# 536| r536_2(int) = Load[x] : &:r536_1, ~m? # 536| r536_3(glval) = VariableAddress[y] : -# 536| r536_4(int) = Load : &:r536_3, ~m? +# 536| r536_4(int) = Load[y] : &:r536_3, ~m? # 536| r536_5(bool) = CompareLT : r536_2, r536_4 # 536| v536_6(void) = ConditionalBranch : r536_5 #-----| False -> Block 3 @@ -3127,9 +3127,9 @@ ir.cpp: # 540| Block 3 # 540| r540_1(glval) = VariableAddress[x] : -# 540| r540_2(int) = Load : &:r540_1, ~m? +# 540| r540_2(int) = Load[x] : &:r540_1, ~m? # 540| r540_3(glval) = VariableAddress[y] : -# 540| mu540_4(int) = Store : &:r540_3, r540_2 +# 540| mu540_4(int) = Store[y] : &:r540_3, r540_2 # 541| v541_1(void) = NoOp : #-----| Goto -> Block 1 @@ -3143,9 +3143,9 @@ ir.cpp: # 543| r543_6(glval) = VariableAddress[y] : # 543| mu543_7(int) = InitializeParameter[y] : &:r543_6 # 544| r544_1(glval) = VariableAddress[x] : -# 544| r544_2(int) = Load : &:r544_1, ~m? +# 544| r544_2(int) = Load[x] : &:r544_1, ~m? # 544| r544_3(glval) = VariableAddress[y] : -# 544| r544_4(int) = Load : &:r544_3, ~m? +# 544| r544_4(int) = Load[y] : &:r544_3, ~m? # 544| r544_5(bool) = CompareLT : r544_2, r544_4 # 544| v544_6(void) = ConditionalBranch : r544_5 #-----| False -> Block 3 @@ -3160,18 +3160,18 @@ ir.cpp: # 545| Block 2 # 545| r545_1(glval) = VariableAddress[#return] : # 545| r545_2(glval) = VariableAddress[x] : -# 545| r545_3(int) = Load : &:r545_2, ~m? -# 545| mu545_4(int) = Store : &:r545_1, r545_3 +# 545| r545_3(int) = Load[x] : &:r545_2, ~m? +# 545| mu545_4(int) = Store[#return] : &:r545_1, r545_3 #-----| Goto -> Block 1 # 548| Block 3 # 548| r548_1(glval) = VariableAddress[#return] : # 548| r548_2(glval) = VariableAddress[x] : -# 548| r548_3(int) = Load : &:r548_2, ~m? +# 548| r548_3(int) = Load[x] : &:r548_2, ~m? # 548| r548_4(glval) = VariableAddress[y] : -# 548| r548_5(int) = Load : &:r548_4, ~m? +# 548| r548_5(int) = Load[y] : &:r548_4, ~m? # 548| r548_6(int) = Add : r548_3, r548_5 -# 548| mu548_7(int) = Store : &:r548_1, r548_6 +# 548| mu548_7(int) = Store[#return] : &:r548_1, r548_6 #-----| Goto -> Block 1 # 551| int CallViaFuncPtr(int(*)(int)) @@ -3183,11 +3183,11 @@ ir.cpp: # 551| mu551_5(..(*)(..)) = InitializeParameter[pfn] : &:r551_4 # 552| r552_1(glval) = VariableAddress[#return] : # 552| r552_2(glval<..(*)(..)>) = VariableAddress[pfn] : -# 552| r552_3(..(*)(..)) = Load : &:r552_2, ~m? +# 552| r552_3(..(*)(..)) = Load[pfn] : &:r552_2, ~m? # 552| r552_4(int) = Constant[5] : # 552| r552_5(int) = Call[?] : func:r552_3, 0:r552_4 # 552| mu552_6(unknown) = ^CallSideEffect : ~m? -# 552| mu552_7(int) = Store : &:r552_1, r552_5 +# 552| mu552_7(int) = Store[#return] : &:r552_1, r552_5 # 551| r551_6(glval) = VariableAddress[#return] : # 551| v551_7(void) = ReturnValue : &:r551_6, ~m? # 551| v551_8(void) = AliasedUse : ~m? @@ -3201,7 +3201,7 @@ ir.cpp: # 560| r560_4(glval) = VariableAddress[e] : # 560| mu560_5(E) = InitializeParameter[e] : &:r560_4 # 561| r561_1(glval) = VariableAddress[e] : -# 561| r561_2(E) = Load : &:r561_1, ~m? +# 561| r561_2(E) = Load[e] : &:r561_1, ~m? # 561| r561_3(int) = Convert : r561_2 # 561| v561_4(void) = Switch : r561_3 #-----| Case[0] -> Block 4 @@ -3218,21 +3218,21 @@ ir.cpp: # 564| v564_1(void) = NoOp : # 565| r565_1(glval) = VariableAddress[#return] : # 565| r565_2(int) = Constant[1] : -# 565| mu565_3(int) = Store : &:r565_1, r565_2 +# 565| mu565_3(int) = Store[#return] : &:r565_1, r565_2 #-----| Goto -> Block 1 # 566| Block 3 # 566| v566_1(void) = NoOp : # 567| r567_1(glval) = VariableAddress[#return] : # 567| r567_2(int) = Constant[-1] : -# 567| mu567_3(int) = Store : &:r567_1, r567_2 +# 567| mu567_3(int) = Store[#return] : &:r567_1, r567_2 #-----| Goto -> Block 1 # 562| Block 4 # 562| v562_1(void) = NoOp : # 563| r563_1(glval) = VariableAddress[#return] : # 563| r563_2(int) = Constant[0] : -# 563| mu563_3(int) = Store : &:r563_1, r563_2 +# 563| mu563_3(int) = Store[#return] : &:r563_1, r563_2 #-----| Goto -> Block 1 # 571| void InitArray() @@ -3242,16 +3242,16 @@ ir.cpp: # 571| mu571_3(unknown) = InitializeNonLocal : # 572| r572_1(glval) = VariableAddress[a_pad] : # 572| r572_2(glval) = StringConstant[""] : -# 572| r572_3(char[32]) = Load : &:r572_2, ~m? -# 572| mu572_4(char[32]) = Store : &:r572_1, r572_3 +# 572| r572_3(char[32]) = Load[?] : &:r572_2, ~m? +# 572| mu572_4(char[32]) = Store[a_pad] : &:r572_1, r572_3 # 573| r573_1(glval) = VariableAddress[a_nopad] : # 573| r573_2(glval) = StringConstant["foo"] : -# 573| r573_3(char[4]) = Load : &:r573_2, ~m? -# 573| mu573_4(char[4]) = Store : &:r573_1, r573_3 +# 573| r573_3(char[4]) = Load[?] : &:r573_2, ~m? +# 573| mu573_4(char[4]) = Store[a_nopad] : &:r573_1, r573_3 # 574| r574_1(glval) = VariableAddress[a_infer] : # 574| r574_2(glval) = StringConstant["blah"] : -# 574| r574_3(char[5]) = Load : &:r574_2, ~m? -# 574| mu574_4(char[5]) = Store : &:r574_1, r574_3 +# 574| r574_3(char[5]) = Load[?] : &:r574_2, ~m? +# 574| mu574_4(char[5]) = Store[a_infer] : &:r574_1, r574_3 # 575| r575_1(glval) = VariableAddress[b] : # 575| mu575_2(char[2]) = Uninitialized[b] : &:r575_1 # 576| r576_1(glval) = VariableAddress[c] : @@ -3259,37 +3259,37 @@ ir.cpp: # 576| r576_3(int) = Constant[0] : # 576| r576_4(glval) = PointerAdd[1] : r576_1, r576_3 # 576| r576_5(unknown[2]) = Constant[0] : -# 576| mu576_6(unknown[2]) = Store : &:r576_4, r576_5 +# 576| mu576_6(unknown[2]) = Store[?] : &:r576_4, r576_5 # 577| r577_1(glval) = VariableAddress[d] : # 577| mu577_2(char[2]) = Uninitialized[d] : &:r577_1 # 577| r577_3(int) = Constant[0] : # 577| r577_4(glval) = PointerAdd[1] : r577_1, r577_3 # 577| r577_5(char) = Constant[0] : -# 577| mu577_6(char) = Store : &:r577_4, r577_5 +# 577| mu577_6(char) = Store[?] : &:r577_4, r577_5 # 577| r577_7(int) = Constant[1] : # 577| r577_8(glval) = PointerAdd[1] : r577_1, r577_7 # 577| r577_9(char) = Constant[0] : -# 577| mu577_10(char) = Store : &:r577_8, r577_9 +# 577| mu577_10(char) = Store[?] : &:r577_8, r577_9 # 578| r578_1(glval) = VariableAddress[e] : # 578| mu578_2(char[2]) = Uninitialized[e] : &:r578_1 # 578| r578_3(int) = Constant[0] : # 578| r578_4(glval) = PointerAdd[1] : r578_1, r578_3 # 578| r578_5(char) = Constant[0] : -# 578| mu578_6(char) = Store : &:r578_4, r578_5 +# 578| mu578_6(char) = Store[?] : &:r578_4, r578_5 # 578| r578_7(int) = Constant[1] : # 578| r578_8(glval) = PointerAdd[1] : r578_1, r578_7 # 578| r578_9(char) = Constant[1] : -# 578| mu578_10(char) = Store : &:r578_8, r578_9 +# 578| mu578_10(char) = Store[?] : &:r578_8, r578_9 # 579| r579_1(glval) = VariableAddress[f] : # 579| mu579_2(char[3]) = Uninitialized[f] : &:r579_1 # 579| r579_3(int) = Constant[0] : # 579| r579_4(glval) = PointerAdd[1] : r579_1, r579_3 # 579| r579_5(char) = Constant[0] : -# 579| mu579_6(char) = Store : &:r579_4, r579_5 +# 579| mu579_6(char) = Store[?] : &:r579_4, r579_5 # 579| r579_7(int) = Constant[1] : # 579| r579_8(glval) = PointerAdd[1] : r579_1, r579_7 # 579| r579_9(unknown[2]) = Constant[0] : -# 579| mu579_10(unknown[2]) = Store : &:r579_8, r579_9 +# 579| mu579_10(unknown[2]) = Store[?] : &:r579_8, r579_9 # 580| v580_1(void) = NoOp : # 571| v571_4(void) = ReturnVoid : # 571| v571_5(void) = AliasedUse : ~m? @@ -3324,22 +3324,22 @@ ir.cpp: # 590| mu590_3(unknown) = InitializeNonLocal : # 591| r591_1(glval<..(*)(..)>) = VariableAddress[pfn] : # 591| r591_2(..(*)(..)) = FunctionAddress[FuncPtrTarget] : -# 591| mu591_3(..(*)(..)) = Store : &:r591_1, r591_2 +# 591| mu591_3(..(*)(..)) = Store[pfn] : &:r591_1, r591_2 # 592| r592_1(glval<..()(..)>) = FunctionAddress[FuncPtrTarget] : # 592| r592_2(..(*)(..)) = CopyValue : r592_1 # 592| r592_3(glval<..(*)(..)>) = VariableAddress[pfn] : -# 592| mu592_4(..(*)(..)) = Store : &:r592_3, r592_2 +# 592| mu592_4(..(*)(..)) = Store[pfn] : &:r592_3, r592_2 # 593| r593_1(..(*)(..)) = FunctionAddress[FuncPtrTarget] : # 593| r593_2(..(*)(..)) = CopyValue : r593_1 # 593| r593_3(glval<..(*)(..)>) = VariableAddress[pfn] : -# 593| mu593_4(..(*)(..)) = Store : &:r593_3, r593_2 +# 593| mu593_4(..(*)(..)) = Store[pfn] : &:r593_3, r593_2 # 594| r594_1(glval<..()(..)>) = FunctionAddress[FuncPtrTarget] : # 594| r594_2(..(*)(..)) = CopyValue : r594_1 # 594| r594_3(..(*)(..)) = CopyValue : r594_2 # 594| r594_4(..(*)(..)) = CopyValue : r594_3 # 594| r594_5(..(*)(..)) = CopyValue : r594_4 # 594| r594_6(glval<..(*)(..)>) = VariableAddress[pfn] : -# 594| mu594_7(..(*)(..)) = Store : &:r594_6, r594_5 +# 594| mu594_7(..(*)(..)) = Store[pfn] : &:r594_6, r594_5 # 595| v595_1(void) = NoOp : # 590| v590_4(void) = ReturnVoid : # 590| v590_5(void) = AliasedUse : ~m? @@ -3370,7 +3370,7 @@ ir.cpp: # 618| r618_2(glval) = FunctionAddress[ReturnObject] : # 618| r618_3(String) = Call[ReturnObject] : func:r618_2 # 618| mu618_4(unknown) = ^CallSideEffect : ~m? -# 618| mu618_5(String) = Store : &:r618_1, r618_3 +# 618| mu618_5(String) = Store[s3] : &:r618_1, r618_3 # 619| r619_1(glval) = VariableAddress[s4] : # 619| mu619_2(String) = Uninitialized[s4] : &:r619_1 # 619| r619_3(glval) = FunctionAddress[String] : @@ -3393,16 +3393,16 @@ ir.cpp: # 622| mu622_3(unknown) = InitializeNonLocal : # 622| r622_4(glval) = VariableAddress[r] : # 622| mu622_5(String &) = InitializeParameter[r] : &:r622_4 -# 622| r622_6(String &) = Load : &:r622_4, ~m? +# 622| r622_6(String &) = Load[r] : &:r622_4, ~m? # 622| mu622_7(unknown) = InitializeIndirection[r] : &:r622_6 # 622| r622_8(glval) = VariableAddress[p] : # 622| mu622_9(String *) = InitializeParameter[p] : &:r622_8 -# 622| r622_10(String *) = Load : &:r622_8, ~m? +# 622| r622_10(String *) = Load[p] : &:r622_8, ~m? # 622| mu622_11(unknown) = InitializeIndirection[p] : &:r622_10 # 622| r622_12(glval) = VariableAddress[s] : # 622| mu622_13(String) = InitializeParameter[s] : &:r622_12 # 623| r623_1(glval) = VariableAddress[r] : -# 623| r623_2(String &) = Load : &:r623_1, ~m? +# 623| r623_2(String &) = Load[r] : &:r623_1, ~m? # 623| r623_3(glval) = CopyValue : r623_2 # 623| r623_4(glval) = Convert : r623_3 # 623| r623_5(glval) = FunctionAddress[c_str] : @@ -3411,7 +3411,7 @@ ir.cpp: # 623| v623_8(void) = ^BufferReadSideEffect[-1] : &:r623_4, ~m? # 623| mu623_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r623_4 # 624| r624_1(glval) = VariableAddress[p] : -# 624| r624_2(String *) = Load : &:r624_1, ~m? +# 624| r624_2(String *) = Load[p] : &:r624_1, ~m? # 624| r624_3(String *) = Convert : r624_2 # 624| r624_4(glval) = FunctionAddress[c_str] : # 624| r624_5(char *) = Call[c_str] : func:r624_4, this:r624_3 @@ -3439,7 +3439,7 @@ ir.cpp: # 628| mu628_3(unknown) = InitializeNonLocal : # 628| r628_4(glval) = VariableAddress[#this] : # 628| mu628_5(glval) = InitializeParameter[#this] : &:r628_4 -# 628| r628_6(glval) = Load : &:r628_4, ~m? +# 628| r628_6(glval) = Load[#this] : &:r628_4, ~m? # 628| mu628_7(C) = InitializeIndirection[#this] : &:r628_6 #-----| v0_1(void) = NoOp : # 628| r628_8(glval) = FieldAddress[m_f] : mu628_5 @@ -3464,8 +3464,8 @@ ir.cpp: # 630| mu630_5(int) = InitializeParameter[x] : &:r630_4 # 631| r631_1(glval) = VariableAddress[#return] : # 631| r631_2(glval) = VariableAddress[x] : -# 631| r631_3(int) = Load : &:r631_2, ~m? -# 631| mu631_4(int) = Store : &:r631_1, r631_3 +# 631| r631_3(int) = Load[x] : &:r631_2, ~m? +# 631| mu631_4(int) = Store[#return] : &:r631_1, r631_3 # 630| r630_6(glval) = VariableAddress[#return] : # 630| v630_7(void) = ReturnValue : &:r630_6, ~m? # 630| v630_8(void) = AliasedUse : ~m? @@ -3478,14 +3478,14 @@ ir.cpp: # 634| mu634_3(unknown) = InitializeNonLocal : # 634| r634_4(glval) = VariableAddress[#this] : # 634| mu634_5(glval) = InitializeParameter[#this] : &:r634_4 -# 634| r634_6(glval) = Load : &:r634_4, ~m? +# 634| r634_6(glval) = Load[#this] : &:r634_4, ~m? # 634| mu634_7(C) = InitializeIndirection[#this] : &:r634_6 # 634| r634_8(glval) = VariableAddress[x] : # 634| mu634_9(int) = InitializeParameter[x] : &:r634_8 # 635| r635_1(glval) = VariableAddress[#return] : # 635| r635_2(glval) = VariableAddress[x] : -# 635| r635_3(int) = Load : &:r635_2, ~m? -# 635| mu635_4(int) = Store : &:r635_1, r635_3 +# 635| r635_3(int) = Load[x] : &:r635_2, ~m? +# 635| mu635_4(int) = Store[#return] : &:r635_1, r635_3 # 634| v634_10(void) = ReturnIndirection[#this] : &:r634_6, ~m? # 634| r634_11(glval) = VariableAddress[#return] : # 634| v634_12(void) = ReturnValue : &:r634_11, ~m? @@ -3499,14 +3499,14 @@ ir.cpp: # 638| mu638_3(unknown) = InitializeNonLocal : # 638| r638_4(glval) = VariableAddress[#this] : # 638| mu638_5(glval) = InitializeParameter[#this] : &:r638_4 -# 638| r638_6(glval) = Load : &:r638_4, ~m? +# 638| r638_6(glval) = Load[#this] : &:r638_4, ~m? # 638| mu638_7(C) = InitializeIndirection[#this] : &:r638_6 # 638| r638_8(glval) = VariableAddress[x] : # 638| mu638_9(int) = InitializeParameter[x] : &:r638_8 # 639| r639_1(glval) = VariableAddress[#return] : # 639| r639_2(glval) = VariableAddress[x] : -# 639| r639_3(int) = Load : &:r639_2, ~m? -# 639| mu639_4(int) = Store : &:r639_1, r639_3 +# 639| r639_3(int) = Load[x] : &:r639_2, ~m? +# 639| mu639_4(int) = Store[#return] : &:r639_1, r639_3 # 638| v638_10(void) = ReturnIndirection[#this] : &:r638_6, ~m? # 638| r638_11(glval) = VariableAddress[#return] : # 638| v638_12(void) = ReturnValue : &:r638_11, ~m? @@ -3520,45 +3520,45 @@ ir.cpp: # 642| mu642_3(unknown) = InitializeNonLocal : # 642| r642_4(glval) = VariableAddress[#this] : # 642| mu642_5(glval) = InitializeParameter[#this] : &:r642_4 -# 642| r642_6(glval) = Load : &:r642_4, ~m? +# 642| r642_6(glval) = Load[#this] : &:r642_4, ~m? # 642| mu642_7(C) = InitializeIndirection[#this] : &:r642_6 # 643| r643_1(int) = Constant[0] : # 643| r643_2(glval) = VariableAddress[#this] : -# 643| r643_3(C *) = Load : &:r643_2, ~m? +# 643| r643_3(C *) = Load[#this] : &:r643_2, ~m? # 643| r643_4(glval) = FieldAddress[m_a] : r643_3 -# 643| mu643_5(int) = Store : &:r643_4, r643_1 +# 643| mu643_5(int) = Store[?] : &:r643_4, r643_1 # 644| r644_1(int) = Constant[1] : # 644| r644_2(glval) = VariableAddress[#this] : -# 644| r644_3(C *) = Load : &:r644_2, ~m? +# 644| r644_3(C *) = Load[#this] : &:r644_2, ~m? # 644| r644_4(glval) = CopyValue : r644_3 # 644| r644_5(glval) = FieldAddress[m_a] : r644_4 -# 644| mu644_6(int) = Store : &:r644_5, r644_1 +# 644| mu644_6(int) = Store[?] : &:r644_5, r644_1 # 645| r645_1(int) = Constant[2] : # 645| r645_2(glval) = VariableAddress[#this] : -# 645| r645_3(C *) = Load : &:r645_2, ~m? +# 645| r645_3(C *) = Load[#this] : &:r645_2, ~m? # 645| r645_4(glval) = FieldAddress[m_a] : r645_3 -# 645| mu645_5(int) = Store : &:r645_4, r645_1 +# 645| mu645_5(int) = Store[?] : &:r645_4, r645_1 # 646| r646_1(glval) = VariableAddress[x] : # 646| mu646_2(int) = Uninitialized[x] : &:r646_1 # 647| r647_1(glval) = VariableAddress[#this] : -# 647| r647_2(C *) = Load : &:r647_1, ~m? +# 647| r647_2(C *) = Load[#this] : &:r647_1, ~m? # 647| r647_3(glval) = FieldAddress[m_a] : r647_2 -# 647| r647_4(int) = Load : &:r647_3, ~m? +# 647| r647_4(int) = Load[?] : &:r647_3, ~m? # 647| r647_5(glval) = VariableAddress[x] : -# 647| mu647_6(int) = Store : &:r647_5, r647_4 +# 647| mu647_6(int) = Store[x] : &:r647_5, r647_4 # 648| r648_1(glval) = VariableAddress[#this] : -# 648| r648_2(C *) = Load : &:r648_1, ~m? +# 648| r648_2(C *) = Load[#this] : &:r648_1, ~m? # 648| r648_3(glval) = CopyValue : r648_2 # 648| r648_4(glval) = FieldAddress[m_a] : r648_3 -# 648| r648_5(int) = Load : &:r648_4, ~m? +# 648| r648_5(int) = Load[?] : &:r648_4, ~m? # 648| r648_6(glval) = VariableAddress[x] : -# 648| mu648_7(int) = Store : &:r648_6, r648_5 +# 648| mu648_7(int) = Store[x] : &:r648_6, r648_5 # 649| r649_1(glval) = VariableAddress[#this] : -# 649| r649_2(C *) = Load : &:r649_1, ~m? +# 649| r649_2(C *) = Load[#this] : &:r649_1, ~m? # 649| r649_3(glval) = FieldAddress[m_a] : r649_2 -# 649| r649_4(int) = Load : &:r649_3, ~m? +# 649| r649_4(int) = Load[?] : &:r649_3, ~m? # 649| r649_5(glval) = VariableAddress[x] : -# 649| mu649_6(int) = Store : &:r649_5, r649_4 +# 649| mu649_6(int) = Store[x] : &:r649_5, r649_4 # 650| v650_1(void) = NoOp : # 642| v642_8(void) = ReturnIndirection[#this] : &:r642_6, ~m? # 642| v642_9(void) = ReturnVoid : @@ -3572,10 +3572,10 @@ ir.cpp: # 652| mu652_3(unknown) = InitializeNonLocal : # 652| r652_4(glval) = VariableAddress[#this] : # 652| mu652_5(glval) = InitializeParameter[#this] : &:r652_4 -# 652| r652_6(glval) = Load : &:r652_4, ~m? +# 652| r652_6(glval) = Load[#this] : &:r652_4, ~m? # 652| mu652_7(C) = InitializeIndirection[#this] : &:r652_6 # 653| r653_1(glval) = VariableAddress[#this] : -# 653| r653_2(C *) = Load : &:r653_1, ~m? +# 653| r653_2(C *) = Load[#this] : &:r653_1, ~m? # 653| r653_3(glval) = FunctionAddress[InstanceMemberFunction] : # 653| r653_4(int) = Constant[0] : # 653| r653_5(int) = Call[InstanceMemberFunction] : func:r653_3, this:r653_2, 0:r653_4 @@ -3583,7 +3583,7 @@ ir.cpp: # 653| v653_7(void) = ^BufferReadSideEffect[-1] : &:r653_2, ~m? # 653| mu653_8(C) = ^IndirectMayWriteSideEffect[-1] : &:r653_2 # 654| r654_1(glval) = VariableAddress[#this] : -# 654| r654_2(C *) = Load : &:r654_1, ~m? +# 654| r654_2(C *) = Load[#this] : &:r654_1, ~m? # 654| r654_3(glval) = CopyValue : r654_2 # 654| r654_4(glval) = FunctionAddress[InstanceMemberFunction] : # 654| r654_5(int) = Constant[1] : @@ -3592,7 +3592,7 @@ ir.cpp: # 654| v654_8(void) = ^BufferReadSideEffect[-1] : &:r654_3, ~m? # 654| mu654_9(C) = ^IndirectMayWriteSideEffect[-1] : &:r654_3 # 655| r655_1(glval) = VariableAddress[#this] : -# 655| r655_2(C *) = Load : &:r655_1, ~m? +# 655| r655_2(C *) = Load[#this] : &:r655_1, ~m? # 655| r655_3(glval) = FunctionAddress[InstanceMemberFunction] : # 655| r655_4(int) = Constant[2] : # 655| r655_5(int) = Call[InstanceMemberFunction] : func:r655_3, this:r655_2, 0:r655_4 @@ -3612,11 +3612,11 @@ ir.cpp: # 658| mu658_3(unknown) = InitializeNonLocal : # 658| r658_4(glval) = VariableAddress[#this] : # 658| mu658_5(glval) = InitializeParameter[#this] : &:r658_4 -# 658| r658_6(glval) = Load : &:r658_4, ~m? +# 658| r658_6(glval) = Load[#this] : &:r658_4, ~m? # 658| mu658_7(C) = InitializeIndirection[#this] : &:r658_6 # 659| r659_1(glval) = FieldAddress[m_a] : mu658_5 # 659| r659_2(int) = Constant[1] : -# 659| mu659_3(int) = Store : &:r659_1, r659_2 +# 659| mu659_3(int) = Store[?] : &:r659_1, r659_2 # 663| r663_1(glval) = FieldAddress[m_b] : mu658_5 # 663| r663_2(glval) = FunctionAddress[String] : # 663| v663_3(void) = Call[String] : func:r663_2, this:r663_1 @@ -3624,10 +3624,10 @@ ir.cpp: # 663| mu663_5(String) = ^IndirectMayWriteSideEffect[-1] : &:r663_1 # 660| r660_1(glval) = FieldAddress[m_c] : mu658_5 # 660| r660_2(char) = Constant[3] : -# 660| mu660_3(char) = Store : &:r660_1, r660_2 +# 660| mu660_3(char) = Store[?] : &:r660_1, r660_2 # 661| r661_1(glval) = FieldAddress[m_e] : mu658_5 # 661| r661_2(void *) = Constant[0] : -# 661| mu661_3(void *) = Store : &:r661_1, r661_2 +# 661| mu661_3(void *) = Store[?] : &:r661_1, r661_2 # 662| r662_1(glval) = FieldAddress[m_f] : mu658_5 # 662| r662_2(glval) = FunctionAddress[String] : # 662| r662_3(glval) = StringConstant["test"] : @@ -3650,13 +3650,13 @@ ir.cpp: # 675| mu675_3(unknown) = InitializeNonLocal : # 675| r675_4(glval) = VariableAddress[r] : # 675| mu675_5(int &) = InitializeParameter[r] : &:r675_4 -# 675| r675_6(int &) = Load : &:r675_4, ~m? +# 675| r675_6(int &) = Load[r] : &:r675_4, ~m? # 675| mu675_7(unknown) = InitializeIndirection[r] : &:r675_6 # 676| r676_1(glval) = VariableAddress[#return] : # 676| r676_2(glval) = VariableAddress[r] : -# 676| r676_3(int &) = Load : &:r676_2, ~m? -# 676| r676_4(int) = Load : &:r676_3, ~m? -# 676| mu676_5(int) = Store : &:r676_1, r676_4 +# 676| r676_3(int &) = Load[r] : &:r676_2, ~m? +# 676| r676_4(int) = Load[?] : &:r676_3, ~m? +# 676| mu676_5(int) = Store[#return] : &:r676_1, r676_4 # 675| v675_8(void) = ReturnIndirection[r] : &:r675_6, ~m? # 675| r675_9(glval) = VariableAddress[#return] : # 675| v675_10(void) = ReturnValue : &:r675_9, ~m? @@ -3671,7 +3671,7 @@ ir.cpp: # 680| r680_1(glval) = VariableAddress[#return] : # 680| r680_2(glval) = VariableAddress[g] : # 680| r680_3(int &) = CopyValue : r680_2 -# 680| mu680_4(int &) = Store : &:r680_1, r680_3 +# 680| mu680_4(int &) = Store[#return] : &:r680_1, r680_3 # 679| r679_4(glval) = VariableAddress[#return] : # 679| v679_5(void) = ReturnValue : &:r679_4, ~m? # 679| v679_6(void) = AliasedUse : ~m? @@ -3687,13 +3687,13 @@ ir.cpp: # 686| r686_1(glval) = VariableAddress[r] : # 686| r686_2(glval) = VariableAddress[x] : # 686| r686_3(int &) = CopyValue : r686_2 -# 686| mu686_4(int &) = Store : &:r686_1, r686_3 +# 686| mu686_4(int &) = Store[r] : &:r686_1, r686_3 # 687| r687_1(glval) = VariableAddress[r2] : # 687| r687_2(glval) = VariableAddress[r] : -# 687| r687_3(int &) = Load : &:r687_2, ~m? +# 687| r687_3(int &) = Load[r] : &:r687_2, ~m? # 687| r687_4(glval) = CopyValue : r687_3 # 687| r687_5(int &) = CopyValue : r687_4 -# 687| mu687_6(int &) = Store : &:r687_1, r687_5 +# 687| mu687_6(int &) = Store[r2] : &:r687_1, r687_5 # 688| r688_1(glval) = VariableAddress[r3] : # 688| r688_2(glval) = FunctionAddress[ReturnReference] : # 688| r688_3(String &) = Call[ReturnReference] : func:r688_2 @@ -3701,7 +3701,7 @@ ir.cpp: # 688| r688_5(glval) = CopyValue : r688_3 # 688| r688_6(glval) = Convert : r688_5 # 688| r688_7(String &) = CopyValue : r688_6 -# 688| mu688_8(String &) = Store : &:r688_1, r688_7 +# 688| mu688_8(String &) = Store[r3] : &:r688_1, r688_7 # 689| v689_1(void) = NoOp : # 685| v685_6(void) = ReturnVoid : # 685| v685_7(void) = AliasedUse : ~m? @@ -3717,16 +3717,16 @@ ir.cpp: # 693| r693_1(glval) = VariableAddress[ra] : # 693| r693_2(glval) = VariableAddress[a] : # 693| r693_3(int(&)[10]) = CopyValue : r693_2 -# 693| mu693_4(int(&)[10]) = Store : &:r693_1, r693_3 +# 693| mu693_4(int(&)[10]) = Store[ra] : &:r693_1, r693_3 # 694| r694_1(glval) = VariableAddress[x] : # 694| r694_2(glval) = VariableAddress[ra] : -# 694| r694_3(int(&)[10]) = Load : &:r694_2, ~m? +# 694| r694_3(int(&)[10]) = Load[ra] : &:r694_2, ~m? # 694| r694_4(glval) = CopyValue : r694_3 # 694| r694_5(int *) = Convert : r694_4 # 694| r694_6(int) = Constant[5] : # 694| r694_7(glval) = PointerAdd[4] : r694_5, r694_6 -# 694| r694_8(int) = Load : &:r694_7, ~m? -# 694| mu694_9(int) = Store : &:r694_1, r694_8 +# 694| r694_8(int) = Load[?] : &:r694_7, ~m? +# 694| mu694_9(int) = Store[x] : &:r694_1, r694_8 # 695| v695_1(void) = NoOp : # 691| v691_4(void) = ReturnVoid : # 691| v691_5(void) = AliasedUse : ~m? @@ -3740,14 +3740,14 @@ ir.cpp: # 698| r698_1(glval<..(&)(..)>) = VariableAddress[rfn] : # 698| r698_2(glval<..()(..)>) = FunctionAddress[FuncPtrTarget] : # 698| r698_3(..(&)(..)) = CopyValue : r698_2 -# 698| mu698_4(..(&)(..)) = Store : &:r698_1, r698_3 +# 698| mu698_4(..(&)(..)) = Store[rfn] : &:r698_1, r698_3 # 699| r699_1(glval<..(*)(..)>) = VariableAddress[pfn] : # 699| r699_2(glval<..(&)(..)>) = VariableAddress[rfn] : -# 699| r699_3(..(&)(..)) = Load : &:r699_2, ~m? +# 699| r699_3(..(&)(..)) = Load[rfn] : &:r699_2, ~m? # 699| r699_4(..(*)(..)) = CopyValue : r699_3 -# 699| mu699_5(..(*)(..)) = Store : &:r699_1, r699_4 +# 699| mu699_5(..(*)(..)) = Store[pfn] : &:r699_1, r699_4 # 700| r700_1(glval<..(&)(..)>) = VariableAddress[rfn] : -# 700| r700_2(..(&)(..)) = Load : &:r700_1, ~m? +# 700| r700_2(..(&)(..)) = Load[rfn] : &:r700_1, ~m? # 700| r700_3(..(*)(..)) = CopyValue : r700_2 # 700| r700_4(int) = Constant[5] : # 700| r700_5(int) = Call[?] : func:r700_3, 0:r700_4 @@ -3768,9 +3768,9 @@ ir.cpp: # 704| mu704_7(int) = InitializeParameter[y] : &:r704_6 # 705| r705_1(glval) = VariableAddress[#return] : # 705| r705_2(glval) = VariableAddress[x] : -# 705| r705_3(int) = Load : &:r705_2, ~m? +# 705| r705_3(int) = Load[x] : &:r705_2, ~m? # 705| r705_4(glval) = VariableAddress[y] : -# 705| r705_5(int) = Load : &:r705_4, ~m? +# 705| r705_5(int) = Load[y] : &:r705_4, ~m? # 705| r705_6(bool) = CompareLT : r705_3, r705_5 # 705| v705_7(void) = ConditionalBranch : r705_6 #-----| False -> Block 2 @@ -3778,22 +3778,22 @@ ir.cpp: # 705| Block 1 # 705| r705_8(glval) = VariableAddress[x] : -# 705| r705_9(int) = Load : &:r705_8, ~m? +# 705| r705_9(int) = Load[x] : &:r705_8, ~m? # 705| r705_10(glval) = VariableAddress[#temp705:10] : -# 705| mu705_11(int) = Store : &:r705_10, r705_9 +# 705| mu705_11(int) = Store[#temp705:10] : &:r705_10, r705_9 #-----| Goto -> Block 3 # 705| Block 2 # 705| r705_12(glval) = VariableAddress[y] : -# 705| r705_13(int) = Load : &:r705_12, ~m? +# 705| r705_13(int) = Load[y] : &:r705_12, ~m? # 705| r705_14(glval) = VariableAddress[#temp705:10] : -# 705| mu705_15(int) = Store : &:r705_14, r705_13 +# 705| mu705_15(int) = Store[#temp705:10] : &:r705_14, r705_13 #-----| Goto -> Block 3 # 705| Block 3 # 705| r705_16(glval) = VariableAddress[#temp705:10] : -# 705| r705_17(int) = Load : &:r705_16, ~m? -# 705| mu705_18(int) = Store : &:r705_1, r705_17 +# 705| r705_17(int) = Load[#temp705:10] : &:r705_16, ~m? +# 705| mu705_18(int) = Store[#return] : &:r705_1, r705_17 # 704| r704_8(glval) = VariableAddress[#return] : # 704| v704_9(void) = ReturnValue : &:r704_8, ~m? # 704| v704_10(void) = AliasedUse : ~m? @@ -3811,12 +3811,12 @@ ir.cpp: # 709| r709_1(glval) = VariableAddress[#return] : # 709| r709_2(glval) = FunctionAddress[min] : # 709| r709_3(glval) = VariableAddress[x] : -# 709| r709_4(int) = Load : &:r709_3, ~m? +# 709| r709_4(int) = Load[x] : &:r709_3, ~m? # 709| r709_5(glval) = VariableAddress[y] : -# 709| r709_6(int) = Load : &:r709_5, ~m? +# 709| r709_6(int) = Load[y] : &:r709_5, ~m? # 709| r709_7(int) = Call[min] : func:r709_2, 0:r709_4, 1:r709_6 # 709| mu709_8(unknown) = ^CallSideEffect : ~m? -# 709| mu709_9(int) = Store : &:r709_1, r709_7 +# 709| mu709_9(int) = Store[#return] : &:r709_1, r709_7 # 708| r708_8(glval) = VariableAddress[#return] : # 708| v708_9(void) = ReturnValue : &:r708_8, ~m? # 708| v708_10(void) = AliasedUse : ~m? @@ -3829,13 +3829,13 @@ ir.cpp: # 715| mu715_3(unknown) = InitializeNonLocal : # 715| r715_4(glval) = VariableAddress[x] : # 715| mu715_5(void *) = InitializeParameter[x] : &:r715_4 -# 715| r715_6(void *) = Load : &:r715_4, ~m? +# 715| r715_6(void *) = Load[x] : &:r715_4, ~m? # 715| mu715_7(unknown) = InitializeIndirection[x] : &:r715_6 # 715| r715_8(glval) = VariableAddress[y] : # 715| mu715_9(char) = InitializeParameter[y] : &:r715_8 # 716| r716_1(glval) = VariableAddress[#return] : # 716| r716_2(long) = Constant[0] : -# 716| mu716_3(long) = Store : &:r716_1, r716_2 +# 716| mu716_3(long) = Store[#return] : &:r716_1, r716_2 # 715| v715_10(void) = ReturnIndirection[x] : &:r715_6, ~m? # 715| r715_11(glval) = VariableAddress[#return] : # 715| v715_12(void) = ReturnValue : &:r715_11, ~m? @@ -3856,7 +3856,7 @@ ir.cpp: # 721| v721_7(void) = ^BufferReadSideEffect[0] : &:r721_3, ~m? # 721| mu721_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r721_3 # 721| r721_9(double) = Convert : r721_5 -# 721| mu721_10(double) = Store : &:r721_1, r721_9 +# 721| mu721_10(double) = Store[#return] : &:r721_1, r721_9 # 720| r720_4(glval) = VariableAddress[#return] : # 720| v720_5(void) = ReturnValue : &:r720_4, ~m? # 720| v720_6(void) = AliasedUse : ~m? @@ -3871,9 +3871,9 @@ ir.cpp: # 724| mu724_5(bool) = InitializeParameter[b] : &:r724_4 # 726| r726_1(glval) = VariableAddress[x] : # 726| r726_2(int) = Constant[5] : -# 726| mu726_3(int) = Store : &:r726_1, r726_2 +# 726| mu726_3(int) = Store[x] : &:r726_1, r726_2 # 727| r727_1(glval) = VariableAddress[b] : -# 727| r727_2(bool) = Load : &:r727_1, ~m? +# 727| r727_2(bool) = Load[b] : &:r727_1, ~m? # 727| v727_3(void) = ConditionalBranch : r727_2 #-----| False -> Block 4 #-----| True -> Block 3 @@ -3890,13 +3890,13 @@ ir.cpp: # 728| r728_1(glval) = VariableAddress[#throw728:7] : # 728| r728_2(glval) = StringConstant["string literal"] : # 728| r728_3(char *) = Convert : r728_2 -# 728| mu728_4(char *) = Store : &:r728_1, r728_3 +# 728| mu728_4(char *) = Store[#throw728:7] : &:r728_1, r728_3 # 728| v728_5(void) = ThrowValue : &:r728_1, ~m? #-----| Exception -> Block 9 # 730| Block 4 # 730| r730_1(glval) = VariableAddress[x] : -# 730| r730_2(int) = Load : &:r730_1, ~m? +# 730| r730_2(int) = Load[x] : &:r730_1, ~m? # 730| r730_3(int) = Constant[2] : # 730| r730_4(bool) = CompareLT : r730_2, r730_3 # 730| v730_5(void) = ConditionalBranch : r730_4 @@ -3905,7 +3905,7 @@ ir.cpp: # 731| Block 5 # 731| r731_1(glval) = VariableAddress[b] : -# 731| r731_2(bool) = Load : &:r731_1, ~m? +# 731| r731_2(bool) = Load[b] : &:r731_1, ~m? # 731| v731_3(void) = ConditionalBranch : r731_2 #-----| False -> Block 7 #-----| True -> Block 6 @@ -3913,11 +3913,11 @@ ir.cpp: # 731| Block 6 # 731| r731_4(int) = Constant[7] : # 731| r731_5(glval) = VariableAddress[#temp731:11] : -# 731| mu731_6(int) = Store : &:r731_5, r731_4 +# 731| mu731_6(int) = Store[#temp731:11] : &:r731_5, r731_4 # 731| r731_7(glval) = VariableAddress[#temp731:11] : -# 731| r731_8(int) = Load : &:r731_7, ~m? +# 731| r731_8(int) = Load[#temp731:11] : &:r731_7, ~m? # 731| r731_9(glval) = VariableAddress[x] : -# 731| mu731_10(int) = Store : &:r731_9, r731_8 +# 731| mu731_10(int) = Store[x] : &:r731_9, r731_8 #-----| Goto -> Block 8 # 731| Block 7 @@ -3937,7 +3937,7 @@ ir.cpp: # 733| Block 8 # 733| r733_1(int) = Constant[7] : # 733| r733_2(glval) = VariableAddress[x] : -# 733| mu733_3(int) = Store : &:r733_2, r733_1 +# 733| mu733_3(int) = Store[x] : &:r733_2, r733_1 #-----| Goto -> Block 14 # 735| Block 9 @@ -3948,13 +3948,13 @@ ir.cpp: # 735| Block 10 # 735| r735_2(glval) = VariableAddress[s] : # 735| mu735_3(char *) = InitializeParameter[s] : &:r735_2 -# 735| r735_4(char *) = Load : &:r735_2, ~m? +# 735| r735_4(char *) = Load[s] : &:r735_2, ~m? # 735| mu735_5(unknown) = InitializeIndirection[s] : &:r735_4 # 736| r736_1(glval) = VariableAddress[#throw736:5] : # 736| mu736_2(String) = Uninitialized[#throw736:5] : &:r736_1 # 736| r736_3(glval) = FunctionAddress[String] : # 736| r736_4(glval) = VariableAddress[s] : -# 736| r736_5(char *) = Load : &:r736_4, ~m? +# 736| r736_5(char *) = Load[s] : &:r736_4, ~m? # 736| v736_6(void) = Call[String] : func:r736_3, this:r736_1, 0:r736_5 # 736| mu736_7(unknown) = ^CallSideEffect : ~m? # 736| mu736_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r736_1 @@ -3971,7 +3971,7 @@ ir.cpp: # 738| Block 12 # 738| r738_2(glval) = VariableAddress[e] : # 738| mu738_3(String &) = InitializeParameter[e] : &:r738_2 -# 738| r738_4(String &) = Load : &:r738_2, ~m? +# 738| r738_4(String &) = Load[e] : &:r738_2, ~m? # 738| mu738_5(unknown) = InitializeIndirection[e] : &:r738_4 # 738| v738_6(void) = NoOp : #-----| Goto -> Block 14 @@ -3993,19 +3993,19 @@ ir.cpp: # 745| mu745_3(unknown) = InitializeNonLocal : # 745| r745_4(glval) = VariableAddress[#this] : # 745| mu745_5(glval) = InitializeParameter[#this] : &:r745_4 -# 745| r745_6(glval) = Load : &:r745_4, ~m? +# 745| r745_6(glval) = Load[#this] : &:r745_4, ~m? # 745| mu745_7(Base) = InitializeIndirection[#this] : &:r745_6 #-----| r0_1(glval) = VariableAddress[p#0] : #-----| mu0_2(Base &) = InitializeParameter[p#0] : &:r0_1 -#-----| r0_3(Base &) = Load : &:r0_1, ~m? +#-----| r0_3(Base &) = Load[p#0] : &:r0_1, ~m? #-----| mu0_4(unknown) = InitializeIndirection[p#0] : &:r0_3 # 745| r745_8(glval) = VariableAddress[#this] : -# 745| r745_9(Base *) = Load : &:r745_8, ~m? +# 745| r745_9(Base *) = Load[#this] : &:r745_8, ~m? # 745| r745_10(glval) = FieldAddress[base_s] : r745_9 # 745| r745_11(String *) = CopyValue : r745_10 # 745| r745_12(glval) = FunctionAddress[operator=] : # 745| r745_13(glval) = VariableAddress[p#0] : -# 745| r745_14(Base &) = Load : &:r745_13, ~m? +# 745| r745_14(Base &) = Load[p#0] : &:r745_13, ~m? #-----| r0_5(glval) = CopyValue : r745_14 # 745| r745_15(glval) = FieldAddress[base_s] : r0_5 #-----| r0_6(String &) = CopyValue : r745_15 @@ -4018,10 +4018,10 @@ ir.cpp: #-----| r0_9(glval) = CopyValue : r745_16 #-----| r0_10(glval) = VariableAddress[#return] : #-----| r0_11(glval) = VariableAddress[#this] : -#-----| r0_12(Base *) = Load : &:r0_11, ~m? +#-----| r0_12(Base *) = Load[#this] : &:r0_11, ~m? #-----| r0_13(glval) = CopyValue : r0_12 #-----| r0_14(Base &) = CopyValue : r0_13 -#-----| mu0_15(Base &) = Store : &:r0_10, r0_14 +#-----| mu0_15(Base &) = Store[#return] : &:r0_10, r0_14 # 745| v745_20(void) = ReturnIndirection[#this] : &:r745_6, ~m? #-----| v0_16(void) = ReturnIndirection[p#0] : &:r0_3, ~m? # 745| r745_21(glval) = VariableAddress[#return] : @@ -4036,11 +4036,11 @@ ir.cpp: # 745| mu745_3(unknown) = InitializeNonLocal : # 745| r745_4(glval) = VariableAddress[#this] : # 745| mu745_5(glval) = InitializeParameter[#this] : &:r745_4 -# 745| r745_6(glval) = Load : &:r745_4, ~m? +# 745| r745_6(glval) = Load[#this] : &:r745_4, ~m? # 745| mu745_7(Base) = InitializeIndirection[#this] : &:r745_6 #-----| r0_1(glval) = VariableAddress[p#0] : #-----| mu0_2(Base &) = InitializeParameter[p#0] : &:r0_1 -#-----| r0_3(Base &) = Load : &:r0_1, ~m? +#-----| r0_3(Base &) = Load[p#0] : &:r0_1, ~m? #-----| mu0_4(unknown) = InitializeIndirection[p#0] : &:r0_3 # 745| r745_8(glval) = FieldAddress[base_s] : mu745_5 # 745| r745_9(glval) = FunctionAddress[String] : @@ -4061,7 +4061,7 @@ ir.cpp: # 748| mu748_3(unknown) = InitializeNonLocal : # 748| r748_4(glval) = VariableAddress[#this] : # 748| mu748_5(glval) = InitializeParameter[#this] : &:r748_4 -# 748| r748_6(glval) = Load : &:r748_4, ~m? +# 748| r748_6(glval) = Load[#this] : &:r748_4, ~m? # 748| mu748_7(Base) = InitializeIndirection[#this] : &:r748_6 # 748| r748_8(glval) = FieldAddress[base_s] : mu748_5 # 748| r748_9(glval) = FunctionAddress[String] : @@ -4081,7 +4081,7 @@ ir.cpp: # 750| mu750_3(unknown) = InitializeNonLocal : # 750| r750_4(glval) = VariableAddress[#this] : # 750| mu750_5(glval) = InitializeParameter[#this] : &:r750_4 -# 750| r750_6(glval) = Load : &:r750_4, ~m? +# 750| r750_6(glval) = Load[#this] : &:r750_4, ~m? # 750| mu750_7(Base) = InitializeIndirection[#this] : &:r750_6 # 751| v751_1(void) = NoOp : # 751| r751_2(glval) = FieldAddress[base_s] : mu750_5 @@ -4100,18 +4100,18 @@ ir.cpp: # 754| mu754_3(unknown) = InitializeNonLocal : # 754| r754_4(glval) = VariableAddress[#this] : # 754| mu754_5(glval) = InitializeParameter[#this] : &:r754_4 -# 754| r754_6(glval) = Load : &:r754_4, ~m? +# 754| r754_6(glval) = Load[#this] : &:r754_4, ~m? # 754| mu754_7(Middle) = InitializeIndirection[#this] : &:r754_6 #-----| r0_1(glval) = VariableAddress[p#0] : #-----| mu0_2(Middle &) = InitializeParameter[p#0] : &:r0_1 -#-----| r0_3(Middle &) = Load : &:r0_1, ~m? +#-----| r0_3(Middle &) = Load[p#0] : &:r0_1, ~m? #-----| mu0_4(unknown) = InitializeIndirection[p#0] : &:r0_3 # 754| r754_8(glval) = VariableAddress[#this] : -# 754| r754_9(Middle *) = Load : &:r754_8, ~m? +# 754| r754_9(Middle *) = Load[#this] : &:r754_8, ~m? #-----| r0_5(Base *) = ConvertToNonVirtualBase[Middle : Base] : r754_9 # 754| r754_10(glval) = FunctionAddress[operator=] : # 754| r754_11(glval) = VariableAddress[p#0] : -# 754| r754_12(Middle &) = Load : &:r754_11, ~m? +# 754| r754_12(Middle &) = Load[p#0] : &:r754_11, ~m? #-----| r0_6(glval) = CopyValue : r754_12 # 754| r754_13(Middle *) = CopyValue : r0_6 #-----| r0_7(Base *) = ConvertToNonVirtualBase[Middle : Base] : r754_13 @@ -4125,12 +4125,12 @@ ir.cpp: #-----| mu0_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_8 #-----| r0_13(glval) = CopyValue : r754_15 # 754| r754_17(glval) = VariableAddress[#this] : -# 754| r754_18(Middle *) = Load : &:r754_17, ~m? +# 754| r754_18(Middle *) = Load[#this] : &:r754_17, ~m? # 754| r754_19(glval) = FieldAddress[middle_s] : r754_18 # 754| r754_20(String *) = CopyValue : r754_19 # 754| r754_21(glval) = FunctionAddress[operator=] : # 754| r754_22(glval) = VariableAddress[p#0] : -# 754| r754_23(Middle &) = Load : &:r754_22, ~m? +# 754| r754_23(Middle &) = Load[p#0] : &:r754_22, ~m? #-----| r0_14(glval) = CopyValue : r754_23 # 754| r754_24(glval) = FieldAddress[middle_s] : r0_14 #-----| r0_15(String &) = CopyValue : r754_24 @@ -4143,10 +4143,10 @@ ir.cpp: #-----| r0_18(glval) = CopyValue : r754_25 #-----| r0_19(glval) = VariableAddress[#return] : #-----| r0_20(glval) = VariableAddress[#this] : -#-----| r0_21(Middle *) = Load : &:r0_20, ~m? +#-----| r0_21(Middle *) = Load[#this] : &:r0_20, ~m? #-----| r0_22(glval) = CopyValue : r0_21 #-----| r0_23(Middle &) = CopyValue : r0_22 -#-----| mu0_24(Middle &) = Store : &:r0_19, r0_23 +#-----| mu0_24(Middle &) = Store[#return] : &:r0_19, r0_23 # 754| v754_29(void) = ReturnIndirection[#this] : &:r754_6, ~m? #-----| v0_25(void) = ReturnIndirection[p#0] : &:r0_3, ~m? # 754| r754_30(glval) = VariableAddress[#return] : @@ -4161,7 +4161,7 @@ ir.cpp: # 757| mu757_3(unknown) = InitializeNonLocal : # 757| r757_4(glval) = VariableAddress[#this] : # 757| mu757_5(glval) = InitializeParameter[#this] : &:r757_4 -# 757| r757_6(glval) = Load : &:r757_4, ~m? +# 757| r757_6(glval) = Load[#this] : &:r757_4, ~m? # 757| mu757_7(Middle) = InitializeIndirection[#this] : &:r757_6 # 757| r757_8(glval) = ConvertToNonVirtualBase[Middle : Base] : mu757_5 # 757| r757_9(glval) = FunctionAddress[Base] : @@ -4186,7 +4186,7 @@ ir.cpp: # 759| mu759_3(unknown) = InitializeNonLocal : # 759| r759_4(glval) = VariableAddress[#this] : # 759| mu759_5(glval) = InitializeParameter[#this] : &:r759_4 -# 759| r759_6(glval) = Load : &:r759_4, ~m? +# 759| r759_6(glval) = Load[#this] : &:r759_4, ~m? # 759| mu759_7(Middle) = InitializeIndirection[#this] : &:r759_6 # 760| v760_1(void) = NoOp : # 760| r760_2(glval) = FieldAddress[middle_s] : mu759_5 @@ -4209,18 +4209,18 @@ ir.cpp: # 763| mu763_3(unknown) = InitializeNonLocal : # 763| r763_4(glval) = VariableAddress[#this] : # 763| mu763_5(glval) = InitializeParameter[#this] : &:r763_4 -# 763| r763_6(glval) = Load : &:r763_4, ~m? +# 763| r763_6(glval) = Load[#this] : &:r763_4, ~m? # 763| mu763_7(Derived) = InitializeIndirection[#this] : &:r763_6 #-----| r0_1(glval) = VariableAddress[p#0] : #-----| mu0_2(Derived &) = InitializeParameter[p#0] : &:r0_1 -#-----| r0_3(Derived &) = Load : &:r0_1, ~m? +#-----| r0_3(Derived &) = Load[p#0] : &:r0_1, ~m? #-----| mu0_4(unknown) = InitializeIndirection[p#0] : &:r0_3 # 763| r763_8(glval) = VariableAddress[#this] : -# 763| r763_9(Derived *) = Load : &:r763_8, ~m? +# 763| r763_9(Derived *) = Load[#this] : &:r763_8, ~m? #-----| r0_5(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r763_9 # 763| r763_10(glval) = FunctionAddress[operator=] : # 763| r763_11(glval) = VariableAddress[p#0] : -# 763| r763_12(Derived &) = Load : &:r763_11, ~m? +# 763| r763_12(Derived &) = Load[p#0] : &:r763_11, ~m? #-----| r0_6(glval) = CopyValue : r763_12 # 763| r763_13(Derived *) = CopyValue : r0_6 #-----| r0_7(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r763_13 @@ -4234,12 +4234,12 @@ ir.cpp: #-----| mu0_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_8 #-----| r0_13(glval) = CopyValue : r763_15 # 763| r763_17(glval) = VariableAddress[#this] : -# 763| r763_18(Derived *) = Load : &:r763_17, ~m? +# 763| r763_18(Derived *) = Load[#this] : &:r763_17, ~m? # 763| r763_19(glval) = FieldAddress[derived_s] : r763_18 # 763| r763_20(String *) = CopyValue : r763_19 # 763| r763_21(glval) = FunctionAddress[operator=] : # 763| r763_22(glval) = VariableAddress[p#0] : -# 763| r763_23(Derived &) = Load : &:r763_22, ~m? +# 763| r763_23(Derived &) = Load[p#0] : &:r763_22, ~m? #-----| r0_14(glval) = CopyValue : r763_23 # 763| r763_24(glval) = FieldAddress[derived_s] : r0_14 #-----| r0_15(String &) = CopyValue : r763_24 @@ -4252,10 +4252,10 @@ ir.cpp: #-----| r0_18(glval) = CopyValue : r763_25 #-----| r0_19(glval) = VariableAddress[#return] : #-----| r0_20(glval) = VariableAddress[#this] : -#-----| r0_21(Derived *) = Load : &:r0_20, ~m? +#-----| r0_21(Derived *) = Load[#this] : &:r0_20, ~m? #-----| r0_22(glval) = CopyValue : r0_21 #-----| r0_23(Derived &) = CopyValue : r0_22 -#-----| mu0_24(Derived &) = Store : &:r0_19, r0_23 +#-----| mu0_24(Derived &) = Store[#return] : &:r0_19, r0_23 # 763| v763_29(void) = ReturnIndirection[#this] : &:r763_6, ~m? #-----| v0_25(void) = ReturnIndirection[p#0] : &:r0_3, ~m? # 763| r763_30(glval) = VariableAddress[#return] : @@ -4270,7 +4270,7 @@ ir.cpp: # 766| mu766_3(unknown) = InitializeNonLocal : # 766| r766_4(glval) = VariableAddress[#this] : # 766| mu766_5(glval) = InitializeParameter[#this] : &:r766_4 -# 766| r766_6(glval) = Load : &:r766_4, ~m? +# 766| r766_6(glval) = Load[#this] : &:r766_4, ~m? # 766| mu766_7(Derived) = InitializeIndirection[#this] : &:r766_6 # 766| r766_8(glval) = ConvertToNonVirtualBase[Derived : Middle] : mu766_5 # 766| r766_9(glval) = FunctionAddress[Middle] : @@ -4295,7 +4295,7 @@ ir.cpp: # 768| mu768_3(unknown) = InitializeNonLocal : # 768| r768_4(glval) = VariableAddress[#this] : # 768| mu768_5(glval) = InitializeParameter[#this] : &:r768_4 -# 768| r768_6(glval) = Load : &:r768_4, ~m? +# 768| r768_6(glval) = Load[#this] : &:r768_4, ~m? # 768| mu768_7(Derived) = InitializeIndirection[#this] : &:r768_6 # 769| v769_1(void) = NoOp : # 769| r769_2(glval) = FieldAddress[derived_s] : mu768_5 @@ -4318,7 +4318,7 @@ ir.cpp: # 775| mu775_3(unknown) = InitializeNonLocal : # 775| r775_4(glval) = VariableAddress[#this] : # 775| mu775_5(glval) = InitializeParameter[#this] : &:r775_4 -# 775| r775_6(glval) = Load : &:r775_4, ~m? +# 775| r775_6(glval) = Load[#this] : &:r775_4, ~m? # 775| mu775_7(MiddleVB1) = InitializeIndirection[#this] : &:r775_6 # 775| r775_8(glval) = ConvertToNonVirtualBase[MiddleVB1 : Base] : mu775_5 # 775| r775_9(glval) = FunctionAddress[Base] : @@ -4343,7 +4343,7 @@ ir.cpp: # 777| mu777_3(unknown) = InitializeNonLocal : # 777| r777_4(glval) = VariableAddress[#this] : # 777| mu777_5(glval) = InitializeParameter[#this] : &:r777_4 -# 777| r777_6(glval) = Load : &:r777_4, ~m? +# 777| r777_6(glval) = Load[#this] : &:r777_4, ~m? # 777| mu777_7(MiddleVB1) = InitializeIndirection[#this] : &:r777_6 # 778| v778_1(void) = NoOp : # 778| r778_2(glval) = FieldAddress[middlevb1_s] : mu777_5 @@ -4366,7 +4366,7 @@ ir.cpp: # 784| mu784_3(unknown) = InitializeNonLocal : # 784| r784_4(glval) = VariableAddress[#this] : # 784| mu784_5(glval) = InitializeParameter[#this] : &:r784_4 -# 784| r784_6(glval) = Load : &:r784_4, ~m? +# 784| r784_6(glval) = Load[#this] : &:r784_4, ~m? # 784| mu784_7(MiddleVB2) = InitializeIndirection[#this] : &:r784_6 # 784| r784_8(glval) = ConvertToNonVirtualBase[MiddleVB2 : Base] : mu784_5 # 784| r784_9(glval) = FunctionAddress[Base] : @@ -4391,7 +4391,7 @@ ir.cpp: # 786| mu786_3(unknown) = InitializeNonLocal : # 786| r786_4(glval) = VariableAddress[#this] : # 786| mu786_5(glval) = InitializeParameter[#this] : &:r786_4 -# 786| r786_6(glval) = Load : &:r786_4, ~m? +# 786| r786_6(glval) = Load[#this] : &:r786_4, ~m? # 786| mu786_7(MiddleVB2) = InitializeIndirection[#this] : &:r786_6 # 787| v787_1(void) = NoOp : # 787| r787_2(glval) = FieldAddress[middlevb2_s] : mu786_5 @@ -4414,7 +4414,7 @@ ir.cpp: # 793| mu793_3(unknown) = InitializeNonLocal : # 793| r793_4(glval) = VariableAddress[#this] : # 793| mu793_5(glval) = InitializeParameter[#this] : &:r793_4 -# 793| r793_6(glval) = Load : &:r793_4, ~m? +# 793| r793_6(glval) = Load[#this] : &:r793_4, ~m? # 793| mu793_7(DerivedVB) = InitializeIndirection[#this] : &:r793_6 # 793| r793_8(glval) = ConvertToNonVirtualBase[DerivedVB : Base] : mu793_5 # 793| r793_9(glval) = FunctionAddress[Base] : @@ -4449,7 +4449,7 @@ ir.cpp: # 795| mu795_3(unknown) = InitializeNonLocal : # 795| r795_4(glval) = VariableAddress[#this] : # 795| mu795_5(glval) = InitializeParameter[#this] : &:r795_4 -# 795| r795_6(glval) = Load : &:r795_4, ~m? +# 795| r795_6(glval) = Load[#this] : &:r795_4, ~m? # 795| mu795_7(DerivedVB) = InitializeIndirection[#this] : &:r795_6 # 796| v796_1(void) = NoOp : # 796| r796_2(glval) = FieldAddress[derivedvb_s] : mu795_5 @@ -4499,15 +4499,15 @@ ir.cpp: # 804| r804_1(glval) = VariableAddress[pb] : # 804| r804_2(glval) = VariableAddress[b] : # 804| r804_3(Base *) = CopyValue : r804_2 -# 804| mu804_4(Base *) = Store : &:r804_1, r804_3 +# 804| mu804_4(Base *) = Store[pb] : &:r804_1, r804_3 # 805| r805_1(glval) = VariableAddress[pm] : # 805| r805_2(glval) = VariableAddress[m] : # 805| r805_3(Middle *) = CopyValue : r805_2 -# 805| mu805_4(Middle *) = Store : &:r805_1, r805_3 +# 805| mu805_4(Middle *) = Store[pm] : &:r805_1, r805_3 # 806| r806_1(glval) = VariableAddress[pd] : # 806| r806_2(glval) = VariableAddress[d] : # 806| r806_3(Derived *) = CopyValue : r806_2 -# 806| mu806_4(Derived *) = Store : &:r806_1, r806_3 +# 806| mu806_4(Derived *) = Store[pd] : &:r806_1, r806_3 # 808| r808_1(glval) = VariableAddress[b] : # 808| r808_2(glval) = FunctionAddress[operator=] : # 808| r808_3(glval) = VariableAddress[m] : @@ -4565,25 +4565,25 @@ ir.cpp: # 810| mu810_21(unknown) = ^BufferMayWriteSideEffect[0] : &:r810_15 # 810| r810_22(glval) = CopyValue : r810_16 # 811| r811_1(glval) = VariableAddress[pm] : -# 811| r811_2(Middle *) = Load : &:r811_1, ~m? +# 811| r811_2(Middle *) = Load[pm] : &:r811_1, ~m? # 811| r811_3(Base *) = ConvertToNonVirtualBase[Middle : Base] : r811_2 # 811| r811_4(glval) = VariableAddress[pb] : -# 811| mu811_5(Base *) = Store : &:r811_4, r811_3 +# 811| mu811_5(Base *) = Store[pb] : &:r811_4, r811_3 # 812| r812_1(glval) = VariableAddress[pm] : -# 812| r812_2(Middle *) = Load : &:r812_1, ~m? +# 812| r812_2(Middle *) = Load[pm] : &:r812_1, ~m? # 812| r812_3(Base *) = ConvertToNonVirtualBase[Middle : Base] : r812_2 # 812| r812_4(glval) = VariableAddress[pb] : -# 812| mu812_5(Base *) = Store : &:r812_4, r812_3 +# 812| mu812_5(Base *) = Store[pb] : &:r812_4, r812_3 # 813| r813_1(glval) = VariableAddress[pm] : -# 813| r813_2(Middle *) = Load : &:r813_1, ~m? +# 813| r813_2(Middle *) = Load[pm] : &:r813_1, ~m? # 813| r813_3(Base *) = ConvertToNonVirtualBase[Middle : Base] : r813_2 # 813| r813_4(glval) = VariableAddress[pb] : -# 813| mu813_5(Base *) = Store : &:r813_4, r813_3 +# 813| mu813_5(Base *) = Store[pb] : &:r813_4, r813_3 # 814| r814_1(glval) = VariableAddress[pm] : -# 814| r814_2(Middle *) = Load : &:r814_1, ~m? +# 814| r814_2(Middle *) = Load[pm] : &:r814_1, ~m? # 814| r814_3(Base *) = Convert : r814_2 # 814| r814_4(glval) = VariableAddress[pb] : -# 814| mu814_5(Base *) = Store : &:r814_4, r814_3 +# 814| mu814_5(Base *) = Store[pb] : &:r814_4, r814_3 # 816| r816_1(glval) = VariableAddress[m] : # 816| r816_2(glval) = FunctionAddress[operator=] : # 816| r816_3(glval) = VariableAddress[b] : @@ -4611,20 +4611,20 @@ ir.cpp: # 817| mu817_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r817_6 # 817| r817_13(glval) = CopyValue : r817_7 # 818| r818_1(glval) = VariableAddress[pb] : -# 818| r818_2(Base *) = Load : &:r818_1, ~m? +# 818| r818_2(Base *) = Load[pb] : &:r818_1, ~m? # 818| r818_3(Middle *) = ConvertToDerived[Middle : Base] : r818_2 # 818| r818_4(glval) = VariableAddress[pm] : -# 818| mu818_5(Middle *) = Store : &:r818_4, r818_3 +# 818| mu818_5(Middle *) = Store[pm] : &:r818_4, r818_3 # 819| r819_1(glval) = VariableAddress[pb] : -# 819| r819_2(Base *) = Load : &:r819_1, ~m? +# 819| r819_2(Base *) = Load[pb] : &:r819_1, ~m? # 819| r819_3(Middle *) = ConvertToDerived[Middle : Base] : r819_2 # 819| r819_4(glval) = VariableAddress[pm] : -# 819| mu819_5(Middle *) = Store : &:r819_4, r819_3 +# 819| mu819_5(Middle *) = Store[pm] : &:r819_4, r819_3 # 820| r820_1(glval) = VariableAddress[pb] : -# 820| r820_2(Base *) = Load : &:r820_1, ~m? +# 820| r820_2(Base *) = Load[pb] : &:r820_1, ~m? # 820| r820_3(Middle *) = Convert : r820_2 # 820| r820_4(glval) = VariableAddress[pm] : -# 820| mu820_5(Middle *) = Store : &:r820_4, r820_3 +# 820| mu820_5(Middle *) = Store[pm] : &:r820_4, r820_3 # 822| r822_1(glval) = VariableAddress[b] : # 822| r822_2(glval) = FunctionAddress[operator=] : # 822| r822_3(glval) = VariableAddress[d] : @@ -4685,28 +4685,28 @@ ir.cpp: # 824| mu824_22(unknown) = ^BufferMayWriteSideEffect[0] : &:r824_16 # 824| r824_23(glval) = CopyValue : r824_17 # 825| r825_1(glval) = VariableAddress[pd] : -# 825| r825_2(Derived *) = Load : &:r825_1, ~m? +# 825| r825_2(Derived *) = Load[pd] : &:r825_1, ~m? # 825| r825_3(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r825_2 # 825| r825_4(Base *) = ConvertToNonVirtualBase[Middle : Base] : r825_3 # 825| r825_5(glval) = VariableAddress[pb] : -# 825| mu825_6(Base *) = Store : &:r825_5, r825_4 +# 825| mu825_6(Base *) = Store[pb] : &:r825_5, r825_4 # 826| r826_1(glval) = VariableAddress[pd] : -# 826| r826_2(Derived *) = Load : &:r826_1, ~m? +# 826| r826_2(Derived *) = Load[pd] : &:r826_1, ~m? # 826| r826_3(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r826_2 # 826| r826_4(Base *) = ConvertToNonVirtualBase[Middle : Base] : r826_3 # 826| r826_5(glval) = VariableAddress[pb] : -# 826| mu826_6(Base *) = Store : &:r826_5, r826_4 +# 826| mu826_6(Base *) = Store[pb] : &:r826_5, r826_4 # 827| r827_1(glval) = VariableAddress[pd] : -# 827| r827_2(Derived *) = Load : &:r827_1, ~m? +# 827| r827_2(Derived *) = Load[pd] : &:r827_1, ~m? # 827| r827_3(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r827_2 # 827| r827_4(Base *) = ConvertToNonVirtualBase[Middle : Base] : r827_3 # 827| r827_5(glval) = VariableAddress[pb] : -# 827| mu827_6(Base *) = Store : &:r827_5, r827_4 +# 827| mu827_6(Base *) = Store[pb] : &:r827_5, r827_4 # 828| r828_1(glval) = VariableAddress[pd] : -# 828| r828_2(Derived *) = Load : &:r828_1, ~m? +# 828| r828_2(Derived *) = Load[pd] : &:r828_1, ~m? # 828| r828_3(Base *) = Convert : r828_2 # 828| r828_4(glval) = VariableAddress[pb] : -# 828| mu828_5(Base *) = Store : &:r828_4, r828_3 +# 828| mu828_5(Base *) = Store[pb] : &:r828_4, r828_3 # 830| r830_1(glval) = VariableAddress[d] : # 830| r830_2(glval) = FunctionAddress[operator=] : # 830| r830_3(glval) = VariableAddress[b] : @@ -4736,38 +4736,38 @@ ir.cpp: # 831| mu831_13(unknown) = ^BufferMayWriteSideEffect[0] : &:r831_7 # 831| r831_14(glval) = CopyValue : r831_8 # 832| r832_1(glval) = VariableAddress[pb] : -# 832| r832_2(Base *) = Load : &:r832_1, ~m? +# 832| r832_2(Base *) = Load[pb] : &:r832_1, ~m? # 832| r832_3(Middle *) = ConvertToDerived[Middle : Base] : r832_2 # 832| r832_4(Derived *) = ConvertToDerived[Derived : Middle] : r832_3 # 832| r832_5(glval) = VariableAddress[pd] : -# 832| mu832_6(Derived *) = Store : &:r832_5, r832_4 +# 832| mu832_6(Derived *) = Store[pd] : &:r832_5, r832_4 # 833| r833_1(glval) = VariableAddress[pb] : -# 833| r833_2(Base *) = Load : &:r833_1, ~m? +# 833| r833_2(Base *) = Load[pb] : &:r833_1, ~m? # 833| r833_3(Middle *) = ConvertToDerived[Middle : Base] : r833_2 # 833| r833_4(Derived *) = ConvertToDerived[Derived : Middle] : r833_3 # 833| r833_5(glval) = VariableAddress[pd] : -# 833| mu833_6(Derived *) = Store : &:r833_5, r833_4 +# 833| mu833_6(Derived *) = Store[pd] : &:r833_5, r833_4 # 834| r834_1(glval) = VariableAddress[pb] : -# 834| r834_2(Base *) = Load : &:r834_1, ~m? +# 834| r834_2(Base *) = Load[pb] : &:r834_1, ~m? # 834| r834_3(Derived *) = Convert : r834_2 # 834| r834_4(glval) = VariableAddress[pd] : -# 834| mu834_5(Derived *) = Store : &:r834_4, r834_3 +# 834| mu834_5(Derived *) = Store[pd] : &:r834_4, r834_3 # 836| r836_1(glval) = VariableAddress[pmv] : # 836| r836_2(MiddleVB1 *) = Constant[0] : -# 836| mu836_3(MiddleVB1 *) = Store : &:r836_1, r836_2 +# 836| mu836_3(MiddleVB1 *) = Store[pmv] : &:r836_1, r836_2 # 837| r837_1(glval) = VariableAddress[pdv] : # 837| r837_2(DerivedVB *) = Constant[0] : -# 837| mu837_3(DerivedVB *) = Store : &:r837_1, r837_2 +# 837| mu837_3(DerivedVB *) = Store[pdv] : &:r837_1, r837_2 # 838| r838_1(glval) = VariableAddress[pmv] : -# 838| r838_2(MiddleVB1 *) = Load : &:r838_1, ~m? +# 838| r838_2(MiddleVB1 *) = Load[pmv] : &:r838_1, ~m? # 838| r838_3(Base *) = ConvertToVirtualBase[MiddleVB1 : Base] : r838_2 # 838| r838_4(glval) = VariableAddress[pb] : -# 838| mu838_5(Base *) = Store : &:r838_4, r838_3 +# 838| mu838_5(Base *) = Store[pb] : &:r838_4, r838_3 # 839| r839_1(glval) = VariableAddress[pdv] : -# 839| r839_2(DerivedVB *) = Load : &:r839_1, ~m? +# 839| r839_2(DerivedVB *) = Load[pdv] : &:r839_1, ~m? # 839| r839_3(Base *) = ConvertToVirtualBase[DerivedVB : Base] : r839_2 # 839| r839_4(glval) = VariableAddress[pb] : -# 839| mu839_5(Base *) = Store : &:r839_4, r839_3 +# 839| mu839_5(Base *) = Store[pb] : &:r839_4, r839_3 # 840| v840_1(void) = NoOp : # 799| v799_4(void) = ReturnVoid : # 799| v799_5(void) = AliasedUse : ~m? @@ -4780,7 +4780,7 @@ ir.cpp: # 842| mu842_3(unknown) = InitializeNonLocal : # 842| r842_4(glval) = VariableAddress[#this] : # 842| mu842_5(glval) = InitializeParameter[#this] : &:r842_4 -# 842| r842_6(glval) = Load : &:r842_4, ~m? +# 842| r842_6(glval) = Load[#this] : &:r842_4, ~m? # 842| mu842_7(PolymorphicBase) = InitializeIndirection[#this] : &:r842_6 # 842| v842_8(void) = NoOp : # 842| v842_9(void) = ReturnIndirection[#this] : &:r842_6, ~m? @@ -4795,7 +4795,7 @@ ir.cpp: # 846| mu846_3(unknown) = InitializeNonLocal : # 846| r846_4(glval) = VariableAddress[#this] : # 846| mu846_5(glval) = InitializeParameter[#this] : &:r846_4 -# 846| r846_6(glval) = Load : &:r846_4, ~m? +# 846| r846_6(glval) = Load[#this] : &:r846_4, ~m? # 846| mu846_7(PolymorphicDerived) = InitializeIndirection[#this] : &:r846_6 # 846| r846_8(glval) = ConvertToNonVirtualBase[PolymorphicDerived : PolymorphicBase] : mu846_5 # 846| r846_9(glval) = FunctionAddress[PolymorphicBase] : @@ -4815,7 +4815,7 @@ ir.cpp: # 846| mu846_3(unknown) = InitializeNonLocal : # 846| r846_4(glval) = VariableAddress[#this] : # 846| mu846_5(glval) = InitializeParameter[#this] : &:r846_4 -# 846| r846_6(glval) = Load : &:r846_4, ~m? +# 846| r846_6(glval) = Load[#this] : &:r846_4, ~m? # 846| mu846_7(PolymorphicDerived) = InitializeIndirection[#this] : &:r846_6 #-----| v0_1(void) = NoOp : # 846| r846_8(glval) = ConvertToNonVirtualBase[PolymorphicDerived : PolymorphicBase] : mu846_5 @@ -4847,41 +4847,41 @@ ir.cpp: # 853| r853_1(glval) = VariableAddress[pb] : # 853| r853_2(glval) = VariableAddress[b] : # 853| r853_3(PolymorphicBase *) = CopyValue : r853_2 -# 853| mu853_4(PolymorphicBase *) = Store : &:r853_1, r853_3 +# 853| mu853_4(PolymorphicBase *) = Store[pb] : &:r853_1, r853_3 # 854| r854_1(glval) = VariableAddress[pd] : # 854| r854_2(glval) = VariableAddress[d] : # 854| r854_3(PolymorphicDerived *) = CopyValue : r854_2 -# 854| mu854_4(PolymorphicDerived *) = Store : &:r854_1, r854_3 +# 854| mu854_4(PolymorphicDerived *) = Store[pd] : &:r854_1, r854_3 # 857| r857_1(glval) = VariableAddress[pd] : -# 857| r857_2(PolymorphicDerived *) = Load : &:r857_1, ~m? +# 857| r857_2(PolymorphicDerived *) = Load[pd] : &:r857_1, ~m? # 857| r857_3(PolymorphicBase *) = CheckedConvertOrNull : r857_2 # 857| r857_4(glval) = VariableAddress[pb] : -# 857| mu857_5(PolymorphicBase *) = Store : &:r857_4, r857_3 +# 857| mu857_5(PolymorphicBase *) = Store[pb] : &:r857_4, r857_3 # 858| r858_1(glval) = VariableAddress[rb] : # 858| r858_2(glval) = VariableAddress[d] : # 858| r858_3(glval) = CheckedConvertOrThrow : r858_2 # 858| r858_4(PolymorphicBase &) = CopyValue : r858_3 -# 858| mu858_5(PolymorphicBase &) = Store : &:r858_1, r858_4 +# 858| mu858_5(PolymorphicBase &) = Store[rb] : &:r858_1, r858_4 # 860| r860_1(glval) = VariableAddress[pb] : -# 860| r860_2(PolymorphicBase *) = Load : &:r860_1, ~m? +# 860| r860_2(PolymorphicBase *) = Load[pb] : &:r860_1, ~m? # 860| r860_3(PolymorphicDerived *) = CheckedConvertOrNull : r860_2 # 860| r860_4(glval) = VariableAddress[pd] : -# 860| mu860_5(PolymorphicDerived *) = Store : &:r860_4, r860_3 +# 860| mu860_5(PolymorphicDerived *) = Store[pd] : &:r860_4, r860_3 # 861| r861_1(glval) = VariableAddress[rd] : # 861| r861_2(glval) = VariableAddress[b] : # 861| r861_3(glval) = CheckedConvertOrThrow : r861_2 # 861| r861_4(PolymorphicDerived &) = CopyValue : r861_3 -# 861| mu861_5(PolymorphicDerived &) = Store : &:r861_1, r861_4 +# 861| mu861_5(PolymorphicDerived &) = Store[rd] : &:r861_1, r861_4 # 863| r863_1(glval) = VariableAddress[pv] : # 863| r863_2(glval) = VariableAddress[pb] : -# 863| r863_3(PolymorphicBase *) = Load : &:r863_2, ~m? +# 863| r863_3(PolymorphicBase *) = Load[pb] : &:r863_2, ~m? # 863| r863_4(void *) = CompleteObjectAddress : r863_3 -# 863| mu863_5(void *) = Store : &:r863_1, r863_4 +# 863| mu863_5(void *) = Store[pv] : &:r863_1, r863_4 # 864| r864_1(glval) = VariableAddress[pcv] : # 864| r864_2(glval) = VariableAddress[pd] : -# 864| r864_3(PolymorphicDerived *) = Load : &:r864_2, ~m? +# 864| r864_3(PolymorphicDerived *) = Load[pd] : &:r864_2, ~m? # 864| r864_4(void *) = CompleteObjectAddress : r864_3 -# 864| mu864_5(void *) = Store : &:r864_1, r864_4 +# 864| mu864_5(void *) = Store[pcv] : &:r864_1, r864_4 # 865| v865_1(void) = NoOp : # 849| v849_4(void) = ReturnVoid : # 849| v849_5(void) = AliasedUse : ~m? @@ -4894,7 +4894,7 @@ ir.cpp: # 867| mu867_3(unknown) = InitializeNonLocal : # 867| r867_4(glval) = VariableAddress[#this] : # 867| mu867_5(glval) = InitializeParameter[#this] : &:r867_4 -# 867| r867_6(glval) = Load : &:r867_4, ~m? +# 867| r867_6(glval) = Load[#this] : &:r867_4, ~m? # 867| mu867_7(String) = InitializeIndirection[#this] : &:r867_6 # 868| r868_1(glval) = FunctionAddress[String] : # 868| r868_2(glval) = StringConstant[""] : @@ -4921,11 +4921,11 @@ ir.cpp: # 873| r873_2(glval) = VariableAddress[a] : # 873| r873_3(char *) = Convert : r873_2 # 873| r873_4(char *) = Convert : r873_3 -# 873| mu873_5(char *) = Store : &:r873_1, r873_4 +# 873| mu873_5(char *) = Store[p] : &:r873_1, r873_4 # 874| r874_1(glval) = StringConstant["test"] : # 874| r874_2(char *) = Convert : r874_1 # 874| r874_3(glval) = VariableAddress[p] : -# 874| mu874_4(char *) = Store : &:r874_3, r874_2 +# 874| mu874_4(char *) = Store[p] : &:r874_3, r874_2 # 875| r875_1(glval) = VariableAddress[a] : # 875| r875_2(char *) = Convert : r875_1 # 875| r875_3(int) = Constant[0] : @@ -4933,31 +4933,31 @@ ir.cpp: # 875| r875_5(char *) = CopyValue : r875_4 # 875| r875_6(char *) = Convert : r875_5 # 875| r875_7(glval) = VariableAddress[p] : -# 875| mu875_8(char *) = Store : &:r875_7, r875_6 +# 875| mu875_8(char *) = Store[p] : &:r875_7, r875_6 # 876| r876_1(glval) = StringConstant["test"] : # 876| r876_2(char *) = Convert : r876_1 # 876| r876_3(int) = Constant[0] : # 876| r876_4(glval) = PointerAdd[1] : r876_2, r876_3 # 876| r876_5(char *) = CopyValue : r876_4 # 876| r876_6(glval) = VariableAddress[p] : -# 876| mu876_7(char *) = Store : &:r876_6, r876_5 +# 876| mu876_7(char *) = Store[p] : &:r876_6, r876_5 # 877| r877_1(glval) = VariableAddress[ra] : # 877| r877_2(glval) = VariableAddress[a] : # 877| r877_3(char(&)[5]) = CopyValue : r877_2 -# 877| mu877_4(char(&)[5]) = Store : &:r877_1, r877_3 +# 877| mu877_4(char(&)[5]) = Store[ra] : &:r877_1, r877_3 # 878| r878_1(glval) = VariableAddress[rs] : # 878| r878_2(glval) = StringConstant["test"] : # 878| r878_3(char(&)[5]) = CopyValue : r878_2 -# 878| mu878_4(char(&)[5]) = Store : &:r878_1, r878_3 +# 878| mu878_4(char(&)[5]) = Store[rs] : &:r878_1, r878_3 # 879| r879_1(glval) = VariableAddress[pa] : # 879| r879_2(glval) = VariableAddress[a] : # 879| r879_3(char(*)[5]) = CopyValue : r879_2 # 879| r879_4(char(*)[5]) = Convert : r879_3 -# 879| mu879_5(char(*)[5]) = Store : &:r879_1, r879_4 +# 879| mu879_5(char(*)[5]) = Store[pa] : &:r879_1, r879_4 # 880| r880_1(glval) = StringConstant["test"] : # 880| r880_2(char(*)[5]) = CopyValue : r880_1 # 880| r880_3(glval) = VariableAddress[pa] : -# 880| mu880_4(char(*)[5]) = Store : &:r880_3, r880_2 +# 880| mu880_4(char(*)[5]) = Store[pa] : &:r880_3, r880_2 # 881| v881_1(void) = NoOp : # 871| v871_4(void) = ReturnVoid : # 871| v871_5(void) = AliasedUse : ~m? @@ -4972,18 +4972,18 @@ ir.cpp: # 883| mu883_5(..(*)(..)) = InitializeParameter[pfn] : &:r883_4 # 883| r883_6(glval) = VariableAddress[p] : # 883| mu883_7(void *) = InitializeParameter[p] : &:r883_6 -# 883| r883_8(void *) = Load : &:r883_6, ~m? +# 883| r883_8(void *) = Load[p] : &:r883_6, ~m? # 883| mu883_9(unknown) = InitializeIndirection[p] : &:r883_8 # 884| r884_1(glval<..(*)(..)>) = VariableAddress[pfn] : -# 884| r884_2(..(*)(..)) = Load : &:r884_1, ~m? +# 884| r884_2(..(*)(..)) = Load[pfn] : &:r884_1, ~m? # 884| r884_3(void *) = Convert : r884_2 # 884| r884_4(glval) = VariableAddress[p] : -# 884| mu884_5(void *) = Store : &:r884_4, r884_3 +# 884| mu884_5(void *) = Store[p] : &:r884_4, r884_3 # 885| r885_1(glval) = VariableAddress[p] : -# 885| r885_2(void *) = Load : &:r885_1, ~m? +# 885| r885_2(void *) = Load[p] : &:r885_1, ~m? # 885| r885_3(..(*)(..)) = Convert : r885_2 # 885| r885_4(glval<..(*)(..)>) = VariableAddress[pfn] : -# 885| mu885_5(..(*)(..)) = Store : &:r885_4, r885_3 +# 885| mu885_5(..(*)(..)) = Store[pfn] : &:r885_4, r885_3 # 886| v886_1(void) = NoOp : # 883| v883_10(void) = ReturnIndirection[p] : &:r883_8, ~m? # 883| v883_11(void) = ReturnVoid : @@ -4999,35 +4999,35 @@ ir.cpp: # 888| mu888_5(int) = InitializeParameter[x] : &:r888_4 # 888| r888_6(glval<__va_list_tag *>) = VariableAddress[args] : # 888| mu888_7(__va_list_tag *) = InitializeParameter[args] : &:r888_6 -# 888| r888_8(__va_list_tag *) = Load : &:r888_6, ~m? +# 888| r888_8(__va_list_tag *) = Load[args] : &:r888_6, ~m? # 888| mu888_9(unknown) = InitializeIndirection[args] : &:r888_8 # 889| r889_1(glval<__va_list_tag[1]>) = VariableAddress[args2] : # 889| mu889_2(__va_list_tag[1]) = Uninitialized[args2] : &:r889_1 # 890| r890_1(glval<__va_list_tag *>) = VariableAddress[args] : -# 890| r890_2(__va_list_tag *) = Load : &:r890_1, ~m? -# 890| r890_3(__va_list_tag) = Load : &:r890_2, ~m? +# 890| r890_2(__va_list_tag *) = Load[args] : &:r890_1, ~m? +# 890| r890_3(__va_list_tag) = Load[?] : &:r890_2, ~m? # 890| r890_4(glval<__va_list_tag[1]>) = VariableAddress[args2] : # 890| r890_5(__va_list_tag *) = Convert : r890_4 -# 890| mu890_6(__va_list_tag) = Store : &:r890_5, r890_3 +# 890| mu890_6(__va_list_tag) = Store[?] : &:r890_5, r890_3 # 891| r891_1(glval) = VariableAddress[d] : # 891| r891_2(glval<__va_list_tag *>) = VariableAddress[args] : -# 891| r891_3(__va_list_tag *) = Load : &:r891_2, ~m? -# 891| r891_4(__va_list_tag) = Load : &:r891_3, ~m? +# 891| r891_3(__va_list_tag *) = Load[args] : &:r891_2, ~m? +# 891| r891_4(__va_list_tag) = Load[?] : &:r891_3, ~m? # 891| r891_5(glval) = VarArg : r891_4 # 891| r891_6(__va_list_tag) = NextVarArg : r891_4 -# 891| mu891_7(__va_list_tag) = Store : &:r891_3, r891_6 -# 891| r891_8(double) = Load : &:r891_5, ~m? -# 891| mu891_9(double) = Store : &:r891_1, r891_8 +# 891| mu891_7(__va_list_tag) = Store[?] : &:r891_3, r891_6 +# 891| r891_8(double) = Load[?] : &:r891_5, ~m? +# 891| mu891_9(double) = Store[d] : &:r891_1, r891_8 # 892| r892_1(glval) = VariableAddress[f] : # 892| r892_2(glval<__va_list_tag *>) = VariableAddress[args] : -# 892| r892_3(__va_list_tag *) = Load : &:r892_2, ~m? -# 892| r892_4(__va_list_tag) = Load : &:r892_3, ~m? +# 892| r892_3(__va_list_tag *) = Load[args] : &:r892_2, ~m? +# 892| r892_4(__va_list_tag) = Load[?] : &:r892_3, ~m? # 892| r892_5(glval) = VarArg : r892_4 # 892| r892_6(__va_list_tag) = NextVarArg : r892_4 -# 892| mu892_7(__va_list_tag) = Store : &:r892_3, r892_6 -# 892| r892_8(int) = Load : &:r892_5, ~m? +# 892| mu892_7(__va_list_tag) = Store[?] : &:r892_3, r892_6 +# 892| r892_8(int) = Load[?] : &:r892_5, ~m? # 892| r892_9(float) = Convert : r892_8 -# 892| mu892_10(float) = Store : &:r892_1, r892_9 +# 892| mu892_10(float) = Store[f] : &:r892_1, r892_9 # 893| r893_1(glval<__va_list_tag[1]>) = VariableAddress[args2] : # 893| r893_2(__va_list_tag *) = Convert : r893_1 # 893| v893_3(void) = VarArgsEnd : r893_2 @@ -5046,7 +5046,7 @@ ir.cpp: # 896| mu896_5(int) = InitializeParameter[x] : &:r896_4 # 896| r896_6(glval) = VariableAddress[#ellipsis] : # 896| mu896_7(unknown[11]) = InitializeParameter[#ellipsis] : &:r896_6 -# 896| r896_8(unknown[11]) = Load : &:r896_6, ~m? +# 896| r896_8(unknown[11]) = Load[#ellipsis] : &:r896_6, ~m? # 896| mu896_9(unknown) = InitializeIndirection[#ellipsis] : &:r896_8 # 897| r897_1(glval<__va_list_tag[1]>) = VariableAddress[args] : # 897| mu897_2(__va_list_tag[1]) = Uninitialized[args] : &:r897_1 @@ -5054,40 +5054,40 @@ ir.cpp: # 899| r899_2(__va_list_tag) = VarArgsStart : r899_1 # 899| r899_3(glval<__va_list_tag[1]>) = VariableAddress[args] : # 899| r899_4(__va_list_tag *) = Convert : r899_3 -# 899| mu899_5(__va_list_tag) = Store : &:r899_4, r899_2 +# 899| mu899_5(__va_list_tag) = Store[?] : &:r899_4, r899_2 # 900| r900_1(glval<__va_list_tag[1]>) = VariableAddress[args2] : # 900| mu900_2(__va_list_tag[1]) = Uninitialized[args2] : &:r900_1 # 901| r901_1(glval<__va_list_tag[1]>) = VariableAddress[args] : # 901| r901_2(__va_list_tag *) = Convert : r901_1 -# 901| r901_3(__va_list_tag) = Load : &:r901_2, ~m? +# 901| r901_3(__va_list_tag) = Load[?] : &:r901_2, ~m? # 901| r901_4(glval<__va_list_tag[1]>) = VariableAddress[args2] : # 901| r901_5(__va_list_tag *) = Convert : r901_4 -# 901| mu901_6(__va_list_tag) = Store : &:r901_5, r901_3 +# 901| mu901_6(__va_list_tag) = Store[?] : &:r901_5, r901_3 # 902| r902_1(glval) = VariableAddress[d] : # 902| r902_2(glval<__va_list_tag[1]>) = VariableAddress[args] : # 902| r902_3(__va_list_tag *) = Convert : r902_2 -# 902| r902_4(__va_list_tag) = Load : &:r902_3, ~m? +# 902| r902_4(__va_list_tag) = Load[?] : &:r902_3, ~m? # 902| r902_5(glval) = VarArg : r902_4 # 902| r902_6(__va_list_tag) = NextVarArg : r902_4 -# 902| mu902_7(__va_list_tag) = Store : &:r902_3, r902_6 -# 902| r902_8(double) = Load : &:r902_5, ~m? -# 902| mu902_9(double) = Store : &:r902_1, r902_8 +# 902| mu902_7(__va_list_tag) = Store[?] : &:r902_3, r902_6 +# 902| r902_8(double) = Load[?] : &:r902_5, ~m? +# 902| mu902_9(double) = Store[d] : &:r902_1, r902_8 # 903| r903_1(glval) = VariableAddress[f] : # 903| r903_2(glval<__va_list_tag[1]>) = VariableAddress[args] : # 903| r903_3(__va_list_tag *) = Convert : r903_2 -# 903| r903_4(__va_list_tag) = Load : &:r903_3, ~m? +# 903| r903_4(__va_list_tag) = Load[?] : &:r903_3, ~m? # 903| r903_5(glval) = VarArg : r903_4 # 903| r903_6(__va_list_tag) = NextVarArg : r903_4 -# 903| mu903_7(__va_list_tag) = Store : &:r903_3, r903_6 -# 903| r903_8(int) = Load : &:r903_5, ~m? +# 903| mu903_7(__va_list_tag) = Store[?] : &:r903_3, r903_6 +# 903| r903_8(int) = Load[?] : &:r903_5, ~m? # 903| r903_9(float) = Convert : r903_8 -# 903| mu903_10(float) = Store : &:r903_1, r903_9 +# 903| mu903_10(float) = Store[f] : &:r903_1, r903_9 # 904| r904_1(glval<__va_list_tag[1]>) = VariableAddress[args] : # 904| r904_2(__va_list_tag *) = Convert : r904_1 # 904| v904_3(void) = VarArgsEnd : r904_2 # 905| r905_1(glval) = FunctionAddress[VAListUsage] : # 905| r905_2(glval) = VariableAddress[x] : -# 905| r905_3(int) = Load : &:r905_2, ~m? +# 905| r905_3(int) = Load[x] : &:r905_2, ~m? # 905| r905_4(glval<__va_list_tag[1]>) = VariableAddress[args2] : # 905| r905_5(__va_list_tag *) = Convert : r905_4 # 905| v905_6(void) = Call[VAListUsage] : func:r905_1, 0:r905_3, 1:r905_5 @@ -5125,7 +5125,7 @@ ir.cpp: # 913| mu913_5(int) = InitializeParameter[x] : &:r913_4 # 914| r914_1(glval) = VariableAddress[a] : # 914| r914_2(bool) = Constant[1] : -# 914| mu914_3(bool) = Store : &:r914_1, r914_2 +# 914| mu914_3(bool) = Store[a] : &:r914_1, r914_2 # 915| r915_1(glval) = VariableAddress[b] : # 915| r915_2(bool) = Constant[1] : # 915| v915_3(void) = ConditionalBranch : r915_2 @@ -5134,8 +5134,8 @@ ir.cpp: # 915| Block 1 # 915| r915_4(glval) = VariableAddress[#temp915:11] : -# 915| r915_5(int) = Load : &:r915_4, ~m? -# 915| mu915_6(int) = Store : &:r915_1, r915_5 +# 915| r915_5(int) = Load[#temp915:11] : &:r915_4, ~m? +# 915| mu915_6(int) = Store[b] : &:r915_1, r915_5 # 916| v916_1(void) = NoOp : # 913| v913_6(void) = ReturnVoid : # 913| v913_7(void) = AliasedUse : ~m? @@ -5143,16 +5143,16 @@ ir.cpp: # 915| Block 2 # 915| r915_7(glval) = VariableAddress[x] : -# 915| r915_8(int) = Load : &:r915_7, ~m? +# 915| r915_8(int) = Load[x] : &:r915_7, ~m? # 915| r915_9(glval) = VariableAddress[#temp915:11] : -# 915| mu915_10(int) = Store : &:r915_9, r915_8 +# 915| mu915_10(int) = Store[#temp915:11] : &:r915_9, r915_8 #-----| Goto -> Block 1 # 915| Block 3 # 915| r915_11(glval) = VariableAddress[x] : -# 915| r915_12(int) = Load : &:r915_11, ~m? +# 915| r915_12(int) = Load[x] : &:r915_11, ~m? # 915| r915_13(glval) = VariableAddress[#temp915:11] : -# 915| mu915_14(int) = Store : &:r915_13, r915_12 +# 915| mu915_14(int) = Store[#temp915:11] : &:r915_13, r915_12 #-----| Goto -> Block 1 # 949| void OperatorNew() @@ -5180,7 +5180,7 @@ ir.cpp: # 952| mu952_5(unknown) = ^InitializeDynamicAllocation : &:r952_3 # 952| r952_6(int *) = Convert : r952_3 # 952| r952_7(int) = Constant[0] : -# 952| mu952_8(int) = Store : &:r952_6, r952_7 +# 952| mu952_8(int) = Store[?] : &:r952_6, r952_7 # 953| r953_1(glval) = FunctionAddress[operator new] : # 953| r953_2(unsigned long) = Constant[8] : # 953| r953_3(void *) = Call[operator new] : func:r953_1, 0:r953_2 @@ -5222,7 +5222,7 @@ ir.cpp: # 956| mu956_7(unknown) = ^InitializeDynamicAllocation : &:r956_5 # 956| r956_8(Overaligned *) = Convert : r956_5 # 956| r956_9(Overaligned) = Constant[0] : -# 956| mu956_10(Overaligned) = Store : &:r956_8, r956_9 +# 956| mu956_10(Overaligned) = Store[?] : &:r956_8, r956_9 # 957| v957_1(void) = NoOp : # 949| v949_4(void) = ReturnVoid : # 949| v949_5(void) = AliasedUse : ~m? @@ -5243,7 +5243,7 @@ ir.cpp: # 960| r960_6(int *) = Convert : r960_3 # 961| r961_1(glval) = FunctionAddress[operator new[]] : # 961| r961_2(glval) = VariableAddress[n] : -# 961| r961_3(int) = Load : &:r961_2, ~m? +# 961| r961_3(int) = Load[n] : &:r961_2, ~m? # 961| r961_4(unsigned long) = Convert : r961_3 # 961| r961_5(unsigned long) = Constant[4] : # 961| r961_6(unsigned long) = Mul : r961_4, r961_5 @@ -5253,7 +5253,7 @@ ir.cpp: # 961| r961_10(int *) = Convert : r961_7 # 962| r962_1(glval) = FunctionAddress[operator new[]] : # 962| r962_2(glval) = VariableAddress[n] : -# 962| r962_3(int) = Load : &:r962_2, ~m? +# 962| r962_3(int) = Load[n] : &:r962_2, ~m? # 962| r962_4(unsigned long) = Convert : r962_3 # 962| r962_5(unsigned long) = Constant[4] : # 962| r962_6(unsigned long) = Mul : r962_4, r962_5 @@ -5264,7 +5264,7 @@ ir.cpp: # 962| r962_11(int *) = Convert : r962_8 # 963| r963_1(glval) = FunctionAddress[operator new[]] : # 963| r963_2(glval) = VariableAddress[n] : -# 963| r963_3(int) = Load : &:r963_2, ~m? +# 963| r963_3(int) = Load[n] : &:r963_2, ~m? # 963| r963_4(unsigned long) = Convert : r963_3 # 963| r963_5(unsigned long) = Constant[8] : # 963| r963_6(unsigned long) = Mul : r963_4, r963_5 @@ -5274,7 +5274,7 @@ ir.cpp: # 963| r963_10(String *) = Convert : r963_7 # 964| r964_1(glval) = FunctionAddress[operator new[]] : # 964| r964_2(glval) = VariableAddress[n] : -# 964| r964_3(int) = Load : &:r964_2, ~m? +# 964| r964_3(int) = Load[n] : &:r964_2, ~m? # 964| r964_4(unsigned long) = Convert : r964_3 # 964| r964_5(unsigned long) = Constant[256] : # 964| r964_6(unsigned long) = Mul : r964_4, r964_5 @@ -5293,7 +5293,7 @@ ir.cpp: # 965| r965_8(Overaligned *) = Convert : r965_5 # 966| r966_1(glval) = FunctionAddress[operator new[]] : # 966| r966_2(glval) = VariableAddress[n] : -# 966| r966_3(int) = Load : &:r966_2, ~m? +# 966| r966_3(int) = Load[n] : &:r966_2, ~m? # 966| r966_4(unsigned long) = Convert : r966_3 # 966| r966_5(unsigned long) = Constant[1] : # 966| r966_6(unsigned long) = Mul : r966_4, r966_5 @@ -5303,7 +5303,7 @@ ir.cpp: # 966| r966_10(DefaultCtorWithDefaultParam *) = Convert : r966_7 # 967| r967_1(glval) = FunctionAddress[operator new[]] : # 967| r967_2(glval) = VariableAddress[n] : -# 967| r967_3(int) = Load : &:r967_2, ~m? +# 967| r967_3(int) = Load[n] : &:r967_2, ~m? # 967| r967_4(unsigned long) = Convert : r967_3 # 967| r967_5(unsigned long) = Constant[4] : # 967| r967_6(unsigned long) = Mul : r967_4, r967_5 @@ -5326,30 +5326,30 @@ ir.cpp: # 971| r971_3(int) = Constant[0] : # 971| r971_4(glval) = PointerAdd[4] : r971_1, r971_3 # 971| r971_5(unknown[8]) = Constant[0] : -# 971| mu971_6(unknown[8]) = Store : &:r971_4, r971_5 +# 971| mu971_6(unknown[8]) = Store[?] : &:r971_4, r971_5 # 971| r971_7(int) = Constant[2] : # 971| r971_8(glval) = PointerAdd[4] : r971_1, r971_7 # 971| r971_9(int) = Constant[10002] : -# 971| mu971_10(int) = Store : &:r971_8, r971_9 +# 971| mu971_10(int) = Store[?] : &:r971_8, r971_9 # 971| r971_11(int) = Constant[3] : # 971| r971_12(glval) = PointerAdd[4] : r971_1, r971_11 # 971| r971_13(unknown[3588]) = Constant[0] : -# 971| mu971_14(unknown[3588]) = Store : &:r971_12, r971_13 +# 971| mu971_14(unknown[3588]) = Store[?] : &:r971_12, r971_13 # 971| r971_15(int) = Constant[900] : # 971| r971_16(glval) = PointerAdd[4] : r971_1, r971_15 # 971| r971_17(int) = Constant[10900] : -# 971| mu971_18(int) = Store : &:r971_16, r971_17 +# 971| mu971_18(int) = Store[?] : &:r971_16, r971_17 # 971| r971_19(int) = Constant[901] : # 971| r971_20(glval) = PointerAdd[4] : r971_1, r971_19 # 971| r971_21(unknown[396]) = Constant[0] : -# 971| mu971_22(unknown[396]) = Store : &:r971_20, r971_21 +# 971| mu971_22(unknown[396]) = Store[?] : &:r971_20, r971_21 # 972| r972_1(glval) = VariableAddress[#return] : # 972| r972_2(glval) = VariableAddress[a1] : # 972| r972_3(int *) = Convert : r972_2 # 972| r972_4(int) = Constant[900] : # 972| r972_5(glval) = PointerAdd[4] : r972_3, r972_4 -# 972| r972_6(int) = Load : &:r972_5, ~m? -# 972| mu972_7(int) = Store : &:r972_1, r972_6 +# 972| r972_6(int) = Load[?] : &:r972_5, ~m? +# 972| mu972_7(int) = Store[#return] : &:r972_1, r972_6 # 970| r970_4(glval) = VariableAddress[#return] : # 970| v970_5(void) = ReturnValue : &:r970_4, ~m? # 970| v970_6(void) = AliasedUse : ~m? @@ -5366,13 +5366,13 @@ ir.cpp: # 975| mu975_7(int) = InitializeParameter[y] : &:r975_6 # 976| r976_1(glval) = VariableAddress[b] : # 976| r976_2(glval) = VariableAddress[x] : -# 976| r976_3(int) = Load : &:r976_2, ~m? +# 976| r976_3(int) = Load[x] : &:r976_2, ~m? # 976| r976_4(glval) = VariableAddress[y] : -# 976| r976_5(int) = Load : &:r976_4, ~m? +# 976| r976_5(int) = Load[y] : &:r976_4, ~m? # 976| r976_6(bool) = CompareLT : r976_3, r976_5 -# 976| mu976_7(bool) = Store : &:r976_1, r976_6 +# 976| mu976_7(bool) = Store[b] : &:r976_1, r976_6 # 976| r976_8(glval) = VariableAddress[b] : -# 976| r976_9(bool) = Load : &:r976_8, ~m? +# 976| r976_9(bool) = Load[b] : &:r976_8, ~m? # 976| r976_10(bool) = CopyValue : r976_9 # 976| v976_11(void) = ConditionalBranch : r976_10 #-----| False -> Block 2 @@ -5381,19 +5381,19 @@ ir.cpp: # 977| Block 1 # 977| r977_1(int) = Constant[5] : # 977| r977_2(glval) = VariableAddress[x] : -# 977| mu977_3(int) = Store : &:r977_2, r977_1 +# 977| mu977_3(int) = Store[x] : &:r977_2, r977_1 #-----| Goto -> Block 6 # 979| Block 2 # 979| r979_1(glval) = VariableAddress[z] : # 979| r979_2(glval) = VariableAddress[x] : -# 979| r979_3(int) = Load : &:r979_2, ~m? +# 979| r979_3(int) = Load[x] : &:r979_2, ~m? # 979| r979_4(glval) = VariableAddress[y] : -# 979| r979_5(int) = Load : &:r979_4, ~m? +# 979| r979_5(int) = Load[y] : &:r979_4, ~m? # 979| r979_6(int) = Add : r979_3, r979_5 -# 979| mu979_7(int) = Store : &:r979_1, r979_6 +# 979| mu979_7(int) = Store[z] : &:r979_1, r979_6 # 979| r979_8(glval) = VariableAddress[z] : -# 979| r979_9(int) = Load : &:r979_8, ~m? +# 979| r979_9(int) = Load[z] : &:r979_8, ~m? # 979| r979_10(int) = Constant[0] : # 979| r979_11(bool) = CompareNE : r979_9, r979_10 # 979| r979_12(bool) = CopyValue : r979_11 @@ -5404,16 +5404,16 @@ ir.cpp: # 980| Block 3 # 980| r980_1(int) = Constant[7] : # 980| r980_2(glval) = VariableAddress[y] : -# 980| mu980_3(int) = Store : &:r980_2, r980_1 +# 980| mu980_3(int) = Store[y] : &:r980_2, r980_1 #-----| Goto -> Block 6 # 982| Block 4 # 982| r982_1(glval) = VariableAddress[p] : # 982| r982_2(glval) = VariableAddress[x] : # 982| r982_3(int *) = CopyValue : r982_2 -# 982| mu982_4(int *) = Store : &:r982_1, r982_3 +# 982| mu982_4(int *) = Store[p] : &:r982_1, r982_3 # 982| r982_5(glval) = VariableAddress[p] : -# 982| r982_6(int *) = Load : &:r982_5, ~m? +# 982| r982_6(int *) = Load[p] : &:r982_5, ~m? # 982| r982_7(int *) = Constant[0] : # 982| r982_8(bool) = CompareNE : r982_6, r982_7 # 982| r982_9(bool) = CopyValue : r982_8 @@ -5424,9 +5424,9 @@ ir.cpp: # 983| Block 5 # 983| r983_1(int) = Constant[2] : # 983| r983_2(glval) = VariableAddress[p] : -# 983| r983_3(int *) = Load : &:r983_2, ~m? +# 983| r983_3(int *) = Load[p] : &:r983_2, ~m? # 983| r983_4(glval) = CopyValue : r983_3 -# 983| mu983_5(int) = Store : &:r983_4, r983_1 +# 983| mu983_5(int) = Store[?] : &:r983_4, r983_1 #-----| Goto -> Block 6 # 985| Block 6 @@ -5453,13 +5453,13 @@ ir.cpp: # 990| Block 2 # 990| r990_1(glval) = VariableAddress[z] : # 990| r990_2(glval) = VariableAddress[x] : -# 990| r990_3(int) = Load : &:r990_2, ~m? +# 990| r990_3(int) = Load[x] : &:r990_2, ~m? # 990| r990_4(glval) = VariableAddress[y] : -# 990| r990_5(int) = Load : &:r990_4, ~m? +# 990| r990_5(int) = Load[y] : &:r990_4, ~m? # 990| r990_6(int) = Add : r990_3, r990_5 -# 990| mu990_7(int) = Store : &:r990_1, r990_6 +# 990| mu990_7(int) = Store[z] : &:r990_1, r990_6 # 990| r990_8(glval) = VariableAddress[z] : -# 990| r990_9(int) = Load : &:r990_8, ~m? +# 990| r990_9(int) = Load[z] : &:r990_8, ~m? # 990| r990_10(int) = Constant[0] : # 990| r990_11(bool) = CompareNE : r990_9, r990_10 # 990| r990_12(bool) = CopyValue : r990_11 @@ -5475,9 +5475,9 @@ ir.cpp: # 992| r992_1(glval) = VariableAddress[p] : # 992| r992_2(glval) = VariableAddress[x] : # 992| r992_3(int *) = CopyValue : r992_2 -# 992| mu992_4(int *) = Store : &:r992_1, r992_3 +# 992| mu992_4(int *) = Store[p] : &:r992_1, r992_3 # 992| r992_5(glval) = VariableAddress[p] : -# 992| r992_6(int *) = Load : &:r992_5, ~m? +# 992| r992_6(int *) = Load[p] : &:r992_5, ~m? # 992| r992_7(int *) = Constant[0] : # 992| r992_8(bool) = CompareNE : r992_6, r992_7 # 992| r992_9(bool) = CopyValue : r992_8 @@ -5498,13 +5498,13 @@ ir.cpp: # 988| Block 7 # 988| r988_2(glval) = VariableAddress[b] : # 988| r988_3(glval) = VariableAddress[x] : -# 988| r988_4(int) = Load : &:r988_3, ~m? +# 988| r988_4(int) = Load[x] : &:r988_3, ~m? # 988| r988_5(glval) = VariableAddress[y] : -# 988| r988_6(int) = Load : &:r988_5, ~m? +# 988| r988_6(int) = Load[y] : &:r988_5, ~m? # 988| r988_7(bool) = CompareLT : r988_4, r988_6 -# 988| mu988_8(bool) = Store : &:r988_2, r988_7 +# 988| mu988_8(bool) = Store[b] : &:r988_2, r988_7 # 988| r988_9(glval) = VariableAddress[b] : -# 988| r988_10(bool) = Load : &:r988_9, ~m? +# 988| r988_10(bool) = Load[b] : &:r988_9, ~m? # 988| r988_11(bool) = CopyValue : r988_10 # 988| v988_12(void) = ConditionalBranch : r988_11 #-----| False -> Block 2 @@ -5517,23 +5517,23 @@ ir.cpp: # 996| mu996_3(unknown) = InitializeNonLocal : # 996| r996_4(glval) = VariableAddress[a] : # 996| mu996_5(int *) = InitializeParameter[a] : &:r996_4 -# 996| r996_6(int *) = Load : &:r996_4, ~m? +# 996| r996_6(int *) = Load[a] : &:r996_4, ~m? # 996| mu996_7(unknown) = InitializeIndirection[a] : &:r996_6 # 996| r996_8(glval<..(*)(..)>) = VariableAddress[fn] : # 996| mu996_9(..(*)(..)) = InitializeParameter[fn] : &:r996_8 # 997| r997_1(glval) = VariableAddress[#return] : # 997| r997_2(glval) = VariableAddress[a] : -# 997| r997_3(int *) = Load : &:r997_2, ~m? +# 997| r997_3(int *) = Load[a] : &:r997_2, ~m? # 997| r997_4(int) = Constant[0] : # 997| r997_5(glval) = PointerAdd[4] : r997_3, r997_4 -# 997| r997_6(int) = Load : &:r997_5, ~m? +# 997| r997_6(int) = Load[?] : &:r997_5, ~m? # 997| r997_7(glval<..(*)(..)>) = VariableAddress[fn] : -# 997| r997_8(..(*)(..)) = Load : &:r997_7, ~m? +# 997| r997_8(..(*)(..)) = Load[fn] : &:r997_7, ~m? # 997| r997_9(float) = Constant[1.0] : # 997| r997_10(int) = Call[?] : func:r997_8, 0:r997_9 # 997| mu997_11(unknown) = ^CallSideEffect : ~m? # 997| r997_12(int) = Add : r997_6, r997_10 -# 997| mu997_13(int) = Store : &:r997_1, r997_12 +# 997| mu997_13(int) = Store[#return] : &:r997_1, r997_12 # 996| v996_10(void) = ReturnIndirection[a] : &:r996_6, ~m? # 996| r996_11(glval) = VariableAddress[#return] : # 996| v996_12(void) = ReturnValue : &:r996_11, ~m? @@ -5555,7 +5555,7 @@ ir.cpp: # 1002| r1002_1(glval) = VariableAddress[w] : # 1002| mu1002_2(int) = Uninitialized[w] : &:r1002_1 # 1003| r1003_1(glval) = VariableAddress[b] : -# 1003| r1003_2(int) = Load : &:r1003_1, ~m? +# 1003| r1003_2(int) = Load[b] : &:r1003_1, ~m? # 1003| r1003_3(int) = Constant[0] : # 1003| r1003_4(bool) = CompareNE : r1003_2, r1003_3 # 1003| v1003_5(void) = ConditionalBranch : r1003_4 @@ -5564,28 +5564,28 @@ ir.cpp: # 1004| Block 1 # 1004| r1004_1(glval) = VariableAddress[y] : -# 1004| r1004_2(int) = Load : &:r1004_1, ~m? +# 1004| r1004_2(int) = Load[y] : &:r1004_1, ~m? # 1004| r1004_3(glval) = VariableAddress[w] : -# 1004| mu1004_4(int) = Store : &:r1004_3, r1004_2 +# 1004| mu1004_4(int) = Store[w] : &:r1004_3, r1004_2 #-----| Goto -> Block 3 # 1006| Block 2 # 1006| r1006_1(glval) = VariableAddress[z] : -# 1006| r1006_2(int) = Load : &:r1006_1, ~m? +# 1006| r1006_2(int) = Load[z] : &:r1006_1, ~m? # 1006| r1006_3(glval) = VariableAddress[w] : -# 1006| mu1006_4(int) = Store : &:r1006_3, r1006_2 +# 1006| mu1006_4(int) = Store[w] : &:r1006_3, r1006_2 #-----| Goto -> Block 3 # 1008| Block 3 # 1008| r1008_1(glval) = VariableAddress[w] : -# 1008| r1008_2(int) = Load : &:r1008_1, ~m? +# 1008| r1008_2(int) = Load[w] : &:r1008_1, ~m? # 1001| r1001_2(int) = CopyValue : r1008_2 -# 1001| mu1001_3(int) = Store : &:r1001_1, r1001_2 +# 1001| mu1001_3(int) = Store[x] : &:r1001_1, r1001_2 # 1011| r1011_1(glval) = VariableAddress[#return] : # 1011| r1011_2(glval) = VariableAddress[x] : -# 1011| r1011_3(int) = Load : &:r1011_2, ~m? +# 1011| r1011_3(int) = Load[x] : &:r1011_2, ~m? # 1011| r1011_4(int) = CopyValue : r1011_3 -# 1011| mu1011_5(int) = Store : &:r1011_1, r1011_4 +# 1011| mu1011_5(int) = Store[#return] : &:r1011_1, r1011_4 # 1000| r1000_10(glval) = VariableAddress[#return] : # 1000| v1000_11(void) = ReturnValue : &:r1000_10, ~m? # 1000| v1000_12(void) = AliasedUse : ~m? @@ -5650,7 +5650,7 @@ ir.cpp: # 1038| mu1038_3(unknown) = InitializeNonLocal : # 1038| r1038_4(glval) = VariableAddress[#this] : # 1038| mu1038_5(glval) = InitializeParameter[#this] : &:r1038_4 -# 1038| r1038_6(glval) = Load : &:r1038_4, ~m? +# 1038| r1038_6(glval) = Load[#this] : &:r1038_4, ~m? # 1038| mu1038_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1038_6 # 1038| v1038_8(void) = NoOp : # 1038| v1038_9(void) = ReturnIndirection[#this] : &:r1038_6, ~m? @@ -5665,11 +5665,11 @@ ir.cpp: # 1038| mu1038_3(unknown) = InitializeNonLocal : # 1038| r1038_4(glval) = VariableAddress[#this] : # 1038| mu1038_5(glval) = InitializeParameter[#this] : &:r1038_4 -# 1038| r1038_6(glval) = Load : &:r1038_4, ~m? +# 1038| r1038_6(glval) = Load[#this] : &:r1038_4, ~m? # 1038| mu1038_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1038_6 # 1038| r1038_8(glval<..(*)(..)>) = VariableAddress[#return] : # 1038| r1038_9(..(*)(..)) = FunctionAddress[_FUN] : -# 1038| mu1038_10(..(*)(..)) = Store : &:r1038_8, r1038_9 +# 1038| mu1038_10(..(*)(..)) = Store[#return] : &:r1038_8, r1038_9 # 1038| v1038_11(void) = ReturnIndirection[#this] : &:r1038_6, ~m? # 1038| r1038_12(glval<..(*)(..)>) = VariableAddress[#return] : # 1038| v1038_13(void) = ReturnValue : &:r1038_12, ~m? @@ -5685,29 +5685,29 @@ ir.cpp: # 1040| mu1040_5(int) = InitializeParameter[x] : &:r1040_4 # 1040| r1040_6(glval) = VariableAddress[s] : # 1040| mu1040_7(String &) = InitializeParameter[s] : &:r1040_6 -# 1040| r1040_8(String &) = Load : &:r1040_6, ~m? +# 1040| r1040_8(String &) = Load[s] : &:r1040_6, ~m? # 1040| mu1040_9(unknown) = InitializeIndirection[s] : &:r1040_8 # 1041| r1041_1(glval) = VariableAddress[lambda_empty] : # 1041| r1041_2(glval) = VariableAddress[#temp1041:23] : # 1041| mu1041_3(decltype([...](...){...})) = Uninitialized[#temp1041:23] : &:r1041_2 -# 1041| r1041_4(decltype([...](...){...})) = Load : &:r1041_2, ~m? -# 1041| mu1041_5(decltype([...](...){...})) = Store : &:r1041_1, r1041_4 +# 1041| r1041_4(decltype([...](...){...})) = Load[#temp1041:23] : &:r1041_2, ~m? +# 1041| mu1041_5(decltype([...](...){...})) = Store[lambda_empty] : &:r1041_1, r1041_4 # 1042| r1042_1(char) = Constant[65] : # 1043| r1043_1(glval) = VariableAddress[lambda_ref] : # 1043| r1043_2(glval) = VariableAddress[#temp1043:20] : # 1043| mu1043_3(decltype([...](...){...})) = Uninitialized[#temp1043:20] : &:r1043_2 # 1043| r1043_4(glval) = FieldAddress[s] : r1043_2 # 1043| r1043_5(glval) = VariableAddress[s] : -# 1043| r1043_6(String &) = Load : &:r1043_5, ~m? +# 1043| r1043_6(String &) = Load[s] : &:r1043_5, ~m? # 1043| r1043_7(glval) = CopyValue : r1043_6 # 1043| r1043_8(String &) = CopyValue : r1043_7 -# 1043| mu1043_9(String &) = Store : &:r1043_4, r1043_8 +# 1043| mu1043_9(String &) = Store[?] : &:r1043_4, r1043_8 # 1043| r1043_10(glval) = FieldAddress[x] : r1043_2 # 1043| r1043_11(glval) = VariableAddress[x] : #-----| r0_1(int &) = CopyValue : r1043_11 -#-----| mu0_2(int &) = Store : &:r1043_10, r0_1 -# 1043| r1043_12(decltype([...](...){...})) = Load : &:r1043_2, ~m? -# 1043| mu1043_13(decltype([...](...){...})) = Store : &:r1043_1, r1043_12 +#-----| mu0_2(int &) = Store[?] : &:r1043_10, r0_1 +# 1043| r1043_12(decltype([...](...){...})) = Load[#temp1043:20] : &:r1043_2, ~m? +# 1043| mu1043_13(decltype([...](...){...})) = Store[lambda_ref] : &:r1043_1, r1043_12 # 1044| r1044_1(glval) = VariableAddress[lambda_ref] : # 1044| r1044_2(glval) = Convert : r1044_1 # 1044| r1044_3(glval) = FunctionAddress[operator()] : @@ -5726,10 +5726,10 @@ ir.cpp: # 1045| mu1045_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r1045_4 # 1045| r1045_9(glval) = FieldAddress[x] : r1045_2 # 1045| r1045_10(glval) = VariableAddress[x] : -# 1045| r1045_11(int) = Load : &:r1045_10, ~m? -# 1045| mu1045_12(int) = Store : &:r1045_9, r1045_11 -# 1045| r1045_13(decltype([...](...){...})) = Load : &:r1045_2, ~m? -# 1045| mu1045_14(decltype([...](...){...})) = Store : &:r1045_1, r1045_13 +# 1045| r1045_11(int) = Load[x] : &:r1045_10, ~m? +# 1045| mu1045_12(int) = Store[?] : &:r1045_9, r1045_11 +# 1045| r1045_13(decltype([...](...){...})) = Load[#temp1045:20] : &:r1045_2, ~m? +# 1045| mu1045_14(decltype([...](...){...})) = Store[lambda_val] : &:r1045_1, r1045_13 # 1046| r1046_1(glval) = VariableAddress[lambda_val] : # 1046| r1046_2(glval) = Convert : r1046_1 # 1046| r1046_3(glval) = FunctionAddress[operator()] : @@ -5743,12 +5743,12 @@ ir.cpp: # 1047| mu1047_3(decltype([...](...){...})) = Uninitialized[#temp1047:29] : &:r1047_2 # 1047| r1047_4(glval) = FieldAddress[s] : r1047_2 # 1047| r1047_5(glval) = VariableAddress[s] : -# 1047| r1047_6(String &) = Load : &:r1047_5, ~m? +# 1047| r1047_6(String &) = Load[s] : &:r1047_5, ~m? # 1047| r1047_7(glval) = CopyValue : r1047_6 # 1047| r1047_8(String &) = CopyValue : r1047_7 -# 1047| mu1047_9(String &) = Store : &:r1047_4, r1047_8 -# 1047| r1047_10(decltype([...](...){...})) = Load : &:r1047_2, ~m? -# 1047| mu1047_11(decltype([...](...){...})) = Store : &:r1047_1, r1047_10 +# 1047| mu1047_9(String &) = Store[?] : &:r1047_4, r1047_8 +# 1047| r1047_10(decltype([...](...){...})) = Load[#temp1047:29] : &:r1047_2, ~m? +# 1047| mu1047_11(decltype([...](...){...})) = Store[lambda_ref_explicit] : &:r1047_1, r1047_10 # 1048| r1048_1(glval) = VariableAddress[lambda_ref_explicit] : # 1048| r1048_2(glval) = Convert : r1048_1 # 1048| r1048_3(glval) = FunctionAddress[operator()] : @@ -5765,8 +5765,8 @@ ir.cpp: # 1049| v1049_6(void) = Call[String] : func:r1049_5, this:r1049_4 # 1049| mu1049_7(unknown) = ^CallSideEffect : ~m? # 1049| mu1049_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r1049_4 -# 1049| r1049_9(decltype([...](...){...})) = Load : &:r1049_2, ~m? -# 1049| mu1049_10(decltype([...](...){...})) = Store : &:r1049_1, r1049_9 +# 1049| r1049_9(decltype([...](...){...})) = Load[#temp1049:29] : &:r1049_2, ~m? +# 1049| mu1049_10(decltype([...](...){...})) = Store[lambda_val_explicit] : &:r1049_1, r1049_9 # 1050| r1050_1(glval) = VariableAddress[lambda_val_explicit] : # 1050| r1050_2(glval) = Convert : r1050_1 # 1050| r1050_3(glval) = FunctionAddress[operator()] : @@ -5780,16 +5780,16 @@ ir.cpp: # 1051| mu1051_3(decltype([...](...){...})) = Uninitialized[#temp1051:31] : &:r1051_2 # 1051| r1051_4(glval) = FieldAddress[s] : r1051_2 # 1051| r1051_5(glval) = VariableAddress[s] : -# 1051| r1051_6(String &) = Load : &:r1051_5, ~m? +# 1051| r1051_6(String &) = Load[s] : &:r1051_5, ~m? # 1051| r1051_7(glval) = CopyValue : r1051_6 # 1051| r1051_8(String &) = CopyValue : r1051_7 -# 1051| mu1051_9(String &) = Store : &:r1051_4, r1051_8 +# 1051| mu1051_9(String &) = Store[?] : &:r1051_4, r1051_8 # 1051| r1051_10(glval) = FieldAddress[x] : r1051_2 # 1051| r1051_11(glval) = VariableAddress[x] : -# 1051| r1051_12(int) = Load : &:r1051_11, ~m? -# 1051| mu1051_13(int) = Store : &:r1051_10, r1051_12 -# 1051| r1051_14(decltype([...](...){...})) = Load : &:r1051_2, ~m? -# 1051| mu1051_15(decltype([...](...){...})) = Store : &:r1051_1, r1051_14 +# 1051| r1051_12(int) = Load[x] : &:r1051_11, ~m? +# 1051| mu1051_13(int) = Store[?] : &:r1051_10, r1051_12 +# 1051| r1051_14(decltype([...](...){...})) = Load[#temp1051:31] : &:r1051_2, ~m? +# 1051| mu1051_15(decltype([...](...){...})) = Store[lambda_mixed_explicit] : &:r1051_1, r1051_14 # 1052| r1052_1(glval) = VariableAddress[lambda_mixed_explicit] : # 1052| r1052_2(glval) = Convert : r1052_1 # 1052| r1052_3(glval) = FunctionAddress[operator()] : @@ -5800,35 +5800,35 @@ ir.cpp: # 1052| mu1052_8(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1052_2 # 1053| r1053_1(glval) = VariableAddress[r] : # 1053| r1053_2(glval) = VariableAddress[x] : -# 1053| r1053_3(int) = Load : &:r1053_2, ~m? +# 1053| r1053_3(int) = Load[x] : &:r1053_2, ~m? # 1053| r1053_4(int) = Constant[1] : # 1053| r1053_5(int) = Sub : r1053_3, r1053_4 -# 1053| mu1053_6(int) = Store : &:r1053_1, r1053_5 +# 1053| mu1053_6(int) = Store[r] : &:r1053_1, r1053_5 # 1054| r1054_1(glval) = VariableAddress[lambda_inits] : # 1054| r1054_2(glval) = VariableAddress[#temp1054:22] : # 1054| mu1054_3(decltype([...](...){...})) = Uninitialized[#temp1054:22] : &:r1054_2 # 1054| r1054_4(glval) = FieldAddress[s] : r1054_2 # 1054| r1054_5(glval) = VariableAddress[s] : -# 1054| r1054_6(String &) = Load : &:r1054_5, ~m? +# 1054| r1054_6(String &) = Load[s] : &:r1054_5, ~m? # 1054| r1054_7(glval) = CopyValue : r1054_6 # 1054| r1054_8(String &) = CopyValue : r1054_7 -# 1054| mu1054_9(String &) = Store : &:r1054_4, r1054_8 +# 1054| mu1054_9(String &) = Store[?] : &:r1054_4, r1054_8 # 1054| r1054_10(glval) = FieldAddress[x] : r1054_2 # 1054| r1054_11(glval) = VariableAddress[x] : -# 1054| r1054_12(int) = Load : &:r1054_11, ~m? -# 1054| mu1054_13(int) = Store : &:r1054_10, r1054_12 +# 1054| r1054_12(int) = Load[x] : &:r1054_11, ~m? +# 1054| mu1054_13(int) = Store[?] : &:r1054_10, r1054_12 # 1054| r1054_14(glval) = FieldAddress[i] : r1054_2 # 1054| r1054_15(glval) = VariableAddress[x] : -# 1054| r1054_16(int) = Load : &:r1054_15, ~m? +# 1054| r1054_16(int) = Load[x] : &:r1054_15, ~m? # 1054| r1054_17(int) = Constant[1] : # 1054| r1054_18(int) = Add : r1054_16, r1054_17 -# 1054| mu1054_19(int) = Store : &:r1054_14, r1054_18 +# 1054| mu1054_19(int) = Store[?] : &:r1054_14, r1054_18 # 1054| r1054_20(glval) = FieldAddress[j] : r1054_2 # 1054| r1054_21(glval) = VariableAddress[r] : # 1054| r1054_22(int &) = CopyValue : r1054_21 -# 1054| mu1054_23(int &) = Store : &:r1054_20, r1054_22 -# 1054| r1054_24(decltype([...](...){...})) = Load : &:r1054_2, ~m? -# 1054| mu1054_25(decltype([...](...){...})) = Store : &:r1054_1, r1054_24 +# 1054| mu1054_23(int &) = Store[?] : &:r1054_20, r1054_22 +# 1054| r1054_24(decltype([...](...){...})) = Load[#temp1054:22] : &:r1054_2, ~m? +# 1054| mu1054_25(decltype([...](...){...})) = Store[lambda_inits] : &:r1054_1, r1054_24 # 1055| r1055_1(glval) = VariableAddress[lambda_inits] : # 1055| r1055_2(glval) = Convert : r1055_1 # 1055| r1055_3(glval) = FunctionAddress[operator()] : @@ -5850,13 +5850,13 @@ ir.cpp: # 1041| mu1041_3(unknown) = InitializeNonLocal : # 1041| r1041_4(glval) = VariableAddress[#this] : # 1041| mu1041_5(glval) = InitializeParameter[#this] : &:r1041_4 -# 1041| r1041_6(glval) = Load : &:r1041_4, ~m? +# 1041| r1041_6(glval) = Load[#this] : &:r1041_4, ~m? # 1041| mu1041_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1041_6 # 1041| r1041_8(glval) = VariableAddress[f] : # 1041| mu1041_9(float) = InitializeParameter[f] : &:r1041_8 # 1041| r1041_10(glval) = VariableAddress[#return] : # 1041| r1041_11(char) = Constant[65] : -# 1041| mu1041_12(char) = Store : &:r1041_10, r1041_11 +# 1041| mu1041_12(char) = Store[#return] : &:r1041_10, r1041_11 # 1041| v1041_13(void) = ReturnIndirection[#this] : &:r1041_6, ~m? # 1041| r1041_14(glval) = VariableAddress[#return] : # 1041| v1041_15(void) = ReturnValue : &:r1041_14, ~m? @@ -5870,11 +5870,11 @@ ir.cpp: # 1041| mu1041_3(unknown) = InitializeNonLocal : # 1041| r1041_4(glval) = VariableAddress[#this] : # 1041| mu1041_5(glval) = InitializeParameter[#this] : &:r1041_4 -# 1041| r1041_6(glval) = Load : &:r1041_4, ~m? +# 1041| r1041_6(glval) = Load[#this] : &:r1041_4, ~m? # 1041| mu1041_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1041_6 # 1041| r1041_8(glval<..(*)(..)>) = VariableAddress[#return] : # 1041| r1041_9(..(*)(..)) = FunctionAddress[_FUN] : -# 1041| mu1041_10(..(*)(..)) = Store : &:r1041_8, r1041_9 +# 1041| mu1041_10(..(*)(..)) = Store[#return] : &:r1041_8, r1041_9 # 1041| v1041_11(void) = ReturnIndirection[#this] : &:r1041_6, ~m? # 1041| r1041_12(glval<..(*)(..)>) = VariableAddress[#return] : # 1041| v1041_13(void) = ReturnValue : &:r1041_12, ~m? @@ -5888,15 +5888,15 @@ ir.cpp: # 1043| mu1043_3(unknown) = InitializeNonLocal : # 1043| r1043_4(glval) = VariableAddress[#this] : # 1043| mu1043_5(glval) = InitializeParameter[#this] : &:r1043_4 -# 1043| r1043_6(glval) = Load : &:r1043_4, ~m? +# 1043| r1043_6(glval) = Load[#this] : &:r1043_4, ~m? # 1043| mu1043_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1043_6 # 1043| r1043_8(glval) = VariableAddress[f] : # 1043| mu1043_9(float) = InitializeParameter[f] : &:r1043_8 # 1043| r1043_10(glval) = VariableAddress[#return] : # 1043| r1043_11(glval) = VariableAddress[#this] : -# 1043| r1043_12(lambda [] type at line 1043, col. 21 *) = Load : &:r1043_11, ~m? +# 1043| r1043_12(lambda [] type at line 1043, col. 21 *) = Load[#this] : &:r1043_11, ~m? # 1043| r1043_13(glval) = FieldAddress[s] : r1043_12 -# 1043| r1043_14(String &) = Load : &:r1043_13, ~m? +# 1043| r1043_14(String &) = Load[?] : &:r1043_13, ~m? # 1043| r1043_15(glval) = CopyValue : r1043_14 # 1043| r1043_16(glval) = FunctionAddress[c_str] : # 1043| r1043_17(char *) = Call[c_str] : func:r1043_16, this:r1043_15 @@ -5904,13 +5904,13 @@ ir.cpp: # 1043| v1043_19(void) = ^BufferReadSideEffect[-1] : &:r1043_15, ~m? # 1043| mu1043_20(String) = ^IndirectMayWriteSideEffect[-1] : &:r1043_15 # 1043| r1043_21(glval) = VariableAddress[#this] : -# 1043| r1043_22(lambda [] type at line 1043, col. 21 *) = Load : &:r1043_21, ~m? +# 1043| r1043_22(lambda [] type at line 1043, col. 21 *) = Load[#this] : &:r1043_21, ~m? # 1043| r1043_23(glval) = FieldAddress[x] : r1043_22 -# 1043| r1043_24(int &) = Load : &:r1043_23, ~m? -# 1043| r1043_25(int) = Load : &:r1043_24, ~m? +# 1043| r1043_24(int &) = Load[?] : &:r1043_23, ~m? +# 1043| r1043_25(int) = Load[?] : &:r1043_24, ~m? # 1043| r1043_26(glval) = PointerAdd[1] : r1043_17, r1043_25 -# 1043| r1043_27(char) = Load : &:r1043_26, ~m? -# 1043| mu1043_28(char) = Store : &:r1043_10, r1043_27 +# 1043| r1043_27(char) = Load[?] : &:r1043_26, ~m? +# 1043| mu1043_28(char) = Store[#return] : &:r1043_10, r1043_27 # 1043| v1043_29(void) = ReturnIndirection[#this] : &:r1043_6, ~m? # 1043| r1043_30(glval) = VariableAddress[#return] : # 1043| v1043_31(void) = ReturnValue : &:r1043_30, ~m? @@ -5924,7 +5924,7 @@ ir.cpp: # 1045| mu1045_3(unknown) = InitializeNonLocal : # 1045| r1045_4(glval) = VariableAddress[#this] : # 1045| mu1045_5(glval) = InitializeParameter[#this] : &:r1045_4 -# 1045| r1045_6(glval) = Load : &:r1045_4, ~m? +# 1045| r1045_6(glval) = Load[#this] : &:r1045_4, ~m? # 1045| mu1045_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1045_6 #-----| v0_1(void) = NoOp : # 1045| r1045_8(glval) = FieldAddress[s] : mu1045_5 @@ -5943,13 +5943,13 @@ ir.cpp: # 1045| mu1045_3(unknown) = InitializeNonLocal : # 1045| r1045_4(glval) = VariableAddress[#this] : # 1045| mu1045_5(glval) = InitializeParameter[#this] : &:r1045_4 -# 1045| r1045_6(glval) = Load : &:r1045_4, ~m? +# 1045| r1045_6(glval) = Load[#this] : &:r1045_4, ~m? # 1045| mu1045_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1045_6 # 1045| r1045_8(glval) = VariableAddress[f] : # 1045| mu1045_9(float) = InitializeParameter[f] : &:r1045_8 # 1045| r1045_10(glval) = VariableAddress[#return] : # 1045| r1045_11(glval) = VariableAddress[#this] : -# 1045| r1045_12(lambda [] type at line 1045, col. 21 *) = Load : &:r1045_11, ~m? +# 1045| r1045_12(lambda [] type at line 1045, col. 21 *) = Load[#this] : &:r1045_11, ~m? # 1045| r1045_13(glval) = FieldAddress[s] : r1045_12 # 1045| r1045_14(glval) = FunctionAddress[c_str] : # 1045| r1045_15(char *) = Call[c_str] : func:r1045_14, this:r1045_13 @@ -5957,12 +5957,12 @@ ir.cpp: # 1045| v1045_17(void) = ^BufferReadSideEffect[-1] : &:r1045_13, ~m? # 1045| mu1045_18(String) = ^IndirectMayWriteSideEffect[-1] : &:r1045_13 # 1045| r1045_19(glval) = VariableAddress[#this] : -# 1045| r1045_20(lambda [] type at line 1045, col. 21 *) = Load : &:r1045_19, ~m? +# 1045| r1045_20(lambda [] type at line 1045, col. 21 *) = Load[#this] : &:r1045_19, ~m? # 1045| r1045_21(glval) = FieldAddress[x] : r1045_20 -# 1045| r1045_22(int) = Load : &:r1045_21, ~m? +# 1045| r1045_22(int) = Load[?] : &:r1045_21, ~m? # 1045| r1045_23(glval) = PointerAdd[1] : r1045_15, r1045_22 -# 1045| r1045_24(char) = Load : &:r1045_23, ~m? -# 1045| mu1045_25(char) = Store : &:r1045_10, r1045_24 +# 1045| r1045_24(char) = Load[?] : &:r1045_23, ~m? +# 1045| mu1045_25(char) = Store[#return] : &:r1045_10, r1045_24 # 1045| v1045_26(void) = ReturnIndirection[#this] : &:r1045_6, ~m? # 1045| r1045_27(glval) = VariableAddress[#return] : # 1045| v1045_28(void) = ReturnValue : &:r1045_27, ~m? @@ -5976,15 +5976,15 @@ ir.cpp: # 1047| mu1047_3(unknown) = InitializeNonLocal : # 1047| r1047_4(glval) = VariableAddress[#this] : # 1047| mu1047_5(glval) = InitializeParameter[#this] : &:r1047_4 -# 1047| r1047_6(glval) = Load : &:r1047_4, ~m? +# 1047| r1047_6(glval) = Load[#this] : &:r1047_4, ~m? # 1047| mu1047_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1047_6 # 1047| r1047_8(glval) = VariableAddress[f] : # 1047| mu1047_9(float) = InitializeParameter[f] : &:r1047_8 # 1047| r1047_10(glval) = VariableAddress[#return] : # 1047| r1047_11(glval) = VariableAddress[#this] : -# 1047| r1047_12(lambda [] type at line 1047, col. 30 *) = Load : &:r1047_11, ~m? +# 1047| r1047_12(lambda [] type at line 1047, col. 30 *) = Load[#this] : &:r1047_11, ~m? # 1047| r1047_13(glval) = FieldAddress[s] : r1047_12 -# 1047| r1047_14(String &) = Load : &:r1047_13, ~m? +# 1047| r1047_14(String &) = Load[?] : &:r1047_13, ~m? # 1047| r1047_15(glval) = CopyValue : r1047_14 # 1047| r1047_16(glval) = FunctionAddress[c_str] : # 1047| r1047_17(char *) = Call[c_str] : func:r1047_16, this:r1047_15 @@ -5993,8 +5993,8 @@ ir.cpp: # 1047| mu1047_20(String) = ^IndirectMayWriteSideEffect[-1] : &:r1047_15 # 1047| r1047_21(int) = Constant[0] : # 1047| r1047_22(glval) = PointerAdd[1] : r1047_17, r1047_21 -# 1047| r1047_23(char) = Load : &:r1047_22, ~m? -# 1047| mu1047_24(char) = Store : &:r1047_10, r1047_23 +# 1047| r1047_23(char) = Load[?] : &:r1047_22, ~m? +# 1047| mu1047_24(char) = Store[#return] : &:r1047_10, r1047_23 # 1047| v1047_25(void) = ReturnIndirection[#this] : &:r1047_6, ~m? # 1047| r1047_26(glval) = VariableAddress[#return] : # 1047| v1047_27(void) = ReturnValue : &:r1047_26, ~m? @@ -6008,7 +6008,7 @@ ir.cpp: # 1049| mu1049_3(unknown) = InitializeNonLocal : # 1049| r1049_4(glval) = VariableAddress[#this] : # 1049| mu1049_5(glval) = InitializeParameter[#this] : &:r1049_4 -# 1049| r1049_6(glval) = Load : &:r1049_4, ~m? +# 1049| r1049_6(glval) = Load[#this] : &:r1049_4, ~m? # 1049| mu1049_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1049_6 #-----| v0_1(void) = NoOp : # 1049| r1049_8(glval) = FieldAddress[s] : mu1049_5 @@ -6027,13 +6027,13 @@ ir.cpp: # 1049| mu1049_3(unknown) = InitializeNonLocal : # 1049| r1049_4(glval) = VariableAddress[#this] : # 1049| mu1049_5(glval) = InitializeParameter[#this] : &:r1049_4 -# 1049| r1049_6(glval) = Load : &:r1049_4, ~m? +# 1049| r1049_6(glval) = Load[#this] : &:r1049_4, ~m? # 1049| mu1049_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1049_6 # 1049| r1049_8(glval) = VariableAddress[f] : # 1049| mu1049_9(float) = InitializeParameter[f] : &:r1049_8 # 1049| r1049_10(glval) = VariableAddress[#return] : # 1049| r1049_11(glval) = VariableAddress[#this] : -# 1049| r1049_12(lambda [] type at line 1049, col. 30 *) = Load : &:r1049_11, ~m? +# 1049| r1049_12(lambda [] type at line 1049, col. 30 *) = Load[#this] : &:r1049_11, ~m? # 1049| r1049_13(glval) = FieldAddress[s] : r1049_12 # 1049| r1049_14(glval) = FunctionAddress[c_str] : # 1049| r1049_15(char *) = Call[c_str] : func:r1049_14, this:r1049_13 @@ -6042,8 +6042,8 @@ ir.cpp: # 1049| mu1049_18(String) = ^IndirectMayWriteSideEffect[-1] : &:r1049_13 # 1049| r1049_19(int) = Constant[0] : # 1049| r1049_20(glval) = PointerAdd[1] : r1049_15, r1049_19 -# 1049| r1049_21(char) = Load : &:r1049_20, ~m? -# 1049| mu1049_22(char) = Store : &:r1049_10, r1049_21 +# 1049| r1049_21(char) = Load[?] : &:r1049_20, ~m? +# 1049| mu1049_22(char) = Store[#return] : &:r1049_10, r1049_21 # 1049| v1049_23(void) = ReturnIndirection[#this] : &:r1049_6, ~m? # 1049| r1049_24(glval) = VariableAddress[#return] : # 1049| v1049_25(void) = ReturnValue : &:r1049_24, ~m? @@ -6057,15 +6057,15 @@ ir.cpp: # 1051| mu1051_3(unknown) = InitializeNonLocal : # 1051| r1051_4(glval) = VariableAddress[#this] : # 1051| mu1051_5(glval) = InitializeParameter[#this] : &:r1051_4 -# 1051| r1051_6(glval) = Load : &:r1051_4, ~m? +# 1051| r1051_6(glval) = Load[#this] : &:r1051_4, ~m? # 1051| mu1051_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1051_6 # 1051| r1051_8(glval) = VariableAddress[f] : # 1051| mu1051_9(float) = InitializeParameter[f] : &:r1051_8 # 1051| r1051_10(glval) = VariableAddress[#return] : # 1051| r1051_11(glval) = VariableAddress[#this] : -# 1051| r1051_12(lambda [] type at line 1051, col. 32 *) = Load : &:r1051_11, ~m? +# 1051| r1051_12(lambda [] type at line 1051, col. 32 *) = Load[#this] : &:r1051_11, ~m? # 1051| r1051_13(glval) = FieldAddress[s] : r1051_12 -# 1051| r1051_14(String &) = Load : &:r1051_13, ~m? +# 1051| r1051_14(String &) = Load[?] : &:r1051_13, ~m? # 1051| r1051_15(glval) = CopyValue : r1051_14 # 1051| r1051_16(glval) = FunctionAddress[c_str] : # 1051| r1051_17(char *) = Call[c_str] : func:r1051_16, this:r1051_15 @@ -6073,12 +6073,12 @@ ir.cpp: # 1051| v1051_19(void) = ^BufferReadSideEffect[-1] : &:r1051_15, ~m? # 1051| mu1051_20(String) = ^IndirectMayWriteSideEffect[-1] : &:r1051_15 # 1051| r1051_21(glval) = VariableAddress[#this] : -# 1051| r1051_22(lambda [] type at line 1051, col. 32 *) = Load : &:r1051_21, ~m? +# 1051| r1051_22(lambda [] type at line 1051, col. 32 *) = Load[#this] : &:r1051_21, ~m? # 1051| r1051_23(glval) = FieldAddress[x] : r1051_22 -# 1051| r1051_24(int) = Load : &:r1051_23, ~m? +# 1051| r1051_24(int) = Load[?] : &:r1051_23, ~m? # 1051| r1051_25(glval) = PointerAdd[1] : r1051_17, r1051_24 -# 1051| r1051_26(char) = Load : &:r1051_25, ~m? -# 1051| mu1051_27(char) = Store : &:r1051_10, r1051_26 +# 1051| r1051_26(char) = Load[?] : &:r1051_25, ~m? +# 1051| mu1051_27(char) = Store[#return] : &:r1051_10, r1051_26 # 1051| v1051_28(void) = ReturnIndirection[#this] : &:r1051_6, ~m? # 1051| r1051_29(glval) = VariableAddress[#return] : # 1051| v1051_30(void) = ReturnValue : &:r1051_29, ~m? @@ -6092,15 +6092,15 @@ ir.cpp: # 1054| mu1054_3(unknown) = InitializeNonLocal : # 1054| r1054_4(glval) = VariableAddress[#this] : # 1054| mu1054_5(glval) = InitializeParameter[#this] : &:r1054_4 -# 1054| r1054_6(glval) = Load : &:r1054_4, ~m? +# 1054| r1054_6(glval) = Load[#this] : &:r1054_4, ~m? # 1054| mu1054_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1054_6 # 1054| r1054_8(glval) = VariableAddress[f] : # 1054| mu1054_9(float) = InitializeParameter[f] : &:r1054_8 # 1054| r1054_10(glval) = VariableAddress[#return] : # 1054| r1054_11(glval) = VariableAddress[#this] : -# 1054| r1054_12(lambda [] type at line 1054, col. 23 *) = Load : &:r1054_11, ~m? +# 1054| r1054_12(lambda [] type at line 1054, col. 23 *) = Load[#this] : &:r1054_11, ~m? # 1054| r1054_13(glval) = FieldAddress[s] : r1054_12 -# 1054| r1054_14(String &) = Load : &:r1054_13, ~m? +# 1054| r1054_14(String &) = Load[?] : &:r1054_13, ~m? # 1054| r1054_15(glval) = CopyValue : r1054_14 # 1054| r1054_16(glval) = FunctionAddress[c_str] : # 1054| r1054_17(char *) = Call[c_str] : func:r1054_16, this:r1054_15 @@ -6108,23 +6108,23 @@ ir.cpp: # 1054| v1054_19(void) = ^BufferReadSideEffect[-1] : &:r1054_15, ~m? # 1054| mu1054_20(String) = ^IndirectMayWriteSideEffect[-1] : &:r1054_15 # 1054| r1054_21(glval) = VariableAddress[#this] : -# 1054| r1054_22(lambda [] type at line 1054, col. 23 *) = Load : &:r1054_21, ~m? +# 1054| r1054_22(lambda [] type at line 1054, col. 23 *) = Load[#this] : &:r1054_21, ~m? # 1054| r1054_23(glval) = FieldAddress[x] : r1054_22 -# 1054| r1054_24(int) = Load : &:r1054_23, ~m? +# 1054| r1054_24(int) = Load[?] : &:r1054_23, ~m? # 1054| r1054_25(glval) = VariableAddress[#this] : -# 1054| r1054_26(lambda [] type at line 1054, col. 23 *) = Load : &:r1054_25, ~m? +# 1054| r1054_26(lambda [] type at line 1054, col. 23 *) = Load[#this] : &:r1054_25, ~m? # 1054| r1054_27(glval) = FieldAddress[i] : r1054_26 -# 1054| r1054_28(int) = Load : &:r1054_27, ~m? +# 1054| r1054_28(int) = Load[?] : &:r1054_27, ~m? # 1054| r1054_29(int) = Add : r1054_24, r1054_28 # 1054| r1054_30(glval) = VariableAddress[#this] : -# 1054| r1054_31(lambda [] type at line 1054, col. 23 *) = Load : &:r1054_30, ~m? +# 1054| r1054_31(lambda [] type at line 1054, col. 23 *) = Load[#this] : &:r1054_30, ~m? # 1054| r1054_32(glval) = FieldAddress[j] : r1054_31 -# 1054| r1054_33(int &) = Load : &:r1054_32, ~m? -# 1054| r1054_34(int) = Load : &:r1054_33, ~m? +# 1054| r1054_33(int &) = Load[?] : &:r1054_32, ~m? +# 1054| r1054_34(int) = Load[?] : &:r1054_33, ~m? # 1054| r1054_35(int) = Sub : r1054_29, r1054_34 # 1054| r1054_36(glval) = PointerAdd[1] : r1054_17, r1054_35 -# 1054| r1054_37(char) = Load : &:r1054_36, ~m? -# 1054| mu1054_38(char) = Store : &:r1054_10, r1054_37 +# 1054| r1054_37(char) = Load[?] : &:r1054_36, ~m? +# 1054| mu1054_38(char) = Store[#return] : &:r1054_10, r1054_37 # 1054| v1054_39(void) = ReturnIndirection[#this] : &:r1054_6, ~m? # 1054| r1054_40(glval) = VariableAddress[#return] : # 1054| v1054_41(void) = ReturnValue : &:r1054_40, ~m? @@ -6138,34 +6138,34 @@ ir.cpp: # 1077| mu1077_3(unknown) = InitializeNonLocal : # 1077| r1077_4(glval &>) = VariableAddress[v] : # 1077| mu1077_5(vector &) = InitializeParameter[v] : &:r1077_4 -# 1077| r1077_6(vector &) = Load : &:r1077_4, ~m? +# 1077| r1077_6(vector &) = Load[v] : &:r1077_4, ~m? # 1077| mu1077_7(unknown) = InitializeIndirection[v] : &:r1077_6 # 1078| r1078_1(glval &>) = VariableAddress[(__range)] : # 1078| r1078_2(glval &>) = VariableAddress[v] : -# 1078| r1078_3(vector &) = Load : &:r1078_2, ~m? +# 1078| r1078_3(vector &) = Load[v] : &:r1078_2, ~m? # 1078| r1078_4(glval>) = CopyValue : r1078_3 # 1078| r1078_5(vector &) = CopyValue : r1078_4 -# 1078| mu1078_6(vector &) = Store : &:r1078_1, r1078_5 +# 1078| mu1078_6(vector &) = Store[(__range)] : &:r1078_1, r1078_5 # 1078| r1078_7(glval) = VariableAddress[(__begin)] : # 1078| r1078_8(glval &>) = VariableAddress[(__range)] : -# 1078| r1078_9(vector &) = Load : &:r1078_8, ~m? +# 1078| r1078_9(vector &) = Load[(__range)] : &:r1078_8, ~m? #-----| r0_1(glval>) = CopyValue : r1078_9 # 1078| r1078_10(glval) = FunctionAddress[begin] : # 1078| r1078_11(iterator) = Call[begin] : func:r1078_10, this:r0_1 # 1078| mu1078_12(unknown) = ^CallSideEffect : ~m? #-----| v0_2(void) = ^BufferReadSideEffect[-1] : &:r0_1, ~m? #-----| mu0_3(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_1 -# 1078| mu1078_13(iterator) = Store : &:r1078_7, r1078_11 +# 1078| mu1078_13(iterator) = Store[(__begin)] : &:r1078_7, r1078_11 # 1078| r1078_14(glval) = VariableAddress[(__end)] : # 1078| r1078_15(glval &>) = VariableAddress[(__range)] : -# 1078| r1078_16(vector &) = Load : &:r1078_15, ~m? +# 1078| r1078_16(vector &) = Load[(__range)] : &:r1078_15, ~m? #-----| r0_4(glval>) = CopyValue : r1078_16 # 1078| r1078_17(glval) = FunctionAddress[end] : # 1078| r1078_18(iterator) = Call[end] : func:r1078_17, this:r0_4 # 1078| mu1078_19(unknown) = ^CallSideEffect : ~m? #-----| v0_5(void) = ^BufferReadSideEffect[-1] : &:r0_4, ~m? #-----| mu0_6(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_4 -# 1078| mu1078_20(iterator) = Store : &:r1078_14, r1078_18 +# 1078| mu1078_20(iterator) = Store[(__end)] : &:r1078_14, r1078_18 #-----| Goto -> Block 6 # 1084| Block 1 @@ -6173,7 +6173,7 @@ ir.cpp: #-----| r0_7(glval) = Convert : r1084_1 # 1084| r1084_2(glval) = FunctionAddress[operator!=] : # 1084| r1084_3(glval) = VariableAddress[(__end)] : -# 1084| r1084_4(iterator) = Load : &:r1084_3, ~m? +# 1084| r1084_4(iterator) = Load[(__end)] : &:r1084_3, ~m? # 1084| r1084_5(bool) = Call[operator!=] : func:r1084_2, this:r0_7, 0:r1084_4 # 1084| mu1084_6(unknown) = ^CallSideEffect : ~m? #-----| v0_8(void) = ^BufferReadSideEffect[-1] : &:r0_7, ~m? @@ -6204,10 +6204,10 @@ ir.cpp: # 1084| r1084_20(glval) = CopyValue : r1084_18 # 1084| r1084_21(glval) = Convert : r1084_20 # 1084| r1084_22(int &) = CopyValue : r1084_21 -# 1084| mu1084_23(int &) = Store : &:r1084_15, r1084_22 +# 1084| mu1084_23(int &) = Store[e] : &:r1084_15, r1084_22 # 1085| r1085_1(glval) = VariableAddress[e] : -# 1085| r1085_2(int &) = Load : &:r1085_1, ~m? -# 1085| r1085_3(int) = Load : &:r1085_2, ~m? +# 1085| r1085_2(int &) = Load[e] : &:r1085_1, ~m? +# 1085| r1085_3(int) = Load[?] : &:r1085_2, ~m? # 1085| r1085_4(int) = Constant[5] : # 1085| r1085_5(bool) = CompareLT : r1085_3, r1085_4 # 1085| v1085_6(void) = ConditionalBranch : r1085_5 @@ -6231,7 +6231,7 @@ ir.cpp: #-----| r0_13(glval) = Convert : r1078_21 # 1078| r1078_22(glval) = FunctionAddress[operator!=] : # 1078| r1078_23(glval) = VariableAddress[(__end)] : -# 1078| r1078_24(iterator) = Load : &:r1078_23, ~m? +# 1078| r1078_24(iterator) = Load[(__end)] : &:r1078_23, ~m? # 1078| r1078_25(bool) = Call[operator!=] : func:r1078_22, this:r0_13, 0:r1078_24 # 1078| mu1078_26(unknown) = ^CallSideEffect : ~m? #-----| v0_14(void) = ^BufferReadSideEffect[-1] : &:r0_13, ~m? @@ -6249,10 +6249,10 @@ ir.cpp: # 1078| mu1078_32(unknown) = ^CallSideEffect : ~m? #-----| v0_17(void) = ^BufferReadSideEffect[-1] : &:r0_16, ~m? #-----| mu0_18(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_16 -# 1078| r1078_33(int) = Load : &:r1078_31, ~m? -# 1078| mu1078_34(int) = Store : &:r1078_28, r1078_33 +# 1078| r1078_33(int) = Load[?] : &:r1078_31, ~m? +# 1078| mu1078_34(int) = Store[e] : &:r1078_28, r1078_33 # 1079| r1079_1(glval) = VariableAddress[e] : -# 1079| r1079_2(int) = Load : &:r1079_1, ~m? +# 1079| r1079_2(int) = Load[e] : &:r1079_1, ~m? # 1079| r1079_3(int) = Constant[0] : # 1079| r1079_4(bool) = CompareGT : r1079_2, r1079_3 # 1079| v1079_5(void) = ConditionalBranch : r1079_4 @@ -6277,30 +6277,30 @@ ir.cpp: # 1084| Block 10 # 1084| r1084_24(glval &>) = VariableAddress[(__range)] : # 1084| r1084_25(glval &>) = VariableAddress[v] : -# 1084| r1084_26(vector &) = Load : &:r1084_25, ~m? +# 1084| r1084_26(vector &) = Load[v] : &:r1084_25, ~m? # 1084| r1084_27(glval>) = CopyValue : r1084_26 # 1084| r1084_28(vector &) = CopyValue : r1084_27 -# 1084| mu1084_29(vector &) = Store : &:r1084_24, r1084_28 +# 1084| mu1084_29(vector &) = Store[(__range)] : &:r1084_24, r1084_28 # 1084| r1084_30(glval) = VariableAddress[(__begin)] : # 1084| r1084_31(glval &>) = VariableAddress[(__range)] : -# 1084| r1084_32(vector &) = Load : &:r1084_31, ~m? +# 1084| r1084_32(vector &) = Load[(__range)] : &:r1084_31, ~m? #-----| r0_19(glval>) = CopyValue : r1084_32 # 1084| r1084_33(glval) = FunctionAddress[begin] : # 1084| r1084_34(iterator) = Call[begin] : func:r1084_33, this:r0_19 # 1084| mu1084_35(unknown) = ^CallSideEffect : ~m? #-----| v0_20(void) = ^BufferReadSideEffect[-1] : &:r0_19, ~m? #-----| mu0_21(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_19 -# 1084| mu1084_36(iterator) = Store : &:r1084_30, r1084_34 +# 1084| mu1084_36(iterator) = Store[(__begin)] : &:r1084_30, r1084_34 # 1084| r1084_37(glval) = VariableAddress[(__end)] : # 1084| r1084_38(glval &>) = VariableAddress[(__range)] : -# 1084| r1084_39(vector &) = Load : &:r1084_38, ~m? +# 1084| r1084_39(vector &) = Load[(__range)] : &:r1084_38, ~m? #-----| r0_22(glval>) = CopyValue : r1084_39 # 1084| r1084_40(glval) = FunctionAddress[end] : # 1084| r1084_41(iterator) = Call[end] : func:r1084_40, this:r0_22 # 1084| mu1084_42(unknown) = ^CallSideEffect : ~m? #-----| v0_23(void) = ^BufferReadSideEffect[-1] : &:r0_22, ~m? #-----| mu0_24(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_22 -# 1084| mu1084_43(iterator) = Store : &:r1084_37, r1084_41 +# 1084| mu1084_43(iterator) = Store[(__end)] : &:r1084_37, r1084_41 #-----| Goto -> Block 1 # 1108| int AsmStmt(int) @@ -6313,8 +6313,8 @@ ir.cpp: # 1109| mu1109_1(unknown) = InlineAsm : ~m? # 1110| r1110_1(glval) = VariableAddress[#return] : # 1110| r1110_2(glval) = VariableAddress[x] : -# 1110| r1110_3(int) = Load : &:r1110_2, ~m? -# 1110| mu1110_4(int) = Store : &:r1110_1, r1110_3 +# 1110| r1110_3(int) = Load[x] : &:r1110_2, ~m? +# 1110| mu1110_4(int) = Store[#return] : &:r1110_1, r1110_3 # 1108| r1108_6(glval) = VariableAddress[#return] : # 1108| v1108_7(void) = ReturnValue : &:r1108_6, ~m? # 1108| v1108_8(void) = AliasedUse : ~m? @@ -6327,25 +6327,25 @@ ir.cpp: # 1113| mu1113_3(unknown) = InitializeNonLocal : # 1113| r1113_4(glval) = VariableAddress[a] : # 1113| mu1113_5(unsigned int &) = InitializeParameter[a] : &:r1113_4 -# 1113| r1113_6(unsigned int &) = Load : &:r1113_4, ~m? +# 1113| r1113_6(unsigned int &) = Load[a] : &:r1113_4, ~m? # 1113| mu1113_7(unknown) = InitializeIndirection[a] : &:r1113_6 # 1113| r1113_8(glval) = VariableAddress[b] : # 1113| mu1113_9(unsigned int) = InitializeParameter[b] : &:r1113_8 # 1113| r1113_10(glval) = VariableAddress[c] : # 1113| mu1113_11(unsigned int &) = InitializeParameter[c] : &:r1113_10 -# 1113| r1113_12(unsigned int &) = Load : &:r1113_10, ~m? +# 1113| r1113_12(unsigned int &) = Load[c] : &:r1113_10, ~m? # 1113| mu1113_13(unknown) = InitializeIndirection[c] : &:r1113_12 # 1113| r1113_14(glval) = VariableAddress[d] : # 1113| mu1113_15(unsigned int) = InitializeParameter[d] : &:r1113_14 # 1118| r1118_1(glval) = VariableAddress[a] : -# 1118| r1118_2(unsigned int &) = Load : &:r1118_1, ~m? +# 1118| r1118_2(unsigned int &) = Load[a] : &:r1118_1, ~m? # 1118| r1118_3(glval) = CopyValue : r1118_2 # 1118| r1118_4(glval) = VariableAddress[b] : # 1118| r1118_5(glval) = VariableAddress[c] : -# 1118| r1118_6(unsigned int &) = Load : &:r1118_5, ~m? -# 1118| r1118_7(unsigned int) = Load : &:r1118_6, ~m? +# 1118| r1118_6(unsigned int &) = Load[c] : &:r1118_5, ~m? +# 1118| r1118_7(unsigned int) = Load[?] : &:r1118_6, ~m? # 1118| r1118_8(glval) = VariableAddress[d] : -# 1118| r1118_9(unsigned int) = Load : &:r1118_8, ~m? +# 1118| r1118_9(unsigned int) = Load[d] : &:r1118_8, ~m? # 1115| mu1115_1(unknown) = InlineAsm : ~m?, 0:r1118_3, 1:r1118_4, 2:r1118_7, 3:r1118_9 # 1120| v1120_1(void) = NoOp : # 1113| v1113_16(void) = ReturnIndirection[a] : &:r1113_6, ~m? @@ -6377,12 +6377,12 @@ ir.cpp: # 1137| mu1137_3(unknown) = InitializeNonLocal : # 1139| r1139_1(glval) = VariableAddress[i] : # 1139| r1139_2(int) = Constant[0] : -# 1139| mu1139_3(int) = Store : &:r1139_1, r1139_2 +# 1139| mu1139_3(int) = Store[i] : &:r1139_1, r1139_2 #-----| Goto -> Block 1 # 1139| Block 1 # 1139| r1139_4(glval) = VariableAddress[i] : -# 1139| r1139_5(int) = Load : &:r1139_4, ~m? +# 1139| r1139_5(int) = Load[i] : &:r1139_4, ~m? # 1139| r1139_6(int) = Constant[10] : # 1139| r1139_7(bool) = CompareLT : r1139_5, r1139_6 # 1139| v1139_8(void) = ConditionalBranch : r1139_7 @@ -6391,10 +6391,10 @@ ir.cpp: # 1139| Block 2 # 1139| r1139_9(glval) = VariableAddress[i] : -# 1139| r1139_10(int) = Load : &:r1139_9, ~m? +# 1139| r1139_10(int) = Load[i] : &:r1139_9, ~m? # 1139| r1139_11(int) = Constant[1] : # 1139| r1139_12(int) = Add : r1139_10, r1139_11 -# 1139| mu1139_13(int) = Store : &:r1139_9, r1139_12 +# 1139| mu1139_13(int) = Store[i] : &:r1139_9, r1139_12 #-----| Goto (back edge) -> Block 1 # 1139| Block 3 @@ -6413,9 +6413,9 @@ ir.cpp: # 1142| mu1142_5(bool) = InitializeParameter[b] : &:r1142_4 # 1144| r1144_1(glval) = VariableAddress[x] : # 1144| r1144_2(int) = Constant[5] : -# 1144| mu1144_3(int) = Store : &:r1144_1, r1144_2 +# 1144| mu1144_3(int) = Store[x] : &:r1144_1, r1144_2 # 1145| r1145_1(glval) = VariableAddress[b] : -# 1145| r1145_2(bool) = Load : &:r1145_1, ~m? +# 1145| r1145_2(bool) = Load[b] : &:r1145_1, ~m? # 1145| v1145_3(void) = ConditionalBranch : r1145_2 #-----| False -> Block 4 #-----| True -> Block 3 @@ -6432,13 +6432,13 @@ ir.cpp: # 1146| r1146_1(glval) = VariableAddress[#throw1146:7] : # 1146| r1146_2(glval) = StringConstant["string literal"] : # 1146| r1146_3(char *) = Convert : r1146_2 -# 1146| mu1146_4(char *) = Store : &:r1146_1, r1146_3 +# 1146| mu1146_4(char *) = Store[#throw1146:7] : &:r1146_1, r1146_3 # 1146| v1146_5(void) = ThrowValue : &:r1146_1, ~m? #-----| Exception -> Block 9 # 1148| Block 4 # 1148| r1148_1(glval) = VariableAddress[x] : -# 1148| r1148_2(int) = Load : &:r1148_1, ~m? +# 1148| r1148_2(int) = Load[x] : &:r1148_1, ~m? # 1148| r1148_3(int) = Constant[2] : # 1148| r1148_4(bool) = CompareLT : r1148_2, r1148_3 # 1148| v1148_5(void) = ConditionalBranch : r1148_4 @@ -6447,7 +6447,7 @@ ir.cpp: # 1149| Block 5 # 1149| r1149_1(glval) = VariableAddress[b] : -# 1149| r1149_2(bool) = Load : &:r1149_1, ~m? +# 1149| r1149_2(bool) = Load[b] : &:r1149_1, ~m? # 1149| v1149_3(void) = ConditionalBranch : r1149_2 #-----| False -> Block 7 #-----| True -> Block 6 @@ -6455,11 +6455,11 @@ ir.cpp: # 1149| Block 6 # 1149| r1149_4(int) = Constant[7] : # 1149| r1149_5(glval) = VariableAddress[#temp1149:11] : -# 1149| mu1149_6(int) = Store : &:r1149_5, r1149_4 +# 1149| mu1149_6(int) = Store[#temp1149:11] : &:r1149_5, r1149_4 # 1149| r1149_7(glval) = VariableAddress[#temp1149:11] : -# 1149| r1149_8(int) = Load : &:r1149_7, ~m? +# 1149| r1149_8(int) = Load[#temp1149:11] : &:r1149_7, ~m? # 1149| r1149_9(glval) = VariableAddress[x] : -# 1149| mu1149_10(int) = Store : &:r1149_9, r1149_8 +# 1149| mu1149_10(int) = Store[x] : &:r1149_9, r1149_8 #-----| Goto -> Block 8 # 1149| Block 7 @@ -6479,7 +6479,7 @@ ir.cpp: # 1151| Block 8 # 1151| r1151_1(int) = Constant[7] : # 1151| r1151_2(glval) = VariableAddress[x] : -# 1151| mu1151_3(int) = Store : &:r1151_2, r1151_1 +# 1151| mu1151_3(int) = Store[x] : &:r1151_2, r1151_1 #-----| Goto -> Block 13 # 1153| Block 9 @@ -6490,13 +6490,13 @@ ir.cpp: # 1153| Block 10 # 1153| r1153_2(glval) = VariableAddress[s] : # 1153| mu1153_3(char *) = InitializeParameter[s] : &:r1153_2 -# 1153| r1153_4(char *) = Load : &:r1153_2, ~m? +# 1153| r1153_4(char *) = Load[s] : &:r1153_2, ~m? # 1153| mu1153_5(unknown) = InitializeIndirection[s] : &:r1153_4 # 1154| r1154_1(glval) = VariableAddress[#throw1154:5] : # 1154| mu1154_2(String) = Uninitialized[#throw1154:5] : &:r1154_1 # 1154| r1154_3(glval) = FunctionAddress[String] : # 1154| r1154_4(glval) = VariableAddress[s] : -# 1154| r1154_5(char *) = Load : &:r1154_4, ~m? +# 1154| r1154_5(char *) = Load[s] : &:r1154_4, ~m? # 1154| v1154_6(void) = Call[String] : func:r1154_3, this:r1154_1, 0:r1154_5 # 1154| mu1154_7(unknown) = ^CallSideEffect : ~m? # 1154| mu1154_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r1154_1 @@ -6513,7 +6513,7 @@ ir.cpp: # 1156| Block 12 # 1156| r1156_2(glval) = VariableAddress[e] : # 1156| mu1156_3(String &) = InitializeParameter[e] : &:r1156_2 -# 1156| r1156_4(String &) = Load : &:r1156_2, ~m? +# 1156| r1156_4(String &) = Load[e] : &:r1156_2, ~m? # 1156| mu1156_5(unknown) = InitializeIndirection[e] : &:r1156_4 # 1156| v1156_6(void) = NoOp : #-----| Goto -> Block 13 @@ -6535,51 +6535,51 @@ ir.cpp: # 1163| r1163_3(int) = Constant[0] : # 1163| r1163_4(glval) = PointerAdd[4] : r1163_1, r1163_3 # 1163| r1163_5(int) = Constant[0] : -# 1163| mu1163_6(int) = Store : &:r1163_4, r1163_5 +# 1163| mu1163_6(int) = Store[?] : &:r1163_4, r1163_5 # 1163| r1163_7(int) = Constant[1] : # 1163| r1163_8(glval) = PointerAdd[4] : r1163_1, r1163_7 # 1163| r1163_9(int) = Constant[1] : -# 1163| mu1163_10(int) = Store : &:r1163_8, r1163_9 +# 1163| mu1163_10(int) = Store[?] : &:r1163_8, r1163_9 # 1163| r1163_11(int) = Constant[2] : # 1163| r1163_12(glval) = PointerAdd[4] : r1163_1, r1163_11 # 1163| r1163_13(int) = Constant[2] : -# 1163| mu1163_14(int) = Store : &:r1163_12, r1163_13 +# 1163| mu1163_14(int) = Store[?] : &:r1163_12, r1163_13 # 1163| r1163_15(int) = Constant[3] : # 1163| r1163_16(glval) = PointerAdd[4] : r1163_1, r1163_15 # 1163| r1163_17(int) = Constant[3] : -# 1163| mu1163_18(int) = Store : &:r1163_16, r1163_17 +# 1163| mu1163_18(int) = Store[?] : &:r1163_16, r1163_17 # 1164| r1164_1(glval) = VariableAddress[x] : # 1164| r1164_2(glval<__attribute((vector_size(16UL))) int>) = VariableAddress[vi4] : # 1164| r1164_3(glval) = VariableAddress[i] : -# 1164| r1164_4(int) = Load : &:r1164_3, ~m? +# 1164| r1164_4(int) = Load[i] : &:r1164_3, ~m? # 1164| r1164_5(glval) = PointerAdd[4] : r1164_2, r1164_4 -# 1164| r1164_6(int) = Load : &:r1164_5, ~m? -# 1164| mu1164_7(int) = Store : &:r1164_1, r1164_6 +# 1164| r1164_6(int) = Load[?] : &:r1164_5, ~m? +# 1164| mu1164_7(int) = Store[x] : &:r1164_1, r1164_6 # 1165| r1165_1(glval) = VariableAddress[x] : -# 1165| r1165_2(int) = Load : &:r1165_1, ~m? +# 1165| r1165_2(int) = Load[x] : &:r1165_1, ~m? # 1165| r1165_3(glval<__attribute((vector_size(16UL))) int>) = VariableAddress[vi4] : # 1165| r1165_4(glval) = VariableAddress[i] : -# 1165| r1165_5(int) = Load : &:r1165_4, ~m? +# 1165| r1165_5(int) = Load[i] : &:r1165_4, ~m? # 1165| r1165_6(glval) = PointerAdd[4] : r1165_3, r1165_5 -# 1165| mu1165_7(int) = Store : &:r1165_6, r1165_2 +# 1165| mu1165_7(int) = Store[?] : &:r1165_6, r1165_2 # 1166| r1166_1(glval<__attribute((vector_size(16UL))) int>) = VariableAddress[vi4_shuffle] : # 1166| r1166_2(glval<__attribute((vector_size(16UL))) int>) = VariableAddress[vi4] : -# 1166| r1166_3(__attribute((vector_size(16UL))) int) = Load : &:r1166_2, ~m? +# 1166| r1166_3(__attribute((vector_size(16UL))) int) = Load[vi4] : &:r1166_2, ~m? # 1166| r1166_4(glval<__attribute((vector_size(16UL))) int>) = VariableAddress[vi4] : -# 1166| r1166_5(__attribute((vector_size(16UL))) int) = Load : &:r1166_4, ~m? +# 1166| r1166_5(__attribute((vector_size(16UL))) int) = Load[vi4] : &:r1166_4, ~m? # 1166| r1166_6(int) = Constant[3] : # 1166| r1166_7(int) = Constant[2] : # 1166| r1166_8(int) = Constant[1] : # 1166| r1166_9(int) = Constant[0] : # 1166| r1166_10(__attribute((vector_size(16))) int) = BuiltIn[__builtin_shufflevector] : 0:r1166_3, 1:r1166_5, 2:r1166_6, 3:r1166_7, 4:r1166_8, 5:r1166_9 -# 1166| mu1166_11(__attribute((vector_size(16UL))) int) = Store : &:r1166_1, r1166_10 +# 1166| mu1166_11(__attribute((vector_size(16UL))) int) = Store[vi4_shuffle] : &:r1166_1, r1166_10 # 1167| r1167_1(glval<__attribute((vector_size(16UL))) int>) = VariableAddress[vi4] : -# 1167| r1167_2(__attribute((vector_size(16UL))) int) = Load : &:r1167_1, ~m? +# 1167| r1167_2(__attribute((vector_size(16UL))) int) = Load[vi4] : &:r1167_1, ~m? # 1167| r1167_3(glval<__attribute((vector_size(16UL))) int>) = VariableAddress[vi4_shuffle] : -# 1167| r1167_4(__attribute((vector_size(16UL))) int) = Load : &:r1167_3, ~m? +# 1167| r1167_4(__attribute((vector_size(16UL))) int) = Load[vi4_shuffle] : &:r1167_3, ~m? # 1167| r1167_5(__attribute((vector_size(16UL))) int) = Add : r1167_2, r1167_4 # 1167| r1167_6(glval<__attribute((vector_size(16UL))) int>) = VariableAddress[vi4] : -# 1167| mu1167_7(__attribute((vector_size(16UL))) int) = Store : &:r1167_6, r1167_5 +# 1167| mu1167_7(__attribute((vector_size(16UL))) int) = Store[vi4] : &:r1167_6, r1167_5 # 1168| v1168_1(void) = NoOp : # 1162| v1162_6(void) = ReturnVoid : # 1162| v1162_7(void) = AliasedUse : ~m? @@ -6607,8 +6607,8 @@ ir.cpp: # 1174| mu1174_11(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r1174_4, r1174_8 # 1175| r1175_1(glval) = VariableAddress[#return] : # 1175| r1175_2(glval) = VariableAddress[y] : -# 1175| r1175_3(int) = Load : &:r1175_2, ~m? -# 1175| mu1175_4(int) = Store : &:r1175_1, r1175_3 +# 1175| r1175_3(int) = Load[y] : &:r1175_2, ~m? +# 1175| mu1175_4(int) = Store[#return] : &:r1175_1, r1175_3 # 1172| r1172_6(glval) = VariableAddress[#return] : # 1172| v1172_7(void) = ReturnValue : &:r1172_6, ~m? # 1172| v1172_8(void) = AliasedUse : ~m? @@ -6643,9 +6643,9 @@ ir.cpp: # 1182| mu1182_5(int) = InitializeParameter[x] : &:r1182_4 # 1183| r1183_1(glval) = VariableAddress[y] : # 1183| r1183_2(int) = Constant[0] : -# 1183| mu1183_3(int) = Store : &:r1183_1, r1183_2 +# 1183| mu1183_3(int) = Store[y] : &:r1183_1, r1183_2 # 1184| r1184_1(glval) = VariableAddress[x] : -# 1184| r1184_2(int) = Load : &:r1184_1, ~m? +# 1184| r1184_2(int) = Load[x] : &:r1184_1, ~m? # 1184| v1184_3(void) = Switch : r1184_2 #-----| Case[1] -> Block 1 #-----| Default -> Block 2 @@ -6654,14 +6654,14 @@ ir.cpp: # 1185| v1185_1(void) = NoOp : # 1186| r1186_1(int) = Constant[2] : # 1186| r1186_2(glval) = VariableAddress[y] : -# 1186| mu1186_3(int) = Store : &:r1186_2, r1186_1 +# 1186| mu1186_3(int) = Store[y] : &:r1186_2, r1186_1 #-----| Goto -> Block 2 # 1188| Block 2 # 1188| r1188_1(glval) = VariableAddress[z] : # 1188| r1188_2(glval) = VariableAddress[y] : -# 1188| r1188_3(int) = Load : &:r1188_2, ~m? -# 1188| mu1188_4(int) = Store : &:r1188_1, r1188_3 +# 1188| r1188_3(int) = Load[y] : &:r1188_2, ~m? +# 1188| mu1188_4(int) = Store[z] : &:r1188_1, r1188_3 # 1189| v1189_1(void) = NoOp : # 1182| v1182_6(void) = ReturnVoid : # 1182| v1182_7(void) = AliasedUse : ~m? @@ -6676,9 +6676,9 @@ ir.cpp: # 1191| mu1191_5(int) = InitializeParameter[x] : &:r1191_4 # 1192| r1192_1(glval) = VariableAddress[y] : # 1192| r1192_2(int) = Constant[0] : -# 1192| mu1192_3(int) = Store : &:r1192_1, r1192_2 +# 1192| mu1192_3(int) = Store[y] : &:r1192_1, r1192_2 # 1193| r1193_1(glval) = VariableAddress[x] : -# 1193| r1193_2(int) = Load : &:r1193_1, ~m? +# 1193| r1193_2(int) = Load[x] : &:r1193_1, ~m? # 1193| v1193_3(void) = Switch : r1193_2 #-----| Case[1] -> Block 1 #-----| Case[2] -> Block 2 @@ -6688,21 +6688,21 @@ ir.cpp: # 1194| v1194_1(void) = NoOp : # 1195| r1195_1(int) = Constant[2] : # 1195| r1195_2(glval) = VariableAddress[y] : -# 1195| mu1195_3(int) = Store : &:r1195_2, r1195_1 +# 1195| mu1195_3(int) = Store[y] : &:r1195_2, r1195_1 #-----| Goto -> Block 2 # 1196| Block 2 # 1196| v1196_1(void) = NoOp : # 1197| r1197_1(int) = Constant[3] : # 1197| r1197_2(glval) = VariableAddress[y] : -# 1197| mu1197_3(int) = Store : &:r1197_2, r1197_1 +# 1197| mu1197_3(int) = Store[y] : &:r1197_2, r1197_1 #-----| Goto -> Block 3 # 1199| Block 3 # 1199| r1199_1(glval) = VariableAddress[z] : # 1199| r1199_2(glval) = VariableAddress[y] : -# 1199| r1199_3(int) = Load : &:r1199_2, ~m? -# 1199| mu1199_4(int) = Store : &:r1199_1, r1199_3 +# 1199| r1199_3(int) = Load[y] : &:r1199_2, ~m? +# 1199| mu1199_4(int) = Store[z] : &:r1199_1, r1199_3 # 1200| v1200_1(void) = NoOp : # 1191| v1191_6(void) = ReturnVoid : # 1191| v1191_7(void) = AliasedUse : ~m? @@ -6717,9 +6717,9 @@ ir.cpp: # 1202| mu1202_5(int) = InitializeParameter[x] : &:r1202_4 # 1203| r1203_1(glval) = VariableAddress[y] : # 1203| r1203_2(int) = Constant[0] : -# 1203| mu1203_3(int) = Store : &:r1203_1, r1203_2 +# 1203| mu1203_3(int) = Store[y] : &:r1203_1, r1203_2 # 1204| r1204_1(glval) = VariableAddress[x] : -# 1204| r1204_2(int) = Load : &:r1204_1, ~m? +# 1204| r1204_2(int) = Load[x] : &:r1204_1, ~m? # 1204| v1204_3(void) = Switch : r1204_2 #-----| Case[1] -> Block 1 #-----| Case[2] -> Block 2 @@ -6729,7 +6729,7 @@ ir.cpp: # 1205| v1205_1(void) = NoOp : # 1206| r1206_1(int) = Constant[2] : # 1206| r1206_2(glval) = VariableAddress[y] : -# 1206| mu1206_3(int) = Store : &:r1206_2, r1206_1 +# 1206| mu1206_3(int) = Store[y] : &:r1206_2, r1206_1 # 1207| v1207_1(void) = NoOp : #-----| Goto -> Block 3 @@ -6737,15 +6737,15 @@ ir.cpp: # 1208| v1208_1(void) = NoOp : # 1209| r1209_1(int) = Constant[3] : # 1209| r1209_2(glval) = VariableAddress[y] : -# 1209| mu1209_3(int) = Store : &:r1209_2, r1209_1 +# 1209| mu1209_3(int) = Store[y] : &:r1209_2, r1209_1 #-----| Goto -> Block 3 # 1210| Block 3 # 1210| v1210_1(void) = NoOp : # 1211| r1211_1(glval) = VariableAddress[z] : # 1211| r1211_2(glval) = VariableAddress[y] : -# 1211| r1211_3(int) = Load : &:r1211_2, ~m? -# 1211| mu1211_4(int) = Store : &:r1211_1, r1211_3 +# 1211| r1211_3(int) = Load[y] : &:r1211_2, ~m? +# 1211| mu1211_4(int) = Store[z] : &:r1211_1, r1211_3 # 1212| v1212_1(void) = NoOp : # 1202| v1202_6(void) = ReturnVoid : # 1202| v1202_7(void) = AliasedUse : ~m? @@ -6760,9 +6760,9 @@ ir.cpp: # 1214| mu1214_5(int) = InitializeParameter[x] : &:r1214_4 # 1215| r1215_1(glval) = VariableAddress[y] : # 1215| r1215_2(int) = Constant[0] : -# 1215| mu1215_3(int) = Store : &:r1215_1, r1215_2 +# 1215| mu1215_3(int) = Store[y] : &:r1215_1, r1215_2 # 1216| r1216_1(glval) = VariableAddress[x] : -# 1216| r1216_2(int) = Load : &:r1216_1, ~m? +# 1216| r1216_2(int) = Load[x] : &:r1216_1, ~m? # 1216| v1216_3(void) = Switch : r1216_2 #-----| Case[1] -> Block 1 #-----| Case[2] -> Block 2 @@ -6772,7 +6772,7 @@ ir.cpp: # 1217| v1217_1(void) = NoOp : # 1218| r1218_1(int) = Constant[2] : # 1218| r1218_2(glval) = VariableAddress[y] : -# 1218| mu1218_3(int) = Store : &:r1218_2, r1218_1 +# 1218| mu1218_3(int) = Store[y] : &:r1218_2, r1218_1 # 1219| v1219_1(void) = NoOp : #-----| Goto -> Block 4 @@ -6780,7 +6780,7 @@ ir.cpp: # 1221| v1221_1(void) = NoOp : # 1222| r1222_1(int) = Constant[3] : # 1222| r1222_2(glval) = VariableAddress[y] : -# 1222| mu1222_3(int) = Store : &:r1222_2, r1222_1 +# 1222| mu1222_3(int) = Store[y] : &:r1222_2, r1222_1 # 1223| v1223_1(void) = NoOp : #-----| Goto -> Block 4 @@ -6788,15 +6788,15 @@ ir.cpp: # 1225| v1225_1(void) = NoOp : # 1226| r1226_1(int) = Constant[4] : # 1226| r1226_2(glval) = VariableAddress[y] : -# 1226| mu1226_3(int) = Store : &:r1226_2, r1226_1 +# 1226| mu1226_3(int) = Store[y] : &:r1226_2, r1226_1 #-----| Goto -> Block 4 # 1227| Block 4 # 1227| v1227_1(void) = NoOp : # 1228| r1228_1(glval) = VariableAddress[z] : # 1228| r1228_2(glval) = VariableAddress[y] : -# 1228| r1228_3(int) = Load : &:r1228_2, ~m? -# 1228| mu1228_4(int) = Store : &:r1228_1, r1228_3 +# 1228| r1228_3(int) = Load[y] : &:r1228_2, ~m? +# 1228| mu1228_4(int) = Store[z] : &:r1228_1, r1228_3 # 1229| v1229_1(void) = NoOp : # 1214| v1214_6(void) = ReturnVoid : # 1214| v1214_7(void) = AliasedUse : ~m? @@ -6810,7 +6810,7 @@ ir.cpp: # 1231| r1231_4(glval) = VariableAddress[x] : # 1231| mu1231_5(int) = InitializeParameter[x] : &:r1231_4 # 1234| r1234_1(glval) = VariableAddress[c#init] : -# 1234| r1234_2(bool) = Load : &:r1234_1, ~m? +# 1234| r1234_2(bool) = Load[c#init] : &:r1234_1, ~m? # 1234| v1234_3(void) = ConditionalBranch : r1234_2 #-----| False -> Block 2 #-----| True -> Block 1 @@ -6818,17 +6818,17 @@ ir.cpp: # 1237| Block 1 # 1237| r1237_1(glval) = VariableAddress[#return] : # 1237| r1237_2(glval) = VariableAddress[a] : -# 1237| r1237_3(int) = Load : &:r1237_2, ~m? +# 1237| r1237_3(int) = Load[a] : &:r1237_2, ~m? # 1237| r1237_4(glval) = VariableAddress[b] : -# 1237| r1237_5(int) = Load : &:r1237_4, ~m? +# 1237| r1237_5(int) = Load[b] : &:r1237_4, ~m? # 1237| r1237_6(int) = Add : r1237_3, r1237_5 # 1237| r1237_7(glval) = VariableAddress[c] : -# 1237| r1237_8(int) = Load : &:r1237_7, ~m? +# 1237| r1237_8(int) = Load[c] : &:r1237_7, ~m? # 1237| r1237_9(int) = Add : r1237_6, r1237_8 # 1237| r1237_10(glval) = VariableAddress[d] : -# 1237| r1237_11(int) = Load : &:r1237_10, ~m? +# 1237| r1237_11(int) = Load[d] : &:r1237_10, ~m? # 1237| r1237_12(int) = Add : r1237_9, r1237_11 -# 1237| mu1237_13(int) = Store : &:r1237_1, r1237_12 +# 1237| mu1237_13(int) = Store[#return] : &:r1237_1, r1237_12 # 1231| r1231_6(glval) = VariableAddress[#return] : # 1231| v1231_7(void) = ReturnValue : &:r1231_6, ~m? # 1231| v1231_8(void) = AliasedUse : ~m? @@ -6837,10 +6837,10 @@ ir.cpp: # 1234| Block 2 # 1234| r1234_4(glval) = VariableAddress[c] : # 1234| r1234_5(glval) = VariableAddress[x] : -# 1234| r1234_6(int) = Load : &:r1234_5, ~m? -# 1234| mu1234_7(int) = Store : &:r1234_4, r1234_6 +# 1234| r1234_6(int) = Load[x] : &:r1234_5, ~m? +# 1234| mu1234_7(int) = Store[c] : &:r1234_4, r1234_6 # 1234| r1234_8(bool) = Constant[1] : -# 1234| mu1234_9(bool) = Store : &:r1234_1, r1234_8 +# 1234| mu1234_9(bool) = Store[c#init] : &:r1234_1, r1234_8 #-----| Goto -> Block 1 # 1240| void staticLocalWithConstructor(char const*) @@ -6850,17 +6850,17 @@ ir.cpp: # 1240| mu1240_3(unknown) = InitializeNonLocal : # 1240| r1240_4(glval) = VariableAddress[dynamic] : # 1240| mu1240_5(char *) = InitializeParameter[dynamic] : &:r1240_4 -# 1240| r1240_6(char *) = Load : &:r1240_4, ~m? +# 1240| r1240_6(char *) = Load[dynamic] : &:r1240_4, ~m? # 1240| mu1240_7(unknown) = InitializeIndirection[dynamic] : &:r1240_6 # 1241| r1241_1(glval) = VariableAddress[a#init] : -# 1241| r1241_2(bool) = Load : &:r1241_1, ~m? +# 1241| r1241_2(bool) = Load[a#init] : &:r1241_1, ~m? # 1241| v1241_3(void) = ConditionalBranch : r1241_2 #-----| False -> Block 6 #-----| True -> Block 1 # 1242| Block 1 # 1242| r1242_1(glval) = VariableAddress[b#init] : -# 1242| r1242_2(bool) = Load : &:r1242_1, ~m? +# 1242| r1242_2(bool) = Load[b#init] : &:r1242_1, ~m? # 1242| v1242_3(void) = ConditionalBranch : r1242_2 #-----| False -> Block 2 #-----| True -> Block 3 @@ -6876,12 +6876,12 @@ ir.cpp: # 1242| v1242_11(void) = ^BufferReadSideEffect[0] : &:r1242_7, ~m? # 1242| mu1242_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r1242_7 # 1242| r1242_13(bool) = Constant[1] : -# 1242| mu1242_14(bool) = Store : &:r1242_1, r1242_13 +# 1242| mu1242_14(bool) = Store[b#init] : &:r1242_1, r1242_13 #-----| Goto -> Block 3 # 1243| Block 3 # 1243| r1243_1(glval) = VariableAddress[c#init] : -# 1243| r1243_2(bool) = Load : &:r1243_1, ~m? +# 1243| r1243_2(bool) = Load[c#init] : &:r1243_1, ~m? # 1243| v1243_3(void) = ConditionalBranch : r1243_2 #-----| False -> Block 4 #-----| True -> Block 5 @@ -6890,14 +6890,14 @@ ir.cpp: # 1243| r1243_4(glval) = VariableAddress[c] : # 1243| r1243_5(glval) = FunctionAddress[String] : # 1243| r1243_6(glval) = VariableAddress[dynamic] : -# 1243| r1243_7(char *) = Load : &:r1243_6, ~m? +# 1243| r1243_7(char *) = Load[dynamic] : &:r1243_6, ~m? # 1243| v1243_8(void) = Call[String] : func:r1243_5, this:r1243_4, 0:r1243_7 # 1243| mu1243_9(unknown) = ^CallSideEffect : ~m? # 1243| mu1243_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r1243_4 # 1243| v1243_11(void) = ^BufferReadSideEffect[0] : &:r1243_7, ~m? # 1243| mu1243_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r1243_7 # 1243| r1243_13(bool) = Constant[1] : -# 1243| mu1243_14(bool) = Store : &:r1243_1, r1243_13 +# 1243| mu1243_14(bool) = Store[c#init] : &:r1243_1, r1243_13 #-----| Goto -> Block 5 # 1244| Block 5 @@ -6914,7 +6914,7 @@ ir.cpp: #-----| mu0_3(unknown) = ^CallSideEffect : ~m? #-----| mu0_4(String) = ^IndirectMayWriteSideEffect[-1] : &:r1241_4 # 1241| r1241_5(bool) = Constant[1] : -# 1241| mu1241_6(bool) = Store : &:r1241_1, r1241_5 +# 1241| mu1241_6(bool) = Store[a#init] : &:r1241_1, r1241_5 #-----| Goto -> Block 1 # 1251| void test_strings(char*, char*) @@ -6924,27 +6924,27 @@ ir.cpp: # 1251| mu1251_3(unknown) = InitializeNonLocal : # 1251| r1251_4(glval) = VariableAddress[s1] : # 1251| mu1251_5(char *) = InitializeParameter[s1] : &:r1251_4 -# 1251| r1251_6(char *) = Load : &:r1251_4, ~m? +# 1251| r1251_6(char *) = Load[s1] : &:r1251_4, ~m? # 1251| mu1251_7(unknown) = InitializeIndirection[s1] : &:r1251_6 # 1251| r1251_8(glval) = VariableAddress[s2] : # 1251| mu1251_9(char *) = InitializeParameter[s2] : &:r1251_8 -# 1251| r1251_10(char *) = Load : &:r1251_8, ~m? +# 1251| r1251_10(char *) = Load[s2] : &:r1251_8, ~m? # 1251| mu1251_11(unknown) = InitializeIndirection[s2] : &:r1251_10 # 1252| r1252_1(glval) = VariableAddress[buffer] : # 1252| mu1252_2(char[1024]) = Uninitialized[buffer] : &:r1252_1 # 1252| r1252_3(int) = Constant[0] : # 1252| r1252_4(glval) = PointerAdd[1] : r1252_1, r1252_3 # 1252| r1252_5(char) = Constant[0] : -# 1252| mu1252_6(char) = Store : &:r1252_4, r1252_5 +# 1252| mu1252_6(char) = Store[?] : &:r1252_4, r1252_5 # 1252| r1252_7(int) = Constant[1] : # 1252| r1252_8(glval) = PointerAdd[1] : r1252_1, r1252_7 # 1252| r1252_9(unknown[1023]) = Constant[0] : -# 1252| mu1252_10(unknown[1023]) = Store : &:r1252_8, r1252_9 +# 1252| mu1252_10(unknown[1023]) = Store[?] : &:r1252_8, r1252_9 # 1254| r1254_1(glval) = FunctionAddress[strcpy] : # 1254| r1254_2(glval) = VariableAddress[buffer] : # 1254| r1254_3(char *) = Convert : r1254_2 # 1254| r1254_4(glval) = VariableAddress[s1] : -# 1254| r1254_5(char *) = Load : &:r1254_4, ~m? +# 1254| r1254_5(char *) = Load[s1] : &:r1254_4, ~m? # 1254| r1254_6(char *) = Convert : r1254_5 # 1254| r1254_7(char *) = Call[strcpy] : func:r1254_1, 0:r1254_3, 1:r1254_6 # 1254| v1254_8(void) = ^BufferReadSideEffect[1] : &:r1254_6, ~m? @@ -6953,7 +6953,7 @@ ir.cpp: # 1255| r1255_2(glval) = VariableAddress[buffer] : # 1255| r1255_3(char *) = Convert : r1255_2 # 1255| r1255_4(glval) = VariableAddress[s2] : -# 1255| r1255_5(char *) = Load : &:r1255_4, ~m? +# 1255| r1255_5(char *) = Load[s2] : &:r1255_4, ~m? # 1255| r1255_6(char *) = Convert : r1255_5 # 1255| r1255_7(char *) = Call[strcat] : func:r1255_1, 0:r1255_3, 1:r1255_6 # 1255| v1255_8(void) = ^BufferReadSideEffect[0] : &:r1255_3, ~m? @@ -6973,16 +6973,16 @@ ir.cpp: # 1261| mu1261_3(unknown) = InitializeNonLocal : # 1261| r1261_4(glval) = VariableAddress[a] : # 1261| mu1261_5(A *) = InitializeParameter[a] : &:r1261_4 -# 1261| r1261_6(A *) = Load : &:r1261_4, ~m? +# 1261| r1261_6(A *) = Load[a] : &:r1261_4, ~m? # 1261| mu1261_7(unknown) = InitializeIndirection[a] : &:r1261_6 # 1261| r1261_8(glval) = VariableAddress[x] : # 1261| mu1261_9(int) = InitializeParameter[x] : &:r1261_8 # 1262| r1262_1(glval) = VariableAddress[x] : -# 1262| r1262_2(int) = Load : &:r1262_1, ~m? +# 1262| r1262_2(int) = Load[x] : &:r1262_1, ~m? # 1262| r1262_3(glval) = VariableAddress[a] : -# 1262| r1262_4(A *) = Load : &:r1262_3, ~m? +# 1262| r1262_4(A *) = Load[a] : &:r1262_3, ~m? # 1262| r1262_5(glval) = FieldAddress[member] : r1262_4 -# 1262| mu1262_6(int) = Store : &:r1262_5, r1262_2 +# 1262| mu1262_6(int) = Store[?] : &:r1262_5, r1262_2 # 1263| v1263_1(void) = NoOp : # 1261| v1261_10(void) = ReturnIndirection[a] : &:r1261_6, ~m? # 1261| v1261_11(void) = ReturnVoid : @@ -6998,7 +6998,7 @@ ir.cpp: # 1270| mu1270_5(int) = InitializeParameter[int_arg] : &:r1270_4 # 1270| r1270_6(glval) = VariableAddress[a_arg] : # 1270| mu1270_7(A *) = InitializeParameter[a_arg] : &:r1270_6 -# 1270| r1270_8(A *) = Load : &:r1270_6, ~m? +# 1270| r1270_8(A *) = Load[a_arg] : &:r1270_6, ~m? # 1270| mu1270_9(unknown) = InitializeIndirection[a_arg] : &:r1270_8 # 1271| r1271_1(glval) = VariableAddress[c] : # 1271| mu1271_2(C) = Uninitialized[c] : &:r1271_1 @@ -7022,7 +7022,7 @@ ir.cpp: # 1276| r1276_3(glval) = VariableAddress[a] : # 1276| r1276_4(A *) = CopyValue : r1276_3 # 1276| r1276_5(glval) = VariableAddress[int_arg] : -# 1276| r1276_6(int) = Load : &:r1276_5, ~m? +# 1276| r1276_6(int) = Load[int_arg] : &:r1276_5, ~m? # 1276| v1276_7(void) = Call[static_member] : func:r1276_2, 0:r1276_4, 1:r1276_6 # 1276| mu1276_8(unknown) = ^CallSideEffect : ~m? # 1276| v1276_9(void) = ^BufferReadSideEffect[0] : &:r1276_4, ~m? @@ -7031,7 +7031,7 @@ ir.cpp: # 1277| r1277_2(glval) = VariableAddress[a] : # 1277| r1277_3(A *) = CopyValue : r1277_2 # 1277| r1277_4(glval) = VariableAddress[int_arg] : -# 1277| r1277_5(int) = Load : &:r1277_4, ~m? +# 1277| r1277_5(int) = Load[int_arg] : &:r1277_4, ~m? # 1277| v1277_6(void) = Call[static_member] : func:r1277_1, 0:r1277_3, 1:r1277_5 # 1277| mu1277_7(unknown) = ^CallSideEffect : ~m? # 1277| v1277_8(void) = ^BufferReadSideEffect[0] : &:r1277_3, ~m? @@ -7040,9 +7040,9 @@ ir.cpp: # 1279| r1279_2(A *) = CopyValue : r1279_1 # 1279| r1279_3(glval) = FunctionAddress[static_member] : # 1279| r1279_4(glval) = VariableAddress[a_arg] : -# 1279| r1279_5(A *) = Load : &:r1279_4, ~m? +# 1279| r1279_5(A *) = Load[a_arg] : &:r1279_4, ~m? # 1279| r1279_6(glval) = VariableAddress[int_arg] : -# 1279| r1279_7(int) = Load : &:r1279_6, ~m? +# 1279| r1279_7(int) = Load[int_arg] : &:r1279_6, ~m? # 1279| r1279_8(int) = Constant[2] : # 1279| r1279_9(int) = Add : r1279_7, r1279_8 # 1279| v1279_10(void) = Call[static_member] : func:r1279_3, 0:r1279_5, 1:r1279_9 @@ -7050,7 +7050,7 @@ ir.cpp: # 1279| v1279_12(void) = ^BufferReadSideEffect[0] : &:r1279_5, ~m? # 1279| mu1279_13(unknown) = ^BufferMayWriteSideEffect[0] : &:r1279_5 # 1280| r1280_1(glval) = VariableAddress[a_arg] : -# 1280| r1280_2(A *) = Load : &:r1280_1, ~m? +# 1280| r1280_2(A *) = Load[a_arg] : &:r1280_1, ~m? # 1280| r1280_3(glval) = CopyValue : r1280_2 # 1280| r1280_4(glval) = FunctionAddress[static_member] : # 1280| r1280_5(glval) = VariableAddress[a] : @@ -7061,10 +7061,10 @@ ir.cpp: # 1280| v1280_10(void) = ^BufferReadSideEffect[0] : &:r1280_6, ~m? # 1280| mu1280_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r1280_6 # 1281| r1281_1(glval) = VariableAddress[a_arg] : -# 1281| r1281_2(A *) = Load : &:r1281_1, ~m? +# 1281| r1281_2(A *) = Load[a_arg] : &:r1281_1, ~m? # 1281| r1281_3(glval) = FunctionAddress[static_member] : # 1281| r1281_4(glval) = VariableAddress[a_arg] : -# 1281| r1281_5(A *) = Load : &:r1281_4, ~m? +# 1281| r1281_5(A *) = Load[a_arg] : &:r1281_4, ~m? # 1281| r1281_6(int) = Constant[-1] : # 1281| v1281_7(void) = Call[static_member] : func:r1281_3, 0:r1281_5, 1:r1281_6 # 1281| mu1281_8(unknown) = ^CallSideEffect : ~m? @@ -7099,7 +7099,7 @@ ir.cpp: # 1289| r1289_6(glval) = VariableAddress[x] : # 1289| mu1289_7(int) = InitializeParameter[x] : &:r1289_6 # 1290| r1290_1(glval) = VariableAddress[b] : -# 1290| r1290_2(bool) = Load : &:r1290_1, ~m? +# 1290| r1290_2(bool) = Load[b] : &:r1290_1, ~m? # 1290| v1290_3(void) = ConditionalBranch : r1290_2 #-----| False -> Block 1 #-----| True -> Block 2 @@ -7110,8 +7110,8 @@ ir.cpp: # 1291| Block 2 # 1291| r1291_1(glval) = VariableAddress[#return] : # 1291| r1291_2(glval) = VariableAddress[x] : -# 1291| r1291_3(int) = Load : &:r1291_2, ~m? -# 1291| mu1291_4(int) = Store : &:r1291_1, r1291_3 +# 1291| r1291_3(int) = Load[x] : &:r1291_2, ~m? +# 1291| mu1291_4(int) = Store[#return] : &:r1291_1, r1291_3 # 1289| r1289_8(glval) = VariableAddress[#return] : # 1289| v1289_9(void) = ReturnValue : &:r1289_8, ~m? # 1289| v1289_10(void) = AliasedUse : ~m? @@ -7128,9 +7128,9 @@ ir.cpp: # 1295| mu1295_7(int) = InitializeParameter[y] : &:r1295_6 # 1296| r1296_1(glval) = FunctionAddress[IntegerOps] : # 1296| r1296_2(glval) = VariableAddress[x] : -# 1296| r1296_3(int) = Load : &:r1296_2, ~m? +# 1296| r1296_3(int) = Load[x] : &:r1296_2, ~m? # 1296| r1296_4(glval) = VariableAddress[y] : -# 1296| r1296_5(int) = Load : &:r1296_4, ~m? +# 1296| r1296_5(int) = Load[y] : &:r1296_4, ~m? # 1296| v1296_6(void) = Call[IntegerOps] : func:r1296_1, 0:r1296_3, 1:r1296_5 # 1296| mu1296_7(unknown) = ^CallSideEffect : ~m? # 1296| v1296_8(void) = NoOp : @@ -7151,45 +7151,45 @@ ir.cpp: # 1299| mu1299_9(long) = InitializeParameter[y] : &:r1299_8 # 1300| r1300_1(glval) = VariableAddress[z] : # 1300| r1300_2(glval) = VariableAddress[x] : -# 1300| r1300_3(int) = Load : &:r1300_2, ~m? -# 1300| mu1300_4(int) = Store : &:r1300_1, r1300_3 +# 1300| r1300_3(int) = Load[x] : &:r1300_2, ~m? +# 1300| mu1300_4(int) = Store[z] : &:r1300_1, r1300_3 # 1301| r1301_1(glval) = VariableAddress[b] : -# 1301| r1301_2(bool) = Load : &:r1301_1, ~m? +# 1301| r1301_2(bool) = Load[b] : &:r1301_1, ~m? # 1301| v1301_3(void) = ConditionalBranch : r1301_2 #-----| False -> Block 3 #-----| True -> Block 2 # 1301| Block 1 # 1301| r1301_4(glval) = VariableAddress[#temp1301:9] : -# 1301| r1301_5(int) = Load : &:r1301_4, ~m? +# 1301| r1301_5(int) = Load[#temp1301:9] : &:r1301_4, ~m? # 1301| r1301_6(glval) = VariableAddress[z] : -# 1301| mu1301_7(int) = Store : &:r1301_6, r1301_5 +# 1301| mu1301_7(int) = Store[z] : &:r1301_6, r1301_5 # 1302| r1302_1(glval) = VariableAddress[b] : -# 1302| r1302_2(bool) = Load : &:r1302_1, ~m? +# 1302| r1302_2(bool) = Load[b] : &:r1302_1, ~m? # 1302| v1302_3(void) = ConditionalBranch : r1302_2 #-----| False -> Block 6 #-----| True -> Block 5 # 1301| Block 2 # 1301| r1301_8(glval) = VariableAddress[#temp1301:9] : -# 1301| mu1301_9(int) = Store : &:r1301_8, r1301_2 +# 1301| mu1301_9(int) = Store[#temp1301:9] : &:r1301_8, r1301_2 #-----| Goto -> Block 1 # 1301| Block 3 # 1301| r1301_10(glval) = VariableAddress[x] : -# 1301| r1301_11(int) = Load : &:r1301_10, ~m? +# 1301| r1301_11(int) = Load[x] : &:r1301_10, ~m? # 1301| r1301_12(glval) = VariableAddress[#temp1301:9] : -# 1301| mu1301_13(int) = Store : &:r1301_12, r1301_11 +# 1301| mu1301_13(int) = Store[#temp1301:9] : &:r1301_12, r1301_11 #-----| Goto -> Block 1 # 1302| Block 4 # 1302| r1302_4(glval) = VariableAddress[#temp1302:9] : -# 1302| r1302_5(long) = Load : &:r1302_4, ~m? +# 1302| r1302_5(long) = Load[#temp1302:9] : &:r1302_4, ~m? # 1302| r1302_6(int) = Convert : r1302_5 # 1302| r1302_7(glval) = VariableAddress[z] : -# 1302| mu1302_8(int) = Store : &:r1302_7, r1302_6 +# 1302| mu1302_8(int) = Store[z] : &:r1302_7, r1302_6 # 1303| r1303_1(glval) = VariableAddress[x] : -# 1303| r1303_2(int) = Load : &:r1303_1, ~m? +# 1303| r1303_2(int) = Load[x] : &:r1303_1, ~m? # 1303| r1303_3(int) = Constant[0] : # 1303| r1303_4(bool) = CompareNE : r1303_2, r1303_3 # 1303| v1303_5(void) = ConditionalBranch : r1303_4 @@ -7198,23 +7198,23 @@ ir.cpp: # 1302| Block 5 # 1302| r1302_9(glval) = VariableAddress[#temp1302:9] : -# 1302| mu1302_10(long) = Store : &:r1302_9, r1302_2 +# 1302| mu1302_10(long) = Store[#temp1302:9] : &:r1302_9, r1302_2 #-----| Goto -> Block 4 # 1302| Block 6 # 1302| r1302_11(glval) = VariableAddress[y] : -# 1302| r1302_12(long) = Load : &:r1302_11, ~m? +# 1302| r1302_12(long) = Load[y] : &:r1302_11, ~m? # 1302| r1302_13(glval) = VariableAddress[#temp1302:9] : -# 1302| mu1302_14(long) = Store : &:r1302_13, r1302_12 +# 1302| mu1302_14(long) = Store[#temp1302:9] : &:r1302_13, r1302_12 #-----| Goto -> Block 4 # 1303| Block 7 # 1303| r1303_6(glval) = VariableAddress[#temp1303:9] : -# 1303| r1303_7(int) = Load : &:r1303_6, ~m? +# 1303| r1303_7(int) = Load[#temp1303:9] : &:r1303_6, ~m? # 1303| r1303_8(glval) = VariableAddress[z] : -# 1303| mu1303_9(int) = Store : &:r1303_8, r1303_7 +# 1303| mu1303_9(int) = Store[z] : &:r1303_8, r1303_7 # 1304| r1304_1(glval) = VariableAddress[x] : -# 1304| r1304_2(int) = Load : &:r1304_1, ~m? +# 1304| r1304_2(int) = Load[x] : &:r1304_1, ~m? # 1304| r1304_3(int) = Constant[0] : # 1304| r1304_4(bool) = CompareNE : r1304_2, r1304_3 # 1304| v1304_5(void) = ConditionalBranch : r1304_4 @@ -7223,24 +7223,24 @@ ir.cpp: # 1303| Block 8 # 1303| r1303_10(glval) = VariableAddress[#temp1303:9] : -# 1303| mu1303_11(int) = Store : &:r1303_10, r1303_2 +# 1303| mu1303_11(int) = Store[#temp1303:9] : &:r1303_10, r1303_2 #-----| Goto -> Block 7 # 1303| Block 9 # 1303| r1303_12(glval) = VariableAddress[x] : -# 1303| r1303_13(int) = Load : &:r1303_12, ~m? +# 1303| r1303_13(int) = Load[x] : &:r1303_12, ~m? # 1303| r1303_14(glval) = VariableAddress[#temp1303:9] : -# 1303| mu1303_15(int) = Store : &:r1303_14, r1303_13 +# 1303| mu1303_15(int) = Store[#temp1303:9] : &:r1303_14, r1303_13 #-----| Goto -> Block 7 # 1304| Block 10 # 1304| r1304_6(glval) = VariableAddress[#temp1304:9] : -# 1304| r1304_7(long) = Load : &:r1304_6, ~m? +# 1304| r1304_7(long) = Load[#temp1304:9] : &:r1304_6, ~m? # 1304| r1304_8(int) = Convert : r1304_7 # 1304| r1304_9(glval) = VariableAddress[z] : -# 1304| mu1304_10(int) = Store : &:r1304_9, r1304_8 +# 1304| mu1304_10(int) = Store[z] : &:r1304_9, r1304_8 # 1305| r1305_1(glval) = VariableAddress[y] : -# 1305| r1305_2(long) = Load : &:r1305_1, ~m? +# 1305| r1305_2(long) = Load[y] : &:r1305_1, ~m? # 1305| r1305_3(long) = Constant[0] : # 1305| r1305_4(bool) = CompareNE : r1305_2, r1305_3 # 1305| v1305_5(void) = ConditionalBranch : r1305_4 @@ -7249,24 +7249,24 @@ ir.cpp: # 1304| Block 11 # 1304| r1304_11(glval) = VariableAddress[#temp1304:9] : -# 1304| mu1304_12(long) = Store : &:r1304_11, r1304_2 +# 1304| mu1304_12(long) = Store[#temp1304:9] : &:r1304_11, r1304_2 #-----| Goto -> Block 10 # 1304| Block 12 # 1304| r1304_13(glval) = VariableAddress[y] : -# 1304| r1304_14(long) = Load : &:r1304_13, ~m? +# 1304| r1304_14(long) = Load[y] : &:r1304_13, ~m? # 1304| r1304_15(glval) = VariableAddress[#temp1304:9] : -# 1304| mu1304_16(long) = Store : &:r1304_15, r1304_14 +# 1304| mu1304_16(long) = Store[#temp1304:9] : &:r1304_15, r1304_14 #-----| Goto -> Block 10 # 1305| Block 13 # 1305| r1305_6(glval) = VariableAddress[#temp1305:9] : -# 1305| r1305_7(long) = Load : &:r1305_6, ~m? +# 1305| r1305_7(long) = Load[#temp1305:9] : &:r1305_6, ~m? # 1305| r1305_8(int) = Convert : r1305_7 # 1305| r1305_9(glval) = VariableAddress[z] : -# 1305| mu1305_10(int) = Store : &:r1305_9, r1305_8 +# 1305| mu1305_10(int) = Store[z] : &:r1305_9, r1305_8 # 1306| r1306_1(glval) = VariableAddress[y] : -# 1306| r1306_2(long) = Load : &:r1306_1, ~m? +# 1306| r1306_2(long) = Load[y] : &:r1306_1, ~m? # 1306| r1306_3(long) = Constant[0] : # 1306| r1306_4(bool) = CompareNE : r1306_2, r1306_3 # 1306| v1306_5(void) = ConditionalBranch : r1306_4 @@ -7275,25 +7275,25 @@ ir.cpp: # 1305| Block 14 # 1305| r1305_11(glval) = VariableAddress[#temp1305:9] : -# 1305| mu1305_12(long) = Store : &:r1305_11, r1305_2 +# 1305| mu1305_12(long) = Store[#temp1305:9] : &:r1305_11, r1305_2 #-----| Goto -> Block 13 # 1305| Block 15 # 1305| r1305_13(glval) = VariableAddress[x] : -# 1305| r1305_14(int) = Load : &:r1305_13, ~m? +# 1305| r1305_14(int) = Load[x] : &:r1305_13, ~m? # 1305| r1305_15(long) = Convert : r1305_14 # 1305| r1305_16(glval) = VariableAddress[#temp1305:9] : -# 1305| mu1305_17(long) = Store : &:r1305_16, r1305_15 +# 1305| mu1305_17(long) = Store[#temp1305:9] : &:r1305_16, r1305_15 #-----| Goto -> Block 13 # 1306| Block 16 # 1306| r1306_6(glval) = VariableAddress[#temp1306:9] : -# 1306| r1306_7(long) = Load : &:r1306_6, ~m? +# 1306| r1306_7(long) = Load[#temp1306:9] : &:r1306_6, ~m? # 1306| r1306_8(int) = Convert : r1306_7 # 1306| r1306_9(glval) = VariableAddress[z] : -# 1306| mu1306_10(int) = Store : &:r1306_9, r1306_8 +# 1306| mu1306_10(int) = Store[z] : &:r1306_9, r1306_8 # 1308| r1308_1(glval) = VariableAddress[x] : -# 1308| r1308_2(int) = Load : &:r1308_1, ~m? +# 1308| r1308_2(int) = Load[x] : &:r1308_1, ~m? # 1308| r1308_3(int) = Constant[0] : # 1308| r1308_4(bool) = CompareNE : r1308_2, r1308_3 # 1308| v1308_5(void) = ConditionalBranch : r1308_4 @@ -7302,21 +7302,21 @@ ir.cpp: # 1306| Block 17 # 1306| r1306_11(glval) = VariableAddress[#temp1306:9] : -# 1306| mu1306_12(long) = Store : &:r1306_11, r1306_2 +# 1306| mu1306_12(long) = Store[#temp1306:9] : &:r1306_11, r1306_2 #-----| Goto -> Block 16 # 1306| Block 18 # 1306| r1306_13(glval) = VariableAddress[y] : -# 1306| r1306_14(long) = Load : &:r1306_13, ~m? +# 1306| r1306_14(long) = Load[y] : &:r1306_13, ~m? # 1306| r1306_15(glval) = VariableAddress[#temp1306:9] : -# 1306| mu1306_16(long) = Store : &:r1306_15, r1306_14 +# 1306| mu1306_16(long) = Store[#temp1306:9] : &:r1306_15, r1306_14 #-----| Goto -> Block 16 # 1308| Block 19 # 1308| r1308_6(glval) = VariableAddress[#temp1308:9] : -# 1308| r1308_7(int) = Load : &:r1308_6, ~m? +# 1308| r1308_7(int) = Load[#temp1308:9] : &:r1308_6, ~m? # 1308| r1308_8(glval) = VariableAddress[z] : -# 1308| mu1308_9(int) = Store : &:r1308_8, r1308_7 +# 1308| mu1308_9(int) = Store[z] : &:r1308_8, r1308_7 # 1309| v1309_1(void) = NoOp : # 1299| v1299_10(void) = ReturnVoid : # 1299| v1299_11(void) = AliasedUse : ~m? @@ -7324,18 +7324,18 @@ ir.cpp: # 1308| Block 20 # 1308| r1308_10(glval) = VariableAddress[#temp1308:9] : -# 1308| mu1308_11(int) = Store : &:r1308_10, r1308_16 +# 1308| mu1308_11(int) = Store[#temp1308:9] : &:r1308_10, r1308_16 #-----| Goto -> Block 19 # 1308| Block 21 # 1308| r1308_12(glval) = VariableAddress[#temp1308:10] : # 1308| r1308_13(bool) = Constant[0] : -# 1308| mu1308_14(bool) = Store : &:r1308_12, r1308_13 +# 1308| mu1308_14(bool) = Store[#temp1308:10] : &:r1308_12, r1308_13 #-----| Goto -> Block 22 # 1308| Block 22 # 1308| r1308_15(glval) = VariableAddress[#temp1308:10] : -# 1308| r1308_16(bool) = Load : &:r1308_15, ~m? +# 1308| r1308_16(bool) = Load[#temp1308:10] : &:r1308_15, ~m? # 1308| v1308_17(void) = ConditionalBranch : r1308_16 #-----| False -> Block 26 #-----| True -> Block 20 @@ -7343,19 +7343,19 @@ ir.cpp: # 1308| Block 23 # 1308| r1308_18(glval) = VariableAddress[#temp1308:10] : # 1308| r1308_19(bool) = Constant[1] : -# 1308| mu1308_20(bool) = Store : &:r1308_18, r1308_19 +# 1308| mu1308_20(bool) = Store[#temp1308:10] : &:r1308_18, r1308_19 #-----| Goto -> Block 22 # 1308| Block 24 # 1308| r1308_21(glval) = VariableAddress[b] : -# 1308| r1308_22(bool) = Load : &:r1308_21, ~m? +# 1308| r1308_22(bool) = Load[b] : &:r1308_21, ~m? # 1308| v1308_23(void) = ConditionalBranch : r1308_22 #-----| False -> Block 25 #-----| True -> Block 23 # 1308| Block 25 # 1308| r1308_24(glval) = VariableAddress[y] : -# 1308| r1308_25(long) = Load : &:r1308_24, ~m? +# 1308| r1308_25(long) = Load[y] : &:r1308_24, ~m? # 1308| r1308_26(long) = Constant[0] : # 1308| r1308_27(bool) = CompareNE : r1308_25, r1308_26 # 1308| v1308_28(void) = ConditionalBranch : r1308_27 @@ -7364,9 +7364,9 @@ ir.cpp: # 1308| Block 26 # 1308| r1308_29(glval) = VariableAddress[x] : -# 1308| r1308_30(int) = Load : &:r1308_29, ~m? +# 1308| r1308_30(int) = Load[x] : &:r1308_29, ~m? # 1308| r1308_31(glval) = VariableAddress[#temp1308:9] : -# 1308| mu1308_32(int) = Store : &:r1308_31, r1308_30 +# 1308| mu1308_32(int) = Store[#temp1308:9] : &:r1308_31, r1308_30 #-----| Goto -> Block 19 # 1314| int shortCircuitConditional(int, int) @@ -7396,22 +7396,22 @@ ir.cpp: # 1315| Block 2 # 1315| r1315_10(glval) = VariableAddress[x] : -# 1315| r1315_11(int) = Load : &:r1315_10, ~m? +# 1315| r1315_11(int) = Load[x] : &:r1315_10, ~m? # 1315| r1315_12(glval) = VariableAddress[#temp1315:12] : -# 1315| mu1315_13(int) = Store : &:r1315_12, r1315_11 +# 1315| mu1315_13(int) = Store[#temp1315:12] : &:r1315_12, r1315_11 #-----| Goto -> Block 4 # 1315| Block 3 # 1315| r1315_14(glval) = VariableAddress[y] : -# 1315| r1315_15(int) = Load : &:r1315_14, ~m? +# 1315| r1315_15(int) = Load[y] : &:r1315_14, ~m? # 1315| r1315_16(glval) = VariableAddress[#temp1315:12] : -# 1315| mu1315_17(int) = Store : &:r1315_16, r1315_15 +# 1315| mu1315_17(int) = Store[#temp1315:12] : &:r1315_16, r1315_15 #-----| Goto -> Block 4 # 1315| Block 4 # 1315| r1315_18(glval) = VariableAddress[#temp1315:12] : -# 1315| r1315_19(int) = Load : &:r1315_18, ~m? -# 1315| mu1315_20(int) = Store : &:r1315_1, r1315_19 +# 1315| r1315_19(int) = Load[#temp1315:12] : &:r1315_18, ~m? +# 1315| mu1315_20(int) = Store[#return] : &:r1315_1, r1315_19 # 1314| r1314_8(glval) = VariableAddress[#return] : # 1314| v1314_9(void) = ReturnValue : &:r1314_8, ~m? # 1314| v1314_10(void) = AliasedUse : ~m? @@ -7424,12 +7424,12 @@ ir.cpp: # 1320| mu1320_3(unknown) = InitializeNonLocal : # 1320| r1320_4(glval) = VariableAddress[p] : # 1320| mu1320_5(int *) = InitializeParameter[p] : &:r1320_4 -# 1320| r1320_6(int *) = Load : &:r1320_4, ~m? +# 1320| r1320_6(int *) = Load[p] : &:r1320_4, ~m? # 1320| mu1320_7(unknown) = InitializeIndirection[p] : &:r1320_6 # 1322| r1322_1(glval) = FunctionAddress[operator new] : # 1322| r1322_2(unsigned long) = Constant[4] : # 1322| r1322_3(glval) = VariableAddress[p] : -# 1322| r1322_4(int *) = Load : &:r1322_3, ~m? +# 1322| r1322_4(int *) = Load[p] : &:r1322_3, ~m? # 1322| r1322_5(void *) = Convert : r1322_4 # 1322| r1322_6(void *) = Call[operator new] : func:r1322_1, 0:r1322_2, 1:r1322_5 # 1322| mu1322_7(unknown) = ^CallSideEffect : ~m? @@ -7480,7 +7480,7 @@ ir.cpp: # 1326| mu1326_3(unknown) = InitializeNonLocal : # 1327| r1327_1(glval) = VariableAddress[#return] : # 1327| r1327_2(destructor_only) = Constant[0] : -# 1327| mu1327_3(destructor_only) = Store : &:r1327_1, r1327_2 +# 1327| mu1327_3(destructor_only) = Store[#return] : &:r1327_1, r1327_2 # 1326| r1326_4(glval) = VariableAddress[#return] : # 1326| v1326_5(void) = ReturnValue : &:r1326_4, ~m? # 1326| v1326_6(void) = AliasedUse : ~m? @@ -7495,16 +7495,16 @@ ir.cpp: # 1366| r1366_2(glval) = FunctionAddress[returnValue] : # 1366| r1366_3(String) = Call[returnValue] : func:r1366_2 # 1366| mu1366_4(unknown) = ^CallSideEffect : ~m? -# 1366| mu1366_5(String) = Store : &:r1366_1, r1366_3 +# 1366| mu1366_5(String) = Store[s] : &:r1366_1, r1366_3 # 1367| r1367_1(glval) = VariableAddress[rs] : # 1367| r1367_2(glval) = VariableAddress[#temp1367:24] : # 1367| r1367_3(glval) = FunctionAddress[returnValue] : # 1367| r1367_4(String) = Call[returnValue] : func:r1367_3 # 1367| mu1367_5(unknown) = ^CallSideEffect : ~m? -# 1367| mu1367_6(String) = Store : &:r1367_2, r1367_4 +# 1367| mu1367_6(String) = Store[#temp1367:24] : &:r1367_2, r1367_4 # 1367| r1367_7(glval) = Convert : r1367_2 # 1367| r1367_8(String &) = CopyValue : r1367_7 -# 1367| mu1367_9(String &) = Store : &:r1367_1, r1367_8 +# 1367| mu1367_9(String &) = Store[rs] : &:r1367_1, r1367_8 # 1369| r1369_1(glval) = FunctionAddress[acceptRef] : # 1369| r1369_2(glval) = VariableAddress[s] : # 1369| r1369_3(glval) = Convert : r1369_2 @@ -7541,7 +7541,7 @@ ir.cpp: # 1371| mu1371_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r1371_2 # 1371| v1371_11(void) = ^BufferReadSideEffect[0] : &:r1371_7, ~m? # 1371| mu1371_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r1371_7 -# 1371| r1371_13(String) = Load : &:r1371_2, ~m? +# 1371| r1371_13(String) = Load[#temp1371:17] : &:r1371_2, ~m? # 1371| v1371_14(void) = Call[acceptValue] : func:r1371_1, 0:r1371_13 # 1371| mu1371_15(unknown) = ^CallSideEffect : ~m? # 1372| r1372_1(glval) = FunctionAddress[acceptValue] : @@ -7555,7 +7555,7 @@ ir.cpp: # 1372| mu1372_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r1372_2 # 1372| v1372_10(void) = ^BufferReadSideEffect[0] : &:r1372_6, ~m? # 1372| mu1372_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r1372_6 -# 1372| r1372_12(String) = Load : &:r1372_2, ~m? +# 1372| r1372_12(String) = Load[#temp1372:25] : &:r1372_2, ~m? # 1372| v1372_13(void) = Call[acceptValue] : func:r1372_1, 0:r1372_12 # 1372| mu1372_14(unknown) = ^CallSideEffect : ~m? # 1373| r1373_1(glval) = VariableAddress[#temp1373:5] : @@ -7564,7 +7564,7 @@ ir.cpp: # 1373| v1373_4(void) = Call[String] : func:r1373_3, this:r1373_1 # 1373| mu1373_5(unknown) = ^CallSideEffect : ~m? # 1373| mu1373_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r1373_1 -# 1373| r1373_7(String) = Load : &:r1373_1, ~m? +# 1373| r1373_7(String) = Load[#temp1373:5] : &:r1373_1, ~m? # 1373| r1373_8(String) = Convert : r1373_7 # 1373| r1373_9(glval) = FunctionAddress[c_str] : # 1373| r1373_10(char *) = Call[c_str] : func:r1373_9, this:r1373_8 @@ -7575,8 +7575,8 @@ ir.cpp: # 1374| r1374_2(glval) = FunctionAddress[returnValue] : # 1374| r1374_3(String) = Call[returnValue] : func:r1374_2 # 1374| mu1374_4(unknown) = ^CallSideEffect : ~m? -# 1374| mu1374_5(String) = Store : &:r1374_1, r1374_3 -# 1374| r1374_6(String) = Load : &:r1374_1, ~m? +# 1374| mu1374_5(String) = Store[#temp1374:5] : &:r1374_1, r1374_3 +# 1374| r1374_6(String) = Load[#temp1374:5] : &:r1374_1, ~m? # 1374| r1374_7(String) = Convert : r1374_6 # 1374| r1374_8(glval) = FunctionAddress[c_str] : # 1374| r1374_9(char *) = Call[c_str] : func:r1374_8, this:r1374_7 @@ -7587,8 +7587,8 @@ ir.cpp: # 1376| r1376_2(glval) = FunctionAddress[defaultConstruct] : # 1376| r1376_3(String) = Call[defaultConstruct] : func:r1376_2 # 1376| mu1376_4(unknown) = ^CallSideEffect : ~m? -# 1376| mu1376_5(String) = Store : &:r1376_1, r1376_3 -# 1376| r1376_6(String) = Load : &:r1376_1, ~m? +# 1376| mu1376_5(String) = Store[#temp1376:5] : &:r1376_1, r1376_3 +# 1376| r1376_6(String) = Load[#temp1376:5] : &:r1376_1, ~m? # 1377| v1377_1(void) = NoOp : # 1365| v1365_4(void) = ReturnVoid : # 1365| v1365_5(void) = AliasedUse : ~m? @@ -7603,16 +7603,16 @@ ir.cpp: # 1380| r1380_2(glval) = FunctionAddress[returnValue] : # 1380| r1380_3(destructor_only) = Call[returnValue] : func:r1380_2 # 1380| mu1380_4(unknown) = ^CallSideEffect : ~m? -# 1380| mu1380_5(destructor_only) = Store : &:r1380_1, r1380_3 +# 1380| mu1380_5(destructor_only) = Store[d] : &:r1380_1, r1380_3 # 1381| r1381_1(glval) = VariableAddress[rd] : # 1381| r1381_2(glval) = VariableAddress[#temp1381:33] : # 1381| r1381_3(glval) = FunctionAddress[returnValue] : # 1381| r1381_4(destructor_only) = Call[returnValue] : func:r1381_3 # 1381| mu1381_5(unknown) = ^CallSideEffect : ~m? -# 1381| mu1381_6(destructor_only) = Store : &:r1381_2, r1381_4 +# 1381| mu1381_6(destructor_only) = Store[#temp1381:33] : &:r1381_2, r1381_4 # 1381| r1381_7(glval) = Convert : r1381_2 # 1381| r1381_8(destructor_only &) = CopyValue : r1381_7 -# 1381| mu1381_9(destructor_only &) = Store : &:r1381_1, r1381_8 +# 1381| mu1381_9(destructor_only &) = Store[rd] : &:r1381_1, r1381_8 # 1382| r1382_1(glval) = VariableAddress[d2] : # 1382| mu1382_2(destructor_only) = Uninitialized[d2] : &:r1382_1 # 1383| r1383_1(glval) = FunctionAddress[acceptRef] : @@ -7626,15 +7626,15 @@ ir.cpp: # 1384| r1384_1(glval) = FunctionAddress[acceptValue] : # 1384| r1384_2(glval) = VariableAddress[#temp1384:17] : # 1384| r1384_3(glval) = VariableAddress[d] : -# 1384| r1384_4(destructor_only) = Load : &:r1384_3, ~m? -# 1384| mu1384_5(destructor_only) = Store : &:r1384_2, r1384_4 -# 1384| r1384_6(destructor_only) = Load : &:r1384_2, ~m? +# 1384| r1384_4(destructor_only) = Load[d] : &:r1384_3, ~m? +# 1384| mu1384_5(destructor_only) = Store[#temp1384:17] : &:r1384_2, r1384_4 +# 1384| r1384_6(destructor_only) = Load[#temp1384:17] : &:r1384_2, ~m? # 1384| v1384_7(void) = Call[acceptValue] : func:r1384_1, 0:r1384_6 # 1384| mu1384_8(unknown) = ^CallSideEffect : ~m? # 1385| r1385_1(glval) = VariableAddress[#temp1385:5] : # 1385| r1385_2(destructor_only) = Constant[0] : -# 1385| mu1385_3(destructor_only) = Store : &:r1385_1, r1385_2 -# 1385| r1385_4(destructor_only) = Load : &:r1385_1, ~m? +# 1385| mu1385_3(destructor_only) = Store[#temp1385:5] : &:r1385_1, r1385_2 +# 1385| r1385_4(destructor_only) = Load[#temp1385:5] : &:r1385_1, ~m? # 1385| r1385_5(glval) = FunctionAddress[method] : # 1385| v1385_6(void) = Call[method] : func:r1385_5, this:r1385_4 # 1385| mu1385_7(unknown) = ^CallSideEffect : ~m? @@ -7644,8 +7644,8 @@ ir.cpp: # 1386| r1386_2(glval) = FunctionAddress[returnValue] : # 1386| r1386_3(destructor_only) = Call[returnValue] : func:r1386_2 # 1386| mu1386_4(unknown) = ^CallSideEffect : ~m? -# 1386| mu1386_5(destructor_only) = Store : &:r1386_1, r1386_3 -# 1386| r1386_6(destructor_only) = Load : &:r1386_1, ~m? +# 1386| mu1386_5(destructor_only) = Store[#temp1386:5] : &:r1386_1, r1386_3 +# 1386| r1386_6(destructor_only) = Load[#temp1386:5] : &:r1386_1, ~m? # 1386| r1386_7(glval) = FunctionAddress[method] : # 1386| v1386_8(void) = Call[method] : func:r1386_7, this:r1386_6 # 1386| mu1386_9(unknown) = ^CallSideEffect : ~m? @@ -7655,8 +7655,8 @@ ir.cpp: # 1388| r1388_2(glval) = FunctionAddress[defaultConstruct] : # 1388| r1388_3(destructor_only) = Call[defaultConstruct] : func:r1388_2 # 1388| mu1388_4(unknown) = ^CallSideEffect : ~m? -# 1388| mu1388_5(destructor_only) = Store : &:r1388_1, r1388_3 -# 1388| r1388_6(destructor_only) = Load : &:r1388_1, ~m? +# 1388| mu1388_5(destructor_only) = Store[#temp1388:5] : &:r1388_1, r1388_3 +# 1388| r1388_6(destructor_only) = Load[#temp1388:5] : &:r1388_1, ~m? # 1389| v1389_1(void) = NoOp : # 1379| v1379_4(void) = ReturnVoid : # 1379| v1379_5(void) = AliasedUse : ~m? @@ -7671,16 +7671,16 @@ ir.cpp: # 1392| r1392_2(glval) = FunctionAddress[returnValue] : # 1392| r1392_3(copy_constructor) = Call[returnValue] : func:r1392_2 # 1392| mu1392_4(unknown) = ^CallSideEffect : ~m? -# 1392| mu1392_5(copy_constructor) = Store : &:r1392_1, r1392_3 +# 1392| mu1392_5(copy_constructor) = Store[d] : &:r1392_1, r1392_3 # 1393| r1393_1(glval) = VariableAddress[rd] : # 1393| r1393_2(glval) = VariableAddress[#temp1393:34] : # 1393| r1393_3(glval) = FunctionAddress[returnValue] : # 1393| r1393_4(copy_constructor) = Call[returnValue] : func:r1393_3 # 1393| mu1393_5(unknown) = ^CallSideEffect : ~m? -# 1393| mu1393_6(copy_constructor) = Store : &:r1393_2, r1393_4 +# 1393| mu1393_6(copy_constructor) = Store[#temp1393:34] : &:r1393_2, r1393_4 # 1393| r1393_7(glval) = Convert : r1393_2 # 1393| r1393_8(copy_constructor &) = CopyValue : r1393_7 -# 1393| mu1393_9(copy_constructor &) = Store : &:r1393_1, r1393_8 +# 1393| mu1393_9(copy_constructor &) = Store[rd] : &:r1393_1, r1393_8 # 1394| r1394_1(glval) = VariableAddress[d2] : # 1394| mu1394_2(copy_constructor) = Uninitialized[d2] : &:r1394_1 # 1394| r1394_3(glval) = FunctionAddress[copy_constructor] : @@ -7707,7 +7707,7 @@ ir.cpp: # 1396| mu1396_10(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1396_2 # 1396| v1396_11(void) = ^BufferReadSideEffect[0] : &:r1396_7, ~m? # 1396| mu1396_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r1396_7 -# 1396| r1396_13(copy_constructor) = Load : &:r1396_2, ~m? +# 1396| r1396_13(copy_constructor) = Load[#temp1396:17] : &:r1396_2, ~m? # 1396| v1396_14(void) = Call[acceptValue] : func:r1396_1, 0:r1396_13 # 1396| mu1396_15(unknown) = ^CallSideEffect : ~m? # 1397| r1397_1(glval) = VariableAddress[#temp1397:5] : @@ -7716,7 +7716,7 @@ ir.cpp: # 1397| v1397_4(void) = Call[copy_constructor] : func:r1397_3, this:r1397_1 # 1397| mu1397_5(unknown) = ^CallSideEffect : ~m? # 1397| mu1397_6(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1397_1 -# 1397| r1397_7(copy_constructor) = Load : &:r1397_1, ~m? +# 1397| r1397_7(copy_constructor) = Load[#temp1397:5] : &:r1397_1, ~m? # 1397| r1397_8(glval) = FunctionAddress[method] : # 1397| v1397_9(void) = Call[method] : func:r1397_8, this:r1397_7 # 1397| mu1397_10(unknown) = ^CallSideEffect : ~m? @@ -7726,8 +7726,8 @@ ir.cpp: # 1398| r1398_2(glval) = FunctionAddress[returnValue] : # 1398| r1398_3(copy_constructor) = Call[returnValue] : func:r1398_2 # 1398| mu1398_4(unknown) = ^CallSideEffect : ~m? -# 1398| mu1398_5(copy_constructor) = Store : &:r1398_1, r1398_3 -# 1398| r1398_6(copy_constructor) = Load : &:r1398_1, ~m? +# 1398| mu1398_5(copy_constructor) = Store[#temp1398:5] : &:r1398_1, r1398_3 +# 1398| r1398_6(copy_constructor) = Load[#temp1398:5] : &:r1398_1, ~m? # 1398| r1398_7(glval) = FunctionAddress[method] : # 1398| v1398_8(void) = Call[method] : func:r1398_7, this:r1398_6 # 1398| mu1398_9(unknown) = ^CallSideEffect : ~m? @@ -7737,8 +7737,8 @@ ir.cpp: # 1400| r1400_2(glval) = FunctionAddress[defaultConstruct] : # 1400| r1400_3(copy_constructor) = Call[defaultConstruct] : func:r1400_2 # 1400| mu1400_4(unknown) = ^CallSideEffect : ~m? -# 1400| mu1400_5(copy_constructor) = Store : &:r1400_1, r1400_3 -# 1400| r1400_6(copy_constructor) = Load : &:r1400_1, ~m? +# 1400| mu1400_5(copy_constructor) = Store[#temp1400:5] : &:r1400_1, r1400_3 +# 1400| r1400_6(copy_constructor) = Load[#temp1400:5] : &:r1400_1, ~m? # 1401| v1401_1(void) = NoOp : # 1391| v1391_4(void) = ReturnVoid : # 1391| v1391_5(void) = AliasedUse : ~m? @@ -7752,13 +7752,13 @@ perf-regression.cpp: # 6| mu6_3(unknown) = InitializeNonLocal : # 6| r6_4(glval) = VariableAddress[#this] : # 6| mu6_5(glval) = InitializeParameter[#this] : &:r6_4 -# 6| r6_6(glval) = Load : &:r6_4, ~m? +# 6| r6_6(glval) = Load[#this] : &:r6_4, ~m? # 6| mu6_7(Big) = InitializeIndirection[#this] : &:r6_6 # 6| r6_8(glval) = FieldAddress[buffer] : mu6_5 # 6| r6_9(int) = Constant[0] : # 6| r6_10(glval) = PointerAdd[1] : r6_8, r6_9 # 6| r6_11(unknown[1073741824]) = Constant[0] : -# 6| mu6_12(unknown[1073741824]) = Store : &:r6_10, r6_11 +# 6| mu6_12(unknown[1073741824]) = Store[?] : &:r6_10, r6_11 # 6| v6_13(void) = NoOp : # 6| v6_14(void) = ReturnIndirection[#this] : &:r6_6, ~m? # 6| v6_15(void) = ReturnVoid : @@ -7781,10 +7781,10 @@ perf-regression.cpp: # 10| v10_9(void) = Call[Big] : func:r10_8, this:r10_7 # 10| mu10_10(unknown) = ^CallSideEffect : ~m? # 10| mu10_11(Big) = ^IndirectMayWriteSideEffect[-1] : &:r10_7 -# 10| mu10_12(Big *) = Store : &:r10_1, r10_7 +# 10| mu10_12(Big *) = Store[big] : &:r10_1, r10_7 # 12| r12_1(glval) = VariableAddress[#return] : # 12| r12_2(int) = Constant[0] : -# 12| mu12_3(int) = Store : &:r12_1, r12_2 +# 12| mu12_3(int) = Store[#return] : &:r12_1, r12_2 # 9| r9_4(glval) = VariableAddress[#return] : # 9| v9_5(void) = ReturnValue : &:r9_4, ~m? # 9| v9_6(void) = AliasedUse : ~m? @@ -7798,12 +7798,12 @@ struct_init.cpp: # 16| mu16_3(unknown) = InitializeNonLocal : # 16| r16_4(glval) = VariableAddress[info] : # 16| mu16_5(Info *) = InitializeParameter[info] : &:r16_4 -# 16| r16_6(Info *) = Load : &:r16_4, ~m? +# 16| r16_6(Info *) = Load[info] : &:r16_4, ~m? # 16| mu16_7(unknown) = InitializeIndirection[info] : &:r16_6 # 17| r17_1(glval) = VariableAddress[info] : -# 17| r17_2(Info *) = Load : &:r17_1, ~m? +# 17| r17_2(Info *) = Load[info] : &:r17_1, ~m? # 17| r17_3(glval) = VariableAddress[global_pointer] : -# 17| mu17_4(Info *) = Store : &:r17_3, r17_2 +# 17| mu17_4(Info *) = Store[global_pointer] : &:r17_3, r17_2 # 18| v18_1(void) = NoOp : # 16| v16_8(void) = ReturnIndirection[info] : &:r16_6, ~m? # 16| v16_9(void) = ReturnVoid : @@ -7839,20 +7839,20 @@ struct_init.cpp: # 30| r30_1(glval) = FieldAddress[name] : r29_4 # 30| r30_2(glval) = StringConstant["1"] : # 30| r30_3(char *) = Convert : r30_2 -# 30| mu30_4(char *) = Store : &:r30_1, r30_3 +# 30| mu30_4(char *) = Store[?] : &:r30_1, r30_3 # 30| r30_5(glval<..(*)(..)>) = FieldAddress[handler] : r29_4 # 30| r30_6(..(*)(..)) = FunctionAddress[handler1] : -# 30| mu30_7(..(*)(..)) = Store : &:r30_5, r30_6 +# 30| mu30_7(..(*)(..)) = Store[?] : &:r30_5, r30_6 # 29| r29_5(int) = Constant[1] : # 29| r29_6(glval) = PointerAdd[16] : r29_1, r29_5 # 31| r31_1(glval) = FieldAddress[name] : r29_6 # 31| r31_2(glval) = StringConstant["2"] : # 31| r31_3(char *) = Convert : r31_2 -# 31| mu31_4(char *) = Store : &:r31_1, r31_3 +# 31| mu31_4(char *) = Store[?] : &:r31_1, r31_3 # 31| r31_5(glval<..(*)(..)>) = FieldAddress[handler] : r29_6 # 31| r31_6(glval<..()(..)>) = FunctionAddress[handler2] : # 31| r31_7(..(*)(..)) = CopyValue : r31_6 -# 31| mu31_8(..(*)(..)) = Store : &:r31_5, r31_7 +# 31| mu31_8(..(*)(..)) = Store[?] : &:r31_5, r31_7 # 33| r33_1(glval) = FunctionAddress[let_info_escape] : # 33| r33_2(glval) = VariableAddress[local_infos] : # 33| r33_3(Info *) = Convert : r33_2 @@ -7872,10 +7872,10 @@ struct_init.cpp: # 36| mu36_3(unknown) = InitializeNonLocal : # 36| r36_4(glval) = VariableAddress[name1] : # 36| mu36_5(char *) = InitializeParameter[name1] : &:r36_4 -# 36| r36_6(char *) = Load : &:r36_4, ~m? +# 36| r36_6(char *) = Load[name1] : &:r36_4, ~m? # 36| mu36_7(unknown) = InitializeIndirection[name1] : &:r36_6 # 37| r37_1(glval) = VariableAddress[static_infos#init] : -# 37| r37_2(bool) = Load : &:r37_1, ~m? +# 37| r37_2(bool) = Load[static_infos#init] : &:r37_1, ~m? # 37| v37_3(void) = ConditionalBranch : r37_2 #-----| False -> Block 2 #-----| True -> Block 1 @@ -7900,21 +7900,21 @@ struct_init.cpp: # 37| r37_6(glval) = PointerAdd[16] : r37_4, r37_5 # 38| r38_1(glval) = FieldAddress[name] : r37_6 # 38| r38_2(glval) = VariableAddress[name1] : -# 38| r38_3(char *) = Load : &:r38_2, ~m? -# 38| mu38_4(char *) = Store : &:r38_1, r38_3 +# 38| r38_3(char *) = Load[name1] : &:r38_2, ~m? +# 38| mu38_4(char *) = Store[?] : &:r38_1, r38_3 # 38| r38_5(glval<..(*)(..)>) = FieldAddress[handler] : r37_6 # 38| r38_6(..(*)(..)) = FunctionAddress[handler1] : -# 38| mu38_7(..(*)(..)) = Store : &:r38_5, r38_6 +# 38| mu38_7(..(*)(..)) = Store[?] : &:r38_5, r38_6 # 37| r37_7(int) = Constant[1] : # 37| r37_8(glval) = PointerAdd[16] : r37_4, r37_7 # 39| r39_1(glval) = FieldAddress[name] : r37_8 # 39| r39_2(glval) = StringConstant["2"] : # 39| r39_3(char *) = Convert : r39_2 -# 39| mu39_4(char *) = Store : &:r39_1, r39_3 +# 39| mu39_4(char *) = Store[?] : &:r39_1, r39_3 # 39| r39_5(glval<..(*)(..)>) = FieldAddress[handler] : r37_8 # 39| r39_6(glval<..()(..)>) = FunctionAddress[handler2] : # 39| r39_7(..(*)(..)) = CopyValue : r39_6 -# 39| mu39_8(..(*)(..)) = Store : &:r39_5, r39_7 +# 39| mu39_8(..(*)(..)) = Store[?] : &:r39_5, r39_7 # 37| r37_9(bool) = Constant[1] : -# 37| mu37_10(bool) = Store : &:r37_1, r37_9 +# 37| mu37_10(bool) = Store[static_infos#init] : &:r37_1, r37_9 #-----| Goto -> Block 1 diff --git a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected index ae579bbbbdcf..874e39cec21d 100644 --- a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected +++ b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected @@ -7,37 +7,37 @@ ssa.cpp: # 13| m13_4(unknown) = Chi : total:m13_2, partial:m13_3 # 13| r13_5(glval) = VariableAddress[p] : # 13| m13_6(Point *) = InitializeParameter[p] : &:r13_5 -# 13| r13_7(Point *) = Load : &:r13_5, m13_6 +# 13| r13_7(Point *) = Load[p] : &:r13_5, m13_6 # 13| m13_8(unknown) = InitializeIndirection[p] : &:r13_7 # 13| r13_9(glval) = VariableAddress[which1] : # 13| m13_10(bool) = InitializeParameter[which1] : &:r13_9 # 13| r13_11(glval) = VariableAddress[which2] : # 13| m13_12(bool) = InitializeParameter[which2] : &:r13_11 # 14| r14_1(glval) = VariableAddress[which1] : -# 14| r14_2(bool) = Load : &:r14_1, m13_10 +# 14| r14_2(bool) = Load[which1] : &:r14_1, m13_10 # 14| v14_3(void) = ConditionalBranch : r14_2 #-----| False -> Block 2 #-----| True -> Block 1 # 15| Block 1 # 15| r15_1(glval) = VariableAddress[p] : -# 15| r15_2(Point *) = Load : &:r15_1, m13_6 +# 15| r15_2(Point *) = Load[p] : &:r15_1, m13_6 # 15| r15_3(glval) = FieldAddress[x] : r15_2 -# 15| r15_4(int) = Load : &:r15_3, ~m13_8 +# 15| r15_4(int) = Load[?] : &:r15_3, ~m13_8 # 15| r15_5(int) = Constant[1] : # 15| r15_6(int) = Add : r15_4, r15_5 -# 15| m15_7(int) = Store : &:r15_3, r15_6 +# 15| m15_7(int) = Store[?] : &:r15_3, r15_6 # 15| m15_8(unknown) = Chi : total:m13_8, partial:m15_7 #-----| Goto -> Block 3 # 18| Block 2 # 18| r18_1(glval) = VariableAddress[p] : -# 18| r18_2(Point *) = Load : &:r18_1, m13_6 +# 18| r18_2(Point *) = Load[p] : &:r18_1, m13_6 # 18| r18_3(glval) = FieldAddress[y] : r18_2 -# 18| r18_4(int) = Load : &:r18_3, ~m13_8 +# 18| r18_4(int) = Load[?] : &:r18_3, ~m13_8 # 18| r18_5(int) = Constant[1] : # 18| r18_6(int) = Add : r18_4, r18_5 -# 18| m18_7(int) = Store : &:r18_3, r18_6 +# 18| m18_7(int) = Store[?] : &:r18_3, r18_6 # 18| m18_8(unknown) = Chi : total:m13_8, partial:m18_7 #-----| Goto -> Block 3 @@ -46,30 +46,30 @@ ssa.cpp: # 21| m21_2(int) = Phi : from 1:m15_7, from 2:~m13_8 # 21| m21_3(unknown) = Phi : from 1:m15_8, from 2:m18_8 # 21| r21_4(glval) = VariableAddress[which2] : -# 21| r21_5(bool) = Load : &:r21_4, m13_12 +# 21| r21_5(bool) = Load[which2] : &:r21_4, m13_12 # 21| v21_6(void) = ConditionalBranch : r21_5 #-----| False -> Block 5 #-----| True -> Block 4 # 22| Block 4 # 22| r22_1(glval) = VariableAddress[p] : -# 22| r22_2(Point *) = Load : &:r22_1, m13_6 +# 22| r22_2(Point *) = Load[p] : &:r22_1, m13_6 # 22| r22_3(glval) = FieldAddress[x] : r22_2 -# 22| r22_4(int) = Load : &:r22_3, m21_2 +# 22| r22_4(int) = Load[?] : &:r22_3, m21_2 # 22| r22_5(int) = Constant[1] : # 22| r22_6(int) = Add : r22_4, r22_5 -# 22| m22_7(int) = Store : &:r22_3, r22_6 +# 22| m22_7(int) = Store[?] : &:r22_3, r22_6 # 22| m22_8(unknown) = Chi : total:m21_3, partial:m22_7 #-----| Goto -> Block 6 # 25| Block 5 # 25| r25_1(glval) = VariableAddress[p] : -# 25| r25_2(Point *) = Load : &:r25_1, m13_6 +# 25| r25_2(Point *) = Load[p] : &:r25_1, m13_6 # 25| r25_3(glval) = FieldAddress[y] : r25_2 -# 25| r25_4(int) = Load : &:r25_3, m21_1 +# 25| r25_4(int) = Load[?] : &:r25_3, m21_1 # 25| r25_5(int) = Constant[1] : # 25| r25_6(int) = Add : r25_4, r25_5 -# 25| m25_7(int) = Store : &:r25_3, r25_6 +# 25| m25_7(int) = Store[?] : &:r25_3, r25_6 # 25| m25_8(unknown) = Chi : total:m21_3, partial:m25_7 #-----| Goto -> Block 6 @@ -79,15 +79,15 @@ ssa.cpp: # 28| m28_3(unknown) = Phi : from 4:m22_8, from 5:m25_8 # 28| r28_4(glval) = VariableAddress[#return] : # 28| r28_5(glval) = VariableAddress[p] : -# 28| r28_6(Point *) = Load : &:r28_5, m13_6 +# 28| r28_6(Point *) = Load[p] : &:r28_5, m13_6 # 28| r28_7(glval) = FieldAddress[x] : r28_6 -# 28| r28_8(int) = Load : &:r28_7, m28_2 +# 28| r28_8(int) = Load[?] : &:r28_7, m28_2 # 28| r28_9(glval) = VariableAddress[p] : -# 28| r28_10(Point *) = Load : &:r28_9, m13_6 +# 28| r28_10(Point *) = Load[p] : &:r28_9, m13_6 # 28| r28_11(glval) = FieldAddress[y] : r28_10 -# 28| r28_12(int) = Load : &:r28_11, m28_1 +# 28| r28_12(int) = Load[?] : &:r28_11, m28_1 # 28| r28_13(int) = Add : r28_8, r28_12 -# 28| m28_14(int) = Store : &:r28_4, r28_13 +# 28| m28_14(int) = Store[#return] : &:r28_4, r28_13 # 13| v13_13(void) = ReturnIndirection[p] : &:r13_7, m28_3 # 13| r13_14(glval) = VariableAddress[#return] : # 13| v13_15(void) = ReturnValue : &:r13_14, m28_14 @@ -104,7 +104,7 @@ ssa.cpp: # 34| v34_1(void) = NoOp : # 35| r35_1(glval) = VariableAddress[#return] : # 35| r35_2(int) = Constant[0] : -# 35| m35_3(int) = Store : &:r35_1, r35_2 +# 35| m35_3(int) = Store[#return] : &:r35_1, r35_2 # 31| r31_5(glval) = VariableAddress[#return] : # 31| v31_6(void) = ReturnValue : &:r31_5, m35_3 # 31| v31_7(void) = AliasedUse : m31_3 @@ -120,12 +120,12 @@ ssa.cpp: # 38| m38_6(bool) = InitializeParameter[b] : &:r38_5 # 39| r39_1(glval) = VariableAddress[x] : # 39| r39_2(int) = Constant[5] : -# 39| m39_3(int) = Store : &:r39_1, r39_2 +# 39| m39_3(int) = Store[x] : &:r39_1, r39_2 # 40| r40_1(glval) = VariableAddress[y] : # 40| r40_2(int) = Constant[10] : -# 40| m40_3(int) = Store : &:r40_1, r40_2 +# 40| m40_3(int) = Store[y] : &:r40_1, r40_2 # 41| r41_1(glval) = VariableAddress[b] : -# 41| r41_2(bool) = Load : &:r41_1, m38_6 +# 41| r41_2(bool) = Load[b] : &:r41_1, m38_6 # 41| v41_3(void) = ConditionalBranch : r41_2 #-----| False -> Block 4 #-----| True -> Block 2 @@ -139,9 +139,9 @@ ssa.cpp: # 42| Block 2 # 42| r42_1(glval) = VariableAddress[x] : -# 42| r42_2(int) = Load : &:r42_1, m39_3 +# 42| r42_2(int) = Load[x] : &:r42_1, m39_3 # 42| r42_3(glval) = VariableAddress[y] : -# 42| r42_4(int) = Load : &:r42_3, m40_3 +# 42| r42_4(int) = Load[y] : &:r42_3, m40_3 # 42| r42_5(bool) = CompareEQ : r42_2, r42_4 # 42| v42_6(void) = ConditionalBranch : r42_5 #-----| False -> Block 3 @@ -150,14 +150,14 @@ ssa.cpp: # 46| Block 3 # 46| r46_1(glval) = VariableAddress[#return] : # 46| r46_2(int) = Constant[0] : -# 46| m46_3(int) = Store : &:r46_1, r46_2 +# 46| m46_3(int) = Store[#return] : &:r46_1, r46_2 #-----| Goto -> Block 1 # 50| Block 4 # 50| r50_1(glval) = VariableAddress[x] : -# 50| r50_2(int) = Load : &:r50_1, m39_3 +# 50| r50_2(int) = Load[x] : &:r50_1, m39_3 # 50| r50_3(glval) = VariableAddress[y] : -# 50| r50_4(int) = Load : &:r50_3, m40_3 +# 50| r50_4(int) = Load[y] : &:r50_3, m40_3 # 50| r50_5(bool) = CompareLT : r50_2, r50_4 # 50| v50_6(void) = ConditionalBranch : r50_5 #-----| False -> Block 6 @@ -166,7 +166,7 @@ ssa.cpp: # 51| Block 5 # 51| r51_1(glval) = VariableAddress[#return] : # 51| r51_2(int) = Constant[0] : -# 51| m51_3(int) = Store : &:r51_1, r51_2 +# 51| m51_3(int) = Store[#return] : &:r51_1, r51_2 #-----| Goto -> Block 1 # 38| Block 6 @@ -180,12 +180,12 @@ ssa.cpp: # 59| m59_4(unknown) = Chi : total:m59_2, partial:m59_3 # 60| r60_1(glval) = VariableAddress[i] : # 60| r60_2(int) = Constant[0] : -# 60| m60_3(int) = Store : &:r60_1, r60_2 +# 60| m60_3(int) = Store[i] : &:r60_1, r60_2 # 62| r62_1(glval) = VariableAddress[i] : -# 62| r62_2(int) = Load : &:r62_1, m60_3 +# 62| r62_2(int) = Load[i] : &:r62_1, m60_3 # 62| r62_3(int) = Constant[1] : # 62| r62_4(int) = Add : r62_2, r62_3 -# 62| m62_5(int) = Store : &:r62_1, r62_4 +# 62| m62_5(int) = Store[i] : &:r62_1, r62_4 # 63| r63_1(bool) = Constant[0] : # 63| v63_2(void) = ConditionalBranch : r63_1 #-----| False -> Block 1 @@ -194,8 +194,8 @@ ssa.cpp: # 65| Block 1 # 65| r65_1(glval) = VariableAddress[#return] : # 65| r65_2(glval) = VariableAddress[i] : -# 65| r65_3(int) = Load : &:r65_2, m62_5 -# 65| m65_4(int) = Store : &:r65_1, r65_3 +# 65| r65_3(int) = Load[i] : &:r65_2, m62_5 +# 65| m65_4(int) = Store[#return] : &:r65_1, r65_3 # 59| r59_5(glval) = VariableAddress[#return] : # 59| v59_6(void) = ReturnValue : &:r59_5, m65_4 # 59| v59_7(void) = AliasedUse : m59_3 @@ -214,7 +214,7 @@ ssa.cpp: # 68| m68_6(int) = InitializeParameter[n] : &:r68_5 # 68| r68_7(glval) = VariableAddress[p] : # 68| m68_8(char *) = InitializeParameter[p] : &:r68_7 -# 68| r68_9(char *) = Load : &:r68_7, m68_8 +# 68| r68_9(char *) = Load[p] : &:r68_7, m68_8 # 68| m68_10(unknown) = InitializeIndirection[p] : &:r68_9 #-----| Goto -> Block 1 @@ -223,10 +223,10 @@ ssa.cpp: # 69| m69_2(int) = Phi : from 0:m68_6, from 2:m69_8 # 69| m69_3(unknown) = Phi : from 0:~m68_4, from 2:~m70_10 # 69| r69_4(glval) = VariableAddress[n] : -# 69| r69_5(int) = Load : &:r69_4, m69_2 +# 69| r69_5(int) = Load[n] : &:r69_4, m69_2 # 69| r69_6(int) = Constant[1] : # 69| r69_7(int) = Sub : r69_5, r69_6 -# 69| m69_8(int) = Store : &:r69_4, r69_7 +# 69| m69_8(int) = Store[n] : &:r69_4, r69_7 # 69| r69_9(int) = CopyValue : r69_5 # 69| r69_10(int) = Constant[0] : # 69| r69_11(bool) = CompareGT : r69_9, r69_10 @@ -237,13 +237,13 @@ ssa.cpp: # 70| Block 2 # 70| r70_1(char) = Constant[0] : # 70| r70_2(glval) = VariableAddress[p] : -# 70| r70_3(char *) = Load : &:r70_2, m69_1 +# 70| r70_3(char *) = Load[p] : &:r70_2, m69_1 # 70| r70_4(int) = Constant[1] : # 70| r70_5(char *) = PointerAdd[1] : r70_3, r70_4 -# 70| m70_6(char *) = Store : &:r70_2, r70_5 +# 70| m70_6(char *) = Store[p] : &:r70_2, r70_5 # 70| r70_7(char *) = CopyValue : r70_3 # 70| r70_8(glval) = CopyValue : r70_7 -# 70| m70_9(char) = Store : &:r70_8, r70_1 +# 70| m70_9(char) = Store[?] : &:r70_8, r70_1 # 70| m70_10(unknown) = Chi : total:m69_3, partial:m70_9 #-----| Goto (back edge) -> Block 1 @@ -264,15 +264,15 @@ ssa.cpp: # 75| m75_6(bool) = InitializeParameter[b] : &:r75_5 # 76| r76_1(glval) = VariableAddress[x] : # 76| r76_2(int) = Constant[0] : -# 76| m76_3(int) = Store : &:r76_1, r76_2 +# 76| m76_3(int) = Store[x] : &:r76_1, r76_2 # 77| r77_1(glval) = VariableAddress[y] : # 77| r77_2(int) = Constant[1] : -# 77| m77_3(int) = Store : &:r77_1, r77_2 +# 77| m77_3(int) = Store[y] : &:r77_1, r77_2 # 78| r78_1(glval) = VariableAddress[z] : # 78| r78_2(int) = Constant[2] : -# 78| m78_3(int) = Store : &:r78_1, r78_2 +# 78| m78_3(int) = Store[z] : &:r78_1, r78_2 # 79| r79_1(glval) = VariableAddress[b] : -# 79| r79_2(bool) = Load : &:r79_1, m75_6 +# 79| r79_2(bool) = Load[b] : &:r79_1, m75_6 # 79| v79_3(void) = ConditionalBranch : r79_2 #-----| False -> Block 2 #-----| True -> Block 1 @@ -280,16 +280,16 @@ ssa.cpp: # 80| Block 1 # 80| r80_1(int) = Constant[3] : # 80| r80_2(glval) = VariableAddress[x] : -# 80| m80_3(int) = Store : &:r80_2, r80_1 +# 80| m80_3(int) = Store[x] : &:r80_2, r80_1 # 81| r81_1(int) = Constant[4] : # 81| r81_2(glval) = VariableAddress[y] : -# 81| m81_3(int) = Store : &:r81_2, r81_1 +# 81| m81_3(int) = Store[y] : &:r81_2, r81_1 #-----| Goto -> Block 3 # 84| Block 2 # 84| r84_1(int) = Constant[5] : # 84| r84_2(glval) = VariableAddress[x] : -# 84| m84_3(int) = Store : &:r84_2, r84_1 +# 84| m84_3(int) = Store[x] : &:r84_2, r84_1 #-----| Goto -> Block 3 # 86| Block 3 @@ -297,16 +297,16 @@ ssa.cpp: # 86| m86_2(int) = Phi : from 1:m80_3, from 2:m84_3 # 86| r86_3(glval) = VariableAddress[x_merge] : # 86| r86_4(glval) = VariableAddress[x] : -# 86| r86_5(int) = Load : &:r86_4, m86_2 -# 86| m86_6(int) = Store : &:r86_3, r86_5 +# 86| r86_5(int) = Load[x] : &:r86_4, m86_2 +# 86| m86_6(int) = Store[x_merge] : &:r86_3, r86_5 # 87| r87_1(glval) = VariableAddress[y_merge] : # 87| r87_2(glval) = VariableAddress[y] : -# 87| r87_3(int) = Load : &:r87_2, m86_1 -# 87| m87_4(int) = Store : &:r87_1, r87_3 +# 87| r87_3(int) = Load[y] : &:r87_2, m86_1 +# 87| m87_4(int) = Store[y_merge] : &:r87_1, r87_3 # 88| r88_1(glval) = VariableAddress[z_merge] : # 88| r88_2(glval) = VariableAddress[z] : -# 88| r88_3(int) = Load : &:r88_2, m78_3 -# 88| m88_4(int) = Store : &:r88_1, r88_3 +# 88| r88_3(int) = Load[z] : &:r88_2, m78_3 +# 88| m88_4(int) = Store[z_merge] : &:r88_1, r88_3 # 89| v89_1(void) = NoOp : # 75| v75_7(void) = ReturnVoid : # 75| v75_8(void) = AliasedUse : m75_3 @@ -322,8 +322,8 @@ ssa.cpp: # 91| m91_6(Point) = InitializeParameter[a] : &:r91_5 # 92| r92_1(glval) = VariableAddress[b] : # 92| r92_2(glval) = VariableAddress[a] : -# 92| r92_3(Point) = Load : &:r92_2, m91_6 -# 92| m92_4(Point) = Store : &:r92_1, r92_3 +# 92| r92_3(Point) = Load[a] : &:r92_2, m91_6 +# 92| m92_4(Point) = Store[b] : &:r92_1, r92_3 # 93| v93_1(void) = NoOp : # 91| v91_7(void) = ReturnVoid : # 91| v91_8(void) = AliasedUse : m91_3 @@ -340,8 +340,8 @@ ssa.cpp: # 95| m95_7(unknown) = Chi : total:m95_4, partial:m95_6 # 96| r96_1(glval) = VariableAddress[b] : # 96| r96_2(glval) = VariableAddress[a] : -# 96| r96_3(Point) = Load : &:r96_2, m95_6 -# 96| m96_4(Point) = Store : &:r96_1, r96_3 +# 96| r96_3(Point) = Load[a] : &:r96_2, m95_6 +# 96| m96_4(Point) = Store[b] : &:r96_1, r96_3 # 97| r97_1(glval) = FunctionAddress[Escape] : # 97| r97_2(glval) = VariableAddress[a] : # 97| r97_3(Point *) = CopyValue : r97_2 @@ -368,13 +368,13 @@ ssa.cpp: # 101| r101_1(glval) = VariableAddress[x] : # 101| r101_2(glval) = VariableAddress[a] : # 101| r101_3(glval) = FieldAddress[x] : r101_2 -# 101| r101_4(int) = Load : &:r101_3, ~m100_6 -# 101| m101_5(int) = Store : &:r101_1, r101_4 +# 101| r101_4(int) = Load[?] : &:r101_3, ~m100_6 +# 101| m101_5(int) = Store[x] : &:r101_1, r101_4 # 102| r102_1(glval) = VariableAddress[y] : # 102| r102_2(glval) = VariableAddress[a] : # 102| r102_3(glval) = FieldAddress[y] : r102_2 -# 102| r102_4(int) = Load : &:r102_3, ~m100_6 -# 102| m102_5(int) = Store : &:r102_1, r102_4 +# 102| r102_4(int) = Load[?] : &:r102_3, ~m100_6 +# 102| m102_5(int) = Store[y] : &:r102_1, r102_4 # 103| v103_1(void) = NoOp : # 100| v100_7(void) = ReturnVoid : # 100| v100_8(void) = AliasedUse : m100_3 @@ -392,13 +392,13 @@ ssa.cpp: # 106| r106_1(glval) = VariableAddress[x] : # 106| r106_2(glval) = VariableAddress[a] : # 106| r106_3(glval) = FieldAddress[x] : r106_2 -# 106| r106_4(int) = Load : &:r106_3, ~m105_6 -# 106| m106_5(int) = Store : &:r106_1, r106_4 +# 106| r106_4(int) = Load[?] : &:r106_3, ~m105_6 +# 106| m106_5(int) = Store[x] : &:r106_1, r106_4 # 107| r107_1(glval) = VariableAddress[y] : # 107| r107_2(glval) = VariableAddress[a] : # 107| r107_3(glval) = FieldAddress[y] : r107_2 -# 107| r107_4(int) = Load : &:r107_3, ~m105_6 -# 107| m107_5(int) = Store : &:r107_1, r107_4 +# 107| r107_4(int) = Load[?] : &:r107_3, ~m105_6 +# 107| m107_5(int) = Store[y] : &:r107_1, r107_4 # 108| r108_1(glval) = FunctionAddress[Escape] : # 108| r108_2(glval) = VariableAddress[a] : # 108| r108_3(Point *) = CopyValue : r108_2 @@ -428,18 +428,18 @@ ssa.cpp: # 112| m112_2(Point) = Uninitialized[a] : &:r112_1 # 112| r112_3(glval) = FieldAddress[x] : r112_1 # 112| r112_4(glval) = VariableAddress[x] : -# 112| r112_5(int) = Load : &:r112_4, m111_6 -# 112| m112_6(int) = Store : &:r112_3, r112_5 +# 112| r112_5(int) = Load[x] : &:r112_4, m111_6 +# 112| m112_6(int) = Store[?] : &:r112_3, r112_5 # 112| m112_7(Point) = Chi : total:m112_2, partial:m112_6 # 112| r112_8(glval) = FieldAddress[y] : r112_1 # 112| r112_9(glval) = VariableAddress[y] : -# 112| r112_10(int) = Load : &:r112_9, m111_8 -# 112| m112_11(int) = Store : &:r112_8, r112_10 +# 112| r112_10(int) = Load[y] : &:r112_9, m111_8 +# 112| m112_11(int) = Store[?] : &:r112_8, r112_10 # 112| m112_12(Point) = Chi : total:m112_7, partial:m112_11 # 113| r113_1(glval) = VariableAddress[b] : # 113| r113_2(glval) = VariableAddress[a] : -# 113| r113_3(Point) = Load : &:r113_2, m112_12 -# 113| m113_4(Point) = Store : &:r113_1, r113_3 +# 113| r113_3(Point) = Load[a] : &:r113_2, m112_12 +# 113| m113_4(Point) = Store[b] : &:r113_1, r113_3 # 114| v114_1(void) = NoOp : # 111| v111_9(void) = ReturnVoid : # 111| v111_10(void) = AliasedUse : m111_3 @@ -460,18 +460,18 @@ ssa.cpp: # 117| m117_3(unknown) = Chi : total:m116_4, partial:m117_2 # 117| r117_4(glval) = FieldAddress[x] : r117_1 # 117| r117_5(glval) = VariableAddress[x] : -# 117| r117_6(int) = Load : &:r117_5, m116_6 -# 117| m117_7(int) = Store : &:r117_4, r117_6 +# 117| r117_6(int) = Load[x] : &:r117_5, m116_6 +# 117| m117_7(int) = Store[?] : &:r117_4, r117_6 # 117| m117_8(unknown) = Chi : total:m117_3, partial:m117_7 # 117| r117_9(glval) = FieldAddress[y] : r117_1 # 117| r117_10(glval) = VariableAddress[y] : -# 117| r117_11(int) = Load : &:r117_10, m116_8 -# 117| m117_12(int) = Store : &:r117_9, r117_11 +# 117| r117_11(int) = Load[y] : &:r117_10, m116_8 +# 117| m117_12(int) = Store[?] : &:r117_9, r117_11 # 117| m117_13(unknown) = Chi : total:m117_8, partial:m117_12 # 118| r118_1(glval) = VariableAddress[b] : # 118| r118_2(glval) = VariableAddress[a] : -# 118| r118_3(Point) = Load : &:r118_2, ~m117_13 -# 118| m118_4(Point) = Store : &:r118_1, r118_3 +# 118| r118_3(Point) = Load[a] : &:r118_2, ~m117_13 +# 118| m118_4(Point) = Store[b] : &:r118_1, r118_3 # 119| r119_1(glval) = FunctionAddress[Escape] : # 119| r119_2(glval) = VariableAddress[a] : # 119| r119_3(Point *) = CopyValue : r119_2 @@ -503,33 +503,33 @@ ssa.cpp: # 123| m123_2(Point) = Uninitialized[a] : &:r123_1 # 123| r123_3(glval) = FieldAddress[x] : r123_1 # 123| r123_4(int) = Constant[0] : -# 123| m123_5(int) = Store : &:r123_3, r123_4 +# 123| m123_5(int) = Store[?] : &:r123_3, r123_4 # 123| m123_6(Point) = Chi : total:m123_2, partial:m123_5 # 123| r123_7(glval) = FieldAddress[y] : r123_1 # 123| r123_8(int) = Constant[0] : -# 123| m123_9(int) = Store : &:r123_7, r123_8 +# 123| m123_9(int) = Store[?] : &:r123_7, r123_8 # 123| m123_10(Point) = Chi : total:m123_6, partial:m123_9 # 124| r124_1(glval) = VariableAddress[c] : -# 124| r124_2(bool) = Load : &:r124_1, m122_6 +# 124| r124_2(bool) = Load[c] : &:r124_1, m122_6 # 124| v124_3(void) = ConditionalBranch : r124_2 #-----| False -> Block 2 #-----| True -> Block 1 # 125| Block 1 # 125| r125_1(glval) = VariableAddress[x1] : -# 125| r125_2(int) = Load : &:r125_1, m122_8 +# 125| r125_2(int) = Load[x1] : &:r125_1, m122_8 # 125| r125_3(glval) = VariableAddress[a] : # 125| r125_4(glval) = FieldAddress[x] : r125_3 -# 125| m125_5(int) = Store : &:r125_4, r125_2 +# 125| m125_5(int) = Store[?] : &:r125_4, r125_2 # 125| m125_6(Point) = Chi : total:m123_10, partial:m125_5 #-----| Goto -> Block 3 # 128| Block 2 # 128| r128_1(glval) = VariableAddress[x2] : -# 128| r128_2(int) = Load : &:r128_1, m122_10 +# 128| r128_2(int) = Load[x2] : &:r128_1, m122_10 # 128| r128_3(glval) = VariableAddress[a] : # 128| r128_4(glval) = FieldAddress[x] : r128_3 -# 128| m128_5(int) = Store : &:r128_4, r128_2 +# 128| m128_5(int) = Store[?] : &:r128_4, r128_2 # 128| m128_6(Point) = Chi : total:m123_10, partial:m128_5 #-----| Goto -> Block 3 @@ -539,12 +539,12 @@ ssa.cpp: # 130| r130_3(glval) = VariableAddress[x] : # 130| r130_4(glval) = VariableAddress[a] : # 130| r130_5(glval) = FieldAddress[x] : r130_4 -# 130| r130_6(int) = Load : &:r130_5, m130_1 -# 130| m130_7(int) = Store : &:r130_3, r130_6 +# 130| r130_6(int) = Load[?] : &:r130_5, m130_1 +# 130| m130_7(int) = Store[x] : &:r130_3, r130_6 # 131| r131_1(glval) = VariableAddress[b] : # 131| r131_2(glval) = VariableAddress[a] : -# 131| r131_3(Point) = Load : &:r131_2, m130_2 -# 131| m131_4(Point) = Store : &:r131_1, r131_3 +# 131| r131_3(Point) = Load[a] : &:r131_2, m130_2 +# 131| m131_4(Point) = Store[b] : &:r131_1, r131_3 # 132| v132_1(void) = NoOp : # 122| v122_11(void) = ReturnVoid : # 122| v122_12(void) = AliasedUse : m122_3 @@ -566,32 +566,32 @@ ssa.cpp: # 135| m135_2(Point) = Uninitialized[a] : &:r135_1 # 135| r135_3(glval) = FieldAddress[x] : r135_1 # 135| r135_4(int) = Constant[0] : -# 135| m135_5(int) = Store : &:r135_3, r135_4 +# 135| m135_5(int) = Store[?] : &:r135_3, r135_4 # 135| m135_6(Point) = Chi : total:m135_2, partial:m135_5 # 135| r135_7(glval) = FieldAddress[y] : r135_1 # 135| r135_8(int) = Constant[0] : -# 135| m135_9(int) = Store : &:r135_7, r135_8 +# 135| m135_9(int) = Store[?] : &:r135_7, r135_8 # 135| m135_10(Point) = Chi : total:m135_6, partial:m135_9 # 136| r136_1(glval) = VariableAddress[c] : -# 136| r136_2(bool) = Load : &:r136_1, m134_6 +# 136| r136_2(bool) = Load[c] : &:r136_1, m134_6 # 136| v136_3(void) = ConditionalBranch : r136_2 #-----| False -> Block 2 #-----| True -> Block 1 # 137| Block 1 # 137| r137_1(glval) = VariableAddress[x1] : -# 137| r137_2(int) = Load : &:r137_1, m134_10 +# 137| r137_2(int) = Load[x1] : &:r137_1, m134_10 # 137| r137_3(glval) = VariableAddress[a] : # 137| r137_4(glval) = FieldAddress[x] : r137_3 -# 137| m137_5(int) = Store : &:r137_4, r137_2 +# 137| m137_5(int) = Store[?] : &:r137_4, r137_2 # 137| m137_6(Point) = Chi : total:m135_10, partial:m137_5 #-----| Goto -> Block 3 # 140| Block 2 # 140| r140_1(glval) = VariableAddress[p] : -# 140| r140_2(Point) = Load : &:r140_1, m134_8 +# 140| r140_2(Point) = Load[p] : &:r140_1, m134_8 # 140| r140_3(glval) = VariableAddress[a] : -# 140| m140_4(Point) = Store : &:r140_3, r140_2 +# 140| m140_4(Point) = Store[a] : &:r140_3, r140_2 #-----| Goto -> Block 3 # 142| Block 3 @@ -600,8 +600,8 @@ ssa.cpp: # 142| r142_3(glval) = VariableAddress[x] : # 142| r142_4(glval) = VariableAddress[a] : # 142| r142_5(glval) = FieldAddress[x] : r142_4 -# 142| r142_6(int) = Load : &:r142_5, m142_1 -# 142| m142_7(int) = Store : &:r142_3, r142_6 +# 142| r142_6(int) = Load[?] : &:r142_5, m142_1 +# 142| m142_7(int) = Store[x] : &:r142_3, r142_6 # 143| v143_1(void) = NoOp : # 134| v134_11(void) = ReturnVoid : # 134| v134_12(void) = AliasedUse : m134_3 @@ -623,40 +623,40 @@ ssa.cpp: # 146| m146_2(Point) = Uninitialized[a] : &:r146_1 # 146| r146_3(glval) = FieldAddress[x] : r146_1 # 146| r146_4(int) = Constant[0] : -# 146| m146_5(int) = Store : &:r146_3, r146_4 +# 146| m146_5(int) = Store[?] : &:r146_3, r146_4 # 146| m146_6(Point) = Chi : total:m146_2, partial:m146_5 # 146| r146_7(glval) = FieldAddress[y] : r146_1 # 146| r146_8(int) = Constant[0] : -# 146| m146_9(int) = Store : &:r146_7, r146_8 +# 146| m146_9(int) = Store[?] : &:r146_7, r146_8 # 146| m146_10(Point) = Chi : total:m146_6, partial:m146_9 # 147| r147_1(glval) = VariableAddress[c] : -# 147| r147_2(bool) = Load : &:r147_1, m145_6 +# 147| r147_2(bool) = Load[c] : &:r147_1, m145_6 # 147| v147_3(void) = ConditionalBranch : r147_2 #-----| False -> Block 2 #-----| True -> Block 1 # 148| Block 1 # 148| r148_1(glval) = VariableAddress[x1] : -# 148| r148_2(int) = Load : &:r148_1, m145_10 +# 148| r148_2(int) = Load[x1] : &:r148_1, m145_10 # 148| r148_3(glval) = VariableAddress[a] : # 148| r148_4(glval) = FieldAddress[x] : r148_3 -# 148| m148_5(int) = Store : &:r148_4, r148_2 +# 148| m148_5(int) = Store[?] : &:r148_4, r148_2 # 148| m148_6(Point) = Chi : total:m146_10, partial:m148_5 #-----| Goto -> Block 3 # 151| Block 2 # 151| r151_1(glval) = VariableAddress[p] : -# 151| r151_2(Point) = Load : &:r151_1, m145_8 +# 151| r151_2(Point) = Load[p] : &:r151_1, m145_8 # 151| r151_3(glval) = VariableAddress[a] : -# 151| m151_4(Point) = Store : &:r151_3, r151_2 +# 151| m151_4(Point) = Store[a] : &:r151_3, r151_2 #-----| Goto -> Block 3 # 153| Block 3 # 153| m153_1(Point) = Phi : from 1:m148_6, from 2:m151_4 # 153| r153_2(glval) = VariableAddress[b] : # 153| r153_3(glval) = VariableAddress[a] : -# 153| r153_4(Point) = Load : &:r153_3, m153_1 -# 153| m153_5(Point) = Store : &:r153_2, r153_4 +# 153| r153_4(Point) = Load[a] : &:r153_3, m153_1 +# 153| m153_5(Point) = Store[b] : &:r153_2, r153_4 # 154| v154_1(void) = NoOp : # 145| v145_11(void) = ReturnVoid : # 145| v145_12(void) = AliasedUse : m145_3 @@ -678,33 +678,33 @@ ssa.cpp: # 157| m157_2(Rect) = Uninitialized[a] : &:r157_1 # 157| r157_3(glval) = FieldAddress[topLeft] : r157_1 # 157| r157_4(Point) = Constant[0] : -# 157| m157_5(Point) = Store : &:r157_3, r157_4 +# 157| m157_5(Point) = Store[?] : &:r157_3, r157_4 # 157| m157_6(Rect) = Chi : total:m157_2, partial:m157_5 # 157| r157_7(glval) = FieldAddress[bottomRight] : r157_1 # 157| r157_8(Point) = Constant[0] : -# 157| m157_9(Point) = Store : &:r157_7, r157_8 +# 157| m157_9(Point) = Store[?] : &:r157_7, r157_8 # 157| m157_10(Rect) = Chi : total:m157_6, partial:m157_9 # 158| r158_1(glval) = VariableAddress[c] : -# 158| r158_2(bool) = Load : &:r158_1, m156_6 +# 158| r158_2(bool) = Load[c] : &:r158_1, m156_6 # 158| v158_3(void) = ConditionalBranch : r158_2 #-----| False -> Block 2 #-----| True -> Block 1 # 159| Block 1 # 159| r159_1(glval) = VariableAddress[x1] : -# 159| r159_2(int) = Load : &:r159_1, m156_10 +# 159| r159_2(int) = Load[x1] : &:r159_1, m156_10 # 159| r159_3(glval) = VariableAddress[a] : # 159| r159_4(glval) = FieldAddress[topLeft] : r159_3 # 159| r159_5(glval) = FieldAddress[x] : r159_4 -# 159| m159_6(int) = Store : &:r159_5, r159_2 +# 159| m159_6(int) = Store[?] : &:r159_5, r159_2 # 159| m159_7(Rect) = Chi : total:m157_10, partial:m159_6 #-----| Goto -> Block 3 # 162| Block 2 # 162| r162_1(glval) = VariableAddress[r] : -# 162| r162_2(Rect) = Load : &:r162_1, m156_8 +# 162| r162_2(Rect) = Load[r] : &:r162_1, m156_8 # 162| r162_3(glval) = VariableAddress[a] : -# 162| m162_4(Rect) = Store : &:r162_3, r162_2 +# 162| m162_4(Rect) = Store[a] : &:r162_3, r162_2 #-----| Goto -> Block 3 # 164| Block 3 @@ -712,8 +712,8 @@ ssa.cpp: # 164| r164_2(glval) = VariableAddress[b] : # 164| r164_3(glval) = VariableAddress[a] : # 164| r164_4(glval) = FieldAddress[topLeft] : r164_3 -# 164| r164_5(Point) = Load : &:r164_4, ~m164_1 -# 164| m164_6(Point) = Store : &:r164_2, r164_5 +# 164| r164_5(Point) = Load[?] : &:r164_4, ~m164_1 +# 164| m164_6(Point) = Store[b] : &:r164_2, r164_5 # 165| v165_1(void) = NoOp : # 156| v156_11(void) = ReturnVoid : # 156| v156_12(void) = AliasedUse : m156_3 @@ -729,26 +729,26 @@ ssa.cpp: # 171| m171_6(Wrapper) = InitializeParameter[w] : &:r171_5 # 172| r172_1(glval) = VariableAddress[x] : # 172| r172_2(glval) = VariableAddress[w] : -# 172| r172_3(Wrapper) = Load : &:r172_2, m171_6 -# 172| m172_4(Wrapper) = Store : &:r172_1, r172_3 +# 172| r172_3(Wrapper) = Load[w] : &:r172_2, m171_6 +# 172| m172_4(Wrapper) = Store[x] : &:r172_1, r172_3 # 173| r173_1(glval) = VariableAddress[a] : # 173| r173_2(glval) = VariableAddress[w] : # 173| r173_3(glval) = FieldAddress[f] : r173_2 -# 173| r173_4(int) = Load : &:r173_3, ~m171_6 -# 173| m173_5(int) = Store : &:r173_1, r173_4 +# 173| r173_4(int) = Load[?] : &:r173_3, ~m171_6 +# 173| m173_5(int) = Store[a] : &:r173_1, r173_4 # 174| r174_1(int) = Constant[5] : # 174| r174_2(glval) = VariableAddress[w] : # 174| r174_3(glval) = FieldAddress[f] : r174_2 -# 174| m174_4(int) = Store : &:r174_3, r174_1 +# 174| m174_4(int) = Store[?] : &:r174_3, r174_1 # 175| r175_1(glval) = VariableAddress[w] : # 175| r175_2(glval) = FieldAddress[f] : r175_1 -# 175| r175_3(int) = Load : &:r175_2, m174_4 +# 175| r175_3(int) = Load[?] : &:r175_2, m174_4 # 175| r175_4(glval) = VariableAddress[a] : -# 175| m175_5(int) = Store : &:r175_4, r175_3 +# 175| m175_5(int) = Store[a] : &:r175_4, r175_3 # 176| r176_1(glval) = VariableAddress[w] : -# 176| r176_2(Wrapper) = Load : &:r176_1, ~m174_4 +# 176| r176_2(Wrapper) = Load[w] : &:r176_1, ~m174_4 # 176| r176_3(glval) = VariableAddress[x] : -# 176| m176_4(Wrapper) = Store : &:r176_3, r176_2 +# 176| m176_4(Wrapper) = Store[x] : &:r176_3, r176_2 # 177| v177_1(void) = NoOp : # 171| v171_7(void) = ReturnVoid : # 171| v171_8(void) = AliasedUse : m171_3 @@ -762,15 +762,15 @@ ssa.cpp: # 179| m179_4(unknown) = Chi : total:m179_2, partial:m179_3 # 179| r179_5(glval) = VariableAddress[p] : # 179| m179_6(int *) = InitializeParameter[p] : &:r179_5 -# 179| r179_7(int *) = Load : &:r179_5, m179_6 +# 179| r179_7(int *) = Load[p] : &:r179_5, m179_6 # 179| m179_8(unknown) = InitializeIndirection[p] : &:r179_7 # 180| m180_1(unknown) = InlineAsm : ~m179_4 # 180| m180_2(unknown) = Chi : total:m179_4, partial:m180_1 # 181| r181_1(glval) = VariableAddress[#return] : # 181| r181_2(glval) = VariableAddress[p] : -# 181| r181_3(int *) = Load : &:r181_2, m179_6 -# 181| r181_4(int) = Load : &:r181_3, ~m179_8 -# 181| m181_5(int) = Store : &:r181_1, r181_4 +# 181| r181_3(int *) = Load[p] : &:r181_2, m179_6 +# 181| r181_4(int) = Load[?] : &:r181_3, ~m179_8 +# 181| m181_5(int) = Store[#return] : &:r181_1, r181_4 # 179| v179_9(void) = ReturnIndirection[p] : &:r179_7, m179_8 # 179| r179_10(glval) = VariableAddress[#return] : # 179| v179_11(void) = ReturnValue : &:r179_10, m181_5 @@ -785,34 +785,34 @@ ssa.cpp: # 184| m184_4(unknown) = Chi : total:m184_2, partial:m184_3 # 184| r184_5(glval) = VariableAddress[a] : # 184| m184_6(unsigned int &) = InitializeParameter[a] : &:r184_5 -# 184| r184_7(unsigned int &) = Load : &:r184_5, m184_6 +# 184| r184_7(unsigned int &) = Load[a] : &:r184_5, m184_6 # 184| m184_8(unknown) = InitializeIndirection[a] : &:r184_7 # 184| m184_9(unknown) = Chi : total:m184_4, partial:m184_8 # 184| r184_10(glval) = VariableAddress[b] : # 184| m184_11(unsigned int &) = InitializeParameter[b] : &:r184_10 -# 184| r184_12(unsigned int &) = Load : &:r184_10, m184_11 +# 184| r184_12(unsigned int &) = Load[b] : &:r184_10, m184_11 # 184| m184_13(unknown) = InitializeIndirection[b] : &:r184_12 # 184| m184_14(unknown) = Chi : total:m184_9, partial:m184_13 # 184| r184_15(glval) = VariableAddress[c] : # 184| m184_16(unsigned int &) = InitializeParameter[c] : &:r184_15 -# 184| r184_17(unsigned int &) = Load : &:r184_15, m184_16 +# 184| r184_17(unsigned int &) = Load[c] : &:r184_15, m184_16 # 184| m184_18(unknown) = InitializeIndirection[c] : &:r184_17 # 184| r184_19(glval) = VariableAddress[d] : # 184| m184_20(unsigned int &) = InitializeParameter[d] : &:r184_19 -# 184| r184_21(unsigned int &) = Load : &:r184_19, m184_20 +# 184| r184_21(unsigned int &) = Load[d] : &:r184_19, m184_20 # 184| m184_22(unknown) = InitializeIndirection[d] : &:r184_21 # 189| r189_1(glval) = VariableAddress[a] : -# 189| r189_2(unsigned int &) = Load : &:r189_1, m184_6 +# 189| r189_2(unsigned int &) = Load[a] : &:r189_1, m184_6 # 189| r189_3(glval) = CopyValue : r189_2 # 189| r189_4(glval) = VariableAddress[b] : -# 189| r189_5(unsigned int &) = Load : &:r189_4, m184_11 +# 189| r189_5(unsigned int &) = Load[b] : &:r189_4, m184_11 # 189| r189_6(glval) = CopyValue : r189_5 # 190| r190_1(glval) = VariableAddress[c] : -# 190| r190_2(unsigned int &) = Load : &:r190_1, m184_16 -# 190| r190_3(unsigned int) = Load : &:r190_2, ~m184_18 +# 190| r190_2(unsigned int &) = Load[c] : &:r190_1, m184_16 +# 190| r190_3(unsigned int) = Load[?] : &:r190_2, ~m184_18 # 190| r190_4(glval) = VariableAddress[d] : -# 190| r190_5(unsigned int &) = Load : &:r190_4, m184_20 -# 190| r190_6(unsigned int) = Load : &:r190_5, ~m184_22 +# 190| r190_5(unsigned int &) = Load[d] : &:r190_4, m184_20 +# 190| r190_6(unsigned int) = Load[?] : &:r190_5, ~m184_22 # 186| m186_1(unknown) = InlineAsm : ~m184_14, 0:r189_3, 1:r189_6, 2:r190_3, 3:r190_6 # 186| m186_2(unknown) = Chi : total:m184_14, partial:m186_1 # 192| v192_1(void) = NoOp : @@ -832,48 +832,48 @@ ssa.cpp: # 198| m198_4(unknown) = Chi : total:m198_2, partial:m198_3 # 198| r198_5(glval) = VariableAddress[str1] : # 198| m198_6(char *) = InitializeParameter[str1] : &:r198_5 -# 198| r198_7(char *) = Load : &:r198_5, m198_6 +# 198| r198_7(char *) = Load[str1] : &:r198_5, m198_6 # 198| m198_8(unknown) = InitializeIndirection[str1] : &:r198_7 # 198| r198_9(glval) = VariableAddress[str2] : # 198| m198_10(char *) = InitializeParameter[str2] : &:r198_9 -# 198| r198_11(char *) = Load : &:r198_9, m198_10 +# 198| r198_11(char *) = Load[str2] : &:r198_9, m198_10 # 198| m198_12(unknown) = InitializeIndirection[str2] : &:r198_11 # 198| r198_13(glval) = VariableAddress[x] : # 198| m198_14(int) = InitializeParameter[x] : &:r198_13 # 199| r199_1(glval) = VariableAddress[ret] : # 199| r199_2(glval) = FunctionAddress[strcmp] : # 199| r199_3(glval) = VariableAddress[str1] : -# 199| r199_4(char *) = Load : &:r199_3, m198_6 +# 199| r199_4(char *) = Load[str1] : &:r199_3, m198_6 # 199| r199_5(char *) = Convert : r199_4 # 199| r199_6(glval) = VariableAddress[str2] : -# 199| r199_7(char *) = Load : &:r199_6, m198_10 +# 199| r199_7(char *) = Load[str2] : &:r199_6, m198_10 # 199| r199_8(char *) = Convert : r199_7 # 199| r199_9(int) = Call[strcmp] : func:r199_2, 0:r199_5, 1:r199_8 # 199| v199_10(void) = ^BufferReadSideEffect[0] : &:r199_5, ~m198_8 # 199| v199_11(void) = ^BufferReadSideEffect[1] : &:r199_8, ~m198_12 -# 199| m199_12(int) = Store : &:r199_1, r199_9 +# 199| m199_12(int) = Store[ret] : &:r199_1, r199_9 # 200| r200_1(glval) = FunctionAddress[strlen] : # 200| r200_2(glval) = VariableAddress[str1] : -# 200| r200_3(char *) = Load : &:r200_2, m198_6 +# 200| r200_3(char *) = Load[str1] : &:r200_2, m198_6 # 200| r200_4(char *) = Convert : r200_3 # 200| r200_5(int) = Call[strlen] : func:r200_1, 0:r200_4 # 200| v200_6(void) = ^BufferReadSideEffect[0] : &:r200_4, ~m198_8 # 200| r200_7(glval) = VariableAddress[ret] : -# 200| r200_8(int) = Load : &:r200_7, m199_12 +# 200| r200_8(int) = Load[ret] : &:r200_7, m199_12 # 200| r200_9(int) = Add : r200_8, r200_5 -# 200| m200_10(int) = Store : &:r200_7, r200_9 +# 200| m200_10(int) = Store[ret] : &:r200_7, r200_9 # 201| r201_1(glval) = FunctionAddress[abs] : # 201| r201_2(glval) = VariableAddress[x] : -# 201| r201_3(int) = Load : &:r201_2, m198_14 +# 201| r201_3(int) = Load[x] : &:r201_2, m198_14 # 201| r201_4(int) = Call[abs] : func:r201_1, 0:r201_3 # 201| r201_5(glval) = VariableAddress[ret] : -# 201| r201_6(int) = Load : &:r201_5, m200_10 +# 201| r201_6(int) = Load[ret] : &:r201_5, m200_10 # 201| r201_7(int) = Add : r201_6, r201_4 -# 201| m201_8(int) = Store : &:r201_5, r201_7 +# 201| m201_8(int) = Store[ret] : &:r201_5, r201_7 # 202| r202_1(glval) = VariableAddress[#return] : # 202| r202_2(glval) = VariableAddress[ret] : -# 202| r202_3(int) = Load : &:r202_2, m201_8 -# 202| m202_4(int) = Store : &:r202_1, r202_3 +# 202| r202_3(int) = Load[ret] : &:r202_2, m201_8 +# 202| m202_4(int) = Store[#return] : &:r202_1, r202_3 # 198| v198_15(void) = ReturnIndirection[str1] : &:r198_7, m198_8 # 198| v198_16(void) = ReturnIndirection[str2] : &:r198_11, m198_12 # 198| r198_17(glval) = VariableAddress[#return] : @@ -907,8 +907,8 @@ ssa.cpp: # 209| m209_12(unknown) = Chi : total:m208_3, partial:m209_11 # 210| r210_1(glval) = VariableAddress[#return] : # 210| r210_2(glval) = VariableAddress[y] : -# 210| r210_3(int) = Load : &:r210_2, ~m209_12 -# 210| m210_4(int) = Store : &:r210_1, r210_3 +# 210| r210_3(int) = Load[y] : &:r210_2, ~m209_12 +# 210| m210_4(int) = Store[#return] : &:r210_1, r210_3 # 207| r207_8(glval) = VariableAddress[#return] : # 207| v207_9(void) = ReturnValue : &:r207_8, m210_4 # 207| v207_10(void) = AliasedUse : m207_3 @@ -922,16 +922,16 @@ ssa.cpp: # 213| m213_4(unknown) = Chi : total:m213_2, partial:m213_3 # 214| r214_1(glval) = VariableAddress[a_pad] : # 214| r214_2(glval) = StringConstant[""] : -# 214| r214_3(char[32]) = Load : &:r214_2, ~m213_3 -# 214| m214_4(char[32]) = Store : &:r214_1, r214_3 +# 214| r214_3(char[32]) = Load[?] : &:r214_2, ~m213_3 +# 214| m214_4(char[32]) = Store[a_pad] : &:r214_1, r214_3 # 215| r215_1(glval) = VariableAddress[a_nopad] : # 215| r215_2(glval) = StringConstant["foo"] : -# 215| r215_3(char[4]) = Load : &:r215_2, ~m213_3 -# 215| m215_4(char[4]) = Store : &:r215_1, r215_3 +# 215| r215_3(char[4]) = Load[?] : &:r215_2, ~m213_3 +# 215| m215_4(char[4]) = Store[a_nopad] : &:r215_1, r215_3 # 216| r216_1(glval) = VariableAddress[a_infer] : # 216| r216_2(glval) = StringConstant["blah"] : -# 216| r216_3(char[5]) = Load : &:r216_2, ~m213_3 -# 216| m216_4(char[5]) = Store : &:r216_1, r216_3 +# 216| r216_3(char[5]) = Load[?] : &:r216_2, ~m213_3 +# 216| m216_4(char[5]) = Store[a_infer] : &:r216_1, r216_3 # 217| r217_1(glval) = VariableAddress[b] : # 217| m217_2(char[2]) = Uninitialized[b] : &:r217_1 # 218| r218_1(glval) = VariableAddress[c] : @@ -939,42 +939,42 @@ ssa.cpp: # 218| r218_3(int) = Constant[0] : # 218| r218_4(glval) = PointerAdd[1] : r218_1, r218_3 # 218| r218_5(unknown[2]) = Constant[0] : -# 218| m218_6(unknown[2]) = Store : &:r218_4, r218_5 +# 218| m218_6(unknown[2]) = Store[?] : &:r218_4, r218_5 # 219| r219_1(glval) = VariableAddress[d] : # 219| m219_2(char[2]) = Uninitialized[d] : &:r219_1 # 219| r219_3(int) = Constant[0] : # 219| r219_4(glval) = PointerAdd[1] : r219_1, r219_3 # 219| r219_5(char) = Constant[0] : -# 219| m219_6(char) = Store : &:r219_4, r219_5 +# 219| m219_6(char) = Store[?] : &:r219_4, r219_5 # 219| m219_7(char[2]) = Chi : total:m219_2, partial:m219_6 # 219| r219_8(int) = Constant[1] : # 219| r219_9(glval) = PointerAdd[1] : r219_1, r219_8 # 219| r219_10(char) = Constant[0] : -# 219| m219_11(char) = Store : &:r219_9, r219_10 +# 219| m219_11(char) = Store[?] : &:r219_9, r219_10 # 219| m219_12(char[2]) = Chi : total:m219_7, partial:m219_11 # 220| r220_1(glval) = VariableAddress[e] : # 220| m220_2(char[2]) = Uninitialized[e] : &:r220_1 # 220| r220_3(int) = Constant[0] : # 220| r220_4(glval) = PointerAdd[1] : r220_1, r220_3 # 220| r220_5(char) = Constant[0] : -# 220| m220_6(char) = Store : &:r220_4, r220_5 +# 220| m220_6(char) = Store[?] : &:r220_4, r220_5 # 220| m220_7(char[2]) = Chi : total:m220_2, partial:m220_6 # 220| r220_8(int) = Constant[1] : # 220| r220_9(glval) = PointerAdd[1] : r220_1, r220_8 # 220| r220_10(char) = Constant[1] : -# 220| m220_11(char) = Store : &:r220_9, r220_10 +# 220| m220_11(char) = Store[?] : &:r220_9, r220_10 # 220| m220_12(char[2]) = Chi : total:m220_7, partial:m220_11 # 221| r221_1(glval) = VariableAddress[f] : # 221| m221_2(char[3]) = Uninitialized[f] : &:r221_1 # 221| r221_3(int) = Constant[0] : # 221| r221_4(glval) = PointerAdd[1] : r221_1, r221_3 # 221| r221_5(char) = Constant[0] : -# 221| m221_6(char) = Store : &:r221_4, r221_5 +# 221| m221_6(char) = Store[?] : &:r221_4, r221_5 # 221| m221_7(char[3]) = Chi : total:m221_2, partial:m221_6 # 221| r221_8(int) = Constant[1] : # 221| r221_9(glval) = PointerAdd[1] : r221_1, r221_8 # 221| r221_10(unknown[2]) = Constant[0] : -# 221| m221_11(unknown[2]) = Store : &:r221_9, r221_10 +# 221| m221_11(unknown[2]) = Store[?] : &:r221_9, r221_10 # 221| m221_12(char[3]) = Chi : total:m221_7, partial:m221_11 # 222| v222_1(void) = NoOp : # 213| v213_5(void) = ReturnVoid : @@ -994,14 +994,14 @@ ssa.cpp: # 229| r229_1(glval) = VariableAddress[s] : # 229| r229_2(glval) = StringConstant["Literal"] : # 229| r229_3(char *) = Convert : r229_2 -# 229| m229_4(char *) = Store : &:r229_1, r229_3 +# 229| m229_4(char *) = Store[s] : &:r229_1, r229_3 # 230| r230_1(glval) = VariableAddress[#return] : # 230| r230_2(glval) = VariableAddress[s] : -# 230| r230_3(char *) = Load : &:r230_2, m229_4 +# 230| r230_3(char *) = Load[s] : &:r230_2, m229_4 # 230| r230_4(int) = Constant[2] : # 230| r230_5(glval) = PointerAdd[1] : r230_3, r230_4 -# 230| r230_6(char) = Load : &:r230_5, ~m226_3 -# 230| m230_7(char) = Store : &:r230_1, r230_6 +# 230| r230_6(char) = Load[?] : &:r230_5, ~m226_3 +# 230| m230_7(char) = Store[#return] : &:r230_1, r230_6 # 226| r226_5(glval) = VariableAddress[#return] : # 226| v226_6(void) = ReturnValue : &:r226_5, m230_7 # 226| v226_7(void) = AliasedUse : ~m227_4 @@ -1015,7 +1015,7 @@ ssa.cpp: # 235| m235_4(unknown) = Chi : total:m235_2, partial:m235_3 # 235| r235_5(glval) = VariableAddress[#this] : # 235| m235_6(glval) = InitializeParameter[#this] : &:r235_5 -# 235| r235_7(glval) = Load : &:r235_5, m235_6 +# 235| r235_7(glval) = Load[#this] : &:r235_5, m235_6 # 235| m235_8(Constructible) = InitializeIndirection[#this] : &:r235_7 # 235| r235_9(glval) = VariableAddress[x] : # 235| m235_10(int) = InitializeParameter[x] : &:r235_9 @@ -1033,7 +1033,7 @@ ssa.cpp: # 236| m236_4(unknown) = Chi : total:m236_2, partial:m236_3 # 236| r236_5(glval) = VariableAddress[#this] : # 236| m236_6(glval) = InitializeParameter[#this] : &:r236_5 -# 236| r236_7(glval) = Load : &:r236_5, m236_6 +# 236| r236_7(glval) = Load[#this] : &:r236_5, m236_6 # 236| m236_8(Constructible) = InitializeIndirection[#this] : &:r236_7 # 236| v236_9(void) = NoOp : # 236| v236_10(void) = ReturnIndirection[#this] : &:r236_7, m236_8 @@ -1102,7 +1102,7 @@ ssa.cpp: # 247| m247_4(unknown) = Chi : total:m247_2, partial:m247_3 # 247| r247_5(glval) = VariableAddress[src] : # 247| m247_6(char *) = InitializeParameter[src] : &:r247_5 -# 247| r247_7(char *) = Load : &:r247_5, m247_6 +# 247| r247_7(char *) = Load[src] : &:r247_5, m247_6 # 247| m247_8(unknown) = InitializeIndirection[src] : &:r247_7 # 247| m247_9(unknown) = Chi : total:m247_4, partial:m247_8 # 247| r247_10(glval) = VariableAddress[size] : @@ -1110,7 +1110,7 @@ ssa.cpp: # 248| r248_1(glval) = VariableAddress[dst] : # 248| r248_2(glval) = FunctionAddress[operator new[]] : # 248| r248_3(glval) = VariableAddress[size] : -# 248| r248_4(int) = Load : &:r248_3, m247_11 +# 248| r248_4(int) = Load[size] : &:r248_3, m247_11 # 248| r248_5(unsigned long) = Convert : r248_4 # 248| r248_6(unsigned long) = Constant[1] : # 248| r248_7(unsigned long) = Mul : r248_5, r248_6 @@ -1120,30 +1120,30 @@ ssa.cpp: # 248| m248_11(unknown) = ^InitializeDynamicAllocation : &:r248_8 # 248| m248_12(unknown) = Chi : total:m248_10, partial:m248_11 # 248| r248_13(char *) = Convert : r248_8 -# 248| m248_14(char *) = Store : &:r248_1, r248_13 +# 248| m248_14(char *) = Store[dst] : &:r248_1, r248_13 # 249| r249_1(char) = Constant[97] : # 249| r249_2(glval) = VariableAddress[src] : -# 249| r249_3(char *) = Load : &:r249_2, m247_6 +# 249| r249_3(char *) = Load[src] : &:r249_2, m247_6 # 249| r249_4(glval) = CopyValue : r249_3 -# 249| m249_5(char) = Store : &:r249_4, r249_1 +# 249| m249_5(char) = Store[?] : &:r249_4, r249_1 # 249| m249_6(unknown) = Chi : total:m248_12, partial:m249_5 # 250| r250_1(glval) = FunctionAddress[memcpy] : # 250| r250_2(glval) = VariableAddress[dst] : -# 250| r250_3(char *) = Load : &:r250_2, m248_14 +# 250| r250_3(char *) = Load[dst] : &:r250_2, m248_14 # 250| r250_4(void *) = Convert : r250_3 # 250| r250_5(glval) = VariableAddress[src] : -# 250| r250_6(char *) = Load : &:r250_5, m247_6 +# 250| r250_6(char *) = Load[src] : &:r250_5, m247_6 # 250| r250_7(void *) = Convert : r250_6 # 250| r250_8(glval) = VariableAddress[size] : -# 250| r250_9(int) = Load : &:r250_8, m247_11 +# 250| r250_9(int) = Load[size] : &:r250_8, m247_11 # 250| r250_10(void *) = Call[memcpy] : func:r250_1, 0:r250_4, 1:r250_7, 2:r250_9 # 250| v250_11(void) = ^SizedBufferReadSideEffect[1] : &:r250_7, r250_9, ~m249_6 # 250| m250_12(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r250_4, r250_9 # 250| m250_13(unknown) = Chi : total:m249_6, partial:m250_12 # 251| r251_1(glval) = VariableAddress[#return] : # 251| r251_2(glval) = VariableAddress[dst] : -# 251| r251_3(char *) = Load : &:r251_2, m248_14 -# 251| m251_4(char *) = Store : &:r251_1, r251_3 +# 251| r251_3(char *) = Load[dst] : &:r251_2, m248_14 +# 251| m251_4(char *) = Store[#return] : &:r251_1, r251_3 # 247| v247_12(void) = ReturnIndirection[src] : &:r247_7, ~m250_13 # 247| r247_13(glval) = VariableAddress[#return] : # 247| v247_14(void) = ReturnValue : &:r247_13, m251_4 @@ -1159,7 +1159,7 @@ ssa.cpp: # 254| r254_5(glval) = VariableAddress[b] : # 254| m254_6(bool) = InitializeParameter[b] : &:r254_5 # 255| r255_1(glval) = VariableAddress[b] : -# 255| r255_2(bool) = Load : &:r255_1, m254_6 +# 255| r255_2(bool) = Load[b] : &:r255_1, m254_6 # 255| v255_3(void) = ConditionalBranch : r255_2 #-----| False -> Block 2 #-----| True -> Block 1 @@ -1183,14 +1183,14 @@ ssa.cpp: # 262| r262_2(glval) = VariableAddress[s] : # 262| r262_3(glval) = StringConstant["Literal"] : # 262| r262_4(char *) = Convert : r262_3 -# 262| m262_5(char *) = Store : &:r262_2, r262_4 +# 262| m262_5(char *) = Store[s] : &:r262_2, r262_4 # 263| r263_1(glval) = VariableAddress[#return] : # 263| r263_2(glval) = VariableAddress[s] : -# 263| r263_3(char *) = Load : &:r263_2, m262_5 +# 263| r263_3(char *) = Load[s] : &:r263_2, m262_5 # 263| r263_4(int) = Constant[2] : # 263| r263_5(glval) = PointerAdd[1] : r263_3, r263_4 -# 263| r263_6(char) = Load : &:r263_5, ~m254_3 -# 263| m263_7(char) = Store : &:r263_1, r263_6 +# 263| r263_6(char) = Load[?] : &:r263_5, ~m254_3 +# 263| m263_7(char) = Store[#return] : &:r263_1, r263_6 # 254| r254_7(glval) = VariableAddress[#return] : # 254| v254_8(void) = ReturnValue : &:r254_7, m263_7 # 254| v254_9(void) = AliasedUse : ~m262_1 @@ -1204,7 +1204,7 @@ ssa.cpp: # 268| m268_4(unknown) = Chi : total:m268_2, partial:m268_3 # 268| r268_5(glval) = VariableAddress[s] : # 268| m268_6(void *) = InitializeParameter[s] : &:r268_5 -# 268| r268_7(void *) = Load : &:r268_5, m268_6 +# 268| r268_7(void *) = Load[s] : &:r268_5, m268_6 # 268| m268_8(unknown) = InitializeIndirection[s] : &:r268_7 # 268| m268_9(unknown) = Chi : total:m268_4, partial:m268_8 # 268| r268_10(glval) = VariableAddress[size] : @@ -1212,28 +1212,28 @@ ssa.cpp: # 269| r269_1(glval) = VariableAddress[buf] : # 269| r269_2(glval) = FunctionAddress[malloc] : # 269| r269_3(glval) = VariableAddress[size] : -# 269| r269_4(int) = Load : &:r269_3, m268_11 +# 269| r269_4(int) = Load[size] : &:r269_3, m268_11 # 269| r269_5(void *) = Call[malloc] : func:r269_2, 0:r269_4 # 269| m269_6(unknown) = ^CallSideEffect : ~m268_9 # 269| m269_7(unknown) = Chi : total:m268_9, partial:m269_6 # 269| m269_8(unknown) = ^InitializeDynamicAllocation : &:r269_5 # 269| m269_9(unknown) = Chi : total:m269_7, partial:m269_8 -# 269| m269_10(void *) = Store : &:r269_1, r269_5 +# 269| m269_10(void *) = Store[buf] : &:r269_1, r269_5 # 270| r270_1(glval) = FunctionAddress[memcpy] : # 270| r270_2(glval) = VariableAddress[buf] : -# 270| r270_3(void *) = Load : &:r270_2, m269_10 +# 270| r270_3(void *) = Load[buf] : &:r270_2, m269_10 # 270| r270_4(glval) = VariableAddress[s] : -# 270| r270_5(void *) = Load : &:r270_4, m268_6 +# 270| r270_5(void *) = Load[s] : &:r270_4, m268_6 # 270| r270_6(glval) = VariableAddress[size] : -# 270| r270_7(int) = Load : &:r270_6, m268_11 +# 270| r270_7(int) = Load[size] : &:r270_6, m268_11 # 270| r270_8(void *) = Call[memcpy] : func:r270_1, 0:r270_3, 1:r270_5, 2:r270_7 # 270| v270_9(void) = ^SizedBufferReadSideEffect[1] : &:r270_5, r270_7, ~m269_7 # 270| m270_10(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r270_3, r270_7 # 270| m270_11(unknown) = Chi : total:m269_9, partial:m270_10 # 271| r271_1(glval) = VariableAddress[#return] : # 271| r271_2(glval) = VariableAddress[buf] : -# 271| r271_3(void *) = Load : &:r271_2, m269_10 -# 271| m271_4(void *) = Store : &:r271_1, r271_3 +# 271| r271_3(void *) = Load[buf] : &:r271_2, m269_10 +# 271| m271_4(void *) = Store[#return] : &:r271_1, r271_3 # 268| v268_12(void) = ReturnIndirection[s] : &:r268_7, ~m270_11 # 268| r268_13(glval) = VariableAddress[#return] : # 268| v268_14(void) = ReturnValue : &:r268_13, m271_4 @@ -1257,29 +1257,29 @@ ssa.cpp: # 276| m276_3(unknown) = Chi : total:m275_4, partial:m276_2 # 276| r276_4(glval) = FieldAddress[x] : r276_1 # 276| r276_5(int) = Constant[0] : -# 276| m276_6(int) = Store : &:r276_4, r276_5 +# 276| m276_6(int) = Store[?] : &:r276_4, r276_5 # 276| m276_7(unknown) = Chi : total:m276_3, partial:m276_6 # 276| r276_8(glval) = FieldAddress[y] : r276_1 # 276| r276_9(int) = Constant[0] : -# 276| m276_10(int) = Store : &:r276_8, r276_9 +# 276| m276_10(int) = Store[?] : &:r276_8, r276_9 # 276| m276_11(unknown) = Chi : total:m276_7, partial:m276_10 # 277| r277_1(glval) = VariableAddress[a] : # 277| r277_2(Point *) = CopyValue : r277_1 # 277| r277_3(glval) = VariableAddress[pp] : -# 277| m277_4(Point *) = Store : &:r277_3, r277_2 +# 277| m277_4(Point *) = Store[pp] : &:r277_3, r277_2 # 277| m277_5(unknown) = Chi : total:m276_11, partial:m277_4 # 278| r278_1(glval) = VariableAddress[c] : -# 278| r278_2(bool) = Load : &:r278_1, m275_6 +# 278| r278_2(bool) = Load[c] : &:r278_1, m275_6 # 278| v278_3(void) = ConditionalBranch : r278_2 #-----| False -> Block 2 #-----| True -> Block 1 # 279| Block 1 # 279| r279_1(glval) = VariableAddress[x1] : -# 279| r279_2(int) = Load : &:r279_1, m275_10 +# 279| r279_2(int) = Load[x1] : &:r279_1, m275_10 # 279| r279_3(glval) = VariableAddress[a] : # 279| r279_4(glval) = FieldAddress[x] : r279_3 -# 279| m279_5(int) = Store : &:r279_4, r279_2 +# 279| m279_5(int) = Store[?] : &:r279_4, r279_2 # 279| m279_6(unknown) = Chi : total:m277_5, partial:m279_5 #-----| Goto -> Block 2 @@ -1289,8 +1289,8 @@ ssa.cpp: # 281| r281_3(glval) = VariableAddress[x] : # 281| r281_4(glval) = VariableAddress[a] : # 281| r281_5(glval) = FieldAddress[x] : r281_4 -# 281| r281_6(int) = Load : &:r281_5, m281_1 -# 281| m281_7(int) = Store : &:r281_3, r281_6 +# 281| r281_6(int) = Load[?] : &:r281_5, m281_1 +# 281| m281_7(int) = Store[x] : &:r281_3, r281_6 # 282| v282_1(void) = NoOp : # 275| v275_11(void) = ReturnVoid : # 275| v275_12(void) = AliasedUse : ~m281_2 @@ -1304,7 +1304,7 @@ ssa.cpp: # 286| m286_4(unknown) = Chi : total:m286_2, partial:m286_3 # 286| r286_5(glval) = VariableAddress[#this] : # 286| m286_6(glval) = InitializeParameter[#this] : &:r286_5 -# 286| r286_7(glval) = Load : &:r286_5, m286_6 +# 286| r286_7(glval) = Load[#this] : &:r286_5, m286_6 # 286| m286_8(A) = InitializeIndirection[#this] : &:r286_7 # 286| r286_9(glval) = VariableAddress[x] : # 286| m286_10(int) = InitializeParameter[x] : &:r286_9 @@ -1322,11 +1322,11 @@ ssa.cpp: # 287| m287_4(unknown) = Chi : total:m287_2, partial:m287_3 # 287| r287_5(glval) = VariableAddress[#this] : # 287| m287_6(glval) = InitializeParameter[#this] : &:r287_5 -# 287| r287_7(glval) = Load : &:r287_5, m287_6 +# 287| r287_7(glval) = Load[#this] : &:r287_5, m287_6 # 287| m287_8(A) = InitializeIndirection[#this] : &:r287_7 # 287| r287_9(glval) = VariableAddress[p#0] : # 287| m287_10(A *) = InitializeParameter[p#0] : &:r287_9 -# 287| r287_11(A *) = Load : &:r287_9, m287_10 +# 287| r287_11(A *) = Load[p#0] : &:r287_9, m287_10 # 287| m287_12(unknown) = InitializeIndirection[p#0] : &:r287_11 # 287| v287_13(void) = NoOp : # 287| v287_14(void) = ReturnIndirection[#this] : &:r287_7, m287_8 @@ -1343,7 +1343,7 @@ ssa.cpp: # 288| m288_4(unknown) = Chi : total:m288_2, partial:m288_3 # 288| r288_5(glval) = VariableAddress[#this] : # 288| m288_6(glval) = InitializeParameter[#this] : &:r288_5 -# 288| r288_7(glval) = Load : &:r288_5, m288_6 +# 288| r288_7(glval) = Load[#this] : &:r288_5, m288_6 # 288| m288_8(A) = InitializeIndirection[#this] : &:r288_7 # 288| v288_9(void) = NoOp : # 288| v288_10(void) = ReturnIndirection[#this] : &:r288_7, m288_8 @@ -1367,7 +1367,7 @@ ssa.cpp: # 292| m292_6(unknown) = Chi : total:m291_4, partial:m292_5 # 292| m292_7(unknown) = ^InitializeDynamicAllocation : &:r292_4 # 292| r292_8(Point *) = Convert : r292_4 -# 292| m292_9(Point *) = Store : &:r292_1, r292_8 +# 292| m292_9(Point *) = Store[p] : &:r292_1, r292_8 # 293| r293_1(glval) = VariableAddress[q] : # 293| r293_2(glval) = FunctionAddress[operator new] : # 293| r293_3(unsigned long) = Constant[8] : @@ -1376,7 +1376,7 @@ ssa.cpp: # 293| m293_6(unknown) = Chi : total:m292_6, partial:m293_5 # 293| m293_7(unknown) = ^InitializeDynamicAllocation : &:r293_4 # 293| r293_8(Point *) = Convert : r293_4 -# 293| m293_9(Point *) = Store : &:r293_1, r293_8 +# 293| m293_9(Point *) = Store[q] : &:r293_1, r293_8 # 294| r294_1(glval) = VariableAddress[j] : # 294| r294_2(glval) = FunctionAddress[operator new] : # 294| r294_3(unsigned long) = Constant[4] : @@ -1395,7 +1395,7 @@ ssa.cpp: # 294| r294_16(A *) = Convert : r294_12 # 294| r294_17(glval) = FunctionAddress[A] : # 294| r294_18(glval) = VariableAddress[x] : -# 294| r294_19(int) = Load : &:r294_18, m291_6 +# 294| r294_19(int) = Load[x] : &:r294_18, m291_6 # 294| v294_20(void) = Call[A] : func:r294_17, this:r294_16, 0:r294_19 # 294| m294_21(unknown) = ^CallSideEffect : ~m294_14 # 294| m294_22(unknown) = Chi : total:m294_14, partial:m294_21 @@ -1410,8 +1410,8 @@ ssa.cpp: # 294| m294_31(unknown) = ^BufferMayWriteSideEffect[0] : &:r294_16 # 294| m294_32(unknown) = Chi : total:m294_24, partial:m294_31 # 294| r294_33(glval) = FieldAddress[i] : r294_8 -# 294| r294_34(int) = Load : &:r294_33, ~m294_29 -# 294| m294_35(int) = Store : &:r294_1, r294_34 +# 294| r294_34(int) = Load[?] : &:r294_33, ~m294_29 +# 294| m294_35(int) = Store[j] : &:r294_1, r294_34 # 295| r295_1(glval) = VariableAddress[a] : # 295| r295_2(glval) = FunctionAddress[operator new] : # 295| r295_3(unsigned long) = Constant[4] : @@ -1426,11 +1426,11 @@ ssa.cpp: # 295| m295_12(unknown) = Chi : total:m295_6, partial:m295_11 # 295| m295_13(A) = ^IndirectMayWriteSideEffect[-1] : &:r295_8 # 295| m295_14(unknown) = Chi : total:m295_7, partial:m295_13 -# 295| m295_15(A *) = Store : &:r295_1, r295_8 +# 295| m295_15(A *) = Store[a] : &:r295_1, r295_8 # 296| r296_1(glval) = VariableAddress[#return] : # 296| r296_2(glval) = VariableAddress[p] : -# 296| r296_3(Point *) = Load : &:r296_2, m292_9 -# 296| m296_4(Point *) = Store : &:r296_1, r296_3 +# 296| r296_3(Point *) = Load[p] : &:r296_2, m292_9 +# 296| m296_4(Point *) = Store[#return] : &:r296_1, r296_3 # 291| r291_7(glval) = VariableAddress[#return] : # 291| v291_8(void) = ReturnValue : &:r291_7, m296_4 # 291| v291_9(void) = AliasedUse : ~m295_12 @@ -1446,14 +1446,14 @@ ssa.cpp: # 301| m301_6(int) = InitializeParameter[argc] : &:r301_5 # 301| r301_7(glval) = VariableAddress[argv] : # 301| m301_8(char **) = InitializeParameter[argv] : &:r301_7 -# 301| r301_9(char **) = Load : &:r301_7, m301_8 +# 301| r301_9(char **) = Load[argv] : &:r301_7, m301_8 # 301| m301_10(unknown) = InitializeIndirection[argv] : &:r301_9 # 301| m301_11(unknown) = Chi : total:m301_4, partial:m301_10 # 302| r302_1(glval) = FunctionAddress[unknownFunction] : # 302| r302_2(glval) = VariableAddress[argc] : -# 302| r302_3(int) = Load : &:r302_2, m301_6 +# 302| r302_3(int) = Load[argc] : &:r302_2, m301_6 # 302| r302_4(glval) = VariableAddress[argv] : -# 302| r302_5(char **) = Load : &:r302_4, m301_8 +# 302| r302_5(char **) = Load[argv] : &:r302_4, m301_8 # 302| v302_6(void) = Call[unknownFunction] : func:r302_1, 0:r302_3, 1:r302_5 # 302| m302_7(unknown) = ^CallSideEffect : ~m301_11 # 302| m302_8(unknown) = Chi : total:m301_11, partial:m302_7 @@ -1462,9 +1462,9 @@ ssa.cpp: # 302| m302_11(unknown) = Chi : total:m302_8, partial:m302_10 # 303| r303_1(glval) = FunctionAddress[unknownFunction] : # 303| r303_2(glval) = VariableAddress[argc] : -# 303| r303_3(int) = Load : &:r303_2, m301_6 +# 303| r303_3(int) = Load[argc] : &:r303_2, m301_6 # 303| r303_4(glval) = VariableAddress[argv] : -# 303| r303_5(char **) = Load : &:r303_4, m301_8 +# 303| r303_5(char **) = Load[argv] : &:r303_4, m301_8 # 303| v303_6(void) = Call[unknownFunction] : func:r303_1, 0:r303_3, 1:r303_5 # 303| m303_7(unknown) = ^CallSideEffect : ~m302_11 # 303| m303_8(unknown) = Chi : total:m302_11, partial:m303_7 @@ -1473,11 +1473,11 @@ ssa.cpp: # 303| m303_11(unknown) = Chi : total:m303_8, partial:m303_10 # 304| r304_1(glval) = VariableAddress[#return] : # 304| r304_2(glval) = VariableAddress[argv] : -# 304| r304_3(char **) = Load : &:r304_2, m301_8 -# 304| r304_4(char *) = Load : &:r304_3, ~m303_11 -# 304| r304_5(char) = Load : &:r304_4, ~m303_11 +# 304| r304_3(char **) = Load[argv] : &:r304_2, m301_8 +# 304| r304_4(char *) = Load[?] : &:r304_3, ~m303_11 +# 304| r304_5(char) = Load[?] : &:r304_4, ~m303_11 # 304| r304_6(int) = Convert : r304_5 -# 304| m304_7(int) = Store : &:r304_1, r304_6 +# 304| m304_7(int) = Store[#return] : &:r304_1, r304_6 # 301| v301_12(void) = ReturnIndirection[argv] : &:r301_9, ~m303_11 # 301| r301_13(glval) = VariableAddress[#return] : # 301| v301_14(void) = ReturnValue : &:r301_13, m304_7 @@ -1492,16 +1492,16 @@ ssa.cpp: # 310| m310_4(unknown) = Chi : total:m310_2, partial:m310_3 # 310| r310_5(glval) = VariableAddress[#this] : # 310| m310_6(glval) = InitializeParameter[#this] : &:r310_5 -# 310| r310_7(glval) = Load : &:r310_5, m310_6 +# 310| r310_7(glval) = Load[#this] : &:r310_5, m310_6 # 310| m310_8(ThisAliasTest) = InitializeIndirection[#this] : &:r310_7 # 310| r310_9(glval) = VariableAddress[arg] : # 310| m310_10(int) = InitializeParameter[arg] : &:r310_9 # 311| r311_1(glval) = VariableAddress[arg] : -# 311| r311_2(int) = Load : &:r311_1, m310_10 +# 311| r311_2(int) = Load[arg] : &:r311_1, m310_10 # 311| r311_3(glval) = VariableAddress[#this] : -# 311| r311_4(ThisAliasTest *) = Load : &:r311_3, m310_6 +# 311| r311_4(ThisAliasTest *) = Load[#this] : &:r311_3, m310_6 # 311| r311_5(glval) = FieldAddress[x] : r311_4 -# 311| m311_6(int) = Store : &:r311_5, r311_2 +# 311| m311_6(int) = Store[?] : &:r311_5, r311_2 # 311| m311_7(unknown) = Chi : total:m310_8, partial:m311_6 # 312| v312_1(void) = NoOp : # 310| v310_11(void) = ReturnIndirection[#this] : &:r310_7, m311_7 diff --git a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir_unsound.expected b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir_unsound.expected index 0e486a792897..91b9d3b12235 100644 --- a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir_unsound.expected @@ -7,37 +7,37 @@ ssa.cpp: # 13| m13_4(unknown) = Chi : total:m13_2, partial:m13_3 # 13| r13_5(glval) = VariableAddress[p] : # 13| m13_6(Point *) = InitializeParameter[p] : &:r13_5 -# 13| r13_7(Point *) = Load : &:r13_5, m13_6 +# 13| r13_7(Point *) = Load[p] : &:r13_5, m13_6 # 13| m13_8(unknown) = InitializeIndirection[p] : &:r13_7 # 13| r13_9(glval) = VariableAddress[which1] : # 13| m13_10(bool) = InitializeParameter[which1] : &:r13_9 # 13| r13_11(glval) = VariableAddress[which2] : # 13| m13_12(bool) = InitializeParameter[which2] : &:r13_11 # 14| r14_1(glval) = VariableAddress[which1] : -# 14| r14_2(bool) = Load : &:r14_1, m13_10 +# 14| r14_2(bool) = Load[which1] : &:r14_1, m13_10 # 14| v14_3(void) = ConditionalBranch : r14_2 #-----| False -> Block 2 #-----| True -> Block 1 # 15| Block 1 # 15| r15_1(glval) = VariableAddress[p] : -# 15| r15_2(Point *) = Load : &:r15_1, m13_6 +# 15| r15_2(Point *) = Load[p] : &:r15_1, m13_6 # 15| r15_3(glval) = FieldAddress[x] : r15_2 -# 15| r15_4(int) = Load : &:r15_3, ~m13_8 +# 15| r15_4(int) = Load[?] : &:r15_3, ~m13_8 # 15| r15_5(int) = Constant[1] : # 15| r15_6(int) = Add : r15_4, r15_5 -# 15| m15_7(int) = Store : &:r15_3, r15_6 +# 15| m15_7(int) = Store[?] : &:r15_3, r15_6 # 15| m15_8(unknown) = Chi : total:m13_8, partial:m15_7 #-----| Goto -> Block 3 # 18| Block 2 # 18| r18_1(glval) = VariableAddress[p] : -# 18| r18_2(Point *) = Load : &:r18_1, m13_6 +# 18| r18_2(Point *) = Load[p] : &:r18_1, m13_6 # 18| r18_3(glval) = FieldAddress[y] : r18_2 -# 18| r18_4(int) = Load : &:r18_3, ~m13_8 +# 18| r18_4(int) = Load[?] : &:r18_3, ~m13_8 # 18| r18_5(int) = Constant[1] : # 18| r18_6(int) = Add : r18_4, r18_5 -# 18| m18_7(int) = Store : &:r18_3, r18_6 +# 18| m18_7(int) = Store[?] : &:r18_3, r18_6 # 18| m18_8(unknown) = Chi : total:m13_8, partial:m18_7 #-----| Goto -> Block 3 @@ -46,30 +46,30 @@ ssa.cpp: # 21| m21_2(int) = Phi : from 1:m15_7, from 2:~m13_8 # 21| m21_3(unknown) = Phi : from 1:m15_8, from 2:m18_8 # 21| r21_4(glval) = VariableAddress[which2] : -# 21| r21_5(bool) = Load : &:r21_4, m13_12 +# 21| r21_5(bool) = Load[which2] : &:r21_4, m13_12 # 21| v21_6(void) = ConditionalBranch : r21_5 #-----| False -> Block 5 #-----| True -> Block 4 # 22| Block 4 # 22| r22_1(glval) = VariableAddress[p] : -# 22| r22_2(Point *) = Load : &:r22_1, m13_6 +# 22| r22_2(Point *) = Load[p] : &:r22_1, m13_6 # 22| r22_3(glval) = FieldAddress[x] : r22_2 -# 22| r22_4(int) = Load : &:r22_3, m21_2 +# 22| r22_4(int) = Load[?] : &:r22_3, m21_2 # 22| r22_5(int) = Constant[1] : # 22| r22_6(int) = Add : r22_4, r22_5 -# 22| m22_7(int) = Store : &:r22_3, r22_6 +# 22| m22_7(int) = Store[?] : &:r22_3, r22_6 # 22| m22_8(unknown) = Chi : total:m21_3, partial:m22_7 #-----| Goto -> Block 6 # 25| Block 5 # 25| r25_1(glval) = VariableAddress[p] : -# 25| r25_2(Point *) = Load : &:r25_1, m13_6 +# 25| r25_2(Point *) = Load[p] : &:r25_1, m13_6 # 25| r25_3(glval) = FieldAddress[y] : r25_2 -# 25| r25_4(int) = Load : &:r25_3, m21_1 +# 25| r25_4(int) = Load[?] : &:r25_3, m21_1 # 25| r25_5(int) = Constant[1] : # 25| r25_6(int) = Add : r25_4, r25_5 -# 25| m25_7(int) = Store : &:r25_3, r25_6 +# 25| m25_7(int) = Store[?] : &:r25_3, r25_6 # 25| m25_8(unknown) = Chi : total:m21_3, partial:m25_7 #-----| Goto -> Block 6 @@ -79,15 +79,15 @@ ssa.cpp: # 28| m28_3(unknown) = Phi : from 4:m22_8, from 5:m25_8 # 28| r28_4(glval) = VariableAddress[#return] : # 28| r28_5(glval) = VariableAddress[p] : -# 28| r28_6(Point *) = Load : &:r28_5, m13_6 +# 28| r28_6(Point *) = Load[p] : &:r28_5, m13_6 # 28| r28_7(glval) = FieldAddress[x] : r28_6 -# 28| r28_8(int) = Load : &:r28_7, m28_2 +# 28| r28_8(int) = Load[?] : &:r28_7, m28_2 # 28| r28_9(glval) = VariableAddress[p] : -# 28| r28_10(Point *) = Load : &:r28_9, m13_6 +# 28| r28_10(Point *) = Load[p] : &:r28_9, m13_6 # 28| r28_11(glval) = FieldAddress[y] : r28_10 -# 28| r28_12(int) = Load : &:r28_11, m28_1 +# 28| r28_12(int) = Load[?] : &:r28_11, m28_1 # 28| r28_13(int) = Add : r28_8, r28_12 -# 28| m28_14(int) = Store : &:r28_4, r28_13 +# 28| m28_14(int) = Store[#return] : &:r28_4, r28_13 # 13| v13_13(void) = ReturnIndirection[p] : &:r13_7, m28_3 # 13| r13_14(glval) = VariableAddress[#return] : # 13| v13_15(void) = ReturnValue : &:r13_14, m28_14 @@ -104,7 +104,7 @@ ssa.cpp: # 34| v34_1(void) = NoOp : # 35| r35_1(glval) = VariableAddress[#return] : # 35| r35_2(int) = Constant[0] : -# 35| m35_3(int) = Store : &:r35_1, r35_2 +# 35| m35_3(int) = Store[#return] : &:r35_1, r35_2 # 31| r31_5(glval) = VariableAddress[#return] : # 31| v31_6(void) = ReturnValue : &:r31_5, m35_3 # 31| v31_7(void) = AliasedUse : m31_3 @@ -120,12 +120,12 @@ ssa.cpp: # 38| m38_6(bool) = InitializeParameter[b] : &:r38_5 # 39| r39_1(glval) = VariableAddress[x] : # 39| r39_2(int) = Constant[5] : -# 39| m39_3(int) = Store : &:r39_1, r39_2 +# 39| m39_3(int) = Store[x] : &:r39_1, r39_2 # 40| r40_1(glval) = VariableAddress[y] : # 40| r40_2(int) = Constant[10] : -# 40| m40_3(int) = Store : &:r40_1, r40_2 +# 40| m40_3(int) = Store[y] : &:r40_1, r40_2 # 41| r41_1(glval) = VariableAddress[b] : -# 41| r41_2(bool) = Load : &:r41_1, m38_6 +# 41| r41_2(bool) = Load[b] : &:r41_1, m38_6 # 41| v41_3(void) = ConditionalBranch : r41_2 #-----| False -> Block 4 #-----| True -> Block 2 @@ -139,9 +139,9 @@ ssa.cpp: # 42| Block 2 # 42| r42_1(glval) = VariableAddress[x] : -# 42| r42_2(int) = Load : &:r42_1, m39_3 +# 42| r42_2(int) = Load[x] : &:r42_1, m39_3 # 42| r42_3(glval) = VariableAddress[y] : -# 42| r42_4(int) = Load : &:r42_3, m40_3 +# 42| r42_4(int) = Load[y] : &:r42_3, m40_3 # 42| r42_5(bool) = CompareEQ : r42_2, r42_4 # 42| v42_6(void) = ConditionalBranch : r42_5 #-----| False -> Block 3 @@ -150,14 +150,14 @@ ssa.cpp: # 46| Block 3 # 46| r46_1(glval) = VariableAddress[#return] : # 46| r46_2(int) = Constant[0] : -# 46| m46_3(int) = Store : &:r46_1, r46_2 +# 46| m46_3(int) = Store[#return] : &:r46_1, r46_2 #-----| Goto -> Block 1 # 50| Block 4 # 50| r50_1(glval) = VariableAddress[x] : -# 50| r50_2(int) = Load : &:r50_1, m39_3 +# 50| r50_2(int) = Load[x] : &:r50_1, m39_3 # 50| r50_3(glval) = VariableAddress[y] : -# 50| r50_4(int) = Load : &:r50_3, m40_3 +# 50| r50_4(int) = Load[y] : &:r50_3, m40_3 # 50| r50_5(bool) = CompareLT : r50_2, r50_4 # 50| v50_6(void) = ConditionalBranch : r50_5 #-----| False -> Block 6 @@ -166,7 +166,7 @@ ssa.cpp: # 51| Block 5 # 51| r51_1(glval) = VariableAddress[#return] : # 51| r51_2(int) = Constant[0] : -# 51| m51_3(int) = Store : &:r51_1, r51_2 +# 51| m51_3(int) = Store[#return] : &:r51_1, r51_2 #-----| Goto -> Block 1 # 38| Block 6 @@ -180,12 +180,12 @@ ssa.cpp: # 59| m59_4(unknown) = Chi : total:m59_2, partial:m59_3 # 60| r60_1(glval) = VariableAddress[i] : # 60| r60_2(int) = Constant[0] : -# 60| m60_3(int) = Store : &:r60_1, r60_2 +# 60| m60_3(int) = Store[i] : &:r60_1, r60_2 # 62| r62_1(glval) = VariableAddress[i] : -# 62| r62_2(int) = Load : &:r62_1, m60_3 +# 62| r62_2(int) = Load[i] : &:r62_1, m60_3 # 62| r62_3(int) = Constant[1] : # 62| r62_4(int) = Add : r62_2, r62_3 -# 62| m62_5(int) = Store : &:r62_1, r62_4 +# 62| m62_5(int) = Store[i] : &:r62_1, r62_4 # 63| r63_1(bool) = Constant[0] : # 63| v63_2(void) = ConditionalBranch : r63_1 #-----| False -> Block 1 @@ -194,8 +194,8 @@ ssa.cpp: # 65| Block 1 # 65| r65_1(glval) = VariableAddress[#return] : # 65| r65_2(glval) = VariableAddress[i] : -# 65| r65_3(int) = Load : &:r65_2, m62_5 -# 65| m65_4(int) = Store : &:r65_1, r65_3 +# 65| r65_3(int) = Load[i] : &:r65_2, m62_5 +# 65| m65_4(int) = Store[#return] : &:r65_1, r65_3 # 59| r59_5(glval) = VariableAddress[#return] : # 59| v59_6(void) = ReturnValue : &:r59_5, m65_4 # 59| v59_7(void) = AliasedUse : m59_3 @@ -214,7 +214,7 @@ ssa.cpp: # 68| m68_6(int) = InitializeParameter[n] : &:r68_5 # 68| r68_7(glval) = VariableAddress[p] : # 68| m68_8(char *) = InitializeParameter[p] : &:r68_7 -# 68| r68_9(char *) = Load : &:r68_7, m68_8 +# 68| r68_9(char *) = Load[p] : &:r68_7, m68_8 # 68| m68_10(unknown) = InitializeIndirection[p] : &:r68_9 #-----| Goto -> Block 1 @@ -223,10 +223,10 @@ ssa.cpp: # 69| m69_2(int) = Phi : from 0:m68_6, from 2:m69_8 # 69| m69_3(unknown) = Phi : from 0:~m68_4, from 2:~m70_10 # 69| r69_4(glval) = VariableAddress[n] : -# 69| r69_5(int) = Load : &:r69_4, m69_2 +# 69| r69_5(int) = Load[n] : &:r69_4, m69_2 # 69| r69_6(int) = Constant[1] : # 69| r69_7(int) = Sub : r69_5, r69_6 -# 69| m69_8(int) = Store : &:r69_4, r69_7 +# 69| m69_8(int) = Store[n] : &:r69_4, r69_7 # 69| r69_9(int) = CopyValue : r69_5 # 69| r69_10(int) = Constant[0] : # 69| r69_11(bool) = CompareGT : r69_9, r69_10 @@ -237,13 +237,13 @@ ssa.cpp: # 70| Block 2 # 70| r70_1(char) = Constant[0] : # 70| r70_2(glval) = VariableAddress[p] : -# 70| r70_3(char *) = Load : &:r70_2, m69_1 +# 70| r70_3(char *) = Load[p] : &:r70_2, m69_1 # 70| r70_4(int) = Constant[1] : # 70| r70_5(char *) = PointerAdd[1] : r70_3, r70_4 -# 70| m70_6(char *) = Store : &:r70_2, r70_5 +# 70| m70_6(char *) = Store[p] : &:r70_2, r70_5 # 70| r70_7(char *) = CopyValue : r70_3 # 70| r70_8(glval) = CopyValue : r70_7 -# 70| m70_9(char) = Store : &:r70_8, r70_1 +# 70| m70_9(char) = Store[?] : &:r70_8, r70_1 # 70| m70_10(unknown) = Chi : total:m69_3, partial:m70_9 #-----| Goto (back edge) -> Block 1 @@ -264,15 +264,15 @@ ssa.cpp: # 75| m75_6(bool) = InitializeParameter[b] : &:r75_5 # 76| r76_1(glval) = VariableAddress[x] : # 76| r76_2(int) = Constant[0] : -# 76| m76_3(int) = Store : &:r76_1, r76_2 +# 76| m76_3(int) = Store[x] : &:r76_1, r76_2 # 77| r77_1(glval) = VariableAddress[y] : # 77| r77_2(int) = Constant[1] : -# 77| m77_3(int) = Store : &:r77_1, r77_2 +# 77| m77_3(int) = Store[y] : &:r77_1, r77_2 # 78| r78_1(glval) = VariableAddress[z] : # 78| r78_2(int) = Constant[2] : -# 78| m78_3(int) = Store : &:r78_1, r78_2 +# 78| m78_3(int) = Store[z] : &:r78_1, r78_2 # 79| r79_1(glval) = VariableAddress[b] : -# 79| r79_2(bool) = Load : &:r79_1, m75_6 +# 79| r79_2(bool) = Load[b] : &:r79_1, m75_6 # 79| v79_3(void) = ConditionalBranch : r79_2 #-----| False -> Block 2 #-----| True -> Block 1 @@ -280,16 +280,16 @@ ssa.cpp: # 80| Block 1 # 80| r80_1(int) = Constant[3] : # 80| r80_2(glval) = VariableAddress[x] : -# 80| m80_3(int) = Store : &:r80_2, r80_1 +# 80| m80_3(int) = Store[x] : &:r80_2, r80_1 # 81| r81_1(int) = Constant[4] : # 81| r81_2(glval) = VariableAddress[y] : -# 81| m81_3(int) = Store : &:r81_2, r81_1 +# 81| m81_3(int) = Store[y] : &:r81_2, r81_1 #-----| Goto -> Block 3 # 84| Block 2 # 84| r84_1(int) = Constant[5] : # 84| r84_2(glval) = VariableAddress[x] : -# 84| m84_3(int) = Store : &:r84_2, r84_1 +# 84| m84_3(int) = Store[x] : &:r84_2, r84_1 #-----| Goto -> Block 3 # 86| Block 3 @@ -297,16 +297,16 @@ ssa.cpp: # 86| m86_2(int) = Phi : from 1:m80_3, from 2:m84_3 # 86| r86_3(glval) = VariableAddress[x_merge] : # 86| r86_4(glval) = VariableAddress[x] : -# 86| r86_5(int) = Load : &:r86_4, m86_2 -# 86| m86_6(int) = Store : &:r86_3, r86_5 +# 86| r86_5(int) = Load[x] : &:r86_4, m86_2 +# 86| m86_6(int) = Store[x_merge] : &:r86_3, r86_5 # 87| r87_1(glval) = VariableAddress[y_merge] : # 87| r87_2(glval) = VariableAddress[y] : -# 87| r87_3(int) = Load : &:r87_2, m86_1 -# 87| m87_4(int) = Store : &:r87_1, r87_3 +# 87| r87_3(int) = Load[y] : &:r87_2, m86_1 +# 87| m87_4(int) = Store[y_merge] : &:r87_1, r87_3 # 88| r88_1(glval) = VariableAddress[z_merge] : # 88| r88_2(glval) = VariableAddress[z] : -# 88| r88_3(int) = Load : &:r88_2, m78_3 -# 88| m88_4(int) = Store : &:r88_1, r88_3 +# 88| r88_3(int) = Load[z] : &:r88_2, m78_3 +# 88| m88_4(int) = Store[z_merge] : &:r88_1, r88_3 # 89| v89_1(void) = NoOp : # 75| v75_7(void) = ReturnVoid : # 75| v75_8(void) = AliasedUse : m75_3 @@ -322,8 +322,8 @@ ssa.cpp: # 91| m91_6(Point) = InitializeParameter[a] : &:r91_5 # 92| r92_1(glval) = VariableAddress[b] : # 92| r92_2(glval) = VariableAddress[a] : -# 92| r92_3(Point) = Load : &:r92_2, m91_6 -# 92| m92_4(Point) = Store : &:r92_1, r92_3 +# 92| r92_3(Point) = Load[a] : &:r92_2, m91_6 +# 92| m92_4(Point) = Store[b] : &:r92_1, r92_3 # 93| v93_1(void) = NoOp : # 91| v91_7(void) = ReturnVoid : # 91| v91_8(void) = AliasedUse : m91_3 @@ -339,8 +339,8 @@ ssa.cpp: # 95| m95_6(Point) = InitializeParameter[a] : &:r95_5 # 96| r96_1(glval) = VariableAddress[b] : # 96| r96_2(glval) = VariableAddress[a] : -# 96| r96_3(Point) = Load : &:r96_2, m95_6 -# 96| m96_4(Point) = Store : &:r96_1, r96_3 +# 96| r96_3(Point) = Load[a] : &:r96_2, m95_6 +# 96| m96_4(Point) = Store[b] : &:r96_1, r96_3 # 97| r97_1(glval) = FunctionAddress[Escape] : # 97| r97_2(glval) = VariableAddress[a] : # 97| r97_3(Point *) = CopyValue : r97_2 @@ -367,13 +367,13 @@ ssa.cpp: # 101| r101_1(glval) = VariableAddress[x] : # 101| r101_2(glval) = VariableAddress[a] : # 101| r101_3(glval) = FieldAddress[x] : r101_2 -# 101| r101_4(int) = Load : &:r101_3, ~m100_6 -# 101| m101_5(int) = Store : &:r101_1, r101_4 +# 101| r101_4(int) = Load[?] : &:r101_3, ~m100_6 +# 101| m101_5(int) = Store[x] : &:r101_1, r101_4 # 102| r102_1(glval) = VariableAddress[y] : # 102| r102_2(glval) = VariableAddress[a] : # 102| r102_3(glval) = FieldAddress[y] : r102_2 -# 102| r102_4(int) = Load : &:r102_3, ~m100_6 -# 102| m102_5(int) = Store : &:r102_1, r102_4 +# 102| r102_4(int) = Load[?] : &:r102_3, ~m100_6 +# 102| m102_5(int) = Store[y] : &:r102_1, r102_4 # 103| v103_1(void) = NoOp : # 100| v100_7(void) = ReturnVoid : # 100| v100_8(void) = AliasedUse : m100_3 @@ -390,13 +390,13 @@ ssa.cpp: # 106| r106_1(glval) = VariableAddress[x] : # 106| r106_2(glval) = VariableAddress[a] : # 106| r106_3(glval) = FieldAddress[x] : r106_2 -# 106| r106_4(int) = Load : &:r106_3, ~m105_6 -# 106| m106_5(int) = Store : &:r106_1, r106_4 +# 106| r106_4(int) = Load[?] : &:r106_3, ~m105_6 +# 106| m106_5(int) = Store[x] : &:r106_1, r106_4 # 107| r107_1(glval) = VariableAddress[y] : # 107| r107_2(glval) = VariableAddress[a] : # 107| r107_3(glval) = FieldAddress[y] : r107_2 -# 107| r107_4(int) = Load : &:r107_3, ~m105_6 -# 107| m107_5(int) = Store : &:r107_1, r107_4 +# 107| r107_4(int) = Load[?] : &:r107_3, ~m105_6 +# 107| m107_5(int) = Store[y] : &:r107_1, r107_4 # 108| r108_1(glval) = FunctionAddress[Escape] : # 108| r108_2(glval) = VariableAddress[a] : # 108| r108_3(Point *) = CopyValue : r108_2 @@ -426,18 +426,18 @@ ssa.cpp: # 112| m112_2(Point) = Uninitialized[a] : &:r112_1 # 112| r112_3(glval) = FieldAddress[x] : r112_1 # 112| r112_4(glval) = VariableAddress[x] : -# 112| r112_5(int) = Load : &:r112_4, m111_6 -# 112| m112_6(int) = Store : &:r112_3, r112_5 +# 112| r112_5(int) = Load[x] : &:r112_4, m111_6 +# 112| m112_6(int) = Store[?] : &:r112_3, r112_5 # 112| m112_7(Point) = Chi : total:m112_2, partial:m112_6 # 112| r112_8(glval) = FieldAddress[y] : r112_1 # 112| r112_9(glval) = VariableAddress[y] : -# 112| r112_10(int) = Load : &:r112_9, m111_8 -# 112| m112_11(int) = Store : &:r112_8, r112_10 +# 112| r112_10(int) = Load[y] : &:r112_9, m111_8 +# 112| m112_11(int) = Store[?] : &:r112_8, r112_10 # 112| m112_12(Point) = Chi : total:m112_7, partial:m112_11 # 113| r113_1(glval) = VariableAddress[b] : # 113| r113_2(glval) = VariableAddress[a] : -# 113| r113_3(Point) = Load : &:r113_2, m112_12 -# 113| m113_4(Point) = Store : &:r113_1, r113_3 +# 113| r113_3(Point) = Load[a] : &:r113_2, m112_12 +# 113| m113_4(Point) = Store[b] : &:r113_1, r113_3 # 114| v114_1(void) = NoOp : # 111| v111_9(void) = ReturnVoid : # 111| v111_10(void) = AliasedUse : m111_3 @@ -457,18 +457,18 @@ ssa.cpp: # 117| m117_2(Point) = Uninitialized[a] : &:r117_1 # 117| r117_3(glval) = FieldAddress[x] : r117_1 # 117| r117_4(glval) = VariableAddress[x] : -# 117| r117_5(int) = Load : &:r117_4, m116_6 -# 117| m117_6(int) = Store : &:r117_3, r117_5 +# 117| r117_5(int) = Load[x] : &:r117_4, m116_6 +# 117| m117_6(int) = Store[?] : &:r117_3, r117_5 # 117| m117_7(Point) = Chi : total:m117_2, partial:m117_6 # 117| r117_8(glval) = FieldAddress[y] : r117_1 # 117| r117_9(glval) = VariableAddress[y] : -# 117| r117_10(int) = Load : &:r117_9, m116_8 -# 117| m117_11(int) = Store : &:r117_8, r117_10 +# 117| r117_10(int) = Load[y] : &:r117_9, m116_8 +# 117| m117_11(int) = Store[?] : &:r117_8, r117_10 # 117| m117_12(Point) = Chi : total:m117_7, partial:m117_11 # 118| r118_1(glval) = VariableAddress[b] : # 118| r118_2(glval) = VariableAddress[a] : -# 118| r118_3(Point) = Load : &:r118_2, m117_12 -# 118| m118_4(Point) = Store : &:r118_1, r118_3 +# 118| r118_3(Point) = Load[a] : &:r118_2, m117_12 +# 118| m118_4(Point) = Store[b] : &:r118_1, r118_3 # 119| r119_1(glval) = FunctionAddress[Escape] : # 119| r119_2(glval) = VariableAddress[a] : # 119| r119_3(Point *) = CopyValue : r119_2 @@ -500,33 +500,33 @@ ssa.cpp: # 123| m123_2(Point) = Uninitialized[a] : &:r123_1 # 123| r123_3(glval) = FieldAddress[x] : r123_1 # 123| r123_4(int) = Constant[0] : -# 123| m123_5(int) = Store : &:r123_3, r123_4 +# 123| m123_5(int) = Store[?] : &:r123_3, r123_4 # 123| m123_6(Point) = Chi : total:m123_2, partial:m123_5 # 123| r123_7(glval) = FieldAddress[y] : r123_1 # 123| r123_8(int) = Constant[0] : -# 123| m123_9(int) = Store : &:r123_7, r123_8 +# 123| m123_9(int) = Store[?] : &:r123_7, r123_8 # 123| m123_10(Point) = Chi : total:m123_6, partial:m123_9 # 124| r124_1(glval) = VariableAddress[c] : -# 124| r124_2(bool) = Load : &:r124_1, m122_6 +# 124| r124_2(bool) = Load[c] : &:r124_1, m122_6 # 124| v124_3(void) = ConditionalBranch : r124_2 #-----| False -> Block 2 #-----| True -> Block 1 # 125| Block 1 # 125| r125_1(glval) = VariableAddress[x1] : -# 125| r125_2(int) = Load : &:r125_1, m122_8 +# 125| r125_2(int) = Load[x1] : &:r125_1, m122_8 # 125| r125_3(glval) = VariableAddress[a] : # 125| r125_4(glval) = FieldAddress[x] : r125_3 -# 125| m125_5(int) = Store : &:r125_4, r125_2 +# 125| m125_5(int) = Store[?] : &:r125_4, r125_2 # 125| m125_6(Point) = Chi : total:m123_10, partial:m125_5 #-----| Goto -> Block 3 # 128| Block 2 # 128| r128_1(glval) = VariableAddress[x2] : -# 128| r128_2(int) = Load : &:r128_1, m122_10 +# 128| r128_2(int) = Load[x2] : &:r128_1, m122_10 # 128| r128_3(glval) = VariableAddress[a] : # 128| r128_4(glval) = FieldAddress[x] : r128_3 -# 128| m128_5(int) = Store : &:r128_4, r128_2 +# 128| m128_5(int) = Store[?] : &:r128_4, r128_2 # 128| m128_6(Point) = Chi : total:m123_10, partial:m128_5 #-----| Goto -> Block 3 @@ -536,12 +536,12 @@ ssa.cpp: # 130| r130_3(glval) = VariableAddress[x] : # 130| r130_4(glval) = VariableAddress[a] : # 130| r130_5(glval) = FieldAddress[x] : r130_4 -# 130| r130_6(int) = Load : &:r130_5, m130_1 -# 130| m130_7(int) = Store : &:r130_3, r130_6 +# 130| r130_6(int) = Load[?] : &:r130_5, m130_1 +# 130| m130_7(int) = Store[x] : &:r130_3, r130_6 # 131| r131_1(glval) = VariableAddress[b] : # 131| r131_2(glval) = VariableAddress[a] : -# 131| r131_3(Point) = Load : &:r131_2, m130_2 -# 131| m131_4(Point) = Store : &:r131_1, r131_3 +# 131| r131_3(Point) = Load[a] : &:r131_2, m130_2 +# 131| m131_4(Point) = Store[b] : &:r131_1, r131_3 # 132| v132_1(void) = NoOp : # 122| v122_11(void) = ReturnVoid : # 122| v122_12(void) = AliasedUse : m122_3 @@ -563,32 +563,32 @@ ssa.cpp: # 135| m135_2(Point) = Uninitialized[a] : &:r135_1 # 135| r135_3(glval) = FieldAddress[x] : r135_1 # 135| r135_4(int) = Constant[0] : -# 135| m135_5(int) = Store : &:r135_3, r135_4 +# 135| m135_5(int) = Store[?] : &:r135_3, r135_4 # 135| m135_6(Point) = Chi : total:m135_2, partial:m135_5 # 135| r135_7(glval) = FieldAddress[y] : r135_1 # 135| r135_8(int) = Constant[0] : -# 135| m135_9(int) = Store : &:r135_7, r135_8 +# 135| m135_9(int) = Store[?] : &:r135_7, r135_8 # 135| m135_10(Point) = Chi : total:m135_6, partial:m135_9 # 136| r136_1(glval) = VariableAddress[c] : -# 136| r136_2(bool) = Load : &:r136_1, m134_6 +# 136| r136_2(bool) = Load[c] : &:r136_1, m134_6 # 136| v136_3(void) = ConditionalBranch : r136_2 #-----| False -> Block 2 #-----| True -> Block 1 # 137| Block 1 # 137| r137_1(glval) = VariableAddress[x1] : -# 137| r137_2(int) = Load : &:r137_1, m134_10 +# 137| r137_2(int) = Load[x1] : &:r137_1, m134_10 # 137| r137_3(glval) = VariableAddress[a] : # 137| r137_4(glval) = FieldAddress[x] : r137_3 -# 137| m137_5(int) = Store : &:r137_4, r137_2 +# 137| m137_5(int) = Store[?] : &:r137_4, r137_2 # 137| m137_6(Point) = Chi : total:m135_10, partial:m137_5 #-----| Goto -> Block 3 # 140| Block 2 # 140| r140_1(glval) = VariableAddress[p] : -# 140| r140_2(Point) = Load : &:r140_1, m134_8 +# 140| r140_2(Point) = Load[p] : &:r140_1, m134_8 # 140| r140_3(glval) = VariableAddress[a] : -# 140| m140_4(Point) = Store : &:r140_3, r140_2 +# 140| m140_4(Point) = Store[a] : &:r140_3, r140_2 #-----| Goto -> Block 3 # 142| Block 3 @@ -597,8 +597,8 @@ ssa.cpp: # 142| r142_3(glval) = VariableAddress[x] : # 142| r142_4(glval) = VariableAddress[a] : # 142| r142_5(glval) = FieldAddress[x] : r142_4 -# 142| r142_6(int) = Load : &:r142_5, m142_1 -# 142| m142_7(int) = Store : &:r142_3, r142_6 +# 142| r142_6(int) = Load[?] : &:r142_5, m142_1 +# 142| m142_7(int) = Store[x] : &:r142_3, r142_6 # 143| v143_1(void) = NoOp : # 134| v134_11(void) = ReturnVoid : # 134| v134_12(void) = AliasedUse : m134_3 @@ -620,40 +620,40 @@ ssa.cpp: # 146| m146_2(Point) = Uninitialized[a] : &:r146_1 # 146| r146_3(glval) = FieldAddress[x] : r146_1 # 146| r146_4(int) = Constant[0] : -# 146| m146_5(int) = Store : &:r146_3, r146_4 +# 146| m146_5(int) = Store[?] : &:r146_3, r146_4 # 146| m146_6(Point) = Chi : total:m146_2, partial:m146_5 # 146| r146_7(glval) = FieldAddress[y] : r146_1 # 146| r146_8(int) = Constant[0] : -# 146| m146_9(int) = Store : &:r146_7, r146_8 +# 146| m146_9(int) = Store[?] : &:r146_7, r146_8 # 146| m146_10(Point) = Chi : total:m146_6, partial:m146_9 # 147| r147_1(glval) = VariableAddress[c] : -# 147| r147_2(bool) = Load : &:r147_1, m145_6 +# 147| r147_2(bool) = Load[c] : &:r147_1, m145_6 # 147| v147_3(void) = ConditionalBranch : r147_2 #-----| False -> Block 2 #-----| True -> Block 1 # 148| Block 1 # 148| r148_1(glval) = VariableAddress[x1] : -# 148| r148_2(int) = Load : &:r148_1, m145_10 +# 148| r148_2(int) = Load[x1] : &:r148_1, m145_10 # 148| r148_3(glval) = VariableAddress[a] : # 148| r148_4(glval) = FieldAddress[x] : r148_3 -# 148| m148_5(int) = Store : &:r148_4, r148_2 +# 148| m148_5(int) = Store[?] : &:r148_4, r148_2 # 148| m148_6(Point) = Chi : total:m146_10, partial:m148_5 #-----| Goto -> Block 3 # 151| Block 2 # 151| r151_1(glval) = VariableAddress[p] : -# 151| r151_2(Point) = Load : &:r151_1, m145_8 +# 151| r151_2(Point) = Load[p] : &:r151_1, m145_8 # 151| r151_3(glval) = VariableAddress[a] : -# 151| m151_4(Point) = Store : &:r151_3, r151_2 +# 151| m151_4(Point) = Store[a] : &:r151_3, r151_2 #-----| Goto -> Block 3 # 153| Block 3 # 153| m153_1(Point) = Phi : from 1:m148_6, from 2:m151_4 # 153| r153_2(glval) = VariableAddress[b] : # 153| r153_3(glval) = VariableAddress[a] : -# 153| r153_4(Point) = Load : &:r153_3, m153_1 -# 153| m153_5(Point) = Store : &:r153_2, r153_4 +# 153| r153_4(Point) = Load[a] : &:r153_3, m153_1 +# 153| m153_5(Point) = Store[b] : &:r153_2, r153_4 # 154| v154_1(void) = NoOp : # 145| v145_11(void) = ReturnVoid : # 145| v145_12(void) = AliasedUse : m145_3 @@ -675,33 +675,33 @@ ssa.cpp: # 157| m157_2(Rect) = Uninitialized[a] : &:r157_1 # 157| r157_3(glval) = FieldAddress[topLeft] : r157_1 # 157| r157_4(Point) = Constant[0] : -# 157| m157_5(Point) = Store : &:r157_3, r157_4 +# 157| m157_5(Point) = Store[?] : &:r157_3, r157_4 # 157| m157_6(Rect) = Chi : total:m157_2, partial:m157_5 # 157| r157_7(glval) = FieldAddress[bottomRight] : r157_1 # 157| r157_8(Point) = Constant[0] : -# 157| m157_9(Point) = Store : &:r157_7, r157_8 +# 157| m157_9(Point) = Store[?] : &:r157_7, r157_8 # 157| m157_10(Rect) = Chi : total:m157_6, partial:m157_9 # 158| r158_1(glval) = VariableAddress[c] : -# 158| r158_2(bool) = Load : &:r158_1, m156_6 +# 158| r158_2(bool) = Load[c] : &:r158_1, m156_6 # 158| v158_3(void) = ConditionalBranch : r158_2 #-----| False -> Block 2 #-----| True -> Block 1 # 159| Block 1 # 159| r159_1(glval) = VariableAddress[x1] : -# 159| r159_2(int) = Load : &:r159_1, m156_10 +# 159| r159_2(int) = Load[x1] : &:r159_1, m156_10 # 159| r159_3(glval) = VariableAddress[a] : # 159| r159_4(glval) = FieldAddress[topLeft] : r159_3 # 159| r159_5(glval) = FieldAddress[x] : r159_4 -# 159| m159_6(int) = Store : &:r159_5, r159_2 +# 159| m159_6(int) = Store[?] : &:r159_5, r159_2 # 159| m159_7(Rect) = Chi : total:m157_10, partial:m159_6 #-----| Goto -> Block 3 # 162| Block 2 # 162| r162_1(glval) = VariableAddress[r] : -# 162| r162_2(Rect) = Load : &:r162_1, m156_8 +# 162| r162_2(Rect) = Load[r] : &:r162_1, m156_8 # 162| r162_3(glval) = VariableAddress[a] : -# 162| m162_4(Rect) = Store : &:r162_3, r162_2 +# 162| m162_4(Rect) = Store[a] : &:r162_3, r162_2 #-----| Goto -> Block 3 # 164| Block 3 @@ -709,8 +709,8 @@ ssa.cpp: # 164| r164_2(glval) = VariableAddress[b] : # 164| r164_3(glval) = VariableAddress[a] : # 164| r164_4(glval) = FieldAddress[topLeft] : r164_3 -# 164| r164_5(Point) = Load : &:r164_4, ~m164_1 -# 164| m164_6(Point) = Store : &:r164_2, r164_5 +# 164| r164_5(Point) = Load[?] : &:r164_4, ~m164_1 +# 164| m164_6(Point) = Store[b] : &:r164_2, r164_5 # 165| v165_1(void) = NoOp : # 156| v156_11(void) = ReturnVoid : # 156| v156_12(void) = AliasedUse : m156_3 @@ -726,26 +726,26 @@ ssa.cpp: # 171| m171_6(Wrapper) = InitializeParameter[w] : &:r171_5 # 172| r172_1(glval) = VariableAddress[x] : # 172| r172_2(glval) = VariableAddress[w] : -# 172| r172_3(Wrapper) = Load : &:r172_2, m171_6 -# 172| m172_4(Wrapper) = Store : &:r172_1, r172_3 +# 172| r172_3(Wrapper) = Load[w] : &:r172_2, m171_6 +# 172| m172_4(Wrapper) = Store[x] : &:r172_1, r172_3 # 173| r173_1(glval) = VariableAddress[a] : # 173| r173_2(glval) = VariableAddress[w] : # 173| r173_3(glval) = FieldAddress[f] : r173_2 -# 173| r173_4(int) = Load : &:r173_3, ~m171_6 -# 173| m173_5(int) = Store : &:r173_1, r173_4 +# 173| r173_4(int) = Load[?] : &:r173_3, ~m171_6 +# 173| m173_5(int) = Store[a] : &:r173_1, r173_4 # 174| r174_1(int) = Constant[5] : # 174| r174_2(glval) = VariableAddress[w] : # 174| r174_3(glval) = FieldAddress[f] : r174_2 -# 174| m174_4(int) = Store : &:r174_3, r174_1 +# 174| m174_4(int) = Store[?] : &:r174_3, r174_1 # 175| r175_1(glval) = VariableAddress[w] : # 175| r175_2(glval) = FieldAddress[f] : r175_1 -# 175| r175_3(int) = Load : &:r175_2, m174_4 +# 175| r175_3(int) = Load[?] : &:r175_2, m174_4 # 175| r175_4(glval) = VariableAddress[a] : -# 175| m175_5(int) = Store : &:r175_4, r175_3 +# 175| m175_5(int) = Store[a] : &:r175_4, r175_3 # 176| r176_1(glval) = VariableAddress[w] : -# 176| r176_2(Wrapper) = Load : &:r176_1, ~m174_4 +# 176| r176_2(Wrapper) = Load[w] : &:r176_1, ~m174_4 # 176| r176_3(glval) = VariableAddress[x] : -# 176| m176_4(Wrapper) = Store : &:r176_3, r176_2 +# 176| m176_4(Wrapper) = Store[x] : &:r176_3, r176_2 # 177| v177_1(void) = NoOp : # 171| v171_7(void) = ReturnVoid : # 171| v171_8(void) = AliasedUse : m171_3 @@ -759,15 +759,15 @@ ssa.cpp: # 179| m179_4(unknown) = Chi : total:m179_2, partial:m179_3 # 179| r179_5(glval) = VariableAddress[p] : # 179| m179_6(int *) = InitializeParameter[p] : &:r179_5 -# 179| r179_7(int *) = Load : &:r179_5, m179_6 +# 179| r179_7(int *) = Load[p] : &:r179_5, m179_6 # 179| m179_8(unknown) = InitializeIndirection[p] : &:r179_7 # 180| m180_1(unknown) = InlineAsm : ~m179_4 # 180| m180_2(unknown) = Chi : total:m179_4, partial:m180_1 # 181| r181_1(glval) = VariableAddress[#return] : # 181| r181_2(glval) = VariableAddress[p] : -# 181| r181_3(int *) = Load : &:r181_2, m179_6 -# 181| r181_4(int) = Load : &:r181_3, ~m179_8 -# 181| m181_5(int) = Store : &:r181_1, r181_4 +# 181| r181_3(int *) = Load[p] : &:r181_2, m179_6 +# 181| r181_4(int) = Load[?] : &:r181_3, ~m179_8 +# 181| m181_5(int) = Store[#return] : &:r181_1, r181_4 # 179| v179_9(void) = ReturnIndirection[p] : &:r179_7, m179_8 # 179| r179_10(glval) = VariableAddress[#return] : # 179| v179_11(void) = ReturnValue : &:r179_10, m181_5 @@ -782,32 +782,32 @@ ssa.cpp: # 184| m184_4(unknown) = Chi : total:m184_2, partial:m184_3 # 184| r184_5(glval) = VariableAddress[a] : # 184| m184_6(unsigned int &) = InitializeParameter[a] : &:r184_5 -# 184| r184_7(unsigned int &) = Load : &:r184_5, m184_6 +# 184| r184_7(unsigned int &) = Load[a] : &:r184_5, m184_6 # 184| m184_8(unknown) = InitializeIndirection[a] : &:r184_7 # 184| r184_9(glval) = VariableAddress[b] : # 184| m184_10(unsigned int &) = InitializeParameter[b] : &:r184_9 -# 184| r184_11(unsigned int &) = Load : &:r184_9, m184_10 +# 184| r184_11(unsigned int &) = Load[b] : &:r184_9, m184_10 # 184| m184_12(unknown) = InitializeIndirection[b] : &:r184_11 # 184| r184_13(glval) = VariableAddress[c] : # 184| m184_14(unsigned int &) = InitializeParameter[c] : &:r184_13 -# 184| r184_15(unsigned int &) = Load : &:r184_13, m184_14 +# 184| r184_15(unsigned int &) = Load[c] : &:r184_13, m184_14 # 184| m184_16(unknown) = InitializeIndirection[c] : &:r184_15 # 184| r184_17(glval) = VariableAddress[d] : # 184| m184_18(unsigned int &) = InitializeParameter[d] : &:r184_17 -# 184| r184_19(unsigned int &) = Load : &:r184_17, m184_18 +# 184| r184_19(unsigned int &) = Load[d] : &:r184_17, m184_18 # 184| m184_20(unknown) = InitializeIndirection[d] : &:r184_19 # 189| r189_1(glval) = VariableAddress[a] : -# 189| r189_2(unsigned int &) = Load : &:r189_1, m184_6 +# 189| r189_2(unsigned int &) = Load[a] : &:r189_1, m184_6 # 189| r189_3(glval) = CopyValue : r189_2 # 189| r189_4(glval) = VariableAddress[b] : -# 189| r189_5(unsigned int &) = Load : &:r189_4, m184_10 +# 189| r189_5(unsigned int &) = Load[b] : &:r189_4, m184_10 # 189| r189_6(glval) = CopyValue : r189_5 # 190| r190_1(glval) = VariableAddress[c] : -# 190| r190_2(unsigned int &) = Load : &:r190_1, m184_14 -# 190| r190_3(unsigned int) = Load : &:r190_2, ~m184_16 +# 190| r190_2(unsigned int &) = Load[c] : &:r190_1, m184_14 +# 190| r190_3(unsigned int) = Load[?] : &:r190_2, ~m184_16 # 190| r190_4(glval) = VariableAddress[d] : -# 190| r190_5(unsigned int &) = Load : &:r190_4, m184_18 -# 190| r190_6(unsigned int) = Load : &:r190_5, ~m184_20 +# 190| r190_5(unsigned int &) = Load[d] : &:r190_4, m184_18 +# 190| r190_6(unsigned int) = Load[?] : &:r190_5, ~m184_20 # 186| m186_1(unknown) = InlineAsm : ~m184_4, 0:r189_3, 1:r189_6, 2:r190_3, 3:r190_6 # 186| m186_2(unknown) = Chi : total:m184_4, partial:m186_1 # 192| v192_1(void) = NoOp : @@ -827,48 +827,48 @@ ssa.cpp: # 198| m198_4(unknown) = Chi : total:m198_2, partial:m198_3 # 198| r198_5(glval) = VariableAddress[str1] : # 198| m198_6(char *) = InitializeParameter[str1] : &:r198_5 -# 198| r198_7(char *) = Load : &:r198_5, m198_6 +# 198| r198_7(char *) = Load[str1] : &:r198_5, m198_6 # 198| m198_8(unknown) = InitializeIndirection[str1] : &:r198_7 # 198| r198_9(glval) = VariableAddress[str2] : # 198| m198_10(char *) = InitializeParameter[str2] : &:r198_9 -# 198| r198_11(char *) = Load : &:r198_9, m198_10 +# 198| r198_11(char *) = Load[str2] : &:r198_9, m198_10 # 198| m198_12(unknown) = InitializeIndirection[str2] : &:r198_11 # 198| r198_13(glval) = VariableAddress[x] : # 198| m198_14(int) = InitializeParameter[x] : &:r198_13 # 199| r199_1(glval) = VariableAddress[ret] : # 199| r199_2(glval) = FunctionAddress[strcmp] : # 199| r199_3(glval) = VariableAddress[str1] : -# 199| r199_4(char *) = Load : &:r199_3, m198_6 +# 199| r199_4(char *) = Load[str1] : &:r199_3, m198_6 # 199| r199_5(char *) = Convert : r199_4 # 199| r199_6(glval) = VariableAddress[str2] : -# 199| r199_7(char *) = Load : &:r199_6, m198_10 +# 199| r199_7(char *) = Load[str2] : &:r199_6, m198_10 # 199| r199_8(char *) = Convert : r199_7 # 199| r199_9(int) = Call[strcmp] : func:r199_2, 0:r199_5, 1:r199_8 # 199| v199_10(void) = ^BufferReadSideEffect[0] : &:r199_5, ~m198_8 # 199| v199_11(void) = ^BufferReadSideEffect[1] : &:r199_8, ~m198_12 -# 199| m199_12(int) = Store : &:r199_1, r199_9 +# 199| m199_12(int) = Store[ret] : &:r199_1, r199_9 # 200| r200_1(glval) = FunctionAddress[strlen] : # 200| r200_2(glval) = VariableAddress[str1] : -# 200| r200_3(char *) = Load : &:r200_2, m198_6 +# 200| r200_3(char *) = Load[str1] : &:r200_2, m198_6 # 200| r200_4(char *) = Convert : r200_3 # 200| r200_5(int) = Call[strlen] : func:r200_1, 0:r200_4 # 200| v200_6(void) = ^BufferReadSideEffect[0] : &:r200_4, ~m198_8 # 200| r200_7(glval) = VariableAddress[ret] : -# 200| r200_8(int) = Load : &:r200_7, m199_12 +# 200| r200_8(int) = Load[ret] : &:r200_7, m199_12 # 200| r200_9(int) = Add : r200_8, r200_5 -# 200| m200_10(int) = Store : &:r200_7, r200_9 +# 200| m200_10(int) = Store[ret] : &:r200_7, r200_9 # 201| r201_1(glval) = FunctionAddress[abs] : # 201| r201_2(glval) = VariableAddress[x] : -# 201| r201_3(int) = Load : &:r201_2, m198_14 +# 201| r201_3(int) = Load[x] : &:r201_2, m198_14 # 201| r201_4(int) = Call[abs] : func:r201_1, 0:r201_3 # 201| r201_5(glval) = VariableAddress[ret] : -# 201| r201_6(int) = Load : &:r201_5, m200_10 +# 201| r201_6(int) = Load[ret] : &:r201_5, m200_10 # 201| r201_7(int) = Add : r201_6, r201_4 -# 201| m201_8(int) = Store : &:r201_5, r201_7 +# 201| m201_8(int) = Store[ret] : &:r201_5, r201_7 # 202| r202_1(glval) = VariableAddress[#return] : # 202| r202_2(glval) = VariableAddress[ret] : -# 202| r202_3(int) = Load : &:r202_2, m201_8 -# 202| m202_4(int) = Store : &:r202_1, r202_3 +# 202| r202_3(int) = Load[ret] : &:r202_2, m201_8 +# 202| m202_4(int) = Store[#return] : &:r202_1, r202_3 # 198| v198_15(void) = ReturnIndirection[str1] : &:r198_7, m198_8 # 198| v198_16(void) = ReturnIndirection[str2] : &:r198_11, m198_12 # 198| r198_17(glval) = VariableAddress[#return] : @@ -900,8 +900,8 @@ ssa.cpp: # 209| m209_12(int) = Chi : total:m208_2, partial:m209_11 # 210| r210_1(glval) = VariableAddress[#return] : # 210| r210_2(glval) = VariableAddress[y] : -# 210| r210_3(int) = Load : &:r210_2, m209_12 -# 210| m210_4(int) = Store : &:r210_1, r210_3 +# 210| r210_3(int) = Load[y] : &:r210_2, m209_12 +# 210| m210_4(int) = Store[#return] : &:r210_1, r210_3 # 207| r207_7(glval) = VariableAddress[#return] : # 207| v207_8(void) = ReturnValue : &:r207_7, m210_4 # 207| v207_9(void) = AliasedUse : m207_3 @@ -915,16 +915,16 @@ ssa.cpp: # 213| m213_4(unknown) = Chi : total:m213_2, partial:m213_3 # 214| r214_1(glval) = VariableAddress[a_pad] : # 214| r214_2(glval) = StringConstant[""] : -# 214| r214_3(char[32]) = Load : &:r214_2, ~m213_3 -# 214| m214_4(char[32]) = Store : &:r214_1, r214_3 +# 214| r214_3(char[32]) = Load[?] : &:r214_2, ~m213_3 +# 214| m214_4(char[32]) = Store[a_pad] : &:r214_1, r214_3 # 215| r215_1(glval) = VariableAddress[a_nopad] : # 215| r215_2(glval) = StringConstant["foo"] : -# 215| r215_3(char[4]) = Load : &:r215_2, ~m213_3 -# 215| m215_4(char[4]) = Store : &:r215_1, r215_3 +# 215| r215_3(char[4]) = Load[?] : &:r215_2, ~m213_3 +# 215| m215_4(char[4]) = Store[a_nopad] : &:r215_1, r215_3 # 216| r216_1(glval) = VariableAddress[a_infer] : # 216| r216_2(glval) = StringConstant["blah"] : -# 216| r216_3(char[5]) = Load : &:r216_2, ~m213_3 -# 216| m216_4(char[5]) = Store : &:r216_1, r216_3 +# 216| r216_3(char[5]) = Load[?] : &:r216_2, ~m213_3 +# 216| m216_4(char[5]) = Store[a_infer] : &:r216_1, r216_3 # 217| r217_1(glval) = VariableAddress[b] : # 217| m217_2(char[2]) = Uninitialized[b] : &:r217_1 # 218| r218_1(glval) = VariableAddress[c] : @@ -932,42 +932,42 @@ ssa.cpp: # 218| r218_3(int) = Constant[0] : # 218| r218_4(glval) = PointerAdd[1] : r218_1, r218_3 # 218| r218_5(unknown[2]) = Constant[0] : -# 218| m218_6(unknown[2]) = Store : &:r218_4, r218_5 +# 218| m218_6(unknown[2]) = Store[?] : &:r218_4, r218_5 # 219| r219_1(glval) = VariableAddress[d] : # 219| m219_2(char[2]) = Uninitialized[d] : &:r219_1 # 219| r219_3(int) = Constant[0] : # 219| r219_4(glval) = PointerAdd[1] : r219_1, r219_3 # 219| r219_5(char) = Constant[0] : -# 219| m219_6(char) = Store : &:r219_4, r219_5 +# 219| m219_6(char) = Store[?] : &:r219_4, r219_5 # 219| m219_7(char[2]) = Chi : total:m219_2, partial:m219_6 # 219| r219_8(int) = Constant[1] : # 219| r219_9(glval) = PointerAdd[1] : r219_1, r219_8 # 219| r219_10(char) = Constant[0] : -# 219| m219_11(char) = Store : &:r219_9, r219_10 +# 219| m219_11(char) = Store[?] : &:r219_9, r219_10 # 219| m219_12(char[2]) = Chi : total:m219_7, partial:m219_11 # 220| r220_1(glval) = VariableAddress[e] : # 220| m220_2(char[2]) = Uninitialized[e] : &:r220_1 # 220| r220_3(int) = Constant[0] : # 220| r220_4(glval) = PointerAdd[1] : r220_1, r220_3 # 220| r220_5(char) = Constant[0] : -# 220| m220_6(char) = Store : &:r220_4, r220_5 +# 220| m220_6(char) = Store[?] : &:r220_4, r220_5 # 220| m220_7(char[2]) = Chi : total:m220_2, partial:m220_6 # 220| r220_8(int) = Constant[1] : # 220| r220_9(glval) = PointerAdd[1] : r220_1, r220_8 # 220| r220_10(char) = Constant[1] : -# 220| m220_11(char) = Store : &:r220_9, r220_10 +# 220| m220_11(char) = Store[?] : &:r220_9, r220_10 # 220| m220_12(char[2]) = Chi : total:m220_7, partial:m220_11 # 221| r221_1(glval) = VariableAddress[f] : # 221| m221_2(char[3]) = Uninitialized[f] : &:r221_1 # 221| r221_3(int) = Constant[0] : # 221| r221_4(glval) = PointerAdd[1] : r221_1, r221_3 # 221| r221_5(char) = Constant[0] : -# 221| m221_6(char) = Store : &:r221_4, r221_5 +# 221| m221_6(char) = Store[?] : &:r221_4, r221_5 # 221| m221_7(char[3]) = Chi : total:m221_2, partial:m221_6 # 221| r221_8(int) = Constant[1] : # 221| r221_9(glval) = PointerAdd[1] : r221_1, r221_8 # 221| r221_10(unknown[2]) = Constant[0] : -# 221| m221_11(unknown[2]) = Store : &:r221_9, r221_10 +# 221| m221_11(unknown[2]) = Store[?] : &:r221_9, r221_10 # 221| m221_12(char[3]) = Chi : total:m221_7, partial:m221_11 # 222| v222_1(void) = NoOp : # 213| v213_5(void) = ReturnVoid : @@ -987,14 +987,14 @@ ssa.cpp: # 229| r229_1(glval) = VariableAddress[s] : # 229| r229_2(glval) = StringConstant["Literal"] : # 229| r229_3(char *) = Convert : r229_2 -# 229| m229_4(char *) = Store : &:r229_1, r229_3 +# 229| m229_4(char *) = Store[s] : &:r229_1, r229_3 # 230| r230_1(glval) = VariableAddress[#return] : # 230| r230_2(glval) = VariableAddress[s] : -# 230| r230_3(char *) = Load : &:r230_2, m229_4 +# 230| r230_3(char *) = Load[s] : &:r230_2, m229_4 # 230| r230_4(int) = Constant[2] : # 230| r230_5(glval) = PointerAdd[1] : r230_3, r230_4 -# 230| r230_6(char) = Load : &:r230_5, ~m226_3 -# 230| m230_7(char) = Store : &:r230_1, r230_6 +# 230| r230_6(char) = Load[?] : &:r230_5, ~m226_3 +# 230| m230_7(char) = Store[#return] : &:r230_1, r230_6 # 226| r226_5(glval) = VariableAddress[#return] : # 226| v226_6(void) = ReturnValue : &:r226_5, m230_7 # 226| v226_7(void) = AliasedUse : ~m227_4 @@ -1008,7 +1008,7 @@ ssa.cpp: # 235| m235_4(unknown) = Chi : total:m235_2, partial:m235_3 # 235| r235_5(glval) = VariableAddress[#this] : # 235| m235_6(glval) = InitializeParameter[#this] : &:r235_5 -# 235| r235_7(glval) = Load : &:r235_5, m235_6 +# 235| r235_7(glval) = Load[#this] : &:r235_5, m235_6 # 235| m235_8(Constructible) = InitializeIndirection[#this] : &:r235_7 # 235| r235_9(glval) = VariableAddress[x] : # 235| m235_10(int) = InitializeParameter[x] : &:r235_9 @@ -1026,7 +1026,7 @@ ssa.cpp: # 236| m236_4(unknown) = Chi : total:m236_2, partial:m236_3 # 236| r236_5(glval) = VariableAddress[#this] : # 236| m236_6(glval) = InitializeParameter[#this] : &:r236_5 -# 236| r236_7(glval) = Load : &:r236_5, m236_6 +# 236| r236_7(glval) = Load[#this] : &:r236_5, m236_6 # 236| m236_8(Constructible) = InitializeIndirection[#this] : &:r236_7 # 236| v236_9(void) = NoOp : # 236| v236_10(void) = ReturnIndirection[#this] : &:r236_7, m236_8 @@ -1095,14 +1095,14 @@ ssa.cpp: # 247| m247_4(unknown) = Chi : total:m247_2, partial:m247_3 # 247| r247_5(glval) = VariableAddress[src] : # 247| m247_6(char *) = InitializeParameter[src] : &:r247_5 -# 247| r247_7(char *) = Load : &:r247_5, m247_6 +# 247| r247_7(char *) = Load[src] : &:r247_5, m247_6 # 247| m247_8(unknown) = InitializeIndirection[src] : &:r247_7 # 247| r247_9(glval) = VariableAddress[size] : # 247| m247_10(int) = InitializeParameter[size] : &:r247_9 # 248| r248_1(glval) = VariableAddress[dst] : # 248| r248_2(glval) = FunctionAddress[operator new[]] : # 248| r248_3(glval) = VariableAddress[size] : -# 248| r248_4(int) = Load : &:r248_3, m247_10 +# 248| r248_4(int) = Load[size] : &:r248_3, m247_10 # 248| r248_5(unsigned long) = Convert : r248_4 # 248| r248_6(unsigned long) = Constant[1] : # 248| r248_7(unsigned long) = Mul : r248_5, r248_6 @@ -1111,30 +1111,30 @@ ssa.cpp: # 248| m248_10(unknown) = Chi : total:m247_4, partial:m248_9 # 248| m248_11(unknown) = ^InitializeDynamicAllocation : &:r248_8 # 248| r248_12(char *) = Convert : r248_8 -# 248| m248_13(char *) = Store : &:r248_1, r248_12 +# 248| m248_13(char *) = Store[dst] : &:r248_1, r248_12 # 249| r249_1(char) = Constant[97] : # 249| r249_2(glval) = VariableAddress[src] : -# 249| r249_3(char *) = Load : &:r249_2, m247_6 +# 249| r249_3(char *) = Load[src] : &:r249_2, m247_6 # 249| r249_4(glval) = CopyValue : r249_3 -# 249| m249_5(char) = Store : &:r249_4, r249_1 +# 249| m249_5(char) = Store[?] : &:r249_4, r249_1 # 249| m249_6(unknown) = Chi : total:m247_8, partial:m249_5 # 250| r250_1(glval) = FunctionAddress[memcpy] : # 250| r250_2(glval) = VariableAddress[dst] : -# 250| r250_3(char *) = Load : &:r250_2, m248_13 +# 250| r250_3(char *) = Load[dst] : &:r250_2, m248_13 # 250| r250_4(void *) = Convert : r250_3 # 250| r250_5(glval) = VariableAddress[src] : -# 250| r250_6(char *) = Load : &:r250_5, m247_6 +# 250| r250_6(char *) = Load[src] : &:r250_5, m247_6 # 250| r250_7(void *) = Convert : r250_6 # 250| r250_8(glval) = VariableAddress[size] : -# 250| r250_9(int) = Load : &:r250_8, m247_10 +# 250| r250_9(int) = Load[size] : &:r250_8, m247_10 # 250| r250_10(void *) = Call[memcpy] : func:r250_1, 0:r250_4, 1:r250_7, 2:r250_9 # 250| v250_11(void) = ^SizedBufferReadSideEffect[1] : &:r250_7, r250_9, ~m249_6 # 250| m250_12(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r250_4, r250_9 # 250| m250_13(unknown) = Chi : total:m248_11, partial:m250_12 # 251| r251_1(glval) = VariableAddress[#return] : # 251| r251_2(glval) = VariableAddress[dst] : -# 251| r251_3(char *) = Load : &:r251_2, m248_13 -# 251| m251_4(char *) = Store : &:r251_1, r251_3 +# 251| r251_3(char *) = Load[dst] : &:r251_2, m248_13 +# 251| m251_4(char *) = Store[#return] : &:r251_1, r251_3 # 247| v247_11(void) = ReturnIndirection[src] : &:r247_7, m249_6 # 247| r247_12(glval) = VariableAddress[#return] : # 247| v247_13(void) = ReturnValue : &:r247_12, m251_4 @@ -1150,7 +1150,7 @@ ssa.cpp: # 254| r254_5(glval) = VariableAddress[b] : # 254| m254_6(bool) = InitializeParameter[b] : &:r254_5 # 255| r255_1(glval) = VariableAddress[b] : -# 255| r255_2(bool) = Load : &:r255_1, m254_6 +# 255| r255_2(bool) = Load[b] : &:r255_1, m254_6 # 255| v255_3(void) = ConditionalBranch : r255_2 #-----| False -> Block 2 #-----| True -> Block 1 @@ -1174,14 +1174,14 @@ ssa.cpp: # 262| r262_2(glval) = VariableAddress[s] : # 262| r262_3(glval) = StringConstant["Literal"] : # 262| r262_4(char *) = Convert : r262_3 -# 262| m262_5(char *) = Store : &:r262_2, r262_4 +# 262| m262_5(char *) = Store[s] : &:r262_2, r262_4 # 263| r263_1(glval) = VariableAddress[#return] : # 263| r263_2(glval) = VariableAddress[s] : -# 263| r263_3(char *) = Load : &:r263_2, m262_5 +# 263| r263_3(char *) = Load[s] : &:r263_2, m262_5 # 263| r263_4(int) = Constant[2] : # 263| r263_5(glval) = PointerAdd[1] : r263_3, r263_4 -# 263| r263_6(char) = Load : &:r263_5, ~m254_3 -# 263| m263_7(char) = Store : &:r263_1, r263_6 +# 263| r263_6(char) = Load[?] : &:r263_5, ~m254_3 +# 263| m263_7(char) = Store[#return] : &:r263_1, r263_6 # 254| r254_7(glval) = VariableAddress[#return] : # 254| v254_8(void) = ReturnValue : &:r254_7, m263_7 # 254| v254_9(void) = AliasedUse : ~m262_1 @@ -1195,34 +1195,34 @@ ssa.cpp: # 268| m268_4(unknown) = Chi : total:m268_2, partial:m268_3 # 268| r268_5(glval) = VariableAddress[s] : # 268| m268_6(void *) = InitializeParameter[s] : &:r268_5 -# 268| r268_7(void *) = Load : &:r268_5, m268_6 +# 268| r268_7(void *) = Load[s] : &:r268_5, m268_6 # 268| m268_8(unknown) = InitializeIndirection[s] : &:r268_7 # 268| r268_9(glval) = VariableAddress[size] : # 268| m268_10(int) = InitializeParameter[size] : &:r268_9 # 269| r269_1(glval) = VariableAddress[buf] : # 269| r269_2(glval) = FunctionAddress[malloc] : # 269| r269_3(glval) = VariableAddress[size] : -# 269| r269_4(int) = Load : &:r269_3, m268_10 +# 269| r269_4(int) = Load[size] : &:r269_3, m268_10 # 269| r269_5(void *) = Call[malloc] : func:r269_2, 0:r269_4 # 269| m269_6(unknown) = ^CallSideEffect : ~m268_4 # 269| m269_7(unknown) = Chi : total:m268_4, partial:m269_6 # 269| m269_8(unknown) = ^InitializeDynamicAllocation : &:r269_5 -# 269| m269_9(void *) = Store : &:r269_1, r269_5 +# 269| m269_9(void *) = Store[buf] : &:r269_1, r269_5 # 270| r270_1(glval) = FunctionAddress[memcpy] : # 270| r270_2(glval) = VariableAddress[buf] : -# 270| r270_3(void *) = Load : &:r270_2, m269_9 +# 270| r270_3(void *) = Load[buf] : &:r270_2, m269_9 # 270| r270_4(glval) = VariableAddress[s] : -# 270| r270_5(void *) = Load : &:r270_4, m268_6 +# 270| r270_5(void *) = Load[s] : &:r270_4, m268_6 # 270| r270_6(glval) = VariableAddress[size] : -# 270| r270_7(int) = Load : &:r270_6, m268_10 +# 270| r270_7(int) = Load[size] : &:r270_6, m268_10 # 270| r270_8(void *) = Call[memcpy] : func:r270_1, 0:r270_3, 1:r270_5, 2:r270_7 # 270| v270_9(void) = ^SizedBufferReadSideEffect[1] : &:r270_5, r270_7, ~m268_8 # 270| m270_10(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r270_3, r270_7 # 270| m270_11(unknown) = Chi : total:m269_8, partial:m270_10 # 271| r271_1(glval) = VariableAddress[#return] : # 271| r271_2(glval) = VariableAddress[buf] : -# 271| r271_3(void *) = Load : &:r271_2, m269_9 -# 271| m271_4(void *) = Store : &:r271_1, r271_3 +# 271| r271_3(void *) = Load[buf] : &:r271_2, m269_9 +# 271| m271_4(void *) = Store[#return] : &:r271_1, r271_3 # 268| v268_11(void) = ReturnIndirection[s] : &:r268_7, m268_8 # 268| r268_12(glval) = VariableAddress[#return] : # 268| v268_13(void) = ReturnValue : &:r268_12, m271_4 @@ -1245,29 +1245,29 @@ ssa.cpp: # 276| m276_2(Point) = Uninitialized[a] : &:r276_1 # 276| r276_3(glval) = FieldAddress[x] : r276_1 # 276| r276_4(int) = Constant[0] : -# 276| m276_5(int) = Store : &:r276_3, r276_4 +# 276| m276_5(int) = Store[?] : &:r276_3, r276_4 # 276| m276_6(Point) = Chi : total:m276_2, partial:m276_5 # 276| r276_7(glval) = FieldAddress[y] : r276_1 # 276| r276_8(int) = Constant[0] : -# 276| m276_9(int) = Store : &:r276_7, r276_8 +# 276| m276_9(int) = Store[?] : &:r276_7, r276_8 # 276| m276_10(Point) = Chi : total:m276_6, partial:m276_9 # 277| r277_1(glval) = VariableAddress[a] : # 277| r277_2(Point *) = CopyValue : r277_1 # 277| r277_3(glval) = VariableAddress[pp] : -# 277| m277_4(Point *) = Store : &:r277_3, r277_2 +# 277| m277_4(Point *) = Store[pp] : &:r277_3, r277_2 # 277| m277_5(unknown) = Chi : total:m275_4, partial:m277_4 # 278| r278_1(glval) = VariableAddress[c] : -# 278| r278_2(bool) = Load : &:r278_1, m275_6 +# 278| r278_2(bool) = Load[c] : &:r278_1, m275_6 # 278| v278_3(void) = ConditionalBranch : r278_2 #-----| False -> Block 2 #-----| True -> Block 1 # 279| Block 1 # 279| r279_1(glval) = VariableAddress[x1] : -# 279| r279_2(int) = Load : &:r279_1, m275_10 +# 279| r279_2(int) = Load[x1] : &:r279_1, m275_10 # 279| r279_3(glval) = VariableAddress[a] : # 279| r279_4(glval) = FieldAddress[x] : r279_3 -# 279| m279_5(int) = Store : &:r279_4, r279_2 +# 279| m279_5(int) = Store[?] : &:r279_4, r279_2 # 279| m279_6(Point) = Chi : total:m276_10, partial:m279_5 #-----| Goto -> Block 2 @@ -1277,8 +1277,8 @@ ssa.cpp: # 281| r281_3(glval) = VariableAddress[x] : # 281| r281_4(glval) = VariableAddress[a] : # 281| r281_5(glval) = FieldAddress[x] : r281_4 -# 281| r281_6(int) = Load : &:r281_5, m281_1 -# 281| m281_7(int) = Store : &:r281_3, r281_6 +# 281| r281_6(int) = Load[?] : &:r281_5, m281_1 +# 281| m281_7(int) = Store[x] : &:r281_3, r281_6 # 282| v282_1(void) = NoOp : # 275| v275_11(void) = ReturnVoid : # 275| v275_12(void) = AliasedUse : ~m277_5 @@ -1292,7 +1292,7 @@ ssa.cpp: # 286| m286_4(unknown) = Chi : total:m286_2, partial:m286_3 # 286| r286_5(glval) = VariableAddress[#this] : # 286| m286_6(glval) = InitializeParameter[#this] : &:r286_5 -# 286| r286_7(glval) = Load : &:r286_5, m286_6 +# 286| r286_7(glval) = Load[#this] : &:r286_5, m286_6 # 286| m286_8(A) = InitializeIndirection[#this] : &:r286_7 # 286| r286_9(glval) = VariableAddress[x] : # 286| m286_10(int) = InitializeParameter[x] : &:r286_9 @@ -1310,11 +1310,11 @@ ssa.cpp: # 287| m287_4(unknown) = Chi : total:m287_2, partial:m287_3 # 287| r287_5(glval) = VariableAddress[#this] : # 287| m287_6(glval) = InitializeParameter[#this] : &:r287_5 -# 287| r287_7(glval) = Load : &:r287_5, m287_6 +# 287| r287_7(glval) = Load[#this] : &:r287_5, m287_6 # 287| m287_8(A) = InitializeIndirection[#this] : &:r287_7 # 287| r287_9(glval) = VariableAddress[p#0] : # 287| m287_10(A *) = InitializeParameter[p#0] : &:r287_9 -# 287| r287_11(A *) = Load : &:r287_9, m287_10 +# 287| r287_11(A *) = Load[p#0] : &:r287_9, m287_10 # 287| m287_12(unknown) = InitializeIndirection[p#0] : &:r287_11 # 287| v287_13(void) = NoOp : # 287| v287_14(void) = ReturnIndirection[#this] : &:r287_7, m287_8 @@ -1331,7 +1331,7 @@ ssa.cpp: # 288| m288_4(unknown) = Chi : total:m288_2, partial:m288_3 # 288| r288_5(glval) = VariableAddress[#this] : # 288| m288_6(glval) = InitializeParameter[#this] : &:r288_5 -# 288| r288_7(glval) = Load : &:r288_5, m288_6 +# 288| r288_7(glval) = Load[#this] : &:r288_5, m288_6 # 288| m288_8(A) = InitializeIndirection[#this] : &:r288_7 # 288| v288_9(void) = NoOp : # 288| v288_10(void) = ReturnIndirection[#this] : &:r288_7, m288_8 @@ -1355,7 +1355,7 @@ ssa.cpp: # 292| m292_6(unknown) = Chi : total:m291_4, partial:m292_5 # 292| m292_7(unknown) = ^InitializeDynamicAllocation : &:r292_4 # 292| r292_8(Point *) = Convert : r292_4 -# 292| m292_9(Point *) = Store : &:r292_1, r292_8 +# 292| m292_9(Point *) = Store[p] : &:r292_1, r292_8 # 293| r293_1(glval) = VariableAddress[q] : # 293| r293_2(glval) = FunctionAddress[operator new] : # 293| r293_3(unsigned long) = Constant[8] : @@ -1364,7 +1364,7 @@ ssa.cpp: # 293| m293_6(unknown) = Chi : total:m292_6, partial:m293_5 # 293| m293_7(unknown) = ^InitializeDynamicAllocation : &:r293_4 # 293| r293_8(Point *) = Convert : r293_4 -# 293| m293_9(Point *) = Store : &:r293_1, r293_8 +# 293| m293_9(Point *) = Store[q] : &:r293_1, r293_8 # 294| r294_1(glval) = VariableAddress[j] : # 294| r294_2(glval) = FunctionAddress[operator new] : # 294| r294_3(unsigned long) = Constant[4] : @@ -1383,7 +1383,7 @@ ssa.cpp: # 294| r294_16(A *) = Convert : r294_12 # 294| r294_17(glval) = FunctionAddress[A] : # 294| r294_18(glval) = VariableAddress[x] : -# 294| r294_19(int) = Load : &:r294_18, m291_6 +# 294| r294_19(int) = Load[x] : &:r294_18, m291_6 # 294| v294_20(void) = Call[A] : func:r294_17, this:r294_16, 0:r294_19 # 294| m294_21(unknown) = ^CallSideEffect : ~m294_14 # 294| m294_22(unknown) = Chi : total:m294_14, partial:m294_21 @@ -1398,8 +1398,8 @@ ssa.cpp: # 294| m294_31(unknown) = ^BufferMayWriteSideEffect[0] : &:r294_16 # 294| m294_32(unknown) = Chi : total:m294_24, partial:m294_31 # 294| r294_33(glval) = FieldAddress[i] : r294_8 -# 294| r294_34(int) = Load : &:r294_33, ~m294_29 -# 294| m294_35(int) = Store : &:r294_1, r294_34 +# 294| r294_34(int) = Load[?] : &:r294_33, ~m294_29 +# 294| m294_35(int) = Store[j] : &:r294_1, r294_34 # 295| r295_1(glval) = VariableAddress[a] : # 295| r295_2(glval) = FunctionAddress[operator new] : # 295| r295_3(unsigned long) = Constant[4] : @@ -1414,11 +1414,11 @@ ssa.cpp: # 295| m295_12(unknown) = Chi : total:m295_6, partial:m295_11 # 295| m295_13(A) = ^IndirectMayWriteSideEffect[-1] : &:r295_8 # 295| m295_14(unknown) = Chi : total:m295_7, partial:m295_13 -# 295| m295_15(A *) = Store : &:r295_1, r295_8 +# 295| m295_15(A *) = Store[a] : &:r295_1, r295_8 # 296| r296_1(glval) = VariableAddress[#return] : # 296| r296_2(glval) = VariableAddress[p] : -# 296| r296_3(Point *) = Load : &:r296_2, m292_9 -# 296| m296_4(Point *) = Store : &:r296_1, r296_3 +# 296| r296_3(Point *) = Load[p] : &:r296_2, m292_9 +# 296| m296_4(Point *) = Store[#return] : &:r296_1, r296_3 # 291| r291_7(glval) = VariableAddress[#return] : # 291| v291_8(void) = ReturnValue : &:r291_7, m296_4 # 291| v291_9(void) = AliasedUse : ~m295_12 @@ -1434,13 +1434,13 @@ ssa.cpp: # 301| m301_6(int) = InitializeParameter[argc] : &:r301_5 # 301| r301_7(glval) = VariableAddress[argv] : # 301| m301_8(char **) = InitializeParameter[argv] : &:r301_7 -# 301| r301_9(char **) = Load : &:r301_7, m301_8 +# 301| r301_9(char **) = Load[argv] : &:r301_7, m301_8 # 301| m301_10(unknown) = InitializeIndirection[argv] : &:r301_9 # 302| r302_1(glval) = FunctionAddress[unknownFunction] : # 302| r302_2(glval) = VariableAddress[argc] : -# 302| r302_3(int) = Load : &:r302_2, m301_6 +# 302| r302_3(int) = Load[argc] : &:r302_2, m301_6 # 302| r302_4(glval) = VariableAddress[argv] : -# 302| r302_5(char **) = Load : &:r302_4, m301_8 +# 302| r302_5(char **) = Load[argv] : &:r302_4, m301_8 # 302| v302_6(void) = Call[unknownFunction] : func:r302_1, 0:r302_3, 1:r302_5 # 302| m302_7(unknown) = ^CallSideEffect : ~m301_4 # 302| m302_8(unknown) = Chi : total:m301_4, partial:m302_7 @@ -1449,9 +1449,9 @@ ssa.cpp: # 302| m302_11(unknown) = Chi : total:m301_10, partial:m302_10 # 303| r303_1(glval) = FunctionAddress[unknownFunction] : # 303| r303_2(glval) = VariableAddress[argc] : -# 303| r303_3(int) = Load : &:r303_2, m301_6 +# 303| r303_3(int) = Load[argc] : &:r303_2, m301_6 # 303| r303_4(glval) = VariableAddress[argv] : -# 303| r303_5(char **) = Load : &:r303_4, m301_8 +# 303| r303_5(char **) = Load[argv] : &:r303_4, m301_8 # 303| v303_6(void) = Call[unknownFunction] : func:r303_1, 0:r303_3, 1:r303_5 # 303| m303_7(unknown) = ^CallSideEffect : ~m302_8 # 303| m303_8(unknown) = Chi : total:m302_8, partial:m303_7 @@ -1460,11 +1460,11 @@ ssa.cpp: # 303| m303_11(unknown) = Chi : total:m302_11, partial:m303_10 # 304| r304_1(glval) = VariableAddress[#return] : # 304| r304_2(glval) = VariableAddress[argv] : -# 304| r304_3(char **) = Load : &:r304_2, m301_8 -# 304| r304_4(char *) = Load : &:r304_3, ~m303_11 -# 304| r304_5(char) = Load : &:r304_4, ~m303_8 +# 304| r304_3(char **) = Load[argv] : &:r304_2, m301_8 +# 304| r304_4(char *) = Load[?] : &:r304_3, ~m303_11 +# 304| r304_5(char) = Load[?] : &:r304_4, ~m303_8 # 304| r304_6(int) = Convert : r304_5 -# 304| m304_7(int) = Store : &:r304_1, r304_6 +# 304| m304_7(int) = Store[#return] : &:r304_1, r304_6 # 301| v301_11(void) = ReturnIndirection[argv] : &:r301_9, m303_11 # 301| r301_12(glval) = VariableAddress[#return] : # 301| v301_13(void) = ReturnValue : &:r301_12, m304_7 @@ -1479,16 +1479,16 @@ ssa.cpp: # 310| m310_4(unknown) = Chi : total:m310_2, partial:m310_3 # 310| r310_5(glval) = VariableAddress[#this] : # 310| m310_6(glval) = InitializeParameter[#this] : &:r310_5 -# 310| r310_7(glval) = Load : &:r310_5, m310_6 +# 310| r310_7(glval) = Load[#this] : &:r310_5, m310_6 # 310| m310_8(ThisAliasTest) = InitializeIndirection[#this] : &:r310_7 # 310| r310_9(glval) = VariableAddress[arg] : # 310| m310_10(int) = InitializeParameter[arg] : &:r310_9 # 311| r311_1(glval) = VariableAddress[arg] : -# 311| r311_2(int) = Load : &:r311_1, m310_10 +# 311| r311_2(int) = Load[arg] : &:r311_1, m310_10 # 311| r311_3(glval) = VariableAddress[#this] : -# 311| r311_4(ThisAliasTest *) = Load : &:r311_3, m310_6 +# 311| r311_4(ThisAliasTest *) = Load[#this] : &:r311_3, m310_6 # 311| r311_5(glval) = FieldAddress[x] : r311_4 -# 311| m311_6(int) = Store : &:r311_5, r311_2 +# 311| m311_6(int) = Store[?] : &:r311_5, r311_2 # 311| m311_7(unknown) = Chi : total:m310_8, partial:m311_6 # 312| v312_1(void) = NoOp : # 310| v310_11(void) = ReturnIndirection[#this] : &:r310_7, m311_7 diff --git a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected index 9157b211d5b8..a1f345878c80 100644 --- a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected +++ b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected @@ -6,77 +6,77 @@ ssa.cpp: # 13| mu13_3(unknown) = InitializeNonLocal : # 13| r13_4(glval) = VariableAddress[p] : # 13| m13_5(Point *) = InitializeParameter[p] : &:r13_4 -# 13| r13_6(Point *) = Load : &:r13_4, m13_5 +# 13| r13_6(Point *) = Load[p] : &:r13_4, m13_5 # 13| mu13_7(unknown) = InitializeIndirection[p] : &:r13_6 # 13| r13_8(glval) = VariableAddress[which1] : # 13| m13_9(bool) = InitializeParameter[which1] : &:r13_8 # 13| r13_10(glval) = VariableAddress[which2] : # 13| m13_11(bool) = InitializeParameter[which2] : &:r13_10 # 14| r14_1(glval) = VariableAddress[which1] : -# 14| r14_2(bool) = Load : &:r14_1, m13_9 +# 14| r14_2(bool) = Load[which1] : &:r14_1, m13_9 # 14| v14_3(void) = ConditionalBranch : r14_2 #-----| False -> Block 2 #-----| True -> Block 1 # 15| Block 1 # 15| r15_1(glval) = VariableAddress[p] : -# 15| r15_2(Point *) = Load : &:r15_1, m13_5 +# 15| r15_2(Point *) = Load[p] : &:r15_1, m13_5 # 15| r15_3(glval) = FieldAddress[x] : r15_2 -# 15| r15_4(int) = Load : &:r15_3, ~m? +# 15| r15_4(int) = Load[?] : &:r15_3, ~m? # 15| r15_5(int) = Constant[1] : # 15| r15_6(int) = Add : r15_4, r15_5 -# 15| mu15_7(int) = Store : &:r15_3, r15_6 +# 15| mu15_7(int) = Store[?] : &:r15_3, r15_6 #-----| Goto -> Block 3 # 18| Block 2 # 18| r18_1(glval) = VariableAddress[p] : -# 18| r18_2(Point *) = Load : &:r18_1, m13_5 +# 18| r18_2(Point *) = Load[p] : &:r18_1, m13_5 # 18| r18_3(glval) = FieldAddress[y] : r18_2 -# 18| r18_4(int) = Load : &:r18_3, ~m? +# 18| r18_4(int) = Load[?] : &:r18_3, ~m? # 18| r18_5(int) = Constant[1] : # 18| r18_6(int) = Add : r18_4, r18_5 -# 18| mu18_7(int) = Store : &:r18_3, r18_6 +# 18| mu18_7(int) = Store[?] : &:r18_3, r18_6 #-----| Goto -> Block 3 # 21| Block 3 # 21| r21_1(glval) = VariableAddress[which2] : -# 21| r21_2(bool) = Load : &:r21_1, m13_11 +# 21| r21_2(bool) = Load[which2] : &:r21_1, m13_11 # 21| v21_3(void) = ConditionalBranch : r21_2 #-----| False -> Block 5 #-----| True -> Block 4 # 22| Block 4 # 22| r22_1(glval) = VariableAddress[p] : -# 22| r22_2(Point *) = Load : &:r22_1, m13_5 +# 22| r22_2(Point *) = Load[p] : &:r22_1, m13_5 # 22| r22_3(glval) = FieldAddress[x] : r22_2 -# 22| r22_4(int) = Load : &:r22_3, ~m? +# 22| r22_4(int) = Load[?] : &:r22_3, ~m? # 22| r22_5(int) = Constant[1] : # 22| r22_6(int) = Add : r22_4, r22_5 -# 22| mu22_7(int) = Store : &:r22_3, r22_6 +# 22| mu22_7(int) = Store[?] : &:r22_3, r22_6 #-----| Goto -> Block 6 # 25| Block 5 # 25| r25_1(glval) = VariableAddress[p] : -# 25| r25_2(Point *) = Load : &:r25_1, m13_5 +# 25| r25_2(Point *) = Load[p] : &:r25_1, m13_5 # 25| r25_3(glval) = FieldAddress[y] : r25_2 -# 25| r25_4(int) = Load : &:r25_3, ~m? +# 25| r25_4(int) = Load[?] : &:r25_3, ~m? # 25| r25_5(int) = Constant[1] : # 25| r25_6(int) = Add : r25_4, r25_5 -# 25| mu25_7(int) = Store : &:r25_3, r25_6 +# 25| mu25_7(int) = Store[?] : &:r25_3, r25_6 #-----| Goto -> Block 6 # 28| Block 6 # 28| r28_1(glval) = VariableAddress[#return] : # 28| r28_2(glval) = VariableAddress[p] : -# 28| r28_3(Point *) = Load : &:r28_2, m13_5 +# 28| r28_3(Point *) = Load[p] : &:r28_2, m13_5 # 28| r28_4(glval) = FieldAddress[x] : r28_3 -# 28| r28_5(int) = Load : &:r28_4, ~m? +# 28| r28_5(int) = Load[?] : &:r28_4, ~m? # 28| r28_6(glval) = VariableAddress[p] : -# 28| r28_7(Point *) = Load : &:r28_6, m13_5 +# 28| r28_7(Point *) = Load[p] : &:r28_6, m13_5 # 28| r28_8(glval) = FieldAddress[y] : r28_7 -# 28| r28_9(int) = Load : &:r28_8, ~m? +# 28| r28_9(int) = Load[?] : &:r28_8, ~m? # 28| r28_10(int) = Add : r28_5, r28_9 -# 28| m28_11(int) = Store : &:r28_1, r28_10 +# 28| m28_11(int) = Store[#return] : &:r28_1, r28_10 # 13| v13_12(void) = ReturnIndirection[p] : &:r13_6, ~m? # 13| r13_13(glval) = VariableAddress[#return] : # 13| v13_14(void) = ReturnValue : &:r13_13, m28_11 @@ -92,7 +92,7 @@ ssa.cpp: # 34| v34_1(void) = NoOp : # 35| r35_1(glval) = VariableAddress[#return] : # 35| r35_2(int) = Constant[0] : -# 35| m35_3(int) = Store : &:r35_1, r35_2 +# 35| m35_3(int) = Store[#return] : &:r35_1, r35_2 # 31| r31_4(glval) = VariableAddress[#return] : # 31| v31_5(void) = ReturnValue : &:r31_4, m35_3 # 31| v31_6(void) = AliasedUse : ~m? @@ -107,12 +107,12 @@ ssa.cpp: # 38| m38_5(bool) = InitializeParameter[b] : &:r38_4 # 39| r39_1(glval) = VariableAddress[x] : # 39| r39_2(int) = Constant[5] : -# 39| m39_3(int) = Store : &:r39_1, r39_2 +# 39| m39_3(int) = Store[x] : &:r39_1, r39_2 # 40| r40_1(glval) = VariableAddress[y] : # 40| r40_2(int) = Constant[10] : -# 40| m40_3(int) = Store : &:r40_1, r40_2 +# 40| m40_3(int) = Store[y] : &:r40_1, r40_2 # 41| r41_1(glval) = VariableAddress[b] : -# 41| r41_2(bool) = Load : &:r41_1, m38_5 +# 41| r41_2(bool) = Load[b] : &:r41_1, m38_5 # 41| v41_3(void) = ConditionalBranch : r41_2 #-----| False -> Block 5 #-----| True -> Block 2 @@ -126,9 +126,9 @@ ssa.cpp: # 42| Block 2 # 42| r42_1(glval) = VariableAddress[x] : -# 42| r42_2(int) = Load : &:r42_1, m39_3 +# 42| r42_2(int) = Load[x] : &:r42_1, m39_3 # 42| r42_3(glval) = VariableAddress[y] : -# 42| r42_4(int) = Load : &:r42_3, m40_3 +# 42| r42_4(int) = Load[y] : &:r42_3, m40_3 # 42| r42_5(bool) = CompareEQ : r42_2, r42_4 # 42| v42_6(void) = ConditionalBranch : r42_5 #-----| False -> Block 4 @@ -137,20 +137,20 @@ ssa.cpp: # 43| Block 3 # 43| r43_1(glval) = VariableAddress[#return] : # 43| r43_2(int) = Constant[1] : -# 43| m43_3(int) = Store : &:r43_1, r43_2 +# 43| m43_3(int) = Store[#return] : &:r43_1, r43_2 #-----| Goto -> Block 1 # 46| Block 4 # 46| r46_1(glval) = VariableAddress[#return] : # 46| r46_2(int) = Constant[0] : -# 46| m46_3(int) = Store : &:r46_1, r46_2 +# 46| m46_3(int) = Store[#return] : &:r46_1, r46_2 #-----| Goto -> Block 1 # 50| Block 5 # 50| r50_1(glval) = VariableAddress[x] : -# 50| r50_2(int) = Load : &:r50_1, m39_3 +# 50| r50_2(int) = Load[x] : &:r50_1, m39_3 # 50| r50_3(glval) = VariableAddress[y] : -# 50| r50_4(int) = Load : &:r50_3, m40_3 +# 50| r50_4(int) = Load[y] : &:r50_3, m40_3 # 50| r50_5(bool) = CompareLT : r50_2, r50_4 # 50| v50_6(void) = ConditionalBranch : r50_5 #-----| False -> Block 7 @@ -159,13 +159,13 @@ ssa.cpp: # 51| Block 6 # 51| r51_1(glval) = VariableAddress[#return] : # 51| r51_2(int) = Constant[0] : -# 51| m51_3(int) = Store : &:r51_1, r51_2 +# 51| m51_3(int) = Store[#return] : &:r51_1, r51_2 #-----| Goto -> Block 1 # 54| Block 7 # 54| r54_1(glval) = VariableAddress[#return] : # 54| r54_2(int) = Constant[1] : -# 54| m54_3(int) = Store : &:r54_1, r54_2 +# 54| m54_3(int) = Store[#return] : &:r54_1, r54_2 #-----| Goto -> Block 1 # 59| int DoWhileFalse() @@ -175,12 +175,12 @@ ssa.cpp: # 59| mu59_3(unknown) = InitializeNonLocal : # 60| r60_1(glval) = VariableAddress[i] : # 60| r60_2(int) = Constant[0] : -# 60| m60_3(int) = Store : &:r60_1, r60_2 +# 60| m60_3(int) = Store[i] : &:r60_1, r60_2 # 62| r62_1(glval) = VariableAddress[i] : -# 62| r62_2(int) = Load : &:r62_1, m60_3 +# 62| r62_2(int) = Load[i] : &:r62_1, m60_3 # 62| r62_3(int) = Constant[1] : # 62| r62_4(int) = Add : r62_2, r62_3 -# 62| m62_5(int) = Store : &:r62_1, r62_4 +# 62| m62_5(int) = Store[i] : &:r62_1, r62_4 # 63| r63_1(bool) = Constant[0] : # 63| v63_2(void) = ConditionalBranch : r63_1 #-----| False -> Block 1 @@ -189,8 +189,8 @@ ssa.cpp: # 65| Block 1 # 65| r65_1(glval) = VariableAddress[#return] : # 65| r65_2(glval) = VariableAddress[i] : -# 65| r65_3(int) = Load : &:r65_2, m62_5 -# 65| m65_4(int) = Store : &:r65_1, r65_3 +# 65| r65_3(int) = Load[i] : &:r65_2, m62_5 +# 65| m65_4(int) = Store[#return] : &:r65_1, r65_3 # 59| r59_4(glval) = VariableAddress[#return] : # 59| v59_5(void) = ReturnValue : &:r59_4, m65_4 # 59| v59_6(void) = AliasedUse : ~m? @@ -208,7 +208,7 @@ ssa.cpp: # 68| m68_5(int) = InitializeParameter[n] : &:r68_4 # 68| r68_6(glval) = VariableAddress[p] : # 68| m68_7(char *) = InitializeParameter[p] : &:r68_6 -# 68| r68_8(char *) = Load : &:r68_6, m68_7 +# 68| r68_8(char *) = Load[p] : &:r68_6, m68_7 # 68| mu68_9(unknown) = InitializeIndirection[p] : &:r68_8 #-----| Goto -> Block 1 @@ -216,10 +216,10 @@ ssa.cpp: # 69| m69_1(char *) = Phi : from 0:m68_7, from 2:m70_6 # 69| m69_2(int) = Phi : from 0:m68_5, from 2:m69_7 # 69| r69_3(glval) = VariableAddress[n] : -# 69| r69_4(int) = Load : &:r69_3, m69_2 +# 69| r69_4(int) = Load[n] : &:r69_3, m69_2 # 69| r69_5(int) = Constant[1] : # 69| r69_6(int) = Sub : r69_4, r69_5 -# 69| m69_7(int) = Store : &:r69_3, r69_6 +# 69| m69_7(int) = Store[n] : &:r69_3, r69_6 # 69| r69_8(int) = CopyValue : r69_4 # 69| r69_9(int) = Constant[0] : # 69| r69_10(bool) = CompareGT : r69_8, r69_9 @@ -230,13 +230,13 @@ ssa.cpp: # 70| Block 2 # 70| r70_1(char) = Constant[0] : # 70| r70_2(glval) = VariableAddress[p] : -# 70| r70_3(char *) = Load : &:r70_2, m69_1 +# 70| r70_3(char *) = Load[p] : &:r70_2, m69_1 # 70| r70_4(int) = Constant[1] : # 70| r70_5(char *) = PointerAdd[1] : r70_3, r70_4 -# 70| m70_6(char *) = Store : &:r70_2, r70_5 +# 70| m70_6(char *) = Store[p] : &:r70_2, r70_5 # 70| r70_7(char *) = CopyValue : r70_3 # 70| r70_8(glval) = CopyValue : r70_7 -# 70| mu70_9(char) = Store : &:r70_8, r70_1 +# 70| mu70_9(char) = Store[?] : &:r70_8, r70_1 #-----| Goto (back edge) -> Block 1 # 71| Block 3 @@ -255,15 +255,15 @@ ssa.cpp: # 75| m75_5(bool) = InitializeParameter[b] : &:r75_4 # 76| r76_1(glval) = VariableAddress[x] : # 76| r76_2(int) = Constant[0] : -# 76| m76_3(int) = Store : &:r76_1, r76_2 +# 76| m76_3(int) = Store[x] : &:r76_1, r76_2 # 77| r77_1(glval) = VariableAddress[y] : # 77| r77_2(int) = Constant[1] : -# 77| m77_3(int) = Store : &:r77_1, r77_2 +# 77| m77_3(int) = Store[y] : &:r77_1, r77_2 # 78| r78_1(glval) = VariableAddress[z] : # 78| r78_2(int) = Constant[2] : -# 78| m78_3(int) = Store : &:r78_1, r78_2 +# 78| m78_3(int) = Store[z] : &:r78_1, r78_2 # 79| r79_1(glval) = VariableAddress[b] : -# 79| r79_2(bool) = Load : &:r79_1, m75_5 +# 79| r79_2(bool) = Load[b] : &:r79_1, m75_5 # 79| v79_3(void) = ConditionalBranch : r79_2 #-----| False -> Block 2 #-----| True -> Block 1 @@ -271,16 +271,16 @@ ssa.cpp: # 80| Block 1 # 80| r80_1(int) = Constant[3] : # 80| r80_2(glval) = VariableAddress[x] : -# 80| m80_3(int) = Store : &:r80_2, r80_1 +# 80| m80_3(int) = Store[x] : &:r80_2, r80_1 # 81| r81_1(int) = Constant[4] : # 81| r81_2(glval) = VariableAddress[y] : -# 81| m81_3(int) = Store : &:r81_2, r81_1 +# 81| m81_3(int) = Store[y] : &:r81_2, r81_1 #-----| Goto -> Block 3 # 84| Block 2 # 84| r84_1(int) = Constant[5] : # 84| r84_2(glval) = VariableAddress[x] : -# 84| m84_3(int) = Store : &:r84_2, r84_1 +# 84| m84_3(int) = Store[x] : &:r84_2, r84_1 #-----| Goto -> Block 3 # 86| Block 3 @@ -288,16 +288,16 @@ ssa.cpp: # 86| m86_2(int) = Phi : from 1:m80_3, from 2:m84_3 # 86| r86_3(glval) = VariableAddress[x_merge] : # 86| r86_4(glval) = VariableAddress[x] : -# 86| r86_5(int) = Load : &:r86_4, m86_2 -# 86| m86_6(int) = Store : &:r86_3, r86_5 +# 86| r86_5(int) = Load[x] : &:r86_4, m86_2 +# 86| m86_6(int) = Store[x_merge] : &:r86_3, r86_5 # 87| r87_1(glval) = VariableAddress[y_merge] : # 87| r87_2(glval) = VariableAddress[y] : -# 87| r87_3(int) = Load : &:r87_2, m86_1 -# 87| m87_4(int) = Store : &:r87_1, r87_3 +# 87| r87_3(int) = Load[y] : &:r87_2, m86_1 +# 87| m87_4(int) = Store[y_merge] : &:r87_1, r87_3 # 88| r88_1(glval) = VariableAddress[z_merge] : # 88| r88_2(glval) = VariableAddress[z] : -# 88| r88_3(int) = Load : &:r88_2, m78_3 -# 88| m88_4(int) = Store : &:r88_1, r88_3 +# 88| r88_3(int) = Load[z] : &:r88_2, m78_3 +# 88| m88_4(int) = Store[z_merge] : &:r88_1, r88_3 # 89| v89_1(void) = NoOp : # 75| v75_6(void) = ReturnVoid : # 75| v75_7(void) = AliasedUse : ~m? @@ -312,8 +312,8 @@ ssa.cpp: # 91| m91_5(Point) = InitializeParameter[a] : &:r91_4 # 92| r92_1(glval) = VariableAddress[b] : # 92| r92_2(glval) = VariableAddress[a] : -# 92| r92_3(Point) = Load : &:r92_2, m91_5 -# 92| m92_4(Point) = Store : &:r92_1, r92_3 +# 92| r92_3(Point) = Load[a] : &:r92_2, m91_5 +# 92| m92_4(Point) = Store[b] : &:r92_1, r92_3 # 93| v93_1(void) = NoOp : # 91| v91_6(void) = ReturnVoid : # 91| v91_7(void) = AliasedUse : ~m? @@ -328,8 +328,8 @@ ssa.cpp: # 95| mu95_5(Point) = InitializeParameter[a] : &:r95_4 # 96| r96_1(glval) = VariableAddress[b] : # 96| r96_2(glval) = VariableAddress[a] : -# 96| r96_3(Point) = Load : &:r96_2, ~m? -# 96| m96_4(Point) = Store : &:r96_1, r96_3 +# 96| r96_3(Point) = Load[a] : &:r96_2, ~m? +# 96| m96_4(Point) = Store[b] : &:r96_1, r96_3 # 97| r97_1(glval) = FunctionAddress[Escape] : # 97| r97_2(glval) = VariableAddress[a] : # 97| r97_3(Point *) = CopyValue : r97_2 @@ -353,13 +353,13 @@ ssa.cpp: # 101| r101_1(glval) = VariableAddress[x] : # 101| r101_2(glval) = VariableAddress[a] : # 101| r101_3(glval) = FieldAddress[x] : r101_2 -# 101| r101_4(int) = Load : &:r101_3, ~m? -# 101| m101_5(int) = Store : &:r101_1, r101_4 +# 101| r101_4(int) = Load[?] : &:r101_3, ~m? +# 101| m101_5(int) = Store[x] : &:r101_1, r101_4 # 102| r102_1(glval) = VariableAddress[y] : # 102| r102_2(glval) = VariableAddress[a] : # 102| r102_3(glval) = FieldAddress[y] : r102_2 -# 102| r102_4(int) = Load : &:r102_3, ~m? -# 102| m102_5(int) = Store : &:r102_1, r102_4 +# 102| r102_4(int) = Load[?] : &:r102_3, ~m? +# 102| m102_5(int) = Store[y] : &:r102_1, r102_4 # 103| v103_1(void) = NoOp : # 100| v100_6(void) = ReturnVoid : # 100| v100_7(void) = AliasedUse : ~m? @@ -375,13 +375,13 @@ ssa.cpp: # 106| r106_1(glval) = VariableAddress[x] : # 106| r106_2(glval) = VariableAddress[a] : # 106| r106_3(glval) = FieldAddress[x] : r106_2 -# 106| r106_4(int) = Load : &:r106_3, ~m? -# 106| m106_5(int) = Store : &:r106_1, r106_4 +# 106| r106_4(int) = Load[?] : &:r106_3, ~m? +# 106| m106_5(int) = Store[x] : &:r106_1, r106_4 # 107| r107_1(glval) = VariableAddress[y] : # 107| r107_2(glval) = VariableAddress[a] : # 107| r107_3(glval) = FieldAddress[y] : r107_2 -# 107| r107_4(int) = Load : &:r107_3, ~m? -# 107| m107_5(int) = Store : &:r107_1, r107_4 +# 107| r107_4(int) = Load[?] : &:r107_3, ~m? +# 107| m107_5(int) = Store[y] : &:r107_1, r107_4 # 108| r108_1(glval) = FunctionAddress[Escape] : # 108| r108_2(glval) = VariableAddress[a] : # 108| r108_3(Point *) = CopyValue : r108_2 @@ -408,16 +408,16 @@ ssa.cpp: # 112| mu112_2(Point) = Uninitialized[a] : &:r112_1 # 112| r112_3(glval) = FieldAddress[x] : r112_1 # 112| r112_4(glval) = VariableAddress[x] : -# 112| r112_5(int) = Load : &:r112_4, m111_5 -# 112| mu112_6(int) = Store : &:r112_3, r112_5 +# 112| r112_5(int) = Load[x] : &:r112_4, m111_5 +# 112| mu112_6(int) = Store[?] : &:r112_3, r112_5 # 112| r112_7(glval) = FieldAddress[y] : r112_1 # 112| r112_8(glval) = VariableAddress[y] : -# 112| r112_9(int) = Load : &:r112_8, m111_7 -# 112| mu112_10(int) = Store : &:r112_7, r112_9 +# 112| r112_9(int) = Load[y] : &:r112_8, m111_7 +# 112| mu112_10(int) = Store[?] : &:r112_7, r112_9 # 113| r113_1(glval) = VariableAddress[b] : # 113| r113_2(glval) = VariableAddress[a] : -# 113| r113_3(Point) = Load : &:r113_2, ~m? -# 113| m113_4(Point) = Store : &:r113_1, r113_3 +# 113| r113_3(Point) = Load[a] : &:r113_2, ~m? +# 113| m113_4(Point) = Store[b] : &:r113_1, r113_3 # 114| v114_1(void) = NoOp : # 111| v111_8(void) = ReturnVoid : # 111| v111_9(void) = AliasedUse : ~m? @@ -436,16 +436,16 @@ ssa.cpp: # 117| mu117_2(Point) = Uninitialized[a] : &:r117_1 # 117| r117_3(glval) = FieldAddress[x] : r117_1 # 117| r117_4(glval) = VariableAddress[x] : -# 117| r117_5(int) = Load : &:r117_4, m116_5 -# 117| mu117_6(int) = Store : &:r117_3, r117_5 +# 117| r117_5(int) = Load[x] : &:r117_4, m116_5 +# 117| mu117_6(int) = Store[?] : &:r117_3, r117_5 # 117| r117_7(glval) = FieldAddress[y] : r117_1 # 117| r117_8(glval) = VariableAddress[y] : -# 117| r117_9(int) = Load : &:r117_8, m116_7 -# 117| mu117_10(int) = Store : &:r117_7, r117_9 +# 117| r117_9(int) = Load[y] : &:r117_8, m116_7 +# 117| mu117_10(int) = Store[?] : &:r117_7, r117_9 # 118| r118_1(glval) = VariableAddress[b] : # 118| r118_2(glval) = VariableAddress[a] : -# 118| r118_3(Point) = Load : &:r118_2, ~m? -# 118| m118_4(Point) = Store : &:r118_1, r118_3 +# 118| r118_3(Point) = Load[a] : &:r118_2, ~m? +# 118| m118_4(Point) = Store[b] : &:r118_1, r118_3 # 119| r119_1(glval) = FunctionAddress[Escape] : # 119| r119_2(glval) = VariableAddress[a] : # 119| r119_3(Point *) = CopyValue : r119_2 @@ -474,42 +474,42 @@ ssa.cpp: # 123| mu123_2(Point) = Uninitialized[a] : &:r123_1 # 123| r123_3(glval) = FieldAddress[x] : r123_1 # 123| r123_4(int) = Constant[0] : -# 123| mu123_5(int) = Store : &:r123_3, r123_4 +# 123| mu123_5(int) = Store[?] : &:r123_3, r123_4 # 123| r123_6(glval) = FieldAddress[y] : r123_1 # 123| r123_7(int) = Constant[0] : -# 123| mu123_8(int) = Store : &:r123_6, r123_7 +# 123| mu123_8(int) = Store[?] : &:r123_6, r123_7 # 124| r124_1(glval) = VariableAddress[c] : -# 124| r124_2(bool) = Load : &:r124_1, m122_5 +# 124| r124_2(bool) = Load[c] : &:r124_1, m122_5 # 124| v124_3(void) = ConditionalBranch : r124_2 #-----| False -> Block 2 #-----| True -> Block 1 # 125| Block 1 # 125| r125_1(glval) = VariableAddress[x1] : -# 125| r125_2(int) = Load : &:r125_1, m122_7 +# 125| r125_2(int) = Load[x1] : &:r125_1, m122_7 # 125| r125_3(glval) = VariableAddress[a] : # 125| r125_4(glval) = FieldAddress[x] : r125_3 -# 125| mu125_5(int) = Store : &:r125_4, r125_2 +# 125| mu125_5(int) = Store[?] : &:r125_4, r125_2 #-----| Goto -> Block 3 # 128| Block 2 # 128| r128_1(glval) = VariableAddress[x2] : -# 128| r128_2(int) = Load : &:r128_1, m122_9 +# 128| r128_2(int) = Load[x2] : &:r128_1, m122_9 # 128| r128_3(glval) = VariableAddress[a] : # 128| r128_4(glval) = FieldAddress[x] : r128_3 -# 128| mu128_5(int) = Store : &:r128_4, r128_2 +# 128| mu128_5(int) = Store[?] : &:r128_4, r128_2 #-----| Goto -> Block 3 # 130| Block 3 # 130| r130_1(glval) = VariableAddress[x] : # 130| r130_2(glval) = VariableAddress[a] : # 130| r130_3(glval) = FieldAddress[x] : r130_2 -# 130| r130_4(int) = Load : &:r130_3, ~m? -# 130| m130_5(int) = Store : &:r130_1, r130_4 +# 130| r130_4(int) = Load[?] : &:r130_3, ~m? +# 130| m130_5(int) = Store[x] : &:r130_1, r130_4 # 131| r131_1(glval) = VariableAddress[b] : # 131| r131_2(glval) = VariableAddress[a] : -# 131| r131_3(Point) = Load : &:r131_2, ~m? -# 131| m131_4(Point) = Store : &:r131_1, r131_3 +# 131| r131_3(Point) = Load[a] : &:r131_2, ~m? +# 131| m131_4(Point) = Store[b] : &:r131_1, r131_3 # 132| v132_1(void) = NoOp : # 122| v122_10(void) = ReturnVoid : # 122| v122_11(void) = AliasedUse : ~m? @@ -530,37 +530,37 @@ ssa.cpp: # 135| mu135_2(Point) = Uninitialized[a] : &:r135_1 # 135| r135_3(glval) = FieldAddress[x] : r135_1 # 135| r135_4(int) = Constant[0] : -# 135| mu135_5(int) = Store : &:r135_3, r135_4 +# 135| mu135_5(int) = Store[?] : &:r135_3, r135_4 # 135| r135_6(glval) = FieldAddress[y] : r135_1 # 135| r135_7(int) = Constant[0] : -# 135| mu135_8(int) = Store : &:r135_6, r135_7 +# 135| mu135_8(int) = Store[?] : &:r135_6, r135_7 # 136| r136_1(glval) = VariableAddress[c] : -# 136| r136_2(bool) = Load : &:r136_1, m134_5 +# 136| r136_2(bool) = Load[c] : &:r136_1, m134_5 # 136| v136_3(void) = ConditionalBranch : r136_2 #-----| False -> Block 2 #-----| True -> Block 1 # 137| Block 1 # 137| r137_1(glval) = VariableAddress[x1] : -# 137| r137_2(int) = Load : &:r137_1, m134_9 +# 137| r137_2(int) = Load[x1] : &:r137_1, m134_9 # 137| r137_3(glval) = VariableAddress[a] : # 137| r137_4(glval) = FieldAddress[x] : r137_3 -# 137| mu137_5(int) = Store : &:r137_4, r137_2 +# 137| mu137_5(int) = Store[?] : &:r137_4, r137_2 #-----| Goto -> Block 3 # 140| Block 2 # 140| r140_1(glval) = VariableAddress[p] : -# 140| r140_2(Point) = Load : &:r140_1, m134_7 +# 140| r140_2(Point) = Load[p] : &:r140_1, m134_7 # 140| r140_3(glval) = VariableAddress[a] : -# 140| mu140_4(Point) = Store : &:r140_3, r140_2 +# 140| mu140_4(Point) = Store[a] : &:r140_3, r140_2 #-----| Goto -> Block 3 # 142| Block 3 # 142| r142_1(glval) = VariableAddress[x] : # 142| r142_2(glval) = VariableAddress[a] : # 142| r142_3(glval) = FieldAddress[x] : r142_2 -# 142| r142_4(int) = Load : &:r142_3, ~m? -# 142| m142_5(int) = Store : &:r142_1, r142_4 +# 142| r142_4(int) = Load[?] : &:r142_3, ~m? +# 142| m142_5(int) = Store[x] : &:r142_1, r142_4 # 143| v143_1(void) = NoOp : # 134| v134_10(void) = ReturnVoid : # 134| v134_11(void) = AliasedUse : ~m? @@ -581,36 +581,36 @@ ssa.cpp: # 146| mu146_2(Point) = Uninitialized[a] : &:r146_1 # 146| r146_3(glval) = FieldAddress[x] : r146_1 # 146| r146_4(int) = Constant[0] : -# 146| mu146_5(int) = Store : &:r146_3, r146_4 +# 146| mu146_5(int) = Store[?] : &:r146_3, r146_4 # 146| r146_6(glval) = FieldAddress[y] : r146_1 # 146| r146_7(int) = Constant[0] : -# 146| mu146_8(int) = Store : &:r146_6, r146_7 +# 146| mu146_8(int) = Store[?] : &:r146_6, r146_7 # 147| r147_1(glval) = VariableAddress[c] : -# 147| r147_2(bool) = Load : &:r147_1, m145_5 +# 147| r147_2(bool) = Load[c] : &:r147_1, m145_5 # 147| v147_3(void) = ConditionalBranch : r147_2 #-----| False -> Block 2 #-----| True -> Block 1 # 148| Block 1 # 148| r148_1(glval) = VariableAddress[x1] : -# 148| r148_2(int) = Load : &:r148_1, m145_9 +# 148| r148_2(int) = Load[x1] : &:r148_1, m145_9 # 148| r148_3(glval) = VariableAddress[a] : # 148| r148_4(glval) = FieldAddress[x] : r148_3 -# 148| mu148_5(int) = Store : &:r148_4, r148_2 +# 148| mu148_5(int) = Store[?] : &:r148_4, r148_2 #-----| Goto -> Block 3 # 151| Block 2 # 151| r151_1(glval) = VariableAddress[p] : -# 151| r151_2(Point) = Load : &:r151_1, m145_7 +# 151| r151_2(Point) = Load[p] : &:r151_1, m145_7 # 151| r151_3(glval) = VariableAddress[a] : -# 151| mu151_4(Point) = Store : &:r151_3, r151_2 +# 151| mu151_4(Point) = Store[a] : &:r151_3, r151_2 #-----| Goto -> Block 3 # 153| Block 3 # 153| r153_1(glval) = VariableAddress[b] : # 153| r153_2(glval) = VariableAddress[a] : -# 153| r153_3(Point) = Load : &:r153_2, ~m? -# 153| m153_4(Point) = Store : &:r153_1, r153_3 +# 153| r153_3(Point) = Load[a] : &:r153_2, ~m? +# 153| m153_4(Point) = Store[b] : &:r153_1, r153_3 # 154| v154_1(void) = NoOp : # 145| v145_10(void) = ReturnVoid : # 145| v145_11(void) = AliasedUse : ~m? @@ -631,38 +631,38 @@ ssa.cpp: # 157| mu157_2(Rect) = Uninitialized[a] : &:r157_1 # 157| r157_3(glval) = FieldAddress[topLeft] : r157_1 # 157| r157_4(Point) = Constant[0] : -# 157| mu157_5(Point) = Store : &:r157_3, r157_4 +# 157| mu157_5(Point) = Store[?] : &:r157_3, r157_4 # 157| r157_6(glval) = FieldAddress[bottomRight] : r157_1 # 157| r157_7(Point) = Constant[0] : -# 157| mu157_8(Point) = Store : &:r157_6, r157_7 +# 157| mu157_8(Point) = Store[?] : &:r157_6, r157_7 # 158| r158_1(glval) = VariableAddress[c] : -# 158| r158_2(bool) = Load : &:r158_1, m156_5 +# 158| r158_2(bool) = Load[c] : &:r158_1, m156_5 # 158| v158_3(void) = ConditionalBranch : r158_2 #-----| False -> Block 2 #-----| True -> Block 1 # 159| Block 1 # 159| r159_1(glval) = VariableAddress[x1] : -# 159| r159_2(int) = Load : &:r159_1, m156_9 +# 159| r159_2(int) = Load[x1] : &:r159_1, m156_9 # 159| r159_3(glval) = VariableAddress[a] : # 159| r159_4(glval) = FieldAddress[topLeft] : r159_3 # 159| r159_5(glval) = FieldAddress[x] : r159_4 -# 159| mu159_6(int) = Store : &:r159_5, r159_2 +# 159| mu159_6(int) = Store[?] : &:r159_5, r159_2 #-----| Goto -> Block 3 # 162| Block 2 # 162| r162_1(glval) = VariableAddress[r] : -# 162| r162_2(Rect) = Load : &:r162_1, m156_7 +# 162| r162_2(Rect) = Load[r] : &:r162_1, m156_7 # 162| r162_3(glval) = VariableAddress[a] : -# 162| mu162_4(Rect) = Store : &:r162_3, r162_2 +# 162| mu162_4(Rect) = Store[a] : &:r162_3, r162_2 #-----| Goto -> Block 3 # 164| Block 3 # 164| r164_1(glval) = VariableAddress[b] : # 164| r164_2(glval) = VariableAddress[a] : # 164| r164_3(glval) = FieldAddress[topLeft] : r164_2 -# 164| r164_4(Point) = Load : &:r164_3, ~m? -# 164| m164_5(Point) = Store : &:r164_1, r164_4 +# 164| r164_4(Point) = Load[?] : &:r164_3, ~m? +# 164| m164_5(Point) = Store[b] : &:r164_1, r164_4 # 165| v165_1(void) = NoOp : # 156| v156_10(void) = ReturnVoid : # 156| v156_11(void) = AliasedUse : ~m? @@ -677,26 +677,26 @@ ssa.cpp: # 171| mu171_5(Wrapper) = InitializeParameter[w] : &:r171_4 # 172| r172_1(glval) = VariableAddress[x] : # 172| r172_2(glval) = VariableAddress[w] : -# 172| r172_3(Wrapper) = Load : &:r172_2, ~m? -# 172| m172_4(Wrapper) = Store : &:r172_1, r172_3 +# 172| r172_3(Wrapper) = Load[w] : &:r172_2, ~m? +# 172| m172_4(Wrapper) = Store[x] : &:r172_1, r172_3 # 173| r173_1(glval) = VariableAddress[a] : # 173| r173_2(glval) = VariableAddress[w] : # 173| r173_3(glval) = FieldAddress[f] : r173_2 -# 173| r173_4(int) = Load : &:r173_3, ~m? -# 173| m173_5(int) = Store : &:r173_1, r173_4 +# 173| r173_4(int) = Load[?] : &:r173_3, ~m? +# 173| m173_5(int) = Store[a] : &:r173_1, r173_4 # 174| r174_1(int) = Constant[5] : # 174| r174_2(glval) = VariableAddress[w] : # 174| r174_3(glval) = FieldAddress[f] : r174_2 -# 174| mu174_4(int) = Store : &:r174_3, r174_1 +# 174| mu174_4(int) = Store[?] : &:r174_3, r174_1 # 175| r175_1(glval) = VariableAddress[w] : # 175| r175_2(glval) = FieldAddress[f] : r175_1 -# 175| r175_3(int) = Load : &:r175_2, ~m? +# 175| r175_3(int) = Load[?] : &:r175_2, ~m? # 175| r175_4(glval) = VariableAddress[a] : -# 175| m175_5(int) = Store : &:r175_4, r175_3 +# 175| m175_5(int) = Store[a] : &:r175_4, r175_3 # 176| r176_1(glval) = VariableAddress[w] : -# 176| r176_2(Wrapper) = Load : &:r176_1, ~m? +# 176| r176_2(Wrapper) = Load[w] : &:r176_1, ~m? # 176| r176_3(glval) = VariableAddress[x] : -# 176| m176_4(Wrapper) = Store : &:r176_3, r176_2 +# 176| m176_4(Wrapper) = Store[x] : &:r176_3, r176_2 # 177| v177_1(void) = NoOp : # 171| v171_6(void) = ReturnVoid : # 171| v171_7(void) = AliasedUse : ~m? @@ -709,14 +709,14 @@ ssa.cpp: # 179| mu179_3(unknown) = InitializeNonLocal : # 179| r179_4(glval) = VariableAddress[p] : # 179| m179_5(int *) = InitializeParameter[p] : &:r179_4 -# 179| r179_6(int *) = Load : &:r179_4, m179_5 +# 179| r179_6(int *) = Load[p] : &:r179_4, m179_5 # 179| mu179_7(unknown) = InitializeIndirection[p] : &:r179_6 # 180| mu180_1(unknown) = InlineAsm : ~m? # 181| r181_1(glval) = VariableAddress[#return] : # 181| r181_2(glval) = VariableAddress[p] : -# 181| r181_3(int *) = Load : &:r181_2, m179_5 -# 181| r181_4(int) = Load : &:r181_3, ~m? -# 181| m181_5(int) = Store : &:r181_1, r181_4 +# 181| r181_3(int *) = Load[p] : &:r181_2, m179_5 +# 181| r181_4(int) = Load[?] : &:r181_3, ~m? +# 181| m181_5(int) = Store[#return] : &:r181_1, r181_4 # 179| v179_8(void) = ReturnIndirection[p] : &:r179_6, ~m? # 179| r179_9(glval) = VariableAddress[#return] : # 179| v179_10(void) = ReturnValue : &:r179_9, m181_5 @@ -730,32 +730,32 @@ ssa.cpp: # 184| mu184_3(unknown) = InitializeNonLocal : # 184| r184_4(glval) = VariableAddress[a] : # 184| m184_5(unsigned int &) = InitializeParameter[a] : &:r184_4 -# 184| r184_6(unsigned int &) = Load : &:r184_4, m184_5 +# 184| r184_6(unsigned int &) = Load[a] : &:r184_4, m184_5 # 184| mu184_7(unknown) = InitializeIndirection[a] : &:r184_6 # 184| r184_8(glval) = VariableAddress[b] : # 184| m184_9(unsigned int &) = InitializeParameter[b] : &:r184_8 -# 184| r184_10(unsigned int &) = Load : &:r184_8, m184_9 +# 184| r184_10(unsigned int &) = Load[b] : &:r184_8, m184_9 # 184| mu184_11(unknown) = InitializeIndirection[b] : &:r184_10 # 184| r184_12(glval) = VariableAddress[c] : # 184| m184_13(unsigned int &) = InitializeParameter[c] : &:r184_12 -# 184| r184_14(unsigned int &) = Load : &:r184_12, m184_13 +# 184| r184_14(unsigned int &) = Load[c] : &:r184_12, m184_13 # 184| mu184_15(unknown) = InitializeIndirection[c] : &:r184_14 # 184| r184_16(glval) = VariableAddress[d] : # 184| m184_17(unsigned int &) = InitializeParameter[d] : &:r184_16 -# 184| r184_18(unsigned int &) = Load : &:r184_16, m184_17 +# 184| r184_18(unsigned int &) = Load[d] : &:r184_16, m184_17 # 184| mu184_19(unknown) = InitializeIndirection[d] : &:r184_18 # 189| r189_1(glval) = VariableAddress[a] : -# 189| r189_2(unsigned int &) = Load : &:r189_1, m184_5 +# 189| r189_2(unsigned int &) = Load[a] : &:r189_1, m184_5 # 189| r189_3(glval) = CopyValue : r189_2 # 189| r189_4(glval) = VariableAddress[b] : -# 189| r189_5(unsigned int &) = Load : &:r189_4, m184_9 +# 189| r189_5(unsigned int &) = Load[b] : &:r189_4, m184_9 # 189| r189_6(glval) = CopyValue : r189_5 # 190| r190_1(glval) = VariableAddress[c] : -# 190| r190_2(unsigned int &) = Load : &:r190_1, m184_13 -# 190| r190_3(unsigned int) = Load : &:r190_2, ~m? +# 190| r190_2(unsigned int &) = Load[c] : &:r190_1, m184_13 +# 190| r190_3(unsigned int) = Load[?] : &:r190_2, ~m? # 190| r190_4(glval) = VariableAddress[d] : -# 190| r190_5(unsigned int &) = Load : &:r190_4, m184_17 -# 190| r190_6(unsigned int) = Load : &:r190_5, ~m? +# 190| r190_5(unsigned int &) = Load[d] : &:r190_4, m184_17 +# 190| r190_6(unsigned int) = Load[?] : &:r190_5, ~m? # 186| mu186_1(unknown) = InlineAsm : ~m?, 0:r189_3, 1:r189_6, 2:r190_3, 3:r190_6 # 192| v192_1(void) = NoOp : # 184| v184_20(void) = ReturnIndirection[a] : &:r184_6, ~m? @@ -773,48 +773,48 @@ ssa.cpp: # 198| mu198_3(unknown) = InitializeNonLocal : # 198| r198_4(glval) = VariableAddress[str1] : # 198| m198_5(char *) = InitializeParameter[str1] : &:r198_4 -# 198| r198_6(char *) = Load : &:r198_4, m198_5 +# 198| r198_6(char *) = Load[str1] : &:r198_4, m198_5 # 198| mu198_7(unknown) = InitializeIndirection[str1] : &:r198_6 # 198| r198_8(glval) = VariableAddress[str2] : # 198| m198_9(char *) = InitializeParameter[str2] : &:r198_8 -# 198| r198_10(char *) = Load : &:r198_8, m198_9 +# 198| r198_10(char *) = Load[str2] : &:r198_8, m198_9 # 198| mu198_11(unknown) = InitializeIndirection[str2] : &:r198_10 # 198| r198_12(glval) = VariableAddress[x] : # 198| m198_13(int) = InitializeParameter[x] : &:r198_12 # 199| r199_1(glval) = VariableAddress[ret] : # 199| r199_2(glval) = FunctionAddress[strcmp] : # 199| r199_3(glval) = VariableAddress[str1] : -# 199| r199_4(char *) = Load : &:r199_3, m198_5 +# 199| r199_4(char *) = Load[str1] : &:r199_3, m198_5 # 199| r199_5(char *) = Convert : r199_4 # 199| r199_6(glval) = VariableAddress[str2] : -# 199| r199_7(char *) = Load : &:r199_6, m198_9 +# 199| r199_7(char *) = Load[str2] : &:r199_6, m198_9 # 199| r199_8(char *) = Convert : r199_7 # 199| r199_9(int) = Call[strcmp] : func:r199_2, 0:r199_5, 1:r199_8 # 199| v199_10(void) = ^BufferReadSideEffect[0] : &:r199_5, ~m? # 199| v199_11(void) = ^BufferReadSideEffect[1] : &:r199_8, ~m? -# 199| m199_12(int) = Store : &:r199_1, r199_9 +# 199| m199_12(int) = Store[ret] : &:r199_1, r199_9 # 200| r200_1(glval) = FunctionAddress[strlen] : # 200| r200_2(glval) = VariableAddress[str1] : -# 200| r200_3(char *) = Load : &:r200_2, m198_5 +# 200| r200_3(char *) = Load[str1] : &:r200_2, m198_5 # 200| r200_4(char *) = Convert : r200_3 # 200| r200_5(int) = Call[strlen] : func:r200_1, 0:r200_4 # 200| v200_6(void) = ^BufferReadSideEffect[0] : &:r200_4, ~m? # 200| r200_7(glval) = VariableAddress[ret] : -# 200| r200_8(int) = Load : &:r200_7, m199_12 +# 200| r200_8(int) = Load[ret] : &:r200_7, m199_12 # 200| r200_9(int) = Add : r200_8, r200_5 -# 200| m200_10(int) = Store : &:r200_7, r200_9 +# 200| m200_10(int) = Store[ret] : &:r200_7, r200_9 # 201| r201_1(glval) = FunctionAddress[abs] : # 201| r201_2(glval) = VariableAddress[x] : -# 201| r201_3(int) = Load : &:r201_2, m198_13 +# 201| r201_3(int) = Load[x] : &:r201_2, m198_13 # 201| r201_4(int) = Call[abs] : func:r201_1, 0:r201_3 # 201| r201_5(glval) = VariableAddress[ret] : -# 201| r201_6(int) = Load : &:r201_5, m200_10 +# 201| r201_6(int) = Load[ret] : &:r201_5, m200_10 # 201| r201_7(int) = Add : r201_6, r201_4 -# 201| m201_8(int) = Store : &:r201_5, r201_7 +# 201| m201_8(int) = Store[ret] : &:r201_5, r201_7 # 202| r202_1(glval) = VariableAddress[#return] : # 202| r202_2(glval) = VariableAddress[ret] : -# 202| r202_3(int) = Load : &:r202_2, m201_8 -# 202| m202_4(int) = Store : &:r202_1, r202_3 +# 202| r202_3(int) = Load[ret] : &:r202_2, m201_8 +# 202| m202_4(int) = Store[#return] : &:r202_1, r202_3 # 198| v198_14(void) = ReturnIndirection[str1] : &:r198_6, ~m? # 198| v198_15(void) = ReturnIndirection[str2] : &:r198_10, ~m? # 198| r198_16(glval) = VariableAddress[#return] : @@ -844,8 +844,8 @@ ssa.cpp: # 209| mu209_11(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r209_4, r209_8 # 210| r210_1(glval) = VariableAddress[#return] : # 210| r210_2(glval) = VariableAddress[y] : -# 210| r210_3(int) = Load : &:r210_2, ~m? -# 210| m210_4(int) = Store : &:r210_1, r210_3 +# 210| r210_3(int) = Load[y] : &:r210_2, ~m? +# 210| m210_4(int) = Store[#return] : &:r210_1, r210_3 # 207| r207_6(glval) = VariableAddress[#return] : # 207| v207_7(void) = ReturnValue : &:r207_6, m210_4 # 207| v207_8(void) = AliasedUse : ~m? @@ -858,16 +858,16 @@ ssa.cpp: # 213| mu213_3(unknown) = InitializeNonLocal : # 214| r214_1(glval) = VariableAddress[a_pad] : # 214| r214_2(glval) = StringConstant[""] : -# 214| r214_3(char[32]) = Load : &:r214_2, ~m? -# 214| m214_4(char[32]) = Store : &:r214_1, r214_3 +# 214| r214_3(char[32]) = Load[?] : &:r214_2, ~m? +# 214| m214_4(char[32]) = Store[a_pad] : &:r214_1, r214_3 # 215| r215_1(glval) = VariableAddress[a_nopad] : # 215| r215_2(glval) = StringConstant["foo"] : -# 215| r215_3(char[4]) = Load : &:r215_2, ~m? -# 215| m215_4(char[4]) = Store : &:r215_1, r215_3 +# 215| r215_3(char[4]) = Load[?] : &:r215_2, ~m? +# 215| m215_4(char[4]) = Store[a_nopad] : &:r215_1, r215_3 # 216| r216_1(glval) = VariableAddress[a_infer] : # 216| r216_2(glval) = StringConstant["blah"] : -# 216| r216_3(char[5]) = Load : &:r216_2, ~m? -# 216| m216_4(char[5]) = Store : &:r216_1, r216_3 +# 216| r216_3(char[5]) = Load[?] : &:r216_2, ~m? +# 216| m216_4(char[5]) = Store[a_infer] : &:r216_1, r216_3 # 217| r217_1(glval) = VariableAddress[b] : # 217| m217_2(char[2]) = Uninitialized[b] : &:r217_1 # 218| r218_1(glval) = VariableAddress[c] : @@ -875,37 +875,37 @@ ssa.cpp: # 218| r218_3(int) = Constant[0] : # 218| r218_4(glval) = PointerAdd[1] : r218_1, r218_3 # 218| r218_5(unknown[2]) = Constant[0] : -# 218| mu218_6(unknown[2]) = Store : &:r218_4, r218_5 +# 218| mu218_6(unknown[2]) = Store[?] : &:r218_4, r218_5 # 219| r219_1(glval) = VariableAddress[d] : # 219| mu219_2(char[2]) = Uninitialized[d] : &:r219_1 # 219| r219_3(int) = Constant[0] : # 219| r219_4(glval) = PointerAdd[1] : r219_1, r219_3 # 219| r219_5(char) = Constant[0] : -# 219| mu219_6(char) = Store : &:r219_4, r219_5 +# 219| mu219_6(char) = Store[?] : &:r219_4, r219_5 # 219| r219_7(int) = Constant[1] : # 219| r219_8(glval) = PointerAdd[1] : r219_1, r219_7 # 219| r219_9(char) = Constant[0] : -# 219| mu219_10(char) = Store : &:r219_8, r219_9 +# 219| mu219_10(char) = Store[?] : &:r219_8, r219_9 # 220| r220_1(glval) = VariableAddress[e] : # 220| mu220_2(char[2]) = Uninitialized[e] : &:r220_1 # 220| r220_3(int) = Constant[0] : # 220| r220_4(glval) = PointerAdd[1] : r220_1, r220_3 # 220| r220_5(char) = Constant[0] : -# 220| mu220_6(char) = Store : &:r220_4, r220_5 +# 220| mu220_6(char) = Store[?] : &:r220_4, r220_5 # 220| r220_7(int) = Constant[1] : # 220| r220_8(glval) = PointerAdd[1] : r220_1, r220_7 # 220| r220_9(char) = Constant[1] : -# 220| mu220_10(char) = Store : &:r220_8, r220_9 +# 220| mu220_10(char) = Store[?] : &:r220_8, r220_9 # 221| r221_1(glval) = VariableAddress[f] : # 221| mu221_2(char[3]) = Uninitialized[f] : &:r221_1 # 221| r221_3(int) = Constant[0] : # 221| r221_4(glval) = PointerAdd[1] : r221_1, r221_3 # 221| r221_5(char) = Constant[0] : -# 221| mu221_6(char) = Store : &:r221_4, r221_5 +# 221| mu221_6(char) = Store[?] : &:r221_4, r221_5 # 221| r221_7(int) = Constant[1] : # 221| r221_8(glval) = PointerAdd[1] : r221_1, r221_7 # 221| r221_9(unknown[2]) = Constant[0] : -# 221| mu221_10(unknown[2]) = Store : &:r221_8, r221_9 +# 221| mu221_10(unknown[2]) = Store[?] : &:r221_8, r221_9 # 222| v222_1(void) = NoOp : # 213| v213_4(void) = ReturnVoid : # 213| v213_5(void) = AliasedUse : ~m? @@ -922,14 +922,14 @@ ssa.cpp: # 229| r229_1(glval) = VariableAddress[s] : # 229| r229_2(glval) = StringConstant["Literal"] : # 229| r229_3(char *) = Convert : r229_2 -# 229| m229_4(char *) = Store : &:r229_1, r229_3 +# 229| m229_4(char *) = Store[s] : &:r229_1, r229_3 # 230| r230_1(glval) = VariableAddress[#return] : # 230| r230_2(glval) = VariableAddress[s] : -# 230| r230_3(char *) = Load : &:r230_2, m229_4 +# 230| r230_3(char *) = Load[s] : &:r230_2, m229_4 # 230| r230_4(int) = Constant[2] : # 230| r230_5(glval) = PointerAdd[1] : r230_3, r230_4 -# 230| r230_6(char) = Load : &:r230_5, ~m? -# 230| m230_7(char) = Store : &:r230_1, r230_6 +# 230| r230_6(char) = Load[?] : &:r230_5, ~m? +# 230| m230_7(char) = Store[#return] : &:r230_1, r230_6 # 226| r226_4(glval) = VariableAddress[#return] : # 226| v226_5(void) = ReturnValue : &:r226_4, m230_7 # 226| v226_6(void) = AliasedUse : ~m? @@ -942,7 +942,7 @@ ssa.cpp: # 235| mu235_3(unknown) = InitializeNonLocal : # 235| r235_4(glval) = VariableAddress[#this] : # 235| m235_5(glval) = InitializeParameter[#this] : &:r235_4 -# 235| r235_6(glval) = Load : &:r235_4, m235_5 +# 235| r235_6(glval) = Load[#this] : &:r235_4, m235_5 # 235| mu235_7(Constructible) = InitializeIndirection[#this] : &:r235_6 # 235| r235_8(glval) = VariableAddress[x] : # 235| m235_9(int) = InitializeParameter[x] : &:r235_8 @@ -959,7 +959,7 @@ ssa.cpp: # 236| mu236_3(unknown) = InitializeNonLocal : # 236| r236_4(glval) = VariableAddress[#this] : # 236| m236_5(glval) = InitializeParameter[#this] : &:r236_4 -# 236| r236_6(glval) = Load : &:r236_4, m236_5 +# 236| r236_6(glval) = Load[#this] : &:r236_4, m236_5 # 236| mu236_7(Constructible) = InitializeIndirection[#this] : &:r236_6 # 236| v236_8(void) = NoOp : # 236| v236_9(void) = ReturnIndirection[#this] : &:r236_6, ~m? @@ -1016,14 +1016,14 @@ ssa.cpp: # 247| mu247_3(unknown) = InitializeNonLocal : # 247| r247_4(glval) = VariableAddress[src] : # 247| m247_5(char *) = InitializeParameter[src] : &:r247_4 -# 247| r247_6(char *) = Load : &:r247_4, m247_5 +# 247| r247_6(char *) = Load[src] : &:r247_4, m247_5 # 247| mu247_7(unknown) = InitializeIndirection[src] : &:r247_6 # 247| r247_8(glval) = VariableAddress[size] : # 247| m247_9(int) = InitializeParameter[size] : &:r247_8 # 248| r248_1(glval) = VariableAddress[dst] : # 248| r248_2(glval) = FunctionAddress[operator new[]] : # 248| r248_3(glval) = VariableAddress[size] : -# 248| r248_4(int) = Load : &:r248_3, m247_9 +# 248| r248_4(int) = Load[size] : &:r248_3, m247_9 # 248| r248_5(unsigned long) = Convert : r248_4 # 248| r248_6(unsigned long) = Constant[1] : # 248| r248_7(unsigned long) = Mul : r248_5, r248_6 @@ -1031,28 +1031,28 @@ ssa.cpp: # 248| mu248_9(unknown) = ^CallSideEffect : ~m? # 248| mu248_10(unknown) = ^InitializeDynamicAllocation : &:r248_8 # 248| r248_11(char *) = Convert : r248_8 -# 248| m248_12(char *) = Store : &:r248_1, r248_11 +# 248| m248_12(char *) = Store[dst] : &:r248_1, r248_11 # 249| r249_1(char) = Constant[97] : # 249| r249_2(glval) = VariableAddress[src] : -# 249| r249_3(char *) = Load : &:r249_2, m247_5 +# 249| r249_3(char *) = Load[src] : &:r249_2, m247_5 # 249| r249_4(glval) = CopyValue : r249_3 -# 249| mu249_5(char) = Store : &:r249_4, r249_1 +# 249| mu249_5(char) = Store[?] : &:r249_4, r249_1 # 250| r250_1(glval) = FunctionAddress[memcpy] : # 250| r250_2(glval) = VariableAddress[dst] : -# 250| r250_3(char *) = Load : &:r250_2, m248_12 +# 250| r250_3(char *) = Load[dst] : &:r250_2, m248_12 # 250| r250_4(void *) = Convert : r250_3 # 250| r250_5(glval) = VariableAddress[src] : -# 250| r250_6(char *) = Load : &:r250_5, m247_5 +# 250| r250_6(char *) = Load[src] : &:r250_5, m247_5 # 250| r250_7(void *) = Convert : r250_6 # 250| r250_8(glval) = VariableAddress[size] : -# 250| r250_9(int) = Load : &:r250_8, m247_9 +# 250| r250_9(int) = Load[size] : &:r250_8, m247_9 # 250| r250_10(void *) = Call[memcpy] : func:r250_1, 0:r250_4, 1:r250_7, 2:r250_9 # 250| v250_11(void) = ^SizedBufferReadSideEffect[1] : &:r250_7, r250_9, ~m? # 250| mu250_12(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r250_4, r250_9 # 251| r251_1(glval) = VariableAddress[#return] : # 251| r251_2(glval) = VariableAddress[dst] : -# 251| r251_3(char *) = Load : &:r251_2, m248_12 -# 251| m251_4(char *) = Store : &:r251_1, r251_3 +# 251| r251_3(char *) = Load[dst] : &:r251_2, m248_12 +# 251| m251_4(char *) = Store[#return] : &:r251_1, r251_3 # 247| v247_10(void) = ReturnIndirection[src] : &:r247_6, ~m? # 247| r247_11(glval) = VariableAddress[#return] : # 247| v247_12(void) = ReturnValue : &:r247_11, m251_4 @@ -1067,7 +1067,7 @@ ssa.cpp: # 254| r254_4(glval) = VariableAddress[b] : # 254| m254_5(bool) = InitializeParameter[b] : &:r254_4 # 255| r255_1(glval) = VariableAddress[b] : -# 255| r255_2(bool) = Load : &:r255_1, m254_5 +# 255| r255_2(bool) = Load[b] : &:r255_1, m254_5 # 255| v255_3(void) = ConditionalBranch : r255_2 #-----| False -> Block 2 #-----| True -> Block 1 @@ -1088,14 +1088,14 @@ ssa.cpp: # 262| r262_1(glval) = VariableAddress[s] : # 262| r262_2(glval) = StringConstant["Literal"] : # 262| r262_3(char *) = Convert : r262_2 -# 262| m262_4(char *) = Store : &:r262_1, r262_3 +# 262| m262_4(char *) = Store[s] : &:r262_1, r262_3 # 263| r263_1(glval) = VariableAddress[#return] : # 263| r263_2(glval) = VariableAddress[s] : -# 263| r263_3(char *) = Load : &:r263_2, m262_4 +# 263| r263_3(char *) = Load[s] : &:r263_2, m262_4 # 263| r263_4(int) = Constant[2] : # 263| r263_5(glval) = PointerAdd[1] : r263_3, r263_4 -# 263| r263_6(char) = Load : &:r263_5, ~m? -# 263| m263_7(char) = Store : &:r263_1, r263_6 +# 263| r263_6(char) = Load[?] : &:r263_5, ~m? +# 263| m263_7(char) = Store[#return] : &:r263_1, r263_6 # 254| r254_6(glval) = VariableAddress[#return] : # 254| v254_7(void) = ReturnValue : &:r254_6, m263_7 # 254| v254_8(void) = AliasedUse : ~m? @@ -1108,32 +1108,32 @@ ssa.cpp: # 268| mu268_3(unknown) = InitializeNonLocal : # 268| r268_4(glval) = VariableAddress[s] : # 268| m268_5(void *) = InitializeParameter[s] : &:r268_4 -# 268| r268_6(void *) = Load : &:r268_4, m268_5 +# 268| r268_6(void *) = Load[s] : &:r268_4, m268_5 # 268| mu268_7(unknown) = InitializeIndirection[s] : &:r268_6 # 268| r268_8(glval) = VariableAddress[size] : # 268| m268_9(int) = InitializeParameter[size] : &:r268_8 # 269| r269_1(glval) = VariableAddress[buf] : # 269| r269_2(glval) = FunctionAddress[malloc] : # 269| r269_3(glval) = VariableAddress[size] : -# 269| r269_4(int) = Load : &:r269_3, m268_9 +# 269| r269_4(int) = Load[size] : &:r269_3, m268_9 # 269| r269_5(void *) = Call[malloc] : func:r269_2, 0:r269_4 # 269| mu269_6(unknown) = ^CallSideEffect : ~m? # 269| mu269_7(unknown) = ^InitializeDynamicAllocation : &:r269_5 -# 269| m269_8(void *) = Store : &:r269_1, r269_5 +# 269| m269_8(void *) = Store[buf] : &:r269_1, r269_5 # 270| r270_1(glval) = FunctionAddress[memcpy] : # 270| r270_2(glval) = VariableAddress[buf] : -# 270| r270_3(void *) = Load : &:r270_2, m269_8 +# 270| r270_3(void *) = Load[buf] : &:r270_2, m269_8 # 270| r270_4(glval) = VariableAddress[s] : -# 270| r270_5(void *) = Load : &:r270_4, m268_5 +# 270| r270_5(void *) = Load[s] : &:r270_4, m268_5 # 270| r270_6(glval) = VariableAddress[size] : -# 270| r270_7(int) = Load : &:r270_6, m268_9 +# 270| r270_7(int) = Load[size] : &:r270_6, m268_9 # 270| r270_8(void *) = Call[memcpy] : func:r270_1, 0:r270_3, 1:r270_5, 2:r270_7 # 270| v270_9(void) = ^SizedBufferReadSideEffect[1] : &:r270_5, r270_7, ~m? # 270| mu270_10(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r270_3, r270_7 # 271| r271_1(glval) = VariableAddress[#return] : # 271| r271_2(glval) = VariableAddress[buf] : -# 271| r271_3(void *) = Load : &:r271_2, m269_8 -# 271| m271_4(void *) = Store : &:r271_1, r271_3 +# 271| r271_3(void *) = Load[buf] : &:r271_2, m269_8 +# 271| m271_4(void *) = Store[#return] : &:r271_1, r271_3 # 268| v268_10(void) = ReturnIndirection[s] : &:r268_6, ~m? # 268| r268_11(glval) = VariableAddress[#return] : # 268| v268_12(void) = ReturnValue : &:r268_11, m271_4 @@ -1155,34 +1155,34 @@ ssa.cpp: # 276| mu276_2(Point) = Uninitialized[a] : &:r276_1 # 276| r276_3(glval) = FieldAddress[x] : r276_1 # 276| r276_4(int) = Constant[0] : -# 276| mu276_5(int) = Store : &:r276_3, r276_4 +# 276| mu276_5(int) = Store[?] : &:r276_3, r276_4 # 276| r276_6(glval) = FieldAddress[y] : r276_1 # 276| r276_7(int) = Constant[0] : -# 276| mu276_8(int) = Store : &:r276_6, r276_7 +# 276| mu276_8(int) = Store[?] : &:r276_6, r276_7 # 277| r277_1(glval) = VariableAddress[a] : # 277| r277_2(Point *) = CopyValue : r277_1 # 277| r277_3(glval) = VariableAddress[pp] : -# 277| mu277_4(Point *) = Store : &:r277_3, r277_2 +# 277| mu277_4(Point *) = Store[pp] : &:r277_3, r277_2 # 278| r278_1(glval) = VariableAddress[c] : -# 278| r278_2(bool) = Load : &:r278_1, m275_5 +# 278| r278_2(bool) = Load[c] : &:r278_1, m275_5 # 278| v278_3(void) = ConditionalBranch : r278_2 #-----| False -> Block 2 #-----| True -> Block 1 # 279| Block 1 # 279| r279_1(glval) = VariableAddress[x1] : -# 279| r279_2(int) = Load : &:r279_1, m275_9 +# 279| r279_2(int) = Load[x1] : &:r279_1, m275_9 # 279| r279_3(glval) = VariableAddress[a] : # 279| r279_4(glval) = FieldAddress[x] : r279_3 -# 279| mu279_5(int) = Store : &:r279_4, r279_2 +# 279| mu279_5(int) = Store[?] : &:r279_4, r279_2 #-----| Goto -> Block 2 # 281| Block 2 # 281| r281_1(glval) = VariableAddress[x] : # 281| r281_2(glval) = VariableAddress[a] : # 281| r281_3(glval) = FieldAddress[x] : r281_2 -# 281| r281_4(int) = Load : &:r281_3, ~m? -# 281| m281_5(int) = Store : &:r281_1, r281_4 +# 281| r281_4(int) = Load[?] : &:r281_3, ~m? +# 281| m281_5(int) = Store[x] : &:r281_1, r281_4 # 282| v282_1(void) = NoOp : # 275| v275_10(void) = ReturnVoid : # 275| v275_11(void) = AliasedUse : ~m? @@ -1195,7 +1195,7 @@ ssa.cpp: # 286| mu286_3(unknown) = InitializeNonLocal : # 286| r286_4(glval) = VariableAddress[#this] : # 286| m286_5(glval) = InitializeParameter[#this] : &:r286_4 -# 286| r286_6(glval) = Load : &:r286_4, m286_5 +# 286| r286_6(glval) = Load[#this] : &:r286_4, m286_5 # 286| mu286_7(A) = InitializeIndirection[#this] : &:r286_6 # 286| r286_8(glval) = VariableAddress[x] : # 286| m286_9(int) = InitializeParameter[x] : &:r286_8 @@ -1212,11 +1212,11 @@ ssa.cpp: # 287| mu287_3(unknown) = InitializeNonLocal : # 287| r287_4(glval) = VariableAddress[#this] : # 287| m287_5(glval) = InitializeParameter[#this] : &:r287_4 -# 287| r287_6(glval) = Load : &:r287_4, m287_5 +# 287| r287_6(glval) = Load[#this] : &:r287_4, m287_5 # 287| mu287_7(A) = InitializeIndirection[#this] : &:r287_6 # 287| r287_8(glval) = VariableAddress[p#0] : # 287| m287_9(A *) = InitializeParameter[p#0] : &:r287_8 -# 287| r287_10(A *) = Load : &:r287_8, m287_9 +# 287| r287_10(A *) = Load[p#0] : &:r287_8, m287_9 # 287| mu287_11(unknown) = InitializeIndirection[p#0] : &:r287_10 # 287| v287_12(void) = NoOp : # 287| v287_13(void) = ReturnIndirection[#this] : &:r287_6, ~m? @@ -1232,7 +1232,7 @@ ssa.cpp: # 288| mu288_3(unknown) = InitializeNonLocal : # 288| r288_4(glval) = VariableAddress[#this] : # 288| m288_5(glval) = InitializeParameter[#this] : &:r288_4 -# 288| r288_6(glval) = Load : &:r288_4, m288_5 +# 288| r288_6(glval) = Load[#this] : &:r288_4, m288_5 # 288| mu288_7(A) = InitializeIndirection[#this] : &:r288_6 # 288| v288_8(void) = NoOp : # 288| v288_9(void) = ReturnIndirection[#this] : &:r288_6, ~m? @@ -1254,7 +1254,7 @@ ssa.cpp: # 292| mu292_5(unknown) = ^CallSideEffect : ~m? # 292| mu292_6(unknown) = ^InitializeDynamicAllocation : &:r292_4 # 292| r292_7(Point *) = Convert : r292_4 -# 292| m292_8(Point *) = Store : &:r292_1, r292_7 +# 292| m292_8(Point *) = Store[p] : &:r292_1, r292_7 # 293| r293_1(glval) = VariableAddress[q] : # 293| r293_2(glval) = FunctionAddress[operator new] : # 293| r293_3(unsigned long) = Constant[8] : @@ -1262,7 +1262,7 @@ ssa.cpp: # 293| mu293_5(unknown) = ^CallSideEffect : ~m? # 293| mu293_6(unknown) = ^InitializeDynamicAllocation : &:r293_4 # 293| r293_7(Point *) = Convert : r293_4 -# 293| m293_8(Point *) = Store : &:r293_1, r293_7 +# 293| m293_8(Point *) = Store[q] : &:r293_1, r293_7 # 294| r294_1(glval) = VariableAddress[j] : # 294| r294_2(glval) = FunctionAddress[operator new] : # 294| r294_3(unsigned long) = Constant[4] : @@ -1279,7 +1279,7 @@ ssa.cpp: # 294| r294_14(A *) = Convert : r294_11 # 294| r294_15(glval) = FunctionAddress[A] : # 294| r294_16(glval) = VariableAddress[x] : -# 294| r294_17(int) = Load : &:r294_16, m291_5 +# 294| r294_17(int) = Load[x] : &:r294_16, m291_5 # 294| v294_18(void) = Call[A] : func:r294_15, this:r294_14, 0:r294_17 # 294| mu294_19(unknown) = ^CallSideEffect : ~m? # 294| mu294_20(A) = ^IndirectMayWriteSideEffect[-1] : &:r294_14 @@ -1289,8 +1289,8 @@ ssa.cpp: # 294| v294_24(void) = ^BufferReadSideEffect[0] : &:r294_14, ~m? # 294| mu294_25(unknown) = ^BufferMayWriteSideEffect[0] : &:r294_14 # 294| r294_26(glval) = FieldAddress[i] : r294_7 -# 294| r294_27(int) = Load : &:r294_26, ~m? -# 294| m294_28(int) = Store : &:r294_1, r294_27 +# 294| r294_27(int) = Load[?] : &:r294_26, ~m? +# 294| m294_28(int) = Store[j] : &:r294_1, r294_27 # 295| r295_1(glval) = VariableAddress[a] : # 295| r295_2(glval) = FunctionAddress[operator new] : # 295| r295_3(unsigned long) = Constant[4] : @@ -1302,11 +1302,11 @@ ssa.cpp: # 295| v295_9(void) = Call[A] : func:r295_8, this:r295_7 # 295| mu295_10(unknown) = ^CallSideEffect : ~m? # 295| mu295_11(A) = ^IndirectMayWriteSideEffect[-1] : &:r295_7 -# 295| m295_12(A *) = Store : &:r295_1, r295_7 +# 295| m295_12(A *) = Store[a] : &:r295_1, r295_7 # 296| r296_1(glval) = VariableAddress[#return] : # 296| r296_2(glval) = VariableAddress[p] : -# 296| r296_3(Point *) = Load : &:r296_2, m292_8 -# 296| m296_4(Point *) = Store : &:r296_1, r296_3 +# 296| r296_3(Point *) = Load[p] : &:r296_2, m292_8 +# 296| m296_4(Point *) = Store[#return] : &:r296_1, r296_3 # 291| r291_6(glval) = VariableAddress[#return] : # 291| v291_7(void) = ReturnValue : &:r291_6, m296_4 # 291| v291_8(void) = AliasedUse : ~m? @@ -1321,33 +1321,33 @@ ssa.cpp: # 301| m301_5(int) = InitializeParameter[argc] : &:r301_4 # 301| r301_6(glval) = VariableAddress[argv] : # 301| m301_7(char **) = InitializeParameter[argv] : &:r301_6 -# 301| r301_8(char **) = Load : &:r301_6, m301_7 +# 301| r301_8(char **) = Load[argv] : &:r301_6, m301_7 # 301| mu301_9(unknown) = InitializeIndirection[argv] : &:r301_8 # 302| r302_1(glval) = FunctionAddress[unknownFunction] : # 302| r302_2(glval) = VariableAddress[argc] : -# 302| r302_3(int) = Load : &:r302_2, m301_5 +# 302| r302_3(int) = Load[argc] : &:r302_2, m301_5 # 302| r302_4(glval) = VariableAddress[argv] : -# 302| r302_5(char **) = Load : &:r302_4, m301_7 +# 302| r302_5(char **) = Load[argv] : &:r302_4, m301_7 # 302| v302_6(void) = Call[unknownFunction] : func:r302_1, 0:r302_3, 1:r302_5 # 302| mu302_7(unknown) = ^CallSideEffect : ~m? # 302| v302_8(void) = ^BufferReadSideEffect[1] : &:r302_5, ~m? # 302| mu302_9(unknown) = ^BufferMayWriteSideEffect[1] : &:r302_5 # 303| r303_1(glval) = FunctionAddress[unknownFunction] : # 303| r303_2(glval) = VariableAddress[argc] : -# 303| r303_3(int) = Load : &:r303_2, m301_5 +# 303| r303_3(int) = Load[argc] : &:r303_2, m301_5 # 303| r303_4(glval) = VariableAddress[argv] : -# 303| r303_5(char **) = Load : &:r303_4, m301_7 +# 303| r303_5(char **) = Load[argv] : &:r303_4, m301_7 # 303| v303_6(void) = Call[unknownFunction] : func:r303_1, 0:r303_3, 1:r303_5 # 303| mu303_7(unknown) = ^CallSideEffect : ~m? # 303| v303_8(void) = ^BufferReadSideEffect[1] : &:r303_5, ~m? # 303| mu303_9(unknown) = ^BufferMayWriteSideEffect[1] : &:r303_5 # 304| r304_1(glval) = VariableAddress[#return] : # 304| r304_2(glval) = VariableAddress[argv] : -# 304| r304_3(char **) = Load : &:r304_2, m301_7 -# 304| r304_4(char *) = Load : &:r304_3, ~m? -# 304| r304_5(char) = Load : &:r304_4, ~m? +# 304| r304_3(char **) = Load[argv] : &:r304_2, m301_7 +# 304| r304_4(char *) = Load[?] : &:r304_3, ~m? +# 304| r304_5(char) = Load[?] : &:r304_4, ~m? # 304| r304_6(int) = Convert : r304_5 -# 304| m304_7(int) = Store : &:r304_1, r304_6 +# 304| m304_7(int) = Store[#return] : &:r304_1, r304_6 # 301| v301_10(void) = ReturnIndirection[argv] : &:r301_8, ~m? # 301| r301_11(glval) = VariableAddress[#return] : # 301| v301_12(void) = ReturnValue : &:r301_11, m304_7 @@ -1361,16 +1361,16 @@ ssa.cpp: # 310| mu310_3(unknown) = InitializeNonLocal : # 310| r310_4(glval) = VariableAddress[#this] : # 310| m310_5(glval) = InitializeParameter[#this] : &:r310_4 -# 310| r310_6(glval) = Load : &:r310_4, m310_5 +# 310| r310_6(glval) = Load[#this] : &:r310_4, m310_5 # 310| mu310_7(ThisAliasTest) = InitializeIndirection[#this] : &:r310_6 # 310| r310_8(glval) = VariableAddress[arg] : # 310| m310_9(int) = InitializeParameter[arg] : &:r310_8 # 311| r311_1(glval) = VariableAddress[arg] : -# 311| r311_2(int) = Load : &:r311_1, m310_9 +# 311| r311_2(int) = Load[arg] : &:r311_1, m310_9 # 311| r311_3(glval) = VariableAddress[#this] : -# 311| r311_4(ThisAliasTest *) = Load : &:r311_3, m310_5 +# 311| r311_4(ThisAliasTest *) = Load[#this] : &:r311_3, m310_5 # 311| r311_5(glval) = FieldAddress[x] : r311_4 -# 311| mu311_6(int) = Store : &:r311_5, r311_2 +# 311| mu311_6(int) = Store[?] : &:r311_5, r311_2 # 312| v312_1(void) = NoOp : # 310| v310_10(void) = ReturnIndirection[#this] : &:r310_6, ~m? # 310| v310_11(void) = ReturnVoid : diff --git a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir_unsound.expected b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir_unsound.expected index 9157b211d5b8..a1f345878c80 100644 --- a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir_unsound.expected @@ -6,77 +6,77 @@ ssa.cpp: # 13| mu13_3(unknown) = InitializeNonLocal : # 13| r13_4(glval) = VariableAddress[p] : # 13| m13_5(Point *) = InitializeParameter[p] : &:r13_4 -# 13| r13_6(Point *) = Load : &:r13_4, m13_5 +# 13| r13_6(Point *) = Load[p] : &:r13_4, m13_5 # 13| mu13_7(unknown) = InitializeIndirection[p] : &:r13_6 # 13| r13_8(glval) = VariableAddress[which1] : # 13| m13_9(bool) = InitializeParameter[which1] : &:r13_8 # 13| r13_10(glval) = VariableAddress[which2] : # 13| m13_11(bool) = InitializeParameter[which2] : &:r13_10 # 14| r14_1(glval) = VariableAddress[which1] : -# 14| r14_2(bool) = Load : &:r14_1, m13_9 +# 14| r14_2(bool) = Load[which1] : &:r14_1, m13_9 # 14| v14_3(void) = ConditionalBranch : r14_2 #-----| False -> Block 2 #-----| True -> Block 1 # 15| Block 1 # 15| r15_1(glval) = VariableAddress[p] : -# 15| r15_2(Point *) = Load : &:r15_1, m13_5 +# 15| r15_2(Point *) = Load[p] : &:r15_1, m13_5 # 15| r15_3(glval) = FieldAddress[x] : r15_2 -# 15| r15_4(int) = Load : &:r15_3, ~m? +# 15| r15_4(int) = Load[?] : &:r15_3, ~m? # 15| r15_5(int) = Constant[1] : # 15| r15_6(int) = Add : r15_4, r15_5 -# 15| mu15_7(int) = Store : &:r15_3, r15_6 +# 15| mu15_7(int) = Store[?] : &:r15_3, r15_6 #-----| Goto -> Block 3 # 18| Block 2 # 18| r18_1(glval) = VariableAddress[p] : -# 18| r18_2(Point *) = Load : &:r18_1, m13_5 +# 18| r18_2(Point *) = Load[p] : &:r18_1, m13_5 # 18| r18_3(glval) = FieldAddress[y] : r18_2 -# 18| r18_4(int) = Load : &:r18_3, ~m? +# 18| r18_4(int) = Load[?] : &:r18_3, ~m? # 18| r18_5(int) = Constant[1] : # 18| r18_6(int) = Add : r18_4, r18_5 -# 18| mu18_7(int) = Store : &:r18_3, r18_6 +# 18| mu18_7(int) = Store[?] : &:r18_3, r18_6 #-----| Goto -> Block 3 # 21| Block 3 # 21| r21_1(glval) = VariableAddress[which2] : -# 21| r21_2(bool) = Load : &:r21_1, m13_11 +# 21| r21_2(bool) = Load[which2] : &:r21_1, m13_11 # 21| v21_3(void) = ConditionalBranch : r21_2 #-----| False -> Block 5 #-----| True -> Block 4 # 22| Block 4 # 22| r22_1(glval) = VariableAddress[p] : -# 22| r22_2(Point *) = Load : &:r22_1, m13_5 +# 22| r22_2(Point *) = Load[p] : &:r22_1, m13_5 # 22| r22_3(glval) = FieldAddress[x] : r22_2 -# 22| r22_4(int) = Load : &:r22_3, ~m? +# 22| r22_4(int) = Load[?] : &:r22_3, ~m? # 22| r22_5(int) = Constant[1] : # 22| r22_6(int) = Add : r22_4, r22_5 -# 22| mu22_7(int) = Store : &:r22_3, r22_6 +# 22| mu22_7(int) = Store[?] : &:r22_3, r22_6 #-----| Goto -> Block 6 # 25| Block 5 # 25| r25_1(glval) = VariableAddress[p] : -# 25| r25_2(Point *) = Load : &:r25_1, m13_5 +# 25| r25_2(Point *) = Load[p] : &:r25_1, m13_5 # 25| r25_3(glval) = FieldAddress[y] : r25_2 -# 25| r25_4(int) = Load : &:r25_3, ~m? +# 25| r25_4(int) = Load[?] : &:r25_3, ~m? # 25| r25_5(int) = Constant[1] : # 25| r25_6(int) = Add : r25_4, r25_5 -# 25| mu25_7(int) = Store : &:r25_3, r25_6 +# 25| mu25_7(int) = Store[?] : &:r25_3, r25_6 #-----| Goto -> Block 6 # 28| Block 6 # 28| r28_1(glval) = VariableAddress[#return] : # 28| r28_2(glval) = VariableAddress[p] : -# 28| r28_3(Point *) = Load : &:r28_2, m13_5 +# 28| r28_3(Point *) = Load[p] : &:r28_2, m13_5 # 28| r28_4(glval) = FieldAddress[x] : r28_3 -# 28| r28_5(int) = Load : &:r28_4, ~m? +# 28| r28_5(int) = Load[?] : &:r28_4, ~m? # 28| r28_6(glval) = VariableAddress[p] : -# 28| r28_7(Point *) = Load : &:r28_6, m13_5 +# 28| r28_7(Point *) = Load[p] : &:r28_6, m13_5 # 28| r28_8(glval) = FieldAddress[y] : r28_7 -# 28| r28_9(int) = Load : &:r28_8, ~m? +# 28| r28_9(int) = Load[?] : &:r28_8, ~m? # 28| r28_10(int) = Add : r28_5, r28_9 -# 28| m28_11(int) = Store : &:r28_1, r28_10 +# 28| m28_11(int) = Store[#return] : &:r28_1, r28_10 # 13| v13_12(void) = ReturnIndirection[p] : &:r13_6, ~m? # 13| r13_13(glval) = VariableAddress[#return] : # 13| v13_14(void) = ReturnValue : &:r13_13, m28_11 @@ -92,7 +92,7 @@ ssa.cpp: # 34| v34_1(void) = NoOp : # 35| r35_1(glval) = VariableAddress[#return] : # 35| r35_2(int) = Constant[0] : -# 35| m35_3(int) = Store : &:r35_1, r35_2 +# 35| m35_3(int) = Store[#return] : &:r35_1, r35_2 # 31| r31_4(glval) = VariableAddress[#return] : # 31| v31_5(void) = ReturnValue : &:r31_4, m35_3 # 31| v31_6(void) = AliasedUse : ~m? @@ -107,12 +107,12 @@ ssa.cpp: # 38| m38_5(bool) = InitializeParameter[b] : &:r38_4 # 39| r39_1(glval) = VariableAddress[x] : # 39| r39_2(int) = Constant[5] : -# 39| m39_3(int) = Store : &:r39_1, r39_2 +# 39| m39_3(int) = Store[x] : &:r39_1, r39_2 # 40| r40_1(glval) = VariableAddress[y] : # 40| r40_2(int) = Constant[10] : -# 40| m40_3(int) = Store : &:r40_1, r40_2 +# 40| m40_3(int) = Store[y] : &:r40_1, r40_2 # 41| r41_1(glval) = VariableAddress[b] : -# 41| r41_2(bool) = Load : &:r41_1, m38_5 +# 41| r41_2(bool) = Load[b] : &:r41_1, m38_5 # 41| v41_3(void) = ConditionalBranch : r41_2 #-----| False -> Block 5 #-----| True -> Block 2 @@ -126,9 +126,9 @@ ssa.cpp: # 42| Block 2 # 42| r42_1(glval) = VariableAddress[x] : -# 42| r42_2(int) = Load : &:r42_1, m39_3 +# 42| r42_2(int) = Load[x] : &:r42_1, m39_3 # 42| r42_3(glval) = VariableAddress[y] : -# 42| r42_4(int) = Load : &:r42_3, m40_3 +# 42| r42_4(int) = Load[y] : &:r42_3, m40_3 # 42| r42_5(bool) = CompareEQ : r42_2, r42_4 # 42| v42_6(void) = ConditionalBranch : r42_5 #-----| False -> Block 4 @@ -137,20 +137,20 @@ ssa.cpp: # 43| Block 3 # 43| r43_1(glval) = VariableAddress[#return] : # 43| r43_2(int) = Constant[1] : -# 43| m43_3(int) = Store : &:r43_1, r43_2 +# 43| m43_3(int) = Store[#return] : &:r43_1, r43_2 #-----| Goto -> Block 1 # 46| Block 4 # 46| r46_1(glval) = VariableAddress[#return] : # 46| r46_2(int) = Constant[0] : -# 46| m46_3(int) = Store : &:r46_1, r46_2 +# 46| m46_3(int) = Store[#return] : &:r46_1, r46_2 #-----| Goto -> Block 1 # 50| Block 5 # 50| r50_1(glval) = VariableAddress[x] : -# 50| r50_2(int) = Load : &:r50_1, m39_3 +# 50| r50_2(int) = Load[x] : &:r50_1, m39_3 # 50| r50_3(glval) = VariableAddress[y] : -# 50| r50_4(int) = Load : &:r50_3, m40_3 +# 50| r50_4(int) = Load[y] : &:r50_3, m40_3 # 50| r50_5(bool) = CompareLT : r50_2, r50_4 # 50| v50_6(void) = ConditionalBranch : r50_5 #-----| False -> Block 7 @@ -159,13 +159,13 @@ ssa.cpp: # 51| Block 6 # 51| r51_1(glval) = VariableAddress[#return] : # 51| r51_2(int) = Constant[0] : -# 51| m51_3(int) = Store : &:r51_1, r51_2 +# 51| m51_3(int) = Store[#return] : &:r51_1, r51_2 #-----| Goto -> Block 1 # 54| Block 7 # 54| r54_1(glval) = VariableAddress[#return] : # 54| r54_2(int) = Constant[1] : -# 54| m54_3(int) = Store : &:r54_1, r54_2 +# 54| m54_3(int) = Store[#return] : &:r54_1, r54_2 #-----| Goto -> Block 1 # 59| int DoWhileFalse() @@ -175,12 +175,12 @@ ssa.cpp: # 59| mu59_3(unknown) = InitializeNonLocal : # 60| r60_1(glval) = VariableAddress[i] : # 60| r60_2(int) = Constant[0] : -# 60| m60_3(int) = Store : &:r60_1, r60_2 +# 60| m60_3(int) = Store[i] : &:r60_1, r60_2 # 62| r62_1(glval) = VariableAddress[i] : -# 62| r62_2(int) = Load : &:r62_1, m60_3 +# 62| r62_2(int) = Load[i] : &:r62_1, m60_3 # 62| r62_3(int) = Constant[1] : # 62| r62_4(int) = Add : r62_2, r62_3 -# 62| m62_5(int) = Store : &:r62_1, r62_4 +# 62| m62_5(int) = Store[i] : &:r62_1, r62_4 # 63| r63_1(bool) = Constant[0] : # 63| v63_2(void) = ConditionalBranch : r63_1 #-----| False -> Block 1 @@ -189,8 +189,8 @@ ssa.cpp: # 65| Block 1 # 65| r65_1(glval) = VariableAddress[#return] : # 65| r65_2(glval) = VariableAddress[i] : -# 65| r65_3(int) = Load : &:r65_2, m62_5 -# 65| m65_4(int) = Store : &:r65_1, r65_3 +# 65| r65_3(int) = Load[i] : &:r65_2, m62_5 +# 65| m65_4(int) = Store[#return] : &:r65_1, r65_3 # 59| r59_4(glval) = VariableAddress[#return] : # 59| v59_5(void) = ReturnValue : &:r59_4, m65_4 # 59| v59_6(void) = AliasedUse : ~m? @@ -208,7 +208,7 @@ ssa.cpp: # 68| m68_5(int) = InitializeParameter[n] : &:r68_4 # 68| r68_6(glval) = VariableAddress[p] : # 68| m68_7(char *) = InitializeParameter[p] : &:r68_6 -# 68| r68_8(char *) = Load : &:r68_6, m68_7 +# 68| r68_8(char *) = Load[p] : &:r68_6, m68_7 # 68| mu68_9(unknown) = InitializeIndirection[p] : &:r68_8 #-----| Goto -> Block 1 @@ -216,10 +216,10 @@ ssa.cpp: # 69| m69_1(char *) = Phi : from 0:m68_7, from 2:m70_6 # 69| m69_2(int) = Phi : from 0:m68_5, from 2:m69_7 # 69| r69_3(glval) = VariableAddress[n] : -# 69| r69_4(int) = Load : &:r69_3, m69_2 +# 69| r69_4(int) = Load[n] : &:r69_3, m69_2 # 69| r69_5(int) = Constant[1] : # 69| r69_6(int) = Sub : r69_4, r69_5 -# 69| m69_7(int) = Store : &:r69_3, r69_6 +# 69| m69_7(int) = Store[n] : &:r69_3, r69_6 # 69| r69_8(int) = CopyValue : r69_4 # 69| r69_9(int) = Constant[0] : # 69| r69_10(bool) = CompareGT : r69_8, r69_9 @@ -230,13 +230,13 @@ ssa.cpp: # 70| Block 2 # 70| r70_1(char) = Constant[0] : # 70| r70_2(glval) = VariableAddress[p] : -# 70| r70_3(char *) = Load : &:r70_2, m69_1 +# 70| r70_3(char *) = Load[p] : &:r70_2, m69_1 # 70| r70_4(int) = Constant[1] : # 70| r70_5(char *) = PointerAdd[1] : r70_3, r70_4 -# 70| m70_6(char *) = Store : &:r70_2, r70_5 +# 70| m70_6(char *) = Store[p] : &:r70_2, r70_5 # 70| r70_7(char *) = CopyValue : r70_3 # 70| r70_8(glval) = CopyValue : r70_7 -# 70| mu70_9(char) = Store : &:r70_8, r70_1 +# 70| mu70_9(char) = Store[?] : &:r70_8, r70_1 #-----| Goto (back edge) -> Block 1 # 71| Block 3 @@ -255,15 +255,15 @@ ssa.cpp: # 75| m75_5(bool) = InitializeParameter[b] : &:r75_4 # 76| r76_1(glval) = VariableAddress[x] : # 76| r76_2(int) = Constant[0] : -# 76| m76_3(int) = Store : &:r76_1, r76_2 +# 76| m76_3(int) = Store[x] : &:r76_1, r76_2 # 77| r77_1(glval) = VariableAddress[y] : # 77| r77_2(int) = Constant[1] : -# 77| m77_3(int) = Store : &:r77_1, r77_2 +# 77| m77_3(int) = Store[y] : &:r77_1, r77_2 # 78| r78_1(glval) = VariableAddress[z] : # 78| r78_2(int) = Constant[2] : -# 78| m78_3(int) = Store : &:r78_1, r78_2 +# 78| m78_3(int) = Store[z] : &:r78_1, r78_2 # 79| r79_1(glval) = VariableAddress[b] : -# 79| r79_2(bool) = Load : &:r79_1, m75_5 +# 79| r79_2(bool) = Load[b] : &:r79_1, m75_5 # 79| v79_3(void) = ConditionalBranch : r79_2 #-----| False -> Block 2 #-----| True -> Block 1 @@ -271,16 +271,16 @@ ssa.cpp: # 80| Block 1 # 80| r80_1(int) = Constant[3] : # 80| r80_2(glval) = VariableAddress[x] : -# 80| m80_3(int) = Store : &:r80_2, r80_1 +# 80| m80_3(int) = Store[x] : &:r80_2, r80_1 # 81| r81_1(int) = Constant[4] : # 81| r81_2(glval) = VariableAddress[y] : -# 81| m81_3(int) = Store : &:r81_2, r81_1 +# 81| m81_3(int) = Store[y] : &:r81_2, r81_1 #-----| Goto -> Block 3 # 84| Block 2 # 84| r84_1(int) = Constant[5] : # 84| r84_2(glval) = VariableAddress[x] : -# 84| m84_3(int) = Store : &:r84_2, r84_1 +# 84| m84_3(int) = Store[x] : &:r84_2, r84_1 #-----| Goto -> Block 3 # 86| Block 3 @@ -288,16 +288,16 @@ ssa.cpp: # 86| m86_2(int) = Phi : from 1:m80_3, from 2:m84_3 # 86| r86_3(glval) = VariableAddress[x_merge] : # 86| r86_4(glval) = VariableAddress[x] : -# 86| r86_5(int) = Load : &:r86_4, m86_2 -# 86| m86_6(int) = Store : &:r86_3, r86_5 +# 86| r86_5(int) = Load[x] : &:r86_4, m86_2 +# 86| m86_6(int) = Store[x_merge] : &:r86_3, r86_5 # 87| r87_1(glval) = VariableAddress[y_merge] : # 87| r87_2(glval) = VariableAddress[y] : -# 87| r87_3(int) = Load : &:r87_2, m86_1 -# 87| m87_4(int) = Store : &:r87_1, r87_3 +# 87| r87_3(int) = Load[y] : &:r87_2, m86_1 +# 87| m87_4(int) = Store[y_merge] : &:r87_1, r87_3 # 88| r88_1(glval) = VariableAddress[z_merge] : # 88| r88_2(glval) = VariableAddress[z] : -# 88| r88_3(int) = Load : &:r88_2, m78_3 -# 88| m88_4(int) = Store : &:r88_1, r88_3 +# 88| r88_3(int) = Load[z] : &:r88_2, m78_3 +# 88| m88_4(int) = Store[z_merge] : &:r88_1, r88_3 # 89| v89_1(void) = NoOp : # 75| v75_6(void) = ReturnVoid : # 75| v75_7(void) = AliasedUse : ~m? @@ -312,8 +312,8 @@ ssa.cpp: # 91| m91_5(Point) = InitializeParameter[a] : &:r91_4 # 92| r92_1(glval) = VariableAddress[b] : # 92| r92_2(glval) = VariableAddress[a] : -# 92| r92_3(Point) = Load : &:r92_2, m91_5 -# 92| m92_4(Point) = Store : &:r92_1, r92_3 +# 92| r92_3(Point) = Load[a] : &:r92_2, m91_5 +# 92| m92_4(Point) = Store[b] : &:r92_1, r92_3 # 93| v93_1(void) = NoOp : # 91| v91_6(void) = ReturnVoid : # 91| v91_7(void) = AliasedUse : ~m? @@ -328,8 +328,8 @@ ssa.cpp: # 95| mu95_5(Point) = InitializeParameter[a] : &:r95_4 # 96| r96_1(glval) = VariableAddress[b] : # 96| r96_2(glval) = VariableAddress[a] : -# 96| r96_3(Point) = Load : &:r96_2, ~m? -# 96| m96_4(Point) = Store : &:r96_1, r96_3 +# 96| r96_3(Point) = Load[a] : &:r96_2, ~m? +# 96| m96_4(Point) = Store[b] : &:r96_1, r96_3 # 97| r97_1(glval) = FunctionAddress[Escape] : # 97| r97_2(glval) = VariableAddress[a] : # 97| r97_3(Point *) = CopyValue : r97_2 @@ -353,13 +353,13 @@ ssa.cpp: # 101| r101_1(glval) = VariableAddress[x] : # 101| r101_2(glval) = VariableAddress[a] : # 101| r101_3(glval) = FieldAddress[x] : r101_2 -# 101| r101_4(int) = Load : &:r101_3, ~m? -# 101| m101_5(int) = Store : &:r101_1, r101_4 +# 101| r101_4(int) = Load[?] : &:r101_3, ~m? +# 101| m101_5(int) = Store[x] : &:r101_1, r101_4 # 102| r102_1(glval) = VariableAddress[y] : # 102| r102_2(glval) = VariableAddress[a] : # 102| r102_3(glval) = FieldAddress[y] : r102_2 -# 102| r102_4(int) = Load : &:r102_3, ~m? -# 102| m102_5(int) = Store : &:r102_1, r102_4 +# 102| r102_4(int) = Load[?] : &:r102_3, ~m? +# 102| m102_5(int) = Store[y] : &:r102_1, r102_4 # 103| v103_1(void) = NoOp : # 100| v100_6(void) = ReturnVoid : # 100| v100_7(void) = AliasedUse : ~m? @@ -375,13 +375,13 @@ ssa.cpp: # 106| r106_1(glval) = VariableAddress[x] : # 106| r106_2(glval) = VariableAddress[a] : # 106| r106_3(glval) = FieldAddress[x] : r106_2 -# 106| r106_4(int) = Load : &:r106_3, ~m? -# 106| m106_5(int) = Store : &:r106_1, r106_4 +# 106| r106_4(int) = Load[?] : &:r106_3, ~m? +# 106| m106_5(int) = Store[x] : &:r106_1, r106_4 # 107| r107_1(glval) = VariableAddress[y] : # 107| r107_2(glval) = VariableAddress[a] : # 107| r107_3(glval) = FieldAddress[y] : r107_2 -# 107| r107_4(int) = Load : &:r107_3, ~m? -# 107| m107_5(int) = Store : &:r107_1, r107_4 +# 107| r107_4(int) = Load[?] : &:r107_3, ~m? +# 107| m107_5(int) = Store[y] : &:r107_1, r107_4 # 108| r108_1(glval) = FunctionAddress[Escape] : # 108| r108_2(glval) = VariableAddress[a] : # 108| r108_3(Point *) = CopyValue : r108_2 @@ -408,16 +408,16 @@ ssa.cpp: # 112| mu112_2(Point) = Uninitialized[a] : &:r112_1 # 112| r112_3(glval) = FieldAddress[x] : r112_1 # 112| r112_4(glval) = VariableAddress[x] : -# 112| r112_5(int) = Load : &:r112_4, m111_5 -# 112| mu112_6(int) = Store : &:r112_3, r112_5 +# 112| r112_5(int) = Load[x] : &:r112_4, m111_5 +# 112| mu112_6(int) = Store[?] : &:r112_3, r112_5 # 112| r112_7(glval) = FieldAddress[y] : r112_1 # 112| r112_8(glval) = VariableAddress[y] : -# 112| r112_9(int) = Load : &:r112_8, m111_7 -# 112| mu112_10(int) = Store : &:r112_7, r112_9 +# 112| r112_9(int) = Load[y] : &:r112_8, m111_7 +# 112| mu112_10(int) = Store[?] : &:r112_7, r112_9 # 113| r113_1(glval) = VariableAddress[b] : # 113| r113_2(glval) = VariableAddress[a] : -# 113| r113_3(Point) = Load : &:r113_2, ~m? -# 113| m113_4(Point) = Store : &:r113_1, r113_3 +# 113| r113_3(Point) = Load[a] : &:r113_2, ~m? +# 113| m113_4(Point) = Store[b] : &:r113_1, r113_3 # 114| v114_1(void) = NoOp : # 111| v111_8(void) = ReturnVoid : # 111| v111_9(void) = AliasedUse : ~m? @@ -436,16 +436,16 @@ ssa.cpp: # 117| mu117_2(Point) = Uninitialized[a] : &:r117_1 # 117| r117_3(glval) = FieldAddress[x] : r117_1 # 117| r117_4(glval) = VariableAddress[x] : -# 117| r117_5(int) = Load : &:r117_4, m116_5 -# 117| mu117_6(int) = Store : &:r117_3, r117_5 +# 117| r117_5(int) = Load[x] : &:r117_4, m116_5 +# 117| mu117_6(int) = Store[?] : &:r117_3, r117_5 # 117| r117_7(glval) = FieldAddress[y] : r117_1 # 117| r117_8(glval) = VariableAddress[y] : -# 117| r117_9(int) = Load : &:r117_8, m116_7 -# 117| mu117_10(int) = Store : &:r117_7, r117_9 +# 117| r117_9(int) = Load[y] : &:r117_8, m116_7 +# 117| mu117_10(int) = Store[?] : &:r117_7, r117_9 # 118| r118_1(glval) = VariableAddress[b] : # 118| r118_2(glval) = VariableAddress[a] : -# 118| r118_3(Point) = Load : &:r118_2, ~m? -# 118| m118_4(Point) = Store : &:r118_1, r118_3 +# 118| r118_3(Point) = Load[a] : &:r118_2, ~m? +# 118| m118_4(Point) = Store[b] : &:r118_1, r118_3 # 119| r119_1(glval) = FunctionAddress[Escape] : # 119| r119_2(glval) = VariableAddress[a] : # 119| r119_3(Point *) = CopyValue : r119_2 @@ -474,42 +474,42 @@ ssa.cpp: # 123| mu123_2(Point) = Uninitialized[a] : &:r123_1 # 123| r123_3(glval) = FieldAddress[x] : r123_1 # 123| r123_4(int) = Constant[0] : -# 123| mu123_5(int) = Store : &:r123_3, r123_4 +# 123| mu123_5(int) = Store[?] : &:r123_3, r123_4 # 123| r123_6(glval) = FieldAddress[y] : r123_1 # 123| r123_7(int) = Constant[0] : -# 123| mu123_8(int) = Store : &:r123_6, r123_7 +# 123| mu123_8(int) = Store[?] : &:r123_6, r123_7 # 124| r124_1(glval) = VariableAddress[c] : -# 124| r124_2(bool) = Load : &:r124_1, m122_5 +# 124| r124_2(bool) = Load[c] : &:r124_1, m122_5 # 124| v124_3(void) = ConditionalBranch : r124_2 #-----| False -> Block 2 #-----| True -> Block 1 # 125| Block 1 # 125| r125_1(glval) = VariableAddress[x1] : -# 125| r125_2(int) = Load : &:r125_1, m122_7 +# 125| r125_2(int) = Load[x1] : &:r125_1, m122_7 # 125| r125_3(glval) = VariableAddress[a] : # 125| r125_4(glval) = FieldAddress[x] : r125_3 -# 125| mu125_5(int) = Store : &:r125_4, r125_2 +# 125| mu125_5(int) = Store[?] : &:r125_4, r125_2 #-----| Goto -> Block 3 # 128| Block 2 # 128| r128_1(glval) = VariableAddress[x2] : -# 128| r128_2(int) = Load : &:r128_1, m122_9 +# 128| r128_2(int) = Load[x2] : &:r128_1, m122_9 # 128| r128_3(glval) = VariableAddress[a] : # 128| r128_4(glval) = FieldAddress[x] : r128_3 -# 128| mu128_5(int) = Store : &:r128_4, r128_2 +# 128| mu128_5(int) = Store[?] : &:r128_4, r128_2 #-----| Goto -> Block 3 # 130| Block 3 # 130| r130_1(glval) = VariableAddress[x] : # 130| r130_2(glval) = VariableAddress[a] : # 130| r130_3(glval) = FieldAddress[x] : r130_2 -# 130| r130_4(int) = Load : &:r130_3, ~m? -# 130| m130_5(int) = Store : &:r130_1, r130_4 +# 130| r130_4(int) = Load[?] : &:r130_3, ~m? +# 130| m130_5(int) = Store[x] : &:r130_1, r130_4 # 131| r131_1(glval) = VariableAddress[b] : # 131| r131_2(glval) = VariableAddress[a] : -# 131| r131_3(Point) = Load : &:r131_2, ~m? -# 131| m131_4(Point) = Store : &:r131_1, r131_3 +# 131| r131_3(Point) = Load[a] : &:r131_2, ~m? +# 131| m131_4(Point) = Store[b] : &:r131_1, r131_3 # 132| v132_1(void) = NoOp : # 122| v122_10(void) = ReturnVoid : # 122| v122_11(void) = AliasedUse : ~m? @@ -530,37 +530,37 @@ ssa.cpp: # 135| mu135_2(Point) = Uninitialized[a] : &:r135_1 # 135| r135_3(glval) = FieldAddress[x] : r135_1 # 135| r135_4(int) = Constant[0] : -# 135| mu135_5(int) = Store : &:r135_3, r135_4 +# 135| mu135_5(int) = Store[?] : &:r135_3, r135_4 # 135| r135_6(glval) = FieldAddress[y] : r135_1 # 135| r135_7(int) = Constant[0] : -# 135| mu135_8(int) = Store : &:r135_6, r135_7 +# 135| mu135_8(int) = Store[?] : &:r135_6, r135_7 # 136| r136_1(glval) = VariableAddress[c] : -# 136| r136_2(bool) = Load : &:r136_1, m134_5 +# 136| r136_2(bool) = Load[c] : &:r136_1, m134_5 # 136| v136_3(void) = ConditionalBranch : r136_2 #-----| False -> Block 2 #-----| True -> Block 1 # 137| Block 1 # 137| r137_1(glval) = VariableAddress[x1] : -# 137| r137_2(int) = Load : &:r137_1, m134_9 +# 137| r137_2(int) = Load[x1] : &:r137_1, m134_9 # 137| r137_3(glval) = VariableAddress[a] : # 137| r137_4(glval) = FieldAddress[x] : r137_3 -# 137| mu137_5(int) = Store : &:r137_4, r137_2 +# 137| mu137_5(int) = Store[?] : &:r137_4, r137_2 #-----| Goto -> Block 3 # 140| Block 2 # 140| r140_1(glval) = VariableAddress[p] : -# 140| r140_2(Point) = Load : &:r140_1, m134_7 +# 140| r140_2(Point) = Load[p] : &:r140_1, m134_7 # 140| r140_3(glval) = VariableAddress[a] : -# 140| mu140_4(Point) = Store : &:r140_3, r140_2 +# 140| mu140_4(Point) = Store[a] : &:r140_3, r140_2 #-----| Goto -> Block 3 # 142| Block 3 # 142| r142_1(glval) = VariableAddress[x] : # 142| r142_2(glval) = VariableAddress[a] : # 142| r142_3(glval) = FieldAddress[x] : r142_2 -# 142| r142_4(int) = Load : &:r142_3, ~m? -# 142| m142_5(int) = Store : &:r142_1, r142_4 +# 142| r142_4(int) = Load[?] : &:r142_3, ~m? +# 142| m142_5(int) = Store[x] : &:r142_1, r142_4 # 143| v143_1(void) = NoOp : # 134| v134_10(void) = ReturnVoid : # 134| v134_11(void) = AliasedUse : ~m? @@ -581,36 +581,36 @@ ssa.cpp: # 146| mu146_2(Point) = Uninitialized[a] : &:r146_1 # 146| r146_3(glval) = FieldAddress[x] : r146_1 # 146| r146_4(int) = Constant[0] : -# 146| mu146_5(int) = Store : &:r146_3, r146_4 +# 146| mu146_5(int) = Store[?] : &:r146_3, r146_4 # 146| r146_6(glval) = FieldAddress[y] : r146_1 # 146| r146_7(int) = Constant[0] : -# 146| mu146_8(int) = Store : &:r146_6, r146_7 +# 146| mu146_8(int) = Store[?] : &:r146_6, r146_7 # 147| r147_1(glval) = VariableAddress[c] : -# 147| r147_2(bool) = Load : &:r147_1, m145_5 +# 147| r147_2(bool) = Load[c] : &:r147_1, m145_5 # 147| v147_3(void) = ConditionalBranch : r147_2 #-----| False -> Block 2 #-----| True -> Block 1 # 148| Block 1 # 148| r148_1(glval) = VariableAddress[x1] : -# 148| r148_2(int) = Load : &:r148_1, m145_9 +# 148| r148_2(int) = Load[x1] : &:r148_1, m145_9 # 148| r148_3(glval) = VariableAddress[a] : # 148| r148_4(glval) = FieldAddress[x] : r148_3 -# 148| mu148_5(int) = Store : &:r148_4, r148_2 +# 148| mu148_5(int) = Store[?] : &:r148_4, r148_2 #-----| Goto -> Block 3 # 151| Block 2 # 151| r151_1(glval) = VariableAddress[p] : -# 151| r151_2(Point) = Load : &:r151_1, m145_7 +# 151| r151_2(Point) = Load[p] : &:r151_1, m145_7 # 151| r151_3(glval) = VariableAddress[a] : -# 151| mu151_4(Point) = Store : &:r151_3, r151_2 +# 151| mu151_4(Point) = Store[a] : &:r151_3, r151_2 #-----| Goto -> Block 3 # 153| Block 3 # 153| r153_1(glval) = VariableAddress[b] : # 153| r153_2(glval) = VariableAddress[a] : -# 153| r153_3(Point) = Load : &:r153_2, ~m? -# 153| m153_4(Point) = Store : &:r153_1, r153_3 +# 153| r153_3(Point) = Load[a] : &:r153_2, ~m? +# 153| m153_4(Point) = Store[b] : &:r153_1, r153_3 # 154| v154_1(void) = NoOp : # 145| v145_10(void) = ReturnVoid : # 145| v145_11(void) = AliasedUse : ~m? @@ -631,38 +631,38 @@ ssa.cpp: # 157| mu157_2(Rect) = Uninitialized[a] : &:r157_1 # 157| r157_3(glval) = FieldAddress[topLeft] : r157_1 # 157| r157_4(Point) = Constant[0] : -# 157| mu157_5(Point) = Store : &:r157_3, r157_4 +# 157| mu157_5(Point) = Store[?] : &:r157_3, r157_4 # 157| r157_6(glval) = FieldAddress[bottomRight] : r157_1 # 157| r157_7(Point) = Constant[0] : -# 157| mu157_8(Point) = Store : &:r157_6, r157_7 +# 157| mu157_8(Point) = Store[?] : &:r157_6, r157_7 # 158| r158_1(glval) = VariableAddress[c] : -# 158| r158_2(bool) = Load : &:r158_1, m156_5 +# 158| r158_2(bool) = Load[c] : &:r158_1, m156_5 # 158| v158_3(void) = ConditionalBranch : r158_2 #-----| False -> Block 2 #-----| True -> Block 1 # 159| Block 1 # 159| r159_1(glval) = VariableAddress[x1] : -# 159| r159_2(int) = Load : &:r159_1, m156_9 +# 159| r159_2(int) = Load[x1] : &:r159_1, m156_9 # 159| r159_3(glval) = VariableAddress[a] : # 159| r159_4(glval) = FieldAddress[topLeft] : r159_3 # 159| r159_5(glval) = FieldAddress[x] : r159_4 -# 159| mu159_6(int) = Store : &:r159_5, r159_2 +# 159| mu159_6(int) = Store[?] : &:r159_5, r159_2 #-----| Goto -> Block 3 # 162| Block 2 # 162| r162_1(glval) = VariableAddress[r] : -# 162| r162_2(Rect) = Load : &:r162_1, m156_7 +# 162| r162_2(Rect) = Load[r] : &:r162_1, m156_7 # 162| r162_3(glval) = VariableAddress[a] : -# 162| mu162_4(Rect) = Store : &:r162_3, r162_2 +# 162| mu162_4(Rect) = Store[a] : &:r162_3, r162_2 #-----| Goto -> Block 3 # 164| Block 3 # 164| r164_1(glval) = VariableAddress[b] : # 164| r164_2(glval) = VariableAddress[a] : # 164| r164_3(glval) = FieldAddress[topLeft] : r164_2 -# 164| r164_4(Point) = Load : &:r164_3, ~m? -# 164| m164_5(Point) = Store : &:r164_1, r164_4 +# 164| r164_4(Point) = Load[?] : &:r164_3, ~m? +# 164| m164_5(Point) = Store[b] : &:r164_1, r164_4 # 165| v165_1(void) = NoOp : # 156| v156_10(void) = ReturnVoid : # 156| v156_11(void) = AliasedUse : ~m? @@ -677,26 +677,26 @@ ssa.cpp: # 171| mu171_5(Wrapper) = InitializeParameter[w] : &:r171_4 # 172| r172_1(glval) = VariableAddress[x] : # 172| r172_2(glval) = VariableAddress[w] : -# 172| r172_3(Wrapper) = Load : &:r172_2, ~m? -# 172| m172_4(Wrapper) = Store : &:r172_1, r172_3 +# 172| r172_3(Wrapper) = Load[w] : &:r172_2, ~m? +# 172| m172_4(Wrapper) = Store[x] : &:r172_1, r172_3 # 173| r173_1(glval) = VariableAddress[a] : # 173| r173_2(glval) = VariableAddress[w] : # 173| r173_3(glval) = FieldAddress[f] : r173_2 -# 173| r173_4(int) = Load : &:r173_3, ~m? -# 173| m173_5(int) = Store : &:r173_1, r173_4 +# 173| r173_4(int) = Load[?] : &:r173_3, ~m? +# 173| m173_5(int) = Store[a] : &:r173_1, r173_4 # 174| r174_1(int) = Constant[5] : # 174| r174_2(glval) = VariableAddress[w] : # 174| r174_3(glval) = FieldAddress[f] : r174_2 -# 174| mu174_4(int) = Store : &:r174_3, r174_1 +# 174| mu174_4(int) = Store[?] : &:r174_3, r174_1 # 175| r175_1(glval) = VariableAddress[w] : # 175| r175_2(glval) = FieldAddress[f] : r175_1 -# 175| r175_3(int) = Load : &:r175_2, ~m? +# 175| r175_3(int) = Load[?] : &:r175_2, ~m? # 175| r175_4(glval) = VariableAddress[a] : -# 175| m175_5(int) = Store : &:r175_4, r175_3 +# 175| m175_5(int) = Store[a] : &:r175_4, r175_3 # 176| r176_1(glval) = VariableAddress[w] : -# 176| r176_2(Wrapper) = Load : &:r176_1, ~m? +# 176| r176_2(Wrapper) = Load[w] : &:r176_1, ~m? # 176| r176_3(glval) = VariableAddress[x] : -# 176| m176_4(Wrapper) = Store : &:r176_3, r176_2 +# 176| m176_4(Wrapper) = Store[x] : &:r176_3, r176_2 # 177| v177_1(void) = NoOp : # 171| v171_6(void) = ReturnVoid : # 171| v171_7(void) = AliasedUse : ~m? @@ -709,14 +709,14 @@ ssa.cpp: # 179| mu179_3(unknown) = InitializeNonLocal : # 179| r179_4(glval) = VariableAddress[p] : # 179| m179_5(int *) = InitializeParameter[p] : &:r179_4 -# 179| r179_6(int *) = Load : &:r179_4, m179_5 +# 179| r179_6(int *) = Load[p] : &:r179_4, m179_5 # 179| mu179_7(unknown) = InitializeIndirection[p] : &:r179_6 # 180| mu180_1(unknown) = InlineAsm : ~m? # 181| r181_1(glval) = VariableAddress[#return] : # 181| r181_2(glval) = VariableAddress[p] : -# 181| r181_3(int *) = Load : &:r181_2, m179_5 -# 181| r181_4(int) = Load : &:r181_3, ~m? -# 181| m181_5(int) = Store : &:r181_1, r181_4 +# 181| r181_3(int *) = Load[p] : &:r181_2, m179_5 +# 181| r181_4(int) = Load[?] : &:r181_3, ~m? +# 181| m181_5(int) = Store[#return] : &:r181_1, r181_4 # 179| v179_8(void) = ReturnIndirection[p] : &:r179_6, ~m? # 179| r179_9(glval) = VariableAddress[#return] : # 179| v179_10(void) = ReturnValue : &:r179_9, m181_5 @@ -730,32 +730,32 @@ ssa.cpp: # 184| mu184_3(unknown) = InitializeNonLocal : # 184| r184_4(glval) = VariableAddress[a] : # 184| m184_5(unsigned int &) = InitializeParameter[a] : &:r184_4 -# 184| r184_6(unsigned int &) = Load : &:r184_4, m184_5 +# 184| r184_6(unsigned int &) = Load[a] : &:r184_4, m184_5 # 184| mu184_7(unknown) = InitializeIndirection[a] : &:r184_6 # 184| r184_8(glval) = VariableAddress[b] : # 184| m184_9(unsigned int &) = InitializeParameter[b] : &:r184_8 -# 184| r184_10(unsigned int &) = Load : &:r184_8, m184_9 +# 184| r184_10(unsigned int &) = Load[b] : &:r184_8, m184_9 # 184| mu184_11(unknown) = InitializeIndirection[b] : &:r184_10 # 184| r184_12(glval) = VariableAddress[c] : # 184| m184_13(unsigned int &) = InitializeParameter[c] : &:r184_12 -# 184| r184_14(unsigned int &) = Load : &:r184_12, m184_13 +# 184| r184_14(unsigned int &) = Load[c] : &:r184_12, m184_13 # 184| mu184_15(unknown) = InitializeIndirection[c] : &:r184_14 # 184| r184_16(glval) = VariableAddress[d] : # 184| m184_17(unsigned int &) = InitializeParameter[d] : &:r184_16 -# 184| r184_18(unsigned int &) = Load : &:r184_16, m184_17 +# 184| r184_18(unsigned int &) = Load[d] : &:r184_16, m184_17 # 184| mu184_19(unknown) = InitializeIndirection[d] : &:r184_18 # 189| r189_1(glval) = VariableAddress[a] : -# 189| r189_2(unsigned int &) = Load : &:r189_1, m184_5 +# 189| r189_2(unsigned int &) = Load[a] : &:r189_1, m184_5 # 189| r189_3(glval) = CopyValue : r189_2 # 189| r189_4(glval) = VariableAddress[b] : -# 189| r189_5(unsigned int &) = Load : &:r189_4, m184_9 +# 189| r189_5(unsigned int &) = Load[b] : &:r189_4, m184_9 # 189| r189_6(glval) = CopyValue : r189_5 # 190| r190_1(glval) = VariableAddress[c] : -# 190| r190_2(unsigned int &) = Load : &:r190_1, m184_13 -# 190| r190_3(unsigned int) = Load : &:r190_2, ~m? +# 190| r190_2(unsigned int &) = Load[c] : &:r190_1, m184_13 +# 190| r190_3(unsigned int) = Load[?] : &:r190_2, ~m? # 190| r190_4(glval) = VariableAddress[d] : -# 190| r190_5(unsigned int &) = Load : &:r190_4, m184_17 -# 190| r190_6(unsigned int) = Load : &:r190_5, ~m? +# 190| r190_5(unsigned int &) = Load[d] : &:r190_4, m184_17 +# 190| r190_6(unsigned int) = Load[?] : &:r190_5, ~m? # 186| mu186_1(unknown) = InlineAsm : ~m?, 0:r189_3, 1:r189_6, 2:r190_3, 3:r190_6 # 192| v192_1(void) = NoOp : # 184| v184_20(void) = ReturnIndirection[a] : &:r184_6, ~m? @@ -773,48 +773,48 @@ ssa.cpp: # 198| mu198_3(unknown) = InitializeNonLocal : # 198| r198_4(glval) = VariableAddress[str1] : # 198| m198_5(char *) = InitializeParameter[str1] : &:r198_4 -# 198| r198_6(char *) = Load : &:r198_4, m198_5 +# 198| r198_6(char *) = Load[str1] : &:r198_4, m198_5 # 198| mu198_7(unknown) = InitializeIndirection[str1] : &:r198_6 # 198| r198_8(glval) = VariableAddress[str2] : # 198| m198_9(char *) = InitializeParameter[str2] : &:r198_8 -# 198| r198_10(char *) = Load : &:r198_8, m198_9 +# 198| r198_10(char *) = Load[str2] : &:r198_8, m198_9 # 198| mu198_11(unknown) = InitializeIndirection[str2] : &:r198_10 # 198| r198_12(glval) = VariableAddress[x] : # 198| m198_13(int) = InitializeParameter[x] : &:r198_12 # 199| r199_1(glval) = VariableAddress[ret] : # 199| r199_2(glval) = FunctionAddress[strcmp] : # 199| r199_3(glval) = VariableAddress[str1] : -# 199| r199_4(char *) = Load : &:r199_3, m198_5 +# 199| r199_4(char *) = Load[str1] : &:r199_3, m198_5 # 199| r199_5(char *) = Convert : r199_4 # 199| r199_6(glval) = VariableAddress[str2] : -# 199| r199_7(char *) = Load : &:r199_6, m198_9 +# 199| r199_7(char *) = Load[str2] : &:r199_6, m198_9 # 199| r199_8(char *) = Convert : r199_7 # 199| r199_9(int) = Call[strcmp] : func:r199_2, 0:r199_5, 1:r199_8 # 199| v199_10(void) = ^BufferReadSideEffect[0] : &:r199_5, ~m? # 199| v199_11(void) = ^BufferReadSideEffect[1] : &:r199_8, ~m? -# 199| m199_12(int) = Store : &:r199_1, r199_9 +# 199| m199_12(int) = Store[ret] : &:r199_1, r199_9 # 200| r200_1(glval) = FunctionAddress[strlen] : # 200| r200_2(glval) = VariableAddress[str1] : -# 200| r200_3(char *) = Load : &:r200_2, m198_5 +# 200| r200_3(char *) = Load[str1] : &:r200_2, m198_5 # 200| r200_4(char *) = Convert : r200_3 # 200| r200_5(int) = Call[strlen] : func:r200_1, 0:r200_4 # 200| v200_6(void) = ^BufferReadSideEffect[0] : &:r200_4, ~m? # 200| r200_7(glval) = VariableAddress[ret] : -# 200| r200_8(int) = Load : &:r200_7, m199_12 +# 200| r200_8(int) = Load[ret] : &:r200_7, m199_12 # 200| r200_9(int) = Add : r200_8, r200_5 -# 200| m200_10(int) = Store : &:r200_7, r200_9 +# 200| m200_10(int) = Store[ret] : &:r200_7, r200_9 # 201| r201_1(glval) = FunctionAddress[abs] : # 201| r201_2(glval) = VariableAddress[x] : -# 201| r201_3(int) = Load : &:r201_2, m198_13 +# 201| r201_3(int) = Load[x] : &:r201_2, m198_13 # 201| r201_4(int) = Call[abs] : func:r201_1, 0:r201_3 # 201| r201_5(glval) = VariableAddress[ret] : -# 201| r201_6(int) = Load : &:r201_5, m200_10 +# 201| r201_6(int) = Load[ret] : &:r201_5, m200_10 # 201| r201_7(int) = Add : r201_6, r201_4 -# 201| m201_8(int) = Store : &:r201_5, r201_7 +# 201| m201_8(int) = Store[ret] : &:r201_5, r201_7 # 202| r202_1(glval) = VariableAddress[#return] : # 202| r202_2(glval) = VariableAddress[ret] : -# 202| r202_3(int) = Load : &:r202_2, m201_8 -# 202| m202_4(int) = Store : &:r202_1, r202_3 +# 202| r202_3(int) = Load[ret] : &:r202_2, m201_8 +# 202| m202_4(int) = Store[#return] : &:r202_1, r202_3 # 198| v198_14(void) = ReturnIndirection[str1] : &:r198_6, ~m? # 198| v198_15(void) = ReturnIndirection[str2] : &:r198_10, ~m? # 198| r198_16(glval) = VariableAddress[#return] : @@ -844,8 +844,8 @@ ssa.cpp: # 209| mu209_11(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r209_4, r209_8 # 210| r210_1(glval) = VariableAddress[#return] : # 210| r210_2(glval) = VariableAddress[y] : -# 210| r210_3(int) = Load : &:r210_2, ~m? -# 210| m210_4(int) = Store : &:r210_1, r210_3 +# 210| r210_3(int) = Load[y] : &:r210_2, ~m? +# 210| m210_4(int) = Store[#return] : &:r210_1, r210_3 # 207| r207_6(glval) = VariableAddress[#return] : # 207| v207_7(void) = ReturnValue : &:r207_6, m210_4 # 207| v207_8(void) = AliasedUse : ~m? @@ -858,16 +858,16 @@ ssa.cpp: # 213| mu213_3(unknown) = InitializeNonLocal : # 214| r214_1(glval) = VariableAddress[a_pad] : # 214| r214_2(glval) = StringConstant[""] : -# 214| r214_3(char[32]) = Load : &:r214_2, ~m? -# 214| m214_4(char[32]) = Store : &:r214_1, r214_3 +# 214| r214_3(char[32]) = Load[?] : &:r214_2, ~m? +# 214| m214_4(char[32]) = Store[a_pad] : &:r214_1, r214_3 # 215| r215_1(glval) = VariableAddress[a_nopad] : # 215| r215_2(glval) = StringConstant["foo"] : -# 215| r215_3(char[4]) = Load : &:r215_2, ~m? -# 215| m215_4(char[4]) = Store : &:r215_1, r215_3 +# 215| r215_3(char[4]) = Load[?] : &:r215_2, ~m? +# 215| m215_4(char[4]) = Store[a_nopad] : &:r215_1, r215_3 # 216| r216_1(glval) = VariableAddress[a_infer] : # 216| r216_2(glval) = StringConstant["blah"] : -# 216| r216_3(char[5]) = Load : &:r216_2, ~m? -# 216| m216_4(char[5]) = Store : &:r216_1, r216_3 +# 216| r216_3(char[5]) = Load[?] : &:r216_2, ~m? +# 216| m216_4(char[5]) = Store[a_infer] : &:r216_1, r216_3 # 217| r217_1(glval) = VariableAddress[b] : # 217| m217_2(char[2]) = Uninitialized[b] : &:r217_1 # 218| r218_1(glval) = VariableAddress[c] : @@ -875,37 +875,37 @@ ssa.cpp: # 218| r218_3(int) = Constant[0] : # 218| r218_4(glval) = PointerAdd[1] : r218_1, r218_3 # 218| r218_5(unknown[2]) = Constant[0] : -# 218| mu218_6(unknown[2]) = Store : &:r218_4, r218_5 +# 218| mu218_6(unknown[2]) = Store[?] : &:r218_4, r218_5 # 219| r219_1(glval) = VariableAddress[d] : # 219| mu219_2(char[2]) = Uninitialized[d] : &:r219_1 # 219| r219_3(int) = Constant[0] : # 219| r219_4(glval) = PointerAdd[1] : r219_1, r219_3 # 219| r219_5(char) = Constant[0] : -# 219| mu219_6(char) = Store : &:r219_4, r219_5 +# 219| mu219_6(char) = Store[?] : &:r219_4, r219_5 # 219| r219_7(int) = Constant[1] : # 219| r219_8(glval) = PointerAdd[1] : r219_1, r219_7 # 219| r219_9(char) = Constant[0] : -# 219| mu219_10(char) = Store : &:r219_8, r219_9 +# 219| mu219_10(char) = Store[?] : &:r219_8, r219_9 # 220| r220_1(glval) = VariableAddress[e] : # 220| mu220_2(char[2]) = Uninitialized[e] : &:r220_1 # 220| r220_3(int) = Constant[0] : # 220| r220_4(glval) = PointerAdd[1] : r220_1, r220_3 # 220| r220_5(char) = Constant[0] : -# 220| mu220_6(char) = Store : &:r220_4, r220_5 +# 220| mu220_6(char) = Store[?] : &:r220_4, r220_5 # 220| r220_7(int) = Constant[1] : # 220| r220_8(glval) = PointerAdd[1] : r220_1, r220_7 # 220| r220_9(char) = Constant[1] : -# 220| mu220_10(char) = Store : &:r220_8, r220_9 +# 220| mu220_10(char) = Store[?] : &:r220_8, r220_9 # 221| r221_1(glval) = VariableAddress[f] : # 221| mu221_2(char[3]) = Uninitialized[f] : &:r221_1 # 221| r221_3(int) = Constant[0] : # 221| r221_4(glval) = PointerAdd[1] : r221_1, r221_3 # 221| r221_5(char) = Constant[0] : -# 221| mu221_6(char) = Store : &:r221_4, r221_5 +# 221| mu221_6(char) = Store[?] : &:r221_4, r221_5 # 221| r221_7(int) = Constant[1] : # 221| r221_8(glval) = PointerAdd[1] : r221_1, r221_7 # 221| r221_9(unknown[2]) = Constant[0] : -# 221| mu221_10(unknown[2]) = Store : &:r221_8, r221_9 +# 221| mu221_10(unknown[2]) = Store[?] : &:r221_8, r221_9 # 222| v222_1(void) = NoOp : # 213| v213_4(void) = ReturnVoid : # 213| v213_5(void) = AliasedUse : ~m? @@ -922,14 +922,14 @@ ssa.cpp: # 229| r229_1(glval) = VariableAddress[s] : # 229| r229_2(glval) = StringConstant["Literal"] : # 229| r229_3(char *) = Convert : r229_2 -# 229| m229_4(char *) = Store : &:r229_1, r229_3 +# 229| m229_4(char *) = Store[s] : &:r229_1, r229_3 # 230| r230_1(glval) = VariableAddress[#return] : # 230| r230_2(glval) = VariableAddress[s] : -# 230| r230_3(char *) = Load : &:r230_2, m229_4 +# 230| r230_3(char *) = Load[s] : &:r230_2, m229_4 # 230| r230_4(int) = Constant[2] : # 230| r230_5(glval) = PointerAdd[1] : r230_3, r230_4 -# 230| r230_6(char) = Load : &:r230_5, ~m? -# 230| m230_7(char) = Store : &:r230_1, r230_6 +# 230| r230_6(char) = Load[?] : &:r230_5, ~m? +# 230| m230_7(char) = Store[#return] : &:r230_1, r230_6 # 226| r226_4(glval) = VariableAddress[#return] : # 226| v226_5(void) = ReturnValue : &:r226_4, m230_7 # 226| v226_6(void) = AliasedUse : ~m? @@ -942,7 +942,7 @@ ssa.cpp: # 235| mu235_3(unknown) = InitializeNonLocal : # 235| r235_4(glval) = VariableAddress[#this] : # 235| m235_5(glval) = InitializeParameter[#this] : &:r235_4 -# 235| r235_6(glval) = Load : &:r235_4, m235_5 +# 235| r235_6(glval) = Load[#this] : &:r235_4, m235_5 # 235| mu235_7(Constructible) = InitializeIndirection[#this] : &:r235_6 # 235| r235_8(glval) = VariableAddress[x] : # 235| m235_9(int) = InitializeParameter[x] : &:r235_8 @@ -959,7 +959,7 @@ ssa.cpp: # 236| mu236_3(unknown) = InitializeNonLocal : # 236| r236_4(glval) = VariableAddress[#this] : # 236| m236_5(glval) = InitializeParameter[#this] : &:r236_4 -# 236| r236_6(glval) = Load : &:r236_4, m236_5 +# 236| r236_6(glval) = Load[#this] : &:r236_4, m236_5 # 236| mu236_7(Constructible) = InitializeIndirection[#this] : &:r236_6 # 236| v236_8(void) = NoOp : # 236| v236_9(void) = ReturnIndirection[#this] : &:r236_6, ~m? @@ -1016,14 +1016,14 @@ ssa.cpp: # 247| mu247_3(unknown) = InitializeNonLocal : # 247| r247_4(glval) = VariableAddress[src] : # 247| m247_5(char *) = InitializeParameter[src] : &:r247_4 -# 247| r247_6(char *) = Load : &:r247_4, m247_5 +# 247| r247_6(char *) = Load[src] : &:r247_4, m247_5 # 247| mu247_7(unknown) = InitializeIndirection[src] : &:r247_6 # 247| r247_8(glval) = VariableAddress[size] : # 247| m247_9(int) = InitializeParameter[size] : &:r247_8 # 248| r248_1(glval) = VariableAddress[dst] : # 248| r248_2(glval) = FunctionAddress[operator new[]] : # 248| r248_3(glval) = VariableAddress[size] : -# 248| r248_4(int) = Load : &:r248_3, m247_9 +# 248| r248_4(int) = Load[size] : &:r248_3, m247_9 # 248| r248_5(unsigned long) = Convert : r248_4 # 248| r248_6(unsigned long) = Constant[1] : # 248| r248_7(unsigned long) = Mul : r248_5, r248_6 @@ -1031,28 +1031,28 @@ ssa.cpp: # 248| mu248_9(unknown) = ^CallSideEffect : ~m? # 248| mu248_10(unknown) = ^InitializeDynamicAllocation : &:r248_8 # 248| r248_11(char *) = Convert : r248_8 -# 248| m248_12(char *) = Store : &:r248_1, r248_11 +# 248| m248_12(char *) = Store[dst] : &:r248_1, r248_11 # 249| r249_1(char) = Constant[97] : # 249| r249_2(glval) = VariableAddress[src] : -# 249| r249_3(char *) = Load : &:r249_2, m247_5 +# 249| r249_3(char *) = Load[src] : &:r249_2, m247_5 # 249| r249_4(glval) = CopyValue : r249_3 -# 249| mu249_5(char) = Store : &:r249_4, r249_1 +# 249| mu249_5(char) = Store[?] : &:r249_4, r249_1 # 250| r250_1(glval) = FunctionAddress[memcpy] : # 250| r250_2(glval) = VariableAddress[dst] : -# 250| r250_3(char *) = Load : &:r250_2, m248_12 +# 250| r250_3(char *) = Load[dst] : &:r250_2, m248_12 # 250| r250_4(void *) = Convert : r250_3 # 250| r250_5(glval) = VariableAddress[src] : -# 250| r250_6(char *) = Load : &:r250_5, m247_5 +# 250| r250_6(char *) = Load[src] : &:r250_5, m247_5 # 250| r250_7(void *) = Convert : r250_6 # 250| r250_8(glval) = VariableAddress[size] : -# 250| r250_9(int) = Load : &:r250_8, m247_9 +# 250| r250_9(int) = Load[size] : &:r250_8, m247_9 # 250| r250_10(void *) = Call[memcpy] : func:r250_1, 0:r250_4, 1:r250_7, 2:r250_9 # 250| v250_11(void) = ^SizedBufferReadSideEffect[1] : &:r250_7, r250_9, ~m? # 250| mu250_12(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r250_4, r250_9 # 251| r251_1(glval) = VariableAddress[#return] : # 251| r251_2(glval) = VariableAddress[dst] : -# 251| r251_3(char *) = Load : &:r251_2, m248_12 -# 251| m251_4(char *) = Store : &:r251_1, r251_3 +# 251| r251_3(char *) = Load[dst] : &:r251_2, m248_12 +# 251| m251_4(char *) = Store[#return] : &:r251_1, r251_3 # 247| v247_10(void) = ReturnIndirection[src] : &:r247_6, ~m? # 247| r247_11(glval) = VariableAddress[#return] : # 247| v247_12(void) = ReturnValue : &:r247_11, m251_4 @@ -1067,7 +1067,7 @@ ssa.cpp: # 254| r254_4(glval) = VariableAddress[b] : # 254| m254_5(bool) = InitializeParameter[b] : &:r254_4 # 255| r255_1(glval) = VariableAddress[b] : -# 255| r255_2(bool) = Load : &:r255_1, m254_5 +# 255| r255_2(bool) = Load[b] : &:r255_1, m254_5 # 255| v255_3(void) = ConditionalBranch : r255_2 #-----| False -> Block 2 #-----| True -> Block 1 @@ -1088,14 +1088,14 @@ ssa.cpp: # 262| r262_1(glval) = VariableAddress[s] : # 262| r262_2(glval) = StringConstant["Literal"] : # 262| r262_3(char *) = Convert : r262_2 -# 262| m262_4(char *) = Store : &:r262_1, r262_3 +# 262| m262_4(char *) = Store[s] : &:r262_1, r262_3 # 263| r263_1(glval) = VariableAddress[#return] : # 263| r263_2(glval) = VariableAddress[s] : -# 263| r263_3(char *) = Load : &:r263_2, m262_4 +# 263| r263_3(char *) = Load[s] : &:r263_2, m262_4 # 263| r263_4(int) = Constant[2] : # 263| r263_5(glval) = PointerAdd[1] : r263_3, r263_4 -# 263| r263_6(char) = Load : &:r263_5, ~m? -# 263| m263_7(char) = Store : &:r263_1, r263_6 +# 263| r263_6(char) = Load[?] : &:r263_5, ~m? +# 263| m263_7(char) = Store[#return] : &:r263_1, r263_6 # 254| r254_6(glval) = VariableAddress[#return] : # 254| v254_7(void) = ReturnValue : &:r254_6, m263_7 # 254| v254_8(void) = AliasedUse : ~m? @@ -1108,32 +1108,32 @@ ssa.cpp: # 268| mu268_3(unknown) = InitializeNonLocal : # 268| r268_4(glval) = VariableAddress[s] : # 268| m268_5(void *) = InitializeParameter[s] : &:r268_4 -# 268| r268_6(void *) = Load : &:r268_4, m268_5 +# 268| r268_6(void *) = Load[s] : &:r268_4, m268_5 # 268| mu268_7(unknown) = InitializeIndirection[s] : &:r268_6 # 268| r268_8(glval) = VariableAddress[size] : # 268| m268_9(int) = InitializeParameter[size] : &:r268_8 # 269| r269_1(glval) = VariableAddress[buf] : # 269| r269_2(glval) = FunctionAddress[malloc] : # 269| r269_3(glval) = VariableAddress[size] : -# 269| r269_4(int) = Load : &:r269_3, m268_9 +# 269| r269_4(int) = Load[size] : &:r269_3, m268_9 # 269| r269_5(void *) = Call[malloc] : func:r269_2, 0:r269_4 # 269| mu269_6(unknown) = ^CallSideEffect : ~m? # 269| mu269_7(unknown) = ^InitializeDynamicAllocation : &:r269_5 -# 269| m269_8(void *) = Store : &:r269_1, r269_5 +# 269| m269_8(void *) = Store[buf] : &:r269_1, r269_5 # 270| r270_1(glval) = FunctionAddress[memcpy] : # 270| r270_2(glval) = VariableAddress[buf] : -# 270| r270_3(void *) = Load : &:r270_2, m269_8 +# 270| r270_3(void *) = Load[buf] : &:r270_2, m269_8 # 270| r270_4(glval) = VariableAddress[s] : -# 270| r270_5(void *) = Load : &:r270_4, m268_5 +# 270| r270_5(void *) = Load[s] : &:r270_4, m268_5 # 270| r270_6(glval) = VariableAddress[size] : -# 270| r270_7(int) = Load : &:r270_6, m268_9 +# 270| r270_7(int) = Load[size] : &:r270_6, m268_9 # 270| r270_8(void *) = Call[memcpy] : func:r270_1, 0:r270_3, 1:r270_5, 2:r270_7 # 270| v270_9(void) = ^SizedBufferReadSideEffect[1] : &:r270_5, r270_7, ~m? # 270| mu270_10(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r270_3, r270_7 # 271| r271_1(glval) = VariableAddress[#return] : # 271| r271_2(glval) = VariableAddress[buf] : -# 271| r271_3(void *) = Load : &:r271_2, m269_8 -# 271| m271_4(void *) = Store : &:r271_1, r271_3 +# 271| r271_3(void *) = Load[buf] : &:r271_2, m269_8 +# 271| m271_4(void *) = Store[#return] : &:r271_1, r271_3 # 268| v268_10(void) = ReturnIndirection[s] : &:r268_6, ~m? # 268| r268_11(glval) = VariableAddress[#return] : # 268| v268_12(void) = ReturnValue : &:r268_11, m271_4 @@ -1155,34 +1155,34 @@ ssa.cpp: # 276| mu276_2(Point) = Uninitialized[a] : &:r276_1 # 276| r276_3(glval) = FieldAddress[x] : r276_1 # 276| r276_4(int) = Constant[0] : -# 276| mu276_5(int) = Store : &:r276_3, r276_4 +# 276| mu276_5(int) = Store[?] : &:r276_3, r276_4 # 276| r276_6(glval) = FieldAddress[y] : r276_1 # 276| r276_7(int) = Constant[0] : -# 276| mu276_8(int) = Store : &:r276_6, r276_7 +# 276| mu276_8(int) = Store[?] : &:r276_6, r276_7 # 277| r277_1(glval) = VariableAddress[a] : # 277| r277_2(Point *) = CopyValue : r277_1 # 277| r277_3(glval) = VariableAddress[pp] : -# 277| mu277_4(Point *) = Store : &:r277_3, r277_2 +# 277| mu277_4(Point *) = Store[pp] : &:r277_3, r277_2 # 278| r278_1(glval) = VariableAddress[c] : -# 278| r278_2(bool) = Load : &:r278_1, m275_5 +# 278| r278_2(bool) = Load[c] : &:r278_1, m275_5 # 278| v278_3(void) = ConditionalBranch : r278_2 #-----| False -> Block 2 #-----| True -> Block 1 # 279| Block 1 # 279| r279_1(glval) = VariableAddress[x1] : -# 279| r279_2(int) = Load : &:r279_1, m275_9 +# 279| r279_2(int) = Load[x1] : &:r279_1, m275_9 # 279| r279_3(glval) = VariableAddress[a] : # 279| r279_4(glval) = FieldAddress[x] : r279_3 -# 279| mu279_5(int) = Store : &:r279_4, r279_2 +# 279| mu279_5(int) = Store[?] : &:r279_4, r279_2 #-----| Goto -> Block 2 # 281| Block 2 # 281| r281_1(glval) = VariableAddress[x] : # 281| r281_2(glval) = VariableAddress[a] : # 281| r281_3(glval) = FieldAddress[x] : r281_2 -# 281| r281_4(int) = Load : &:r281_3, ~m? -# 281| m281_5(int) = Store : &:r281_1, r281_4 +# 281| r281_4(int) = Load[?] : &:r281_3, ~m? +# 281| m281_5(int) = Store[x] : &:r281_1, r281_4 # 282| v282_1(void) = NoOp : # 275| v275_10(void) = ReturnVoid : # 275| v275_11(void) = AliasedUse : ~m? @@ -1195,7 +1195,7 @@ ssa.cpp: # 286| mu286_3(unknown) = InitializeNonLocal : # 286| r286_4(glval) = VariableAddress[#this] : # 286| m286_5(glval) = InitializeParameter[#this] : &:r286_4 -# 286| r286_6(glval) = Load : &:r286_4, m286_5 +# 286| r286_6(glval) = Load[#this] : &:r286_4, m286_5 # 286| mu286_7(A) = InitializeIndirection[#this] : &:r286_6 # 286| r286_8(glval) = VariableAddress[x] : # 286| m286_9(int) = InitializeParameter[x] : &:r286_8 @@ -1212,11 +1212,11 @@ ssa.cpp: # 287| mu287_3(unknown) = InitializeNonLocal : # 287| r287_4(glval) = VariableAddress[#this] : # 287| m287_5(glval) = InitializeParameter[#this] : &:r287_4 -# 287| r287_6(glval) = Load : &:r287_4, m287_5 +# 287| r287_6(glval) = Load[#this] : &:r287_4, m287_5 # 287| mu287_7(A) = InitializeIndirection[#this] : &:r287_6 # 287| r287_8(glval) = VariableAddress[p#0] : # 287| m287_9(A *) = InitializeParameter[p#0] : &:r287_8 -# 287| r287_10(A *) = Load : &:r287_8, m287_9 +# 287| r287_10(A *) = Load[p#0] : &:r287_8, m287_9 # 287| mu287_11(unknown) = InitializeIndirection[p#0] : &:r287_10 # 287| v287_12(void) = NoOp : # 287| v287_13(void) = ReturnIndirection[#this] : &:r287_6, ~m? @@ -1232,7 +1232,7 @@ ssa.cpp: # 288| mu288_3(unknown) = InitializeNonLocal : # 288| r288_4(glval) = VariableAddress[#this] : # 288| m288_5(glval) = InitializeParameter[#this] : &:r288_4 -# 288| r288_6(glval) = Load : &:r288_4, m288_5 +# 288| r288_6(glval) = Load[#this] : &:r288_4, m288_5 # 288| mu288_7(A) = InitializeIndirection[#this] : &:r288_6 # 288| v288_8(void) = NoOp : # 288| v288_9(void) = ReturnIndirection[#this] : &:r288_6, ~m? @@ -1254,7 +1254,7 @@ ssa.cpp: # 292| mu292_5(unknown) = ^CallSideEffect : ~m? # 292| mu292_6(unknown) = ^InitializeDynamicAllocation : &:r292_4 # 292| r292_7(Point *) = Convert : r292_4 -# 292| m292_8(Point *) = Store : &:r292_1, r292_7 +# 292| m292_8(Point *) = Store[p] : &:r292_1, r292_7 # 293| r293_1(glval) = VariableAddress[q] : # 293| r293_2(glval) = FunctionAddress[operator new] : # 293| r293_3(unsigned long) = Constant[8] : @@ -1262,7 +1262,7 @@ ssa.cpp: # 293| mu293_5(unknown) = ^CallSideEffect : ~m? # 293| mu293_6(unknown) = ^InitializeDynamicAllocation : &:r293_4 # 293| r293_7(Point *) = Convert : r293_4 -# 293| m293_8(Point *) = Store : &:r293_1, r293_7 +# 293| m293_8(Point *) = Store[q] : &:r293_1, r293_7 # 294| r294_1(glval) = VariableAddress[j] : # 294| r294_2(glval) = FunctionAddress[operator new] : # 294| r294_3(unsigned long) = Constant[4] : @@ -1279,7 +1279,7 @@ ssa.cpp: # 294| r294_14(A *) = Convert : r294_11 # 294| r294_15(glval) = FunctionAddress[A] : # 294| r294_16(glval) = VariableAddress[x] : -# 294| r294_17(int) = Load : &:r294_16, m291_5 +# 294| r294_17(int) = Load[x] : &:r294_16, m291_5 # 294| v294_18(void) = Call[A] : func:r294_15, this:r294_14, 0:r294_17 # 294| mu294_19(unknown) = ^CallSideEffect : ~m? # 294| mu294_20(A) = ^IndirectMayWriteSideEffect[-1] : &:r294_14 @@ -1289,8 +1289,8 @@ ssa.cpp: # 294| v294_24(void) = ^BufferReadSideEffect[0] : &:r294_14, ~m? # 294| mu294_25(unknown) = ^BufferMayWriteSideEffect[0] : &:r294_14 # 294| r294_26(glval) = FieldAddress[i] : r294_7 -# 294| r294_27(int) = Load : &:r294_26, ~m? -# 294| m294_28(int) = Store : &:r294_1, r294_27 +# 294| r294_27(int) = Load[?] : &:r294_26, ~m? +# 294| m294_28(int) = Store[j] : &:r294_1, r294_27 # 295| r295_1(glval) = VariableAddress[a] : # 295| r295_2(glval) = FunctionAddress[operator new] : # 295| r295_3(unsigned long) = Constant[4] : @@ -1302,11 +1302,11 @@ ssa.cpp: # 295| v295_9(void) = Call[A] : func:r295_8, this:r295_7 # 295| mu295_10(unknown) = ^CallSideEffect : ~m? # 295| mu295_11(A) = ^IndirectMayWriteSideEffect[-1] : &:r295_7 -# 295| m295_12(A *) = Store : &:r295_1, r295_7 +# 295| m295_12(A *) = Store[a] : &:r295_1, r295_7 # 296| r296_1(glval) = VariableAddress[#return] : # 296| r296_2(glval) = VariableAddress[p] : -# 296| r296_3(Point *) = Load : &:r296_2, m292_8 -# 296| m296_4(Point *) = Store : &:r296_1, r296_3 +# 296| r296_3(Point *) = Load[p] : &:r296_2, m292_8 +# 296| m296_4(Point *) = Store[#return] : &:r296_1, r296_3 # 291| r291_6(glval) = VariableAddress[#return] : # 291| v291_7(void) = ReturnValue : &:r291_6, m296_4 # 291| v291_8(void) = AliasedUse : ~m? @@ -1321,33 +1321,33 @@ ssa.cpp: # 301| m301_5(int) = InitializeParameter[argc] : &:r301_4 # 301| r301_6(glval) = VariableAddress[argv] : # 301| m301_7(char **) = InitializeParameter[argv] : &:r301_6 -# 301| r301_8(char **) = Load : &:r301_6, m301_7 +# 301| r301_8(char **) = Load[argv] : &:r301_6, m301_7 # 301| mu301_9(unknown) = InitializeIndirection[argv] : &:r301_8 # 302| r302_1(glval) = FunctionAddress[unknownFunction] : # 302| r302_2(glval) = VariableAddress[argc] : -# 302| r302_3(int) = Load : &:r302_2, m301_5 +# 302| r302_3(int) = Load[argc] : &:r302_2, m301_5 # 302| r302_4(glval) = VariableAddress[argv] : -# 302| r302_5(char **) = Load : &:r302_4, m301_7 +# 302| r302_5(char **) = Load[argv] : &:r302_4, m301_7 # 302| v302_6(void) = Call[unknownFunction] : func:r302_1, 0:r302_3, 1:r302_5 # 302| mu302_7(unknown) = ^CallSideEffect : ~m? # 302| v302_8(void) = ^BufferReadSideEffect[1] : &:r302_5, ~m? # 302| mu302_9(unknown) = ^BufferMayWriteSideEffect[1] : &:r302_5 # 303| r303_1(glval) = FunctionAddress[unknownFunction] : # 303| r303_2(glval) = VariableAddress[argc] : -# 303| r303_3(int) = Load : &:r303_2, m301_5 +# 303| r303_3(int) = Load[argc] : &:r303_2, m301_5 # 303| r303_4(glval) = VariableAddress[argv] : -# 303| r303_5(char **) = Load : &:r303_4, m301_7 +# 303| r303_5(char **) = Load[argv] : &:r303_4, m301_7 # 303| v303_6(void) = Call[unknownFunction] : func:r303_1, 0:r303_3, 1:r303_5 # 303| mu303_7(unknown) = ^CallSideEffect : ~m? # 303| v303_8(void) = ^BufferReadSideEffect[1] : &:r303_5, ~m? # 303| mu303_9(unknown) = ^BufferMayWriteSideEffect[1] : &:r303_5 # 304| r304_1(glval) = VariableAddress[#return] : # 304| r304_2(glval) = VariableAddress[argv] : -# 304| r304_3(char **) = Load : &:r304_2, m301_7 -# 304| r304_4(char *) = Load : &:r304_3, ~m? -# 304| r304_5(char) = Load : &:r304_4, ~m? +# 304| r304_3(char **) = Load[argv] : &:r304_2, m301_7 +# 304| r304_4(char *) = Load[?] : &:r304_3, ~m? +# 304| r304_5(char) = Load[?] : &:r304_4, ~m? # 304| r304_6(int) = Convert : r304_5 -# 304| m304_7(int) = Store : &:r304_1, r304_6 +# 304| m304_7(int) = Store[#return] : &:r304_1, r304_6 # 301| v301_10(void) = ReturnIndirection[argv] : &:r301_8, ~m? # 301| r301_11(glval) = VariableAddress[#return] : # 301| v301_12(void) = ReturnValue : &:r301_11, m304_7 @@ -1361,16 +1361,16 @@ ssa.cpp: # 310| mu310_3(unknown) = InitializeNonLocal : # 310| r310_4(glval) = VariableAddress[#this] : # 310| m310_5(glval) = InitializeParameter[#this] : &:r310_4 -# 310| r310_6(glval) = Load : &:r310_4, m310_5 +# 310| r310_6(glval) = Load[#this] : &:r310_4, m310_5 # 310| mu310_7(ThisAliasTest) = InitializeIndirection[#this] : &:r310_6 # 310| r310_8(glval) = VariableAddress[arg] : # 310| m310_9(int) = InitializeParameter[arg] : &:r310_8 # 311| r311_1(glval) = VariableAddress[arg] : -# 311| r311_2(int) = Load : &:r311_1, m310_9 +# 311| r311_2(int) = Load[arg] : &:r311_1, m310_9 # 311| r311_3(glval) = VariableAddress[#this] : -# 311| r311_4(ThisAliasTest *) = Load : &:r311_3, m310_5 +# 311| r311_4(ThisAliasTest *) = Load[#this] : &:r311_3, m310_5 # 311| r311_5(glval) = FieldAddress[x] : r311_4 -# 311| mu311_6(int) = Store : &:r311_5, r311_2 +# 311| mu311_6(int) = Store[?] : &:r311_5, r311_2 # 312| v312_1(void) = NoOp : # 310| v310_10(void) = ReturnIndirection[#this] : &:r310_6, ~m? # 310| v310_11(void) = ReturnVoid : diff --git a/cpp/ql/test/library-tests/valuenumbering/GlobalValueNumbering/ir_gvn.expected b/cpp/ql/test/library-tests/valuenumbering/GlobalValueNumbering/ir_gvn.expected index 0f8f7079b40f..24dc1c1ab446 100644 --- a/cpp/ql/test/library-tests/valuenumbering/GlobalValueNumbering/ir_gvn.expected +++ b/cpp/ql/test/library-tests/valuenumbering/GlobalValueNumbering/ir_gvn.expected @@ -30,39 +30,39 @@ test.cpp: # 3| valnum = unique # 5| r5_1(glval) = VariableAddress[p0] : # 5| valnum = r1_5, r5_1, r6_1 -# 5| r5_2(int) = Load : &:r5_1, m1_6 +# 5| r5_2(int) = Load[p0] : &:r5_1, m1_6 # 5| valnum = m1_6, r5_2, r6_2 # 5| r5_3(glval) = VariableAddress[p1] : # 5| valnum = r1_7, r5_3, r6_3 -# 5| r5_4(int) = Load : &:r5_3, m1_8 +# 5| r5_4(int) = Load[p1] : &:r5_3, m1_8 # 5| valnum = m1_8, r5_4, r6_4 # 5| r5_5(int) = Add : r5_2, r5_4 # 5| valnum = m5_7, m6_7, m7_4, r5_5, r6_5, r7_2 # 5| r5_6(glval) = VariableAddress[x] : # 5| valnum = r2_1, r5_6, r6_6, r7_1 -# 5| m5_7(int) = Store : &:r5_6, r5_5 +# 5| m5_7(int) = Store[x] : &:r5_6, r5_5 # 5| valnum = m5_7, m6_7, m7_4, r5_5, r6_5, r7_2 # 6| r6_1(glval) = VariableAddress[p0] : # 6| valnum = r1_5, r5_1, r6_1 -# 6| r6_2(int) = Load : &:r6_1, m1_6 +# 6| r6_2(int) = Load[p0] : &:r6_1, m1_6 # 6| valnum = m1_6, r5_2, r6_2 # 6| r6_3(glval) = VariableAddress[p1] : # 6| valnum = r1_7, r5_3, r6_3 -# 6| r6_4(int) = Load : &:r6_3, m1_8 +# 6| r6_4(int) = Load[p1] : &:r6_3, m1_8 # 6| valnum = m1_8, r5_4, r6_4 # 6| r6_5(int) = Add : r6_2, r6_4 # 6| valnum = m5_7, m6_7, m7_4, r5_5, r6_5, r7_2 # 6| r6_6(glval) = VariableAddress[x] : # 6| valnum = r2_1, r5_6, r6_6, r7_1 -# 6| m6_7(int) = Store : &:r6_6, r6_5 +# 6| m6_7(int) = Store[x] : &:r6_6, r6_5 # 6| valnum = m5_7, m6_7, m7_4, r5_5, r6_5, r7_2 # 7| r7_1(glval) = VariableAddress[x] : # 7| valnum = r2_1, r5_6, r6_6, r7_1 -# 7| r7_2(int) = Load : &:r7_1, m6_7 +# 7| r7_2(int) = Load[x] : &:r7_1, m6_7 # 7| valnum = m5_7, m6_7, m7_4, r5_5, r6_5, r7_2 # 7| r7_3(glval) = VariableAddress[y] : # 7| valnum = r2_3, r7_3 -# 7| m7_4(int) = Store : &:r7_3, r7_2 +# 7| m7_4(int) = Store[y] : &:r7_3, r7_2 # 7| valnum = m5_7, m6_7, m7_4, r5_5, r6_5, r7_2 # 8| v8_1(void) = NoOp : # 1| v1_9(void) = ReturnVoid : @@ -100,51 +100,51 @@ test.cpp: # 14| valnum = unique # 16| r16_1(glval) = VariableAddress[p0] : # 16| valnum = r12_5, r16_1, r17_1 -# 16| r16_2(int) = Load : &:r16_1, m12_6 +# 16| r16_2(int) = Load[p0] : &:r16_1, m12_6 # 16| valnum = m12_6, r16_2, r17_2 # 16| r16_3(glval) = VariableAddress[p1] : # 16| valnum = r12_7, r16_3, r17_3 -# 16| r16_4(int) = Load : &:r16_3, m12_8 +# 16| r16_4(int) = Load[p1] : &:r16_3, m12_8 # 16| valnum = m12_8, r16_4, r17_4 # 16| r16_5(int) = Add : r16_2, r16_4 # 16| valnum = r16_5, r17_5 # 16| r16_6(glval) = VariableAddress[global01] : # 16| valnum = r16_6, r17_6 -# 16| r16_7(int) = Load : &:r16_6, ~m12_3 +# 16| r16_7(int) = Load[global01] : &:r16_6, ~m12_3 # 16| valnum = r16_7, r17_7 # 16| r16_8(int) = Add : r16_5, r16_7 # 16| valnum = m16_10, m17_10, m18_4, r16_8, r17_8, r18_2 # 16| r16_9(glval) = VariableAddress[x] : # 16| valnum = r13_1, r16_9, r17_9, r18_1 -# 16| m16_10(int) = Store : &:r16_9, r16_8 +# 16| m16_10(int) = Store[x] : &:r16_9, r16_8 # 16| valnum = m16_10, m17_10, m18_4, r16_8, r17_8, r18_2 # 17| r17_1(glval) = VariableAddress[p0] : # 17| valnum = r12_5, r16_1, r17_1 -# 17| r17_2(int) = Load : &:r17_1, m12_6 +# 17| r17_2(int) = Load[p0] : &:r17_1, m12_6 # 17| valnum = m12_6, r16_2, r17_2 # 17| r17_3(glval) = VariableAddress[p1] : # 17| valnum = r12_7, r16_3, r17_3 -# 17| r17_4(int) = Load : &:r17_3, m12_8 +# 17| r17_4(int) = Load[p1] : &:r17_3, m12_8 # 17| valnum = m12_8, r16_4, r17_4 # 17| r17_5(int) = Add : r17_2, r17_4 # 17| valnum = r16_5, r17_5 # 17| r17_6(glval) = VariableAddress[global01] : # 17| valnum = r16_6, r17_6 -# 17| r17_7(int) = Load : &:r17_6, ~m12_3 +# 17| r17_7(int) = Load[global01] : &:r17_6, ~m12_3 # 17| valnum = r16_7, r17_7 # 17| r17_8(int) = Add : r17_5, r17_7 # 17| valnum = m16_10, m17_10, m18_4, r16_8, r17_8, r18_2 # 17| r17_9(glval) = VariableAddress[x] : # 17| valnum = r13_1, r16_9, r17_9, r18_1 -# 17| m17_10(int) = Store : &:r17_9, r17_8 +# 17| m17_10(int) = Store[x] : &:r17_9, r17_8 # 17| valnum = m16_10, m17_10, m18_4, r16_8, r17_8, r18_2 # 18| r18_1(glval) = VariableAddress[x] : # 18| valnum = r13_1, r16_9, r17_9, r18_1 -# 18| r18_2(int) = Load : &:r18_1, m17_10 +# 18| r18_2(int) = Load[x] : &:r18_1, m17_10 # 18| valnum = m16_10, m17_10, m18_4, r16_8, r17_8, r18_2 # 18| r18_3(glval) = VariableAddress[y] : # 18| valnum = r13_3, r18_3 -# 18| m18_4(int) = Store : &:r18_3, r18_2 +# 18| m18_4(int) = Store[y] : &:r18_3, r18_2 # 18| valnum = m16_10, m17_10, m18_4, r16_8, r17_8, r18_2 # 19| v19_1(void) = NoOp : # 12| v12_9(void) = ReturnVoid : @@ -182,23 +182,23 @@ test.cpp: # 27| valnum = unique # 29| r29_1(glval) = VariableAddress[p0] : # 29| valnum = r25_5, r29_1, r31_1 -# 29| r29_2(int) = Load : &:r29_1, m25_6 +# 29| r29_2(int) = Load[p0] : &:r29_1, m25_6 # 29| valnum = m25_6, r29_2, r31_2 # 29| r29_3(glval) = VariableAddress[p1] : # 29| valnum = r25_7, r29_3, r31_3 -# 29| r29_4(int) = Load : &:r29_3, m25_8 +# 29| r29_4(int) = Load[p1] : &:r29_3, m25_8 # 29| valnum = m25_8, r29_4, r31_4 # 29| r29_5(int) = Add : r29_2, r29_4 # 29| valnum = r29_5, r31_5 # 29| r29_6(glval) = VariableAddress[global02] : # 29| valnum = r29_6, r31_6 -# 29| r29_7(int) = Load : &:r29_6, ~m25_3 +# 29| r29_7(int) = Load[global02] : &:r29_6, ~m25_3 # 29| valnum = unique # 29| r29_8(int) = Add : r29_5, r29_7 # 29| valnum = m29_10, r29_8 # 29| r29_9(glval) = VariableAddress[x] : # 29| valnum = r26_1, r29_9, r31_9, r32_1 -# 29| m29_10(int) = Store : &:r29_9, r29_8 +# 29| m29_10(int) = Store[x] : &:r29_9, r29_8 # 29| valnum = m29_10, r29_8 # 30| r30_1(glval) = FunctionAddress[change_global02] : # 30| valnum = unique @@ -209,31 +209,31 @@ test.cpp: # 30| valnum = unique # 31| r31_1(glval) = VariableAddress[p0] : # 31| valnum = r25_5, r29_1, r31_1 -# 31| r31_2(int) = Load : &:r31_1, m25_6 +# 31| r31_2(int) = Load[p0] : &:r31_1, m25_6 # 31| valnum = m25_6, r29_2, r31_2 # 31| r31_3(glval) = VariableAddress[p1] : # 31| valnum = r25_7, r29_3, r31_3 -# 31| r31_4(int) = Load : &:r31_3, m25_8 +# 31| r31_4(int) = Load[p1] : &:r31_3, m25_8 # 31| valnum = m25_8, r29_4, r31_4 # 31| r31_5(int) = Add : r31_2, r31_4 # 31| valnum = r29_5, r31_5 # 31| r31_6(glval) = VariableAddress[global02] : # 31| valnum = r29_6, r31_6 -# 31| r31_7(int) = Load : &:r31_6, ~m30_4 +# 31| r31_7(int) = Load[global02] : &:r31_6, ~m30_4 # 31| valnum = unique # 31| r31_8(int) = Add : r31_5, r31_7 # 31| valnum = m31_10, m32_4, r31_8, r32_2 # 31| r31_9(glval) = VariableAddress[x] : # 31| valnum = r26_1, r29_9, r31_9, r32_1 -# 31| m31_10(int) = Store : &:r31_9, r31_8 +# 31| m31_10(int) = Store[x] : &:r31_9, r31_8 # 31| valnum = m31_10, m32_4, r31_8, r32_2 # 32| r32_1(glval) = VariableAddress[x] : # 32| valnum = r26_1, r29_9, r31_9, r32_1 -# 32| r32_2(int) = Load : &:r32_1, m31_10 +# 32| r32_2(int) = Load[x] : &:r32_1, m31_10 # 32| valnum = m31_10, m32_4, r31_8, r32_2 # 32| r32_3(glval) = VariableAddress[y] : # 32| valnum = r26_3, r32_3 -# 32| m32_4(int) = Store : &:r32_3, r32_2 +# 32| m32_4(int) = Store[y] : &:r32_3, r32_2 # 32| valnum = m31_10, m32_4, r31_8, r32_2 # 33| v33_1(void) = NoOp : # 25| v25_9(void) = ReturnVoid : @@ -261,7 +261,7 @@ test.cpp: # 39| valnum = r39_9, r44_2 # 39| m39_10(int *) = InitializeParameter[p2] : &:r39_9 # 39| valnum = m39_10, r39_11, r44_3, r44_4 -# 39| r39_11(int *) = Load : &:r39_9, m39_10 +# 39| r39_11(int *) = Load[p2] : &:r39_9, m39_10 # 39| valnum = m39_10, r39_11, r44_3, r44_4 # 39| m39_12(unknown) = InitializeIndirection[p2] : &:r39_11 # 39| valnum = unique @@ -279,63 +279,63 @@ test.cpp: # 41| valnum = unique # 43| r43_1(glval) = VariableAddress[p0] : # 43| valnum = r39_5, r43_1, r45_1 -# 43| r43_2(int) = Load : &:r43_1, m39_6 +# 43| r43_2(int) = Load[p0] : &:r43_1, m39_6 # 43| valnum = m39_6, r43_2, r45_2 # 43| r43_3(glval) = VariableAddress[p1] : # 43| valnum = r39_7, r43_3, r45_3 -# 43| r43_4(int) = Load : &:r43_3, m39_8 +# 43| r43_4(int) = Load[p1] : &:r43_3, m39_8 # 43| valnum = m39_8, r43_4, r45_4 # 43| r43_5(int) = Add : r43_2, r43_4 # 43| valnum = r43_5, r45_5 # 43| r43_6(glval) = VariableAddress[global03] : # 43| valnum = r43_6, r45_6 -# 43| r43_7(int) = Load : &:r43_6, ~m39_3 +# 43| r43_7(int) = Load[global03] : &:r43_6, ~m39_3 # 43| valnum = r43_7, r45_7 # 43| r43_8(int) = Add : r43_5, r43_7 # 43| valnum = m43_10, m45_10, m46_4, r43_8, r45_8, r46_2 # 43| r43_9(glval) = VariableAddress[x] : # 43| valnum = r40_1, r43_9, r45_9, r46_1 -# 43| m43_10(int) = Store : &:r43_9, r43_8 +# 43| m43_10(int) = Store[x] : &:r43_9, r43_8 # 43| valnum = m43_10, m45_10, m46_4, r43_8, r45_8, r46_2 # 44| r44_1(int) = Constant[0] : # 44| valnum = m44_5, r44_1 # 44| r44_2(glval) = VariableAddress[p2] : # 44| valnum = r39_9, r44_2 -# 44| r44_3(int *) = Load : &:r44_2, m39_10 +# 44| r44_3(int *) = Load[p2] : &:r44_2, m39_10 # 44| valnum = m39_10, r39_11, r44_3, r44_4 # 44| r44_4(glval) = CopyValue : r44_3 # 44| valnum = m39_10, r39_11, r44_3, r44_4 -# 44| m44_5(int) = Store : &:r44_4, r44_1 +# 44| m44_5(int) = Store[?] : &:r44_4, r44_1 # 44| valnum = m44_5, r44_1 # 44| m44_6(unknown) = Chi : total:m39_12, partial:m44_5 # 44| valnum = unique # 45| r45_1(glval) = VariableAddress[p0] : # 45| valnum = r39_5, r43_1, r45_1 -# 45| r45_2(int) = Load : &:r45_1, m39_6 +# 45| r45_2(int) = Load[p0] : &:r45_1, m39_6 # 45| valnum = m39_6, r43_2, r45_2 # 45| r45_3(glval) = VariableAddress[p1] : # 45| valnum = r39_7, r43_3, r45_3 -# 45| r45_4(int) = Load : &:r45_3, m39_8 +# 45| r45_4(int) = Load[p1] : &:r45_3, m39_8 # 45| valnum = m39_8, r43_4, r45_4 # 45| r45_5(int) = Add : r45_2, r45_4 # 45| valnum = r43_5, r45_5 # 45| r45_6(glval) = VariableAddress[global03] : # 45| valnum = r43_6, r45_6 -# 45| r45_7(int) = Load : &:r45_6, ~m39_3 +# 45| r45_7(int) = Load[global03] : &:r45_6, ~m39_3 # 45| valnum = r43_7, r45_7 # 45| r45_8(int) = Add : r45_5, r45_7 # 45| valnum = m43_10, m45_10, m46_4, r43_8, r45_8, r46_2 # 45| r45_9(glval) = VariableAddress[x] : # 45| valnum = r40_1, r43_9, r45_9, r46_1 -# 45| m45_10(int) = Store : &:r45_9, r45_8 +# 45| m45_10(int) = Store[x] : &:r45_9, r45_8 # 45| valnum = m43_10, m45_10, m46_4, r43_8, r45_8, r46_2 # 46| r46_1(glval) = VariableAddress[x] : # 46| valnum = r40_1, r43_9, r45_9, r46_1 -# 46| r46_2(int) = Load : &:r46_1, m45_10 +# 46| r46_2(int) = Load[x] : &:r46_1, m45_10 # 46| valnum = m43_10, m45_10, m46_4, r43_8, r45_8, r46_2 # 46| r46_3(glval) = VariableAddress[y] : # 46| valnum = r40_3, r46_3 -# 46| m46_4(int) = Store : &:r46_3, r46_2 +# 46| m46_4(int) = Store[y] : &:r46_3, r46_2 # 46| valnum = m43_10, m45_10, m46_4, r43_8, r45_8, r46_2 # 47| v47_1(void) = NoOp : # 39| v39_13(void) = ReturnIndirection[p2] : &:r39_11, m44_6 @@ -356,7 +356,7 @@ test.cpp: # 49| valnum = r49_5, r53_2, r56_6 # 49| m49_6(char *) = InitializeParameter[str] : &:r49_5 # 49| valnum = m49_6, r49_7, r53_3, r56_7 -# 49| r49_7(char *) = Load : &:r49_5, m49_6 +# 49| r49_7(char *) = Load[str] : &:r49_5, m49_6 # 49| valnum = m49_6, r49_7, r53_3, r56_7 # 49| m49_8(unknown) = InitializeIndirection[str] : &:r49_7 # 49| valnum = unique @@ -364,7 +364,7 @@ test.cpp: # 49| valnum = r49_9, r55_1 # 49| m49_10(char *) = InitializeParameter[chars] : &:r49_9 # 49| valnum = m49_10, m55_4, r49_11, r55_2 -# 49| r49_11(char *) = Load : &:r49_9, m49_10 +# 49| r49_11(char *) = Load[chars] : &:r49_9, m49_10 # 49| valnum = m49_10, m55_4, r49_11, r55_2 # 49| m49_12(unknown) = InitializeIndirection[chars] : &:r49_11 # 49| valnum = unique @@ -376,7 +376,7 @@ test.cpp: # 51| valnum = r51_1, r62_1, r65_2 # 51| r51_2(unsigned int) = Constant[0] : # 51| valnum = m51_3, r51_2 -# 51| m51_3(unsigned int) = Store : &:r51_1, r51_2 +# 51| m51_3(unsigned int) = Store[result] : &:r51_1, r51_2 # 51| valnum = m51_3, r51_2 #-----| Goto -> Block 1 @@ -385,9 +385,9 @@ test.cpp: # 53| valnum = m53_1, m65_4, r62_2, r65_3 # 53| r53_2(glval) = VariableAddress[str] : # 53| valnum = r49_5, r53_2, r56_6 -# 53| r53_3(char *) = Load : &:r53_2, m49_6 +# 53| r53_3(char *) = Load[str] : &:r53_2, m49_6 # 53| valnum = m49_6, r49_7, r53_3, r56_7 -# 53| r53_4(char) = Load : &:r53_3, ~m49_8 +# 53| r53_4(char) = Load[?] : &:r53_3, ~m49_8 # 53| valnum = r53_4, r56_8 # 53| r53_5(int) = Convert : r53_4 # 53| valnum = r53_5, r56_9 @@ -402,11 +402,11 @@ test.cpp: # 55| Block 2 # 55| r55_1(glval) = VariableAddress[chars] : # 55| valnum = r49_9, r55_1 -# 55| r55_2(char *) = Load : &:r55_1, m49_10 +# 55| r55_2(char *) = Load[chars] : &:r55_1, m49_10 # 55| valnum = m49_10, m55_4, r49_11, r55_2 # 55| r55_3(glval) = VariableAddress[ptr] : # 55| valnum = r50_1, r55_3, r56_12, r56_19, r56_2, r59_1 -# 55| m55_4(char *) = Store : &:r55_3, r55_2 +# 55| m55_4(char *) = Store[ptr] : &:r55_3, r55_2 # 55| valnum = m49_10, m55_4, r49_11, r55_2 #-----| Goto -> Block 3 @@ -415,17 +415,17 @@ test.cpp: # 56| valnum = m56_1, r56_13, r56_20, r56_3, r59_2 # 56| r56_2(glval) = VariableAddress[ptr] : # 56| valnum = r50_1, r55_3, r56_12, r56_19, r56_2, r59_1 -# 56| r56_3(char *) = Load : &:r56_2, m56_1 +# 56| r56_3(char *) = Load[ptr] : &:r56_2, m56_1 # 56| valnum = m56_1, r56_13, r56_20, r56_3, r59_2 -# 56| r56_4(char) = Load : &:r56_3, ~m49_4 +# 56| r56_4(char) = Load[?] : &:r56_3, ~m49_4 # 56| valnum = r56_14, r56_4, r59_3 # 56| r56_5(int) = Convert : r56_4 # 56| valnum = r56_15, r56_5, r59_4 # 56| r56_6(glval) = VariableAddress[str] : # 56| valnum = r49_5, r53_2, r56_6 -# 56| r56_7(char *) = Load : &:r56_6, m49_6 +# 56| r56_7(char *) = Load[str] : &:r56_6, m49_6 # 56| valnum = m49_6, r49_7, r53_3, r56_7 -# 56| r56_8(char) = Load : &:r56_7, ~m49_8 +# 56| r56_8(char) = Load[?] : &:r56_7, ~m49_8 # 56| valnum = r53_4, r56_8 # 56| r56_9(int) = Convert : r56_8 # 56| valnum = r53_5, r56_9 @@ -438,9 +438,9 @@ test.cpp: # 56| Block 4 # 56| r56_12(glval) = VariableAddress[ptr] : # 56| valnum = r50_1, r55_3, r56_12, r56_19, r56_2, r59_1 -# 56| r56_13(char *) = Load : &:r56_12, m56_1 +# 56| r56_13(char *) = Load[ptr] : &:r56_12, m56_1 # 56| valnum = m56_1, r56_13, r56_20, r56_3, r59_2 -# 56| r56_14(char) = Load : &:r56_13, ~m49_4 +# 56| r56_14(char) = Load[?] : &:r56_13, ~m49_4 # 56| valnum = r56_14, r56_4, r59_3 # 56| r56_15(int) = Convert : r56_14 # 56| valnum = r56_15, r56_5, r59_4 @@ -455,22 +455,22 @@ test.cpp: # 56| Block 5 # 56| r56_19(glval) = VariableAddress[ptr] : # 56| valnum = r50_1, r55_3, r56_12, r56_19, r56_2, r59_1 -# 56| r56_20(char *) = Load : &:r56_19, m56_1 +# 56| r56_20(char *) = Load[ptr] : &:r56_19, m56_1 # 56| valnum = m56_1, r56_13, r56_20, r56_3, r59_2 # 56| r56_21(int) = Constant[1] : # 56| valnum = unique # 56| r56_22(char *) = PointerAdd[1] : r56_20, r56_21 # 56| valnum = m56_23, r56_22 -# 56| m56_23(char *) = Store : &:r56_19, r56_22 +# 56| m56_23(char *) = Store[ptr] : &:r56_19, r56_22 # 56| valnum = m56_23, r56_22 #-----| Goto (back edge) -> Block 3 # 59| Block 6 # 59| r59_1(glval) = VariableAddress[ptr] : # 59| valnum = r50_1, r55_3, r56_12, r56_19, r56_2, r59_1 -# 59| r59_2(char *) = Load : &:r59_1, m56_1 +# 59| r59_2(char *) = Load[ptr] : &:r59_1, m56_1 # 59| valnum = m56_1, r56_13, r56_20, r56_3, r59_2 -# 59| r59_3(char) = Load : &:r59_2, ~m49_4 +# 59| r59_3(char) = Load[?] : &:r59_2, ~m49_4 # 59| valnum = r56_14, r56_4, r59_3 # 59| r59_4(int) = Convert : r59_3 # 59| valnum = r56_15, r56_5, r59_4 @@ -489,13 +489,13 @@ test.cpp: # 62| Block 8 # 62| r62_1(glval) = VariableAddress[result] : # 62| valnum = r51_1, r62_1, r65_2 -# 62| r62_2(unsigned int) = Load : &:r62_1, m53_1 +# 62| r62_2(unsigned int) = Load[result] : &:r62_1, m53_1 # 62| valnum = m53_1, m65_4, r62_2, r65_3 # 62| r62_3(unsigned int) = Constant[1] : # 62| valnum = unique # 62| r62_4(unsigned int) = Add : r62_2, r62_3 # 62| valnum = m62_5, r62_4 -# 62| m62_5(unsigned int) = Store : &:r62_1, r62_4 +# 62| m62_5(unsigned int) = Store[result] : &:r62_1, r62_4 # 62| valnum = m62_5, r62_4 #-----| Goto (back edge) -> Block 1 @@ -505,9 +505,9 @@ test.cpp: # 65| valnum = r49_15, r65_1 # 65| r65_2(glval) = VariableAddress[result] : # 65| valnum = r51_1, r62_1, r65_2 -# 65| r65_3(unsigned int) = Load : &:r65_2, m53_1 +# 65| r65_3(unsigned int) = Load[result] : &:r65_2, m53_1 # 65| valnum = m53_1, m65_4, r62_2, r65_3 -# 65| m65_4(unsigned int) = Store : &:r65_1, r65_3 +# 65| m65_4(unsigned int) = Store[#return] : &:r65_1, r65_3 # 65| valnum = m53_1, m65_4, r62_2, r65_3 # 49| v49_13(void) = ReturnIndirection[str] : &:r49_7, m49_8 # 49| v49_14(void) = ReturnIndirection[chars] : &:r49_11, m49_12 @@ -530,7 +530,7 @@ test.cpp: # 75| valnum = r75_5, r79_4, r79_9 # 75| m75_6(two_values *) = InitializeParameter[vals] : &:r75_5 # 75| valnum = m75_6, r75_7, r79_10, r79_5 -# 75| r75_7(two_values *) = Load : &:r75_5, m75_6 +# 75| r75_7(two_values *) = Load[vals] : &:r75_5, m75_6 # 75| valnum = m75_6, r75_7, r79_10, r79_5 # 75| m75_8(unknown) = InitializeIndirection[vals] : &:r75_7 # 75| valnum = unique @@ -546,31 +546,31 @@ test.cpp: # 77| valnum = unique # 77| r77_6(signed short) = Convert : r77_3 # 77| valnum = m77_7, r77_6, r79_2 -# 77| m77_7(signed short) = Store : &:r77_1, r77_6 +# 77| m77_7(signed short) = Store[v] : &:r77_1, r77_6 # 77| valnum = m77_7, r77_6, r79_2 # 79| r79_1(glval) = VariableAddress[v] : # 79| valnum = r77_1, r79_1, r80_6 -# 79| r79_2(signed short) = Load : &:r79_1, m77_7 +# 79| r79_2(signed short) = Load[v] : &:r79_1, m77_7 # 79| valnum = m77_7, r77_6, r79_2 # 79| r79_3(int) = Convert : r79_2 # 79| valnum = unique # 79| r79_4(glval) = VariableAddress[vals] : # 79| valnum = r75_5, r79_4, r79_9 -# 79| r79_5(two_values *) = Load : &:r79_4, m75_6 +# 79| r79_5(two_values *) = Load[vals] : &:r79_4, m75_6 # 79| valnum = m75_6, r75_7, r79_10, r79_5 # 79| r79_6(glval) = FieldAddress[val1] : r79_5 # 79| valnum = unique -# 79| r79_7(signed short) = Load : &:r79_6, ~m75_8 +# 79| r79_7(signed short) = Load[?] : &:r79_6, ~m75_8 # 79| valnum = unique # 79| r79_8(int) = Convert : r79_7 # 79| valnum = unique # 79| r79_9(glval) = VariableAddress[vals] : # 79| valnum = r75_5, r79_4, r79_9 -# 79| r79_10(two_values *) = Load : &:r79_9, m75_6 +# 79| r79_10(two_values *) = Load[vals] : &:r79_9, m75_6 # 79| valnum = m75_6, r75_7, r79_10, r79_5 # 79| r79_11(glval) = FieldAddress[val2] : r79_10 # 79| valnum = unique -# 79| r79_12(signed short) = Load : &:r79_11, ~m75_8 +# 79| r79_12(signed short) = Load[?] : &:r79_11, ~m75_8 # 79| valnum = unique # 79| r79_13(int) = Convert : r79_12 # 79| valnum = unique @@ -595,7 +595,7 @@ test.cpp: # 80| valnum = m80_7, r80_5 # 80| r80_6(glval) = VariableAddress[v] : # 80| valnum = r77_1, r79_1, r80_6 -# 80| m80_7(signed short) = Store : &:r80_6, r80_5 +# 80| m80_7(signed short) = Store[v] : &:r80_6, r80_5 # 80| valnum = m80_7, r80_5 #-----| Goto -> Block 2 @@ -629,7 +629,7 @@ test.cpp: # 84| valnum = r84_9, r88_1 # 84| m84_10(void *) = InitializeParameter[p] : &:r84_9 # 84| valnum = m84_10, r84_11, r88_2 -# 84| r84_11(void *) = Load : &:r84_9, m84_10 +# 84| r84_11(void *) = Load[p] : &:r84_9, m84_10 # 84| valnum = m84_10, r84_11, r88_2 # 84| m84_12(unknown) = InitializeIndirection[p] : &:r84_11 # 84| valnum = unique @@ -639,7 +639,7 @@ test.cpp: # 86| valnum = unique # 88| r88_1(glval) = VariableAddress[p] : # 88| valnum = r84_9, r88_1 -# 88| r88_2(void *) = Load : &:r88_1, m84_10 +# 88| r88_2(void *) = Load[p] : &:r88_1, m84_10 # 88| valnum = m84_10, r84_11, r88_2 # 88| r88_3(void *) = Constant[0] : # 88| valnum = unique @@ -654,11 +654,11 @@ test.cpp: # 88| valnum = m88_10, m88_6, r88_8 # 88| r88_7(glval) = VariableAddress[#temp88:7] : # 88| valnum = r88_13, r88_17, r88_7 -# 88| r88_8(int) = Load : &:r88_7, m88_6 +# 88| r88_8(int) = Load[#temp88:7] : &:r88_7, m88_6 # 88| valnum = m88_10, m88_6, r88_8 # 88| r88_9(glval) = VariableAddress[v] : # 88| valnum = r86_1, r88_9 -# 88| m88_10(int) = Store : &:r88_9, r88_8 +# 88| m88_10(int) = Store[v] : &:r88_9, r88_8 # 88| valnum = m88_10, m88_6, r88_8 # 89| v89_1(void) = NoOp : # 84| v84_13(void) = ReturnIndirection[p] : &:r84_11, m84_12 @@ -669,22 +669,22 @@ test.cpp: # 88| Block 2 # 88| r88_11(glval) = VariableAddress[x] : # 88| valnum = r84_5, r88_11 -# 88| r88_12(int) = Load : &:r88_11, m84_6 +# 88| r88_12(int) = Load[x] : &:r88_11, m84_6 # 88| valnum = m84_6, m88_14, r88_12 # 88| r88_13(glval) = VariableAddress[#temp88:7] : # 88| valnum = r88_13, r88_17, r88_7 -# 88| m88_14(int) = Store : &:r88_13, r88_12 +# 88| m88_14(int) = Store[#temp88:7] : &:r88_13, r88_12 # 88| valnum = m84_6, m88_14, r88_12 #-----| Goto -> Block 1 # 88| Block 3 # 88| r88_15(glval) = VariableAddress[y] : # 88| valnum = r84_7, r88_15 -# 88| r88_16(int) = Load : &:r88_15, m84_8 +# 88| r88_16(int) = Load[y] : &:r88_15, m84_8 # 88| valnum = m84_8, m88_18, r88_16 # 88| r88_17(glval) = VariableAddress[#temp88:7] : # 88| valnum = r88_13, r88_17, r88_7 -# 88| m88_18(int) = Store : &:r88_17, r88_16 +# 88| m88_18(int) = Store[#temp88:7] : &:r88_17, r88_16 # 88| valnum = m84_8, m88_18, r88_16 #-----| Goto -> Block 1 @@ -703,19 +703,19 @@ test.cpp: # 92| valnum = m92_4, m92_6, m93_4, r92_2, r92_5, r93_3 # 92| r92_3(glval) = VariableAddress[x] : # 92| valnum = r92_1, r92_3, r93_2 -# 92| m92_4(int) = Store : &:r92_3, r92_2 +# 92| m92_4(int) = Store[x] : &:r92_3, r92_2 # 92| valnum = m92_4, m92_6, m93_4, r92_2, r92_5, r93_3 # 92| r92_5(int) = CopyValue : r92_2 # 92| valnum = m92_4, m92_6, m93_4, r92_2, r92_5, r93_3 -# 92| m92_6(int) = Store : &:r92_1, r92_5 +# 92| m92_6(int) = Store[x] : &:r92_1, r92_5 # 92| valnum = m92_4, m92_6, m93_4, r92_2, r92_5, r93_3 # 93| r93_1(glval) = VariableAddress[#return] : # 93| valnum = r91_5, r93_1 # 93| r93_2(glval) = VariableAddress[x] : # 93| valnum = r92_1, r92_3, r93_2 -# 93| r93_3(int) = Load : &:r93_2, m92_6 +# 93| r93_3(int) = Load[x] : &:r93_2, m92_6 # 93| valnum = m92_4, m92_6, m93_4, r92_2, r92_5, r93_3 -# 93| m93_4(int) = Store : &:r93_1, r93_3 +# 93| m93_4(int) = Store[#return] : &:r93_1, r93_3 # 93| valnum = m92_4, m92_6, m93_4, r92_2, r92_5, r93_3 # 91| r91_5(glval) = VariableAddress[#return] : # 91| valnum = r91_5, r93_1 @@ -736,7 +736,7 @@ test.cpp: # 104| valnum = r104_5, r105_2, r106_2 # 104| m104_6(Derived *) = InitializeParameter[pd] : &:r104_5 # 104| valnum = m104_6, r104_7, r105_3, r106_3 -# 104| r104_7(Derived *) = Load : &:r104_5, m104_6 +# 104| r104_7(Derived *) = Load[pd] : &:r104_5, m104_6 # 104| valnum = m104_6, r104_7, r105_3, r106_3 # 104| m104_8(unknown) = InitializeIndirection[pd] : &:r104_7 # 104| valnum = unique @@ -744,45 +744,45 @@ test.cpp: # 105| valnum = unique # 105| r105_2(glval) = VariableAddress[pd] : # 105| valnum = r104_5, r105_2, r106_2 -# 105| r105_3(Derived *) = Load : &:r105_2, m104_6 +# 105| r105_3(Derived *) = Load[pd] : &:r105_2, m104_6 # 105| valnum = m104_6, r104_7, r105_3, r106_3 # 105| r105_4(Base *) = ConvertToNonVirtualBase[Derived : Base] : r105_3 # 105| valnum = m106_5, r105_4, r106_4, r107_3 # 105| r105_5(glval) = FieldAddress[b] : r105_4 # 105| valnum = r105_5, r107_4 -# 105| r105_6(int) = Load : &:r105_5, ~m104_8 +# 105| r105_6(int) = Load[?] : &:r105_5, ~m104_8 # 105| valnum = m105_7, m107_6, m109_4, r105_6, r107_5, r109_3 -# 105| m105_7(int) = Store : &:r105_1, r105_6 +# 105| m105_7(int) = Store[x] : &:r105_1, r105_6 # 105| valnum = m105_7, m107_6, m109_4, r105_6, r107_5, r109_3 # 106| r106_1(glval) = VariableAddress[pb] : # 106| valnum = r106_1, r107_2 # 106| r106_2(glval) = VariableAddress[pd] : # 106| valnum = r104_5, r105_2, r106_2 -# 106| r106_3(Derived *) = Load : &:r106_2, m104_6 +# 106| r106_3(Derived *) = Load[pd] : &:r106_2, m104_6 # 106| valnum = m104_6, r104_7, r105_3, r106_3 # 106| r106_4(Base *) = ConvertToNonVirtualBase[Derived : Base] : r106_3 # 106| valnum = m106_5, r105_4, r106_4, r107_3 -# 106| m106_5(Base *) = Store : &:r106_1, r106_4 +# 106| m106_5(Base *) = Store[pb] : &:r106_1, r106_4 # 106| valnum = m106_5, r105_4, r106_4, r107_3 # 107| r107_1(glval) = VariableAddress[y] : # 107| valnum = r107_1, r109_2 # 107| r107_2(glval) = VariableAddress[pb] : # 107| valnum = r106_1, r107_2 -# 107| r107_3(Base *) = Load : &:r107_2, m106_5 +# 107| r107_3(Base *) = Load[pb] : &:r107_2, m106_5 # 107| valnum = m106_5, r105_4, r106_4, r107_3 # 107| r107_4(glval) = FieldAddress[b] : r107_3 # 107| valnum = r105_5, r107_4 -# 107| r107_5(int) = Load : &:r107_4, ~m104_8 +# 107| r107_5(int) = Load[?] : &:r107_4, ~m104_8 # 107| valnum = m105_7, m107_6, m109_4, r105_6, r107_5, r109_3 -# 107| m107_6(int) = Store : &:r107_1, r107_5 +# 107| m107_6(int) = Store[y] : &:r107_1, r107_5 # 107| valnum = m105_7, m107_6, m109_4, r105_6, r107_5, r109_3 # 109| r109_1(glval) = VariableAddress[#return] : # 109| valnum = r104_10, r109_1 # 109| r109_2(glval) = VariableAddress[y] : # 109| valnum = r107_1, r109_2 -# 109| r109_3(int) = Load : &:r109_2, m107_6 +# 109| r109_3(int) = Load[y] : &:r109_2, m107_6 # 109| valnum = m105_7, m107_6, m109_4, r105_6, r107_5, r109_3 -# 109| m109_4(int) = Store : &:r109_1, r109_3 +# 109| m109_4(int) = Store[#return] : &:r109_1, r109_3 # 109| valnum = m105_7, m107_6, m109_4, r105_6, r107_5, r109_3 # 104| v104_9(void) = ReturnIndirection[pd] : &:r104_7, m104_8 # 104| r104_10(glval) = VariableAddress[#return] : @@ -826,7 +826,7 @@ test.cpp: # 124| valnum = r124_5, r125_2, r126_2, r128_3, r129_2 # 124| m124_6(A *) = InitializeParameter[pa] : &:r124_5 # 124| valnum = m124_6, r124_7, r125_3, r126_3, r128_4, r129_3 -# 124| r124_7(A *) = Load : &:r124_5, m124_6 +# 124| r124_7(A *) = Load[pa] : &:r124_5, m124_6 # 124| valnum = m124_6, r124_7, r125_3, r126_3, r128_4, r129_3 # 124| m124_8(unknown) = InitializeIndirection[pa] : &:r124_7 # 124| valnum = unique @@ -838,37 +838,37 @@ test.cpp: # 125| valnum = unique # 125| r125_2(glval) = VariableAddress[pa] : # 125| valnum = r124_5, r125_2, r126_2, r128_3, r129_2 -# 125| r125_3(A *) = Load : &:r125_2, m124_6 +# 125| r125_3(A *) = Load[pa] : &:r125_2, m124_6 # 125| valnum = m124_6, r124_7, r125_3, r126_3, r128_4, r129_3 # 125| r125_4(glval) = FieldAddress[x] : r125_3 # 125| valnum = r125_4, r126_4, r128_5, r129_4 -# 125| r125_5(int) = Load : &:r125_4, ~m124_8 +# 125| r125_5(int) = Load[?] : &:r125_4, ~m124_8 # 125| valnum = m125_6, m126_6, r125_5, r126_5 -# 125| m125_6(int) = Store : &:r125_1, r125_5 +# 125| m125_6(int) = Store[b] : &:r125_1, r125_5 # 125| valnum = m125_6, m126_6, r125_5, r126_5 # 126| r126_1(glval) = VariableAddress[c] : # 126| valnum = unique # 126| r126_2(glval) = VariableAddress[pa] : # 126| valnum = r124_5, r125_2, r126_2, r128_3, r129_2 -# 126| r126_3(A *) = Load : &:r126_2, m124_6 +# 126| r126_3(A *) = Load[pa] : &:r126_2, m124_6 # 126| valnum = m124_6, r124_7, r125_3, r126_3, r128_4, r129_3 # 126| r126_4(glval) = FieldAddress[x] : r126_3 # 126| valnum = r125_4, r126_4, r128_5, r129_4 -# 126| r126_5(int) = Load : &:r126_4, ~m124_8 +# 126| r126_5(int) = Load[?] : &:r126_4, ~m124_8 # 126| valnum = m125_6, m126_6, r125_5, r126_5 -# 126| m126_6(int) = Store : &:r126_1, r126_5 +# 126| m126_6(int) = Store[c] : &:r126_1, r126_5 # 126| valnum = m125_6, m126_6, r125_5, r126_5 # 128| r128_1(glval) = VariableAddress[n] : # 128| valnum = r124_9, r128_1 -# 128| r128_2(int) = Load : &:r128_1, m124_10 +# 128| r128_2(int) = Load[n] : &:r128_1, m124_10 # 128| valnum = m124_10, m128_6, m129_6, r128_2, r129_5 # 128| r128_3(glval) = VariableAddress[pa] : # 128| valnum = r124_5, r125_2, r126_2, r128_3, r129_2 -# 128| r128_4(A *) = Load : &:r128_3, m124_6 +# 128| r128_4(A *) = Load[pa] : &:r128_3, m124_6 # 128| valnum = m124_6, r124_7, r125_3, r126_3, r128_4, r129_3 # 128| r128_5(glval) = FieldAddress[x] : r128_4 # 128| valnum = r125_4, r126_4, r128_5, r129_4 -# 128| m128_6(int) = Store : &:r128_5, r128_2 +# 128| m128_6(int) = Store[?] : &:r128_5, r128_2 # 128| valnum = m124_10, m128_6, m129_6, r128_2, r129_5 # 128| m128_7(unknown) = Chi : total:m124_8, partial:m128_6 # 128| valnum = unique @@ -876,13 +876,13 @@ test.cpp: # 129| valnum = unique # 129| r129_2(glval) = VariableAddress[pa] : # 129| valnum = r124_5, r125_2, r126_2, r128_3, r129_2 -# 129| r129_3(A *) = Load : &:r129_2, m124_6 +# 129| r129_3(A *) = Load[pa] : &:r129_2, m124_6 # 129| valnum = m124_6, r124_7, r125_3, r126_3, r128_4, r129_3 # 129| r129_4(glval) = FieldAddress[x] : r129_3 # 129| valnum = r125_4, r126_4, r128_5, r129_4 -# 129| r129_5(int) = Load : &:r129_4, m128_6 +# 129| r129_5(int) = Load[?] : &:r129_4, m128_6 # 129| valnum = m124_10, m128_6, m129_6, r128_2, r129_5 -# 129| m129_6(int) = Store : &:r129_1, r129_5 +# 129| m129_6(int) = Store[d] : &:r129_1, r129_5 # 129| valnum = m124_10, m128_6, m129_6, r128_2, r129_5 # 130| v130_1(void) = NoOp : # 124| v124_11(void) = ReturnIndirection[pa] : &:r124_7, m128_7 @@ -903,37 +903,37 @@ test.cpp: # 136| valnum = unique # 136| r136_2(glval) = VariableAddress[global_a] : # 136| valnum = r136_2, r137_2, r139_3, r140_2 -# 136| r136_3(A *) = Load : &:r136_2, ~m135_3 +# 136| r136_3(A *) = Load[global_a] : &:r136_2, ~m135_3 # 136| valnum = r136_3, r137_3, r139_4 # 136| r136_4(glval) = FieldAddress[x] : r136_3 # 136| valnum = r136_4, r137_4, r139_5 -# 136| r136_5(int) = Load : &:r136_4, ~m135_4 +# 136| r136_5(int) = Load[?] : &:r136_4, ~m135_4 # 136| valnum = m136_6, m137_6, r136_5, r137_5 -# 136| m136_6(int) = Store : &:r136_1, r136_5 +# 136| m136_6(int) = Store[b] : &:r136_1, r136_5 # 136| valnum = m136_6, m137_6, r136_5, r137_5 # 137| r137_1(glval) = VariableAddress[c] : # 137| valnum = unique # 137| r137_2(glval) = VariableAddress[global_a] : # 137| valnum = r136_2, r137_2, r139_3, r140_2 -# 137| r137_3(A *) = Load : &:r137_2, ~m135_3 +# 137| r137_3(A *) = Load[global_a] : &:r137_2, ~m135_3 # 137| valnum = r136_3, r137_3, r139_4 # 137| r137_4(glval) = FieldAddress[x] : r137_3 # 137| valnum = r136_4, r137_4, r139_5 -# 137| r137_5(int) = Load : &:r137_4, ~m135_4 +# 137| r137_5(int) = Load[?] : &:r137_4, ~m135_4 # 137| valnum = m136_6, m137_6, r136_5, r137_5 -# 137| m137_6(int) = Store : &:r137_1, r137_5 +# 137| m137_6(int) = Store[c] : &:r137_1, r137_5 # 137| valnum = m136_6, m137_6, r136_5, r137_5 # 139| r139_1(glval) = VariableAddress[global_n] : # 139| valnum = unique -# 139| r139_2(int) = Load : &:r139_1, ~m135_3 +# 139| r139_2(int) = Load[global_n] : &:r139_1, ~m135_3 # 139| valnum = m139_6, r139_2 # 139| r139_3(glval) = VariableAddress[global_a] : # 139| valnum = r136_2, r137_2, r139_3, r140_2 -# 139| r139_4(A *) = Load : &:r139_3, ~m135_3 +# 139| r139_4(A *) = Load[global_a] : &:r139_3, ~m135_3 # 139| valnum = r136_3, r137_3, r139_4 # 139| r139_5(glval) = FieldAddress[x] : r139_4 # 139| valnum = r136_4, r137_4, r139_5 -# 139| m139_6(int) = Store : &:r139_5, r139_2 +# 139| m139_6(int) = Store[?] : &:r139_5, r139_2 # 139| valnum = m139_6, r139_2 # 139| m139_7(unknown) = Chi : total:m135_4, partial:m139_6 # 139| valnum = unique @@ -941,13 +941,13 @@ test.cpp: # 140| valnum = unique # 140| r140_2(glval) = VariableAddress[global_a] : # 140| valnum = r136_2, r137_2, r139_3, r140_2 -# 140| r140_3(A *) = Load : &:r140_2, ~m139_7 +# 140| r140_3(A *) = Load[global_a] : &:r140_2, ~m139_7 # 140| valnum = unique # 140| r140_4(glval) = FieldAddress[x] : r140_3 # 140| valnum = unique -# 140| r140_5(int) = Load : &:r140_4, ~m139_7 +# 140| r140_5(int) = Load[?] : &:r140_4, ~m139_7 # 140| valnum = m140_6, r140_5 -# 140| m140_6(int) = Store : &:r140_1, r140_5 +# 140| m140_6(int) = Store[d] : &:r140_1, r140_5 # 140| valnum = m140_6, r140_5 # 141| v141_1(void) = NoOp : # 135| v135_5(void) = ReturnVoid : @@ -967,7 +967,7 @@ test.cpp: # 143| valnum = r143_5, r144_2, r145_2, r147_3, r149_2 # 143| m143_6(A *) = InitializeParameter[pa] : &:r143_5 # 143| valnum = m143_6, r143_7, r144_3, r145_3, r147_4, r149_3 -# 143| r143_7(A *) = Load : &:r143_5, m143_6 +# 143| r143_7(A *) = Load[pa] : &:r143_5, m143_6 # 143| valnum = m143_6, r143_7, r144_3, r145_3, r147_4, r149_3 # 143| m143_8(unknown) = InitializeIndirection[pa] : &:r143_7 # 143| valnum = unique @@ -975,37 +975,37 @@ test.cpp: # 144| valnum = unique # 144| r144_2(glval) = VariableAddress[pa] : # 144| valnum = r143_5, r144_2, r145_2, r147_3, r149_2 -# 144| r144_3(A *) = Load : &:r144_2, m143_6 +# 144| r144_3(A *) = Load[pa] : &:r144_2, m143_6 # 144| valnum = m143_6, r143_7, r144_3, r145_3, r147_4, r149_3 # 144| r144_4(glval) = FieldAddress[x] : r144_3 # 144| valnum = r144_4, r149_4 -# 144| r144_5(int) = Load : &:r144_4, ~m143_8 +# 144| r144_5(int) = Load[?] : &:r144_4, ~m143_8 # 144| valnum = m144_6, m149_6, r144_5, r149_5 -# 144| m144_6(int) = Store : &:r144_1, r144_5 +# 144| m144_6(int) = Store[b] : &:r144_1, r144_5 # 144| valnum = m144_6, m149_6, r144_5, r149_5 # 145| r145_1(glval) = VariableAddress[c] : # 145| valnum = unique # 145| r145_2(glval) = VariableAddress[pa] : # 145| valnum = r143_5, r144_2, r145_2, r147_3, r149_2 -# 145| r145_3(A *) = Load : &:r145_2, m143_6 +# 145| r145_3(A *) = Load[pa] : &:r145_2, m143_6 # 145| valnum = m143_6, r143_7, r144_3, r145_3, r147_4, r149_3 # 145| r145_4(glval) = FieldAddress[y] : r145_3 # 145| valnum = r145_4, r147_5 -# 145| r145_5(int) = Load : &:r145_4, ~m143_8 +# 145| r145_5(int) = Load[?] : &:r145_4, ~m143_8 # 145| valnum = m145_6, r145_5 -# 145| m145_6(int) = Store : &:r145_1, r145_5 +# 145| m145_6(int) = Store[c] : &:r145_1, r145_5 # 145| valnum = m145_6, r145_5 # 147| r147_1(glval) = VariableAddress[global_n] : # 147| valnum = unique -# 147| r147_2(int) = Load : &:r147_1, ~m143_3 +# 147| r147_2(int) = Load[global_n] : &:r147_1, ~m143_3 # 147| valnum = m147_6, r147_2 # 147| r147_3(glval) = VariableAddress[pa] : # 147| valnum = r143_5, r144_2, r145_2, r147_3, r149_2 -# 147| r147_4(A *) = Load : &:r147_3, m143_6 +# 147| r147_4(A *) = Load[pa] : &:r147_3, m143_6 # 147| valnum = m143_6, r143_7, r144_3, r145_3, r147_4, r149_3 # 147| r147_5(glval) = FieldAddress[y] : r147_4 # 147| valnum = r145_4, r147_5 -# 147| m147_6(int) = Store : &:r147_5, r147_2 +# 147| m147_6(int) = Store[?] : &:r147_5, r147_2 # 147| valnum = m147_6, r147_2 # 147| m147_7(unknown) = Chi : total:m143_8, partial:m147_6 # 147| valnum = unique @@ -1013,13 +1013,13 @@ test.cpp: # 149| valnum = unique # 149| r149_2(glval) = VariableAddress[pa] : # 149| valnum = r143_5, r144_2, r145_2, r147_3, r149_2 -# 149| r149_3(A *) = Load : &:r149_2, m143_6 +# 149| r149_3(A *) = Load[pa] : &:r149_2, m143_6 # 149| valnum = m143_6, r143_7, r144_3, r145_3, r147_4, r149_3 # 149| r149_4(glval) = FieldAddress[x] : r149_3 # 149| valnum = r144_4, r149_4 -# 149| r149_5(int) = Load : &:r149_4, ~m143_8 +# 149| r149_5(int) = Load[?] : &:r149_4, ~m143_8 # 149| valnum = m144_6, m149_6, r144_5, r149_5 -# 149| m149_6(int) = Store : &:r149_1, r149_5 +# 149| m149_6(int) = Store[d] : &:r149_1, r149_5 # 149| valnum = m144_6, m149_6, r144_5, r149_5 # 150| v150_1(void) = NoOp : # 143| v143_9(void) = ReturnIndirection[pa] : &:r143_7, m147_7 @@ -1044,37 +1044,37 @@ test.cpp: # 153| valnum = unique # 153| r153_2(glval) = VariableAddress[global_a] : # 153| valnum = r153_2, r154_2, r156_3, r158_2 -# 153| r153_3(A *) = Load : &:r153_2, ~m152_3 +# 153| r153_3(A *) = Load[global_a] : &:r153_2, ~m152_3 # 153| valnum = r153_3, r154_3, r156_4 # 153| r153_4(glval) = FieldAddress[x] : r153_3 # 153| valnum = r153_4, r154_4 -# 153| r153_5(int) = Load : &:r153_4, ~m152_4 +# 153| r153_5(int) = Load[?] : &:r153_4, ~m152_4 # 153| valnum = m153_6, m154_6, r153_5, r154_5 -# 153| m153_6(int) = Store : &:r153_1, r153_5 +# 153| m153_6(int) = Store[b] : &:r153_1, r153_5 # 153| valnum = m153_6, m154_6, r153_5, r154_5 # 154| r154_1(glval) = VariableAddress[c] : # 154| valnum = unique # 154| r154_2(glval) = VariableAddress[global_a] : # 154| valnum = r153_2, r154_2, r156_3, r158_2 -# 154| r154_3(A *) = Load : &:r154_2, ~m152_3 +# 154| r154_3(A *) = Load[global_a] : &:r154_2, ~m152_3 # 154| valnum = r153_3, r154_3, r156_4 # 154| r154_4(glval) = FieldAddress[x] : r154_3 # 154| valnum = r153_4, r154_4 -# 154| r154_5(int) = Load : &:r154_4, ~m152_4 +# 154| r154_5(int) = Load[?] : &:r154_4, ~m152_4 # 154| valnum = m153_6, m154_6, r153_5, r154_5 -# 154| m154_6(int) = Store : &:r154_1, r154_5 +# 154| m154_6(int) = Store[c] : &:r154_1, r154_5 # 154| valnum = m153_6, m154_6, r153_5, r154_5 # 156| r156_1(glval) = VariableAddress[n] : # 156| valnum = r152_5, r156_1 -# 156| r156_2(int) = Load : &:r156_1, m152_6 +# 156| r156_2(int) = Load[n] : &:r156_1, m152_6 # 156| valnum = m152_6, m156_6, r156_2 # 156| r156_3(glval) = VariableAddress[global_a] : # 156| valnum = r153_2, r154_2, r156_3, r158_2 -# 156| r156_4(A *) = Load : &:r156_3, ~m152_3 +# 156| r156_4(A *) = Load[global_a] : &:r156_3, ~m152_3 # 156| valnum = r153_3, r154_3, r156_4 # 156| r156_5(glval) = FieldAddress[y] : r156_4 # 156| valnum = unique -# 156| m156_6(int) = Store : &:r156_5, r156_2 +# 156| m156_6(int) = Store[?] : &:r156_5, r156_2 # 156| valnum = m152_6, m156_6, r156_2 # 156| m156_7(unknown) = Chi : total:m152_4, partial:m156_6 # 156| valnum = unique @@ -1082,13 +1082,13 @@ test.cpp: # 158| valnum = unique # 158| r158_2(glval) = VariableAddress[global_a] : # 158| valnum = r153_2, r154_2, r156_3, r158_2 -# 158| r158_3(A *) = Load : &:r158_2, ~m156_7 +# 158| r158_3(A *) = Load[global_a] : &:r158_2, ~m156_7 # 158| valnum = unique # 158| r158_4(glval) = FieldAddress[x] : r158_3 # 158| valnum = unique -# 158| r158_5(int) = Load : &:r158_4, ~m156_7 +# 158| r158_5(int) = Load[?] : &:r158_4, ~m156_7 # 158| valnum = m158_6, r158_5 -# 158| m158_6(int) = Store : &:r158_1, r158_5 +# 158| m158_6(int) = Store[d] : &:r158_1, r158_5 # 158| valnum = m158_6, r158_5 # 159| v159_1(void) = NoOp : # 152| v152_7(void) = ReturnVoid : diff --git a/csharp/ql/src/experimental/ir/implementation/raw/Instruction.qll b/csharp/ql/src/experimental/ir/implementation/raw/Instruction.qll index 135b91c0decd..e73054b03340 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/Instruction.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/Instruction.qll @@ -804,12 +804,26 @@ class CopyValueInstruction extends CopyInstruction, UnaryInstruction { final override UnaryOperand getSourceValueOperand() { result = getAnOperand() } } +/** + * Gets a string describing the location pointed to by the specified address operand. + */ +private string getAddressOperandDescription(AddressOperand operand) { + result = operand.getDef().(VariableAddressInstruction).getIRVariable().toString() + or + not operand.getDef() instanceof VariableAddressInstruction and + result = "?" +} + /** * An instruction that returns a register result containing a copy of its memory operand. */ class LoadInstruction extends CopyInstruction { LoadInstruction() { getOpcode() instanceof Opcode::Load } + final override string getImmediateString() { + result = getAddressOperandDescription(getSourceAddressOperand()) + } + /** * Gets the operand that provides the address of the value being loaded. */ @@ -829,6 +843,10 @@ class LoadInstruction extends CopyInstruction { class StoreInstruction extends CopyInstruction { StoreInstruction() { getOpcode() instanceof Opcode::Store } + final override string getImmediateString() { + result = getAddressOperandDescription(getDestinationAddressOperand()) + } + /** * Gets the operand that provides the address of the location to which the value will be stored. */ diff --git a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Instruction.qll b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Instruction.qll index 135b91c0decd..e73054b03340 100644 --- a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Instruction.qll +++ b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Instruction.qll @@ -804,12 +804,26 @@ class CopyValueInstruction extends CopyInstruction, UnaryInstruction { final override UnaryOperand getSourceValueOperand() { result = getAnOperand() } } +/** + * Gets a string describing the location pointed to by the specified address operand. + */ +private string getAddressOperandDescription(AddressOperand operand) { + result = operand.getDef().(VariableAddressInstruction).getIRVariable().toString() + or + not operand.getDef() instanceof VariableAddressInstruction and + result = "?" +} + /** * An instruction that returns a register result containing a copy of its memory operand. */ class LoadInstruction extends CopyInstruction { LoadInstruction() { getOpcode() instanceof Opcode::Load } + final override string getImmediateString() { + result = getAddressOperandDescription(getSourceAddressOperand()) + } + /** * Gets the operand that provides the address of the value being loaded. */ @@ -829,6 +843,10 @@ class LoadInstruction extends CopyInstruction { class StoreInstruction extends CopyInstruction { StoreInstruction() { getOpcode() instanceof Opcode::Store } + final override string getImmediateString() { + result = getAddressOperandDescription(getDestinationAddressOperand()) + } + /** * Gets the operand that provides the address of the location to which the value will be stored. */ diff --git a/csharp/ql/test/experimental/ir/ir/raw_ir.expected b/csharp/ql/test/experimental/ir/ir/raw_ir.expected index e0586a0adcd1..e0d8dfd13ae3 100644 --- a/csharp/ql/test/experimental/ir/ir/raw_ir.expected +++ b/csharp/ql/test/experimental/ir/ir/raw_ir.expected @@ -9,47 +9,47 @@ array.cs: # 4| r4_3(Int32) = Constant[0] : # 4| r4_4(glval) = PointerAdd[4] : r4_1, r4_3 # 4| r4_5(Int32) = Constant[100] : -# 4| mu4_6(Int32) = Store : &:r4_4, r4_5 +# 4| mu4_6(Int32) = Store[?] : &:r4_4, r4_5 # 4| r4_7(Int32) = Constant[1] : # 4| r4_8(glval) = PointerAdd[4] : r4_1, r4_7 # 4| r4_9(Int32) = Constant[101] : -# 4| mu4_10(Int32) = Store : &:r4_8, r4_9 +# 4| mu4_10(Int32) = Store[?] : &:r4_8, r4_9 # 4| r4_11(Int32) = Constant[2] : # 4| r4_12(glval) = PointerAdd[4] : r4_1, r4_11 # 4| r4_13(Int32) = Constant[102] : -# 4| mu4_14(Int32) = Store : &:r4_12, r4_13 +# 4| mu4_14(Int32) = Store[?] : &:r4_12, r4_13 # 5| r5_1(Int32) = Constant[1000] : # 5| r5_2(glval) = VariableAddress[one_dim] : # 5| r5_3(Int32[]) = ElementsAddress : r5_2 # 5| r5_4(Int32) = Constant[0] : # 5| r5_5(Int32[]) = PointerAdd[4] : r5_3, r5_4 -# 5| mu5_6(Int32) = Store : &:r5_5, r5_1 +# 5| mu5_6(Int32) = Store[?] : &:r5_5, r5_1 # 6| r6_1(glval) = VariableAddress[one_dim] : # 6| r6_2(Int32[]) = ElementsAddress : r6_1 # 6| r6_3(Int32) = Constant[0] : # 6| r6_4(Int32[]) = PointerAdd[4] : r6_2, r6_3 -# 6| r6_5(Int32) = Load : &:r6_4, ~m? +# 6| r6_5(Int32) = Load[?] : &:r6_4, ~m? # 6| r6_6(glval) = VariableAddress[one_dim] : # 6| r6_7(Int32[]) = ElementsAddress : r6_6 # 6| r6_8(Int32) = Constant[1] : # 6| r6_9(Int32[]) = PointerAdd[4] : r6_7, r6_8 -# 6| mu6_10(Int32) = Store : &:r6_9, r6_5 +# 6| mu6_10(Int32) = Store[?] : &:r6_9, r6_5 # 7| r7_1(Int32) = Constant[1003] : # 7| r7_2(glval) = VariableAddress[one_dim] : # 7| r7_3(Int32[]) = ElementsAddress : r7_2 # 7| r7_4(Int32) = Constant[1] : # 7| r7_5(Int32[]) = PointerAdd[4] : r7_3, r7_4 -# 7| mu7_6(Int32) = Store : &:r7_5, r7_1 +# 7| mu7_6(Int32) = Store[?] : &:r7_5, r7_1 # 9| r9_1(glval) = VariableAddress[i] : # 9| r9_2(Int32) = Constant[0] : -# 9| mu9_3(Int32) = Store : &:r9_1, r9_2 +# 9| mu9_3(Int32) = Store[i] : &:r9_1, r9_2 # 10| r10_1(Int32) = Constant[0] : # 10| r10_2(glval) = VariableAddress[one_dim] : # 10| r10_3(Int32[]) = ElementsAddress : r10_2 # 10| r10_4(glval) = VariableAddress[i] : -# 10| r10_5(Int32) = Load : &:r10_4, ~m? +# 10| r10_5(Int32) = Load[i] : &:r10_4, ~m? # 10| r10_6(Int32[]) = PointerAdd[4] : r10_3, r10_5 -# 10| mu10_7(Int32) = Store : &:r10_6, r10_1 +# 10| mu10_7(Int32) = Store[?] : &:r10_6, r10_1 # 2| v2_4(Void) = ReturnVoid : # 2| v2_5(Void) = AliasedUse : ~m? # 2| v2_6(Void) = ExitFunction : @@ -66,21 +66,21 @@ array.cs: # 15| r15_5(Int32) = Constant[0] : # 15| r15_6(glval) = PointerAdd[4] : r15_4, r15_5 # 15| r15_7(Int32) = Constant[100] : -# 15| mu15_8(Int32) = Store : &:r15_6, r15_7 +# 15| mu15_8(Int32) = Store[?] : &:r15_6, r15_7 # 15| r15_9(Int32) = Constant[1] : # 15| r15_10(glval) = PointerAdd[4] : r15_4, r15_9 # 15| r15_11(Int32) = Constant[101] : -# 15| mu15_12(Int32) = Store : &:r15_10, r15_11 +# 15| mu15_12(Int32) = Store[?] : &:r15_10, r15_11 # 15| r15_13(Int32) = Constant[1] : # 15| r15_14(glval) = PointerAdd[8] : r15_1, r15_13 # 15| r15_15(Int32) = Constant[0] : # 15| r15_16(glval) = PointerAdd[4] : r15_14, r15_15 # 15| r15_17(Int32) = Constant[102] : -# 15| mu15_18(Int32) = Store : &:r15_16, r15_17 +# 15| mu15_18(Int32) = Store[?] : &:r15_16, r15_17 # 15| r15_19(Int32) = Constant[1] : # 15| r15_20(glval) = PointerAdd[4] : r15_14, r15_19 # 15| r15_21(Int32) = Constant[103] : -# 15| mu15_22(Int32) = Store : &:r15_20, r15_21 +# 15| mu15_22(Int32) = Store[?] : &:r15_20, r15_21 # 16| r16_1(glval) = VariableAddress[b] : # 16| mu16_2(Int32[,]) = Uninitialized[b] : &:r16_1 # 17| r17_1(glval) = VariableAddress[c] : @@ -90,21 +90,21 @@ array.cs: # 17| r17_5(Int32) = Constant[0] : # 17| r17_6(glval) = PointerAdd[4] : r17_4, r17_5 # 17| r17_7(Int32) = Constant[100] : -# 17| mu17_8(Int32) = Store : &:r17_6, r17_7 +# 17| mu17_8(Int32) = Store[?] : &:r17_6, r17_7 # 17| r17_9(Int32) = Constant[1] : # 17| r17_10(glval) = PointerAdd[4] : r17_4, r17_9 # 17| r17_11(Int32) = Constant[101] : -# 17| mu17_12(Int32) = Store : &:r17_10, r17_11 +# 17| mu17_12(Int32) = Store[?] : &:r17_10, r17_11 # 17| r17_13(Int32) = Constant[1] : # 17| r17_14(glval) = PointerAdd[8] : r17_1, r17_13 # 17| r17_15(Int32) = Constant[0] : # 17| r17_16(glval) = PointerAdd[4] : r17_14, r17_15 # 17| r17_17(Int32) = Constant[102] : -# 17| mu17_18(Int32) = Store : &:r17_16, r17_17 +# 17| mu17_18(Int32) = Store[?] : &:r17_16, r17_17 # 17| r17_19(Int32) = Constant[1] : # 17| r17_20(glval) = PointerAdd[4] : r17_14, r17_19 # 17| r17_21(Int32) = Constant[103] : -# 17| mu17_22(Int32) = Store : &:r17_20, r17_21 +# 17| mu17_22(Int32) = Store[?] : &:r17_20, r17_21 # 18| r18_1(glval) = VariableAddress[d] : # 18| mu18_2(Int32[,]) = Uninitialized[d] : &:r18_1 # 18| r18_3(Int32) = Constant[0] : @@ -112,25 +112,25 @@ array.cs: # 18| r18_5(Int32) = Constant[0] : # 18| r18_6(glval) = PointerAdd[4] : r18_4, r18_5 # 18| r18_7(Int32) = Constant[100] : -# 18| mu18_8(Int32) = Store : &:r18_6, r18_7 +# 18| mu18_8(Int32) = Store[?] : &:r18_6, r18_7 # 18| r18_9(Int32) = Constant[1] : # 18| r18_10(glval) = PointerAdd[4] : r18_4, r18_9 # 18| r18_11(Int32) = Constant[101] : -# 18| mu18_12(Int32) = Store : &:r18_10, r18_11 +# 18| mu18_12(Int32) = Store[?] : &:r18_10, r18_11 # 18| r18_13(Int32) = Constant[1] : # 18| r18_14(glval) = PointerAdd[8] : r18_1, r18_13 # 18| r18_15(Int32) = Constant[0] : # 18| r18_16(glval) = PointerAdd[4] : r18_14, r18_15 # 18| r18_17(Int32) = Constant[102] : -# 18| mu18_18(Int32) = Store : &:r18_16, r18_17 +# 18| mu18_18(Int32) = Store[?] : &:r18_16, r18_17 # 18| r18_19(Int32) = Constant[1] : # 18| r18_20(glval) = PointerAdd[4] : r18_14, r18_19 # 18| r18_21(Int32) = Constant[103] : -# 18| mu18_22(Int32) = Store : &:r18_20, r18_21 +# 18| mu18_22(Int32) = Store[?] : &:r18_20, r18_21 # 19| r19_1(glval) = VariableAddress[e] : # 19| r19_2(glval) = VariableAddress[a] : -# 19| r19_3(Int32[,]) = Load : &:r19_2, ~m? -# 19| mu19_4(Int32[,]) = Store : &:r19_1, r19_3 +# 19| r19_3(Int32[,]) = Load[a] : &:r19_2, ~m? +# 19| mu19_4(Int32[,]) = Store[e] : &:r19_1, r19_3 # 20| r20_1(Int32) = Constant[-1] : # 20| r20_2(glval) = VariableAddress[e] : # 20| r20_3(Int32[,]) = ElementsAddress : r20_2 @@ -139,7 +139,7 @@ array.cs: # 20| r20_6(Int32[]) = ElementsAddress : r20_5 # 20| r20_7(Int32) = Constant[1] : # 20| r20_8(Int32[]) = PointerAdd[4] : r20_6, r20_7 -# 20| mu20_9(Int32) = Store : &:r20_8, r20_1 +# 20| mu20_9(Int32) = Store[?] : &:r20_8, r20_1 # 13| v13_4(Void) = ReturnVoid : # 13| v13_5(Void) = AliasedUse : ~m? # 13| v13_6(Void) = ExitFunction : @@ -151,65 +151,65 @@ assignop.cs: # 4| mu4_2() = AliasedDefinition : # 5| r5_1(glval) = VariableAddress[a] : # 5| r5_2(Int32) = Constant[1] : -# 5| mu5_3(Int32) = Store : &:r5_1, r5_2 +# 5| mu5_3(Int32) = Store[a] : &:r5_1, r5_2 # 6| r6_1(glval) = VariableAddress[c] : # 6| r6_2(Int32) = Constant[1] : -# 6| mu6_3(Int32) = Store : &:r6_1, r6_2 +# 6| mu6_3(Int32) = Store[c] : &:r6_1, r6_2 # 8| r8_1(glval) = VariableAddress[a] : -# 8| r8_2(Int32) = Load : &:r8_1, ~m? +# 8| r8_2(Int32) = Load[a] : &:r8_1, ~m? # 8| r8_3(glval) = VariableAddress[c] : -# 8| r8_4(Int32) = Load : &:r8_3, ~m? +# 8| r8_4(Int32) = Load[c] : &:r8_3, ~m? # 8| r8_5(Int32) = Add : r8_4, r8_2 -# 8| mu8_6(Int32) = Store : &:r8_3, r8_5 +# 8| mu8_6(Int32) = Store[c] : &:r8_3, r8_5 # 9| r9_1(glval) = VariableAddress[a] : -# 9| r9_2(Int32) = Load : &:r9_1, ~m? +# 9| r9_2(Int32) = Load[a] : &:r9_1, ~m? # 9| r9_3(glval) = VariableAddress[c] : -# 9| r9_4(Int32) = Load : &:r9_3, ~m? +# 9| r9_4(Int32) = Load[c] : &:r9_3, ~m? # 9| r9_5(Int32) = Sub : r9_4, r9_2 -# 9| mu9_6(Int32) = Store : &:r9_3, r9_5 +# 9| mu9_6(Int32) = Store[c] : &:r9_3, r9_5 # 10| r10_1(glval) = VariableAddress[a] : -# 10| r10_2(Int32) = Load : &:r10_1, ~m? +# 10| r10_2(Int32) = Load[a] : &:r10_1, ~m? # 10| r10_3(glval) = VariableAddress[c] : -# 10| r10_4(Int32) = Load : &:r10_3, ~m? +# 10| r10_4(Int32) = Load[c] : &:r10_3, ~m? # 10| r10_5(Int32) = Mul : r10_4, r10_2 -# 10| mu10_6(Int32) = Store : &:r10_3, r10_5 +# 10| mu10_6(Int32) = Store[c] : &:r10_3, r10_5 # 11| r11_1(glval) = VariableAddress[a] : -# 11| r11_2(Int32) = Load : &:r11_1, ~m? +# 11| r11_2(Int32) = Load[a] : &:r11_1, ~m? # 11| r11_3(glval) = VariableAddress[c] : -# 11| r11_4(Int32) = Load : &:r11_3, ~m? +# 11| r11_4(Int32) = Load[c] : &:r11_3, ~m? # 11| r11_5(Int32) = Div : r11_4, r11_2 -# 11| mu11_6(Int32) = Store : &:r11_3, r11_5 +# 11| mu11_6(Int32) = Store[c] : &:r11_3, r11_5 # 12| r12_1(glval) = VariableAddress[a] : -# 12| r12_2(Int32) = Load : &:r12_1, ~m? +# 12| r12_2(Int32) = Load[a] : &:r12_1, ~m? # 12| r12_3(glval) = VariableAddress[c] : -# 12| r12_4(Int32) = Load : &:r12_3, ~m? +# 12| r12_4(Int32) = Load[c] : &:r12_3, ~m? # 12| r12_5(Int32) = Rem : r12_4, r12_2 -# 12| mu12_6(Int32) = Store : &:r12_3, r12_5 +# 12| mu12_6(Int32) = Store[c] : &:r12_3, r12_5 # 13| r13_1(Int32) = Constant[2] : # 13| r13_2(glval) = VariableAddress[c] : -# 13| r13_3(Int32) = Load : &:r13_2, ~m? +# 13| r13_3(Int32) = Load[c] : &:r13_2, ~m? # 13| r13_4(Int32) = ShiftLeft : r13_3, r13_1 -# 13| mu13_5(Int32) = Store : &:r13_2, r13_4 +# 13| mu13_5(Int32) = Store[c] : &:r13_2, r13_4 # 14| r14_1(Int32) = Constant[2] : # 14| r14_2(glval) = VariableAddress[c] : -# 14| r14_3(Int32) = Load : &:r14_2, ~m? +# 14| r14_3(Int32) = Load[c] : &:r14_2, ~m? # 14| r14_4(Int32) = ShiftRight : r14_3, r14_1 -# 14| mu14_5(Int32) = Store : &:r14_2, r14_4 +# 14| mu14_5(Int32) = Store[c] : &:r14_2, r14_4 # 15| r15_1(Int32) = Constant[2] : # 15| r15_2(glval) = VariableAddress[c] : -# 15| r15_3(Int32) = Load : &:r15_2, ~m? +# 15| r15_3(Int32) = Load[c] : &:r15_2, ~m? # 15| r15_4(Int32) = BitAnd : r15_3, r15_1 -# 15| mu15_5(Int32) = Store : &:r15_2, r15_4 +# 15| mu15_5(Int32) = Store[c] : &:r15_2, r15_4 # 16| r16_1(Int32) = Constant[2] : # 16| r16_2(glval) = VariableAddress[c] : -# 16| r16_3(Int32) = Load : &:r16_2, ~m? +# 16| r16_3(Int32) = Load[c] : &:r16_2, ~m? # 16| r16_4(Int32) = BitXor : r16_3, r16_1 -# 16| mu16_5(Int32) = Store : &:r16_2, r16_4 +# 16| mu16_5(Int32) = Store[c] : &:r16_2, r16_4 # 17| r17_1(Int32) = Constant[2] : # 17| r17_2(glval) = VariableAddress[c] : -# 17| r17_3(Int32) = Load : &:r17_2, ~m? +# 17| r17_3(Int32) = Load[c] : &:r17_2, ~m? # 17| r17_4(Int32) = BitOr : r17_3, r17_1 -# 17| mu17_5(Int32) = Store : &:r17_2, r17_4 +# 17| mu17_5(Int32) = Store[c] : &:r17_2, r17_4 # 4| v4_3(Void) = ReturnVoid : # 4| v4_4(Void) = AliasedUse : ~m? # 4| v4_5(Void) = ExitFunction : @@ -224,17 +224,17 @@ casts.cs: # 13| r13_3() = FunctionAddress[Casts_A] : # 13| v13_4(Void) = Call[Casts_A] : func:r13_3, this:r13_2 # 13| mu13_5() = ^CallSideEffect : ~m? -# 13| mu13_6(Casts_A) = Store : &:r13_1, r13_2 +# 13| mu13_6(Casts_A) = Store[Aobj] : &:r13_1, r13_2 # 14| r14_1(glval) = VariableAddress[bobjCE] : # 14| r14_2(glval) = VariableAddress[Aobj] : -# 14| r14_3(Casts_A) = Load : &:r14_2, ~m? +# 14| r14_3(Casts_A) = Load[Aobj] : &:r14_2, ~m? # 14| r14_4(Casts_B) = CheckedConvertOrThrow : r14_3 -# 14| mu14_5(Casts_B) = Store : &:r14_1, r14_4 +# 14| mu14_5(Casts_B) = Store[bobjCE] : &:r14_1, r14_4 # 15| r15_1(glval) = VariableAddress[bobjAS] : # 15| r15_2(glval) = VariableAddress[Aobj] : -# 15| r15_3(Casts_A) = Load : &:r15_2, ~m? +# 15| r15_3(Casts_A) = Load[Aobj] : &:r15_2, ~m? # 15| r15_4(Casts_B) = CheckedConvertOrNull : r15_3 -# 15| mu15_5(Casts_B) = Store : &:r15_1, r15_4 +# 15| mu15_5(Casts_B) = Store[bobjAS] : &:r15_1, r15_4 # 11| v11_3(Void) = ReturnVoid : # 11| v11_4(Void) = AliasedUse : ~m? # 11| v11_5(Void) = ExitFunction : @@ -257,10 +257,10 @@ collections.cs: # 15| mu15_6() = ^CallSideEffect : ~m? # 15| r15_7(String) = StringConstant["Hello"] : # 15| r15_8(glval) = FieldAddress[a] : r15_3 -# 15| mu15_9(String) = Store : &:r15_8, r15_7 +# 15| mu15_9(String) = Store[?] : &:r15_8, r15_7 # 15| r15_10(String) = StringConstant["World"] : # 15| r15_11(glval) = FieldAddress[b] : r15_3 -# 15| mu15_12(String) = Store : &:r15_11, r15_10 +# 15| mu15_12(String) = Store[?] : &:r15_11, r15_10 # 15| v15_13(Void) = Call[Add] : func:r15_1, this:r13_2, 0:r15_2, 1:r15_3 # 15| mu15_14() = ^CallSideEffect : ~m? # 16| r16_1() = FunctionAddress[Add] : @@ -271,13 +271,13 @@ collections.cs: # 16| mu16_6() = ^CallSideEffect : ~m? # 16| r16_7(String) = StringConstant["Foo"] : # 16| r16_8(glval) = FieldAddress[a] : r16_3 -# 16| mu16_9(String) = Store : &:r16_8, r16_7 +# 16| mu16_9(String) = Store[?] : &:r16_8, r16_7 # 16| r16_10(String) = StringConstant["Bar"] : # 16| r16_11(glval) = FieldAddress[b] : r16_3 -# 16| mu16_12(String) = Store : &:r16_11, r16_10 +# 16| mu16_12(String) = Store[?] : &:r16_11, r16_10 # 16| v16_13(Void) = Call[Add] : func:r16_1, this:r13_2, 0:r16_2, 1:r16_3 # 16| mu16_14() = ^CallSideEffect : ~m? -# 13| mu13_6(Dictionary) = Store : &:r13_1, r13_2 +# 13| mu13_6(Dictionary) = Store[dict] : &:r13_1, r13_2 # 11| v11_3(Void) = ReturnVoid : # 11| v11_4(Void) = AliasedUse : ~m? # 11| v11_5(Void) = ExitFunction : @@ -301,10 +301,10 @@ constructor_init.cs: # 9| r9_4(glval) = VariableAddress[i] : # 9| mu9_5(Int32) = InitializeParameter[i] : &:r9_4 # 11| r11_1(glval) = VariableAddress[i] : -# 11| r11_2(Int32) = Load : &:r11_1, ~m? +# 11| r11_2(Int32) = Load[i] : &:r11_1, ~m? # 11| r11_3(BaseClass) = CopyValue : r9_3 # 11| r11_4(glval) = FieldAddress[num] : r11_3 -# 11| mu11_5(Int32) = Store : &:r11_4, r11_2 +# 11| mu11_5(Int32) = Store[?] : &:r11_4, r11_2 # 9| v9_6(Void) = ReturnVoid : # 9| v9_7(Void) = AliasedUse : ~m? # 9| v9_8(Void) = ExitFunction : @@ -333,7 +333,7 @@ constructor_init.cs: # 21| r21_6(glval) = Convert[DerivedClass : BaseClass] : r21_3 # 21| r21_7() = FunctionAddress[BaseClass] : # 21| r21_8(glval) = VariableAddress[i] : -# 21| r21_9(Int32) = Load : &:r21_8, ~m? +# 21| r21_9(Int32) = Load[i] : &:r21_8, ~m? # 21| v21_10(Void) = Call[BaseClass] : func:r21_7, this:r21_6, 0:r21_9 # 21| mu21_11() = ^CallSideEffect : ~m? # 22| v22_1(Void) = NoOp : @@ -352,7 +352,7 @@ constructor_init.cs: # 25| mu25_7(Int32) = InitializeParameter[j] : &:r25_6 # 25| r25_8() = FunctionAddress[DerivedClass] : # 25| r25_9(glval) = VariableAddress[i] : -# 25| r25_10(Int32) = Load : &:r25_9, ~m? +# 25| r25_10(Int32) = Load[i] : &:r25_9, ~m? # 25| v25_11(Void) = Call[DerivedClass] : func:r25_8, this:r25_3, 0:r25_10 # 25| mu25_12() = ^CallSideEffect : ~m? # 26| v26_1(Void) = NoOp : @@ -369,14 +369,14 @@ constructor_init.cs: # 31| r31_3() = FunctionAddress[DerivedClass] : # 31| v31_4(Void) = Call[DerivedClass] : func:r31_3, this:r31_2 # 31| mu31_5() = ^CallSideEffect : ~m? -# 31| mu31_6(DerivedClass) = Store : &:r31_1, r31_2 +# 31| mu31_6(DerivedClass) = Store[obj1] : &:r31_1, r31_2 # 32| r32_1(glval) = VariableAddress[obj2] : # 32| r32_2(DerivedClass) = NewObj : # 32| r32_3() = FunctionAddress[DerivedClass] : # 32| r32_4(Int32) = Constant[1] : # 32| v32_5(Void) = Call[DerivedClass] : func:r32_3, this:r32_2, 0:r32_4 # 32| mu32_6() = ^CallSideEffect : ~m? -# 32| mu32_7(DerivedClass) = Store : &:r32_1, r32_2 +# 32| mu32_7(DerivedClass) = Store[obj2] : &:r32_1, r32_2 # 33| r33_1(glval) = VariableAddress[obj3] : # 33| r33_2(DerivedClass) = NewObj : # 33| r33_3() = FunctionAddress[DerivedClass] : @@ -384,7 +384,7 @@ constructor_init.cs: # 33| r33_5(Int32) = Constant[2] : # 33| v33_6(Void) = Call[DerivedClass] : func:r33_3, this:r33_2, 0:r33_4, 1:r33_5 # 33| mu33_7() = ^CallSideEffect : ~m? -# 33| mu33_8(DerivedClass) = Store : &:r33_1, r33_2 +# 33| mu33_8(DerivedClass) = Store[obj3] : &:r33_1, r33_2 # 29| v29_3(Void) = ReturnVoid : # 29| v29_4(Void) = AliasedUse : ~m? # 29| v29_5(Void) = ExitFunction : @@ -396,35 +396,35 @@ crement.cs: # 3| mu3_2() = AliasedDefinition : # 5| r5_1(glval) = VariableAddress[x] : # 5| r5_2(Int32) = Constant[10] : -# 5| mu5_3(Int32) = Store : &:r5_1, r5_2 +# 5| mu5_3(Int32) = Store[x] : &:r5_1, r5_2 # 6| r6_1(glval) = VariableAddress[a] : # 6| r6_2(glval) = VariableAddress[x] : -# 6| r6_3(Int32) = Load : &:r6_2, ~m? +# 6| r6_3(Int32) = Load[x] : &:r6_2, ~m? # 6| r6_4(Int32) = Constant[1] : # 6| r6_5(Int32) = Add : r6_3, r6_4 -# 6| mu6_6(Int32) = Store : &:r6_2, r6_5 -# 6| mu6_7(Int32) = Store : &:r6_1, r6_3 +# 6| mu6_6(Int32) = Store[x] : &:r6_2, r6_5 +# 6| mu6_7(Int32) = Store[a] : &:r6_1, r6_3 # 7| r7_1(glval) = VariableAddress[b] : # 7| r7_2(glval) = VariableAddress[x] : -# 7| r7_3(Int32) = Load : &:r7_2, ~m? +# 7| r7_3(Int32) = Load[x] : &:r7_2, ~m? # 7| r7_4(Int32) = Constant[1] : # 7| r7_5(Int32) = Sub : r7_3, r7_4 -# 7| mu7_6(Int32) = Store : &:r7_2, r7_5 -# 7| mu7_7(Int32) = Store : &:r7_1, r7_5 +# 7| mu7_6(Int32) = Store[x] : &:r7_2, r7_5 +# 7| mu7_7(Int32) = Store[b] : &:r7_1, r7_5 # 8| r8_1(glval) = VariableAddress[c] : # 8| r8_2(glval) = VariableAddress[x] : -# 8| r8_3(Int32) = Load : &:r8_2, ~m? +# 8| r8_3(Int32) = Load[x] : &:r8_2, ~m? # 8| r8_4(Int32) = Constant[1] : # 8| r8_5(Int32) = Add : r8_3, r8_4 -# 8| mu8_6(Int32) = Store : &:r8_2, r8_5 -# 8| mu8_7(Int32) = Store : &:r8_1, r8_5 +# 8| mu8_6(Int32) = Store[x] : &:r8_2, r8_5 +# 8| mu8_7(Int32) = Store[c] : &:r8_1, r8_5 # 9| r9_1(glval) = VariableAddress[x] : -# 9| r9_2(Int32) = Load : &:r9_1, ~m? +# 9| r9_2(Int32) = Load[x] : &:r9_1, ~m? # 9| r9_3(Int32) = Constant[1] : # 9| r9_4(Int32) = Sub : r9_2, r9_3 -# 9| mu9_5(Int32) = Store : &:r9_1, r9_4 +# 9| mu9_5(Int32) = Store[x] : &:r9_1, r9_4 # 9| r9_6(glval) = VariableAddress[x] : -# 9| mu9_7(Int32) = Store : &:r9_6, r9_2 +# 9| mu9_7(Int32) = Store[x] : &:r9_6, r9_2 # 3| v3_3(Void) = ReturnVoid : # 3| v3_4(Void) = AliasedUse : ~m? # 3| v3_5(Void) = ExitFunction : @@ -438,8 +438,8 @@ delegates.cs: # 6| mu6_4(Int32) = InitializeParameter[ret] : &:r6_3 # 8| r8_1(glval) = VariableAddress[#return] : # 8| r8_2(glval) = VariableAddress[ret] : -# 8| r8_3(Int32) = Load : &:r8_2, ~m? -# 8| mu8_4(Int32) = Store : &:r8_1, r8_3 +# 8| r8_3(Int32) = Load[ret] : &:r8_2, ~m? +# 8| mu8_4(Int32) = Store[#return] : &:r8_1, r8_3 # 6| r6_5(glval) = VariableAddress[#return] : # 6| v6_6(Void) = ReturnValue : &:r6_5, ~m? # 6| v6_7(Void) = AliasedUse : ~m? @@ -455,9 +455,9 @@ delegates.cs: # 12| r12_4(glval) = FunctionAddress[returns] : # 12| v12_5(Void) = Call[Del] : func:r12_3, this:r12_2, 0:r12_4 # 12| mu12_6() = ^CallSideEffect : ~m? -# 12| mu12_7(Del) = Store : &:r12_1, r12_2 +# 12| mu12_7(Del) = Store[del1] : &:r12_1, r12_2 # 13| r13_1(glval) = VariableAddress[del1] : -# 13| r13_2(Del) = Load : &:r13_1, ~m? +# 13| r13_2(Del) = Load[del1] : &:r13_1, ~m? # 13| r13_3() = FunctionAddress[Invoke] : # 13| r13_4(Int32) = Constant[5] : # 13| v13_5(Void) = Call[Invoke] : func:r13_3, this:r13_2, 0:r13_4 @@ -479,7 +479,7 @@ events.cs: # 10| mu10_5() = ^CallSideEffect : ~m? # 10| r10_6(Events) = CopyValue : r8_3 # 10| r10_7(glval) = FieldAddress[Inst] : r10_6 -# 10| mu10_8(MyDel) = Store : &:r10_7, r10_1 +# 10| mu10_8(MyDel) = Store[?] : &:r10_7, r10_1 # 8| v8_4(Void) = ReturnVoid : # 8| v8_5(Void) = AliasedUse : ~m? # 8| v8_6(Void) = ExitFunction : @@ -493,7 +493,7 @@ events.cs: # 15| r15_2() = FunctionAddress[add_MyEvent] : # 15| r15_3(Events) = CopyValue : r13_3 # 15| r15_4(glval) = FieldAddress[Inst] : r15_3 -# 15| r15_5(MyDel) = Load : &:r15_4, ~m? +# 15| r15_5(MyDel) = Load[?] : &:r15_4, ~m? # 15| v15_6(Void) = Call[add_MyEvent] : func:r15_2, this:r15_1, 0:r15_5 # 15| mu15_7() = ^CallSideEffect : ~m? # 13| v13_4(Void) = ReturnVoid : @@ -509,7 +509,7 @@ events.cs: # 20| r20_2() = FunctionAddress[remove_MyEvent] : # 20| r20_3(Events) = CopyValue : r18_3 # 20| r20_4(glval) = FieldAddress[Inst] : r20_3 -# 20| r20_5(MyDel) = Load : &:r20_4, ~m? +# 20| r20_5(MyDel) = Load[?] : &:r20_4, ~m? # 20| v20_6(Void) = Call[remove_MyEvent] : func:r20_2, this:r20_1, 0:r20_5 # 20| mu20_7() = ^CallSideEffect : ~m? # 18| v18_4(Void) = ReturnVoid : @@ -525,8 +525,8 @@ events.cs: # 23| mu23_5(String) = InitializeParameter[str] : &:r23_4 # 25| r25_1(glval) = VariableAddress[#return] : # 25| r25_2(glval) = VariableAddress[str] : -# 25| r25_3(String) = Load : &:r25_2, ~m? -# 25| mu25_4(String) = Store : &:r25_1, r25_3 +# 25| r25_3(String) = Load[str] : &:r25_2, ~m? +# 25| mu25_4(String) = Store[#return] : &:r25_1, r25_3 # 23| r23_6(glval) = VariableAddress[#return] : # 23| v23_7(Void) = ReturnValue : &:r23_6, ~m? # 23| v23_8(Void) = AliasedUse : ~m? @@ -543,22 +543,22 @@ events.cs: # 30| r30_3() = FunctionAddress[Events] : # 30| v30_4(Void) = Call[Events] : func:r30_3, this:r30_2 # 30| mu30_5() = ^CallSideEffect : ~m? -# 30| mu30_6(Events) = Store : &:r30_1, r30_2 +# 30| mu30_6(Events) = Store[obj] : &:r30_1, r30_2 # 31| r31_1(glval) = VariableAddress[obj] : -# 31| r31_2(Events) = Load : &:r31_1, ~m? +# 31| r31_2(Events) = Load[obj] : &:r31_1, ~m? # 31| r31_3() = FunctionAddress[AddEvent] : # 31| v31_4(Void) = Call[AddEvent] : func:r31_3, this:r31_2 # 31| mu31_5() = ^CallSideEffect : ~m? # 32| r32_1(glval) = VariableAddress[result] : # 32| r32_2(glval) = VariableAddress[obj] : -# 32| r32_3(Events) = Load : &:r32_2, ~m? +# 32| r32_3(Events) = Load[obj] : &:r32_2, ~m? # 32| r32_4() = FunctionAddress[Invoke] : # 32| r32_5(String) = StringConstant["string"] : # 32| v32_6(Void) = Call[Invoke] : func:r32_4, this:r32_3, 0:r32_5 # 32| mu32_7() = ^CallSideEffect : ~m? -# 32| mu32_8(String) = Store : &:r32_1, v32_6 +# 32| mu32_8(String) = Store[result] : &:r32_1, v32_6 # 33| r33_1(glval) = VariableAddress[obj] : -# 33| r33_2(Events) = Load : &:r33_1, ~m? +# 33| r33_2(Events) = Load[obj] : &:r33_1, ~m? # 33| r33_3() = FunctionAddress[RemoveEvent] : # 33| v33_4(Void) = Call[RemoveEvent] : func:r33_3, this:r33_2 # 33| mu33_5() = ^CallSideEffect : ~m? @@ -576,43 +576,43 @@ foreach.cs: # 5| r5_3(Int32) = Constant[0] : # 5| r5_4(glval) = PointerAdd[4] : r5_1, r5_3 # 5| r5_5(Int32) = Constant[1] : -# 5| mu5_6(Int32) = Store : &:r5_4, r5_5 +# 5| mu5_6(Int32) = Store[?] : &:r5_4, r5_5 # 5| r5_7(Int32) = Constant[1] : # 5| r5_8(glval) = PointerAdd[4] : r5_1, r5_7 # 5| r5_9(Int32) = Constant[2] : -# 5| mu5_10(Int32) = Store : &:r5_8, r5_9 +# 5| mu5_10(Int32) = Store[?] : &:r5_8, r5_9 # 5| r5_11(Int32) = Constant[2] : # 5| r5_12(glval) = PointerAdd[4] : r5_1, r5_11 # 5| r5_13(Int32) = Constant[3] : -# 5| mu5_14(Int32) = Store : &:r5_12, r5_13 +# 5| mu5_14(Int32) = Store[?] : &:r5_12, r5_13 # 5| r5_15(Int32) = Constant[3] : # 5| r5_16(glval) = PointerAdd[4] : r5_1, r5_15 # 5| r5_17(Int32) = Constant[4] : -# 5| mu5_18(Int32) = Store : &:r5_16, r5_17 +# 5| mu5_18(Int32) = Store[?] : &:r5_16, r5_17 # 5| r5_19(Int32) = Constant[4] : # 5| r5_20(glval) = PointerAdd[4] : r5_1, r5_19 # 5| r5_21(Int32) = Constant[5] : -# 5| mu5_22(Int32) = Store : &:r5_20, r5_21 +# 5| mu5_22(Int32) = Store[?] : &:r5_20, r5_21 # 5| r5_23(Int32) = Constant[5] : # 5| r5_24(glval) = PointerAdd[4] : r5_1, r5_23 # 5| r5_25(Int32) = Constant[6] : -# 5| mu5_26(Int32) = Store : &:r5_24, r5_25 +# 5| mu5_26(Int32) = Store[?] : &:r5_24, r5_25 # 5| r5_27(Int32) = Constant[6] : # 5| r5_28(glval) = PointerAdd[4] : r5_1, r5_27 # 5| r5_29(Int32) = Constant[7] : -# 5| mu5_30(Int32) = Store : &:r5_28, r5_29 +# 5| mu5_30(Int32) = Store[?] : &:r5_28, r5_29 # 7| r7_1(glval) = VariableAddress[#temp7:9] : # 7| r7_2(glval) = VariableAddress[a_array] : -# 7| r7_3(Int32[]) = Load : &:r7_2, ~m? +# 7| r7_3(Int32[]) = Load[a_array] : &:r7_2, ~m? # 7| r7_4() = FunctionAddress[GetEnumerator] : # 7| r7_5(IEnumerator) = Call[GetEnumerator] : func:r7_4, this:r7_3 # 7| mu7_6() = ^CallSideEffect : ~m? -# 7| mu7_7(IEnumerator) = Store : &:r7_1, r7_5 +# 7| mu7_7(IEnumerator) = Store[#temp7:9] : &:r7_1, r7_5 #-----| Goto -> Block 1 # 7| Block 1 # 7| r7_8(glval) = VariableAddress[#temp7:9] : -# 7| r7_9(Boolean) = Load : &:r7_8, ~m? +# 7| r7_9(Boolean) = Load[#temp7:9] : &:r7_8, ~m? # 7| r7_10() = FunctionAddress[MoveNext] : # 7| r7_11(Boolean) = Call[MoveNext] : func:r7_10, this:r7_9 # 7| mu7_12() = ^CallSideEffect : ~m? @@ -623,20 +623,20 @@ foreach.cs: # 7| Block 2 # 7| r7_14(glval) = VariableAddress[items] : # 7| r7_15(glval) = VariableAddress[#temp7:9] : -# 7| r7_16(Boolean) = Load : &:r7_15, ~m? +# 7| r7_16(Boolean) = Load[#temp7:9] : &:r7_15, ~m? # 7| r7_17() = FunctionAddress[get_Current] : # 7| r7_18(Int32) = Call[get_Current] : func:r7_17, this:r7_16 # 7| mu7_19() = ^CallSideEffect : ~m? -# 7| mu7_20(Int32) = Store : &:r7_14, r7_18 +# 7| mu7_20(Int32) = Store[items] : &:r7_14, r7_18 # 9| r9_1(glval) = VariableAddress[x] : # 9| r9_2(glval) = VariableAddress[items] : -# 9| r9_3(Int32) = Load : &:r9_2, ~m? -# 9| mu9_4(Int32) = Store : &:r9_1, r9_3 +# 9| r9_3(Int32) = Load[items] : &:r9_2, ~m? +# 9| mu9_4(Int32) = Store[x] : &:r9_1, r9_3 #-----| Goto (back edge) -> Block 1 # 7| Block 3 # 7| r7_21(glval) = VariableAddress[#temp7:9] : -# 7| r7_22(Boolean) = Load : &:r7_21, ~m? +# 7| r7_22(Boolean) = Load[#temp7:9] : &:r7_21, ~m? # 7| r7_23() = FunctionAddress[Dispose] : # 7| v7_24(Void) = Call[Dispose] : func:r7_23, this:r7_22 # 7| mu7_25() = ^CallSideEffect : ~m? @@ -655,11 +655,11 @@ func_with_param_call.cs: # 5| mu5_6(Int32) = InitializeParameter[y] : &:r5_5 # 7| r7_1(glval) = VariableAddress[#return] : # 7| r7_2(glval) = VariableAddress[x] : -# 7| r7_3(Int32) = Load : &:r7_2, ~m? +# 7| r7_3(Int32) = Load[x] : &:r7_2, ~m? # 7| r7_4(glval) = VariableAddress[y] : -# 7| r7_5(Int32) = Load : &:r7_4, ~m? +# 7| r7_5(Int32) = Load[y] : &:r7_4, ~m? # 7| r7_6(Int32) = Add : r7_3, r7_5 -# 7| mu7_7(Int32) = Store : &:r7_1, r7_6 +# 7| mu7_7(Int32) = Store[#return] : &:r7_1, r7_6 # 5| r5_7(glval) = VariableAddress[#return] : # 5| v5_8(Void) = ReturnValue : &:r5_7, ~m? # 5| v5_9(Void) = AliasedUse : ~m? @@ -675,7 +675,7 @@ func_with_param_call.cs: # 12| r12_4(Int32) = Constant[3] : # 12| r12_5(Int32) = Call[f] : func:r12_2, 0:r12_3, 1:r12_4 # 12| mu12_6() = ^CallSideEffect : ~m? -# 12| mu12_7(Int32) = Store : &:r12_1, r12_5 +# 12| mu12_7(Int32) = Store[#return] : &:r12_1, r12_5 # 10| r10_3(glval) = VariableAddress[#return] : # 10| v10_4(Void) = ReturnValue : &:r10_3, ~m? # 10| v10_5(Void) = AliasedUse : ~m? @@ -694,10 +694,10 @@ indexers.cs: # 10| r10_3(glval) = FieldAddress[address] : r10_2 # 10| r10_4(String[]) = ElementsAddress : r10_3 # 10| r10_5(glval) = VariableAddress[index] : -# 10| r10_6(Int32) = Load : &:r10_5, ~m? +# 10| r10_6(Int32) = Load[index] : &:r10_5, ~m? # 10| r10_7(String[]) = PointerAdd[8] : r10_4, r10_6 -# 10| r10_8(String) = Load : &:r10_7, ~m? -# 10| mu10_9(String) = Store : &:r10_1, r10_8 +# 10| r10_8(String) = Load[?] : &:r10_7, ~m? +# 10| mu10_9(String) = Store[#return] : &:r10_1, r10_8 # 8| r8_4(glval) = VariableAddress[#return] : # 8| v8_5(Void) = ReturnValue : &:r8_4, ~m? # 8| v8_6(Void) = AliasedUse : ~m? @@ -713,14 +713,14 @@ indexers.cs: # 12| r12_4(glval) = VariableAddress[value] : # 12| mu12_5(String) = InitializeParameter[value] : &:r12_4 # 14| r14_1(glval) = VariableAddress[value] : -# 14| r14_2(String) = Load : &:r14_1, ~m? +# 14| r14_2(String) = Load[value] : &:r14_1, ~m? # 14| r14_3(MyClass) = CopyValue : r12_3 # 14| r14_4(glval) = FieldAddress[address] : r14_3 # 14| r14_5(String[]) = ElementsAddress : r14_4 # 14| r14_6(glval) = VariableAddress[index] : -# 14| r14_7(Int32) = Load : &:r14_6, ~m? +# 14| r14_7(Int32) = Load[index] : &:r14_6, ~m? # 14| r14_8(String[]) = PointerAdd[8] : r14_5, r14_7 -# 14| mu14_9(String) = Store : &:r14_8, r14_2 +# 14| mu14_9(String) = Store[?] : &:r14_8, r14_2 # 12| v12_6(Void) = ReturnVoid : # 12| v12_7(Void) = AliasedUse : ~m? # 12| v12_8(Void) = ExitFunction : @@ -734,27 +734,27 @@ indexers.cs: # 21| r21_3() = FunctionAddress[MyClass] : # 21| v21_4(Void) = Call[MyClass] : func:r21_3, this:r21_2 # 21| mu21_5() = ^CallSideEffect : ~m? -# 21| mu21_6(MyClass) = Store : &:r21_1, r21_2 +# 21| mu21_6(MyClass) = Store[inst] : &:r21_1, r21_2 # 22| r22_1(glval) = VariableAddress[inst] : -# 22| r22_2(MyClass) = Load : &:r22_1, ~m? +# 22| r22_2(MyClass) = Load[inst] : &:r22_1, ~m? # 22| r22_3() = FunctionAddress[set_Item] : # 22| r22_4(Int32) = Constant[0] : # 22| r22_5(String) = StringConstant["str1"] : # 22| v22_6(Void) = Call[set_Item] : func:r22_3, this:r22_2, 0:r22_4, 1:r22_5 # 22| mu22_7() = ^CallSideEffect : ~m? # 23| r23_1(glval) = VariableAddress[inst] : -# 23| r23_2(MyClass) = Load : &:r23_1, ~m? +# 23| r23_2(MyClass) = Load[inst] : &:r23_1, ~m? # 23| r23_3() = FunctionAddress[set_Item] : # 23| r23_4(Int32) = Constant[1] : # 23| r23_5(String) = StringConstant["str1"] : # 23| v23_6(Void) = Call[set_Item] : func:r23_3, this:r23_2, 0:r23_4, 1:r23_5 # 23| mu23_7() = ^CallSideEffect : ~m? # 24| r24_1(glval) = VariableAddress[inst] : -# 24| r24_2(MyClass) = Load : &:r24_1, ~m? +# 24| r24_2(MyClass) = Load[inst] : &:r24_1, ~m? # 24| r24_3() = FunctionAddress[set_Item] : # 24| r24_4(Int32) = Constant[1] : # 24| r24_5(glval) = VariableAddress[inst] : -# 24| r24_6(MyClass) = Load : &:r24_5, ~m? +# 24| r24_6(MyClass) = Load[inst] : &:r24_5, ~m? # 24| r24_7() = FunctionAddress[get_Item] : # 24| r24_8(Int32) = Constant[0] : # 24| r24_9(String) = Call[get_Item] : func:r24_7, this:r24_6, 0:r24_8 @@ -773,7 +773,7 @@ inheritance_polymorphism.cs: # 3| r3_3(glval) = InitializeThis : # 5| r5_1(glval) = VariableAddress[#return] : # 5| r5_2(Int32) = Constant[0] : -# 5| mu5_3(Int32) = Store : &:r5_1, r5_2 +# 5| mu5_3(Int32) = Store[#return] : &:r5_1, r5_2 # 3| r3_4(glval) = VariableAddress[#return] : # 3| v3_5(Void) = ReturnValue : &:r3_4, ~m? # 3| v3_6(Void) = AliasedUse : ~m? @@ -786,7 +786,7 @@ inheritance_polymorphism.cs: # 15| r15_3(glval) = InitializeThis : # 17| r17_1(glval) = VariableAddress[#return] : # 17| r17_2(Int32) = Constant[1] : -# 17| mu17_3(Int32) = Store : &:r17_1, r17_2 +# 17| mu17_3(Int32) = Store[#return] : &:r17_1, r17_2 # 15| r15_4(glval) = VariableAddress[#return] : # 15| v15_5(Void) = ReturnValue : &:r15_4, ~m? # 15| v15_6(Void) = AliasedUse : ~m? @@ -801,21 +801,21 @@ inheritance_polymorphism.cs: # 25| r25_3() = FunctionAddress[B] : # 25| v25_4(Void) = Call[B] : func:r25_3, this:r25_2 # 25| mu25_5() = ^CallSideEffect : ~m? -# 25| mu25_6(B) = Store : &:r25_1, r25_2 +# 25| mu25_6(B) = Store[objB] : &:r25_1, r25_2 # 26| r26_1(glval) = VariableAddress[objB] : -# 26| r26_2(B) = Load : &:r26_1, ~m? +# 26| r26_2(B) = Load[objB] : &:r26_1, ~m? # 26| r26_3() = FunctionAddress[function] : # 26| r26_4(Int32) = Call[function] : func:r26_3, this:r26_2 # 26| mu26_5() = ^CallSideEffect : ~m? # 29| r29_1(glval) = VariableAddress[objA] : # 29| mu29_2(A) = Uninitialized[objA] : &:r29_1 # 30| r30_1(glval) = VariableAddress[objB] : -# 30| r30_2(B) = Load : &:r30_1, ~m? +# 30| r30_2(B) = Load[objB] : &:r30_1, ~m? # 30| r30_3(A) = Convert : r30_2 # 30| r30_4(glval) = VariableAddress[objA] : -# 30| mu30_5(A) = Store : &:r30_4, r30_3 +# 30| mu30_5(A) = Store[objA] : &:r30_4, r30_3 # 31| r31_1(glval) = VariableAddress[objA] : -# 31| r31_2(A) = Load : &:r31_1, ~m? +# 31| r31_2(A) = Load[objA] : &:r31_1, ~m? # 31| r31_3() = FunctionAddress[function] : # 31| r31_4(Int32) = Call[function] : func:r31_3, this:r31_2 # 31| mu31_5() = ^CallSideEffect : ~m? @@ -825,9 +825,9 @@ inheritance_polymorphism.cs: # 33| v33_4(Void) = Call[C] : func:r33_3, this:r33_2 # 33| mu33_5() = ^CallSideEffect : ~m? # 33| r33_6(A) = Convert : r33_2 -# 33| mu33_7(A) = Store : &:r33_1, r33_2 +# 33| mu33_7(A) = Store[objC] : &:r33_1, r33_2 # 34| r34_1(glval) = VariableAddress[objC] : -# 34| r34_2(A) = Load : &:r34_1, ~m? +# 34| r34_2(A) = Load[objC] : &:r34_1, ~m? # 34| r34_3() = FunctionAddress[function] : # 34| r34_4(Int32) = Call[function] : func:r34_3, this:r34_2 # 34| mu34_5() = ^CallSideEffect : ~m? @@ -845,10 +845,10 @@ inoutref.cs: # 11| r11_5(glval) = VariableAddress[o2] : # 11| mu11_6(MyClass) = InitializeParameter[o2] : &:r11_5 # 13| r13_1(glval) = VariableAddress[o2] : -# 13| r13_2(MyClass) = Load : &:r13_1, ~m? +# 13| r13_2(MyClass) = Load[o2] : &:r13_1, ~m? # 13| r13_3(glval) = VariableAddress[o1] : -# 13| r13_4(MyClass) = Load : &:r13_3, ~m? -# 13| mu13_5(MyClass) = Store : &:r13_4, r13_2 +# 13| r13_4(MyClass) = Load[o1] : &:r13_3, ~m? +# 13| mu13_5(MyClass) = Store[?] : &:r13_4, r13_2 # 11| v11_7(Void) = ReturnVoid : # 11| v11_8(Void) = AliasedUse : ~m? # 11| v11_9(Void) = ExitFunction : @@ -869,42 +869,42 @@ inoutref.cs: # 16| mu16_12(MyClass) = InitializeParameter[c1] : &:r16_11 # 18| r18_1(Int32) = Constant[0] : # 18| r18_2(glval) = VariableAddress[b] : -# 18| r18_3(MyStruct) = Load : &:r18_2, ~m? +# 18| r18_3(MyStruct) = Load[b] : &:r18_2, ~m? # 18| r18_4(glval) = FieldAddress[fld] : r18_3 -# 18| mu18_5(Int32) = Store : &:r18_4, r18_1 +# 18| mu18_5(Int32) = Store[?] : &:r18_4, r18_1 # 19| r19_1(glval) = VariableAddress[b] : -# 19| r19_2(MyStruct) = Load : &:r19_1, ~m? +# 19| r19_2(MyStruct) = Load[b] : &:r19_1, ~m? # 19| r19_3(glval) = FieldAddress[fld] : r19_2 -# 19| r19_4(Int32) = Load : &:r19_3, ~m? +# 19| r19_4(Int32) = Load[?] : &:r19_3, ~m? # 19| r19_5(glval) = VariableAddress[a] : -# 19| r19_6(Int32) = Load : &:r19_5, ~m? -# 19| mu19_7(Int32) = Store : &:r19_6, r19_4 +# 19| r19_6(Int32) = Load[a] : &:r19_5, ~m? +# 19| mu19_7(Int32) = Store[?] : &:r19_6, r19_4 # 21| r21_1(Int32) = Constant[10] : # 21| r21_2(glval) = VariableAddress[c] : -# 21| r21_3(MyClass) = Load : &:r21_2, ~m? -# 21| r21_4(MyClass) = Load : &:r21_3, ~m? +# 21| r21_3(MyClass) = Load[c] : &:r21_2, ~m? +# 21| r21_4(MyClass) = Load[?] : &:r21_3, ~m? # 21| r21_5(glval) = FieldAddress[fld] : r21_4 -# 21| mu21_6(Int32) = Store : &:r21_5, r21_1 +# 21| mu21_6(Int32) = Store[?] : &:r21_5, r21_1 # 22| r22_1(glval) = VariableAddress[c] : -# 22| r22_2(MyClass) = Load : &:r22_1, ~m? -# 22| r22_3(MyClass) = Load : &:r22_2, ~m? +# 22| r22_2(MyClass) = Load[c] : &:r22_1, ~m? +# 22| r22_3(MyClass) = Load[?] : &:r22_2, ~m? # 22| r22_4(glval) = FieldAddress[fld] : r22_3 -# 22| r22_5(Int32) = Load : &:r22_4, ~m? +# 22| r22_5(Int32) = Load[?] : &:r22_4, ~m? # 22| r22_6(glval) = VariableAddress[a] : -# 22| r22_7(Int32) = Load : &:r22_6, ~m? -# 22| mu22_8(Int32) = Store : &:r22_7, r22_5 +# 22| r22_7(Int32) = Load[a] : &:r22_6, ~m? +# 22| mu22_8(Int32) = Store[?] : &:r22_7, r22_5 # 24| r24_1(glval) = VariableAddress[b1] : -# 24| r24_2(MyStruct) = Load : &:r24_1, ~m? -# 24| r24_3(MyStruct) = Load : &:r24_2, ~m? +# 24| r24_2(MyStruct) = Load[b1] : &:r24_1, ~m? +# 24| r24_3(MyStruct) = Load[?] : &:r24_2, ~m? # 24| r24_4(glval) = VariableAddress[b] : -# 24| r24_5(MyStruct) = Load : &:r24_4, ~m? -# 24| mu24_6(MyStruct) = Store : &:r24_5, r24_3 +# 24| r24_5(MyStruct) = Load[b] : &:r24_4, ~m? +# 24| mu24_6(MyStruct) = Store[?] : &:r24_5, r24_3 # 26| r26_1() = FunctionAddress[set] : # 26| r26_2(glval) = VariableAddress[c] : -# 26| r26_3(MyClass) = Load : &:r26_2, ~m? +# 26| r26_3(MyClass) = Load[c] : &:r26_2, ~m? # 26| r26_4(glval) = VariableAddress[c1] : -# 26| r26_5(MyClass) = Load : &:r26_4, ~m? -# 26| r26_6(MyClass) = Load : &:r26_5, ~m? +# 26| r26_5(MyClass) = Load[c1] : &:r26_4, ~m? +# 26| r26_6(MyClass) = Load[?] : &:r26_5, ~m? # 26| v26_7(Void) = Call[set] : func:r26_1, 0:r26_3, 1:r26_6 # 26| mu26_8() = ^CallSideEffect : ~m? # 16| v16_13(Void) = ReturnVoid : @@ -917,20 +917,20 @@ inoutref.cs: # 29| mu29_2() = AliasedDefinition : # 31| r31_1(glval) = VariableAddress[a] : # 31| r31_2(Int32) = Constant[0] : -# 31| mu31_3(Int32) = Store : &:r31_1, r31_2 +# 31| mu31_3(Int32) = Store[a] : &:r31_1, r31_2 # 32| r32_1(glval) = VariableAddress[b] : # 32| r32_2(MyStruct) = NewObj : # 32| r32_3() = FunctionAddress[MyStruct] : # 32| v32_4(Void) = Call[MyStruct] : func:r32_3, this:r32_2 # 32| mu32_5() = ^CallSideEffect : ~m? -# 32| r32_6(MyStruct) = Load : &:r32_2, ~m? -# 32| mu32_7(MyStruct) = Store : &:r32_1, r32_6 +# 32| r32_6(MyStruct) = Load[?] : &:r32_2, ~m? +# 32| mu32_7(MyStruct) = Store[b] : &:r32_1, r32_6 # 33| r33_1(glval) = VariableAddress[c] : # 33| r33_2(MyClass) = NewObj : # 33| r33_3() = FunctionAddress[MyClass] : # 33| v33_4(Void) = Call[MyClass] : func:r33_3, this:r33_2 # 33| mu33_5() = ^CallSideEffect : ~m? -# 33| mu33_6(MyClass) = Store : &:r33_1, r33_2 +# 33| mu33_6(MyClass) = Store[c] : &:r33_1, r33_2 # 34| r34_1() = FunctionAddress[F] : # 34| r34_2(glval) = VariableAddress[a] : # 34| r34_3(glval) = VariableAddress[b] : @@ -942,8 +942,8 @@ inoutref.cs: # 36| r36_1(glval) = VariableAddress[x] : # 36| r36_2(glval) = VariableAddress[b] : # 36| r36_3(glval) = FieldAddress[fld] : r36_2 -# 36| r36_4(Int32) = Load : &:r36_3, ~m? -# 36| mu36_5(Int32) = Store : &:r36_1, r36_4 +# 36| r36_4(Int32) = Load[?] : &:r36_3, ~m? +# 36| mu36_5(Int32) = Store[x] : &:r36_1, r36_4 # 29| v29_3(Void) = ReturnVoid : # 29| v29_4(Void) = AliasedUse : ~m? # 29| v29_5(Void) = ExitFunction : @@ -956,14 +956,14 @@ isexpr.cs: # 10| r10_1(glval) = VariableAddress[obj] : # 10| r10_2(null) = Constant[null] : # 10| r10_3(Is_A) = Convert : r10_2 -# 10| mu10_4(Is_A) = Store : &:r10_1, r10_2 +# 10| mu10_4(Is_A) = Store[obj] : &:r10_1, r10_2 # 12| r12_1(glval) = VariableAddress[o] : # 12| r12_2(glval) = VariableAddress[obj] : -# 12| r12_3(Is_A) = Load : &:r12_2, ~m? +# 12| r12_3(Is_A) = Load[obj] : &:r12_2, ~m? # 12| r12_4(Object) = Convert : r12_3 -# 12| mu12_5(Object) = Store : &:r12_1, r12_3 +# 12| mu12_5(Object) = Store[o] : &:r12_1, r12_3 # 13| r13_1(glval) = VariableAddress[o] : -# 13| r13_2(Object) = Load : &:r13_1, ~m? +# 13| r13_2(Object) = Load[o] : &:r13_1, ~m? # 13| r13_3(Is_A) = CheckedConvertOrNull : r13_2 # 13| r13_4(Is_A) = Constant[0] : # 13| r13_5(glval) = VariableAddress[tmp] : @@ -984,21 +984,21 @@ isexpr.cs: #-----| True -> Block 4 # 13| Block 3 -# 13| mu13_10(Is_A) = Store : &:r13_5, r13_3 +# 13| mu13_10(Is_A) = Store[tmp] : &:r13_5, r13_3 #-----| Goto -> Block 2 # 15| Block 4 # 15| r15_1(glval) = VariableAddress[res] : # 15| r15_2(glval) = VariableAddress[tmp] : -# 15| r15_3(Is_A) = Load : &:r15_2, ~m? +# 15| r15_3(Is_A) = Load[tmp] : &:r15_2, ~m? # 15| r15_4(glval) = FieldAddress[x] : r15_3 -# 15| r15_5(Int32) = Load : &:r15_4, ~m? -# 15| mu15_6(Int32) = Store : &:r15_1, r15_5 +# 15| r15_5(Int32) = Load[?] : &:r15_4, ~m? +# 15| mu15_6(Int32) = Store[res] : &:r15_1, r15_5 #-----| Goto -> Block 5 # 17| Block 5 # 17| r17_1(glval) = VariableAddress[o] : -# 17| r17_2(Object) = Load : &:r17_1, ~m? +# 17| r17_2(Object) = Load[o] : &:r17_1, ~m? # 17| r17_3(Is_A) = CheckedConvertOrNull : r17_2 # 17| r17_4(Is_A) = Constant[0] : # 17| r17_5(Boolean) = CompareNE : r17_3, r17_4 @@ -1017,12 +1017,12 @@ jumps.cs: # 5| mu5_2() = AliasedDefinition : # 7| r7_1(glval) = VariableAddress[i] : # 7| r7_2(Int32) = Constant[1] : -# 7| mu7_3(Int32) = Store : &:r7_1, r7_2 +# 7| mu7_3(Int32) = Store[i] : &:r7_1, r7_2 #-----| Goto -> Block 1 # 7| Block 1 # 7| r7_4(glval) = VariableAddress[i] : -# 7| r7_5(Int32) = Load : &:r7_4, ~m? +# 7| r7_5(Int32) = Load[i] : &:r7_4, ~m? # 7| r7_6(Int32) = Constant[10] : # 7| r7_7(Boolean) = CompareLE : r7_5, r7_6 # 7| v7_8(Void) = ConditionalBranch : r7_7 @@ -1031,7 +1031,7 @@ jumps.cs: # 9| Block 2 # 9| r9_1(glval) = VariableAddress[i] : -# 9| r9_2(Int32) = Load : &:r9_1, ~m? +# 9| r9_2(Int32) = Load[i] : &:r9_1, ~m? # 9| r9_3(Int32) = Constant[3] : # 9| r9_4(Boolean) = CompareEQ : r9_2, r9_3 # 9| v9_5(Void) = ConditionalBranch : r9_4 @@ -1044,7 +1044,7 @@ jumps.cs: # 11| Block 4 # 11| r11_1(glval) = VariableAddress[i] : -# 11| r11_2(Int32) = Load : &:r11_1, ~m? +# 11| r11_2(Int32) = Load[i] : &:r11_1, ~m? # 11| r11_3(Int32) = Constant[5] : # 11| r11_4(Boolean) = CompareEQ : r11_2, r11_3 # 11| v11_5(Void) = ConditionalBranch : r11_4 @@ -1065,12 +1065,12 @@ jumps.cs: # 16| Block 7 # 16| r16_1(glval) = VariableAddress[i] : # 16| r16_2(Int32) = Constant[0] : -# 16| mu16_3(Int32) = Store : &:r16_1, r16_2 +# 16| mu16_3(Int32) = Store[i] : &:r16_1, r16_2 #-----| Goto -> Block 8 # 16| Block 8 # 16| r16_4(glval) = VariableAddress[i] : -# 16| r16_5(Int32) = Load : &:r16_4, ~m? +# 16| r16_5(Int32) = Load[i] : &:r16_4, ~m? # 16| r16_6(Int32) = Constant[10] : # 16| r16_7(Boolean) = CompareLT : r16_5, r16_6 # 16| v16_8(Void) = ConditionalBranch : r16_7 @@ -1079,17 +1079,17 @@ jumps.cs: # 18| Block 9 # 18| r18_1(glval) = VariableAddress[i] : -# 18| r18_2(Int32) = Load : &:r18_1, ~m? +# 18| r18_2(Int32) = Load[i] : &:r18_1, ~m? # 18| r18_3(Int32) = Constant[1] : # 18| r18_4(Int32) = Add : r18_2, r18_3 -# 18| mu18_5(Int32) = Store : &:r18_1, r18_4 +# 18| mu18_5(Int32) = Store[i] : &:r18_1, r18_4 # 19| v19_1(Void) = NoOp : #-----| Goto (back edge) -> Block 8 # 22| Block 10 # 22| r22_1(glval) = VariableAddress[a] : # 22| r22_2(Int32) = Constant[0] : -# 22| mu22_3(Int32) = Store : &:r22_1, r22_2 +# 22| mu22_3(Int32) = Store[a] : &:r22_1, r22_2 #-----| Goto -> Block 11 # 23| Block 11 @@ -1100,12 +1100,12 @@ jumps.cs: # 25| Block 12 # 25| r25_1(glval) = VariableAddress[a] : -# 25| r25_2(Int32) = Load : &:r25_1, ~m? +# 25| r25_2(Int32) = Load[a] : &:r25_1, ~m? # 25| r25_3(Int32) = Constant[1] : # 25| r25_4(Int32) = Add : r25_2, r25_3 -# 25| mu25_5(Int32) = Store : &:r25_1, r25_4 +# 25| mu25_5(Int32) = Store[a] : &:r25_1, r25_4 # 26| r26_1(glval) = VariableAddress[a] : -# 26| r26_2(Int32) = Load : &:r26_1, ~m? +# 26| r26_2(Int32) = Load[a] : &:r26_1, ~m? # 26| r26_3(Int32) = Constant[5] : # 26| r26_4(Boolean) = CompareEQ : r26_2, r26_3 # 26| v26_5(Void) = ConditionalBranch : r26_4 @@ -1118,7 +1118,7 @@ jumps.cs: # 28| Block 14 # 28| r28_1(glval) = VariableAddress[a] : -# 28| r28_2(Int32) = Load : &:r28_1, ~m? +# 28| r28_2(Int32) = Load[a] : &:r28_1, ~m? # 28| r28_3(Int32) = Constant[10] : # 28| r28_4(Boolean) = CompareEQ : r28_2, r28_3 # 28| v28_5(Void) = ConditionalBranch : r28_4 @@ -1132,20 +1132,20 @@ jumps.cs: # 32| Block 16 # 32| r32_1(glval) = VariableAddress[i] : # 32| r32_2(Int32) = Constant[1] : -# 32| mu32_3(Int32) = Store : &:r32_1, r32_2 +# 32| mu32_3(Int32) = Store[i] : &:r32_1, r32_2 #-----| Goto -> Block 18 # 32| Block 17 # 32| r32_4(glval) = VariableAddress[i] : -# 32| r32_5(Int32) = Load : &:r32_4, ~m? +# 32| r32_5(Int32) = Load[i] : &:r32_4, ~m? # 32| r32_6(Int32) = Constant[1] : # 32| r32_7(Int32) = Add : r32_5, r32_6 -# 32| mu32_8(Int32) = Store : &:r32_4, r32_7 +# 32| mu32_8(Int32) = Store[i] : &:r32_4, r32_7 #-----| Goto (back edge) -> Block 18 # 32| Block 18 # 32| r32_9(glval) = VariableAddress[i] : -# 32| r32_10(Int32) = Load : &:r32_9, ~m? +# 32| r32_10(Int32) = Load[i] : &:r32_9, ~m? # 32| r32_11(Int32) = Constant[10] : # 32| r32_12(Boolean) = CompareLE : r32_10, r32_11 # 32| v32_13(Void) = ConditionalBranch : r32_12 @@ -1154,15 +1154,15 @@ jumps.cs: # 7| Block 19 # 7| r7_9(glval) = VariableAddress[i] : -# 7| r7_10(Int32) = Load : &:r7_9, ~m? +# 7| r7_10(Int32) = Load[i] : &:r7_9, ~m? # 7| r7_11(Int32) = Constant[1] : # 7| r7_12(Int32) = Add : r7_10, r7_11 -# 7| mu7_13(Int32) = Store : &:r7_9, r7_12 +# 7| mu7_13(Int32) = Store[i] : &:r7_9, r7_12 #-----| Goto (back edge) -> Block 1 # 34| Block 20 # 34| r34_1(glval) = VariableAddress[i] : -# 34| r34_2(Int32) = Load : &:r34_1, ~m? +# 34| r34_2(Int32) = Load[i] : &:r34_1, ~m? # 34| r34_3(Int32) = Constant[5] : # 34| r34_4(Boolean) = CompareEQ : r34_2, r34_3 # 34| v34_5(Void) = ConditionalBranch : r34_4 @@ -1193,30 +1193,30 @@ lock.cs: # 7| r7_3() = FunctionAddress[Object] : # 7| v7_4(Void) = Call[Object] : func:r7_3, this:r7_2 # 7| mu7_5() = ^CallSideEffect : ~m? -# 7| mu7_6(Object) = Store : &:r7_1, r7_2 +# 7| mu7_6(Object) = Store[object] : &:r7_1, r7_2 # 8| r8_1(glval) = VariableAddress[#temp8:9] : # 8| r8_2(glval) = VariableAddress[object] : -# 8| r8_3(Object) = Load : &:r8_2, ~m? -# 8| mu8_4(Object) = Store : &:r8_1, r8_3 +# 8| r8_3(Object) = Load[object] : &:r8_2, ~m? +# 8| mu8_4(Object) = Store[#temp8:9] : &:r8_1, r8_3 # 8| r8_5(glval) = VariableAddress[#temp8:9] : # 8| r8_6(Boolean) = Constant[false] : -# 8| mu8_7(Boolean) = Store : &:r8_5, r8_6 +# 8| mu8_7(Boolean) = Store[#temp8:9] : &:r8_5, r8_6 # 8| r8_8() = FunctionAddress[Enter] : # 8| r8_9(glval) = VariableAddress[#temp8:9] : -# 8| r8_10(Object) = Load : &:r8_9, ~m? +# 8| r8_10(Object) = Load[#temp8:9] : &:r8_9, ~m? # 8| r8_11(glval) = VariableAddress[#temp8:9] : # 8| v8_12(Void) = Call[Enter] : func:r8_8, 0:r8_10, 1:r8_11 # 8| mu8_13() = ^CallSideEffect : ~m? # 10| r10_1() = FunctionAddress[WriteLine] : # 10| r10_2(glval) = VariableAddress[object] : -# 10| r10_3(Object) = Load : &:r10_2, ~m? +# 10| r10_3(Object) = Load[object] : &:r10_2, ~m? # 10| r10_4() = FunctionAddress[ToString] : # 10| r10_5(String) = Call[ToString] : func:r10_4, this:r10_3 # 10| mu10_6() = ^CallSideEffect : ~m? # 10| v10_7(Void) = Call[WriteLine] : func:r10_1, 0:r10_5 # 10| mu10_8() = ^CallSideEffect : ~m? # 8| r8_14(glval) = VariableAddress[#temp8:9] : -# 8| r8_15(Boolean) = Load : &:r8_14, ~m? +# 8| r8_15(Boolean) = Load[#temp8:9] : &:r8_14, ~m? # 8| v8_16(Void) = ConditionalBranch : r8_15 #-----| False -> Block 1 #-----| True -> Block 2 @@ -1229,7 +1229,7 @@ lock.cs: # 8| Block 2 # 8| r8_17() = FunctionAddress[Exit] : # 8| r8_18(glval) = VariableAddress[#temp8:9] : -# 8| r8_19(Object) = Load : &:r8_18, ~m? +# 8| r8_19(Object) = Load[#temp8:9] : &:r8_18, ~m? # 8| v8_20(Void) = Call[Exit] : func:r8_17, 0:r8_19 # 8| mu8_21() = ^CallSideEffect : ~m? #-----| Goto -> Block 1 @@ -1253,10 +1253,10 @@ obj_creation.cs: # 11| r11_4(glval) = VariableAddress[_x] : # 11| mu11_5(Int32) = InitializeParameter[_x] : &:r11_4 # 13| r13_1(glval) = VariableAddress[_x] : -# 13| r13_2(Int32) = Load : &:r13_1, ~m? +# 13| r13_2(Int32) = Load[_x] : &:r13_1, ~m? # 13| r13_3(MyClass) = CopyValue : r11_3 # 13| r13_4(glval) = FieldAddress[x] : r13_3 -# 13| mu13_5(Int32) = Store : &:r13_4, r13_2 +# 13| mu13_5(Int32) = Store[?] : &:r13_4, r13_2 # 11| v11_6(Void) = ReturnVoid : # 11| v11_7(Void) = AliasedUse : ~m? # 11| v11_8(Void) = ExitFunction : @@ -1282,7 +1282,7 @@ obj_creation.cs: # 23| r23_4(Int32) = Constant[100] : # 23| v23_5(Void) = Call[MyClass] : func:r23_3, this:r23_2, 0:r23_4 # 23| mu23_6() = ^CallSideEffect : ~m? -# 23| mu23_7(MyClass) = Store : &:r23_1, r23_2 +# 23| mu23_7(MyClass) = Store[obj] : &:r23_1, r23_2 # 24| r24_1(glval) = VariableAddress[obj_initlist] : # 24| r24_2(MyClass) = NewObj : # 24| r24_3() = FunctionAddress[MyClass] : @@ -1290,14 +1290,14 @@ obj_creation.cs: # 24| mu24_5() = ^CallSideEffect : ~m? # 24| r24_6(Int32) = Constant[101] : # 24| r24_7(glval) = FieldAddress[x] : r24_2 -# 24| mu24_8(Int32) = Store : &:r24_7, r24_6 -# 24| mu24_9(MyClass) = Store : &:r24_1, r24_2 +# 24| mu24_8(Int32) = Store[?] : &:r24_7, r24_6 +# 24| mu24_9(MyClass) = Store[obj_initlist] : &:r24_1, r24_2 # 25| r25_1(glval) = VariableAddress[a] : # 25| r25_2(glval) = VariableAddress[obj] : -# 25| r25_3(MyClass) = Load : &:r25_2, ~m? +# 25| r25_3(MyClass) = Load[obj] : &:r25_2, ~m? # 25| r25_4(glval) = FieldAddress[x] : r25_3 -# 25| r25_5(Int32) = Load : &:r25_4, ~m? -# 25| mu25_6(Int32) = Store : &:r25_1, r25_5 +# 25| r25_5(Int32) = Load[?] : &:r25_4, ~m? +# 25| mu25_6(Int32) = Store[a] : &:r25_1, r25_5 # 27| r27_1() = FunctionAddress[SomeFun] : # 27| r27_2(MyClass) = NewObj : # 27| r27_3() = FunctionAddress[MyClass] : @@ -1319,23 +1319,23 @@ pointers.cs: # 3| mu3_4(Int32[]) = InitializeParameter[arr] : &:r3_3 # 5| r5_1(glval) = VariableAddress[length] : # 5| r5_2(glval) = VariableAddress[arr] : -# 5| r5_3(Int32[]) = Load : &:r5_2, ~m? +# 5| r5_3(Int32[]) = Load[arr] : &:r5_2, ~m? # 5| r5_4() = FunctionAddress[get_Length] : # 5| r5_5(Int32) = Call[get_Length] : func:r5_4, this:r5_3 # 5| mu5_6() = ^CallSideEffect : ~m? -# 5| mu5_7(Int32) = Store : &:r5_1, r5_5 +# 5| mu5_7(Int32) = Store[length] : &:r5_1, r5_5 # 6| r6_1(glval) = VariableAddress[b] : # 6| r6_2(glval) = VariableAddress[arr] : -# 6| r6_3(Int32[]) = Load : &:r6_2, ~m? +# 6| r6_3(Int32[]) = Load[arr] : &:r6_2, ~m? # 6| r6_4(Int32*) = CheckedConvertOrThrow : r6_3 -# 6| mu6_5(Int32*) = Store : &:r6_1, r6_4 +# 6| mu6_5(Int32*) = Store[b] : &:r6_1, r6_4 # 8| r8_1(glval) = VariableAddress[p] : # 8| r8_2(glval) = VariableAddress[b] : -# 8| r8_3(Int32*) = Load : &:r8_2, ~m? -# 8| mu8_4(Int32*) = Store : &:r8_1, r8_3 +# 8| r8_3(Int32*) = Load[b] : &:r8_2, ~m? +# 8| mu8_4(Int32*) = Store[p] : &:r8_1, r8_3 # 9| r9_1(glval) = VariableAddress[i] : # 9| r9_2(Int32) = Constant[0] : -# 9| mu9_3(Int32) = Store : &:r9_1, r9_2 +# 9| mu9_3(Int32) = Store[i] : &:r9_1, r9_2 #-----| Goto -> Block 2 # 3| Block 1 @@ -1345,9 +1345,9 @@ pointers.cs: # 9| Block 2 # 9| r9_4(glval) = VariableAddress[i] : -# 9| r9_5(Int32) = Load : &:r9_4, ~m? +# 9| r9_5(Int32) = Load[i] : &:r9_4, ~m? # 9| r9_6(glval) = VariableAddress[length] : -# 9| r9_7(Int32) = Load : &:r9_6, ~m? +# 9| r9_7(Int32) = Load[length] : &:r9_6, ~m? # 9| r9_8(Boolean) = CompareLT : r9_5, r9_7 # 9| v9_9(Void) = ConditionalBranch : r9_8 #-----| False -> Block 1 @@ -1356,18 +1356,18 @@ pointers.cs: # 10| Block 3 # 10| r10_1(Int32) = Constant[1] : # 10| r10_2(glval) = VariableAddress[p] : -# 10| r10_3(Int32*) = Load : &:r10_2, ~m? +# 10| r10_3(Int32*) = Load[p] : &:r10_2, ~m? # 10| r10_4(Int32) = Constant[1] : # 10| r10_5(Int32*) = PointerAdd[4] : r10_3, r10_4 -# 10| mu10_6(Int32*) = Store : &:r10_2, r10_5 -# 10| r10_7(Int32) = Load : &:r10_3, ~m? +# 10| mu10_6(Int32*) = Store[p] : &:r10_2, r10_5 +# 10| r10_7(Int32) = Load[?] : &:r10_3, ~m? # 10| r10_8(Int32) = Add : r10_7, r10_1 -# 10| mu10_9(Int32) = Store : &:r10_3, r10_8 +# 10| mu10_9(Int32) = Store[?] : &:r10_3, r10_8 # 9| r9_10(glval) = VariableAddress[i] : -# 9| r9_11(Int32) = Load : &:r9_10, ~m? +# 9| r9_11(Int32) = Load[i] : &:r9_10, ~m? # 9| r9_12(Int32) = Constant[1] : # 9| r9_13(Int32) = Add : r9_11, r9_12 -# 9| mu9_14(Int32) = Store : &:r9_10, r9_13 +# 9| mu9_14(Int32) = Store[i] : &:r9_10, r9_13 #-----| Goto (back edge) -> Block 2 # 25| System.Void Pointers.Main() @@ -1379,58 +1379,58 @@ pointers.cs: # 26| r26_3() = FunctionAddress[MyClass] : # 26| v26_4(Void) = Call[MyClass] : func:r26_3, this:r26_2 # 26| mu26_5() = ^CallSideEffect : ~m? -# 26| mu26_6(MyClass) = Store : &:r26_1, r26_2 +# 26| mu26_6(MyClass) = Store[o] : &:r26_1, r26_2 # 27| r27_1(glval) = VariableAddress[s] : # 27| r27_2(MyStruct) = NewObj : # 27| r27_3() = FunctionAddress[MyStruct] : # 27| v27_4(Void) = Call[MyStruct] : func:r27_3, this:r27_2 # 27| mu27_5() = ^CallSideEffect : ~m? -# 27| r27_6(MyStruct) = Load : &:r27_2, ~m? -# 27| mu27_7(MyStruct) = Store : &:r27_1, r27_6 +# 27| r27_6(MyStruct) = Load[?] : &:r27_2, ~m? +# 27| mu27_7(MyStruct) = Store[s] : &:r27_1, r27_6 # 30| r30_1(glval) = VariableAddress[p] : # 30| r30_2(glval) = VariableAddress[o] : -# 30| r30_3(MyClass) = Load : &:r30_2, ~m? +# 30| r30_3(MyClass) = Load[o] : &:r30_2, ~m? # 30| r30_4(glval) = FieldAddress[fld1] : r30_3 -# 30| mu30_5(Int32*) = Store : &:r30_1, r30_4 +# 30| mu30_5(Int32*) = Store[p] : &:r30_1, r30_4 # 30| r30_6(glval) = VariableAddress[q] : # 30| r30_7(glval) = VariableAddress[o] : -# 30| r30_8(MyClass) = Load : &:r30_7, ~m? +# 30| r30_8(MyClass) = Load[o] : &:r30_7, ~m? # 30| r30_9(glval) = FieldAddress[fld2] : r30_8 -# 30| mu30_10(Int32*) = Store : &:r30_6, r30_9 +# 30| mu30_10(Int32*) = Store[q] : &:r30_6, r30_9 # 32| r32_1(Int32) = Constant[0] : # 32| r32_2(glval) = VariableAddress[p] : -# 32| r32_3(Int32*) = Load : &:r32_2, ~m? -# 32| mu32_4(Int32) = Store : &:r32_3, r32_1 +# 32| r32_3(Int32*) = Load[p] : &:r32_2, ~m? +# 32| mu32_4(Int32) = Store[?] : &:r32_3, r32_1 # 33| r33_1(Int32) = Constant[0] : # 33| r33_2(glval) = VariableAddress[q] : -# 33| r33_3(Int32*) = Load : &:r33_2, ~m? -# 33| mu33_4(Int32) = Store : &:r33_3, r33_1 +# 33| r33_3(Int32*) = Load[q] : &:r33_2, ~m? +# 33| mu33_4(Int32) = Store[?] : &:r33_3, r33_1 # 34| r34_1(glval) = VariableAddress[r] : # 34| r34_2(glval) = VariableAddress[s] : -# 34| mu34_3(MyStruct*) = Store : &:r34_1, r34_2 +# 34| mu34_3(MyStruct*) = Store[r] : &:r34_1, r34_2 # 35| r35_1(Int32) = Constant[0] : # 35| r35_2(glval) = VariableAddress[r] : -# 35| r35_3(MyStruct*) = Load : &:r35_2, ~m? -# 35| r35_4(MyStruct) = Load : &:r35_3, ~m? +# 35| r35_3(MyStruct*) = Load[r] : &:r35_2, ~m? +# 35| r35_4(MyStruct) = Load[?] : &:r35_3, ~m? # 35| r35_5(glval) = FieldAddress[fld] : r35_4 -# 35| mu35_6(Int32) = Store : &:r35_5, r35_1 +# 35| mu35_6(Int32) = Store[?] : &:r35_5, r35_1 # 39| r39_1(glval) = VariableAddress[arr] : # 39| mu39_2(Int32[]) = Uninitialized[arr] : &:r39_1 # 39| r39_3(Int32) = Constant[0] : # 39| r39_4(glval) = PointerAdd[4] : r39_1, r39_3 # 39| r39_5(Int32) = Constant[1] : -# 39| mu39_6(Int32) = Store : &:r39_4, r39_5 +# 39| mu39_6(Int32) = Store[?] : &:r39_4, r39_5 # 39| r39_7(Int32) = Constant[1] : # 39| r39_8(glval) = PointerAdd[4] : r39_1, r39_7 # 39| r39_9(Int32) = Constant[2] : -# 39| mu39_10(Int32) = Store : &:r39_8, r39_9 +# 39| mu39_10(Int32) = Store[?] : &:r39_8, r39_9 # 39| r39_11(Int32) = Constant[2] : # 39| r39_12(glval) = PointerAdd[4] : r39_1, r39_11 # 39| r39_13(Int32) = Constant[3] : -# 39| mu39_14(Int32) = Store : &:r39_12, r39_13 +# 39| mu39_14(Int32) = Store[?] : &:r39_12, r39_13 # 40| r40_1() = FunctionAddress[addone] : # 40| r40_2(glval) = VariableAddress[arr] : -# 40| r40_3(Int32[]) = Load : &:r40_2, ~m? +# 40| r40_3(Int32[]) = Load[arr] : &:r40_2, ~m? # 40| v40_4(Void) = Call[addone] : func:r40_1, 0:r40_3 # 40| mu40_5() = ^CallSideEffect : ~m? # 25| v25_3(Void) = ReturnVoid : @@ -1448,7 +1448,7 @@ prop.cs: # 9| r9_3() = FunctionAddress[func] : # 9| r9_4(Int32) = Call[func] : func:r9_3, this:r9_2 # 9| mu9_5() = ^CallSideEffect : ~m? -# 9| mu9_6(Int32) = Store : &:r9_1, r9_4 +# 9| mu9_6(Int32) = Store[#return] : &:r9_1, r9_4 # 7| r7_4(glval) = VariableAddress[#return] : # 7| v7_5(Void) = ReturnValue : &:r7_4, ~m? # 7| v7_6(Void) = AliasedUse : ~m? @@ -1462,9 +1462,9 @@ prop.cs: # 12| r12_4(glval) = VariableAddress[value] : # 12| mu12_5(Int32) = InitializeParameter[value] : &:r12_4 # 14| r14_1(glval) = VariableAddress[value] : -# 14| r14_2(Int32) = Load : &:r14_1, ~m? +# 14| r14_2(Int32) = Load[value] : &:r14_1, ~m? # 14| r14_3(glval) = VariableAddress[prop] : -# 14| mu14_4(Int32) = Store : &:r14_3, r14_2 +# 14| mu14_4(Int32) = Store[prop] : &:r14_3, r14_2 # 12| v12_6(Void) = ReturnVoid : # 12| v12_7(Void) = AliasedUse : ~m? # 12| v12_8(Void) = ExitFunction : @@ -1476,7 +1476,7 @@ prop.cs: # 18| r18_3(glval) = InitializeThis : # 20| r20_1(glval) = VariableAddress[#return] : # 20| r20_2(Int32) = Constant[0] : -# 20| mu20_3(Int32) = Store : &:r20_1, r20_2 +# 20| mu20_3(Int32) = Store[#return] : &:r20_1, r20_2 # 18| r18_4(glval) = VariableAddress[#return] : # 18| v18_5(Void) = ReturnValue : &:r18_4, ~m? # 18| v18_6(Void) = AliasedUse : ~m? @@ -1491,20 +1491,20 @@ prop.cs: # 28| r28_3() = FunctionAddress[PropClass] : # 28| v28_4(Void) = Call[PropClass] : func:r28_3, this:r28_2 # 28| mu28_5() = ^CallSideEffect : ~m? -# 28| mu28_6(PropClass) = Store : &:r28_1, r28_2 +# 28| mu28_6(PropClass) = Store[obj] : &:r28_1, r28_2 # 29| r29_1(glval) = VariableAddress[obj] : -# 29| r29_2(PropClass) = Load : &:r29_1, ~m? +# 29| r29_2(PropClass) = Load[obj] : &:r29_1, ~m? # 29| r29_3() = FunctionAddress[set_Prop] : # 29| r29_4(Int32) = Constant[5] : # 29| v29_5(Void) = Call[set_Prop] : func:r29_3, this:r29_2, 0:r29_4 # 29| mu29_6() = ^CallSideEffect : ~m? # 30| r30_1(glval) = VariableAddress[x] : # 30| r30_2(glval) = VariableAddress[obj] : -# 30| r30_3(PropClass) = Load : &:r30_2, ~m? +# 30| r30_3(PropClass) = Load[obj] : &:r30_2, ~m? # 30| r30_4() = FunctionAddress[get_Prop] : # 30| r30_5(Int32) = Call[get_Prop] : func:r30_4, this:r30_3 # 30| mu30_6() = ^CallSideEffect : ~m? -# 30| mu30_7(Int32) = Store : &:r30_1, r30_5 +# 30| mu30_7(Int32) = Store[x] : &:r30_1, r30_5 # 26| v26_3(Void) = ReturnVoid : # 26| v26_4(Void) = AliasedUse : ~m? # 26| v26_5(Void) = ExitFunction : @@ -1516,7 +1516,7 @@ simple_call.cs: # 5| mu5_2() = AliasedDefinition : # 7| r7_1(glval) = VariableAddress[#return] : # 7| r7_2(Int32) = Constant[0] : -# 7| mu7_3(Int32) = Store : &:r7_1, r7_2 +# 7| mu7_3(Int32) = Store[#return] : &:r7_1, r7_2 # 5| r5_3(glval) = VariableAddress[#return] : # 5| v5_4(Void) = ReturnValue : &:r5_3, ~m? # 5| v5_5(Void) = AliasedUse : ~m? @@ -1531,7 +1531,7 @@ simple_call.cs: # 12| r12_2() = FunctionAddress[f] : # 12| r12_3(Int32) = Call[f] : func:r12_2 # 12| mu12_4() = ^CallSideEffect : ~m? -# 12| mu12_5(Int32) = Store : &:r12_1, r12_3 +# 12| mu12_5(Int32) = Store[#return] : &:r12_1, r12_3 # 10| r10_4(glval) = VariableAddress[#return] : # 10| v10_5(Void) = ReturnValue : &:r10_4, ~m? # 10| v10_6(Void) = AliasedUse : ~m? @@ -1544,7 +1544,7 @@ simple_function.cs: # 5| mu5_2() = AliasedDefinition : # 7| r7_1(glval) = VariableAddress[#return] : # 7| r7_2(Int32) = Constant[0] : -# 7| mu7_3(Int32) = Store : &:r7_1, r7_2 +# 7| mu7_3(Int32) = Store[#return] : &:r7_1, r7_2 # 5| r5_3(glval) = VariableAddress[#return] : # 5| v5_4(Void) = ReturnValue : &:r5_3, ~m? # 5| v5_5(Void) = AliasedUse : ~m? @@ -1558,7 +1558,7 @@ stmts.cs: # 5| r5_3(glval) = VariableAddress[x] : # 5| mu5_4(Int32) = InitializeParameter[x] : &:r5_3 # 7| r7_1(glval) = VariableAddress[x] : -# 7| r7_2(Int32) = Load : &:r7_1, ~m? +# 7| r7_2(Int32) = Load[x] : &:r7_1, ~m? # 7| r7_3(Int32) = Constant[5] : # 7| r7_4(Boolean) = CompareEQ : r7_2, r7_3 # 7| v7_5(Void) = ConditionalBranch : r7_4 @@ -1574,13 +1574,13 @@ stmts.cs: # 10| Block 2 # 10| r10_1(glval) = VariableAddress[#return] : # 10| r10_2(Int32) = Constant[1] : -# 10| mu10_3(Int32) = Store : &:r10_1, r10_2 +# 10| mu10_3(Int32) = Store[#return] : &:r10_1, r10_2 #-----| Goto -> Block 1 # 8| Block 3 # 8| r8_1(glval) = VariableAddress[#return] : # 8| r8_2(Int32) = Constant[0] : -# 8| mu8_3(Int32) = Store : &:r8_1, r8_2 +# 8| mu8_3(Int32) = Store[#return] : &:r8_1, r8_2 #-----| Goto -> Block 1 # 13| System.Void test_stmts.whileStmt(System.Int32) @@ -1591,7 +1591,7 @@ stmts.cs: # 13| mu13_4(Int32) = InitializeParameter[x] : &:r13_3 # 15| r15_1(glval) = VariableAddress[i] : # 15| r15_2(Int32) = Constant[0] : -# 15| mu15_3(Int32) = Store : &:r15_1, r15_2 +# 15| mu15_3(Int32) = Store[i] : &:r15_1, r15_2 #-----| Goto -> Block 2 # 13| Block 1 @@ -1601,7 +1601,7 @@ stmts.cs: # 16| Block 2 # 16| r16_1(glval) = VariableAddress[i] : -# 16| r16_2(Int32) = Load : &:r16_1, ~m? +# 16| r16_2(Int32) = Load[i] : &:r16_1, ~m? # 16| r16_3(Int32) = Constant[10] : # 16| r16_4(Boolean) = CompareLT : r16_2, r16_3 # 16| v16_5(Void) = ConditionalBranch : r16_4 @@ -1610,11 +1610,11 @@ stmts.cs: # 18| Block 3 # 18| r18_1(glval) = VariableAddress[x] : -# 18| r18_2(Int32) = Load : &:r18_1, ~m? +# 18| r18_2(Int32) = Load[x] : &:r18_1, ~m? # 18| r18_3(Int32) = Constant[1] : # 18| r18_4(Int32) = Add : r18_2, r18_3 # 18| r18_5(glval) = VariableAddress[x] : -# 18| mu18_6(Int32) = Store : &:r18_5, r18_4 +# 18| mu18_6(Int32) = Store[x] : &:r18_5, r18_4 #-----| Goto (back edge) -> Block 2 # 22| System.Int32 test_stmts.switchStmt() @@ -1626,12 +1626,12 @@ stmts.cs: # 24| r24_3() = FunctionAddress[Object] : # 24| v24_4(Void) = Call[Object] : func:r24_3, this:r24_2 # 24| mu24_5() = ^CallSideEffect : ~m? -# 24| mu24_6(Object) = Store : &:r24_1, r24_2 +# 24| mu24_6(Object) = Store[caseSwitch] : &:r24_1, r24_2 # 25| r25_1(glval) = VariableAddress[select] : # 25| r25_2(Int32) = Constant[0] : -# 25| mu25_3(Int32) = Store : &:r25_1, r25_2 +# 25| mu25_3(Int32) = Store[select] : &:r25_1, r25_2 # 27| r27_1(glval) = VariableAddress[caseSwitch] : -# 27| r27_2(Object) = Load : &:r27_1, ~m? +# 27| r27_2(Object) = Load[caseSwitch] : &:r27_1, ~m? # 27| v27_3(Void) = Switch : r27_2 #-----| Case[-1] -> Block 2 #-----| Case[0] -> Block 3 @@ -1659,18 +1659,18 @@ stmts.cs: # 33| v33_1(Void) = NoOp : # 34| r34_1(Int32) = Constant[100] : # 34| r34_2(glval) = VariableAddress[select] : -# 34| mu34_3(Int32) = Store : &:r34_2, r34_1 +# 34| mu34_3(Int32) = Store[select] : &:r34_2, r34_1 # 35| v35_1(Void) = NoOp : # 42| r42_1(glval) = VariableAddress[#return] : # 42| r42_2(Int32) = Constant[0] : -# 42| mu42_3(Int32) = Store : &:r42_1, r42_2 +# 42| mu42_3(Int32) = Store[#return] : &:r42_1, r42_2 #-----| Goto -> Block 1 # 36| Block 5 # 36| v36_1(Void) = NoOp : # 37| r37_1(Int32) = Constant[101] : # 37| r37_2(glval) = VariableAddress[select] : -# 37| mu37_3(Int32) = Store : &:r37_2, r37_1 +# 37| mu37_3(Int32) = Store[select] : &:r37_2, r37_1 # 38| v38_1(Void) = NoOp : #-----| Goto (back edge) -> Block 6 @@ -1678,8 +1678,8 @@ stmts.cs: # 39| v39_1(Void) = NoOp : # 40| r40_1(glval) = VariableAddress[#return] : # 40| r40_2(glval) = VariableAddress[select] : -# 40| r40_3(Int32) = Load : &:r40_2, ~m? -# 40| mu40_4(Int32) = Store : &:r40_1, r40_3 +# 40| r40_3(Int32) = Load[select] : &:r40_2, ~m? +# 40| mu40_4(Int32) = Store[#return] : &:r40_1, r40_3 #-----| Goto -> Block 1 # 46| System.Void test_stmts.tryCatchFinally() @@ -1688,9 +1688,9 @@ stmts.cs: # 46| mu46_2() = AliasedDefinition : # 48| r48_1(glval) = VariableAddress[x] : # 48| r48_2(Int32) = Constant[5] : -# 48| mu48_3(Int32) = Store : &:r48_1, r48_2 +# 48| mu48_3(Int32) = Store[x] : &:r48_1, r48_2 # 51| r51_1(glval) = VariableAddress[x] : -# 51| r51_2(Int32) = Load : &:r51_1, ~m? +# 51| r51_2(Int32) = Load[x] : &:r51_1, ~m? # 51| r51_3(Int32) = Constant[0] : # 51| r51_4(Boolean) = CompareNE : r51_2, r51_3 # 51| v51_5(Void) = ConditionalBranch : r51_4 @@ -1711,20 +1711,20 @@ stmts.cs: # 52| r52_3() = FunctionAddress[Exception] : # 52| v52_4(Void) = Call[Exception] : func:r52_3, this:r52_2 # 52| mu52_5() = ^CallSideEffect : ~m? -# 52| mu52_6(Exception) = Store : &:r52_1, r52_2 +# 52| mu52_6(Exception) = Store[#throw52:17] : &:r52_1, r52_2 # 52| v52_7(Void) = ThrowValue : &:r52_1, ~m? #-----| Exception -> Block 6 # 53| Block 4 # 53| r53_1(Int32) = Constant[0] : # 53| r53_2(glval) = VariableAddress[x] : -# 53| mu53_3(Int32) = Store : &:r53_2, r53_1 +# 53| mu53_3(Int32) = Store[x] : &:r53_2, r53_1 #-----| Goto -> Block 5 # 65| Block 5 # 65| r65_1(Int32) = Constant[2] : # 65| r65_2(glval) = VariableAddress[x] : -# 65| mu65_3(Int32) = Store : &:r65_2, r65_1 +# 65| mu65_3(Int32) = Store[x] : &:r65_2, r65_1 # 46| v46_6(Void) = ReturnVoid : #-----| Goto -> Block 1 @@ -1738,7 +1738,7 @@ stmts.cs: # 55| mu55_3(Exception) = Uninitialized[ex] : &:r55_2 # 57| r57_1(Int32) = Constant[1] : # 57| r57_2(glval) = VariableAddress[x] : -# 57| mu57_3(Int32) = Store : &:r57_2, r57_1 +# 57| mu57_3(Int32) = Store[x] : &:r57_2, r57_1 #-----| Goto -> Block 5 # 59| Block 8 @@ -1752,13 +1752,13 @@ stmts.cs: # 69| mu69_2() = AliasedDefinition : # 71| r71_1(glval) = VariableAddress[x] : # 71| r71_2(Int32) = Constant[0] : -# 71| mu71_3(Int32) = Store : &:r71_1, r71_2 +# 71| mu71_3(Int32) = Store[x] : &:r71_1, r71_2 # 72| r72_1(glval) = VariableAddress[i] : # 72| r72_2(Int32) = Constant[0] : -# 72| mu72_3(Int32) = Store : &:r72_1, r72_2 +# 72| mu72_3(Int32) = Store[i] : &:r72_1, r72_2 # 72| r72_4(glval) = VariableAddress[j] : # 72| r72_5(Int32) = Constant[10] : -# 72| mu72_6(Int32) = Store : &:r72_4, r72_5 +# 72| mu72_6(Int32) = Store[j] : &:r72_4, r72_5 #-----| Goto -> Block 2 # 69| Block 1 @@ -1768,9 +1768,9 @@ stmts.cs: # 72| Block 2 # 72| r72_7(glval) = VariableAddress[i] : -# 72| r72_8(Int32) = Load : &:r72_7, ~m? +# 72| r72_8(Int32) = Load[i] : &:r72_7, ~m? # 72| r72_9(glval) = VariableAddress[j] : -# 72| r72_10(Int32) = Load : &:r72_9, ~m? +# 72| r72_10(Int32) = Load[j] : &:r72_9, ~m? # 72| r72_11(Boolean) = CompareLT : r72_8, r72_10 # 72| v72_12(Void) = ConditionalBranch : r72_11 #-----| False -> Block 4 @@ -1778,21 +1778,21 @@ stmts.cs: # 74| Block 3 # 74| r74_1(glval) = VariableAddress[x] : -# 74| r74_2(Int32) = Load : &:r74_1, ~m? +# 74| r74_2(Int32) = Load[x] : &:r74_1, ~m? # 74| r74_3(Int32) = Constant[1] : # 74| r74_4(Int32) = Sub : r74_2, r74_3 # 74| r74_5(glval) = VariableAddress[x] : -# 74| mu74_6(Int32) = Store : &:r74_5, r74_4 +# 74| mu74_6(Int32) = Store[x] : &:r74_5, r74_4 # 72| r72_13(glval) = VariableAddress[i] : -# 72| r72_14(Int32) = Load : &:r72_13, ~m? +# 72| r72_14(Int32) = Load[i] : &:r72_13, ~m? # 72| r72_15(Int32) = Constant[1] : # 72| r72_16(Int32) = Add : r72_14, r72_15 -# 72| mu72_17(Int32) = Store : &:r72_13, r72_16 +# 72| mu72_17(Int32) = Store[i] : &:r72_13, r72_16 # 72| r72_18(glval) = VariableAddress[j] : -# 72| r72_19(Int32) = Load : &:r72_18, ~m? +# 72| r72_19(Int32) = Load[j] : &:r72_18, ~m? # 72| r72_20(Int32) = Constant[1] : # 72| r72_21(Int32) = Sub : r72_19, r72_20 -# 72| mu72_22(Int32) = Store : &:r72_18, r72_21 +# 72| mu72_22(Int32) = Store[j] : &:r72_18, r72_21 #-----| Goto (back edge) -> Block 2 # 77| Block 4 @@ -1800,17 +1800,17 @@ stmts.cs: # 77| mu77_2(Int32) = Uninitialized[a] : &:r77_1 # 77| r77_3(glval) = VariableAddress[b] : # 77| r77_4(Int32) = Constant[10] : -# 77| mu77_5(Int32) = Store : &:r77_3, r77_4 +# 77| mu77_5(Int32) = Store[b] : &:r77_3, r77_4 # 78| r78_1(Int32) = Constant[0] : # 78| r78_2(glval) = VariableAddress[a] : -# 78| mu78_3(Int32) = Store : &:r78_2, r78_1 +# 78| mu78_3(Int32) = Store[a] : &:r78_2, r78_1 #-----| Goto -> Block 5 # 78| Block 5 # 78| r78_4(glval) = VariableAddress[a] : -# 78| r78_5(Int32) = Load : &:r78_4, ~m? +# 78| r78_5(Int32) = Load[a] : &:r78_4, ~m? # 78| r78_6(glval) = VariableAddress[b] : -# 78| r78_7(Int32) = Load : &:r78_6, ~m? +# 78| r78_7(Int32) = Load[b] : &:r78_6, ~m? # 78| r78_8(Boolean) = CompareLT : r78_5, r78_7 # 78| v78_9(Void) = ConditionalBranch : r78_8 #-----| False -> Block 7 @@ -1818,10 +1818,10 @@ stmts.cs: # 80| Block 6 # 80| r80_1(glval) = VariableAddress[a] : -# 80| r80_2(Int32) = Load : &:r80_1, ~m? +# 80| r80_2(Int32) = Load[a] : &:r80_1, ~m? # 80| r80_3(Int32) = Constant[1] : # 80| r80_4(Int32) = Add : r80_2, r80_3 -# 80| mu80_5(Int32) = Store : &:r80_1, r80_4 +# 80| mu80_5(Int32) = Store[a] : &:r80_1, r80_4 #-----| Goto (back edge) -> Block 5 # 84| Block 7 @@ -1834,7 +1834,7 @@ stmts.cs: # 89| mu89_2() = AliasedDefinition : # 91| r91_1(glval) = VariableAddress[x] : # 91| r91_2(Int32) = Constant[0] : -# 91| mu91_3(Int32) = Store : &:r91_1, r91_2 +# 91| mu91_3(Int32) = Store[x] : &:r91_1, r91_2 #-----| Goto -> Block 2 # 89| Block 1 @@ -1844,13 +1844,13 @@ stmts.cs: # 94| Block 2 # 94| r94_1(glval) = VariableAddress[x] : -# 94| r94_2(Int32) = Load : &:r94_1, ~m? +# 94| r94_2(Int32) = Load[x] : &:r94_1, ~m? # 94| r94_3(Int32) = Constant[1] : # 94| r94_4(Int32) = Add : r94_2, r94_3 # 94| r94_5(glval) = VariableAddress[x] : -# 94| mu94_6(Int32) = Store : &:r94_5, r94_4 +# 94| mu94_6(Int32) = Store[x] : &:r94_5, r94_4 # 96| r96_1(glval) = VariableAddress[x] : -# 96| r96_2(Int32) = Load : &:r96_1, ~m? +# 96| r96_2(Int32) = Load[x] : &:r96_1, ~m? # 96| r96_3(Int32) = Constant[10] : # 96| r96_4(Boolean) = CompareLT : r96_2, r96_3 # 96| v96_5(Void) = ConditionalBranch : r96_4 @@ -1863,20 +1863,20 @@ stmts.cs: # 99| mu99_2() = AliasedDefinition : # 101| r101_1(glval) = VariableAddress[num] : # 101| r101_2(Int32) = Constant[2147483647] : -# 101| r101_3(Int32) = Load : &:r101_2, ~m? -# 101| mu101_4(Int32) = Store : &:r101_1, r101_3 +# 101| r101_3(Int32) = Load[?] : &:r101_2, ~m? +# 101| mu101_4(Int32) = Store[num] : &:r101_1, r101_3 # 104| r104_1(glval) = VariableAddress[num] : -# 104| r104_2(Int32) = Load : &:r104_1, ~m? +# 104| r104_2(Int32) = Load[num] : &:r104_1, ~m? # 104| r104_3(Int32) = Constant[1] : # 104| r104_4(Int32) = Add : r104_2, r104_3 # 104| r104_5(glval) = VariableAddress[num] : -# 104| mu104_6(Int32) = Store : &:r104_5, r104_4 +# 104| mu104_6(Int32) = Store[num] : &:r104_5, r104_4 # 108| r108_1(glval) = VariableAddress[num] : -# 108| r108_2(Int32) = Load : &:r108_1, ~m? +# 108| r108_2(Int32) = Load[num] : &:r108_1, ~m? # 108| r108_3(Int32) = Constant[1] : # 108| r108_4(Int32) = Add : r108_2, r108_3 # 108| r108_5(glval) = VariableAddress[num] : -# 108| mu108_6(Int32) = Store : &:r108_5, r108_4 +# 108| mu108_6(Int32) = Store[num] : &:r108_5, r108_4 # 99| v99_3(Void) = ReturnVoid : # 99| v99_4(Void) = AliasedUse : ~m? # 99| v99_5(Void) = ExitFunction : @@ -1921,9 +1921,9 @@ using.cs: # 14| r14_3() = FunctionAddress[MyDisposable] : # 14| v14_4(Void) = Call[MyDisposable] : func:r14_3, this:r14_2 # 14| mu14_5() = ^CallSideEffect : ~m? -# 14| mu14_6(MyDisposable) = Store : &:r14_1, r14_2 +# 14| mu14_6(MyDisposable) = Store[o1] : &:r14_1, r14_2 # 16| r16_1(glval) = VariableAddress[o1] : -# 16| r16_2(MyDisposable) = Load : &:r16_1, ~m? +# 16| r16_2(MyDisposable) = Load[o1] : &:r16_1, ~m? # 16| r16_3() = FunctionAddress[DoSomething] : # 16| v16_4(Void) = Call[DoSomething] : func:r16_3, this:r16_2 # 16| mu16_5() = ^CallSideEffect : ~m? @@ -1932,9 +1932,9 @@ using.cs: # 19| r19_3() = FunctionAddress[MyDisposable] : # 19| v19_4(Void) = Call[MyDisposable] : func:r19_3, this:r19_2 # 19| mu19_5() = ^CallSideEffect : ~m? -# 19| mu19_6(MyDisposable) = Store : &:r19_1, r19_2 +# 19| mu19_6(MyDisposable) = Store[o2] : &:r19_1, r19_2 # 22| r22_1(glval) = VariableAddress[o2] : -# 22| r22_2(MyDisposable) = Load : &:r22_1, ~m? +# 22| r22_2(MyDisposable) = Load[o2] : &:r22_1, ~m? # 22| r22_3() = FunctionAddress[DoSomething] : # 22| v22_4(Void) = Call[DoSomething] : func:r22_3, this:r22_2 # 22| mu22_5() = ^CallSideEffect : ~m? @@ -1943,9 +1943,9 @@ using.cs: # 25| r25_3() = FunctionAddress[MyDisposable] : # 25| v25_4(Void) = Call[MyDisposable] : func:r25_3, this:r25_2 # 25| mu25_5() = ^CallSideEffect : ~m? -# 25| mu25_6(MyDisposable) = Store : &:r25_1, r25_2 +# 25| mu25_6(MyDisposable) = Store[o3] : &:r25_1, r25_2 # 26| r26_1(glval) = VariableAddress[o3] : -# 26| r26_2(MyDisposable) = Load : &:r26_1, ~m? +# 26| r26_2(MyDisposable) = Load[o3] : &:r26_1, ~m? # 26| r26_3() = FunctionAddress[DoSomething] : # 26| v26_4(Void) = Call[DoSomething] : func:r26_3, this:r26_2 # 26| mu26_5() = ^CallSideEffect : ~m? @@ -1962,18 +1962,18 @@ variables.cs: # 7| mu7_2(Int32) = Uninitialized[x] : &:r7_1 # 7| r7_3(glval) = VariableAddress[y] : # 7| r7_4(Int32) = Constant[5] : -# 7| mu7_5(Int32) = Store : &:r7_3, r7_4 +# 7| mu7_5(Int32) = Store[y] : &:r7_3, r7_4 # 8| r8_1(Int32) = Constant[4] : # 8| r8_2(glval) = VariableAddress[x] : -# 8| mu8_3(Int32) = Store : &:r8_2, r8_1 +# 8| mu8_3(Int32) = Store[x] : &:r8_2, r8_1 # 9| r9_1(glval) = VariableAddress[y] : -# 9| r9_2(Int32) = Load : &:r9_1, ~m? +# 9| r9_2(Int32) = Load[y] : &:r9_1, ~m? # 9| r9_3(glval) = VariableAddress[x] : -# 9| mu9_4(Int32) = Store : &:r9_3, r9_2 +# 9| mu9_4(Int32) = Store[x] : &:r9_3, r9_2 # 10| r10_1(glval) = VariableAddress[z] : # 10| r10_2(glval) = VariableAddress[y] : -# 10| r10_3(Int32) = Load : &:r10_2, ~m? -# 10| mu10_4(Int32) = Store : &:r10_1, r10_3 +# 10| r10_3(Int32) = Load[y] : &:r10_2, ~m? +# 10| mu10_4(Int32) = Store[z] : &:r10_1, r10_3 # 5| v5_3(Void) = ReturnVoid : # 5| v5_4(Void) = AliasedUse : ~m? # 5| v5_5(Void) = ExitFunction : From eb9cea48b827c388b6cccebb0865d07d201136c6 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Sat, 17 Oct 2020 17:00:29 -0400 Subject: [PATCH 24/53] Fix modeling of `std::set::emplace` --- cpp/ql/src/semmle/code/cpp/models/implementations/StdSet.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/StdSet.qll b/cpp/ql/src/semmle/code/cpp/models/implementations/StdSet.qll index 06e8be4c4a41..5dd4100fbff0 100644 --- a/cpp/ql/src/semmle/code/cpp/models/implementations/StdSet.qll +++ b/cpp/ql/src/semmle/code/cpp/models/implementations/StdSet.qll @@ -61,7 +61,7 @@ class StdSetEmplace extends TaintFunction { // flow from any parameter to qualifier and return value // (here we assume taint flow from any constructor parameter to the constructed object) // (where the return value is a pair, this should really flow just to the first part of it) - input.isParameter([0 .. getNumberOfParameters() - 1]) and + input.isParameterDeref([0 .. getNumberOfParameters() - 1]) and ( output.isQualifierObject() or output.isReturnValue() From 129e250569b6765fed287a72be74e3d72ca04cf7 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Sat, 17 Oct 2020 17:01:24 -0400 Subject: [PATCH 25/53] Update test expectations --- .../dataflow/taint-tests/swap1.cpp | 2 +- .../dataflow/taint-tests/swap2.cpp | 2 +- .../dataflow/taint-tests/test_diff.expected | 147 ++--------------- .../dataflow/taint-tests/test_ir.expected | 154 ++++++++++++++++++ 4 files changed, 168 insertions(+), 137 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/swap1.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/swap1.cpp index f06fbd6aacff..b8a73d9520f7 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/swap1.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/swap1.cpp @@ -84,7 +84,7 @@ void test_copy_assignment_operator() swap(z1, z2); - sink(z2.data1); // tainted [FALSE NEGATIVE in IR] + sink(z2.data1); // tainted sink(z1.data1); // clean [FALSE POSITIVE] } diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/swap2.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/swap2.cpp index b477ee0f38d8..d55f3a33dfdb 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/swap2.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/swap2.cpp @@ -84,7 +84,7 @@ void test_copy_assignment_operator() swap(z1, z2); - sink(z2.data1); // tainted [FALSE NEGATIVE in IR] + sink(z2.data1); // tainted sink(z1.data1); // clean [FALSE POSITIVE] } diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/test_diff.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/test_diff.expected index 3fbfe9ca15c1..81c9b778a446 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/test_diff.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/test_diff.expected @@ -15,7 +15,6 @@ | arrayassignment.cpp:146:7:146:13 | arrayassignment.cpp:144:12:144:17 | IR only | | copyableclass.cpp:67:11:67:11 | copyableclass.cpp:67:13:67:18 | AST only | | copyableclass.cpp:67:11:67:21 | copyableclass.cpp:67:13:67:18 | IR only | -| copyableclass_declonly.cpp:42:8:42:9 | copyableclass_declonly.cpp:34:30:34:35 | AST only | | copyableclass_declonly.cpp:67:11:67:11 | copyableclass_declonly.cpp:67:13:67:18 | AST only | | map.cpp:49:9:49:13 | map.cpp:48:37:48:42 | IR only | | map.cpp:54:9:54:13 | map.cpp:48:37:48:42 | IR only | @@ -26,23 +25,10 @@ | map.cpp:76:9:76:13 | map.cpp:66:37:66:42 | IR only | | map.cpp:79:9:79:13 | map.cpp:66:37:66:42 | IR only | | map.cpp:80:9:80:14 | map.cpp:66:37:66:42 | IR only | +| map.cpp:87:34:87:38 | map.cpp:87:17:87:22 | AST only | | map.cpp:90:34:90:38 | map.cpp:90:24:90:29 | IR only | -| map.cpp:91:34:91:39 | map.cpp:91:24:91:29 | IR only | | map.cpp:108:7:108:54 | map.cpp:108:39:108:44 | IR only | | map.cpp:111:7:111:48 | map.cpp:111:34:111:39 | IR only | -| map.cpp:114:7:114:8 | map.cpp:108:39:108:44 | AST only | -| map.cpp:116:7:116:8 | map.cpp:110:62:110:67 | AST only | -| map.cpp:117:7:117:8 | map.cpp:111:34:111:39 | AST only | -| map.cpp:118:7:118:8 | map.cpp:112:46:112:51 | AST only | -| map.cpp:123:10:123:13 | map.cpp:111:34:111:39 | AST only | -| map.cpp:124:10:124:13 | map.cpp:112:46:112:51 | AST only | -| map.cpp:129:10:129:13 | map.cpp:111:34:111:39 | AST only | -| map.cpp:130:10:130:13 | map.cpp:112:46:112:51 | AST only | -| map.cpp:137:7:137:8 | map.cpp:108:39:108:44 | AST only | -| map.cpp:138:7:138:8 | map.cpp:108:39:108:44 | AST only | -| map.cpp:139:7:139:8 | map.cpp:108:39:108:44 | AST only | -| map.cpp:140:10:140:13 | map.cpp:108:39:108:44 | AST only | -| map.cpp:141:10:141:13 | map.cpp:108:39:108:44 | AST only | | map.cpp:155:12:155:16 | map.cpp:108:39:108:44 | IR only | | map.cpp:156:12:156:17 | map.cpp:108:39:108:44 | IR only | | map.cpp:161:12:161:16 | map.cpp:108:39:108:44 | IR only | @@ -52,44 +38,10 @@ | map.cpp:184:7:184:31 | map.cpp:108:39:108:44 | IR only | | map.cpp:185:7:185:32 | map.cpp:108:39:108:44 | IR only | | map.cpp:187:7:187:32 | map.cpp:108:39:108:44 | IR only | -| map.cpp:193:7:193:9 | map.cpp:191:49:191:54 | AST only | -| map.cpp:196:7:196:9 | map.cpp:192:49:192:54 | AST only | -| map.cpp:199:7:199:9 | map.cpp:191:49:191:54 | AST only | -| map.cpp:200:7:200:9 | map.cpp:191:49:191:54 | AST only | -| map.cpp:201:7:201:9 | map.cpp:192:49:192:54 | AST only | -| map.cpp:202:7:202:9 | map.cpp:192:49:192:54 | AST only | -| map.cpp:210:7:210:9 | map.cpp:206:49:206:54 | AST only | -| map.cpp:213:7:213:9 | map.cpp:209:49:209:54 | AST only | -| map.cpp:216:7:216:9 | map.cpp:206:49:206:54 | AST only | -| map.cpp:218:7:218:9 | map.cpp:209:49:209:54 | AST only | -| map.cpp:219:7:219:9 | map.cpp:209:49:209:54 | AST only | -| map.cpp:225:7:225:9 | map.cpp:223:49:223:54 | AST only | -| map.cpp:225:7:225:9 | map.cpp:224:49:224:54 | AST only | -| map.cpp:227:7:227:9 | map.cpp:223:49:223:54 | AST only | -| map.cpp:227:7:227:9 | map.cpp:224:49:224:54 | AST only | -| map.cpp:229:7:229:9 | map.cpp:223:49:223:54 | AST only | -| map.cpp:229:7:229:9 | map.cpp:224:49:224:54 | AST only | | map.cpp:235:7:235:40 | map.cpp:235:26:235:31 | IR only | -| map.cpp:236:7:236:9 | map.cpp:235:26:235:31 | AST only | -| map.cpp:240:7:240:9 | map.cpp:239:44:239:49 | AST only | | map.cpp:246:7:246:44 | map.cpp:246:30:246:35 | IR only | -| map.cpp:247:7:247:9 | map.cpp:246:30:246:35 | AST only | -| map.cpp:251:7:251:9 | map.cpp:250:43:250:48 | AST only | | map.cpp:260:7:260:54 | map.cpp:260:39:260:44 | IR only | | map.cpp:263:7:263:48 | map.cpp:263:34:263:39 | IR only | -| map.cpp:266:7:266:8 | map.cpp:260:39:260:44 | AST only | -| map.cpp:268:7:268:8 | map.cpp:262:62:262:67 | AST only | -| map.cpp:269:7:269:8 | map.cpp:263:34:263:39 | AST only | -| map.cpp:270:7:270:8 | map.cpp:264:46:264:51 | AST only | -| map.cpp:275:10:275:13 | map.cpp:263:34:263:39 | AST only | -| map.cpp:276:10:276:13 | map.cpp:264:46:264:51 | AST only | -| map.cpp:281:10:281:13 | map.cpp:263:34:263:39 | AST only | -| map.cpp:282:10:282:13 | map.cpp:264:46:264:51 | AST only | -| map.cpp:289:7:289:8 | map.cpp:260:39:260:44 | AST only | -| map.cpp:290:7:290:8 | map.cpp:260:39:260:44 | AST only | -| map.cpp:291:7:291:8 | map.cpp:260:39:260:44 | AST only | -| map.cpp:292:10:292:13 | map.cpp:260:39:260:44 | AST only | -| map.cpp:293:10:293:13 | map.cpp:260:39:260:44 | AST only | | map.cpp:307:12:307:16 | map.cpp:260:39:260:44 | IR only | | map.cpp:308:12:308:17 | map.cpp:260:39:260:44 | IR only | | map.cpp:313:12:313:16 | map.cpp:260:39:260:44 | IR only | @@ -99,105 +51,25 @@ | map.cpp:334:7:334:31 | map.cpp:260:39:260:44 | IR only | | map.cpp:335:7:335:32 | map.cpp:260:39:260:44 | IR only | | map.cpp:336:7:336:32 | map.cpp:260:39:260:44 | IR only | -| map.cpp:342:7:342:9 | map.cpp:340:49:340:54 | AST only | -| map.cpp:345:7:345:9 | map.cpp:341:49:341:54 | AST only | -| map.cpp:348:7:348:9 | map.cpp:340:49:340:54 | AST only | -| map.cpp:349:7:349:9 | map.cpp:340:49:340:54 | AST only | -| map.cpp:350:7:350:9 | map.cpp:341:49:341:54 | AST only | -| map.cpp:351:7:351:9 | map.cpp:341:49:341:54 | AST only | -| map.cpp:359:7:359:9 | map.cpp:355:49:355:54 | AST only | -| map.cpp:362:7:362:9 | map.cpp:358:49:358:54 | AST only | -| map.cpp:365:7:365:9 | map.cpp:355:49:355:54 | AST only | -| map.cpp:367:7:367:9 | map.cpp:358:49:358:54 | AST only | -| map.cpp:368:7:368:9 | map.cpp:358:49:358:54 | AST only | -| map.cpp:374:7:374:9 | map.cpp:372:49:372:54 | AST only | -| map.cpp:374:7:374:9 | map.cpp:373:49:373:54 | AST only | -| map.cpp:376:7:376:9 | map.cpp:372:49:372:54 | AST only | -| map.cpp:376:7:376:9 | map.cpp:373:49:373:54 | AST only | -| map.cpp:378:7:378:9 | map.cpp:372:49:372:54 | AST only | -| map.cpp:378:7:378:9 | map.cpp:373:49:373:54 | AST only | | map.cpp:384:7:384:40 | map.cpp:384:26:384:31 | IR only | -| map.cpp:385:7:385:9 | map.cpp:384:26:384:31 | AST only | -| map.cpp:389:7:389:9 | map.cpp:388:44:388:49 | AST only | | map.cpp:396:7:396:44 | map.cpp:396:30:396:35 | IR only | +| map.cpp:397:40:397:45 | map.cpp:396:30:396:35 | IR only | | map.cpp:397:40:397:45 | map.cpp:397:30:397:35 | IR only | -| map.cpp:398:7:398:9 | map.cpp:396:30:396:35 | AST only | -| map.cpp:398:7:398:9 | map.cpp:397:30:397:35 | AST only | -| map.cpp:402:7:402:9 | map.cpp:401:43:401:48 | AST only | -| map.cpp:417:7:417:9 | map.cpp:416:30:416:35 | AST only | | map.cpp:418:7:418:16 | map.cpp:416:30:416:35 | AST only | -| map.cpp:420:7:420:9 | map.cpp:419:33:419:38 | AST only | | map.cpp:421:7:421:16 | map.cpp:419:33:419:38 | AST only | | map.cpp:431:7:431:67 | map.cpp:431:52:431:57 | IR only | -| map.cpp:432:7:432:9 | map.cpp:431:52:431:57 | AST only | | movableclass.cpp:65:11:65:11 | movableclass.cpp:65:13:65:18 | AST only | | movableclass.cpp:65:11:65:21 | movableclass.cpp:65:13:65:18 | IR only | | set.cpp:20:7:20:31 | set.cpp:20:17:20:22 | IR only | -| set.cpp:26:7:26:8 | set.cpp:20:17:20:22 | AST only | -| set.cpp:28:7:28:8 | set.cpp:22:29:22:34 | AST only | -| set.cpp:30:7:30:8 | set.cpp:20:17:20:22 | AST only | -| set.cpp:44:7:44:8 | set.cpp:20:17:20:22 | AST only | -| set.cpp:45:7:45:8 | set.cpp:20:17:20:22 | AST only | -| set.cpp:46:7:46:8 | set.cpp:20:17:20:22 | AST only | -| set.cpp:47:7:47:9 | set.cpp:20:17:20:22 | AST only | -| set.cpp:48:10:48:13 | set.cpp:20:17:20:22 | AST only | -| set.cpp:49:10:49:13 | set.cpp:20:17:20:22 | AST only | | set.cpp:61:8:61:11 | set.cpp:20:17:20:22 | IR only | | set.cpp:71:7:71:32 | set.cpp:67:13:67:18 | IR only | | set.cpp:72:7:72:33 | set.cpp:67:13:67:18 | IR only | -| set.cpp:78:7:78:9 | set.cpp:76:13:76:18 | AST only | -| set.cpp:81:7:81:9 | set.cpp:77:13:77:18 | AST only | -| set.cpp:84:7:84:9 | set.cpp:76:13:76:18 | AST only | -| set.cpp:85:7:85:9 | set.cpp:76:13:76:18 | AST only | -| set.cpp:86:7:86:9 | set.cpp:77:13:77:18 | AST only | -| set.cpp:87:7:87:9 | set.cpp:77:13:77:18 | AST only | -| set.cpp:95:7:95:9 | set.cpp:91:13:91:18 | AST only | -| set.cpp:98:7:98:9 | set.cpp:94:13:94:18 | AST only | -| set.cpp:101:7:101:9 | set.cpp:91:13:91:18 | AST only | -| set.cpp:103:7:103:9 | set.cpp:94:13:94:18 | AST only | -| set.cpp:104:7:104:9 | set.cpp:94:13:94:18 | AST only | -| set.cpp:110:7:110:9 | set.cpp:108:13:108:18 | AST only | -| set.cpp:110:7:110:9 | set.cpp:109:13:109:18 | AST only | -| set.cpp:112:7:112:9 | set.cpp:108:13:108:18 | AST only | -| set.cpp:112:7:112:9 | set.cpp:109:13:109:18 | AST only | -| set.cpp:114:7:114:9 | set.cpp:108:13:108:18 | AST only | -| set.cpp:114:7:114:9 | set.cpp:109:13:109:18 | AST only | | set.cpp:120:7:120:33 | set.cpp:120:19:120:24 | IR only | -| set.cpp:121:7:121:9 | set.cpp:120:19:120:24 | AST only | -| set.cpp:125:7:125:9 | set.cpp:124:37:124:42 | AST only | | set.cpp:134:7:134:31 | set.cpp:134:17:134:22 | IR only | -| set.cpp:140:7:140:8 | set.cpp:134:17:134:22 | AST only | -| set.cpp:142:7:142:8 | set.cpp:136:29:136:34 | AST only | -| set.cpp:144:7:144:8 | set.cpp:134:17:134:22 | AST only | -| set.cpp:158:7:158:8 | set.cpp:134:17:134:22 | AST only | -| set.cpp:159:7:159:8 | set.cpp:134:17:134:22 | AST only | -| set.cpp:160:7:160:8 | set.cpp:134:17:134:22 | AST only | -| set.cpp:161:7:161:9 | set.cpp:134:17:134:22 | AST only | -| set.cpp:162:10:162:13 | set.cpp:134:17:134:22 | AST only | -| set.cpp:163:10:163:13 | set.cpp:134:17:134:22 | AST only | | set.cpp:175:8:175:11 | set.cpp:134:17:134:22 | IR only | | set.cpp:183:7:183:32 | set.cpp:181:13:181:18 | IR only | | set.cpp:184:7:184:33 | set.cpp:181:13:181:18 | IR only | -| set.cpp:190:7:190:9 | set.cpp:188:13:188:18 | AST only | -| set.cpp:193:7:193:9 | set.cpp:189:13:189:18 | AST only | -| set.cpp:196:7:196:9 | set.cpp:188:13:188:18 | AST only | -| set.cpp:197:7:197:9 | set.cpp:188:13:188:18 | AST only | -| set.cpp:198:7:198:9 | set.cpp:189:13:189:18 | AST only | -| set.cpp:199:7:199:9 | set.cpp:189:13:189:18 | AST only | -| set.cpp:207:7:207:9 | set.cpp:203:13:203:18 | AST only | -| set.cpp:210:7:210:9 | set.cpp:206:13:206:18 | AST only | -| set.cpp:213:7:213:9 | set.cpp:203:13:203:18 | AST only | -| set.cpp:215:7:215:9 | set.cpp:206:13:206:18 | AST only | -| set.cpp:216:7:216:9 | set.cpp:206:13:206:18 | AST only | -| set.cpp:222:7:222:9 | set.cpp:220:13:220:18 | AST only | -| set.cpp:222:7:222:9 | set.cpp:221:13:221:18 | AST only | -| set.cpp:224:7:224:9 | set.cpp:220:13:220:18 | AST only | -| set.cpp:224:7:224:9 | set.cpp:221:13:221:18 | AST only | -| set.cpp:226:7:226:9 | set.cpp:220:13:220:18 | AST only | -| set.cpp:226:7:226:9 | set.cpp:221:13:221:18 | AST only | | set.cpp:232:7:232:33 | set.cpp:232:19:232:24 | IR only | -| set.cpp:233:7:233:9 | set.cpp:232:19:232:24 | AST only | -| set.cpp:237:7:237:9 | set.cpp:236:37:236:42 | AST only | | smart_pointer.cpp:12:10:12:10 | smart_pointer.cpp:11:52:11:57 | AST only | | smart_pointer.cpp:24:10:24:10 | smart_pointer.cpp:23:52:23:57 | AST only | | standalone_iterators.cpp:41:10:41:10 | standalone_iterators.cpp:39:45:39:51 | AST only | @@ -210,6 +82,10 @@ | string.cpp:46:13:46:17 | string.cpp:14:10:14:15 | AST only | | string.cpp:70:7:70:8 | string.cpp:62:19:62:24 | AST only | | string.cpp:126:8:126:11 | string.cpp:120:16:120:21 | IR only | +| string.cpp:145:8:145:14 | string.cpp:142:18:142:23 | IR only | +| string.cpp:146:8:146:14 | string.cpp:142:18:142:23 | IR only | +| string.cpp:147:8:147:14 | string.cpp:142:18:142:23 | IR only | +| string.cpp:150:8:150:20 | string.cpp:150:13:150:18 | IR only | | string.cpp:162:11:162:11 | string.cpp:155:18:155:23 | AST only | | string.cpp:166:11:166:11 | string.cpp:166:14:166:19 | AST only | | string.cpp:167:11:167:11 | string.cpp:166:14:166:19 | AST only | @@ -222,6 +98,7 @@ | string.cpp:247:10:247:16 | string.cpp:234:17:234:22 | AST only | | string.cpp:251:10:251:16 | string.cpp:235:11:235:25 | AST only | | string.cpp:312:9:312:12 | string.cpp:309:16:309:21 | AST only | +| string.cpp:323:7:323:29 | string.cpp:320:16:320:21 | IR only | | string.cpp:340:7:340:7 | string.cpp:336:9:336:23 | AST only | | string.cpp:341:7:341:7 | string.cpp:337:12:337:26 | AST only | | string.cpp:342:7:342:7 | string.cpp:336:9:336:23 | AST only | @@ -240,9 +117,7 @@ | string.cpp:411:8:411:8 | string.cpp:389:18:389:23 | AST only | | string.cpp:415:8:415:11 | string.cpp:389:18:389:23 | IR only | | string.cpp:418:8:418:8 | string.cpp:389:18:389:23 | AST only | -| string.cpp:419:8:419:10 | string.cpp:389:18:389:23 | AST only | | string.cpp:421:8:421:8 | string.cpp:389:18:389:23 | AST only | -| string.cpp:422:8:422:10 | string.cpp:389:18:389:23 | AST only | | string.cpp:436:10:436:15 | string.cpp:431:14:431:19 | AST only | | string.cpp:449:10:449:15 | string.cpp:449:32:449:46 | AST only | | string.cpp:462:10:462:15 | string.cpp:457:18:457:23 | AST only | @@ -267,7 +142,9 @@ | stringstream.cpp:35:11:35:11 | stringstream.cpp:29:16:29:21 | AST only | | stringstream.cpp:39:7:39:9 | stringstream.cpp:33:23:33:28 | AST only | | stringstream.cpp:41:7:41:9 | stringstream.cpp:29:16:29:21 | AST only | +| stringstream.cpp:43:7:43:15 | stringstream.cpp:32:14:32:19 | IR only | | stringstream.cpp:44:11:44:13 | stringstream.cpp:33:23:33:28 | AST only | +| stringstream.cpp:45:7:45:15 | stringstream.cpp:34:14:34:19 | IR only | | stringstream.cpp:46:11:46:13 | stringstream.cpp:29:16:29:21 | AST only | | stringstream.cpp:56:11:56:13 | stringstream.cpp:56:15:56:29 | AST only | | stringstream.cpp:57:44:57:46 | stringstream.cpp:57:25:57:39 | AST only | @@ -277,6 +154,7 @@ | stringstream.cpp:67:7:67:10 | stringstream.cpp:64:36:64:41 | AST only | | stringstream.cpp:76:11:76:11 | stringstream.cpp:70:32:70:37 | AST only | | stringstream.cpp:78:11:78:11 | stringstream.cpp:70:32:70:37 | AST only | +| stringstream.cpp:83:7:83:15 | stringstream.cpp:70:32:70:37 | IR only | | stringstream.cpp:100:11:100:11 | stringstream.cpp:100:31:100:36 | AST only | | stringstream.cpp:143:11:143:22 | stringstream.cpp:143:14:143:19 | IR only | | stringstream.cpp:146:11:146:11 | stringstream.cpp:143:14:143:19 | AST only | @@ -306,13 +184,13 @@ | stringstream.cpp:266:62:266:66 | stringstream.cpp:266:41:266:46 | AST only | | stringstream.cpp:267:7:267:9 | stringstream.cpp:266:41:266:46 | AST only | | swap1.cpp:78:12:78:16 | swap1.cpp:69:23:69:23 | AST only | -| swap1.cpp:87:13:87:17 | swap1.cpp:82:16:82:21 | AST only | | swap1.cpp:88:13:88:17 | swap1.cpp:81:27:81:28 | AST only | | swap1.cpp:102:12:102:16 | swap1.cpp:93:23:93:23 | AST only | | swap1.cpp:115:18:115:22 | swap1.cpp:108:23:108:31 | AST only | | swap1.cpp:129:12:129:16 | swap1.cpp:120:23:120:23 | AST only | | swap1.cpp:144:12:144:16 | swap1.cpp:135:23:135:23 | AST only | | swap2.cpp:78:12:78:16 | swap2.cpp:69:23:69:23 | AST only | +| swap2.cpp:87:13:87:17 | swap2.cpp:82:16:82:21 | IR only | | swap2.cpp:88:13:88:17 | swap2.cpp:81:27:81:28 | AST only | | swap2.cpp:102:12:102:16 | swap2.cpp:93:23:93:23 | AST only | | swap2.cpp:115:18:115:22 | swap2.cpp:108:23:108:31 | AST only | @@ -357,7 +235,6 @@ | vector.cpp:171:13:171:13 | vector.cpp:170:14:170:19 | AST only | | vector.cpp:180:13:180:13 | vector.cpp:179:14:179:19 | AST only | | vector.cpp:201:13:201:13 | vector.cpp:200:14:200:19 | AST only | -| vector.cpp:261:8:261:9 | vector.cpp:239:15:239:20 | AST only | | vector.cpp:286:10:286:13 | vector.cpp:284:15:284:20 | AST only | | vector.cpp:287:7:287:18 | vector.cpp:284:15:284:20 | AST only | | vector.cpp:290:7:290:8 | vector.cpp:289:17:289:30 | AST only | @@ -378,4 +255,4 @@ | vector.cpp:385:7:385:8 | vector.cpp:382:8:382:13 | AST only | | vector.cpp:392:7:392:8 | vector.cpp:330:10:330:15 | AST only | | vector.cpp:392:7:392:8 | vector.cpp:389:8:389:13 | AST only | -| vector.cpp:400:7:400:9 | vector.cpp:399:38:399:43 | AST only | \ No newline at end of file +| vector.cpp:400:7:400:9 | vector.cpp:399:38:399:43 | AST only | diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected index 29e6f4f7635b..a61c5d7b9dd1 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected @@ -26,6 +26,7 @@ | copyableclass.cpp:67:11:67:21 | (reference dereference) | copyableclass.cpp:67:13:67:18 | call to source | | copyableclass_declonly.cpp:40:8:40:9 | s1 | copyableclass_declonly.cpp:34:30:34:35 | call to source | | copyableclass_declonly.cpp:41:8:41:9 | s2 | copyableclass_declonly.cpp:35:32:35:37 | call to source | +| copyableclass_declonly.cpp:42:8:42:9 | s3 | copyableclass_declonly.cpp:34:30:34:35 | call to source | | copyableclass_declonly.cpp:43:8:43:9 | s4 | copyableclass_declonly.cpp:38:8:38:13 | call to source | | copyableclass_declonly.cpp:65:8:65:9 | s1 | copyableclass_declonly.cpp:60:56:60:61 | call to source | | copyableclass_declonly.cpp:66:8:66:9 | s2 | copyableclass_declonly.cpp:63:32:63:37 | call to source | @@ -73,10 +74,23 @@ | map.cpp:110:10:110:15 | call to insert | map.cpp:110:62:110:67 | call to source | | map.cpp:111:7:111:48 | call to iterator | map.cpp:111:34:111:39 | call to source | | map.cpp:112:10:112:25 | call to insert_or_assign | map.cpp:112:46:112:51 | call to source | +| map.cpp:114:7:114:8 | call to map | map.cpp:108:39:108:44 | call to source | +| map.cpp:116:7:116:8 | call to map | map.cpp:110:62:110:67 | call to source | +| map.cpp:117:7:117:8 | call to map | map.cpp:111:34:111:39 | call to source | +| map.cpp:118:7:118:8 | call to map | map.cpp:112:46:112:51 | call to source | | map.cpp:120:10:120:13 | call to find | map.cpp:108:39:108:44 | call to source | | map.cpp:122:10:122:13 | call to find | map.cpp:110:62:110:67 | call to source | +| map.cpp:123:10:123:13 | call to find | map.cpp:111:34:111:39 | call to source | +| map.cpp:124:10:124:13 | call to find | map.cpp:112:46:112:51 | call to source | | map.cpp:126:10:126:13 | call to find | map.cpp:108:39:108:44 | call to source | | map.cpp:128:10:128:13 | call to find | map.cpp:110:62:110:67 | call to source | +| map.cpp:129:10:129:13 | call to find | map.cpp:111:34:111:39 | call to source | +| map.cpp:130:10:130:13 | call to find | map.cpp:112:46:112:51 | call to source | +| map.cpp:137:7:137:8 | call to map | map.cpp:108:39:108:44 | call to source | +| map.cpp:138:7:138:8 | call to map | map.cpp:108:39:108:44 | call to source | +| map.cpp:139:7:139:8 | call to map | map.cpp:108:39:108:44 | call to source | +| map.cpp:140:10:140:13 | call to find | map.cpp:108:39:108:44 | call to source | +| map.cpp:141:10:141:13 | call to find | map.cpp:108:39:108:44 | call to source | | map.cpp:142:10:142:13 | call to find | map.cpp:108:39:108:44 | call to source | | map.cpp:154:8:154:10 | call to pair | map.cpp:108:39:108:44 | call to source | | map.cpp:155:12:155:16 | first | map.cpp:108:39:108:44 | call to source | @@ -91,20 +105,54 @@ | map.cpp:185:7:185:32 | call to iterator | map.cpp:108:39:108:44 | call to source | | map.cpp:186:10:186:20 | call to upper_bound | map.cpp:108:39:108:44 | call to source | | map.cpp:187:7:187:32 | call to iterator | map.cpp:108:39:108:44 | call to source | +| map.cpp:193:7:193:9 | call to map | map.cpp:191:49:191:54 | call to source | +| map.cpp:196:7:196:9 | call to map | map.cpp:192:49:192:54 | call to source | +| map.cpp:199:7:199:9 | call to map | map.cpp:191:49:191:54 | call to source | +| map.cpp:200:7:200:9 | call to map | map.cpp:191:49:191:54 | call to source | +| map.cpp:201:7:201:9 | call to map | map.cpp:192:49:192:54 | call to source | +| map.cpp:202:7:202:9 | call to map | map.cpp:192:49:192:54 | call to source | +| map.cpp:210:7:210:9 | call to map | map.cpp:206:49:206:54 | call to source | +| map.cpp:213:7:213:9 | call to map | map.cpp:209:49:209:54 | call to source | +| map.cpp:216:7:216:9 | call to map | map.cpp:206:49:206:54 | call to source | +| map.cpp:218:7:218:9 | call to map | map.cpp:209:49:209:54 | call to source | +| map.cpp:219:7:219:9 | call to map | map.cpp:209:49:209:54 | call to source | +| map.cpp:225:7:225:9 | call to map | map.cpp:223:49:223:54 | call to source | +| map.cpp:225:7:225:9 | call to map | map.cpp:224:49:224:54 | call to source | | map.cpp:226:11:226:15 | call to erase | map.cpp:223:49:223:54 | call to source | | map.cpp:226:11:226:15 | call to erase | map.cpp:224:49:224:54 | call to source | +| map.cpp:227:7:227:9 | call to map | map.cpp:223:49:223:54 | call to source | +| map.cpp:227:7:227:9 | call to map | map.cpp:224:49:224:54 | call to source | +| map.cpp:229:7:229:9 | call to map | map.cpp:223:49:223:54 | call to source | +| map.cpp:229:7:229:9 | call to map | map.cpp:224:49:224:54 | call to source | | map.cpp:235:7:235:40 | call to iterator | map.cpp:235:26:235:31 | call to source | +| map.cpp:236:7:236:9 | call to map | map.cpp:235:26:235:31 | call to source | | map.cpp:239:11:239:22 | call to emplace_hint | map.cpp:239:44:239:49 | call to source | +| map.cpp:240:7:240:9 | call to map | map.cpp:239:44:239:49 | call to source | | map.cpp:246:7:246:44 | call to iterator | map.cpp:246:30:246:35 | call to source | +| map.cpp:247:7:247:9 | call to map | map.cpp:246:30:246:35 | call to source | | map.cpp:250:11:250:21 | call to try_emplace | map.cpp:250:43:250:48 | call to source | +| map.cpp:251:7:251:9 | call to map | map.cpp:250:43:250:48 | call to source | | map.cpp:260:7:260:54 | call to iterator | map.cpp:260:39:260:44 | call to source | | map.cpp:262:10:262:15 | call to insert | map.cpp:262:62:262:67 | call to source | | map.cpp:263:7:263:48 | call to iterator | map.cpp:263:34:263:39 | call to source | | map.cpp:264:10:264:25 | call to insert_or_assign | map.cpp:264:46:264:51 | call to source | +| map.cpp:266:7:266:8 | call to unordered_map | map.cpp:260:39:260:44 | call to source | +| map.cpp:268:7:268:8 | call to unordered_map | map.cpp:262:62:262:67 | call to source | +| map.cpp:269:7:269:8 | call to unordered_map | map.cpp:263:34:263:39 | call to source | +| map.cpp:270:7:270:8 | call to unordered_map | map.cpp:264:46:264:51 | call to source | | map.cpp:272:10:272:13 | call to find | map.cpp:260:39:260:44 | call to source | | map.cpp:274:10:274:13 | call to find | map.cpp:262:62:262:67 | call to source | +| map.cpp:275:10:275:13 | call to find | map.cpp:263:34:263:39 | call to source | +| map.cpp:276:10:276:13 | call to find | map.cpp:264:46:264:51 | call to source | | map.cpp:278:10:278:13 | call to find | map.cpp:260:39:260:44 | call to source | | map.cpp:280:10:280:13 | call to find | map.cpp:262:62:262:67 | call to source | +| map.cpp:281:10:281:13 | call to find | map.cpp:263:34:263:39 | call to source | +| map.cpp:282:10:282:13 | call to find | map.cpp:264:46:264:51 | call to source | +| map.cpp:289:7:289:8 | call to unordered_map | map.cpp:260:39:260:44 | call to source | +| map.cpp:290:7:290:8 | call to unordered_map | map.cpp:260:39:260:44 | call to source | +| map.cpp:291:7:291:8 | call to unordered_map | map.cpp:260:39:260:44 | call to source | +| map.cpp:292:10:292:13 | call to find | map.cpp:260:39:260:44 | call to source | +| map.cpp:293:10:293:13 | call to find | map.cpp:260:39:260:44 | call to source | | map.cpp:294:10:294:13 | call to find | map.cpp:260:39:260:44 | call to source | | map.cpp:306:8:306:10 | call to pair | map.cpp:260:39:260:44 | call to source | | map.cpp:307:12:307:16 | first | map.cpp:260:39:260:44 | call to source | @@ -116,16 +164,42 @@ | map.cpp:334:7:334:31 | call to iterator | map.cpp:260:39:260:44 | call to source | | map.cpp:335:7:335:32 | call to iterator | map.cpp:260:39:260:44 | call to source | | map.cpp:336:7:336:32 | call to iterator | map.cpp:260:39:260:44 | call to source | +| map.cpp:342:7:342:9 | call to unordered_map | map.cpp:340:49:340:54 | call to source | +| map.cpp:345:7:345:9 | call to unordered_map | map.cpp:341:49:341:54 | call to source | +| map.cpp:348:7:348:9 | call to unordered_map | map.cpp:340:49:340:54 | call to source | +| map.cpp:349:7:349:9 | call to unordered_map | map.cpp:340:49:340:54 | call to source | +| map.cpp:350:7:350:9 | call to unordered_map | map.cpp:341:49:341:54 | call to source | +| map.cpp:351:7:351:9 | call to unordered_map | map.cpp:341:49:341:54 | call to source | +| map.cpp:359:7:359:9 | call to unordered_map | map.cpp:355:49:355:54 | call to source | +| map.cpp:362:7:362:9 | call to unordered_map | map.cpp:358:49:358:54 | call to source | +| map.cpp:365:7:365:9 | call to unordered_map | map.cpp:355:49:355:54 | call to source | +| map.cpp:367:7:367:9 | call to unordered_map | map.cpp:358:49:358:54 | call to source | +| map.cpp:368:7:368:9 | call to unordered_map | map.cpp:358:49:358:54 | call to source | +| map.cpp:374:7:374:9 | call to unordered_map | map.cpp:372:49:372:54 | call to source | +| map.cpp:374:7:374:9 | call to unordered_map | map.cpp:373:49:373:54 | call to source | | map.cpp:375:11:375:15 | call to erase | map.cpp:372:49:372:54 | call to source | | map.cpp:375:11:375:15 | call to erase | map.cpp:373:49:373:54 | call to source | +| map.cpp:376:7:376:9 | call to unordered_map | map.cpp:372:49:372:54 | call to source | +| map.cpp:376:7:376:9 | call to unordered_map | map.cpp:373:49:373:54 | call to source | +| map.cpp:378:7:378:9 | call to unordered_map | map.cpp:372:49:372:54 | call to source | +| map.cpp:378:7:378:9 | call to unordered_map | map.cpp:373:49:373:54 | call to source | | map.cpp:384:7:384:40 | call to iterator | map.cpp:384:26:384:31 | call to source | +| map.cpp:385:7:385:9 | call to unordered_map | map.cpp:384:26:384:31 | call to source | | map.cpp:388:11:388:22 | call to emplace_hint | map.cpp:388:44:388:49 | call to source | +| map.cpp:389:7:389:9 | call to unordered_map | map.cpp:388:44:388:49 | call to source | | map.cpp:396:7:396:44 | call to iterator | map.cpp:396:30:396:35 | call to source | +| map.cpp:397:40:397:45 | second | map.cpp:396:30:396:35 | call to source | | map.cpp:397:40:397:45 | second | map.cpp:397:30:397:35 | call to source | +| map.cpp:398:7:398:9 | call to unordered_map | map.cpp:396:30:396:35 | call to source | +| map.cpp:398:7:398:9 | call to unordered_map | map.cpp:397:30:397:35 | call to source | | map.cpp:401:11:401:21 | call to try_emplace | map.cpp:401:43:401:48 | call to source | +| map.cpp:402:7:402:9 | call to unordered_map | map.cpp:401:43:401:48 | call to source | | map.cpp:416:7:416:41 | call to pair | map.cpp:416:30:416:35 | call to source | +| map.cpp:417:7:417:9 | call to unordered_map | map.cpp:416:30:416:35 | call to source | | map.cpp:419:7:419:41 | call to pair | map.cpp:419:33:419:38 | call to source | +| map.cpp:420:7:420:9 | call to unordered_map | map.cpp:419:33:419:38 | call to source | | map.cpp:431:7:431:67 | call to iterator | map.cpp:431:52:431:57 | call to source | +| map.cpp:432:7:432:9 | call to unordered_map | map.cpp:431:52:431:57 | call to source | | map.cpp:433:11:433:22 | call to emplace_hint | map.cpp:431:52:431:57 | call to source | | movableclass.cpp:44:8:44:9 | s1 | movableclass.cpp:39:21:39:26 | call to source | | movableclass.cpp:45:8:45:9 | s2 | movableclass.cpp:40:23:40:28 | call to source | @@ -136,9 +210,18 @@ | movableclass.cpp:65:11:65:21 | (reference dereference) | movableclass.cpp:65:13:65:18 | call to source | | set.cpp:20:7:20:31 | call to iterator | set.cpp:20:17:20:22 | call to source | | set.cpp:22:10:22:15 | call to insert | set.cpp:22:29:22:34 | call to source | +| set.cpp:26:7:26:8 | call to set | set.cpp:20:17:20:22 | call to source | +| set.cpp:28:7:28:8 | call to set | set.cpp:22:29:22:34 | call to source | +| set.cpp:30:7:30:8 | call to set | set.cpp:20:17:20:22 | call to source | | set.cpp:32:10:32:13 | call to find | set.cpp:20:17:20:22 | call to source | | set.cpp:34:10:34:13 | call to find | set.cpp:22:29:22:34 | call to source | | set.cpp:36:10:36:13 | call to find | set.cpp:20:17:20:22 | call to source | +| set.cpp:44:7:44:8 | call to set | set.cpp:20:17:20:22 | call to source | +| set.cpp:45:7:45:8 | call to set | set.cpp:20:17:20:22 | call to source | +| set.cpp:46:7:46:8 | call to set | set.cpp:20:17:20:22 | call to source | +| set.cpp:47:7:47:9 | call to set | set.cpp:20:17:20:22 | call to source | +| set.cpp:48:10:48:13 | call to find | set.cpp:20:17:20:22 | call to source | +| set.cpp:49:10:49:13 | call to find | set.cpp:20:17:20:22 | call to source | | set.cpp:50:10:50:13 | call to find | set.cpp:20:17:20:22 | call to source | | set.cpp:51:11:51:14 | call to find | set.cpp:20:17:20:22 | call to source | | set.cpp:61:8:61:8 | call to operator* | set.cpp:20:17:20:22 | call to source | @@ -147,25 +230,72 @@ | set.cpp:70:11:70:21 | call to upper_bound | set.cpp:67:13:67:18 | call to source | | set.cpp:71:7:71:32 | call to iterator | set.cpp:67:13:67:18 | call to source | | set.cpp:72:7:72:33 | call to iterator | set.cpp:67:13:67:18 | call to source | +| set.cpp:78:7:78:9 | call to set | set.cpp:76:13:76:18 | call to source | +| set.cpp:81:7:81:9 | call to set | set.cpp:77:13:77:18 | call to source | +| set.cpp:84:7:84:9 | call to set | set.cpp:76:13:76:18 | call to source | +| set.cpp:85:7:85:9 | call to set | set.cpp:76:13:76:18 | call to source | +| set.cpp:86:7:86:9 | call to set | set.cpp:77:13:77:18 | call to source | +| set.cpp:87:7:87:9 | call to set | set.cpp:77:13:77:18 | call to source | +| set.cpp:95:7:95:9 | call to set | set.cpp:91:13:91:18 | call to source | +| set.cpp:98:7:98:9 | call to set | set.cpp:94:13:94:18 | call to source | +| set.cpp:101:7:101:9 | call to set | set.cpp:91:13:91:18 | call to source | +| set.cpp:103:7:103:9 | call to set | set.cpp:94:13:94:18 | call to source | +| set.cpp:104:7:104:9 | call to set | set.cpp:94:13:94:18 | call to source | +| set.cpp:110:7:110:9 | call to set | set.cpp:108:13:108:18 | call to source | +| set.cpp:110:7:110:9 | call to set | set.cpp:109:13:109:18 | call to source | | set.cpp:111:11:111:15 | call to erase | set.cpp:108:13:108:18 | call to source | | set.cpp:111:11:111:15 | call to erase | set.cpp:109:13:109:18 | call to source | +| set.cpp:112:7:112:9 | call to set | set.cpp:108:13:108:18 | call to source | +| set.cpp:112:7:112:9 | call to set | set.cpp:109:13:109:18 | call to source | +| set.cpp:114:7:114:9 | call to set | set.cpp:108:13:108:18 | call to source | +| set.cpp:114:7:114:9 | call to set | set.cpp:109:13:109:18 | call to source | | set.cpp:120:7:120:33 | call to iterator | set.cpp:120:19:120:24 | call to source | +| set.cpp:121:7:121:9 | call to set | set.cpp:120:19:120:24 | call to source | | set.cpp:124:11:124:22 | call to emplace_hint | set.cpp:124:37:124:42 | call to source | +| set.cpp:125:7:125:9 | call to set | set.cpp:124:37:124:42 | call to source | | set.cpp:134:7:134:31 | call to iterator | set.cpp:134:17:134:22 | call to source | | set.cpp:136:10:136:15 | call to insert | set.cpp:136:29:136:34 | call to source | +| set.cpp:140:7:140:8 | call to unordered_set | set.cpp:134:17:134:22 | call to source | +| set.cpp:142:7:142:8 | call to unordered_set | set.cpp:136:29:136:34 | call to source | +| set.cpp:144:7:144:8 | call to unordered_set | set.cpp:134:17:134:22 | call to source | | set.cpp:146:10:146:13 | call to find | set.cpp:134:17:134:22 | call to source | | set.cpp:148:10:148:13 | call to find | set.cpp:136:29:136:34 | call to source | | set.cpp:150:10:150:13 | call to find | set.cpp:134:17:134:22 | call to source | +| set.cpp:158:7:158:8 | call to unordered_set | set.cpp:134:17:134:22 | call to source | +| set.cpp:159:7:159:8 | call to unordered_set | set.cpp:134:17:134:22 | call to source | +| set.cpp:160:7:160:8 | call to unordered_set | set.cpp:134:17:134:22 | call to source | +| set.cpp:161:7:161:9 | call to unordered_set | set.cpp:134:17:134:22 | call to source | +| set.cpp:162:10:162:13 | call to find | set.cpp:134:17:134:22 | call to source | +| set.cpp:163:10:163:13 | call to find | set.cpp:134:17:134:22 | call to source | | set.cpp:164:10:164:13 | call to find | set.cpp:134:17:134:22 | call to source | | set.cpp:165:11:165:14 | call to find | set.cpp:134:17:134:22 | call to source | | set.cpp:175:8:175:8 | call to operator* | set.cpp:134:17:134:22 | call to source | | set.cpp:175:8:175:11 | (reference dereference) | set.cpp:134:17:134:22 | call to source | | set.cpp:183:7:183:32 | call to iterator | set.cpp:181:13:181:18 | call to source | | set.cpp:184:7:184:33 | call to iterator | set.cpp:181:13:181:18 | call to source | +| set.cpp:190:7:190:9 | call to unordered_set | set.cpp:188:13:188:18 | call to source | +| set.cpp:193:7:193:9 | call to unordered_set | set.cpp:189:13:189:18 | call to source | +| set.cpp:196:7:196:9 | call to unordered_set | set.cpp:188:13:188:18 | call to source | +| set.cpp:197:7:197:9 | call to unordered_set | set.cpp:188:13:188:18 | call to source | +| set.cpp:198:7:198:9 | call to unordered_set | set.cpp:189:13:189:18 | call to source | +| set.cpp:199:7:199:9 | call to unordered_set | set.cpp:189:13:189:18 | call to source | +| set.cpp:207:7:207:9 | call to unordered_set | set.cpp:203:13:203:18 | call to source | +| set.cpp:210:7:210:9 | call to unordered_set | set.cpp:206:13:206:18 | call to source | +| set.cpp:213:7:213:9 | call to unordered_set | set.cpp:203:13:203:18 | call to source | +| set.cpp:215:7:215:9 | call to unordered_set | set.cpp:206:13:206:18 | call to source | +| set.cpp:216:7:216:9 | call to unordered_set | set.cpp:206:13:206:18 | call to source | +| set.cpp:222:7:222:9 | call to unordered_set | set.cpp:220:13:220:18 | call to source | +| set.cpp:222:7:222:9 | call to unordered_set | set.cpp:221:13:221:18 | call to source | | set.cpp:223:11:223:15 | call to erase | set.cpp:220:13:220:18 | call to source | | set.cpp:223:11:223:15 | call to erase | set.cpp:221:13:221:18 | call to source | +| set.cpp:224:7:224:9 | call to unordered_set | set.cpp:220:13:220:18 | call to source | +| set.cpp:224:7:224:9 | call to unordered_set | set.cpp:221:13:221:18 | call to source | +| set.cpp:226:7:226:9 | call to unordered_set | set.cpp:220:13:220:18 | call to source | +| set.cpp:226:7:226:9 | call to unordered_set | set.cpp:221:13:221:18 | call to source | | set.cpp:232:7:232:33 | call to iterator | set.cpp:232:19:232:24 | call to source | +| set.cpp:233:7:233:9 | call to unordered_set | set.cpp:232:19:232:24 | call to source | | set.cpp:236:11:236:22 | call to emplace_hint | set.cpp:236:37:236:42 | call to source | +| set.cpp:237:7:237:9 | call to unordered_set | set.cpp:236:37:236:42 | call to source | | smart_pointer.cpp:13:10:13:10 | Argument 0 indirection | smart_pointer.cpp:11:52:11:57 | call to source | | smart_pointer.cpp:25:10:25:10 | Argument 0 indirection | smart_pointer.cpp:23:52:23:57 | call to source | | smart_pointer.cpp:52:12:52:14 | call to get | smart_pointer.cpp:51:52:51:57 | call to source | @@ -189,9 +319,13 @@ | string.cpp:130:8:130:8 | c | string.cpp:120:16:120:21 | call to source | | string.cpp:135:8:135:8 | (reference dereference) | string.cpp:133:28:133:33 | call to source | | string.cpp:135:8:135:8 | c | string.cpp:133:28:133:33 | call to source | +| string.cpp:145:8:145:14 | Argument 0 indirection | string.cpp:142:18:142:23 | call to source | | string.cpp:145:11:145:11 | call to operator+ | string.cpp:142:18:142:23 | call to source | +| string.cpp:146:8:146:14 | Argument 0 indirection | string.cpp:142:18:142:23 | call to source | | string.cpp:146:11:146:11 | call to operator+ | string.cpp:142:18:142:23 | call to source | +| string.cpp:147:8:147:14 | Argument 0 indirection | string.cpp:142:18:142:23 | call to source | | string.cpp:147:11:147:11 | call to operator+ | string.cpp:142:18:142:23 | call to source | +| string.cpp:150:8:150:20 | Argument 0 indirection | string.cpp:150:13:150:18 | call to source | | string.cpp:150:11:150:11 | call to operator+ | string.cpp:150:13:150:18 | call to source | | string.cpp:159:8:159:9 | Argument 0 indirection | string.cpp:155:18:155:23 | call to source | | string.cpp:163:8:163:9 | Argument 0 indirection | string.cpp:155:18:155:23 | call to source | @@ -220,6 +354,7 @@ | string.cpp:295:7:295:8 | Argument 0 indirection | string.cpp:291:17:291:22 | call to source | | string.cpp:301:7:301:8 | Argument 0 indirection | string.cpp:289:17:289:22 | call to source | | string.cpp:303:7:303:8 | Argument 0 indirection | string.cpp:291:17:291:22 | call to source | +| string.cpp:323:7:323:29 | Argument 0 indirection | string.cpp:320:16:320:21 | call to source | | string.cpp:323:9:323:14 | call to substr | string.cpp:320:16:320:21 | call to source | | string.cpp:364:8:364:9 | Argument 0 indirection | string.cpp:358:18:358:23 | call to source | | string.cpp:382:8:382:8 | call to operator* | string.cpp:374:18:374:23 | call to source | @@ -232,6 +367,8 @@ | string.cpp:407:8:407:11 | (reference dereference) | string.cpp:389:18:389:23 | call to source | | string.cpp:415:8:415:8 | call to operator* | string.cpp:389:18:389:23 | call to source | | string.cpp:415:8:415:11 | (reference dereference) | string.cpp:389:18:389:23 | call to source | +| string.cpp:419:8:419:10 | call to iterator | string.cpp:389:18:389:23 | call to source | +| string.cpp:422:8:422:10 | call to iterator | string.cpp:389:18:389:23 | call to source | | string.cpp:437:7:437:8 | Argument 0 indirection | string.cpp:431:14:431:19 | call to source | | string.cpp:450:8:450:8 | Argument 0 indirection | string.cpp:449:32:449:46 | call to source | | string.cpp:463:8:463:8 | Argument 0 indirection | string.cpp:457:18:457:23 | call to source | @@ -254,13 +391,16 @@ | stringstream.cpp:34:23:34:31 | (reference dereference) | stringstream.cpp:34:14:34:19 | call to source | | stringstream.cpp:38:7:38:9 | Argument 0 indirection | stringstream.cpp:32:14:32:19 | call to source | | stringstream.cpp:40:7:40:9 | Argument 0 indirection | stringstream.cpp:34:14:34:19 | call to source | +| stringstream.cpp:43:7:43:15 | Argument 0 indirection | stringstream.cpp:32:14:32:19 | call to source | | stringstream.cpp:43:11:43:13 | call to str | stringstream.cpp:32:14:32:19 | call to source | +| stringstream.cpp:45:7:45:15 | Argument 0 indirection | stringstream.cpp:34:14:34:19 | call to source | | stringstream.cpp:45:11:45:13 | call to str | stringstream.cpp:34:14:34:19 | call to source | | stringstream.cpp:52:7:52:9 | Argument 0 indirection | stringstream.cpp:49:10:49:15 | call to source | | stringstream.cpp:53:7:53:9 | Argument 0 indirection | stringstream.cpp:50:10:50:15 | call to source | | stringstream.cpp:59:7:59:9 | Argument 0 indirection | stringstream.cpp:56:15:56:29 | call to source | | stringstream.cpp:66:7:66:10 | Argument 0 indirection | stringstream.cpp:63:18:63:23 | call to source | | stringstream.cpp:81:7:81:9 | Argument 0 indirection | stringstream.cpp:70:32:70:37 | source | +| stringstream.cpp:83:7:83:15 | Argument 0 indirection | stringstream.cpp:70:32:70:37 | source | | stringstream.cpp:83:11:83:13 | call to str | stringstream.cpp:70:32:70:37 | source | | stringstream.cpp:85:7:85:8 | v2 | stringstream.cpp:70:32:70:37 | source | | stringstream.cpp:103:7:103:9 | Argument 0 indirection | stringstream.cpp:91:19:91:24 | call to source | @@ -274,10 +414,15 @@ | stringstream.cpp:143:11:143:22 | (reference dereference) | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:149:7:149:8 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:150:7:150:8 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source | +| stringstream.cpp:157:7:157:8 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:157:7:157:8 | call to basic_string | stringstream.cpp:143:14:143:19 | call to source | +| stringstream.cpp:158:7:158:8 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:158:7:158:8 | call to basic_string | stringstream.cpp:143:14:143:19 | call to source | +| stringstream.cpp:168:7:168:8 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:168:7:168:8 | call to basic_string | stringstream.cpp:143:14:143:19 | call to source | +| stringstream.cpp:170:7:170:8 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:170:7:170:8 | call to basic_string | stringstream.cpp:143:14:143:19 | call to source | +| stringstream.cpp:172:7:172:9 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:172:7:172:9 | call to basic_string | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:175:7:175:20 | ... = ... | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:177:7:177:21 | ... = ... | stringstream.cpp:143:14:143:19 | call to source | @@ -285,16 +430,22 @@ | stringstream.cpp:183:7:183:8 | c4 | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:185:7:185:8 | c6 | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:197:10:197:12 | call to get | stringstream.cpp:196:18:196:32 | call to source | +| stringstream.cpp:219:7:219:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:219:7:219:8 | call to basic_string | stringstream.cpp:203:24:203:29 | call to source | +| stringstream.cpp:220:7:220:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:220:7:220:8 | call to basic_string | stringstream.cpp:203:24:203:29 | call to source | +| stringstream.cpp:227:7:227:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:227:7:227:8 | call to basic_string | stringstream.cpp:203:24:203:29 | call to source | +| stringstream.cpp:228:7:228:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:228:7:228:8 | call to basic_string | stringstream.cpp:203:24:203:29 | call to source | +| stringstream.cpp:231:7:231:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:231:7:231:8 | call to basic_string | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:239:7:239:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:240:7:240:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:247:7:247:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:248:7:248:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:251:7:251:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | +| stringstream.cpp:263:7:263:8 | Argument 0 indirection | stringstream.cpp:257:24:257:29 | call to source | | stringstream.cpp:263:7:263:8 | call to basic_string | stringstream.cpp:257:24:257:29 | call to source | | structlikeclass.cpp:35:8:35:9 | s1 | structlikeclass.cpp:29:22:29:27 | call to source | | structlikeclass.cpp:36:8:36:9 | s2 | structlikeclass.cpp:30:24:30:29 | call to source | @@ -307,6 +458,7 @@ | swap1.cpp:78:12:78:16 | data1 | swap1.cpp:71:15:71:20 | call to source | | swap1.cpp:79:12:79:16 | data1 | swap1.cpp:71:15:71:20 | call to source | | swap1.cpp:83:13:83:17 | data1 | swap1.cpp:82:16:82:21 | call to source | +| swap1.cpp:87:13:87:17 | data1 | swap1.cpp:82:16:82:21 | call to source | | swap1.cpp:88:13:88:17 | data1 | swap1.cpp:82:16:82:21 | call to source | | swap1.cpp:97:12:97:16 | data1 | swap1.cpp:95:15:95:20 | call to source | | swap1.cpp:102:12:102:16 | data1 | swap1.cpp:95:15:95:20 | call to source | @@ -323,6 +475,7 @@ | swap2.cpp:78:12:78:16 | data1 | swap2.cpp:71:15:71:20 | call to source | | swap2.cpp:79:12:79:16 | data1 | swap2.cpp:71:15:71:20 | call to source | | swap2.cpp:83:13:83:17 | data1 | swap2.cpp:82:16:82:21 | call to source | +| swap2.cpp:87:13:87:17 | data1 | swap2.cpp:82:16:82:21 | call to source | | swap2.cpp:88:13:88:17 | data1 | swap2.cpp:82:16:82:21 | call to source | | swap2.cpp:97:12:97:16 | data1 | swap2.cpp:95:15:95:20 | call to source | | swap2.cpp:102:12:102:16 | data1 | swap2.cpp:95:15:95:20 | call to source | @@ -408,6 +561,7 @@ | vector.cpp:258:8:258:9 | Argument 0 indirection | vector.cpp:239:15:239:20 | call to source | | vector.cpp:259:8:259:9 | Argument 0 indirection | vector.cpp:239:15:239:20 | call to source | | vector.cpp:260:8:260:9 | Argument 0 indirection | vector.cpp:239:15:239:20 | call to source | +| vector.cpp:261:8:261:9 | Argument 0 indirection | vector.cpp:239:15:239:20 | call to source | | vector.cpp:273:8:273:9 | Argument 0 indirection | vector.cpp:269:18:269:31 | call to source | | vector.cpp:274:8:274:9 | Argument 0 indirection | vector.cpp:270:18:270:35 | call to source | | vector.cpp:275:8:275:9 | Argument 0 indirection | vector.cpp:271:18:271:34 | call to source | From 5f6ae32f1cb1f6de7712baffc701a9e9672f22a8 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Sat, 17 Oct 2020 18:16:21 -0400 Subject: [PATCH 26/53] Accept test output after merge --- .../library-tests/ir/ir/PrintAST.expected | 18 +- .../test/library-tests/ir/ir/raw_ir.expected | 196 ++++++------ .../ir/ssa/aliased_ssa_ir.expected | 14 +- .../ir/ssa/aliased_ssa_ir_unsound.expected | 14 +- .../ir/ssa/unaliased_ssa_ir.expected | 14 +- .../ir/ssa/unaliased_ssa_ir_unsound.expected | 14 +- .../virtual_functions/cfg/cfg.expected | 280 +++++++++--------- 7 files changed, 274 insertions(+), 276 deletions(-) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index eef7c2c64cc2..43cc08ccf38e 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -7260,22 +7260,16 @@ ir.cpp: # 850| 0: [VariableDeclarationEntry] definition of b # 850| Type = [Struct] PolymorphicBase # 850| init: [Initializer] initializer for b -#-----| expr: [TemporaryObjectExpr] temporary object -#-----| Type = [Struct] PolymorphicBase -#-----| ValueCategory = prvalue(load) -#-----| expr: [ConstructorCall] call to PolymorphicBase -#-----| Type = [VoidType] void -#-----| ValueCategory = prvalue +# 850| expr: [ConstructorCall] call to PolymorphicBase +# 850| Type = [VoidType] void +# 850| ValueCategory = prvalue # 851| 1: [DeclStmt] declaration # 851| 0: [VariableDeclarationEntry] definition of d # 851| Type = [Struct] PolymorphicDerived # 851| init: [Initializer] initializer for d -#-----| expr: [TemporaryObjectExpr] temporary object -#-----| Type = [Struct] PolymorphicDerived -#-----| ValueCategory = prvalue(load) -#-----| expr: [ConstructorCall] call to PolymorphicDerived -#-----| Type = [VoidType] void -#-----| ValueCategory = prvalue +# 851| expr: [ConstructorCall] call to PolymorphicDerived +# 851| Type = [VoidType] void +# 851| ValueCategory = prvalue # 853| 2: [DeclStmt] declaration # 853| 0: [VariableDeclarationEntry] definition of pb # 853| Type = [PointerType] PolymorphicBase * diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index ba9ddcc7803d..9bdc66b16e6e 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -2325,7 +2325,7 @@ ir.cpp: # 377| r377_3(glval) = VariableAddress[x] : # 377| r377_4(int) = Load[x] : &:r377_3, ~m? # 377| r377_5(glval) = VariableAddress[y] : -# 377| r377_6(int) = Load : &:r377_5, ~m? +# 377| r377_6(int) = Load[y] : &:r377_5, ~m? # 377| r377_7(int) = Call[Add] : func:r377_2, 0:r377_4, 1:r377_6 # 377| mu377_8(unknown) = ^CallSideEffect : ~m? # 377| mu377_9(int) = Store[#return] : &:r377_1, r377_7 @@ -2351,7 +2351,7 @@ ir.cpp: # 381| r381_6(glval) = VariableAddress[x] : # 381| r381_7(int) = Load[x] : &:r381_6, ~m? # 381| r381_8(glval) = VariableAddress[y] : -# 381| r381_9(int) = Load : &:r381_8, ~m? +# 381| r381_9(int) = Load[y] : &:r381_8, ~m? # 381| r381_10(int) = Call[CallAdd] : func:r381_5, 0:r381_7, 1:r381_9 # 381| mu381_11(unknown) = ^CallSideEffect : ~m? # 381| r381_12(int) = CopyValue : r381_10 @@ -3813,7 +3813,7 @@ ir.cpp: # 709| r709_3(glval) = VariableAddress[x] : # 709| r709_4(int) = Load[x] : &:r709_3, ~m? # 709| r709_5(glval) = VariableAddress[y] : -# 709| r709_6(int) = Load : &:r709_5, ~m? +# 709| r709_6(int) = Load[y] : &:r709_5, ~m? # 709| r709_7(int) = Call[min] : func:r709_2, 0:r709_4, 1:r709_6 # 709| mu709_8(unknown) = ^CallSideEffect : ~m? # 709| mu709_9(int) = Store[#return] : &:r709_1, r709_7 @@ -3954,7 +3954,7 @@ ir.cpp: # 736| mu736_2(String) = Uninitialized[#throw736:5] : &:r736_1 # 736| r736_3(glval) = FunctionAddress[String] : # 736| r736_4(glval) = VariableAddress[s] : -# 736| r736_5(char *) = Load : &:r736_4, ~m? +# 736| r736_5(char *) = Load[s] : &:r736_4, ~m? # 736| v736_6(void) = Call[String] : func:r736_3, this:r736_1, 0:r736_5 # 736| mu736_7(unknown) = ^CallSideEffect : ~m? # 736| mu736_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r736_1 @@ -4522,44 +4522,48 @@ ir.cpp: # 808| r808_12(glval) = CopyValue : r808_6 # 809| r809_1(glval) = VariableAddress[b] : # 809| r809_2(glval) = FunctionAddress[operator=] : -# 809| r809_3(glval) = FunctionAddress[Base] : -# 809| r809_4(glval) = VariableAddress[m] : -# 809| r809_5(glval) = ConvertToNonVirtualBase[Middle : Base] : r809_4 -# 809| r809_6(Base &) = CopyValue : r809_5 -# 809| v809_7(void) = Call[Base] : func:r809_3, 0:r809_6 -# 809| mu809_8(unknown) = ^CallSideEffect : ~m? -# 809| mu809_9(Base) = ^IndirectMayWriteSideEffect[-1] : -# 809| v809_10(void) = ^BufferReadSideEffect[0] : &:r809_6, ~m? -# 809| mu809_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r809_6 -# 809| r809_12(glval) = Convert : v809_7 -# 809| r809_13(Base &) = CopyValue : r809_12 -# 809| r809_14(Base &) = Call[operator=] : func:r809_2, this:r809_1, 0:r809_13 -# 809| mu809_15(unknown) = ^CallSideEffect : ~m? -# 809| v809_16(void) = ^BufferReadSideEffect[-1] : &:r809_1, ~m? -# 809| v809_17(void) = ^BufferReadSideEffect[0] : &:r809_13, ~m? -# 809| mu809_18(Base) = ^IndirectMayWriteSideEffect[-1] : &:r809_1 -# 809| mu809_19(unknown) = ^BufferMayWriteSideEffect[0] : &:r809_13 -# 809| r809_20(glval) = CopyValue : r809_14 +# 809| r809_3(glval) = VariableAddress[#temp809:7] : +# 809| mu809_4(Base) = Uninitialized[#temp809:7] : &:r809_3 +# 809| r809_5(glval) = FunctionAddress[Base] : +# 809| r809_6(glval) = VariableAddress[m] : +# 809| r809_7(glval) = ConvertToNonVirtualBase[Middle : Base] : r809_6 +# 809| r809_8(Base &) = CopyValue : r809_7 +# 809| v809_9(void) = Call[Base] : func:r809_5, this:r809_3, 0:r809_8 +# 809| mu809_10(unknown) = ^CallSideEffect : ~m? +# 809| mu809_11(Base) = ^IndirectMayWriteSideEffect[-1] : &:r809_3 +# 809| v809_12(void) = ^BufferReadSideEffect[0] : &:r809_8, ~m? +# 809| mu809_13(unknown) = ^BufferMayWriteSideEffect[0] : &:r809_8 +# 809| r809_14(glval) = Convert : r809_3 +# 809| r809_15(Base &) = CopyValue : r809_14 +# 809| r809_16(Base &) = Call[operator=] : func:r809_2, this:r809_1, 0:r809_15 +# 809| mu809_17(unknown) = ^CallSideEffect : ~m? +# 809| v809_18(void) = ^BufferReadSideEffect[-1] : &:r809_1, ~m? +# 809| v809_19(void) = ^BufferReadSideEffect[0] : &:r809_15, ~m? +# 809| mu809_20(Base) = ^IndirectMayWriteSideEffect[-1] : &:r809_1 +# 809| mu809_21(unknown) = ^BufferMayWriteSideEffect[0] : &:r809_15 +# 809| r809_22(glval) = CopyValue : r809_16 # 810| r810_1(glval) = VariableAddress[b] : # 810| r810_2(glval) = FunctionAddress[operator=] : -# 810| r810_3(glval) = FunctionAddress[Base] : -# 810| r810_4(glval) = VariableAddress[m] : -# 810| r810_5(glval) = ConvertToNonVirtualBase[Middle : Base] : r810_4 -# 810| r810_6(Base &) = CopyValue : r810_5 -# 810| v810_7(void) = Call[Base] : func:r810_3, 0:r810_6 -# 810| mu810_8(unknown) = ^CallSideEffect : ~m? -# 810| mu810_9(Base) = ^IndirectMayWriteSideEffect[-1] : -# 810| v810_10(void) = ^BufferReadSideEffect[0] : &:r810_6, ~m? -# 810| mu810_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r810_6 -# 810| r810_12(glval) = Convert : v810_7 -# 810| r810_13(Base &) = CopyValue : r810_12 -# 810| r810_14(Base &) = Call[operator=] : func:r810_2, this:r810_1, 0:r810_13 -# 810| mu810_15(unknown) = ^CallSideEffect : ~m? -# 810| v810_16(void) = ^BufferReadSideEffect[-1] : &:r810_1, ~m? -# 810| v810_17(void) = ^BufferReadSideEffect[0] : &:r810_13, ~m? -# 810| mu810_18(Base) = ^IndirectMayWriteSideEffect[-1] : &:r810_1 -# 810| mu810_19(unknown) = ^BufferMayWriteSideEffect[0] : &:r810_13 -# 810| r810_20(glval) = CopyValue : r810_14 +# 810| r810_3(glval) = VariableAddress[#temp810:7] : +# 810| mu810_4(Base) = Uninitialized[#temp810:7] : &:r810_3 +# 810| r810_5(glval) = FunctionAddress[Base] : +# 810| r810_6(glval) = VariableAddress[m] : +# 810| r810_7(glval) = ConvertToNonVirtualBase[Middle : Base] : r810_6 +# 810| r810_8(Base &) = CopyValue : r810_7 +# 810| v810_9(void) = Call[Base] : func:r810_5, this:r810_3, 0:r810_8 +# 810| mu810_10(unknown) = ^CallSideEffect : ~m? +# 810| mu810_11(Base) = ^IndirectMayWriteSideEffect[-1] : &:r810_3 +# 810| v810_12(void) = ^BufferReadSideEffect[0] : &:r810_8, ~m? +# 810| mu810_13(unknown) = ^BufferMayWriteSideEffect[0] : &:r810_8 +# 810| r810_14(glval) = Convert : r810_3 +# 810| r810_15(Base &) = CopyValue : r810_14 +# 810| r810_16(Base &) = Call[operator=] : func:r810_2, this:r810_1, 0:r810_15 +# 810| mu810_17(unknown) = ^CallSideEffect : ~m? +# 810| v810_18(void) = ^BufferReadSideEffect[-1] : &:r810_1, ~m? +# 810| v810_19(void) = ^BufferReadSideEffect[0] : &:r810_15, ~m? +# 810| mu810_20(Base) = ^IndirectMayWriteSideEffect[-1] : &:r810_1 +# 810| mu810_21(unknown) = ^BufferMayWriteSideEffect[0] : &:r810_15 +# 810| r810_22(glval) = CopyValue : r810_16 # 811| r811_1(glval) = VariableAddress[pm] : # 811| r811_2(Middle *) = Load[pm] : &:r811_1, ~m? # 811| r811_3(Base *) = ConvertToNonVirtualBase[Middle : Base] : r811_2 @@ -4636,46 +4640,50 @@ ir.cpp: # 822| r822_13(glval) = CopyValue : r822_7 # 823| r823_1(glval) = VariableAddress[b] : # 823| r823_2(glval) = FunctionAddress[operator=] : -# 823| r823_3(glval) = FunctionAddress[Base] : -# 823| r823_4(glval) = VariableAddress[d] : -# 823| r823_5(glval) = ConvertToNonVirtualBase[Derived : Middle] : r823_4 -# 823| r823_6(glval) = ConvertToNonVirtualBase[Middle : Base] : r823_5 -# 823| r823_7(Base &) = CopyValue : r823_6 -# 823| v823_8(void) = Call[Base] : func:r823_3, 0:r823_7 -# 823| mu823_9(unknown) = ^CallSideEffect : ~m? -# 823| mu823_10(Base) = ^IndirectMayWriteSideEffect[-1] : -# 823| v823_11(void) = ^BufferReadSideEffect[0] : &:r823_7, ~m? -# 823| mu823_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r823_7 -# 823| r823_13(glval) = Convert : v823_8 -# 823| r823_14(Base &) = CopyValue : r823_13 -# 823| r823_15(Base &) = Call[operator=] : func:r823_2, this:r823_1, 0:r823_14 -# 823| mu823_16(unknown) = ^CallSideEffect : ~m? -# 823| v823_17(void) = ^BufferReadSideEffect[-1] : &:r823_1, ~m? -# 823| v823_18(void) = ^BufferReadSideEffect[0] : &:r823_14, ~m? -# 823| mu823_19(Base) = ^IndirectMayWriteSideEffect[-1] : &:r823_1 -# 823| mu823_20(unknown) = ^BufferMayWriteSideEffect[0] : &:r823_14 -# 823| r823_21(glval) = CopyValue : r823_15 +# 823| r823_3(glval) = VariableAddress[#temp823:7] : +# 823| mu823_4(Base) = Uninitialized[#temp823:7] : &:r823_3 +# 823| r823_5(glval) = FunctionAddress[Base] : +# 823| r823_6(glval) = VariableAddress[d] : +# 823| r823_7(glval) = ConvertToNonVirtualBase[Derived : Middle] : r823_6 +# 823| r823_8(glval) = ConvertToNonVirtualBase[Middle : Base] : r823_7 +# 823| r823_9(Base &) = CopyValue : r823_8 +# 823| v823_10(void) = Call[Base] : func:r823_5, this:r823_3, 0:r823_9 +# 823| mu823_11(unknown) = ^CallSideEffect : ~m? +# 823| mu823_12(Base) = ^IndirectMayWriteSideEffect[-1] : &:r823_3 +# 823| v823_13(void) = ^BufferReadSideEffect[0] : &:r823_9, ~m? +# 823| mu823_14(unknown) = ^BufferMayWriteSideEffect[0] : &:r823_9 +# 823| r823_15(glval) = Convert : r823_3 +# 823| r823_16(Base &) = CopyValue : r823_15 +# 823| r823_17(Base &) = Call[operator=] : func:r823_2, this:r823_1, 0:r823_16 +# 823| mu823_18(unknown) = ^CallSideEffect : ~m? +# 823| v823_19(void) = ^BufferReadSideEffect[-1] : &:r823_1, ~m? +# 823| v823_20(void) = ^BufferReadSideEffect[0] : &:r823_16, ~m? +# 823| mu823_21(Base) = ^IndirectMayWriteSideEffect[-1] : &:r823_1 +# 823| mu823_22(unknown) = ^BufferMayWriteSideEffect[0] : &:r823_16 +# 823| r823_23(glval) = CopyValue : r823_17 # 824| r824_1(glval) = VariableAddress[b] : # 824| r824_2(glval) = FunctionAddress[operator=] : -# 824| r824_3(glval) = FunctionAddress[Base] : -# 824| r824_4(glval) = VariableAddress[d] : -# 824| r824_5(glval) = ConvertToNonVirtualBase[Derived : Middle] : r824_4 -# 824| r824_6(glval) = ConvertToNonVirtualBase[Middle : Base] : r824_5 -# 824| r824_7(Base &) = CopyValue : r824_6 -# 824| v824_8(void) = Call[Base] : func:r824_3, 0:r824_7 -# 824| mu824_9(unknown) = ^CallSideEffect : ~m? -# 824| mu824_10(Base) = ^IndirectMayWriteSideEffect[-1] : -# 824| v824_11(void) = ^BufferReadSideEffect[0] : &:r824_7, ~m? -# 824| mu824_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r824_7 -# 824| r824_13(glval) = Convert : v824_8 -# 824| r824_14(Base &) = CopyValue : r824_13 -# 824| r824_15(Base &) = Call[operator=] : func:r824_2, this:r824_1, 0:r824_14 -# 824| mu824_16(unknown) = ^CallSideEffect : ~m? -# 824| v824_17(void) = ^BufferReadSideEffect[-1] : &:r824_1, ~m? -# 824| v824_18(void) = ^BufferReadSideEffect[0] : &:r824_14, ~m? -# 824| mu824_19(Base) = ^IndirectMayWriteSideEffect[-1] : &:r824_1 -# 824| mu824_20(unknown) = ^BufferMayWriteSideEffect[0] : &:r824_14 -# 824| r824_21(glval) = CopyValue : r824_15 +# 824| r824_3(glval) = VariableAddress[#temp824:7] : +# 824| mu824_4(Base) = Uninitialized[#temp824:7] : &:r824_3 +# 824| r824_5(glval) = FunctionAddress[Base] : +# 824| r824_6(glval) = VariableAddress[d] : +# 824| r824_7(glval) = ConvertToNonVirtualBase[Derived : Middle] : r824_6 +# 824| r824_8(glval) = ConvertToNonVirtualBase[Middle : Base] : r824_7 +# 824| r824_9(Base &) = CopyValue : r824_8 +# 824| v824_10(void) = Call[Base] : func:r824_5, this:r824_3, 0:r824_9 +# 824| mu824_11(unknown) = ^CallSideEffect : ~m? +# 824| mu824_12(Base) = ^IndirectMayWriteSideEffect[-1] : &:r824_3 +# 824| v824_13(void) = ^BufferReadSideEffect[0] : &:r824_9, ~m? +# 824| mu824_14(unknown) = ^BufferMayWriteSideEffect[0] : &:r824_9 +# 824| r824_15(glval) = Convert : r824_3 +# 824| r824_16(Base &) = CopyValue : r824_15 +# 824| r824_17(Base &) = Call[operator=] : func:r824_2, this:r824_1, 0:r824_16 +# 824| mu824_18(unknown) = ^CallSideEffect : ~m? +# 824| v824_19(void) = ^BufferReadSideEffect[-1] : &:r824_1, ~m? +# 824| v824_20(void) = ^BufferReadSideEffect[0] : &:r824_16, ~m? +# 824| mu824_21(Base) = ^IndirectMayWriteSideEffect[-1] : &:r824_1 +# 824| mu824_22(unknown) = ^BufferMayWriteSideEffect[0] : &:r824_16 +# 824| r824_23(glval) = CopyValue : r824_17 # 825| r825_1(glval) = VariableAddress[pd] : # 825| r825_2(Derived *) = Load[pd] : &:r825_1, ~m? # 825| r825_3(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r825_2 @@ -4826,16 +4834,16 @@ ir.cpp: # 849| mu849_3(unknown) = InitializeNonLocal : # 850| r850_1(glval) = VariableAddress[b] : # 850| mu850_2(PolymorphicBase) = Uninitialized[b] : &:r850_1 -#-----| r0_1(glval) = FunctionAddress[PolymorphicBase] : -#-----| v0_2(void) = Call[PolymorphicBase] : func:r0_1, this:r850_1 -#-----| mu0_3(unknown) = ^CallSideEffect : ~m? -#-----| mu0_4(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r850_1 +# 850| r850_3(glval) = FunctionAddress[PolymorphicBase] : +# 850| v850_4(void) = Call[PolymorphicBase] : func:r850_3, this:r850_1 +# 850| mu850_5(unknown) = ^CallSideEffect : ~m? +# 850| mu850_6(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r850_1 # 851| r851_1(glval) = VariableAddress[d] : # 851| mu851_2(PolymorphicDerived) = Uninitialized[d] : &:r851_1 -#-----| r0_5(glval) = FunctionAddress[PolymorphicDerived] : -#-----| v0_6(void) = Call[PolymorphicDerived] : func:r0_5, this:r851_1 -#-----| mu0_7(unknown) = ^CallSideEffect : ~m? -#-----| mu0_8(PolymorphicDerived) = ^IndirectMayWriteSideEffect[-1] : &:r851_1 +# 851| r851_3(glval) = FunctionAddress[PolymorphicDerived] : +# 851| v851_4(void) = Call[PolymorphicDerived] : func:r851_3, this:r851_1 +# 851| mu851_5(unknown) = ^CallSideEffect : ~m? +# 851| mu851_6(PolymorphicDerived) = ^IndirectMayWriteSideEffect[-1] : &:r851_1 # 853| r853_1(glval) = VariableAddress[pb] : # 853| r853_2(glval) = VariableAddress[b] : # 853| r853_3(PolymorphicBase *) = CopyValue : r853_2 @@ -6165,7 +6173,7 @@ ir.cpp: #-----| r0_7(glval) = Convert : r1084_1 # 1084| r1084_2(glval) = FunctionAddress[operator!=] : # 1084| r1084_3(glval) = VariableAddress[(__end)] : -# 1084| r1084_4(iterator) = Load : &:r1084_3, ~m? +# 1084| r1084_4(iterator) = Load[(__end)] : &:r1084_3, ~m? # 1084| r1084_5(bool) = Call[operator!=] : func:r1084_2, this:r0_7, 0:r1084_4 # 1084| mu1084_6(unknown) = ^CallSideEffect : ~m? #-----| v0_8(void) = ^BufferReadSideEffect[-1] : &:r0_7, ~m? @@ -6223,7 +6231,7 @@ ir.cpp: #-----| r0_13(glval) = Convert : r1078_21 # 1078| r1078_22(glval) = FunctionAddress[operator!=] : # 1078| r1078_23(glval) = VariableAddress[(__end)] : -# 1078| r1078_24(iterator) = Load : &:r1078_23, ~m? +# 1078| r1078_24(iterator) = Load[(__end)] : &:r1078_23, ~m? # 1078| r1078_25(bool) = Call[operator!=] : func:r1078_22, this:r0_13, 0:r1078_24 # 1078| mu1078_26(unknown) = ^CallSideEffect : ~m? #-----| v0_14(void) = ^BufferReadSideEffect[-1] : &:r0_13, ~m? @@ -6488,7 +6496,7 @@ ir.cpp: # 1154| mu1154_2(String) = Uninitialized[#throw1154:5] : &:r1154_1 # 1154| r1154_3(glval) = FunctionAddress[String] : # 1154| r1154_4(glval) = VariableAddress[s] : -# 1154| r1154_5(char *) = Load : &:r1154_4, ~m? +# 1154| r1154_5(char *) = Load[s] : &:r1154_4, ~m? # 1154| v1154_6(void) = Call[String] : func:r1154_3, this:r1154_1, 0:r1154_5 # 1154| mu1154_7(unknown) = ^CallSideEffect : ~m? # 1154| mu1154_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r1154_1 @@ -6616,7 +6624,7 @@ ir.cpp: # 1179| r1179_3(glval) = FunctionAddress[String] : # 1179| r1179_4(glval) = StringConstant["foo"] : # 1179| r1179_5(char *) = Convert : r1179_4 -# 1179| r1179_6(String) = Call[String] : func:r1179_3, this:r1179_1, 0:r1179_5 +# 1179| v1179_6(void) = Call[String] : func:r1179_3, this:r1179_1, 0:r1179_5 # 1179| mu1179_7(unknown) = ^CallSideEffect : ~m? # 1179| mu1179_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r1179_1 # 1179| v1179_9(void) = ^BufferReadSideEffect[0] : &:r1179_5, ~m? @@ -6882,7 +6890,7 @@ ir.cpp: # 1243| r1243_4(glval) = VariableAddress[c] : # 1243| r1243_5(glval) = FunctionAddress[String] : # 1243| r1243_6(glval) = VariableAddress[dynamic] : -# 1243| r1243_7(char *) = Load : &:r1243_6, ~m? +# 1243| r1243_7(char *) = Load[dynamic] : &:r1243_6, ~m? # 1243| v1243_8(void) = Call[String] : func:r1243_5, this:r1243_4, 0:r1243_7 # 1243| mu1243_9(unknown) = ^CallSideEffect : ~m? # 1243| mu1243_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r1243_4 @@ -7014,7 +7022,7 @@ ir.cpp: # 1276| r1276_3(glval) = VariableAddress[a] : # 1276| r1276_4(A *) = CopyValue : r1276_3 # 1276| r1276_5(glval) = VariableAddress[int_arg] : -# 1276| r1276_6(int) = Load : &:r1276_5, ~m? +# 1276| r1276_6(int) = Load[int_arg] : &:r1276_5, ~m? # 1276| v1276_7(void) = Call[static_member] : func:r1276_2, 0:r1276_4, 1:r1276_6 # 1276| mu1276_8(unknown) = ^CallSideEffect : ~m? # 1276| v1276_9(void) = ^BufferReadSideEffect[0] : &:r1276_4, ~m? @@ -7023,7 +7031,7 @@ ir.cpp: # 1277| r1277_2(glval) = VariableAddress[a] : # 1277| r1277_3(A *) = CopyValue : r1277_2 # 1277| r1277_4(glval) = VariableAddress[int_arg] : -# 1277| r1277_5(int) = Load : &:r1277_4, ~m? +# 1277| r1277_5(int) = Load[int_arg] : &:r1277_4, ~m? # 1277| v1277_6(void) = Call[static_member] : func:r1277_1, 0:r1277_3, 1:r1277_5 # 1277| mu1277_7(unknown) = ^CallSideEffect : ~m? # 1277| v1277_8(void) = ^BufferReadSideEffect[0] : &:r1277_3, ~m? @@ -7122,7 +7130,7 @@ ir.cpp: # 1296| r1296_2(glval) = VariableAddress[x] : # 1296| r1296_3(int) = Load[x] : &:r1296_2, ~m? # 1296| r1296_4(glval) = VariableAddress[y] : -# 1296| r1296_5(int) = Load : &:r1296_4, ~m? +# 1296| r1296_5(int) = Load[y] : &:r1296_4, ~m? # 1296| v1296_6(void) = Call[IntegerOps] : func:r1296_1, 0:r1296_3, 1:r1296_5 # 1296| mu1296_7(unknown) = ^CallSideEffect : ~m? # 1296| v1296_8(void) = NoOp : diff --git a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected index 1a99080f70dd..874e39cec21d 100644 --- a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected +++ b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected @@ -864,7 +864,7 @@ ssa.cpp: # 200| m200_10(int) = Store[ret] : &:r200_7, r200_9 # 201| r201_1(glval) = FunctionAddress[abs] : # 201| r201_2(glval) = VariableAddress[x] : -# 201| r201_3(int) = Load : &:r201_2, m198_14 +# 201| r201_3(int) = Load[x] : &:r201_2, m198_14 # 201| r201_4(int) = Call[abs] : func:r201_1, 0:r201_3 # 201| r201_5(glval) = VariableAddress[ret] : # 201| r201_6(int) = Load[ret] : &:r201_5, m200_10 @@ -1135,7 +1135,7 @@ ssa.cpp: # 250| r250_6(char *) = Load[src] : &:r250_5, m247_6 # 250| r250_7(void *) = Convert : r250_6 # 250| r250_8(glval) = VariableAddress[size] : -# 250| r250_9(int) = Load : &:r250_8, m247_11 +# 250| r250_9(int) = Load[size] : &:r250_8, m247_11 # 250| r250_10(void *) = Call[memcpy] : func:r250_1, 0:r250_4, 1:r250_7, 2:r250_9 # 250| v250_11(void) = ^SizedBufferReadSideEffect[1] : &:r250_7, r250_9, ~m249_6 # 250| m250_12(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r250_4, r250_9 @@ -1212,7 +1212,7 @@ ssa.cpp: # 269| r269_1(glval) = VariableAddress[buf] : # 269| r269_2(glval) = FunctionAddress[malloc] : # 269| r269_3(glval) = VariableAddress[size] : -# 269| r269_4(int) = Load : &:r269_3, m268_11 +# 269| r269_4(int) = Load[size] : &:r269_3, m268_11 # 269| r269_5(void *) = Call[malloc] : func:r269_2, 0:r269_4 # 269| m269_6(unknown) = ^CallSideEffect : ~m268_9 # 269| m269_7(unknown) = Chi : total:m268_9, partial:m269_6 @@ -1225,7 +1225,7 @@ ssa.cpp: # 270| r270_4(glval) = VariableAddress[s] : # 270| r270_5(void *) = Load[s] : &:r270_4, m268_6 # 270| r270_6(glval) = VariableAddress[size] : -# 270| r270_7(int) = Load : &:r270_6, m268_11 +# 270| r270_7(int) = Load[size] : &:r270_6, m268_11 # 270| r270_8(void *) = Call[memcpy] : func:r270_1, 0:r270_3, 1:r270_5, 2:r270_7 # 270| v270_9(void) = ^SizedBufferReadSideEffect[1] : &:r270_5, r270_7, ~m269_7 # 270| m270_10(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r270_3, r270_7 @@ -1395,7 +1395,7 @@ ssa.cpp: # 294| r294_16(A *) = Convert : r294_12 # 294| r294_17(glval) = FunctionAddress[A] : # 294| r294_18(glval) = VariableAddress[x] : -# 294| r294_19(int) = Load : &:r294_18, m291_6 +# 294| r294_19(int) = Load[x] : &:r294_18, m291_6 # 294| v294_20(void) = Call[A] : func:r294_17, this:r294_16, 0:r294_19 # 294| m294_21(unknown) = ^CallSideEffect : ~m294_14 # 294| m294_22(unknown) = Chi : total:m294_14, partial:m294_21 @@ -1453,7 +1453,7 @@ ssa.cpp: # 302| r302_2(glval) = VariableAddress[argc] : # 302| r302_3(int) = Load[argc] : &:r302_2, m301_6 # 302| r302_4(glval) = VariableAddress[argv] : -# 302| r302_5(char **) = Load : &:r302_4, m301_8 +# 302| r302_5(char **) = Load[argv] : &:r302_4, m301_8 # 302| v302_6(void) = Call[unknownFunction] : func:r302_1, 0:r302_3, 1:r302_5 # 302| m302_7(unknown) = ^CallSideEffect : ~m301_11 # 302| m302_8(unknown) = Chi : total:m301_11, partial:m302_7 @@ -1464,7 +1464,7 @@ ssa.cpp: # 303| r303_2(glval) = VariableAddress[argc] : # 303| r303_3(int) = Load[argc] : &:r303_2, m301_6 # 303| r303_4(glval) = VariableAddress[argv] : -# 303| r303_5(char **) = Load : &:r303_4, m301_8 +# 303| r303_5(char **) = Load[argv] : &:r303_4, m301_8 # 303| v303_6(void) = Call[unknownFunction] : func:r303_1, 0:r303_3, 1:r303_5 # 303| m303_7(unknown) = ^CallSideEffect : ~m302_11 # 303| m303_8(unknown) = Chi : total:m302_11, partial:m303_7 diff --git a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir_unsound.expected b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir_unsound.expected index 0ac30fc93aeb..91b9d3b12235 100644 --- a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir_unsound.expected @@ -859,7 +859,7 @@ ssa.cpp: # 200| m200_10(int) = Store[ret] : &:r200_7, r200_9 # 201| r201_1(glval) = FunctionAddress[abs] : # 201| r201_2(glval) = VariableAddress[x] : -# 201| r201_3(int) = Load : &:r201_2, m198_14 +# 201| r201_3(int) = Load[x] : &:r201_2, m198_14 # 201| r201_4(int) = Call[abs] : func:r201_1, 0:r201_3 # 201| r201_5(glval) = VariableAddress[ret] : # 201| r201_6(int) = Load[ret] : &:r201_5, m200_10 @@ -1126,7 +1126,7 @@ ssa.cpp: # 250| r250_6(char *) = Load[src] : &:r250_5, m247_6 # 250| r250_7(void *) = Convert : r250_6 # 250| r250_8(glval) = VariableAddress[size] : -# 250| r250_9(int) = Load : &:r250_8, m247_10 +# 250| r250_9(int) = Load[size] : &:r250_8, m247_10 # 250| r250_10(void *) = Call[memcpy] : func:r250_1, 0:r250_4, 1:r250_7, 2:r250_9 # 250| v250_11(void) = ^SizedBufferReadSideEffect[1] : &:r250_7, r250_9, ~m249_6 # 250| m250_12(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r250_4, r250_9 @@ -1202,7 +1202,7 @@ ssa.cpp: # 269| r269_1(glval) = VariableAddress[buf] : # 269| r269_2(glval) = FunctionAddress[malloc] : # 269| r269_3(glval) = VariableAddress[size] : -# 269| r269_4(int) = Load : &:r269_3, m268_10 +# 269| r269_4(int) = Load[size] : &:r269_3, m268_10 # 269| r269_5(void *) = Call[malloc] : func:r269_2, 0:r269_4 # 269| m269_6(unknown) = ^CallSideEffect : ~m268_4 # 269| m269_7(unknown) = Chi : total:m268_4, partial:m269_6 @@ -1214,7 +1214,7 @@ ssa.cpp: # 270| r270_4(glval) = VariableAddress[s] : # 270| r270_5(void *) = Load[s] : &:r270_4, m268_6 # 270| r270_6(glval) = VariableAddress[size] : -# 270| r270_7(int) = Load : &:r270_6, m268_10 +# 270| r270_7(int) = Load[size] : &:r270_6, m268_10 # 270| r270_8(void *) = Call[memcpy] : func:r270_1, 0:r270_3, 1:r270_5, 2:r270_7 # 270| v270_9(void) = ^SizedBufferReadSideEffect[1] : &:r270_5, r270_7, ~m268_8 # 270| m270_10(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r270_3, r270_7 @@ -1383,7 +1383,7 @@ ssa.cpp: # 294| r294_16(A *) = Convert : r294_12 # 294| r294_17(glval) = FunctionAddress[A] : # 294| r294_18(glval) = VariableAddress[x] : -# 294| r294_19(int) = Load : &:r294_18, m291_6 +# 294| r294_19(int) = Load[x] : &:r294_18, m291_6 # 294| v294_20(void) = Call[A] : func:r294_17, this:r294_16, 0:r294_19 # 294| m294_21(unknown) = ^CallSideEffect : ~m294_14 # 294| m294_22(unknown) = Chi : total:m294_14, partial:m294_21 @@ -1440,7 +1440,7 @@ ssa.cpp: # 302| r302_2(glval) = VariableAddress[argc] : # 302| r302_3(int) = Load[argc] : &:r302_2, m301_6 # 302| r302_4(glval) = VariableAddress[argv] : -# 302| r302_5(char **) = Load : &:r302_4, m301_8 +# 302| r302_5(char **) = Load[argv] : &:r302_4, m301_8 # 302| v302_6(void) = Call[unknownFunction] : func:r302_1, 0:r302_3, 1:r302_5 # 302| m302_7(unknown) = ^CallSideEffect : ~m301_4 # 302| m302_8(unknown) = Chi : total:m301_4, partial:m302_7 @@ -1451,7 +1451,7 @@ ssa.cpp: # 303| r303_2(glval) = VariableAddress[argc] : # 303| r303_3(int) = Load[argc] : &:r303_2, m301_6 # 303| r303_4(glval) = VariableAddress[argv] : -# 303| r303_5(char **) = Load : &:r303_4, m301_8 +# 303| r303_5(char **) = Load[argv] : &:r303_4, m301_8 # 303| v303_6(void) = Call[unknownFunction] : func:r303_1, 0:r303_3, 1:r303_5 # 303| m303_7(unknown) = ^CallSideEffect : ~m302_8 # 303| m303_8(unknown) = Chi : total:m302_8, partial:m303_7 diff --git a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected index e80f89877b8d..a1f345878c80 100644 --- a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected +++ b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected @@ -805,7 +805,7 @@ ssa.cpp: # 200| m200_10(int) = Store[ret] : &:r200_7, r200_9 # 201| r201_1(glval) = FunctionAddress[abs] : # 201| r201_2(glval) = VariableAddress[x] : -# 201| r201_3(int) = Load : &:r201_2, m198_13 +# 201| r201_3(int) = Load[x] : &:r201_2, m198_13 # 201| r201_4(int) = Call[abs] : func:r201_1, 0:r201_3 # 201| r201_5(glval) = VariableAddress[ret] : # 201| r201_6(int) = Load[ret] : &:r201_5, m200_10 @@ -1045,7 +1045,7 @@ ssa.cpp: # 250| r250_6(char *) = Load[src] : &:r250_5, m247_5 # 250| r250_7(void *) = Convert : r250_6 # 250| r250_8(glval) = VariableAddress[size] : -# 250| r250_9(int) = Load : &:r250_8, m247_9 +# 250| r250_9(int) = Load[size] : &:r250_8, m247_9 # 250| r250_10(void *) = Call[memcpy] : func:r250_1, 0:r250_4, 1:r250_7, 2:r250_9 # 250| v250_11(void) = ^SizedBufferReadSideEffect[1] : &:r250_7, r250_9, ~m? # 250| mu250_12(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r250_4, r250_9 @@ -1115,7 +1115,7 @@ ssa.cpp: # 269| r269_1(glval) = VariableAddress[buf] : # 269| r269_2(glval) = FunctionAddress[malloc] : # 269| r269_3(glval) = VariableAddress[size] : -# 269| r269_4(int) = Load : &:r269_3, m268_9 +# 269| r269_4(int) = Load[size] : &:r269_3, m268_9 # 269| r269_5(void *) = Call[malloc] : func:r269_2, 0:r269_4 # 269| mu269_6(unknown) = ^CallSideEffect : ~m? # 269| mu269_7(unknown) = ^InitializeDynamicAllocation : &:r269_5 @@ -1126,7 +1126,7 @@ ssa.cpp: # 270| r270_4(glval) = VariableAddress[s] : # 270| r270_5(void *) = Load[s] : &:r270_4, m268_5 # 270| r270_6(glval) = VariableAddress[size] : -# 270| r270_7(int) = Load : &:r270_6, m268_9 +# 270| r270_7(int) = Load[size] : &:r270_6, m268_9 # 270| r270_8(void *) = Call[memcpy] : func:r270_1, 0:r270_3, 1:r270_5, 2:r270_7 # 270| v270_9(void) = ^SizedBufferReadSideEffect[1] : &:r270_5, r270_7, ~m? # 270| mu270_10(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r270_3, r270_7 @@ -1279,7 +1279,7 @@ ssa.cpp: # 294| r294_14(A *) = Convert : r294_11 # 294| r294_15(glval) = FunctionAddress[A] : # 294| r294_16(glval) = VariableAddress[x] : -# 294| r294_17(int) = Load : &:r294_16, m291_5 +# 294| r294_17(int) = Load[x] : &:r294_16, m291_5 # 294| v294_18(void) = Call[A] : func:r294_15, this:r294_14, 0:r294_17 # 294| mu294_19(unknown) = ^CallSideEffect : ~m? # 294| mu294_20(A) = ^IndirectMayWriteSideEffect[-1] : &:r294_14 @@ -1327,7 +1327,7 @@ ssa.cpp: # 302| r302_2(glval) = VariableAddress[argc] : # 302| r302_3(int) = Load[argc] : &:r302_2, m301_5 # 302| r302_4(glval) = VariableAddress[argv] : -# 302| r302_5(char **) = Load : &:r302_4, m301_7 +# 302| r302_5(char **) = Load[argv] : &:r302_4, m301_7 # 302| v302_6(void) = Call[unknownFunction] : func:r302_1, 0:r302_3, 1:r302_5 # 302| mu302_7(unknown) = ^CallSideEffect : ~m? # 302| v302_8(void) = ^BufferReadSideEffect[1] : &:r302_5, ~m? @@ -1336,7 +1336,7 @@ ssa.cpp: # 303| r303_2(glval) = VariableAddress[argc] : # 303| r303_3(int) = Load[argc] : &:r303_2, m301_5 # 303| r303_4(glval) = VariableAddress[argv] : -# 303| r303_5(char **) = Load : &:r303_4, m301_7 +# 303| r303_5(char **) = Load[argv] : &:r303_4, m301_7 # 303| v303_6(void) = Call[unknownFunction] : func:r303_1, 0:r303_3, 1:r303_5 # 303| mu303_7(unknown) = ^CallSideEffect : ~m? # 303| v303_8(void) = ^BufferReadSideEffect[1] : &:r303_5, ~m? diff --git a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir_unsound.expected b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir_unsound.expected index e80f89877b8d..a1f345878c80 100644 --- a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir_unsound.expected @@ -805,7 +805,7 @@ ssa.cpp: # 200| m200_10(int) = Store[ret] : &:r200_7, r200_9 # 201| r201_1(glval) = FunctionAddress[abs] : # 201| r201_2(glval) = VariableAddress[x] : -# 201| r201_3(int) = Load : &:r201_2, m198_13 +# 201| r201_3(int) = Load[x] : &:r201_2, m198_13 # 201| r201_4(int) = Call[abs] : func:r201_1, 0:r201_3 # 201| r201_5(glval) = VariableAddress[ret] : # 201| r201_6(int) = Load[ret] : &:r201_5, m200_10 @@ -1045,7 +1045,7 @@ ssa.cpp: # 250| r250_6(char *) = Load[src] : &:r250_5, m247_5 # 250| r250_7(void *) = Convert : r250_6 # 250| r250_8(glval) = VariableAddress[size] : -# 250| r250_9(int) = Load : &:r250_8, m247_9 +# 250| r250_9(int) = Load[size] : &:r250_8, m247_9 # 250| r250_10(void *) = Call[memcpy] : func:r250_1, 0:r250_4, 1:r250_7, 2:r250_9 # 250| v250_11(void) = ^SizedBufferReadSideEffect[1] : &:r250_7, r250_9, ~m? # 250| mu250_12(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r250_4, r250_9 @@ -1115,7 +1115,7 @@ ssa.cpp: # 269| r269_1(glval) = VariableAddress[buf] : # 269| r269_2(glval) = FunctionAddress[malloc] : # 269| r269_3(glval) = VariableAddress[size] : -# 269| r269_4(int) = Load : &:r269_3, m268_9 +# 269| r269_4(int) = Load[size] : &:r269_3, m268_9 # 269| r269_5(void *) = Call[malloc] : func:r269_2, 0:r269_4 # 269| mu269_6(unknown) = ^CallSideEffect : ~m? # 269| mu269_7(unknown) = ^InitializeDynamicAllocation : &:r269_5 @@ -1126,7 +1126,7 @@ ssa.cpp: # 270| r270_4(glval) = VariableAddress[s] : # 270| r270_5(void *) = Load[s] : &:r270_4, m268_5 # 270| r270_6(glval) = VariableAddress[size] : -# 270| r270_7(int) = Load : &:r270_6, m268_9 +# 270| r270_7(int) = Load[size] : &:r270_6, m268_9 # 270| r270_8(void *) = Call[memcpy] : func:r270_1, 0:r270_3, 1:r270_5, 2:r270_7 # 270| v270_9(void) = ^SizedBufferReadSideEffect[1] : &:r270_5, r270_7, ~m? # 270| mu270_10(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r270_3, r270_7 @@ -1279,7 +1279,7 @@ ssa.cpp: # 294| r294_14(A *) = Convert : r294_11 # 294| r294_15(glval) = FunctionAddress[A] : # 294| r294_16(glval) = VariableAddress[x] : -# 294| r294_17(int) = Load : &:r294_16, m291_5 +# 294| r294_17(int) = Load[x] : &:r294_16, m291_5 # 294| v294_18(void) = Call[A] : func:r294_15, this:r294_14, 0:r294_17 # 294| mu294_19(unknown) = ^CallSideEffect : ~m? # 294| mu294_20(A) = ^IndirectMayWriteSideEffect[-1] : &:r294_14 @@ -1327,7 +1327,7 @@ ssa.cpp: # 302| r302_2(glval) = VariableAddress[argc] : # 302| r302_3(int) = Load[argc] : &:r302_2, m301_5 # 302| r302_4(glval) = VariableAddress[argv] : -# 302| r302_5(char **) = Load : &:r302_4, m301_7 +# 302| r302_5(char **) = Load[argv] : &:r302_4, m301_7 # 302| v302_6(void) = Call[unknownFunction] : func:r302_1, 0:r302_3, 1:r302_5 # 302| mu302_7(unknown) = ^CallSideEffect : ~m? # 302| v302_8(void) = ^BufferReadSideEffect[1] : &:r302_5, ~m? @@ -1336,7 +1336,7 @@ ssa.cpp: # 303| r303_2(glval) = VariableAddress[argc] : # 303| r303_3(int) = Load[argc] : &:r303_2, m301_5 # 303| r303_4(glval) = VariableAddress[argv] : -# 303| r303_5(char **) = Load : &:r303_4, m301_7 +# 303| r303_5(char **) = Load[argv] : &:r303_4, m301_7 # 303| v303_6(void) = Call[unknownFunction] : func:r303_1, 0:r303_3, 1:r303_5 # 303| mu303_7(unknown) = ^CallSideEffect : ~m? # 303| v303_8(void) = ^BufferReadSideEffect[1] : &:r303_5, ~m? diff --git a/cpp/ql/test/library-tests/virtual_functions/cfg/cfg.expected b/cpp/ql/test/library-tests/virtual_functions/cfg/cfg.expected index 70f37a3c5795..a8b58e652589 100644 --- a/cpp/ql/test/library-tests/virtual_functions/cfg/cfg.expected +++ b/cpp/ql/test/library-tests/virtual_functions/cfg/cfg.expected @@ -1,153 +1,149 @@ -| Base::Base | false | 165 | 165 | Base | -| Base::Base | false | 170 | 170 | return ... | -| Base::Base | false | 172 | 172 | { ... } | +| Base::Base | false | 166 | 166 | Base | +| Base::Base | false | 171 | 171 | return ... | +| Base::Base | false | 173 | 173 | { ... } | +| Base::Base | false | 322 | 322 | Base | | Base::Base | false | 326 | 326 | Base | -| Base::Base | false | 330 | 330 | Base | -| Base::Base | true | 170 | 165 | | -| Base::Base | true | 172 | 170 | | -| Base::Base_f | false | 369 | 369 | Base_f | -| Base::Base_f | false | 374 | 374 | declaration | -| Base::Base_f | false | 379 | 379 | call to f | -| Base::Base_f | false | 381 | 381 | this | -| Base::Base_f | false | 382 | 382 | initializer for i | -| Base::Base_f | false | 386 | 386 | return ... | -| Base::Base_f | false | 390 | 390 | 1 | -| Base::Base_f | false | 391 | 391 | { ... } | -| Base::Base_f | true | 374 | 382 | | -| Base::Base_f | true | 381 | 379 | | -| Base::Base_f | true | 382 | 381 | | -| Base::Base_f | true | 386 | 390 | | -| Base::Base_f | true | 390 | 369 | | -| Base::Base_f | true | 391 | 374 | | -| Base::Base_g | false | 334 | 334 | Base_g | -| Base::Base_g | false | 339 | 339 | declaration | -| Base::Base_g | false | 344 | 344 | call to g | -| Base::Base_g | false | 346 | 346 | this | -| Base::Base_g | false | 347 | 347 | initializer for i | -| Base::Base_g | false | 351 | 351 | return ... | -| Base::Base_g | false | 355 | 355 | 4 | -| Base::Base_g | false | 356 | 356 | { ... } | -| Base::Base_g | true | 339 | 347 | | -| Base::Base_g | true | 344 | 351 | | -| Base::Base_g | true | 346 | 344 | | -| Base::Base_g | true | 347 | 346 | | -| Base::Base_g | true | 351 | 355 | | -| Base::Base_g | true | 355 | 334 | | -| Base::Base_g | true | 356 | 339 | | -| Base::f | false | 256 | 256 | f | -| Base::f | false | 397 | 397 | ExprStmt | -| Base::f | false | 401 | 401 | call to abort | -| Base::f | false | 403 | 403 | return ... | -| Base::f | false | 405 | 405 | { ... } | -| Base::f | true | 397 | 401 | | -| Base::f | true | 403 | 256 | | -| Base::f | true | 405 | 397 | | -| Base::g | false | 183 | 183 | g | -| Base::g | false | 362 | 362 | return ... | -| Base::g | false | 366 | 366 | 3 | -| Base::g | false | 367 | 367 | { ... } | -| Base::g | true | 362 | 366 | | -| Base::g | true | 366 | 183 | | -| Base::g | true | 367 | 362 | | -| Base::operator= | false | 311 | 311 | operator= | -| Base::operator= | false | 320 | 320 | operator= | +| Base::Base | true | 171 | 166 | | +| Base::Base | true | 173 | 171 | | +| Base::Base_f | false | 365 | 365 | Base_f | +| Base::Base_f | false | 370 | 370 | declaration | +| Base::Base_f | false | 375 | 375 | call to f | +| Base::Base_f | false | 377 | 377 | this | +| Base::Base_f | false | 378 | 378 | initializer for i | +| Base::Base_f | false | 382 | 382 | return ... | +| Base::Base_f | false | 386 | 386 | 1 | +| Base::Base_f | false | 387 | 387 | { ... } | +| Base::Base_f | true | 370 | 378 | | +| Base::Base_f | true | 377 | 375 | | +| Base::Base_f | true | 378 | 377 | | +| Base::Base_f | true | 382 | 386 | | +| Base::Base_f | true | 386 | 365 | | +| Base::Base_f | true | 387 | 370 | | +| Base::Base_g | false | 330 | 330 | Base_g | +| Base::Base_g | false | 335 | 335 | declaration | +| Base::Base_g | false | 340 | 340 | call to g | +| Base::Base_g | false | 342 | 342 | this | +| Base::Base_g | false | 343 | 343 | initializer for i | +| Base::Base_g | false | 347 | 347 | return ... | +| Base::Base_g | false | 351 | 351 | 4 | +| Base::Base_g | false | 352 | 352 | { ... } | +| Base::Base_g | true | 335 | 343 | | +| Base::Base_g | true | 340 | 347 | | +| Base::Base_g | true | 342 | 340 | | +| Base::Base_g | true | 343 | 342 | | +| Base::Base_g | true | 347 | 351 | | +| Base::Base_g | true | 351 | 330 | | +| Base::Base_g | true | 352 | 335 | | +| Base::f | false | 253 | 253 | f | +| Base::f | false | 393 | 393 | ExprStmt | +| Base::f | false | 397 | 397 | call to abort | +| Base::f | false | 399 | 399 | return ... | +| Base::f | false | 401 | 401 | { ... } | +| Base::f | true | 393 | 397 | | +| Base::f | true | 399 | 253 | | +| Base::f | true | 401 | 393 | | +| Base::g | false | 182 | 182 | g | +| Base::g | false | 358 | 358 | return ... | +| Base::g | false | 362 | 362 | 3 | +| Base::g | false | 363 | 363 | { ... } | +| Base::g | true | 358 | 362 | | +| Base::g | true | 362 | 182 | | +| Base::g | true | 363 | 358 | | +| Base::operator= | false | 307 | 307 | operator= | +| Base::operator= | false | 316 | 316 | operator= | | __va_list_tag::operator= | false | 57 | 57 | operator= | | __va_list_tag::operator= | false | 63 | 63 | operator= | -| abort | false | 308 | 308 | abort | -| fun_f1 | false | 274 | 274 | fun_f1 | -| fun_f1 | false | 279 | 279 | declaration | -| fun_f1 | false | 282 | 282 | call to Base | -| fun_f1 | false | 283 | 283 | temporary object | -| fun_f1 | false | 284 | 284 | new | -| fun_f1 | false | 286 | 286 | initializer for p1 | -| fun_f1 | false | 290 | 290 | declaration | -| fun_f1 | false | 293 | 293 | call to f | -| fun_f1 | false | 295 | 295 | p1 | -| fun_f1 | false | 297 | 297 | initializer for i | -| fun_f1 | false | 301 | 301 | return ... | -| fun_f1 | false | 305 | 305 | 2 | -| fun_f1 | false | 306 | 306 | { ... } | -| fun_f1 | true | 279 | 286 | | -| fun_f1 | true | 282 | 284 | | -| fun_f1 | true | 284 | 290 | | -| fun_f1 | true | 286 | 282 | | -| fun_f1 | true | 290 | 297 | | -| fun_f1 | true | 293 | 301 | | -| fun_f1 | true | 295 | 293 | | -| fun_f1 | true | 297 | 295 | | -| fun_f1 | true | 301 | 305 | | -| fun_f1 | true | 305 | 274 | | -| fun_f1 | true | 306 | 279 | | -| fun_f2 | false | 237 | 237 | fun_f2 | -| fun_f2 | false | 242 | 242 | declaration | -| fun_f2 | false | 245 | 245 | call to Base | -| fun_f2 | false | 246 | 246 | temporary object | -| fun_f2 | false | 247 | 247 | new | -| fun_f2 | false | 249 | 249 | initializer for p1 | -| fun_f2 | false | 253 | 253 | declaration | -| fun_f2 | false | 259 | 259 | call to f | -| fun_f2 | false | 261 | 261 | p1 | -| fun_f2 | false | 263 | 263 | initializer for i | -| fun_f2 | false | 267 | 267 | return ... | -| fun_f2 | false | 271 | 271 | 2 | -| fun_f2 | false | 272 | 272 | { ... } | -| fun_f2 | true | 242 | 249 | | -| fun_f2 | true | 245 | 247 | | -| fun_f2 | true | 247 | 253 | | -| fun_f2 | true | 249 | 245 | | -| fun_f2 | true | 253 | 263 | | -| fun_f2 | true | 261 | 259 | | -| fun_f2 | true | 263 | 261 | | -| fun_f2 | true | 267 | 271 | | -| fun_f2 | true | 271 | 237 | | -| fun_f2 | true | 272 | 242 | | -| fun_g1 | false | 203 | 203 | fun_g1 | -| fun_g1 | false | 208 | 208 | declaration | -| fun_g1 | false | 211 | 211 | call to Base | -| fun_g1 | false | 212 | 212 | temporary object | -| fun_g1 | false | 213 | 213 | new | -| fun_g1 | false | 215 | 215 | initializer for p1 | -| fun_g1 | false | 219 | 219 | declaration | -| fun_g1 | false | 222 | 222 | call to g | -| fun_g1 | false | 224 | 224 | p1 | -| fun_g1 | false | 226 | 226 | initializer for i | -| fun_g1 | false | 230 | 230 | return ... | -| fun_g1 | false | 234 | 234 | 2 | -| fun_g1 | false | 235 | 235 | { ... } | -| fun_g1 | true | 208 | 215 | | -| fun_g1 | true | 211 | 213 | | -| fun_g1 | true | 213 | 219 | | -| fun_g1 | true | 215 | 211 | | -| fun_g1 | true | 219 | 226 | | -| fun_g1 | true | 222 | 230 | | +| abort | false | 304 | 304 | abort | +| fun_f1 | false | 271 | 271 | fun_f1 | +| fun_f1 | false | 276 | 276 | declaration | +| fun_f1 | false | 279 | 279 | call to Base | +| fun_f1 | false | 281 | 281 | new | +| fun_f1 | false | 282 | 282 | initializer for p1 | +| fun_f1 | false | 286 | 286 | declaration | +| fun_f1 | false | 289 | 289 | call to f | +| fun_f1 | false | 291 | 291 | p1 | +| fun_f1 | false | 293 | 293 | initializer for i | +| fun_f1 | false | 297 | 297 | return ... | +| fun_f1 | false | 301 | 301 | 2 | +| fun_f1 | false | 302 | 302 | { ... } | +| fun_f1 | true | 276 | 282 | | +| fun_f1 | true | 279 | 281 | | +| fun_f1 | true | 281 | 286 | | +| fun_f1 | true | 282 | 279 | | +| fun_f1 | true | 286 | 293 | | +| fun_f1 | true | 289 | 297 | | +| fun_f1 | true | 291 | 289 | | +| fun_f1 | true | 293 | 291 | | +| fun_f1 | true | 297 | 301 | | +| fun_f1 | true | 301 | 271 | | +| fun_f1 | true | 302 | 276 | | +| fun_f2 | false | 235 | 235 | fun_f2 | +| fun_f2 | false | 240 | 240 | declaration | +| fun_f2 | false | 243 | 243 | call to Base | +| fun_f2 | false | 245 | 245 | new | +| fun_f2 | false | 246 | 246 | initializer for p1 | +| fun_f2 | false | 250 | 250 | declaration | +| fun_f2 | false | 256 | 256 | call to f | +| fun_f2 | false | 258 | 258 | p1 | +| fun_f2 | false | 260 | 260 | initializer for i | +| fun_f2 | false | 264 | 264 | return ... | +| fun_f2 | false | 268 | 268 | 2 | +| fun_f2 | false | 269 | 269 | { ... } | +| fun_f2 | true | 240 | 246 | | +| fun_f2 | true | 243 | 245 | | +| fun_f2 | true | 245 | 250 | | +| fun_f2 | true | 246 | 243 | | +| fun_f2 | true | 250 | 260 | | +| fun_f2 | true | 258 | 256 | | +| fun_f2 | true | 260 | 258 | | +| fun_f2 | true | 264 | 268 | | +| fun_f2 | true | 268 | 235 | | +| fun_f2 | true | 269 | 240 | | +| fun_g1 | false | 202 | 202 | fun_g1 | +| fun_g1 | false | 207 | 207 | declaration | +| fun_g1 | false | 210 | 210 | call to Base | +| fun_g1 | false | 212 | 212 | new | +| fun_g1 | false | 213 | 213 | initializer for p1 | +| fun_g1 | false | 217 | 217 | declaration | +| fun_g1 | false | 220 | 220 | call to g | +| fun_g1 | false | 222 | 222 | p1 | +| fun_g1 | false | 224 | 224 | initializer for i | +| fun_g1 | false | 228 | 228 | return ... | +| fun_g1 | false | 232 | 232 | 2 | +| fun_g1 | false | 233 | 233 | { ... } | +| fun_g1 | true | 207 | 213 | | +| fun_g1 | true | 210 | 212 | | +| fun_g1 | true | 212 | 217 | | +| fun_g1 | true | 213 | 210 | | +| fun_g1 | true | 217 | 224 | | +| fun_g1 | true | 220 | 228 | | +| fun_g1 | true | 222 | 220 | | | fun_g1 | true | 224 | 222 | | -| fun_g1 | true | 226 | 224 | | -| fun_g1 | true | 230 | 234 | | -| fun_g1 | true | 234 | 203 | | -| fun_g1 | true | 235 | 208 | | +| fun_g1 | true | 228 | 232 | | +| fun_g1 | true | 232 | 202 | | +| fun_g1 | true | 233 | 207 | | | fun_g2 | false | 151 | 151 | fun_g2 | | fun_g2 | false | 156 | 156 | declaration | | fun_g2 | false | 164 | 164 | call to Base | -| fun_g2 | false | 173 | 173 | temporary object | | fun_g2 | false | 174 | 174 | new | -| fun_g2 | false | 176 | 176 | initializer for p1 | -| fun_g2 | false | 180 | 180 | declaration | -| fun_g2 | false | 188 | 188 | call to g | -| fun_g2 | false | 190 | 190 | p1 | -| fun_g2 | false | 192 | 192 | initializer for i | -| fun_g2 | false | 196 | 196 | return ... | -| fun_g2 | false | 200 | 200 | 2 | -| fun_g2 | false | 201 | 201 | { ... } | -| fun_g2 | true | 156 | 176 | | +| fun_g2 | false | 175 | 175 | initializer for p1 | +| fun_g2 | false | 179 | 179 | declaration | +| fun_g2 | false | 187 | 187 | call to g | +| fun_g2 | false | 189 | 189 | p1 | +| fun_g2 | false | 191 | 191 | initializer for i | +| fun_g2 | false | 195 | 195 | return ... | +| fun_g2 | false | 199 | 199 | 2 | +| fun_g2 | false | 200 | 200 | { ... } | +| fun_g2 | true | 156 | 175 | | | fun_g2 | true | 164 | 174 | | -| fun_g2 | true | 174 | 180 | | -| fun_g2 | true | 176 | 164 | | -| fun_g2 | true | 180 | 192 | | -| fun_g2 | true | 188 | 196 | | -| fun_g2 | true | 190 | 188 | | -| fun_g2 | true | 192 | 190 | | -| fun_g2 | true | 196 | 200 | | -| fun_g2 | true | 200 | 151 | | -| fun_g2 | true | 201 | 156 | | +| fun_g2 | true | 174 | 179 | | +| fun_g2 | true | 175 | 164 | | +| fun_g2 | true | 179 | 191 | | +| fun_g2 | true | 187 | 195 | | +| fun_g2 | true | 189 | 187 | | +| fun_g2 | true | 191 | 189 | | +| fun_g2 | true | 195 | 199 | | +| fun_g2 | true | 199 | 151 | | +| fun_g2 | true | 200 | 156 | | | operator delete | false | 162 | 162 | operator delete | | operator new | false | 160 | 160 | operator new | From 939bfae6e08d9b9b3a7d8c0312b6059d9958c83f Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Sun, 18 Oct 2020 08:32:08 -0400 Subject: [PATCH 27/53] Fix formatting --- cpp/ql/src/semmle/code/cpp/exprs/Cast.qll | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/ql/src/semmle/code/cpp/exprs/Cast.qll b/cpp/ql/src/semmle/code/cpp/exprs/Cast.qll index 8496e7976806..e7121a05a558 100644 --- a/cpp/ql/src/semmle/code/cpp/exprs/Cast.qll +++ b/cpp/ql/src/semmle/code/cpp/exprs/Cast.qll @@ -842,7 +842,7 @@ class ArrayToPointerConversion extends Conversion, @array_to_pointer { /** * A node representing a temporary object created as part of an expression. - * + * * This is most commonly seen in the following cases (from [class.temporary]/2): * - when binding a reference to a prvalue * - when performing member access on a class prvalue @@ -850,7 +850,7 @@ class ArrayToPointerConversion extends Conversion, @array_to_pointer { * - when initializing an object of type std::initializer_list from a braced-init-list * - for certain unevaluated operands * - when a prvalue that has type other than cv void appears as a discarded-value expression - * + * * This node will only exist if the object is of class type, and even then only if either the * object's initialization or destruction is non-trivial. */ From 0b2acff837a6c216ff010dd75b7fe0bf26b8630c Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Sun, 18 Oct 2020 08:42:24 -0400 Subject: [PATCH 28/53] Add upgrade script --- .../old.dbscheme | 2123 ++++++++++++++++ .../semmlecode.cpp.dbscheme | 2125 +++++++++++++++++ .../upgrade.properties | 2 + 3 files changed, 4250 insertions(+) create mode 100644 cpp/upgrades/ef73d8cf906d356a00a10d0e8dc0e1c1e66d210c/old.dbscheme create mode 100644 cpp/upgrades/ef73d8cf906d356a00a10d0e8dc0e1c1e66d210c/semmlecode.cpp.dbscheme create mode 100644 cpp/upgrades/ef73d8cf906d356a00a10d0e8dc0e1c1e66d210c/upgrade.properties diff --git a/cpp/upgrades/ef73d8cf906d356a00a10d0e8dc0e1c1e66d210c/old.dbscheme b/cpp/upgrades/ef73d8cf906d356a00a10d0e8dc0e1c1e66d210c/old.dbscheme new file mode 100644 index 000000000000..ef73d8cf906d --- /dev/null +++ b/cpp/upgrades/ef73d8cf906d356a00a10d0e8dc0e1c1e66d210c/old.dbscheme @@ -0,0 +1,2123 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/** + * The date of the snapshot. + */ +snapshotDate(unique date snapshotDate : date ref); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Data used by the 'duplicate code' detection. + */ +duplicateCode( + unique int id : @duplication, + string relativePath : string ref, + int equivClass : int ref +); + +/** + * Data used by the 'similar code' detection. + */ +similarCode( + unique int id : @similarity, + string relativePath : string ref, + int equivClass : int ref +); + +/** + * Data used by the 'duplicate code' and 'similar code' detection. + */ +@duplication_or_similarity = @duplication | @similarity + +/** + * Data used by the 'duplicate code' and 'similar code' detection. + */ +#keyset[id, offset] +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref +); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + */ +locations_default( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + */ +locations_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + */ +locations_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/* + fromSource(0) = unknown, + fromSource(1) = from source, + fromSource(2) = from library +*/ +files( + unique int id: @file, + string name: string ref, + string simple: string ref, + string ext: string ref, + int fromSource: int ref +); + +folders( + unique int id: @folder, + string name: string ref, + string simple: string ref +); + +@container = @folder | @file + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +/* + case @macroinvocations.kind of + 1 = macro expansion + | 2 = other macro reference + ; +*/ +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* + case @function.kind of + 1 = normal + | 2 = constructor + | 3 = destructor + | 4 = conversion + | 5 = operator + | 6 = builtin // GCC built-in functions, e.g. __builtin___memcpy_chk + ; +*/ +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point(int id: @function ref, unique int entry_point: @stmt ref); + +function_return_type(int id: @function ref, int return_type: @type ref); + +/** If `function` is a coroutine, then this gives the + std::experimental::resumable_traits instance associated with it, + and the variables representing the `handle` and `promise` for it. */ +coroutine( + unique int function: @function ref, + int traits: @type ref, + int handle: @variable ref, + int promise: @variable ref +); + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +member_function_this_type(unique int id: @function ref, int this_type: @type ref); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @functionorblock ref, + int index: int ref, + int type_id: @type ref +); + +overrides(int new: @function ref, int old: @function ref); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/* + Built-in types are the fundamental types, e.g., integral, floating, and void. + + case @builtintype.kind of + 1 = error + | 2 = unknown + | 3 = void + | 4 = boolean + | 5 = char + | 6 = unsigned_char + | 7 = signed_char + | 8 = short + | 9 = unsigned_short + | 10 = signed_short + | 11 = int + | 12 = unsigned_int + | 13 = signed_int + | 14 = long + | 15 = unsigned_long + | 16 = signed_long + | 17 = long_long + | 18 = unsigned_long_long + | 19 = signed_long_long + | 20 = __int8 // Microsoft-specific + | 21 = __int16 // Microsoft-specific + | 22 = __int32 // Microsoft-specific + | 23 = __int64 // Microsoft-specific + | 24 = float + | 25 = double + | 26 = long_double + | 27 = _Complex_float // C99-specific + | 28 = _Complex_double // C99-specific + | 29 = _Complex_long double // C99-specific + | 30 = _Imaginary_float // C99-specific + | 31 = _Imaginary_double // C99-specific + | 32 = _Imaginary_long_double // C99-specific + | 33 = wchar_t // Microsoft-specific + | 34 = decltype_nullptr // C++11 + | 35 = __int128 + | 36 = unsigned___int128 + | 37 = signed___int128 + | 38 = __float128 + | 39 = _Complex___float128 + | 40 = _Decimal32 + | 41 = _Decimal64 + | 42 = _Decimal128 + | 43 = char16_t + | 44 = char32_t + | 45 = _Float32 + | 46 = _Float32x + | 47 = _Float64 + | 48 = _Float64x + | 49 = _Float128 + | 50 = _Float128x + | 51 = char8_t + ; +*/ +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/* + Derived types are types that are directly derived from existing types and + point to, refer to, transform type data to return a new type. + + case @derivedtype.kind of + 1 = pointer + | 2 = reference + | 3 = type_with_specifiers + | 4 = array + | 5 = gnu_vector + | 6 = routineptr + | 7 = routinereference + | 8 = rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated + | 10 = block + ; +*/ +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +decltypes( + unique int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* + case @usertype.kind of + 1 = struct + | 2 = class + | 3 = union + | 4 = enum + | 5 = typedef // classic C: typedef typedef type name + | 6 = template + | 7 = template_parameter + | 8 = template_template_parameter + | 9 = proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated + | 13 = scoped_enum + | 14 = using_alias // a using name = type style typedef + ; +*/ +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + unique string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the EDG frontend. See symbol_ref.h there. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall(unique int caller: @funbindexpr ref, int kind: int ref); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr + +@assign_expr = @assignexpr | @assign_op_expr + +/* + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 3 = size_and_alignment + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // EDG internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + ; + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. + */ +#keyset[aggregate, field] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. + */ +#keyset[aggregate, element_index] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +for_initialization( + unique int for_stmt: @stmt_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + unique int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* XML Files */ + +xmlEncoding(unique int id: @file ref, string encoding: string ref); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters + | @xmlelement + | @xmlcomment + | @xmlattribute + | @xmldtd + | @file + | @xmlnamespace; diff --git a/cpp/upgrades/ef73d8cf906d356a00a10d0e8dc0e1c1e66d210c/semmlecode.cpp.dbscheme b/cpp/upgrades/ef73d8cf906d356a00a10d0e8dc0e1c1e66d210c/semmlecode.cpp.dbscheme new file mode 100644 index 000000000000..c82db4c596b8 --- /dev/null +++ b/cpp/upgrades/ef73d8cf906d356a00a10d0e8dc0e1c1e66d210c/semmlecode.cpp.dbscheme @@ -0,0 +1,2125 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/** + * The date of the snapshot. + */ +snapshotDate(unique date snapshotDate : date ref); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Data used by the 'duplicate code' detection. + */ +duplicateCode( + unique int id : @duplication, + string relativePath : string ref, + int equivClass : int ref +); + +/** + * Data used by the 'similar code' detection. + */ +similarCode( + unique int id : @similarity, + string relativePath : string ref, + int equivClass : int ref +); + +/** + * Data used by the 'duplicate code' and 'similar code' detection. + */ +@duplication_or_similarity = @duplication | @similarity + +/** + * Data used by the 'duplicate code' and 'similar code' detection. + */ +#keyset[id, offset] +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref +); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + */ +locations_default( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + */ +locations_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + */ +locations_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/* + fromSource(0) = unknown, + fromSource(1) = from source, + fromSource(2) = from library +*/ +files( + unique int id: @file, + string name: string ref, + string simple: string ref, + string ext: string ref, + int fromSource: int ref +); + +folders( + unique int id: @folder, + string name: string ref, + string simple: string ref +); + +@container = @folder | @file + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +/* + case @macroinvocations.kind of + 1 = macro expansion + | 2 = other macro reference + ; +*/ +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* + case @function.kind of + 1 = normal + | 2 = constructor + | 3 = destructor + | 4 = conversion + | 5 = operator + | 6 = builtin // GCC built-in functions, e.g. __builtin___memcpy_chk + ; +*/ +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point(int id: @function ref, unique int entry_point: @stmt ref); + +function_return_type(int id: @function ref, int return_type: @type ref); + +/** If `function` is a coroutine, then this gives the + std::experimental::resumable_traits instance associated with it, + and the variables representing the `handle` and `promise` for it. */ +coroutine( + unique int function: @function ref, + int traits: @type ref, + int handle: @variable ref, + int promise: @variable ref +); + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +member_function_this_type(unique int id: @function ref, int this_type: @type ref); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @functionorblock ref, + int index: int ref, + int type_id: @type ref +); + +overrides(int new: @function ref, int old: @function ref); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/* + Built-in types are the fundamental types, e.g., integral, floating, and void. + + case @builtintype.kind of + 1 = error + | 2 = unknown + | 3 = void + | 4 = boolean + | 5 = char + | 6 = unsigned_char + | 7 = signed_char + | 8 = short + | 9 = unsigned_short + | 10 = signed_short + | 11 = int + | 12 = unsigned_int + | 13 = signed_int + | 14 = long + | 15 = unsigned_long + | 16 = signed_long + | 17 = long_long + | 18 = unsigned_long_long + | 19 = signed_long_long + | 20 = __int8 // Microsoft-specific + | 21 = __int16 // Microsoft-specific + | 22 = __int32 // Microsoft-specific + | 23 = __int64 // Microsoft-specific + | 24 = float + | 25 = double + | 26 = long_double + | 27 = _Complex_float // C99-specific + | 28 = _Complex_double // C99-specific + | 29 = _Complex_long double // C99-specific + | 30 = _Imaginary_float // C99-specific + | 31 = _Imaginary_double // C99-specific + | 32 = _Imaginary_long_double // C99-specific + | 33 = wchar_t // Microsoft-specific + | 34 = decltype_nullptr // C++11 + | 35 = __int128 + | 36 = unsigned___int128 + | 37 = signed___int128 + | 38 = __float128 + | 39 = _Complex___float128 + | 40 = _Decimal32 + | 41 = _Decimal64 + | 42 = _Decimal128 + | 43 = char16_t + | 44 = char32_t + | 45 = _Float32 + | 46 = _Float32x + | 47 = _Float64 + | 48 = _Float64x + | 49 = _Float128 + | 50 = _Float128x + | 51 = char8_t + ; +*/ +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/* + Derived types are types that are directly derived from existing types and + point to, refer to, transform type data to return a new type. + + case @derivedtype.kind of + 1 = pointer + | 2 = reference + | 3 = type_with_specifiers + | 4 = array + | 5 = gnu_vector + | 6 = routineptr + | 7 = routinereference + | 8 = rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated + | 10 = block + ; +*/ +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +decltypes( + unique int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* + case @usertype.kind of + 1 = struct + | 2 = class + | 3 = union + | 4 = enum + | 5 = typedef // classic C: typedef typedef type name + | 6 = template + | 7 = template_parameter + | 8 = template_template_parameter + | 9 = proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated + | 13 = scoped_enum + | 14 = using_alias // a using name = type style typedef + ; +*/ +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + unique string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the EDG frontend. See symbol_ref.h there. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall(unique int caller: @funbindexpr ref, int kind: int ref); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr + +@assign_expr = @assignexpr | @assign_op_expr + +/* + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 3 = size_and_alignment + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // EDG internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + ; + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. + */ +#keyset[aggregate, field] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. + */ +#keyset[aggregate, element_index] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +for_initialization( + unique int for_stmt: @stmt_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + unique int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* XML Files */ + +xmlEncoding(unique int id: @file ref, string encoding: string ref); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters + | @xmlelement + | @xmlcomment + | @xmlattribute + | @xmldtd + | @file + | @xmlnamespace; diff --git a/cpp/upgrades/ef73d8cf906d356a00a10d0e8dc0e1c1e66d210c/upgrade.properties b/cpp/upgrades/ef73d8cf906d356a00a10d0e8dc0e1c1e66d210c/upgrade.properties new file mode 100644 index 000000000000..c9856bdaad2b --- /dev/null +++ b/cpp/upgrades/ef73d8cf906d356a00a10d0e8dc0e1c1e66d210c/upgrade.properties @@ -0,0 +1,2 @@ +description: Add temporary object initializations +compatibility: partial From 2f34c78552737c8debe4a4dd753af6bac00d2a7f Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Sun, 18 Oct 2020 11:08:42 -0400 Subject: [PATCH 29/53] Fix formatting --- .../raw/internal/TranslatedElement.qll | 3 ++- .../implementation/raw/internal/TranslatedExpr.qll | 13 +++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll index 79552db90e50..b52eda252a81 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll @@ -256,7 +256,8 @@ private predicate ignoreLoad(Expr expr) { private predicate needsLoadForParentExpr(Expr expr) { exists(CrementOperation crement | expr = crement.getOperand().getFullyConverted()) or - exists(AssignOperation ao | expr = ao.getLValue().getFullyConverted()) or + exists(AssignOperation ao | expr = ao.getLValue().getFullyConverted()) + or // For arguments that are passed by value but require a constructor call, the extractor emits a // `TemporaryObjectExpr` as the argument, and marks it as a glvalue. This is roughly how a code- // generating compiler would implement this, passing the address of the temporary so that the diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll index b4dc524b97e6..18d0518e7fa9 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll @@ -2051,11 +2051,12 @@ class TranslatedBinaryConditionalExpr extends TranslatedConditionalExpr { /** * IR translation of the materialization of a temporary object. - * + * * This translation allocates a temporary variable, and initializes it treating `expr.getExpr()` as * its initializer. */ -class TranslatedTemporaryObjectExpr extends TranslatedNonConstantExpr, TranslatedVariableInitialization { +class TranslatedTemporaryObjectExpr extends TranslatedNonConstantExpr, + TranslatedVariableInitialization { override TemporaryObjectExpr expr; final override predicate hasTempVariable(TempVariableTag tag, CppType type) { @@ -2069,15 +2070,15 @@ class TranslatedTemporaryObjectExpr extends TranslatedNonConstantExpr, Translate result = getTranslatedInitialization(expr.getExpr()) } - final override IRVariable getIRVariable() { result = getIRTempVariable(expr, TempObjectTempVar()) } + final override IRVariable getIRVariable() { + result = getIRTempVariable(expr, TempObjectTempVar()) + } final override Instruction getInitializationSuccessor() { result = getParent().getChildSuccessor(this) } - final override Instruction getResult() { - result = getTargetAddress() - } + final override Instruction getResult() { result = getTargetAddress() } } /** From b73cb3a4ce4caa03ebaead23e99587eb250affc5 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Sun, 18 Oct 2020 11:11:05 -0400 Subject: [PATCH 30/53] Accept C# IR diffs --- .../test/experimental/ir/ir/raw_ir.expected | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/csharp/ql/test/experimental/ir/ir/raw_ir.expected b/csharp/ql/test/experimental/ir/ir/raw_ir.expected index 9b36bb4f8a80..e0d8dfd13ae3 100644 --- a/csharp/ql/test/experimental/ir/ir/raw_ir.expected +++ b/csharp/ql/test/experimental/ir/ir/raw_ir.expected @@ -260,7 +260,7 @@ collections.cs: # 15| mu15_9(String) = Store[?] : &:r15_8, r15_7 # 15| r15_10(String) = StringConstant["World"] : # 15| r15_11(glval) = FieldAddress[b] : r15_3 -# 15| mu15_12(String) = Store : &:r15_11, r15_10 +# 15| mu15_12(String) = Store[?] : &:r15_11, r15_10 # 15| v15_13(Void) = Call[Add] : func:r15_1, this:r13_2, 0:r15_2, 1:r15_3 # 15| mu15_14() = ^CallSideEffect : ~m? # 16| r16_1() = FunctionAddress[Add] : @@ -274,7 +274,7 @@ collections.cs: # 16| mu16_9(String) = Store[?] : &:r16_8, r16_7 # 16| r16_10(String) = StringConstant["Bar"] : # 16| r16_11(glval) = FieldAddress[b] : r16_3 -# 16| mu16_12(String) = Store : &:r16_11, r16_10 +# 16| mu16_12(String) = Store[?] : &:r16_11, r16_10 # 16| v16_13(Void) = Call[Add] : func:r16_1, this:r13_2, 0:r16_2, 1:r16_3 # 16| mu16_14() = ^CallSideEffect : ~m? # 13| mu13_6(Dictionary) = Store[dict] : &:r13_1, r13_2 @@ -333,7 +333,7 @@ constructor_init.cs: # 21| r21_6(glval) = Convert[DerivedClass : BaseClass] : r21_3 # 21| r21_7() = FunctionAddress[BaseClass] : # 21| r21_8(glval) = VariableAddress[i] : -# 21| r21_9(Int32) = Load : &:r21_8, ~m? +# 21| r21_9(Int32) = Load[i] : &:r21_8, ~m? # 21| v21_10(Void) = Call[BaseClass] : func:r21_7, this:r21_6, 0:r21_9 # 21| mu21_11() = ^CallSideEffect : ~m? # 22| v22_1(Void) = NoOp : @@ -352,7 +352,7 @@ constructor_init.cs: # 25| mu25_7(Int32) = InitializeParameter[j] : &:r25_6 # 25| r25_8() = FunctionAddress[DerivedClass] : # 25| r25_9(glval) = VariableAddress[i] : -# 25| r25_10(Int32) = Load : &:r25_9, ~m? +# 25| r25_10(Int32) = Load[i] : &:r25_9, ~m? # 25| v25_11(Void) = Call[DerivedClass] : func:r25_8, this:r25_3, 0:r25_10 # 25| mu25_12() = ^CallSideEffect : ~m? # 26| v26_1(Void) = NoOp : @@ -493,7 +493,7 @@ events.cs: # 15| r15_2() = FunctionAddress[add_MyEvent] : # 15| r15_3(Events) = CopyValue : r13_3 # 15| r15_4(glval) = FieldAddress[Inst] : r15_3 -# 15| r15_5(MyDel) = Load : &:r15_4, ~m? +# 15| r15_5(MyDel) = Load[?] : &:r15_4, ~m? # 15| v15_6(Void) = Call[add_MyEvent] : func:r15_2, this:r15_1, 0:r15_5 # 15| mu15_7() = ^CallSideEffect : ~m? # 13| v13_4(Void) = ReturnVoid : @@ -509,7 +509,7 @@ events.cs: # 20| r20_2() = FunctionAddress[remove_MyEvent] : # 20| r20_3(Events) = CopyValue : r18_3 # 20| r20_4(glval) = FieldAddress[Inst] : r20_3 -# 20| r20_5(MyDel) = Load : &:r20_4, ~m? +# 20| r20_5(MyDel) = Load[?] : &:r20_4, ~m? # 20| v20_6(Void) = Call[remove_MyEvent] : func:r20_2, this:r20_1, 0:r20_5 # 20| mu20_7() = ^CallSideEffect : ~m? # 18| v18_4(Void) = ReturnVoid : @@ -903,8 +903,8 @@ inoutref.cs: # 26| r26_2(glval) = VariableAddress[c] : # 26| r26_3(MyClass) = Load[c] : &:r26_2, ~m? # 26| r26_4(glval) = VariableAddress[c1] : -# 26| r26_5(MyClass) = Load : &:r26_4, ~m? -# 26| r26_6(MyClass) = Load : &:r26_5, ~m? +# 26| r26_5(MyClass) = Load[c1] : &:r26_4, ~m? +# 26| r26_6(MyClass) = Load[?] : &:r26_5, ~m? # 26| v26_7(Void) = Call[set] : func:r26_1, 0:r26_3, 1:r26_6 # 26| mu26_8() = ^CallSideEffect : ~m? # 16| v16_13(Void) = ReturnVoid : @@ -1229,7 +1229,7 @@ lock.cs: # 8| Block 2 # 8| r8_17() = FunctionAddress[Exit] : # 8| r8_18(glval) = VariableAddress[#temp8:9] : -# 8| r8_19(Object) = Load : &:r8_18, ~m? +# 8| r8_19(Object) = Load[#temp8:9] : &:r8_18, ~m? # 8| v8_20(Void) = Call[Exit] : func:r8_17, 0:r8_19 # 8| mu8_21() = ^CallSideEffect : ~m? #-----| Goto -> Block 1 @@ -1430,7 +1430,7 @@ pointers.cs: # 39| mu39_14(Int32) = Store[?] : &:r39_12, r39_13 # 40| r40_1() = FunctionAddress[addone] : # 40| r40_2(glval) = VariableAddress[arr] : -# 40| r40_3(Int32[]) = Load : &:r40_2, ~m? +# 40| r40_3(Int32[]) = Load[arr] : &:r40_2, ~m? # 40| v40_4(Void) = Call[addone] : func:r40_1, 0:r40_3 # 40| mu40_5() = ^CallSideEffect : ~m? # 25| v25_3(Void) = ReturnVoid : From 7de6415d004f7661e04236966287725053909d71 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Tue, 20 Oct 2020 07:40:44 -0400 Subject: [PATCH 31/53] Accept test diffs after merge --- .../library-tests/ir/ir/PrintAST.expected | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index d164ce617769..5c5385ee28e6 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -8471,15 +8471,15 @@ ir.cpp: # 1038| params: #-----| 0: [Parameter] (unnamed parameter 0) #-----| Type = [LValueReferenceType] const lambda [] type at line 1038, col. 12 & -# 1038| [CopyConstructor] void (lambda [] type at line 1038, col. 12)::(constructor)((lambda [] type at line 1038, col. 12) const&) +# 1038| [CopyConstructor] void (lambda [] type at line 1038, col. 12)::(unnamed constructor)((lambda [] type at line 1038, col. 12) const&) # 1038| params: #-----| 0: [Parameter] (unnamed parameter 0) #-----| Type = [LValueReferenceType] const lambda [] type at line 1038, col. 12 & -# 1038| [MoveConstructor] void (lambda [] type at line 1038, col. 12)::(constructor)((lambda [] type at line 1038, col. 12)&&) +# 1038| [MoveConstructor] void (lambda [] type at line 1038, col. 12)::(unnamed constructor)((lambda [] type at line 1038, col. 12)&&) # 1038| params: #-----| 0: [Parameter] (unnamed parameter 0) #-----| Type = [RValueReferenceType] lambda [] type at line 1038, col. 12 && -# 1038| [Constructor] void (lambda [] type at line 1038, col. 12)::(constructor)() +# 1038| [Constructor] void (lambda [] type at line 1038, col. 12)::(unnamed constructor)() # 1038| params: # 1038| [MemberFunction] void (lambda [] type at line 1038, col. 12)::_FUN() # 1038| params: @@ -8801,15 +8801,15 @@ ir.cpp: # 1041| params: #-----| 0: [Parameter] (unnamed parameter 0) #-----| Type = [LValueReferenceType] const lambda [] type at line 1041, col. 23 & -# 1041| [CopyConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1041, col. 23)::(constructor)((void Lambda(int, String const&))::(lambda [] type at line 1041, col. 23) const&) +# 1041| [CopyConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1041, col. 23)::(unnamed constructor)((void Lambda(int, String const&))::(lambda [] type at line 1041, col. 23) const&) # 1041| params: #-----| 0: [Parameter] (unnamed parameter 0) #-----| Type = [LValueReferenceType] const lambda [] type at line 1041, col. 23 & -# 1041| [MoveConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1041, col. 23)::(constructor)((void Lambda(int, String const&))::(lambda [] type at line 1041, col. 23)&&) +# 1041| [MoveConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1041, col. 23)::(unnamed constructor)((void Lambda(int, String const&))::(lambda [] type at line 1041, col. 23)&&) # 1041| params: #-----| 0: [Parameter] (unnamed parameter 0) #-----| Type = [RValueReferenceType] lambda [] type at line 1041, col. 23 && -# 1041| [Constructor] void (void Lambda(int, String const&))::(lambda [] type at line 1041, col. 23)::(constructor)() +# 1041| [Constructor] void (void Lambda(int, String const&))::(lambda [] type at line 1041, col. 23)::(unnamed constructor)() # 1041| params: # 1041| [MemberFunction] char (void Lambda(int, String const&))::(lambda [] type at line 1041, col. 23)::_FUN(float) # 1041| params: @@ -8836,15 +8836,15 @@ ir.cpp: # 1043| params: #-----| 0: [Parameter] (unnamed parameter 0) #-----| Type = [LValueReferenceType] const lambda [] type at line 1043, col. 21 & -# 1043| [CopyConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1043, col. 21)::(constructor)((void Lambda(int, String const&))::(lambda [] type at line 1043, col. 21) const&) +# 1043| [CopyConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1043, col. 21)::(unnamed constructor)((void Lambda(int, String const&))::(lambda [] type at line 1043, col. 21) const&) # 1043| params: #-----| 0: [Parameter] (unnamed parameter 0) #-----| Type = [LValueReferenceType] const lambda [] type at line 1043, col. 21 & -# 1043| [MoveConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1043, col. 21)::(constructor)((void Lambda(int, String const&))::(lambda [] type at line 1043, col. 21)&&) +# 1043| [MoveConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1043, col. 21)::(unnamed constructor)((void Lambda(int, String const&))::(lambda [] type at line 1043, col. 21)&&) # 1043| params: #-----| 0: [Parameter] (unnamed parameter 0) #-----| Type = [RValueReferenceType] lambda [] type at line 1043, col. 21 && -# 1043| [Constructor] void (void Lambda(int, String const&))::(lambda [] type at line 1043, col. 21)::(constructor)() +# 1043| [Constructor] void (void Lambda(int, String const&))::(lambda [] type at line 1043, col. 21)::(unnamed constructor)() # 1043| params: # 1043| [ConstMemberFunction] char (void Lambda(int, String const&))::(lambda [] type at line 1043, col. 21)::operator()(float) const # 1043| params: @@ -8880,15 +8880,15 @@ ir.cpp: # 1045| params: #-----| 0: [Parameter] (unnamed parameter 0) #-----| Type = [LValueReferenceType] const lambda [] type at line 1045, col. 21 & -# 1045| [CopyConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1045, col. 21)::(constructor)((void Lambda(int, String const&))::(lambda [] type at line 1045, col. 21) const&) +# 1045| [CopyConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1045, col. 21)::(unnamed constructor)((void Lambda(int, String const&))::(lambda [] type at line 1045, col. 21) const&) # 1045| params: #-----| 0: [Parameter] (unnamed parameter 0) #-----| Type = [LValueReferenceType] const lambda [] type at line 1045, col. 21 & -# 1045| [MoveConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1045, col. 21)::(constructor)((void Lambda(int, String const&))::(lambda [] type at line 1045, col. 21)&&) +# 1045| [MoveConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1045, col. 21)::(unnamed constructor)((void Lambda(int, String const&))::(lambda [] type at line 1045, col. 21)&&) # 1045| params: #-----| 0: [Parameter] (unnamed parameter 0) #-----| Type = [RValueReferenceType] lambda [] type at line 1045, col. 21 && -# 1045| [Constructor] void (void Lambda(int, String const&))::(lambda [] type at line 1045, col. 21)::(constructor)() +# 1045| [Constructor] void (void Lambda(int, String const&))::(lambda [] type at line 1045, col. 21)::(unnamed constructor)() # 1045| params: # 1045| [Destructor] void (void Lambda(int, String const&))::(lambda [] type at line 1045, col. 21)::~() # 1045| params: @@ -8932,15 +8932,15 @@ ir.cpp: # 1047| params: #-----| 0: [Parameter] (unnamed parameter 0) #-----| Type = [LValueReferenceType] const lambda [] type at line 1047, col. 30 & -# 1047| [CopyConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1047, col. 30)::(constructor)((void Lambda(int, String const&))::(lambda [] type at line 1047, col. 30) const&) +# 1047| [CopyConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1047, col. 30)::(unnamed constructor)((void Lambda(int, String const&))::(lambda [] type at line 1047, col. 30) const&) # 1047| params: #-----| 0: [Parameter] (unnamed parameter 0) #-----| Type = [LValueReferenceType] const lambda [] type at line 1047, col. 30 & -# 1047| [MoveConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1047, col. 30)::(constructor)((void Lambda(int, String const&))::(lambda [] type at line 1047, col. 30)&&) +# 1047| [MoveConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1047, col. 30)::(unnamed constructor)((void Lambda(int, String const&))::(lambda [] type at line 1047, col. 30)&&) # 1047| params: #-----| 0: [Parameter] (unnamed parameter 0) #-----| Type = [RValueReferenceType] lambda [] type at line 1047, col. 30 && -# 1047| [Constructor] void (void Lambda(int, String const&))::(lambda [] type at line 1047, col. 30)::(constructor)() +# 1047| [Constructor] void (void Lambda(int, String const&))::(lambda [] type at line 1047, col. 30)::(unnamed constructor)() # 1047| params: # 1047| [ConstMemberFunction] char (void Lambda(int, String const&))::(lambda [] type at line 1047, col. 30)::operator()(float) const # 1047| params: @@ -8971,15 +8971,15 @@ ir.cpp: # 1049| params: #-----| 0: [Parameter] (unnamed parameter 0) #-----| Type = [LValueReferenceType] const lambda [] type at line 1049, col. 30 & -# 1049| [CopyConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1049, col. 30)::(constructor)((void Lambda(int, String const&))::(lambda [] type at line 1049, col. 30) const&) +# 1049| [CopyConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1049, col. 30)::(unnamed constructor)((void Lambda(int, String const&))::(lambda [] type at line 1049, col. 30) const&) # 1049| params: #-----| 0: [Parameter] (unnamed parameter 0) #-----| Type = [LValueReferenceType] const lambda [] type at line 1049, col. 30 & -# 1049| [MoveConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1049, col. 30)::(constructor)((void Lambda(int, String const&))::(lambda [] type at line 1049, col. 30)&&) +# 1049| [MoveConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1049, col. 30)::(unnamed constructor)((void Lambda(int, String const&))::(lambda [] type at line 1049, col. 30)&&) # 1049| params: #-----| 0: [Parameter] (unnamed parameter 0) #-----| Type = [RValueReferenceType] lambda [] type at line 1049, col. 30 && -# 1049| [Constructor] void (void Lambda(int, String const&))::(lambda [] type at line 1049, col. 30)::(constructor)() +# 1049| [Constructor] void (void Lambda(int, String const&))::(lambda [] type at line 1049, col. 30)::(unnamed constructor)() # 1049| params: # 1049| [Destructor] void (void Lambda(int, String const&))::(lambda [] type at line 1049, col. 30)::~() # 1049| params: @@ -9021,15 +9021,15 @@ ir.cpp: # 1051| params: #-----| 0: [Parameter] (unnamed parameter 0) #-----| Type = [LValueReferenceType] const lambda [] type at line 1051, col. 32 & -# 1051| [CopyConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1051, col. 32)::(constructor)((void Lambda(int, String const&))::(lambda [] type at line 1051, col. 32) const&) +# 1051| [CopyConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1051, col. 32)::(unnamed constructor)((void Lambda(int, String const&))::(lambda [] type at line 1051, col. 32) const&) # 1051| params: #-----| 0: [Parameter] (unnamed parameter 0) #-----| Type = [LValueReferenceType] const lambda [] type at line 1051, col. 32 & -# 1051| [MoveConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1051, col. 32)::(constructor)((void Lambda(int, String const&))::(lambda [] type at line 1051, col. 32)&&) +# 1051| [MoveConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1051, col. 32)::(unnamed constructor)((void Lambda(int, String const&))::(lambda [] type at line 1051, col. 32)&&) # 1051| params: #-----| 0: [Parameter] (unnamed parameter 0) #-----| Type = [RValueReferenceType] lambda [] type at line 1051, col. 32 && -# 1051| [Constructor] void (void Lambda(int, String const&))::(lambda [] type at line 1051, col. 32)::(constructor)() +# 1051| [Constructor] void (void Lambda(int, String const&))::(lambda [] type at line 1051, col. 32)::(unnamed constructor)() # 1051| params: # 1051| [ConstMemberFunction] char (void Lambda(int, String const&))::(lambda [] type at line 1051, col. 32)::operator()(float) const # 1051| params: @@ -9062,15 +9062,15 @@ ir.cpp: # 1054| params: #-----| 0: [Parameter] (unnamed parameter 0) #-----| Type = [LValueReferenceType] const lambda [] type at line 1054, col. 23 & -# 1054| [CopyConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1054, col. 23)::(constructor)((void Lambda(int, String const&))::(lambda [] type at line 1054, col. 23) const&) +# 1054| [CopyConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1054, col. 23)::(unnamed constructor)((void Lambda(int, String const&))::(lambda [] type at line 1054, col. 23) const&) # 1054| params: #-----| 0: [Parameter] (unnamed parameter 0) #-----| Type = [LValueReferenceType] const lambda [] type at line 1054, col. 23 & -# 1054| [MoveConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1054, col. 23)::(constructor)((void Lambda(int, String const&))::(lambda [] type at line 1054, col. 23)&&) +# 1054| [MoveConstructor] void (void Lambda(int, String const&))::(lambda [] type at line 1054, col. 23)::(unnamed constructor)((void Lambda(int, String const&))::(lambda [] type at line 1054, col. 23)&&) # 1054| params: #-----| 0: [Parameter] (unnamed parameter 0) #-----| Type = [RValueReferenceType] lambda [] type at line 1054, col. 23 && -# 1054| [Constructor] void (void Lambda(int, String const&))::(lambda [] type at line 1054, col. 23)::(constructor)() +# 1054| [Constructor] void (void Lambda(int, String const&))::(lambda [] type at line 1054, col. 23)::(unnamed constructor)() # 1054| params: # 1054| [ConstMemberFunction] char (void Lambda(int, String const&))::(lambda [] type at line 1054, col. 23)::operator()(float) const # 1054| params: From 735c65732661425c3d23202535457ae4ddc56997 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Tue, 20 Oct 2020 10:32:28 -0400 Subject: [PATCH 32/53] IR consistency checks for `FieldAddress` and `this` arguments that are not actually addresses. Exposes failures in existing tests. Also added a small test case for `FieldAddress` on a prvalue. --- .../aliased_ssa/IRConsistency.qll | 30 +++++++++++++++++++ .../ir/implementation/raw/IRConsistency.qll | 30 +++++++++++++++++++ .../unaliased_ssa/IRConsistency.qll | 30 +++++++++++++++++++ .../library-tests/ir/ir/PrintAST.expected | 29 +++++++++++++----- .../ir/ir/aliased_ssa_consistency.expected | 9 ++++++ .../aliased_ssa_consistency_unsound.expected | 9 ++++++ cpp/ql/test/library-tests/ir/ir/ir.cpp | 7 +++-- .../ir/ir/raw_consistency.expected | 9 ++++++ .../test/library-tests/ir/ir/raw_ir.expected | 23 +++++++++----- .../ir/ir/unaliased_ssa_consistency.expected | 9 ++++++ ...unaliased_ssa_consistency_unsound.expected | 9 ++++++ .../ir/ssa/aliased_ssa_consistency.expected | 2 ++ .../aliased_ssa_consistency_unsound.expected | 2 ++ .../ir/ssa/unaliased_ssa_consistency.expected | 2 ++ ...unaliased_ssa_consistency_unsound.expected | 2 ++ .../aliased_ssa_consistency.expected | 9 ++++++ .../syntax-zoo/raw_consistency.expected | 15 ++++++++++ .../unaliased_ssa_consistency.expected | 9 ++++++ .../ir/implementation/raw/IRConsistency.qll | 30 +++++++++++++++++++ .../unaliased_ssa/IRConsistency.qll | 30 +++++++++++++++++++ .../ir/ir/raw_ir_consistency.expected | 10 +++++++ .../ir/ir/unaliased_ssa_consistency.expected | 10 +++++++ 22 files changed, 297 insertions(+), 18 deletions(-) diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRConsistency.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRConsistency.qll index 6a87b9b4b5fd..f331f4c87bf3 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRConsistency.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRConsistency.qll @@ -494,4 +494,34 @@ module InstructionConsistency { irFunc = getInstructionIRFunction(instr, irFuncText) ) } + + /** + * Holds if the object address operand for the given `FieldAddress` instruction does not have an + * address type. + */ + query predicate fieldAddressOnNonPointer( + FieldAddressInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText + ) { + not instr.getObjectAddressOperand().getIRType() instanceof IRAddressType and + message = + "FieldAddress instruction '" + instr.toString() + + "' has an object address operand that is not an address, in function '$@'." and + irFunc = getInstructionIRFunction(instr, irFuncText) + } + + /** + * Holds if the `this` argument operand for the given `Call` instruction does not have an address + * type. + */ + query predicate thisArgumentIsNonPointer( + CallInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText + ) { + exists(ThisArgumentOperand thisOperand | thisOperand = instr.getThisArgumentOperand() | + not thisOperand.getIRType() instanceof IRAddressType + ) and + message = + "Call instruction '" + instr.toString() + + "' has a `this` argument operand that is not an address, in function '$@'." and + irFunc = getInstructionIRFunction(instr, irFuncText) + } } diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRConsistency.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRConsistency.qll index 6a87b9b4b5fd..f331f4c87bf3 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRConsistency.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRConsistency.qll @@ -494,4 +494,34 @@ module InstructionConsistency { irFunc = getInstructionIRFunction(instr, irFuncText) ) } + + /** + * Holds if the object address operand for the given `FieldAddress` instruction does not have an + * address type. + */ + query predicate fieldAddressOnNonPointer( + FieldAddressInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText + ) { + not instr.getObjectAddressOperand().getIRType() instanceof IRAddressType and + message = + "FieldAddress instruction '" + instr.toString() + + "' has an object address operand that is not an address, in function '$@'." and + irFunc = getInstructionIRFunction(instr, irFuncText) + } + + /** + * Holds if the `this` argument operand for the given `Call` instruction does not have an address + * type. + */ + query predicate thisArgumentIsNonPointer( + CallInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText + ) { + exists(ThisArgumentOperand thisOperand | thisOperand = instr.getThisArgumentOperand() | + not thisOperand.getIRType() instanceof IRAddressType + ) and + message = + "Call instruction '" + instr.toString() + + "' has a `this` argument operand that is not an address, in function '$@'." and + irFunc = getInstructionIRFunction(instr, irFuncText) + } } diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRConsistency.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRConsistency.qll index 6a87b9b4b5fd..f331f4c87bf3 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRConsistency.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRConsistency.qll @@ -494,4 +494,34 @@ module InstructionConsistency { irFunc = getInstructionIRFunction(instr, irFuncText) ) } + + /** + * Holds if the object address operand for the given `FieldAddress` instruction does not have an + * address type. + */ + query predicate fieldAddressOnNonPointer( + FieldAddressInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText + ) { + not instr.getObjectAddressOperand().getIRType() instanceof IRAddressType and + message = + "FieldAddress instruction '" + instr.toString() + + "' has an object address operand that is not an address, in function '$@'." and + irFunc = getInstructionIRFunction(instr, irFuncText) + } + + /** + * Holds if the `this` argument operand for the given `Call` instruction does not have an address + * type. + */ + query predicate thisArgumentIsNonPointer( + CallInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText + ) { + exists(ThisArgumentOperand thisOperand | thisOperand = instr.getThisArgumentOperand() | + not thisOperand.getIRType() instanceof IRAddressType + ) and + message = + "Call instruction '" + instr.toString() + + "' has a `this` argument operand that is not an address, in function '$@'." and + irFunc = getInstructionIRFunction(instr, irFuncText) + } } diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 5c5385ee28e6..d38f195e4b59 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -10941,14 +10941,27 @@ ir.cpp: # 1398| expr: [FunctionCall] call to returnValue # 1398| Type = [Class] copy_constructor # 1398| ValueCategory = prvalue -# 1400| 7: [ExprStmt] ExprStmt -# 1400| 0: [TemporaryObjectExpr] temporary object -# 1400| Type = [Class] copy_constructor -# 1400| ValueCategory = prvalue(load) -# 1400| expr: [FunctionCall] call to defaultConstruct -# 1400| Type = [Class] copy_constructor -# 1400| ValueCategory = prvalue -# 1401| 8: [ReturnStmt] return ... +# 1399| 7: [ExprStmt] ExprStmt +# 1399| 0: [TemporaryObjectExpr] temporary object +# 1399| Type = [Class] copy_constructor +# 1399| ValueCategory = prvalue(load) +# 1399| expr: [FunctionCall] call to defaultConstruct +# 1399| Type = [Class] copy_constructor +# 1399| ValueCategory = prvalue +# 1401| 8: [DeclStmt] declaration +# 1401| 0: [VariableDeclarationEntry] definition of y +# 1401| Type = [IntType] int +# 1401| init: [Initializer] initializer for y +# 1401| expr: [ValueFieldAccess] y +# 1401| Type = [IntType] int +# 1401| ValueCategory = prvalue +# 1401| -1: [TemporaryObjectExpr] temporary object +# 1401| Type = [Class] copy_constructor +# 1401| ValueCategory = prvalue(load) +# 1401| expr: [FunctionCall] call to returnValue +# 1401| Type = [Class] copy_constructor +# 1401| ValueCategory = prvalue +# 1402| 9: [ReturnStmt] return ... perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| params: diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected index 1c41692bcaad..136f7a44a647 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected @@ -21,6 +21,15 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +| ir.cpp:1401:45:1401:45 | FieldAddress: y | FieldAddress instruction 'FieldAddress: y' has an object address operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | +thisArgumentIsNonPointer +| ir.cpp:1373:14:1373:18 | Call: call to c_str | Call instruction 'Call: call to c_str' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1365:6:1365:21 | void temporary_string() | void temporary_string() | +| ir.cpp:1374:27:1374:31 | Call: call to c_str | Call instruction 'Call: call to c_str' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1365:6:1365:21 | void temporary_string() | void temporary_string() | +| ir.cpp:1385:23:1385:28 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1379:6:1379:30 | void temporary_destructor_only() | void temporary_destructor_only() | +| ir.cpp:1386:36:1386:41 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1379:6:1379:30 | void temporary_destructor_only() | void temporary_destructor_only() | +| ir.cpp:1397:24:1397:29 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | +| ir.cpp:1398:37:1398:42 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected index 1c41692bcaad..136f7a44a647 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected @@ -21,6 +21,15 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +| ir.cpp:1401:45:1401:45 | FieldAddress: y | FieldAddress instruction 'FieldAddress: y' has an object address operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | +thisArgumentIsNonPointer +| ir.cpp:1373:14:1373:18 | Call: call to c_str | Call instruction 'Call: call to c_str' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1365:6:1365:21 | void temporary_string() | void temporary_string() | +| ir.cpp:1374:27:1374:31 | Call: call to c_str | Call instruction 'Call: call to c_str' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1365:6:1365:21 | void temporary_string() | void temporary_string() | +| ir.cpp:1385:23:1385:28 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1379:6:1379:30 | void temporary_destructor_only() | void temporary_destructor_only() | +| ir.cpp:1386:36:1386:41 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1379:6:1379:30 | void temporary_destructor_only() | void temporary_destructor_only() | +| ir.cpp:1397:24:1397:29 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | +| ir.cpp:1398:37:1398:42 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index 1712770c8eef..8762c2ad9951 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -1328,7 +1328,7 @@ T defaultConstruct() { } class constructor_only { -private: +public: int x; public: @@ -1336,7 +1336,7 @@ class constructor_only { }; class copy_constructor { -private: +public: int y; public: @@ -1396,8 +1396,9 @@ void temporary_copy_constructor() { acceptValue(d); copy_constructor().method(); returnValue().method(); - defaultConstruct(); + + int y = returnValue().y; } // semmle-extractor-options: -std=c++17 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index 1c41692bcaad..136f7a44a647 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -21,6 +21,15 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +| ir.cpp:1401:45:1401:45 | FieldAddress: y | FieldAddress instruction 'FieldAddress: y' has an object address operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | +thisArgumentIsNonPointer +| ir.cpp:1373:14:1373:18 | Call: call to c_str | Call instruction 'Call: call to c_str' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1365:6:1365:21 | void temporary_string() | void temporary_string() | +| ir.cpp:1374:27:1374:31 | Call: call to c_str | Call instruction 'Call: call to c_str' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1365:6:1365:21 | void temporary_string() | void temporary_string() | +| ir.cpp:1385:23:1385:28 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1379:6:1379:30 | void temporary_destructor_only() | void temporary_destructor_only() | +| ir.cpp:1386:36:1386:41 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1379:6:1379:30 | void temporary_destructor_only() | void temporary_destructor_only() | +| ir.cpp:1397:24:1397:29 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | +| ir.cpp:1398:37:1398:42 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 9aec94db78ad..8f6476a71c19 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -7733,13 +7733,22 @@ ir.cpp: # 1398| mu1398_9(unknown) = ^CallSideEffect : ~m? # 1398| v1398_10(void) = ^BufferReadSideEffect[-1] : &:r1398_6, ~m? # 1398| mu1398_11(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1398_6 -# 1400| r1400_1(glval) = VariableAddress[#temp1400:5] : -# 1400| r1400_2(glval) = FunctionAddress[defaultConstruct] : -# 1400| r1400_3(copy_constructor) = Call[defaultConstruct] : func:r1400_2 -# 1400| mu1400_4(unknown) = ^CallSideEffect : ~m? -# 1400| mu1400_5(copy_constructor) = Store[#temp1400:5] : &:r1400_1, r1400_3 -# 1400| r1400_6(copy_constructor) = Load[#temp1400:5] : &:r1400_1, ~m? -# 1401| v1401_1(void) = NoOp : +# 1399| r1399_1(glval) = VariableAddress[#temp1399:5] : +# 1399| r1399_2(glval) = FunctionAddress[defaultConstruct] : +# 1399| r1399_3(copy_constructor) = Call[defaultConstruct] : func:r1399_2 +# 1399| mu1399_4(unknown) = ^CallSideEffect : ~m? +# 1399| mu1399_5(copy_constructor) = Store[#temp1399:5] : &:r1399_1, r1399_3 +# 1399| r1399_6(copy_constructor) = Load[#temp1399:5] : &:r1399_1, ~m? +# 1401| r1401_1(glval) = VariableAddress[y] : +# 1401| r1401_2(glval) = VariableAddress[#temp1401:13] : +# 1401| r1401_3(glval) = FunctionAddress[returnValue] : +# 1401| r1401_4(copy_constructor) = Call[returnValue] : func:r1401_3 +# 1401| mu1401_5(unknown) = ^CallSideEffect : ~m? +# 1401| mu1401_6(copy_constructor) = Store[#temp1401:13] : &:r1401_2, r1401_4 +# 1401| r1401_7(copy_constructor) = Load[#temp1401:13] : &:r1401_2, ~m? +# 1401| r1401_8(glval) = FieldAddress[y] : r1401_7 +# 1401| mu1401_9(int) = Store[y] : &:r1401_1, r1401_8 +# 1402| v1402_1(void) = NoOp : # 1391| v1391_4(void) = ReturnVoid : # 1391| v1391_5(void) = AliasedUse : ~m? # 1391| v1391_6(void) = ExitFunction : diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected index 1c41692bcaad..136f7a44a647 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected @@ -21,6 +21,15 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +| ir.cpp:1401:45:1401:45 | FieldAddress: y | FieldAddress instruction 'FieldAddress: y' has an object address operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | +thisArgumentIsNonPointer +| ir.cpp:1373:14:1373:18 | Call: call to c_str | Call instruction 'Call: call to c_str' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1365:6:1365:21 | void temporary_string() | void temporary_string() | +| ir.cpp:1374:27:1374:31 | Call: call to c_str | Call instruction 'Call: call to c_str' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1365:6:1365:21 | void temporary_string() | void temporary_string() | +| ir.cpp:1385:23:1385:28 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1379:6:1379:30 | void temporary_destructor_only() | void temporary_destructor_only() | +| ir.cpp:1386:36:1386:41 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1379:6:1379:30 | void temporary_destructor_only() | void temporary_destructor_only() | +| ir.cpp:1397:24:1397:29 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | +| ir.cpp:1398:37:1398:42 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected index 1c41692bcaad..136f7a44a647 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected @@ -21,6 +21,15 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +| ir.cpp:1401:45:1401:45 | FieldAddress: y | FieldAddress instruction 'FieldAddress: y' has an object address operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | +thisArgumentIsNonPointer +| ir.cpp:1373:14:1373:18 | Call: call to c_str | Call instruction 'Call: call to c_str' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1365:6:1365:21 | void temporary_string() | void temporary_string() | +| ir.cpp:1374:27:1374:31 | Call: call to c_str | Call instruction 'Call: call to c_str' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1365:6:1365:21 | void temporary_string() | void temporary_string() | +| ir.cpp:1385:23:1385:28 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1379:6:1379:30 | void temporary_destructor_only() | void temporary_destructor_only() | +| ir.cpp:1386:36:1386:41 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1379:6:1379:30 | void temporary_destructor_only() | void temporary_destructor_only() | +| ir.cpp:1397:24:1397:29 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | +| ir.cpp:1398:37:1398:42 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency.expected index 1c41692bcaad..31e5b01229ce 100644 --- a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency.expected @@ -21,6 +21,8 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +thisArgumentIsNonPointer missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency_unsound.expected index 1c41692bcaad..31e5b01229ce 100644 --- a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency_unsound.expected @@ -21,6 +21,8 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +thisArgumentIsNonPointer missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_consistency.expected index 1c41692bcaad..31e5b01229ce 100644 --- a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_consistency.expected @@ -21,6 +21,8 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +thisArgumentIsNonPointer missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_consistency_unsound.expected index 1c41692bcaad..31e5b01229ce 100644 --- a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_consistency_unsound.expected @@ -21,6 +21,8 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +thisArgumentIsNonPointer missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected index 0b6512a5496a..15e49281e358 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected @@ -94,6 +94,15 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +thisArgumentIsNonPointer +| conditional_destructors.cpp:30:15:30:15 | Call: call to operator== | Call instruction 'Call: call to operator==' has a `this` argument operand that is not an address, in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | +| conditional_destructors.cpp:33:15:33:15 | Call: call to operator== | Call instruction 'Call: call to operator==' has a `this` argument operand that is not an address, in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | +| conditional_destructors.cpp:39:15:39:15 | Call: call to operator== | Call instruction 'Call: call to operator==' has a `this` argument operand that is not an address, in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | +| conditional_destructors.cpp:42:15:42:15 | Call: call to operator== | Call instruction 'Call: call to operator==' has a `this` argument operand that is not an address, in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | +| pmcallexpr.cpp:8:2:8:15 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | array_delete.cpp:5:6:5:6 | void f() | void f() | +| pointer_to_member.cpp:23:5:23:54 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) | +| pointer_to_member.cpp:24:5:24:49 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) | missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected index 54ac1cd96bc7..d8adc07b58fc 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected @@ -149,6 +149,21 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +| misc.c:220:9:223:3 | FieldAddress: {...} | FieldAddress instruction 'FieldAddress: {...}' has an object address operand that is not an address, in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) | +| misc.c:220:9:223:3 | FieldAddress: {...} | FieldAddress instruction 'FieldAddress: {...}' has an object address operand that is not an address, in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) | +thisArgumentIsNonPointer +| condition_decls.cpp:16:15:16:15 | Call: call to operator int | Call instruction 'Call: call to operator int' has a `this` argument operand that is not an address, in function '$@'. | condition_decls.cpp:15:6:15:17 | void if_decl_bind(int) | void if_decl_bind(int) | +| condition_decls.cpp:26:19:26:19 | Call: call to operator int | Call instruction 'Call: call to operator int' has a `this` argument operand that is not an address, in function '$@'. | condition_decls.cpp:25:6:25:21 | void switch_decl_bind(int) | void switch_decl_bind(int) | +| condition_decls.cpp:41:18:41:18 | Call: call to operator int | Call instruction 'Call: call to operator int' has a `this` argument operand that is not an address, in function '$@'. | condition_decls.cpp:40:6:40:20 | void while_decl_bind(int) | void while_decl_bind(int) | +| condition_decls.cpp:48:48:48:48 | Call: call to operator int | Call instruction 'Call: call to operator int' has a `this` argument operand that is not an address, in function '$@'. | condition_decls.cpp:47:6:47:18 | void for_decl_bind(int) | void for_decl_bind(int) | +| conditional_destructors.cpp:30:15:30:15 | Call: call to operator== | Call instruction 'Call: call to operator==' has a `this` argument operand that is not an address, in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | +| conditional_destructors.cpp:33:15:33:15 | Call: call to operator== | Call instruction 'Call: call to operator==' has a `this` argument operand that is not an address, in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | +| conditional_destructors.cpp:39:15:39:15 | Call: call to operator== | Call instruction 'Call: call to operator==' has a `this` argument operand that is not an address, in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | +| conditional_destructors.cpp:42:15:42:15 | Call: call to operator== | Call instruction 'Call: call to operator==' has a `this` argument operand that is not an address, in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | +| pmcallexpr.cpp:8:2:8:15 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | array_delete.cpp:5:6:5:6 | void f() | void f() | +| pointer_to_member.cpp:23:5:23:54 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) | +| pointer_to_member.cpp:24:5:24:49 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) | missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected index 124fe8fe6963..84ce9b03412f 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected @@ -94,6 +94,15 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +thisArgumentIsNonPointer +| conditional_destructors.cpp:30:15:30:15 | Call: call to operator== | Call instruction 'Call: call to operator==' has a `this` argument operand that is not an address, in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | +| conditional_destructors.cpp:33:15:33:15 | Call: call to operator== | Call instruction 'Call: call to operator==' has a `this` argument operand that is not an address, in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | +| conditional_destructors.cpp:39:15:39:15 | Call: call to operator== | Call instruction 'Call: call to operator==' has a `this` argument operand that is not an address, in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | +| conditional_destructors.cpp:42:15:42:15 | Call: call to operator== | Call instruction 'Call: call to operator==' has a `this` argument operand that is not an address, in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | +| pmcallexpr.cpp:8:2:8:15 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | array_delete.cpp:5:6:5:6 | void f() | void f() | +| pointer_to_member.cpp:23:5:23:54 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) | +| pointer_to_member.cpp:24:5:24:49 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) | missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/csharp/ql/src/experimental/ir/implementation/raw/IRConsistency.qll b/csharp/ql/src/experimental/ir/implementation/raw/IRConsistency.qll index 6a87b9b4b5fd..f331f4c87bf3 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/IRConsistency.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/IRConsistency.qll @@ -494,4 +494,34 @@ module InstructionConsistency { irFunc = getInstructionIRFunction(instr, irFuncText) ) } + + /** + * Holds if the object address operand for the given `FieldAddress` instruction does not have an + * address type. + */ + query predicate fieldAddressOnNonPointer( + FieldAddressInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText + ) { + not instr.getObjectAddressOperand().getIRType() instanceof IRAddressType and + message = + "FieldAddress instruction '" + instr.toString() + + "' has an object address operand that is not an address, in function '$@'." and + irFunc = getInstructionIRFunction(instr, irFuncText) + } + + /** + * Holds if the `this` argument operand for the given `Call` instruction does not have an address + * type. + */ + query predicate thisArgumentIsNonPointer( + CallInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText + ) { + exists(ThisArgumentOperand thisOperand | thisOperand = instr.getThisArgumentOperand() | + not thisOperand.getIRType() instanceof IRAddressType + ) and + message = + "Call instruction '" + instr.toString() + + "' has a `this` argument operand that is not an address, in function '$@'." and + irFunc = getInstructionIRFunction(instr, irFuncText) + } } diff --git a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRConsistency.qll b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRConsistency.qll index 6a87b9b4b5fd..f331f4c87bf3 100644 --- a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRConsistency.qll +++ b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRConsistency.qll @@ -494,4 +494,34 @@ module InstructionConsistency { irFunc = getInstructionIRFunction(instr, irFuncText) ) } + + /** + * Holds if the object address operand for the given `FieldAddress` instruction does not have an + * address type. + */ + query predicate fieldAddressOnNonPointer( + FieldAddressInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText + ) { + not instr.getObjectAddressOperand().getIRType() instanceof IRAddressType and + message = + "FieldAddress instruction '" + instr.toString() + + "' has an object address operand that is not an address, in function '$@'." and + irFunc = getInstructionIRFunction(instr, irFuncText) + } + + /** + * Holds if the `this` argument operand for the given `Call` instruction does not have an address + * type. + */ + query predicate thisArgumentIsNonPointer( + CallInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText + ) { + exists(ThisArgumentOperand thisOperand | thisOperand = instr.getThisArgumentOperand() | + not thisOperand.getIRType() instanceof IRAddressType + ) and + message = + "Call instruction '" + instr.toString() + + "' has a `this` argument operand that is not an address, in function '$@'." and + irFunc = getInstructionIRFunction(instr, irFuncText) + } } diff --git a/csharp/ql/test/experimental/ir/ir/raw_ir_consistency.expected b/csharp/ql/test/experimental/ir/ir/raw_ir_consistency.expected index 5d16b01eaca5..b2f9c0da1607 100644 --- a/csharp/ql/test/experimental/ir/ir/raw_ir_consistency.expected +++ b/csharp/ql/test/experimental/ir/ir/raw_ir_consistency.expected @@ -21,6 +21,16 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +| inoutref.cs:18:9:18:13 | FieldAddress: access to field fld | FieldAddress instruction 'FieldAddress: access to field fld' has an object address operand that is not an address, in function '$@'. | inoutref.cs:16:17:16:17 | System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) | System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) | +| inoutref.cs:19:13:19:17 | FieldAddress: access to field fld | FieldAddress instruction 'FieldAddress: access to field fld' has an object address operand that is not an address, in function '$@'. | inoutref.cs:16:17:16:17 | System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) | System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) | +| pointers.cs:35:17:35:24 | FieldAddress: access to field fld | FieldAddress instruction 'FieldAddress: access to field fld' has an object address operand that is not an address, in function '$@'. | pointers.cs:25:17:25:20 | System.Void Pointers.Main() | System.Void Pointers.Main() | +thisArgumentIsNonPointer +| foreach.cs:7:9:10:9 | Call: foreach (... ... in ...) ... | Call instruction 'Call: foreach (... ... in ...) ...' has a `this` argument operand that is not an address, in function '$@'. | foreach.cs:4:24:4:27 | System.Void ForEach.Main() | System.Void ForEach.Main() | +| foreach.cs:7:9:10:9 | Call: foreach (... ... in ...) ... | Call instruction 'Call: foreach (... ... in ...) ...' has a `this` argument operand that is not an address, in function '$@'. | foreach.cs:4:24:4:27 | System.Void ForEach.Main() | System.Void ForEach.Main() | +| foreach.cs:7:9:10:9 | Call: foreach (... ... in ...) ... | Call instruction 'Call: foreach (... ... in ...) ...' has a `this` argument operand that is not an address, in function '$@'. | foreach.cs:4:24:4:27 | System.Void ForEach.Main() | System.Void ForEach.Main() | +| inoutref.cs:32:22:32:35 | Call: object creation of type MyStruct | Call instruction 'Call: object creation of type MyStruct' has a `this` argument operand that is not an address, in function '$@'. | inoutref.cs:29:17:29:20 | System.Void InOutRef.Main() | System.Void InOutRef.Main() | +| pointers.cs:27:22:27:35 | Call: object creation of type MyStruct | Call instruction 'Call: object creation of type MyStruct' has a `this` argument operand that is not an address, in function '$@'. | pointers.cs:25:17:25:20 | System.Void Pointers.Main() | System.Void Pointers.Main() | missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/csharp/ql/test/experimental/ir/ir/unaliased_ssa_consistency.expected b/csharp/ql/test/experimental/ir/ir/unaliased_ssa_consistency.expected index 5d16b01eaca5..b2f9c0da1607 100644 --- a/csharp/ql/test/experimental/ir/ir/unaliased_ssa_consistency.expected +++ b/csharp/ql/test/experimental/ir/ir/unaliased_ssa_consistency.expected @@ -21,6 +21,16 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +| inoutref.cs:18:9:18:13 | FieldAddress: access to field fld | FieldAddress instruction 'FieldAddress: access to field fld' has an object address operand that is not an address, in function '$@'. | inoutref.cs:16:17:16:17 | System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) | System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) | +| inoutref.cs:19:13:19:17 | FieldAddress: access to field fld | FieldAddress instruction 'FieldAddress: access to field fld' has an object address operand that is not an address, in function '$@'. | inoutref.cs:16:17:16:17 | System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) | System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) | +| pointers.cs:35:17:35:24 | FieldAddress: access to field fld | FieldAddress instruction 'FieldAddress: access to field fld' has an object address operand that is not an address, in function '$@'. | pointers.cs:25:17:25:20 | System.Void Pointers.Main() | System.Void Pointers.Main() | +thisArgumentIsNonPointer +| foreach.cs:7:9:10:9 | Call: foreach (... ... in ...) ... | Call instruction 'Call: foreach (... ... in ...) ...' has a `this` argument operand that is not an address, in function '$@'. | foreach.cs:4:24:4:27 | System.Void ForEach.Main() | System.Void ForEach.Main() | +| foreach.cs:7:9:10:9 | Call: foreach (... ... in ...) ... | Call instruction 'Call: foreach (... ... in ...) ...' has a `this` argument operand that is not an address, in function '$@'. | foreach.cs:4:24:4:27 | System.Void ForEach.Main() | System.Void ForEach.Main() | +| foreach.cs:7:9:10:9 | Call: foreach (... ... in ...) ... | Call instruction 'Call: foreach (... ... in ...) ...' has a `this` argument operand that is not an address, in function '$@'. | foreach.cs:4:24:4:27 | System.Void ForEach.Main() | System.Void ForEach.Main() | +| inoutref.cs:32:22:32:35 | Call: object creation of type MyStruct | Call instruction 'Call: object creation of type MyStruct' has a `this` argument operand that is not an address, in function '$@'. | inoutref.cs:29:17:29:20 | System.Void InOutRef.Main() | System.Void InOutRef.Main() | +| pointers.cs:27:22:27:35 | Call: object creation of type MyStruct | Call instruction 'Call: object creation of type MyStruct' has a `this` argument operand that is not an address, in function '$@'. | pointers.cs:25:17:25:20 | System.Void Pointers.Main() | System.Void Pointers.Main() | missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType From 4ba281731c05a4cf98469edf3e5409584ab10e27 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Tue, 20 Oct 2020 12:53:47 -0400 Subject: [PATCH 33/53] Fix IR generation for member access with a prvalue on the RHS For historical reasons, the extractor marks the temporary object expression used as the qualifier of a member access as a prvalue(load), even though the current C++ standard says that the temporary object materialization results in a glvalue. Added some special handling to ignore the load for both field accesses and member function calls. This fixes all of the consistency failures in our regular tests, and all of the related failures in `syntax-zoo` other than the ones that deal with pointers-to-member, which aren't really supported yet anyway. --- .../raw/internal/TranslatedElement.qll | 38 +++++++++- .../raw/internal/TranslatedExpr.qll | 8 ++ .../ir/ir/raw_consistency.expected | 7 -- .../test/library-tests/ir/ir/raw_ir.expected | 75 +++++++++---------- .../ir/ir/unaliased_ssa_consistency.expected | 7 -- ...unaliased_ssa_consistency_unsound.expected | 7 -- .../aliased_ssa_consistency.expected | 4 - .../syntax-zoo/raw_consistency.expected | 8 -- .../unaliased_ssa_consistency.expected | 4 - 9 files changed, 76 insertions(+), 82 deletions(-) diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll index b52eda252a81..3721a9a062be 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll @@ -234,15 +234,45 @@ private predicate usedAsCondition(Expr expr) { * AST as an lvalue-to-rvalue conversion, but the IR represents both a function * lvalue and a function pointer prvalue the same. */ -private predicate ignoreLoad(Expr expr) { +predicate ignoreLoad(Expr expr) { expr.hasLValueToRValueConversion() and ( - expr instanceof ThisExpr or - expr instanceof FunctionAccess or + expr instanceof ThisExpr + or + expr instanceof FunctionAccess + or expr.(PointerDereferenceExpr).getOperand().getFullyConverted().getType().getUnspecifiedType() - instanceof FunctionPointerType or + instanceof FunctionPointerType + or expr.(ReferenceDereferenceExpr).getExpr().getType().getUnspecifiedType() instanceof FunctionReferenceType + or + // The extractor represents the qualifier of a field access or member function call as a load of + // the temporary object if the original qualifier was a prvalue. For IR purposes, we always want + // to use the address of the temporary object as the base of a field access or the `this` + // argument to a member function call. + exists(Expr qualifier | + exists(FieldAccess access | qualifier = access.getQualifier().getFullyConverted()) + or + exists(Call call | qualifier = call.getQualifier().getFullyConverted()) + | + // The qualifier has a class type. + qualifier.getUnspecifiedType() instanceof Class and + ( + expr = qualifier + or + // If the qualifier is a prvalue adjustment conversion, the load will be on the operand of + // that conversion. For example: + // ```c++ + // std::string("s").c_str(); + // ``` + // The temporary object for the qualifier is a prvalue(load) of type `std::string`, but the + // actual fully converted qualifier of the call to `c_str()` is a prvalue adjustment + // conversion that converts the type to `const std::string` to match the type of the `this` + // pointer of the member function. + expr = qualifier.(PrvalueAdjustmentConversion).getExpr() + ) + ) ) } diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll index 18d0518e7fa9..fe7ddec688e4 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll @@ -997,6 +997,14 @@ class TranslatedSimpleConversion extends TranslatedSingleInstructionConversion { } override Opcode getOpcode() { result instanceof Opcode::Convert } + + override predicate isResultGLValue() { + super.isResultGLValue() + or + // If this is a prvalue adjustment, the result is a treated as a glvalue if the source was also + // treated as a glvalue. See the comment in `ignoreLoad()` for more details. + expr instanceof PrvalueAdjustmentConversion and ignoreLoad(expr.getExpr()) + } } /** diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index 136f7a44a647..31e5b01229ce 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -22,14 +22,7 @@ wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer -| ir.cpp:1401:45:1401:45 | FieldAddress: y | FieldAddress instruction 'FieldAddress: y' has an object address operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | thisArgumentIsNonPointer -| ir.cpp:1373:14:1373:18 | Call: call to c_str | Call instruction 'Call: call to c_str' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1365:6:1365:21 | void temporary_string() | void temporary_string() | -| ir.cpp:1374:27:1374:31 | Call: call to c_str | Call instruction 'Call: call to c_str' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1365:6:1365:21 | void temporary_string() | void temporary_string() | -| ir.cpp:1385:23:1385:28 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1379:6:1379:30 | void temporary_destructor_only() | void temporary_destructor_only() | -| ir.cpp:1386:36:1386:41 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1379:6:1379:30 | void temporary_destructor_only() | void temporary_destructor_only() | -| ir.cpp:1397:24:1397:29 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | -| ir.cpp:1398:37:1398:42 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 8f6476a71c19..dca8b4097bfd 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -7564,25 +7564,23 @@ ir.cpp: # 1373| v1373_4(void) = Call[String] : func:r1373_3, this:r1373_1 # 1373| mu1373_5(unknown) = ^CallSideEffect : ~m? # 1373| mu1373_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r1373_1 -# 1373| r1373_7(String) = Load[#temp1373:5] : &:r1373_1, ~m? -# 1373| r1373_8(String) = Convert : r1373_7 -# 1373| r1373_9(glval) = FunctionAddress[c_str] : -# 1373| r1373_10(char *) = Call[c_str] : func:r1373_9, this:r1373_8 -# 1373| mu1373_11(unknown) = ^CallSideEffect : ~m? -# 1373| v1373_12(void) = ^BufferReadSideEffect[-1] : &:r1373_8, ~m? -# 1373| mu1373_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r1373_8 +# 1373| r1373_7(glval) = Convert : r1373_1 +# 1373| r1373_8(glval) = FunctionAddress[c_str] : +# 1373| r1373_9(char *) = Call[c_str] : func:r1373_8, this:r1373_7 +# 1373| mu1373_10(unknown) = ^CallSideEffect : ~m? +# 1373| v1373_11(void) = ^BufferReadSideEffect[-1] : &:r1373_7, ~m? +# 1373| mu1373_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r1373_7 # 1374| r1374_1(glval) = VariableAddress[#temp1374:5] : # 1374| r1374_2(glval) = FunctionAddress[returnValue] : # 1374| r1374_3(String) = Call[returnValue] : func:r1374_2 # 1374| mu1374_4(unknown) = ^CallSideEffect : ~m? # 1374| mu1374_5(String) = Store[#temp1374:5] : &:r1374_1, r1374_3 -# 1374| r1374_6(String) = Load[#temp1374:5] : &:r1374_1, ~m? -# 1374| r1374_7(String) = Convert : r1374_6 -# 1374| r1374_8(glval) = FunctionAddress[c_str] : -# 1374| r1374_9(char *) = Call[c_str] : func:r1374_8, this:r1374_7 -# 1374| mu1374_10(unknown) = ^CallSideEffect : ~m? -# 1374| v1374_11(void) = ^BufferReadSideEffect[-1] : &:r1374_7, ~m? -# 1374| mu1374_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r1374_7 +# 1374| r1374_6(glval) = Convert : r1374_1 +# 1374| r1374_7(glval) = FunctionAddress[c_str] : +# 1374| r1374_8(char *) = Call[c_str] : func:r1374_7, this:r1374_6 +# 1374| mu1374_9(unknown) = ^CallSideEffect : ~m? +# 1374| v1374_10(void) = ^BufferReadSideEffect[-1] : &:r1374_6, ~m? +# 1374| mu1374_11(String) = ^IndirectMayWriteSideEffect[-1] : &:r1374_6 # 1376| r1376_1(glval) = VariableAddress[#temp1376:5] : # 1376| r1376_2(glval) = FunctionAddress[defaultConstruct] : # 1376| r1376_3(String) = Call[defaultConstruct] : func:r1376_2 @@ -7634,23 +7632,21 @@ ir.cpp: # 1385| r1385_1(glval) = VariableAddress[#temp1385:5] : # 1385| r1385_2(destructor_only) = Constant[0] : # 1385| mu1385_3(destructor_only) = Store[#temp1385:5] : &:r1385_1, r1385_2 -# 1385| r1385_4(destructor_only) = Load[#temp1385:5] : &:r1385_1, ~m? -# 1385| r1385_5(glval) = FunctionAddress[method] : -# 1385| v1385_6(void) = Call[method] : func:r1385_5, this:r1385_4 -# 1385| mu1385_7(unknown) = ^CallSideEffect : ~m? -# 1385| v1385_8(void) = ^BufferReadSideEffect[-1] : &:r1385_4, ~m? -# 1385| mu1385_9(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1385_4 +# 1385| r1385_4(glval) = FunctionAddress[method] : +# 1385| v1385_5(void) = Call[method] : func:r1385_4, this:r1385_1 +# 1385| mu1385_6(unknown) = ^CallSideEffect : ~m? +# 1385| v1385_7(void) = ^BufferReadSideEffect[-1] : &:r1385_1, ~m? +# 1385| mu1385_8(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1385_1 # 1386| r1386_1(glval) = VariableAddress[#temp1386:5] : # 1386| r1386_2(glval) = FunctionAddress[returnValue] : # 1386| r1386_3(destructor_only) = Call[returnValue] : func:r1386_2 # 1386| mu1386_4(unknown) = ^CallSideEffect : ~m? # 1386| mu1386_5(destructor_only) = Store[#temp1386:5] : &:r1386_1, r1386_3 -# 1386| r1386_6(destructor_only) = Load[#temp1386:5] : &:r1386_1, ~m? -# 1386| r1386_7(glval) = FunctionAddress[method] : -# 1386| v1386_8(void) = Call[method] : func:r1386_7, this:r1386_6 -# 1386| mu1386_9(unknown) = ^CallSideEffect : ~m? -# 1386| v1386_10(void) = ^BufferReadSideEffect[-1] : &:r1386_6, ~m? -# 1386| mu1386_11(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1386_6 +# 1386| r1386_6(glval) = FunctionAddress[method] : +# 1386| v1386_7(void) = Call[method] : func:r1386_6, this:r1386_1 +# 1386| mu1386_8(unknown) = ^CallSideEffect : ~m? +# 1386| v1386_9(void) = ^BufferReadSideEffect[-1] : &:r1386_1, ~m? +# 1386| mu1386_10(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1386_1 # 1388| r1388_1(glval) = VariableAddress[#temp1388:5] : # 1388| r1388_2(glval) = FunctionAddress[defaultConstruct] : # 1388| r1388_3(destructor_only) = Call[defaultConstruct] : func:r1388_2 @@ -7716,23 +7712,21 @@ ir.cpp: # 1397| v1397_4(void) = Call[copy_constructor] : func:r1397_3, this:r1397_1 # 1397| mu1397_5(unknown) = ^CallSideEffect : ~m? # 1397| mu1397_6(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1397_1 -# 1397| r1397_7(copy_constructor) = Load[#temp1397:5] : &:r1397_1, ~m? -# 1397| r1397_8(glval) = FunctionAddress[method] : -# 1397| v1397_9(void) = Call[method] : func:r1397_8, this:r1397_7 -# 1397| mu1397_10(unknown) = ^CallSideEffect : ~m? -# 1397| v1397_11(void) = ^BufferReadSideEffect[-1] : &:r1397_7, ~m? -# 1397| mu1397_12(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1397_7 +# 1397| r1397_7(glval) = FunctionAddress[method] : +# 1397| v1397_8(void) = Call[method] : func:r1397_7, this:r1397_1 +# 1397| mu1397_9(unknown) = ^CallSideEffect : ~m? +# 1397| v1397_10(void) = ^BufferReadSideEffect[-1] : &:r1397_1, ~m? +# 1397| mu1397_11(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1397_1 # 1398| r1398_1(glval) = VariableAddress[#temp1398:5] : # 1398| r1398_2(glval) = FunctionAddress[returnValue] : # 1398| r1398_3(copy_constructor) = Call[returnValue] : func:r1398_2 # 1398| mu1398_4(unknown) = ^CallSideEffect : ~m? # 1398| mu1398_5(copy_constructor) = Store[#temp1398:5] : &:r1398_1, r1398_3 -# 1398| r1398_6(copy_constructor) = Load[#temp1398:5] : &:r1398_1, ~m? -# 1398| r1398_7(glval) = FunctionAddress[method] : -# 1398| v1398_8(void) = Call[method] : func:r1398_7, this:r1398_6 -# 1398| mu1398_9(unknown) = ^CallSideEffect : ~m? -# 1398| v1398_10(void) = ^BufferReadSideEffect[-1] : &:r1398_6, ~m? -# 1398| mu1398_11(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1398_6 +# 1398| r1398_6(glval) = FunctionAddress[method] : +# 1398| v1398_7(void) = Call[method] : func:r1398_6, this:r1398_1 +# 1398| mu1398_8(unknown) = ^CallSideEffect : ~m? +# 1398| v1398_9(void) = ^BufferReadSideEffect[-1] : &:r1398_1, ~m? +# 1398| mu1398_10(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1398_1 # 1399| r1399_1(glval) = VariableAddress[#temp1399:5] : # 1399| r1399_2(glval) = FunctionAddress[defaultConstruct] : # 1399| r1399_3(copy_constructor) = Call[defaultConstruct] : func:r1399_2 @@ -7745,9 +7739,8 @@ ir.cpp: # 1401| r1401_4(copy_constructor) = Call[returnValue] : func:r1401_3 # 1401| mu1401_5(unknown) = ^CallSideEffect : ~m? # 1401| mu1401_6(copy_constructor) = Store[#temp1401:13] : &:r1401_2, r1401_4 -# 1401| r1401_7(copy_constructor) = Load[#temp1401:13] : &:r1401_2, ~m? -# 1401| r1401_8(glval) = FieldAddress[y] : r1401_7 -# 1401| mu1401_9(int) = Store[y] : &:r1401_1, r1401_8 +# 1401| r1401_7(glval) = FieldAddress[y] : r1401_2 +# 1401| mu1401_8(int) = Store[y] : &:r1401_1, r1401_7 # 1402| v1402_1(void) = NoOp : # 1391| v1391_4(void) = ReturnVoid : # 1391| v1391_5(void) = AliasedUse : ~m? diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected index 136f7a44a647..31e5b01229ce 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected @@ -22,14 +22,7 @@ wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer -| ir.cpp:1401:45:1401:45 | FieldAddress: y | FieldAddress instruction 'FieldAddress: y' has an object address operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | thisArgumentIsNonPointer -| ir.cpp:1373:14:1373:18 | Call: call to c_str | Call instruction 'Call: call to c_str' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1365:6:1365:21 | void temporary_string() | void temporary_string() | -| ir.cpp:1374:27:1374:31 | Call: call to c_str | Call instruction 'Call: call to c_str' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1365:6:1365:21 | void temporary_string() | void temporary_string() | -| ir.cpp:1385:23:1385:28 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1379:6:1379:30 | void temporary_destructor_only() | void temporary_destructor_only() | -| ir.cpp:1386:36:1386:41 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1379:6:1379:30 | void temporary_destructor_only() | void temporary_destructor_only() | -| ir.cpp:1397:24:1397:29 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | -| ir.cpp:1398:37:1398:42 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected index 136f7a44a647..31e5b01229ce 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected @@ -22,14 +22,7 @@ wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer -| ir.cpp:1401:45:1401:45 | FieldAddress: y | FieldAddress instruction 'FieldAddress: y' has an object address operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | thisArgumentIsNonPointer -| ir.cpp:1373:14:1373:18 | Call: call to c_str | Call instruction 'Call: call to c_str' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1365:6:1365:21 | void temporary_string() | void temporary_string() | -| ir.cpp:1374:27:1374:31 | Call: call to c_str | Call instruction 'Call: call to c_str' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1365:6:1365:21 | void temporary_string() | void temporary_string() | -| ir.cpp:1385:23:1385:28 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1379:6:1379:30 | void temporary_destructor_only() | void temporary_destructor_only() | -| ir.cpp:1386:36:1386:41 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1379:6:1379:30 | void temporary_destructor_only() | void temporary_destructor_only() | -| ir.cpp:1397:24:1397:29 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | -| ir.cpp:1398:37:1398:42 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected index 15e49281e358..1fc131a4d79d 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected @@ -96,10 +96,6 @@ invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer thisArgumentIsNonPointer -| conditional_destructors.cpp:30:15:30:15 | Call: call to operator== | Call instruction 'Call: call to operator==' has a `this` argument operand that is not an address, in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:33:15:33:15 | Call: call to operator== | Call instruction 'Call: call to operator==' has a `this` argument operand that is not an address, in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:39:15:39:15 | Call: call to operator== | Call instruction 'Call: call to operator==' has a `this` argument operand that is not an address, in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| conditional_destructors.cpp:42:15:42:15 | Call: call to operator== | Call instruction 'Call: call to operator==' has a `this` argument operand that is not an address, in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | | pmcallexpr.cpp:8:2:8:15 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | array_delete.cpp:5:6:5:6 | void f() | void f() | | pointer_to_member.cpp:23:5:23:54 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) | | pointer_to_member.cpp:24:5:24:49 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) | diff --git a/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected index d8adc07b58fc..71badee0d5db 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected @@ -153,14 +153,6 @@ fieldAddressOnNonPointer | misc.c:220:9:223:3 | FieldAddress: {...} | FieldAddress instruction 'FieldAddress: {...}' has an object address operand that is not an address, in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) | | misc.c:220:9:223:3 | FieldAddress: {...} | FieldAddress instruction 'FieldAddress: {...}' has an object address operand that is not an address, in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) | thisArgumentIsNonPointer -| condition_decls.cpp:16:15:16:15 | Call: call to operator int | Call instruction 'Call: call to operator int' has a `this` argument operand that is not an address, in function '$@'. | condition_decls.cpp:15:6:15:17 | void if_decl_bind(int) | void if_decl_bind(int) | -| condition_decls.cpp:26:19:26:19 | Call: call to operator int | Call instruction 'Call: call to operator int' has a `this` argument operand that is not an address, in function '$@'. | condition_decls.cpp:25:6:25:21 | void switch_decl_bind(int) | void switch_decl_bind(int) | -| condition_decls.cpp:41:18:41:18 | Call: call to operator int | Call instruction 'Call: call to operator int' has a `this` argument operand that is not an address, in function '$@'. | condition_decls.cpp:40:6:40:20 | void while_decl_bind(int) | void while_decl_bind(int) | -| condition_decls.cpp:48:48:48:48 | Call: call to operator int | Call instruction 'Call: call to operator int' has a `this` argument operand that is not an address, in function '$@'. | condition_decls.cpp:47:6:47:18 | void for_decl_bind(int) | void for_decl_bind(int) | -| conditional_destructors.cpp:30:15:30:15 | Call: call to operator== | Call instruction 'Call: call to operator==' has a `this` argument operand that is not an address, in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:33:15:33:15 | Call: call to operator== | Call instruction 'Call: call to operator==' has a `this` argument operand that is not an address, in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:39:15:39:15 | Call: call to operator== | Call instruction 'Call: call to operator==' has a `this` argument operand that is not an address, in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| conditional_destructors.cpp:42:15:42:15 | Call: call to operator== | Call instruction 'Call: call to operator==' has a `this` argument operand that is not an address, in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | | pmcallexpr.cpp:8:2:8:15 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | array_delete.cpp:5:6:5:6 | void f() | void f() | | pointer_to_member.cpp:23:5:23:54 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) | | pointer_to_member.cpp:24:5:24:49 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) | diff --git a/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected index 84ce9b03412f..08cff6136b13 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected @@ -96,10 +96,6 @@ invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer thisArgumentIsNonPointer -| conditional_destructors.cpp:30:15:30:15 | Call: call to operator== | Call instruction 'Call: call to operator==' has a `this` argument operand that is not an address, in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:33:15:33:15 | Call: call to operator== | Call instruction 'Call: call to operator==' has a `this` argument operand that is not an address, in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:39:15:39:15 | Call: call to operator== | Call instruction 'Call: call to operator==' has a `this` argument operand that is not an address, in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| conditional_destructors.cpp:42:15:42:15 | Call: call to operator== | Call instruction 'Call: call to operator==' has a `this` argument operand that is not an address, in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | | pmcallexpr.cpp:8:2:8:15 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | array_delete.cpp:5:6:5:6 | void f() | void f() | | pointer_to_member.cpp:23:5:23:54 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) | | pointer_to_member.cpp:24:5:24:49 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) | From 8c8daa38ecb4ac1fd7c18370addbb33b42feaac0 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Tue, 20 Oct 2020 13:41:52 -0400 Subject: [PATCH 34/53] Update stats --- cpp/ql/src/semmlecode.cpp.dbscheme.stats | 7505 +++++++++++----------- 1 file changed, 3717 insertions(+), 3788 deletions(-) diff --git a/cpp/ql/src/semmlecode.cpp.dbscheme.stats b/cpp/ql/src/semmlecode.cpp.dbscheme.stats index eb699cba62e0..61a31212bfa0 100644 --- a/cpp/ql/src/semmlecode.cpp.dbscheme.stats +++ b/cpp/ql/src/semmlecode.cpp.dbscheme.stats @@ -1,7 +1,7 @@ @compilation -9552 +9440 @externalDataElement @@ -9,7 +9,7 @@ @duplication -185064 +185333 @similarity @@ -17,7 +17,7 @@ @external_package -120 +119 @svnentry @@ -25,67 +25,67 @@ @location_default -8813832 +8719593 @location_stmt -2176409 +2179578 @location_expr -9755082 +9756708 @diagnostic -68699 +67893 @file -60023 +59320 @folder -10945 +10817 @macroinvocation -35580051 +34675701 @function -3468314 +3658482 @fun_decl -3540621 +3730234 @var_decl -5360115 +5296821 @type_decl -1332162 +1316547 @namespace_decl -136871 +135267 @using -291444 +287692 @static_assert -130658 +130452 @parameter -4627983 +4572935 @membervariable -305691 +302107 @globalvariable @@ -93,59 +93,59 @@ @localvariable -521215 +520392 @enumconstant -93839 +93691 @builtintype -515 +509 @derivedtype -4463123 +4408457 @decltype -47005 +46454 @usertype -4193942 +4144306 @mangledname -483689 +478020 @type_mention -1677532 +1674881 @routinetype -430487 +421539 @ptrtomember -12634 +12486 @specifier -504 +498 @gnuattribute -413727 +414234 @stdattribute -364 +363 @declspec -57827 +57736 @msattribute @@ -153,7 +153,7 @@ @alignas -1743 +1723 @attribute_arg_empty @@ -161,11 +161,11 @@ @attribute_arg_token -15725 +15700 @attribute_arg_constant -146275 +146454 @attribute_arg_type @@ -173,19 +173,19 @@ @derivation -390270 +385706 @frienddecl -240347 +237444 @comment -1580341 +1561817 @namespace -7688 +7597 @specialnamequalifyingelement @@ -193,19 +193,19 @@ @namequalifier -1114410 +1119060 @value -8774612 +8774622 @initialiser -1664806 +1662175 @errorexpr -48716 +48145 @address_of @@ -213,15 +213,15 @@ @reference_to -1057914 +1045861 @indirect -294271 +294699 @ref_indirect -1253867 +1239321 @array_to_pointer @@ -229,15 +229,15 @@ @vacuous_destructor_call -5121 +5061 @assume -3285 +3280 @parexpr -2996445 +3000807 @arithnegexpr @@ -245,15 +245,15 @@ @unaryplusexpr -186 +184 @complementexpr -27992 +28032 @notexpr -337994 +338408 @conjugation @@ -269,43 +269,43 @@ @postincrexpr -42985 +43048 @postdecrexpr -5394 +5402 @preincrexpr -62524 +61791 @predecrexpr -24797 +24506 @conditionalexpr -154261 +154485 @addexpr -246477 +246779 @subexpr -134811 +135008 @mulexpr -140469 +140641 @divexpr -63654 +63732 @remexpr -4533 +4539 @jmulexpr @@ -333,59 +333,59 @@ @paddexpr -87143 +87270 @psubexpr -21943 +21970 @pdiffexpr -25082 +24788 @lshiftexpr -350147 +350576 @rshiftexpr -71701 +71789 @andexpr -257683 +257998 @orexpr -143371 +143145 @xorexpr -37259 +37313 @eqexpr -212356 +212665 @neexpr -88346 +88475 @gtexpr -43881 +43945 @ltexpr -51732 +51329 @geexpr -22333 +22366 @leexpr -213633 +213944 @minexpr @@ -397,7 +397,7 @@ @assignexpr -550951 +551753 @assignaddexpr @@ -409,19 +409,19 @@ @assignmulexpr -6909 +6828 @assigndivexpr -2072 +2048 @assignremexpr -274 +270 @assignlshiftexpr -597 +598 @assignrshiftexpr @@ -429,39 +429,39 @@ @assignandexpr -7182 +7190 @assignorexpr -17554 +17576 @assignxorexpr -21965 +21997 @assignpaddexpr -13045 +13024 @assignpsubexpr -576 +577 @andlogicalexpr -130795 +130955 @orlogicalexpr -74561 +74652 @commaexpr -10726 +10611 @subscriptexpr -165977 +166218 @virtfunptrexpr @@ -469,19 +469,19 @@ @callexpr -226781 +224123 @vastartexpr -3663 +3657 @vaargexpr -987 +975 @vaendexpr -490 +491 @vacopyexpr @@ -489,63 +489,63 @@ @varaccess -5318202 +5309798 @thisaccess -1167110 +1165266 @new_expr -32134 +31757 @delete_expr -5966 +5896 @throw_expr -22318 +22056 @condition_decl -7008 +6947 @braced_init_list -120 +119 @type_id -4419 +4368 @runtime_sizeof -278884 +279225 @runtime_alignof -1558 +1561 @sizeof_pack -471 +466 @expr_stmt -156383 +156574 @routineexpr -2265785 +2239747 @type_operand -123307 +123457 @offsetofexpr -33600 +33641 @hasassignexpr @@ -593,7 +593,7 @@ @isbaseofexpr -39 +38 @isclassexpr @@ -605,7 +605,7 @@ @isemptyexpr -164 +162 @isenumexpr @@ -613,7 +613,7 @@ @ispodexpr -603 +596 @ispolyexpr @@ -625,7 +625,7 @@ @typescompexpr -44853 +44908 @intaddrexpr @@ -633,27 +633,27 @@ @hastrivialdestructor -109 +108 @literal -4380627 +4380637 @uuidof -845 +844 @aggregateliteral -915581 +915561 @delete_array_expr -1348 +1333 @new_array_expr -5296 +5287 @foldexpr @@ -661,47 +661,47 @@ @ctordirectinit -90194 +89137 @ctorvirtualinit -6229 +6156 @ctorfieldinit -196051 +193753 @ctordelegatinginit -734 +726 @dtordirectdestruct -29140 +28798 @dtorvirtualdestruct -2434 +2406 @dtorfielddestruct -29907 +29557 @static_cast -214761 +212243 @reinterpret_cast -30807 +30758 @const_cast -5308 +5245 @dynamic_cast -987 +975 @c_style_cast @@ -709,15 +709,15 @@ @lambdaexpr -12680 +12660 @param_ref -85895 +84888 @noopexpr -39 +38 @istriviallyconstructibleexpr @@ -753,7 +753,7 @@ @istriviallycopyableexpr -2357 +2330 @isliteraltypeexpr @@ -813,11 +813,11 @@ @isfinalexpr -164 +162 @noexceptexpr -17525 +17320 @builtinshufflevector @@ -825,11 +825,11 @@ @builtinchooseexpr -7396 +7405 @builtinaddressof -3970 +3923 @vec_fill @@ -856,68 +856,72 @@ 1 +@temp_init +241259 + + @lambdacapture -21652 +21618 @stmt_expr -1269727 +1267720 @stmt_if -523910 +524673 @stmt_while -30993 +30641 @stmt_goto -111306 +111468 @stmt_label -81478 +81577 @stmt_return -1130211 +1116898 @stmt_block -1325121 +1309643 @stmt_end_test_while -149713 +149931 @stmt_for -32153 +32103 @stmt_switch_case -271389 +271721 @stmt_switch -53243 +53308 @stmt_asm -241253 +241548 @stmt_try_block -17964 +17753 @stmt_microsoft_try -169 +168 @stmt_decl -613092 +605017 @stmt_set_vla_size @@ -929,19 +933,19 @@ @stmt_assigned_goto -9126 +9139 @stmt_empty -102356 +102194 @stmt_continue -8070 +8080 @stmt_break -223842 +224116 @stmt_range_based_for @@ -949,7 +953,7 @@ @stmt_handler -21646 +21612 @stmt_constexpr_if @@ -961,43 +965,43 @@ @ppd_if -156097 +154267 @ppd_ifdef -61087 +60371 @ppd_ifndef -83329 +82352 @ppd_elif -20629 +20387 @ppd_else -57665 +56990 @ppd_endif -300514 +296991 @ppd_plain_include -290764 +287356 @ppd_define -318073 +314344 @ppd_undef -19247 +19021 @ppd_line -12477 +12495 @ppd_error @@ -1005,7 +1009,7 @@ @ppd_pragma -36565 +36507 @ppd_objc_import @@ -1013,7 +1017,7 @@ @ppd_include_next -87 +86 @ppd_warning @@ -1021,7 +1025,7 @@ @link_target -581 +574 @xmldtd @@ -1050,11 +1054,11 @@ compilations -9552 +9440 id -9552 +9440 cwd @@ -1072,7 +1076,7 @@ 1 2 -9552 +9440 @@ -1098,11 +1102,11 @@ compilation_args -375669 +376128 id -4318 +4323 num @@ -1110,7 +1114,7 @@ arg -18602 +18625 @@ -1124,7 +1128,7 @@ 13 77 -323 +324 85 @@ -1134,7 +1138,7 @@ 89 90 -3198 +3202 90 @@ -1144,12 +1148,12 @@ 92 96 -266 +267 99 101 -297 +298 @@ -1165,7 +1169,7 @@ 13 77 -323 +324 82 @@ -1175,12 +1179,12 @@ 88 89 -3200 +3204 89 90 -157 +158 90 @@ -1358,12 +1362,12 @@ 1 2 -17701 +17722 2 2654 -901 +902 @@ -1379,12 +1383,12 @@ 1 2 -18264 +18286 2 55 -338 +339 @@ -1394,11 +1398,11 @@ compilation_compiling_files -9552 +9440 id -9552 +9440 num @@ -1406,7 +1410,7 @@ file -4847 +4790 @@ -1420,7 +1424,7 @@ 1 2 -9552 +9440 @@ -1436,7 +1440,7 @@ 1 2 -9552 +9440 @@ -1484,12 +1488,12 @@ 1 2 -274 +270 2 3 -4551 +4498 3 @@ -1510,7 +1514,7 @@ 1 2 -4847 +4790 @@ -1520,11 +1524,11 @@ compilation_time -38122 +37675 id -9530 +9418 num @@ -1536,7 +1540,7 @@ seconds -12700 +11868 @@ -1550,7 +1554,7 @@ 1 2 -9530 +9418 @@ -1566,7 +1570,7 @@ 4 5 -9530 +9418 @@ -1580,19 +1584,14 @@ 12 -2 -3 -21 - - 3 4 -2599 +2850 4 5 -6909 +6568 @@ -1638,8 +1637,8 @@ 12 -1158 -1159 +1095 +1096 10 @@ -1691,18 +1690,18 @@ 10 -13 -14 +12 +13 10 -590 -591 +579 +580 10 -694 -695 +647 +648 10 @@ -1719,22 +1718,22 @@ 1 2 -8653 +8053 2 3 -2588 +2254 3 5 -1074 +997 5 -629 -383 +632 +563 @@ -1750,7 +1749,7 @@ 1 2 -12700 +11868 @@ -1766,17 +1765,17 @@ 1 2 -11131 +10253 2 3 -1535 +1604 3 4 -32 +10 @@ -1786,15 +1785,15 @@ diagnostic_for -847112 +837183 diagnostic -68699 +67893 compilation -9223 +9115 file_number @@ -1802,7 +1801,7 @@ file_number_diagnostic_number -6503 +6427 @@ -1816,17 +1815,17 @@ 1 2 -9256 +9147 2 3 -56744 +56079 254 840 -2697 +2666 @@ -1842,7 +1841,7 @@ 1 2 -68699 +67893 @@ -1858,7 +1857,7 @@ 1 2 -68699 +67893 @@ -1879,27 +1878,27 @@ 7 8 -5812 +5744 8 9 -603 +596 247 248 -1864 +1842 263 444 -723 +715 446 594 -197 +195 @@ -1915,7 +1914,7 @@ 1 2 -9223 +9115 @@ -1936,27 +1935,27 @@ 7 8 -5812 +5744 8 9 -603 +596 247 248 -1864 +1842 263 444 -723 +715 446 594 -197 +195 @@ -2020,22 +2019,22 @@ 1 2 -2676 +2644 2 5 -581 +574 5 6 -954 +942 7 14 -515 +509 15 @@ -2045,22 +2044,22 @@ 17 18 -570 +563 18 23 -438 +433 26 40 -526 +520 42 842 -186 +184 @@ -2076,17 +2075,17 @@ 4 9 -559 +552 10 11 -954 +942 14 27 -515 +509 30 @@ -2096,32 +2095,32 @@ 34 35 -570 +563 36 45 -438 +433 52 79 -526 +520 84 85 -175 +173 254 255 -2621 +2590 309 842 -87 +86 @@ -2137,7 +2136,7 @@ 1 2 -6503 +6427 @@ -2147,19 +2146,19 @@ compilation_finished -9552 +9440 id -9552 +9440 cpu_seconds -8093 +7619 elapsed_seconds -219 +195 @@ -2173,7 +2172,7 @@ 1 2 -9552 +9440 @@ -2189,7 +2188,7 @@ 1 2 -9552 +9440 @@ -2205,17 +2204,17 @@ 1 2 -6931 +6449 2 3 -954 +856 3 -7 -208 +11 +314 @@ -2231,12 +2230,12 @@ 1 2 -7764 +7045 2 3 -329 +574 @@ -2255,18 +2254,13 @@ 54 -2 -3 -21 - - 3 4 -10 +21 -5 -6 +6 +7 10 @@ -2275,13 +2269,8 @@ 10 -9 -10 -10 - - -11 -12 +8 +9 10 @@ -2290,38 +2279,38 @@ 10 -41 -42 +26 +27 10 -46 -47 +34 +35 10 -47 -48 +124 +125 10 -86 -87 +125 +126 10 -157 -158 +140 +141 10 -183 -184 +174 +175 10 -250 -251 +199 +200 10 @@ -2341,18 +2330,13 @@ 54 -2 -3 -21 - - 3 4 -10 +21 -5 -6 +6 +7 10 @@ -2361,13 +2345,8 @@ 10 -9 -10 -10 - - -11 -12 +8 +9 10 @@ -2376,38 +2355,38 @@ 10 -40 -41 +26 +27 10 -44 -45 +34 +35 10 -46 -47 +95 +96 10 -73 -74 +106 +107 10 -150 -151 +118 +119 10 -164 -165 +148 +149 10 -190 -191 +180 +181 10 @@ -2418,7 +2397,7 @@ externalData -131 +130 id @@ -2434,7 +2413,7 @@ value -131 +130 @@ -2592,7 +2571,7 @@ 1 2 -131 +130 @@ -2608,7 +2587,7 @@ 1 2 -131 +130 @@ -2624,7 +2603,7 @@ 1 2 -131 +130 @@ -2656,19 +2635,19 @@ duplicateCode -185064 +185333 id -185064 +185333 relativePath -761 +762 equivClass -76489 +76600 @@ -2682,7 +2661,7 @@ 1 2 -185064 +185333 @@ -2698,7 +2677,7 @@ 1 2 -185064 +185333 @@ -2759,7 +2738,7 @@ 59 19902 -42 +43 @@ -2780,7 +2759,7 @@ 2 3 -128 +129 3 @@ -2826,32 +2805,32 @@ 1 2 -20437 +20466 2 3 -32595 +32642 3 4 -10691 +10706 4 5 -6008 +6017 5 9 -5947 +5955 9 11 -810 +811 @@ -2867,12 +2846,12 @@ 1 2 -75636 +75746 2 7 -853 +854 @@ -3178,31 +3157,31 @@ tokens -39551564 +39609146 id -278633 +279039 offset -21143 +21173 beginLine -784457 +785599 beginColumn -1301 +1303 endLine -784457 +785599 endColumn -1313 +1315 @@ -3216,72 +3195,72 @@ 100 101 -8561 +8573 101 102 -27556 +27596 102 105 -22609 +22642 105 108 -24457 +24492 108 111 -13735 +13755 111 114 -23782 +23816 114 116 -22622 +22655 116 124 -23628 +23663 124 132 -21615 +21647 132 154 -21357 +21388 154 186 -21265 +21296 186 202 -23389 +23423 202 416 -20909 +20940 416 3446 -3142 +3146 @@ -3297,52 +3276,52 @@ 4 5 -1399 +1401 5 6 -109618 +109777 6 7 -15380 +15402 7 8 -28360 +28401 8 12 -23597 +23632 12 17 -22738 +22771 17 19 -18872 +18899 19 22 -22763 +22796 22 28 -21376 +21407 28 151 -14526 +14548 @@ -3358,42 +3337,42 @@ 2 26 -22867 +22900 26 31 -22290 +22323 31 32 -2639 +2642 32 33 -163368 +163606 33 51 -21167 +21198 51 61 -22407 +22439 61 80 -21032 +21063 80 132 -2859 +2864 @@ -3409,52 +3388,52 @@ 4 5 -1399 +1401 5 6 -109618 +109777 6 7 -15380 +15402 7 8 -28360 +28401 8 12 -23597 +23632 12 17 -22738 +22771 17 19 -18872 +18899 19 22 -22763 +22796 22 28 -21376 +21407 28 151 -14526 +14548 @@ -3470,42 +3449,42 @@ 2 26 -21603 +21634 26 31 -24322 +24357 31 32 -1620 +1622 32 33 -163657 +163895 33 54 -21959 +21991 54 64 -22609 +22642 64 86 -21124 +21155 86 133 -1736 +1739 @@ -3521,57 +3500,57 @@ 2 3 -4553 +4560 4 5 -1337 +1339 6 7 -2589 +2593 8 9 -822 +823 11 12 -1607 +1610 13 23 -1853 +1856 24 62 -1620 +1622 64 130 -1644 +1647 141 250 -1595 +1598 251 982 -1589 +1591 986 45401 -1927 +1929 @@ -3587,62 +3566,62 @@ 2 3 -4553 +4560 4 5 -1337 +1339 6 7 -2589 +2593 8 9 -822 +823 11 12 -1607 +1610 13 23 -1853 +1856 24 62 -1620 +1622 64 130 -1644 +1647 141 246 -1595 +1598 247 964 -1589 +1591 969 32533 -1589 +1591 32544 33826 -337 +338 @@ -3658,52 +3637,52 @@ 1 2 -5891 +5900 2 3 -3412 +3417 3 4 -1607 +1610 4 7 -1884 +1886 7 12 -1835 +1837 12 15 -1632 +1634 15 23 -1595 +1598 23 68 -1607 +1610 68 161 -1589 +1591 161 171 -85 +86 @@ -3719,62 +3698,62 @@ 2 3 -4553 +4560 4 5 -1337 +1339 6 7 -2589 +2593 8 9 -822 +823 11 12 -1607 +1610 13 23 -1853 +1856 24 62 -1620 +1622 64 130 -1644 +1647 141 246 -1595 +1598 247 964 -1589 +1591 969 32533 -1589 +1591 32544 33826 -337 +338 @@ -3790,47 +3769,47 @@ 1 2 -5891 +5900 2 3 -3412 +3417 3 4 -1607 +1610 4 7 -1908 +1911 7 12 -1822 +1825 12 15 -1607 +1610 15 24 -1657 +1659 24 73 -1607 +1610 73 167 -1595 +1598 167 @@ -3851,37 +3830,37 @@ 1 2 -403447 +404035 2 3 -103002 +103152 3 4 -44213 +44277 4 6 -70443 +70546 6 8 -58378 +58462 8 13 -65883 +65979 13 138 -39088 +39145 @@ -3897,52 +3876,52 @@ 1 7 -64730 +64824 7 12 -64232 +64326 12 23 -60053 +60140 23 32 -36633 +36686 32 33 -266935 +267324 33 41 -62612 +62703 41 55 -61280 +61370 55 69 -61477 +61566 69 94 -59096 +59182 94 248 -47404 +47473 @@ -3958,47 +3937,47 @@ 1 5 -64325 +64418 5 9 -62575 +62667 9 15 -62956 +63048 15 29 -59777 +59864 29 32 -9212 +9225 32 33 -348862 +349370 33 37 -61747 +61837 37 42 -61458 +61548 42 122 -53541 +53619 @@ -4014,7 +3993,7 @@ 1 2 -784457 +785599 @@ -4030,47 +4009,47 @@ 1 5 -64202 +64295 5 9 -62557 +62648 9 15 -63085 +63177 15 29 -59679 +59765 29 32 -9212 +9225 32 33 -349862 +350372 33 37 -63447 +63539 37 43 -65221 +65316 43 123 -47189 +47258 @@ -4486,37 +4465,37 @@ 1 2 -403447 +404035 2 3 -103002 +103152 3 4 -44213 +44277 4 6 -70443 +70546 6 8 -58378 +58462 8 13 -65883 +65979 13 138 -39088 +39145 @@ -4532,52 +4511,52 @@ 1 7 -64730 +64824 7 12 -64232 +64326 12 23 -60053 +60140 23 32 -36633 +36686 32 33 -266935 +267324 33 41 -62612 +62703 41 55 -61280 +61370 55 69 -61477 +61566 69 94 -59096 +59182 94 248 -47404 +47473 @@ -4593,7 +4572,7 @@ 1 2 -784457 +785599 @@ -4609,47 +4588,47 @@ 1 5 -64325 +64418 5 9 -62575 +62667 9 15 -62956 +63048 15 29 -59777 +59864 29 32 -9212 +9225 32 33 -348862 +349370 33 37 -61747 +61837 37 42 -61458 +61548 42 122 -53541 +53619 @@ -4665,47 +4644,47 @@ 1 5 -64202 +64295 5 9 -62557 +62648 9 15 -63085 +63177 15 29 -59679 +59765 29 32 -9212 +9225 32 33 -349862 +350372 33 37 -63447 +63539 37 43 -65221 +65316 43 123 -47189 +47258 @@ -5095,11 +5074,11 @@ external_packages -120 +119 id -120 +119 namespace @@ -5107,11 +5086,11 @@ package_name -120 +119 version -120 +119 @@ -5125,7 +5104,7 @@ 1 2 -120 +119 @@ -5141,7 +5120,7 @@ 1 2 -120 +119 @@ -5157,7 +5136,7 @@ 1 2 -120 +119 @@ -5221,7 +5200,7 @@ 1 2 -120 +119 @@ -5237,7 +5216,7 @@ 1 2 -120 +119 @@ -5253,7 +5232,7 @@ 1 2 -120 +119 @@ -5269,7 +5248,7 @@ 1 2 -120 +119 @@ -5285,7 +5264,7 @@ 1 2 -120 +119 @@ -5301,7 +5280,7 @@ 1 2 -120 +119 @@ -5311,15 +5290,15 @@ header_to_external_package -8532 +8432 fileid -8532 +8432 package -120 +119 @@ -5333,7 +5312,7 @@ 1 2 -8532 +8432 @@ -6602,31 +6581,31 @@ locations_default -8813832 +8719593 id -8813832 +8719593 container -70969 +70137 startLine -150635 +148869 startColumn -5461 +5397 endLine -150460 +148696 endColumn -10627 +10502 @@ -6640,7 +6619,7 @@ 1 2 -8813832 +8719593 @@ -6656,7 +6635,7 @@ 1 2 -8813832 +8719593 @@ -6672,7 +6651,7 @@ 1 2 -8813832 +8719593 @@ -6688,7 +6667,7 @@ 1 2 -8813832 +8719593 @@ -6704,7 +6683,7 @@ 1 2 -8813832 +8719593 @@ -6720,62 +6699,62 @@ 1 2 -11526 +11391 2 19 -6097 +6026 19 25 -5483 +5419 25 31 -5516 +5451 31 41 -5823 +5755 41 54 -5527 +5462 54 72 -5604 +5538 72 99 -5417 +5354 99 137 -5384 +5321 137 220 -5330 +5267 220 430 -5330 +5267 430 20913 -3926 +3880 @@ -6791,62 +6770,62 @@ 1 2 -11526 +11391 2 15 -6010 +5939 15 20 -6141 +6069 20 25 -5549 +5484 25 32 -6097 +6026 32 41 -5681 +5614 41 53 -5724 +5657 53 71 -5593 +5527 71 99 -5450 +5386 99 158 -5330 +5267 158 351 -5363 +5300 351 9356 -2500 +2471 @@ -6862,62 +6841,62 @@ 1 2 -11526 +11391 2 4 -6010 +5939 4 8 -6547 +6470 8 11 -5395 +5332 11 14 -5779 +5712 14 18 -6251 +6178 18 23 -5757 +5690 23 29 -5834 +5766 29 37 -5692 +5625 37 50 -5670 +5603 50 78 -5384 +5321 78 168 -1118 +1105 @@ -6933,62 +6912,62 @@ 1 2 -11526 +11391 2 15 -5988 +5917 15 20 -6163 +6091 20 25 -5494 +5430 25 32 -6108 +6037 32 41 -5670 +5603 41 53 -5724 +5657 53 70 -5384 +5321 70 96 -5341 +5278 96 153 -5395 +5332 153 333 -5352 +5289 333 9356 -2818 +2785 @@ -7004,62 +6983,62 @@ 1 2 -11526 +11391 2 14 -5735 +5668 14 19 -6119 +6048 19 23 -5713 +5646 23 28 -6415 +6340 28 33 -5516 +5451 33 40 -5955 +5885 40 47 -5352 +5289 47 57 -5604 +5538 57 69 -5637 +5571 69 91 -5330 +5267 91 336 -2061 +2037 @@ -7075,52 +7054,52 @@ 1 2 -30850 +30489 2 3 -18030 +17818 3 4 -17953 +17742 4 5 -9717 +9603 5 7 -13709 +13548 7 9 -13412 +13255 9 13 -13204 +13049 13 32 -11570 +11434 32 -127 -11307 +128 +11185 -127 +128 6472 -10879 +10741 @@ -7136,42 +7115,42 @@ 1 2 -55658 +55006 2 3 -33439 +33047 3 4 -9903 +9787 4 5 -8433 +8334 5 8 -12908 +12757 8 27 -11493 +11358 27 123 -11340 +11207 123 6472 -7457 +7370 @@ -7187,52 +7166,52 @@ 1 2 -31958 +31584 2 3 -17865 +17656 3 4 -19795 +19563 4 5 -9585 +9473 5 7 -13917 +13754 7 9 -13829 +13667 9 13 -12711 +12562 13 27 -11482 +11348 27 62 -11351 +11218 62 153 -8137 +8042 @@ -7248,22 +7227,22 @@ 1 2 -112973 +111649 2 3 -17416 +17211 3 7 -12535 +12388 7 184 -7709 +7619 @@ -7279,52 +7258,52 @@ 1 2 -31805 +31432 2 3 -17777 +17569 3 4 -18644 +18425 4 5 -9870 +9754 5 7 -13731 +13570 7 9 -13774 +13613 9 13 -12733 +12583 13 29 -11658 +11521 29 74 -11351 +11185 74 258 -9289 +9212 @@ -7340,52 +7319,52 @@ 1 2 -877 +867 2 3 -1008 +997 3 5 -504 +498 5 8 -482 +476 8 16 -438 +433 16 37 -416 +411 37 119 -416 +411 124 512 -416 +411 522 5004 -416 +411 5044 -19249 -416 +19250 +411 19714 @@ -7406,47 +7385,47 @@ 1 2 -2346 +2319 2 3 -493 +487 3 6 -427 +422 6 15 -438 +433 15 55 -416 +411 59 228 -416 +411 231 1213 -416 +411 1274 2356 -416 +411 2555 6472 -87 +86 @@ -7462,57 +7441,57 @@ 1 2 -910 +899 2 3 -998 +986 3 4 -263 +260 4 6 -471 +466 6 10 -427 +422 10 20 -416 +411 20 55 -416 +411 56 194 -416 +411 196 844 -416 +411 863 1976 -416 +411 1976 6604 -307 +303 @@ -7528,57 +7507,57 @@ 1 2 -910 +899 2 3 -998 +986 3 4 -263 +260 4 6 -471 +466 6 10 -427 +422 10 20 -416 +411 20 55 -416 +411 56 194 -416 +411 206 843 -416 +411 863 1977 -416 +411 1980 6583 -307 +303 @@ -7594,42 +7573,42 @@ 1 2 -2478 +2449 2 3 -493 +487 3 7 -493 +487 7 13 -427 +422 13 28 -416 +411 28 49 -427 +422 50 103 -416 +411 105 428 -307 +303 @@ -7645,52 +7624,52 @@ 1 2 -30565 +30207 2 3 -18063 +17851 3 4 -17810 +17602 4 5 -9870 +9754 5 7 -13774 +13613 7 9 -13456 +13299 9 13 -13051 +12898 13 31 -11460 +11326 31 -124 -11296 +125 +11207 -124 +125 6472 -11109 +10936 @@ -7706,42 +7685,42 @@ 1 2 -55373 +54724 2 3 -33340 +32949 3 4 -9870 +9754 4 5 -8543 +8443 5 8 -13105 +12952 8 27 -11329 +11196 27 121 -11296 +11163 121 6472 -7600 +7511 @@ -7757,22 +7736,22 @@ 1 2 -112184 +110869 2 3 -17251 +17049 3 7 -12074 +11933 7 46 -8949 +8844 @@ -7788,57 +7767,57 @@ 1 2 -31651 +31280 2 3 -17942 +17732 3 4 -19741 +19509 4 5 -9607 +9494 5 6 -7863 +7771 6 7 -6130 +6058 7 9 -13840 +13678 9 13 -12711 +12562 13 27 -11493 +11358 27 62 -11351 +11218 62 153 -8126 +8031 @@ -7854,52 +7833,52 @@ 1 2 -31552 +31183 2 3 -17745 +17537 3 4 -18633 +18414 4 5 -9936 +9819 5 7 -13818 +13656 7 9 -13774 +13613 9 13 -12787 +12637 13 29 -11515 +11380 29 74 -11362 +11196 74 258 -9333 +9256 @@ -7915,47 +7894,47 @@ 1 2 -4211 +4151 2 3 -1184 +1159 3 4 -767 +758 4 5 -647 +639 5 9 -877 +867 9 36 -811 +791 36 -282 -800 +256 +791 -298 -7593 -800 +257 +7244 +791 -7763 +7397 25755 -526 +552 @@ -7971,17 +7950,17 @@ 1 2 -4836 +4769 2 3 -1283 +1257 3 4 -954 +953 4 @@ -7991,22 +7970,22 @@ 7 31 -800 +791 32 356 -800 +791 377 2696 -800 +791 2701 6472 -252 +249 @@ -8022,47 +8001,47 @@ 1 2 -4244 +4183 2 3 -1173 +1148 3 4 -800 +791 4 5 -636 +628 5 9 -855 +845 9 34 -811 +791 34 221 -800 +791 233 -1947 -800 +1884 +791 -1953 +1885 4894 -504 +531 @@ -8078,42 +8057,42 @@ 1 2 -4869 +4801 2 3 -1327 +1311 3 4 -943 +942 4 7 -910 +899 7 22 -811 +802 22 45 -800 +791 45 81 -822 +812 81 84 -142 +140 @@ -8129,47 +8108,47 @@ 1 2 -4244 +4183 2 3 -1173 +1148 3 4 -811 +802 4 5 -636 +628 5 9 -855 +845 9 -32 -800 +33 +802 -32 -221 -800 +34 +234 +791 -233 -1952 -800 +240 +1928 +791 -1962 +1951 4895 -504 +509 @@ -8179,31 +8158,31 @@ locations_stmt -2176409 +2179578 id -2176409 +2179578 container -3172 +3177 startLine -296351 +296783 startColumn -1227 +1229 endLine -294553 +294982 endColumn -1491 +1493 @@ -8217,7 +8196,7 @@ 1 2 -2176409 +2179578 @@ -8233,7 +8212,7 @@ 1 2 -2176409 +2179578 @@ -8249,7 +8228,7 @@ 1 2 -2176409 +2179578 @@ -8265,7 +8244,7 @@ 1 2 -2176409 +2179578 @@ -8281,7 +8260,7 @@ 1 2 -2176409 +2179578 @@ -8302,7 +8281,7 @@ 7 17 -257 +258 17 @@ -8459,7 +8438,7 @@ 2 3 -570 +571 3 @@ -8479,7 +8458,7 @@ 14 20 -263 +264 20 @@ -8499,7 +8478,7 @@ 51 63 -263 +264 63 @@ -8540,7 +8519,7 @@ 13 24 -263 +264 24 @@ -8590,7 +8569,7 @@ 1423 38575 -220 +221 @@ -8611,7 +8590,7 @@ 4 7 -257 +258 7 @@ -8636,12 +8615,12 @@ 40 49 -263 +264 49 60 -257 +258 60 @@ -8666,7 +8645,7 @@ 120 172 -128 +129 @@ -8682,37 +8661,37 @@ 1 2 -113656 +113822 2 3 -78643 +78757 3 4 -31281 +31327 4 6 -25169 +25205 6 16 -22505 +22538 16 128 -22315 +22347 128 222 -2780 +2784 @@ -8728,32 +8707,32 @@ 1 2 -175336 +175591 2 3 -51976 +52052 3 5 -22708 +22741 5 13 -22382 +22415 13 125 -22266 +22298 125 176 -1681 +1684 @@ -8769,32 +8748,32 @@ 1 2 -130650 +130841 2 3 -73101 +73207 3 4 -31159 +31204 4 7 -26807 +26846 7 17 -23051 +23085 17 45 -11581 +11597 @@ -8810,27 +8789,27 @@ 1 2 -191440 +191719 2 3 -47699 +47768 3 4 -21695 +21726 4 9 -23168 +23202 9 30 -12348 +12366 @@ -8846,32 +8825,32 @@ 1 2 -155826 +156052 2 3 -62539 +62630 3 4 -21063 +21093 4 9 -24671 +24707 9 31 -22431 +22464 31 73 -9819 +9833 @@ -8968,7 +8947,7 @@ 2 3 -85 +86 3 @@ -9169,7 +9148,7 @@ 2086 -15271 +15270 98 @@ -9201,7 +9180,7 @@ 3 4 -85 +86 4 @@ -9251,7 +9230,7 @@ 131 203 -42 +43 @@ -9267,37 +9246,37 @@ 1 2 -116001 +116170 2 3 -72831 +72937 3 4 -31901 +31948 4 6 -25672 +25709 6 16 -23106 +23140 16 126 -22106 +22138 126 229 -2933 +2937 @@ -9313,27 +9292,27 @@ 1 2 -175048 +175302 2 3 -52173 +52249 3 5 -22174 +22206 5 14 -23487 +23521 14 172 -21670 +21702 @@ -9349,27 +9328,27 @@ 1 2 -193723 +194005 2 3 -42881 +42943 3 4 -20909 +20940 4 8 -22425 +22458 8 32 -14612 +14634 @@ -9385,32 +9364,32 @@ 1 2 -132811 +133004 2 3 -67970 +68069 3 4 -32441 +32489 4 7 -26684 +26723 7 16 -22131 +22163 16 46 -12513 +12532 @@ -9426,32 +9405,32 @@ 1 2 -155721 +155948 2 3 -62404 +62494 3 4 -21370 +21401 4 9 -23855 +23890 9 34 -22382 +22415 34 73 -8819 +8832 @@ -9543,12 +9522,12 @@ 1 2 -214 +215 2 3 -85 +86 3 @@ -9558,7 +9537,7 @@ 6 12 -128 +129 13 @@ -9700,7 +9679,7 @@ 3 4 -85 +86 4 @@ -9710,7 +9689,7 @@ 6 10 -128 +129 10 @@ -9735,7 +9714,7 @@ 31 38 -128 +129 38 @@ -9831,11 +9810,11 @@ locations_expr -9755082 +9756708 id -9755082 +9756708 container @@ -9869,7 +9848,7 @@ 1 2 -9755082 +9756708 @@ -9885,7 +9864,7 @@ 1 2 -9755082 +9756708 @@ -9901,7 +9880,7 @@ 1 2 -9755082 +9756708 @@ -9917,7 +9896,7 @@ 1 2 -9755082 +9756708 @@ -9933,7 +9912,7 @@ 1 2 -9755082 +9756708 @@ -9959,7 +9938,7 @@ 10 34 -270 +269 34 @@ -9969,7 +9948,7 @@ 108 205 -269 +270 205 @@ -9988,12 +9967,12 @@ 746 -1179 +1181 269 -1180 -1848 +1181 +1853 269 @@ -10273,52 +10252,52 @@ 19 43 -285 +284 43 -60 -270 +61 +287 -60 -73 -286 +61 +74 +294 -73 -84 +74 +85 279 -84 -95 -290 +85 +96 +286 -95 -106 -284 +96 +107 +280 -106 -120 +107 +121 280 -120 -138 -278 +121 +139 +274 -138 -166 -270 +139 +167 +271 -166 +167 416 -190 +177 @@ -10379,12 +10358,12 @@ 25 97 -14718 +14716 97 4266 -14507 +14509 @@ -10598,12 +10577,12 @@ 21 61 -14732 +14731 61 184 -14140 +14141 @@ -10667,23 +10646,23 @@ 29 -16137 -46382 +16143 +46384 29 -48761 -86976 +48765 +86984 29 -87194 -224341 +87199 +224328 29 -237386 -712099 +237383 +712891 6 @@ -11044,12 +11023,12 @@ 19 34 -14924 +14922 34 233 -14681 +14683 233 @@ -11258,12 +11237,12 @@ 11 16 -15573 +15572 16 27 -14834 +14835 27 @@ -11328,27 +11307,27 @@ 1667 -5253 +5254 35 -5322 -18552 +5327 +18561 35 -20345 -51675 +20354 +51707 35 -54821 -117773 +54831 +117890 35 -117975 -185967 +117994 +185975 35 @@ -11399,22 +11378,22 @@ 602 -1190 +1192 35 -1207 +1208 1967 35 -1968 +1970 2479 35 2482 -2649 +2650 32 @@ -11470,22 +11449,22 @@ 2070 -5993 +5994 35 -6048 +6052 12974 35 -13161 -20940 +13162 +20941 35 20996 -28029 +28030 35 @@ -11617,22 +11596,22 @@ 2067 -5994 +5995 35 -6037 +6041 12938 35 -13153 -20903 +13154 +20904 35 21020 -28040 +28041 35 @@ -11648,23 +11627,23 @@ numlines -499263 +493411 element_id -492299 +486528 num_lines -9344 +9234 num_code -7293 +7207 num_comment -3937 +3891 @@ -11678,12 +11657,12 @@ 1 2 -485411 +479722 2 7 -6887 +6806 @@ -11699,12 +11678,12 @@ 1 2 -485466 +479776 2 7 -6832 +6752 @@ -11720,12 +11699,12 @@ 1 2 -492222 +486452 2 3 -76 +75 @@ -11741,42 +11720,42 @@ 1 2 -4255 +4205 2 3 -1250 +1235 3 4 -701 +693 4 6 -734 +726 6 12 -701 +693 12 24 -712 +704 24 121 -701 +693 121 7771 -285 +281 @@ -11792,37 +11771,37 @@ 1 2 -4321 +4270 2 3 -1261 +1246 3 4 -712 +704 4 6 -756 +747 6 11 -811 +802 11 18 -734 +726 18 30 -712 +704 30 @@ -11843,37 +11822,37 @@ 1 2 -4310 +4259 2 3 -1261 +1246 3 4 -723 +715 4 6 -767 +758 6 11 -844 +834 11 17 -723 +715 17 27 -712 +704 @@ -11889,42 +11868,42 @@ 1 2 -3180 +3143 2 3 -855 +845 3 4 -625 +617 4 6 -559 +552 6 10 -603 +596 10 22 -592 +585 22 101 -548 +541 101 7978 -329 +325 @@ -11940,42 +11919,42 @@ 1 2 -3202 +3164 2 3 -888 +877 3 4 -636 +628 4 6 -559 +552 6 10 -636 +628 10 21 -614 +606 21 35 -548 +541 35 42 -208 +205 @@ -11991,42 +11970,42 @@ 1 2 -3191 +3154 2 3 -910 +899 3 4 -636 +628 4 6 -537 +531 6 9 -559 +552 9 17 -559 +552 17 27 -581 +574 27 34 -318 +314 @@ -12042,42 +12021,42 @@ 1 2 -1886 +1864 2 3 -405 +401 3 4 -296 +292 4 7 -329 +325 7 13 -329 +325 14 38 -296 +292 39 280 -296 +292 286 36252 -98 +97 @@ -12093,42 +12072,42 @@ 1 2 -1897 +1875 2 3 -416 +411 3 4 -263 +260 4 7 -339 +336 7 13 -329 +325 13 35 -296 +292 35 90 -296 +292 91 119 -98 +97 @@ -12144,42 +12123,42 @@ 1 2 -1897 +1875 2 3 -416 +411 3 4 -274 +270 4 7 -329 +325 7 12 -307 +303 12 33 -296 +292 33 82 -296 +292 82 108 -120 +119 @@ -12189,11 +12168,11 @@ diagnostics -68699 +67893 id -68699 +67893 severity @@ -12201,19 +12180,19 @@ error_tag -76 +75 error_message -98 +97 full_error_message -59486 +58789 location -120 +119 @@ -12227,7 +12206,7 @@ 1 2 -68699 +67893 @@ -12243,7 +12222,7 @@ 1 2 -68699 +67893 @@ -12259,7 +12238,7 @@ 1 2 -68699 +67893 @@ -12275,7 +12254,7 @@ 1 2 -68699 +67893 @@ -12291,7 +12270,7 @@ 1 2 -68699 +67893 @@ -12453,7 +12432,7 @@ 1 2 -76 +75 @@ -12603,7 +12582,7 @@ 1 2 -98 +97 @@ -12619,7 +12598,7 @@ 1 2 -98 +97 @@ -12707,7 +12686,7 @@ 1 2 -59475 +58778 841 @@ -12728,7 +12707,7 @@ 1 2 -59486 +58789 @@ -12744,7 +12723,7 @@ 1 2 -59486 +58789 @@ -12760,7 +12739,7 @@ 1 2 -59486 +58789 @@ -12776,7 +12755,7 @@ 1 2 -59486 +58789 @@ -12792,7 +12771,7 @@ 1 2 -109 +108 6254 @@ -12813,7 +12792,7 @@ 1 2 -120 +119 @@ -12829,7 +12808,7 @@ 1 2 -109 +108 3 @@ -12850,7 +12829,7 @@ 1 2 -109 +108 5 @@ -12871,7 +12850,7 @@ 1 2 -109 +108 5414 @@ -12886,23 +12865,23 @@ files -60023 +59320 id -60023 +59320 name -60023 +59320 simple -41061 +40580 ext -98 +97 fromSource @@ -12920,7 +12899,7 @@ 1 2 -60023 +59320 @@ -12936,7 +12915,7 @@ 1 2 -60023 +59320 @@ -12952,7 +12931,7 @@ 1 2 -60023 +59320 @@ -12968,7 +12947,7 @@ 1 2 -60023 +59320 @@ -12984,7 +12963,7 @@ 1 2 -60023 +59320 @@ -13000,7 +12979,7 @@ 1 2 -60023 +59320 @@ -13016,7 +12995,7 @@ 1 2 -60023 +59320 @@ -13032,7 +13011,7 @@ 1 2 -60023 +59320 @@ -13048,22 +13027,22 @@ 1 2 -31179 +30814 2 3 -6196 +6123 3 7 -3235 +3197 7 42 -449 +444 @@ -13079,22 +13058,22 @@ 1 2 -31179 +30814 2 3 -6196 +6123 3 7 -3235 +3197 7 42 -449 +444 @@ -13110,17 +13089,17 @@ 1 2 -36707 +36277 2 3 -3783 +3739 3 6 -570 +563 @@ -13136,7 +13115,7 @@ 1 2 -41061 +40580 @@ -13320,7 +13299,7 @@ 1 2 -98 +97 @@ -13394,19 +13373,19 @@ folders -10945 +10817 id -10945 +10817 name -10945 +10817 simple -3136 +3099 @@ -13420,7 +13399,7 @@ 1 2 -10945 +10817 @@ -13436,7 +13415,7 @@ 1 2 -10945 +10817 @@ -13452,7 +13431,7 @@ 1 2 -10945 +10817 @@ -13468,7 +13447,7 @@ 1 2 -10945 +10817 @@ -13484,27 +13463,27 @@ 1 2 -1688 +1669 2 3 -669 +661 3 4 -438 +433 4 17 -241 +238 27 121 -98 +97 @@ -13520,27 +13499,27 @@ 1 2 -1688 +1669 2 3 -669 +661 3 4 -438 +433 4 17 -241 +238 27 121 -98 +97 @@ -13550,15 +13529,15 @@ containerparent -70947 +70115 parent -10945 +10817 child -70947 +70115 @@ -13572,42 +13551,42 @@ 1 2 -4990 +4931 2 3 -1403 +1387 3 4 -614 +606 4 6 -1008 +997 6 10 -811 +802 10 14 -866 +856 14 30 -833 +823 30 153 -416 +411 @@ -13623,7 +13602,7 @@ 1 2 -70947 +70115 @@ -13633,11 +13612,11 @@ fileannotations -5150695 +5090321 id -4825 +4769 kind @@ -13645,11 +13624,11 @@ name -54628 +53987 value -44647 +44124 @@ -13663,12 +13642,12 @@ 1 2 -131 +130 2 3 -4693 +4638 @@ -13684,62 +13663,62 @@ 1 100 -361 +357 111 222 -361 +357 224 290 -361 +357 295 448 -361 +357 448 527 -361 +357 533 623 -394 +390 623 713 -361 +357 726 901 -361 +357 901 931 -76 +75 933 934 -1381 +1365 1080 1671 -361 +357 1693 2286 -76 +75 @@ -13755,57 +13734,57 @@ 1 112 -361 +357 117 272 -361 +357 272 360 -361 +357 379 633 -361 +357 634 737 -361 +357 737 952 -361 +357 952 1069 -361 +357 1083 1498 -252 +249 1498 1499 -1381 +1365 1501 1871 -361 +357 1968 4072 -296 +292 @@ -13884,62 +13863,62 @@ 1 2 -8927 +8822 2 3 -6032 +5961 3 6 -4518 +4465 6 8 -4452 +4400 8 14 -4408 +4357 14 18 -3915 +3869 18 21 -4244 +4194 21 34 -4397 +4346 34 128 -4375 +4324 129 236 -4156 +4107 236 395 -4112 +4064 395 440 -1085 +1073 @@ -13955,7 +13934,7 @@ 1 2 -54628 +53987 @@ -13971,62 +13950,62 @@ 1 2 -9980 +9863 2 3 -8049 +7955 3 4 -2489 +2460 4 6 -3959 +3912 6 10 -4880 +4823 10 14 -3487 +3446 14 18 -4496 +4443 18 23 -4200 +4151 23 44 -4397 +4346 44 97 -4156 +4107 97 405 -4101 +4053 421 1907 -427 +422 @@ -14042,67 +14021,67 @@ 1 2 -6898 +6817 2 5 -2171 +2146 5 8 -3235 +3197 8 21 -3432 +3392 21 23 -2467 +2438 23 25 -4024 +3977 25 40 -3235 +3197 40 195 -3520 +3479 195 207 -3509 +3468 207 273 -3663 +3620 273 327 -3366 +3327 328 407 -3838 +3793 407 441 -1283 +1268 @@ -14118,7 +14097,7 @@ 1 2 -44636 +44113 2 @@ -14139,67 +14118,67 @@ 1 2 -6920 +6839 2 5 -2511 +2482 5 8 -3388 +3349 8 16 -3498 +3457 16 18 -3016 +2980 18 21 -3739 +3696 21 31 -3882 +3836 31 41 -3531 +3490 41 54 -3531 +3490 54 80 -3410 +3370 80 108 -3355 +3316 108 130 -3399 +3360 130 149 -460 +455 @@ -14209,15 +14188,15 @@ inmacroexpansion -60858600 +60947411 id -15688133 +15711684 inv -2531842 +2534941 @@ -14231,47 +14210,47 @@ 1 2 -3618145 +3622961 2 3 -2444404 +2447710 3 4 -1897963 +1901765 4 5 -1930660 +1934999 5 6 -1866522 +1869000 6 7 -968680 +969866 7 8 -1531664 +1533539 8 11 -1254546 +1256082 11 6193 -175544 +175759 @@ -14287,52 +14266,52 @@ 1 2 -616466 +617221 2 3 -369750 +370194 3 4 -160127 +158077 4 5 -256553 +257870 5 7 -183475 +184829 7 9 -150757 +150858 9 12 -221729 +222012 12 22 -202905 +203086 22 45 -191199 +191643 45 153127 -178878 +179147 @@ -14342,15 +14321,15 @@ affectedbymacroexpansion -35484578 +35536226 id -4079138 +4085077 inv -3279080 +3283853 @@ -14364,42 +14343,42 @@ 1 2 -1340484 +1342436 2 3 -718487 +719533 3 4 -682062 +683055 4 6 -320606 +321085 6 10 -313180 +313623 10 24 -307675 +308123 24 64 -309559 +310009 64 9803 -87082 +87208 @@ -14415,72 +14394,72 @@ 1 2 -252912 +253292 2 3 -209803 +210096 3 4 -202322 +202616 4 5 -257766 +258141 5 6 -301206 +301644 6 7 -247566 +247926 7 8 -230830 +231166 8 9 -227718 +228049 9 10 -182290 +182555 10 12 -285323 +285738 12 16 -297057 +297490 16 23 -275036 +275437 23 60 -248652 +249014 60 526 -60593 +60681 @@ -14490,19 +14469,19 @@ macroinvocations -35580051 +34675701 id -35580051 +34675701 macro_id -81234 +80282 location -761238 +752316 kind @@ -14520,7 +14499,7 @@ 1 2 -35580051 +34675701 @@ -14536,7 +14515,7 @@ 1 2 -35580051 +34675701 @@ -14552,7 +14531,7 @@ 1 2 -35580051 +34675701 @@ -14568,52 +14547,52 @@ 1 2 -17021 +17136 2 3 -16560 +16778 3 4 -3575 +3761 4 6 -7194 +7034 6 11 -6898 +7392 11 -19 -6174 +21 +6405 -19 -40 -6174 +21 +47 +6188 -40 -105 -6196 +47 +151 +6069 -105 -487 -6108 +151 +1013 +6026 -488 -196960 -5330 +1014 +196742 +3490 @@ -14629,37 +14608,37 @@ 1 2 -43222 +42715 2 3 -10747 +10621 3 4 -5341 +5278 4 6 -6975 +6893 6 13 -6722 +6644 13 66 -6108 +6037 66 3614 -2116 +2091 @@ -14675,12 +14654,12 @@ 1 2 -75092 +74212 2 3 -6141 +6069 @@ -14696,42 +14675,37 @@ 1 2 -284425 +285069 2 3 -177483 +194240 3 4 -43452 +45143 4 5 -58598 +55916 5 -8 -63577 - - -8 -17 -61164 +9 +68457 -17 -80 -57161 +9 +26 +60523 -80 -258137 -15376 +26 +257817 +42964 @@ -14747,12 +14721,12 @@ 1 2 -712533 +704181 2 354 -48705 +48134 @@ -14768,7 +14742,7 @@ 1 2 -761238 +752316 @@ -14782,13 +14756,13 @@ 12 -27686 -27687 +21794 +21795 10 -3216514 -3216515 +3177447 +3177448 10 @@ -14841,15 +14815,15 @@ macroparent -31703249 +31212468 id -31703249 +31212468 parent_id -24680109 +24288060 @@ -14863,7 +14837,7 @@ 1 2 -31703249 +31212468 @@ -14879,17 +14853,17 @@ 1 2 -18989648 +18677382 2 3 -4853131 +4783954 3 88 -837329 +826723 @@ -14899,15 +14873,15 @@ macrolocationbind -4013316 +4019158 id -2798431 +2802505 location -2003411 +2006328 @@ -14921,22 +14895,22 @@ 1 2 -2198258 +2201458 2 3 -338895 +339388 3 7 -231523 +231860 7 57 -29753 +29796 @@ -14952,22 +14926,22 @@ 1 2 -1601798 +1604130 2 3 -170837 +171086 3 8 -155316 +155542 8 723 -75458 +75567 @@ -14977,19 +14951,19 @@ macro_argument_unexpanded -92648459 +91317451 invocation -27419703 +26939874 argument_index -723 +715 text -312677 +309012 @@ -15003,22 +14977,22 @@ 1 2 -7656521 +7463526 2 3 -11466609 +11300240 3 4 -6261428 +6167062 4 67 -2035143 +2009044 @@ -15034,22 +15008,22 @@ 1 2 -7724474 +7530509 2 3 -11620513 +11447007 3 4 -6090010 +6003116 4 67 -1984704 +1959240 @@ -15063,18 +15037,18 @@ 12 -50787 -50788 -636 +50779 +50780 +628 -50989 -185566 +50981 +185359 54 -756484 -2500138 +754342 +2485521 32 @@ -15091,7 +15065,7 @@ 2 3 -636 +628 13 @@ -15117,57 +15091,57 @@ 1 2 -37902 +37588 2 3 -61164 +61759 3 4 -14092 +14252 4 5 -42136 +41761 5 8 -25290 +25416 8 12 -15112 +15466 12 16 -21781 +20918 16 -21 -23941 +23 +25709 -21 -41 -24972 +23 +43 +23205 -41 -121 -23788 +43 +154 +23216 -121 -567376 -22493 +154 +566476 +19715 @@ -15183,17 +15157,17 @@ 1 2 -226068 +223418 2 3 -76310 +75415 3 9 -10298 +10177 @@ -15203,19 +15177,19 @@ macro_argument_expanded -92648459 +91317451 invocation -27419703 +26939874 argument_index -723 +715 text -189448 +187228 @@ -15229,22 +15203,22 @@ 1 2 -7656521 +7463526 2 3 -11466609 +11300240 3 4 -6261428 +6167062 4 67 -2035143 +2009044 @@ -15260,22 +15234,22 @@ 1 2 -11165031 +10915238 2 3 -9894482 +9757326 3 4 -5269844 +5190905 4 9 -1090345 +1076404 @@ -15289,18 +15263,18 @@ 12 -50787 -50788 -636 +50779 +50780 +628 -50989 -185566 +50981 +185359 54 -756484 -2500138 +754342 +2485521 32 @@ -15317,7 +15291,7 @@ 1 2 -625 +617 2 @@ -15343,62 +15317,62 @@ 1 2 -22866 +22717 2 3 -38220 +38694 3 4 -6240 +6449 4 5 -15178 +15293 5 6 -2752 +3468 6 7 -22033 +21883 7 9 -15463 +14599 9 15 -16494 +16225 15 -28 -14257 +31 +14914 -28 -77 -14323 +31 +97 +14198 -77 -337 -14323 +97 +559 +14057 -338 -1133296 -7293 +560 +1126278 +4725 @@ -15414,22 +15388,22 @@ 1 2 -95634 +94513 2 3 -79490 +78559 3 6 -14246 +14079 6 66 -76 +75 @@ -15439,19 +15413,19 @@ functions -3468314 +3658482 id -3468314 +3658482 name -288395 +292298 kind -76 +75 @@ -15465,7 +15439,7 @@ 1 2 -3468314 +3658482 @@ -15481,7 +15455,7 @@ 1 2 -3468314 +3658482 @@ -15497,27 +15471,27 @@ 1 2 -195404 +195541 2 3 -28317 +29091 3 5 -26080 +26912 5 -13 -22164 +12 +21948 -13 -123517 -16428 +12 +123481 +18805 @@ -15533,12 +15507,12 @@ 1 2 -286936 +290304 2 3 -1458 +1994 @@ -15572,18 +15546,18 @@ 10 -45041 -45042 +66392 +66393 10 -114719 -114720 +114718 +114719 10 -146936 -146937 +146882 +146883 10 @@ -15623,8 +15597,8 @@ 10 -2880 -2881 +3603 +3604 10 @@ -15640,15 +15614,15 @@ function_entry_point -1008551 +996664 id -1005633 +993781 entry_point -1008551 +996664 @@ -15662,12 +15636,12 @@ 1 2 -1002990 +991169 2 9 -2643 +2612 @@ -15683,7 +15657,7 @@ 1 2 -1008551 +996664 @@ -15693,15 +15667,15 @@ function_return_type -3478481 +3668529 id -3467843 +3658016 return_type -1023587 +1011394 @@ -15715,12 +15689,12 @@ 1 2 -3457698 +3647990 2 6 -10144 +10025 @@ -15736,17 +15710,17 @@ 1 2 -299165 +295658 2 3 -662708 +654745 3 -84263 -61712 +105613 +60989 @@ -16068,48 +16042,48 @@ purefunctions -20748 +20715 id -20748 +20715 function_deleted -56185 +55526 id -56185 +55526 function_defaulted -12930 +12778 id -12930 +12778 member_function_this_type -523358 +517224 id -523358 +517224 this_type -171374 +169365 @@ -16123,7 +16097,7 @@ 1 2 -523358 +517224 @@ -16139,37 +16113,37 @@ 1 2 -62546 +61813 2 3 -44560 +44037 3 4 -22296 +22035 4 5 -15014 +14838 5 7 -13687 +13526 7 36 -12875 +12724 40 87 -394 +390 @@ -16179,27 +16153,27 @@ fun_decls -3543890 +3733464 id -3540621 +3730234 function -3374862 +3566244 type_id -1010514 +998474 name -256842 +261115 location -795456 +786132 @@ -16213,7 +16187,7 @@ 1 2 -3540621 +3730234 @@ -16229,12 +16203,12 @@ 1 2 -3537638 +3727286 2 4 -2983 +2948 @@ -16250,7 +16224,7 @@ 1 2 -3540621 +3730234 @@ -16266,7 +16240,7 @@ 1 2 -3540621 +3730234 @@ -16282,12 +16256,12 @@ 1 2 -3238835 +3431649 2 9 -136027 +134595 @@ -16303,12 +16277,12 @@ 1 2 -3358203 +3549780 2 6 -16659 +16464 @@ -16324,7 +16298,7 @@ 1 2 -3374862 +3566244 @@ -16340,12 +16314,12 @@ 1 2 -3287222 +3479621 2 9 -87639 +86623 @@ -16361,17 +16335,17 @@ 1 2 -280334 +277048 2 3 -661085 +653141 3 -89606 -69093 +110973 +68283 @@ -16387,17 +16361,17 @@ 1 2 -292168 +288743 2 3 -657433 +649532 3 -83378 -60912 +104729 +60198 @@ -16413,12 +16387,12 @@ 1 2 -943975 +932715 2 -7512 -66538 +8223 +65758 @@ -16434,17 +16408,17 @@ 1 2 -913113 +902215 2 6 -80148 +79209 6 -22467 -17251 +24198 +17049 @@ -16460,32 +16434,37 @@ 1 2 -153552 +154159 2 3 -29304 +30023 3 4 -15935 +16344 4 6 -19521 +20062 6 13 -20201 +20929 13 -123766 -18326 +9944 +19585 + + +123729 +123730 +10 @@ -16501,32 +16480,32 @@ 1 2 -164180 +164672 2 3 -28482 +29264 3 4 -14454 +14827 4 7 -21638 +22349 7 -25 -19642 +23 +19737 -25 -123501 -8444 +23 +123465 +10264 @@ -16542,17 +16521,17 @@ 1 2 -224335 +228903 2 5 -20870 +20669 5 -63265 -11636 +63247 +11543 @@ -16568,27 +16547,27 @@ 1 2 -164673 +168477 2 3 -43463 +43528 3 4 -16439 +16409 4 8 -20574 +20897 8 8921 -11691 +11803 @@ -16604,27 +16583,27 @@ 1 2 -522766 +516530 2 3 -143890 +130379 3 -5 -64860 +4 +50681 -5 -125 -59694 +4 +13 +61358 -125 +13 3043 -4244 +27183 @@ -16640,22 +16619,22 @@ 1 2 -537692 +531281 2 3 -156854 +143190 3 -9 -64345 +7 +65780 -9 +7 3043 -36564 +45880 @@ -16671,17 +16650,17 @@ 1 2 -701807 +681604 2 -4 -61789 +3 +62355 -4 +3 1522 -31859 +42173 @@ -16697,12 +16676,12 @@ 1 2 -770451 +742691 2 134 -25005 +43441 @@ -16712,22 +16691,22 @@ fun_def -1230803 +1230856 id -1230803 +1230856 fun_specialized -6421 +6411 id -6421 +6411 @@ -16745,11 +16724,11 @@ fun_decl_specifiers -485334 +485928 id -260686 +261005 name @@ -16767,17 +16746,17 @@ 1 2 -69262 +69347 2 3 -158199 +158393 3 4 -33224 +33264 @@ -16939,26 +16918,26 @@ fun_decl_empty_throws -1420986 +1620964 fun_decl -1420986 +1620964 fun_decl_noexcept -32912 +32527 fun_decl -32123 +31746 constant -32792 +32407 @@ -16972,12 +16951,12 @@ 1 2 -31333 +30966 2 3 -789 +780 @@ -16993,12 +16972,12 @@ 1 2 -32671 +32288 2 3 -120 +119 @@ -17008,26 +16987,26 @@ fun_decl_empty_noexcept -391959 +401889 fun_decl -391959 +401889 fun_decl_typedef_type -175 +173 fun_decl -175 +173 typedeftype_id -87 +86 @@ -17041,7 +17020,7 @@ 1 2 -175 +173 @@ -17057,7 +17036,7 @@ 2 3 -87 +86 @@ -17067,19 +17046,19 @@ param_decl_bind -4651530 +4596444 id -4651530 +4596444 index -701 +693 fun_decl -3071759 +3035277 @@ -17093,7 +17072,7 @@ 1 2 -4651530 +4596444 @@ -17109,7 +17088,7 @@ 1 2 -4651530 +4596444 @@ -17125,12 +17104,12 @@ 1 2 -350 +346 4 5 -142 +140 6 @@ -17149,7 +17128,7 @@ 14149 -280085 +280041 43 @@ -17166,12 +17145,12 @@ 1 2 -350 +346 4 5 -142 +140 6 @@ -17190,7 +17169,7 @@ 14149 -280085 +280041 43 @@ -17207,22 +17186,22 @@ 1 2 -2195287 +2169165 2 3 -478579 +472882 3 4 -242716 +239871 4 65 -155176 +153357 @@ -17238,22 +17217,22 @@ 1 2 -2195287 +2169165 2 3 -478579 +472882 3 4 -242716 +239871 4 65 -155176 +153357 @@ -17263,27 +17242,27 @@ var_decls -5368966 +5305568 id -5360115 +5296821 variable -5132204 +5071603 type_id -2007769 +1983812 name -126310 +124829 location -1232448 +1218002 @@ -17297,7 +17276,7 @@ 1 2 -5360115 +5296821 @@ -17313,12 +17292,12 @@ 1 2 -5351451 +5288258 2 4 -8664 +8562 @@ -17334,7 +17313,7 @@ 1 2 -5360115 +5296821 @@ -17350,7 +17329,7 @@ 1 2 -5360071 +5296777 2 @@ -17371,12 +17350,12 @@ 1 2 -4944675 +4886293 2 9 -187529 +185309 @@ -17392,12 +17371,12 @@ 1 2 -5096835 +5036670 2 7 -35369 +34933 @@ -17413,12 +17392,12 @@ 1 2 -5114635 +5054239 2 3 -17569 +17363 @@ -17434,12 +17413,12 @@ 1 2 -5023990 +4964657 2 9 -108214 +106945 @@ -17455,22 +17434,22 @@ 1 2 -1580878 +1561936 2 3 -228876 +226215 3 11 -156974 +155091 11 5924 -41039 +40569 @@ -17486,22 +17465,22 @@ 1 2 -1605072 +1585846 2 3 -219641 +217088 3 13 -151129 +149325 13 5424 -31925 +31551 @@ -17517,17 +17496,17 @@ 1 2 -1832906 +1811043 2 5 -151238 +149422 5 772 -23623 +23346 @@ -17543,17 +17522,17 @@ 1 2 -1758515 +1737523 2 4 -154496 +152685 4 3608 -94757 +93603 @@ -17569,42 +17548,42 @@ 1 2 -52160 +51483 2 3 -19236 +19054 3 4 -10890 +10784 4 5 -7688 +7597 5 8 -10517 +10394 8 15 -9508 +9397 15 47 -9530 +9418 47 -165630 -6777 +165594 +6698 @@ -17620,37 +17599,37 @@ 1 2 -54978 +54269 2 3 -18786 +18610 3 4 -11789 +11673 4 6 -11197 +11066 6 11 -10736 +10611 11 27 -9486 +9375 27 -164602 -9333 +164566 +9223 @@ -17666,32 +17645,32 @@ 1 2 -76321 +75405 2 3 -16878 +16702 3 4 -8861 +8757 4 7 -10473 +10350 7 27 -9519 +9408 27 -125807 -4255 +125771 +4205 @@ -17707,32 +17686,32 @@ 1 2 -72822 +71969 2 3 -19028 +18805 3 4 -6975 +6893 4 7 -11186 +11055 7 21 -9749 +9635 21 10073 -6547 +6470 @@ -17748,22 +17727,22 @@ 1 2 -892506 +881958 2 3 -149067 +147406 3 6 -113423 +112104 6 -128450 -77450 +128414 +76532 @@ -17779,22 +17758,22 @@ 1 2 -941266 +930147 2 3 -114487 +113232 3 6 -102664 +101472 6 -128224 -74029 +128188 +73150 @@ -17810,17 +17789,17 @@ 1 2 -1055403 +1043010 2 3 -85095 +84119 3 -118388 -91949 +118352 +90871 @@ -17836,12 +17815,12 @@ 1 2 -1223476 +1209135 2 52 -8971 +8866 @@ -17851,11 +17830,11 @@ var_def -2437554 +2408907 id -2437554 +2408907 @@ -17925,19 +17904,19 @@ type_decls -1332162 +1316547 id -1332162 +1316547 type_id -1300412 +1285169 location -1086846 +1074107 @@ -17951,7 +17930,7 @@ 1 2 -1332162 +1316547 @@ -17967,7 +17946,7 @@ 1 2 -1332162 +1316547 @@ -17983,12 +17962,12 @@ 1 2 -1277315 +1262343 2 24 -23097 +22826 @@ -18004,12 +17983,12 @@ 1 2 -1278609 +1263622 2 24 -21802 +21547 @@ -18025,12 +18004,12 @@ 1 2 -1031384 +1019295 2 506 -55461 +54811 @@ -18046,12 +18025,12 @@ 1 2 -1032865 +1020758 2 506 -53980 +53348 @@ -18061,45 +18040,45 @@ type_def -937746 +926754 id -937746 +926754 type_decl_top -268698 +265548 type_decl -268698 +265548 namespace_decls -136871 +135267 id -136871 +135267 namespace_id -7677 +7587 location -122252 +120819 bodylocation -122581 +121144 @@ -18113,7 +18092,7 @@ 1 2 -136871 +135267 @@ -18129,7 +18108,7 @@ 1 2 -136871 +135267 @@ -18145,7 +18124,7 @@ 1 2 -136871 +135267 @@ -18161,42 +18140,42 @@ 1 2 -3619 +3576 2 3 -1085 +1073 3 4 -416 +411 4 7 -647 +639 7 13 -592 +585 13 27 -592 +585 28 163 -581 +574 172 3743 -142 +140 @@ -18212,42 +18191,42 @@ 1 2 -3619 +3576 2 3 -1085 +1073 3 4 -416 +411 4 7 -647 +639 7 13 -592 +585 13 27 -592 +585 28 163 -581 +574 172 3743 -142 +140 @@ -18263,42 +18242,42 @@ 1 2 -3619 +3576 2 3 -1085 +1073 3 4 -416 +411 4 7 -647 +639 7 13 -592 +585 13 27 -592 +585 28 163 -581 +574 172 3742 -142 +140 @@ -18314,12 +18293,12 @@ 1 2 -113873 +112538 2 8 -8379 +8280 @@ -18335,12 +18314,12 @@ 1 2 -113873 +112538 2 8 -8379 +8280 @@ -18356,12 +18335,12 @@ 1 2 -121506 +120082 2 3 -745 +737 @@ -18377,12 +18356,12 @@ 1 2 -114564 +113221 2 11 -8017 +7923 @@ -18398,12 +18377,12 @@ 1 2 -114564 +113221 2 9 -8017 +7923 @@ -18419,12 +18398,12 @@ 1 2 -122186 +120754 2 5 -394 +390 @@ -18434,19 +18413,19 @@ usings -291444 +287692 id -291444 +287692 element_id -46402 +45522 location -23864 +23574 @@ -18460,7 +18439,7 @@ 1 2 -291444 +287692 @@ -18476,7 +18455,7 @@ 1 2 -291444 +287692 @@ -18492,17 +18471,17 @@ 1 2 -39394 +38596 2 4 -3750 +3706 4 127 -3257 +3219 @@ -18518,17 +18497,17 @@ 1 2 -39394 +38596 2 4 -3750 +3706 4 127 -3257 +3219 @@ -18544,22 +18523,22 @@ 1 2 -18063 +17851 2 3 -2237 +2200 3 18 -1798 +1777 18 382 -1765 +1745 @@ -18575,22 +18554,22 @@ 1 2 -18063 +17851 2 3 -2237 +2200 3 18 -1798 +1777 18 382 -1765 +1745 @@ -18600,15 +18579,15 @@ using_container -458103 +452397 parent -11230 +11022 child -291444 +287692 @@ -18622,42 +18601,42 @@ 1 2 -3213 +3154 2 4 -943 +932 4 6 -427 +411 6 7 -2774 +2698 7 17 -932 +921 19 143 -767 +758 178 179 -1261 +1246 179 202 -844 +834 202 @@ -18678,22 +18657,22 @@ 1 2 -215858 +212991 2 3 -50372 +49782 3 11 -23140 +22869 13 47 -2072 +2048 @@ -18703,27 +18682,27 @@ static_asserts -130658 +130452 id -130658 +130452 condition -130658 +130452 message -29707 +29660 location -16721 +16694 enclosing -1724 +1721 @@ -18737,7 +18716,7 @@ 1 2 -130658 +130452 @@ -18753,7 +18732,7 @@ 1 2 -130658 +130452 @@ -18769,7 +18748,7 @@ 1 2 -130658 +130452 @@ -18785,7 +18764,7 @@ 1 2 -130658 +130452 @@ -18801,7 +18780,7 @@ 1 2 -130658 +130452 @@ -18817,7 +18796,7 @@ 1 2 -130658 +130452 @@ -18833,7 +18812,7 @@ 1 2 -130658 +130452 @@ -18849,7 +18828,7 @@ 1 2 -130658 +130452 @@ -18865,7 +18844,7 @@ 1 2 -22108 +22073 2 @@ -18875,22 +18854,22 @@ 3 4 -2830 +2825 4 11 -1444 +1442 12 17 -2348 +2345 17 513 -553 +552 @@ -18906,7 +18885,7 @@ 1 2 -22108 +22073 2 @@ -18916,22 +18895,22 @@ 3 4 -2830 +2825 4 11 -1444 +1442 12 17 -2348 +2345 17 513 -553 +552 @@ -18947,12 +18926,12 @@ 1 2 -27553 +27510 2 33 -2153 +2150 @@ -18968,27 +18947,27 @@ 1 2 -23513 +23476 2 3 -182 +181 3 4 -2654 +2650 4 11 -1301 +1299 12 21 -2055 +2052 @@ -19004,22 +18983,22 @@ 1 2 -2901 +2897 2 3 -2765 +2760 3 4 -1327 +1325 5 6 -3728 +3722 6 @@ -19029,17 +19008,17 @@ 14 15 -2036 +2033 16 17 -39 +38 17 18 -3402 +3397 19 @@ -19060,22 +19039,22 @@ 1 2 -2901 +2897 2 3 -2765 +2760 3 4 -1327 +1325 5 6 -3728 +3722 6 @@ -19085,17 +19064,17 @@ 14 15 -2036 +2033 16 17 -39 +38 17 18 -3402 +3397 19 @@ -19116,17 +19095,17 @@ 1 2 -4417 +4410 2 3 -5985 +5976 3 4 -6128 +6119 4 @@ -19147,22 +19126,22 @@ 1 2 -3441 +3436 2 3 -6193 +6184 3 4 -1125 +1123 4 5 -3715 +3709 5 @@ -19172,7 +19151,7 @@ 13 14 -2036 +2033 16 @@ -19193,12 +19172,12 @@ 1 2 -1171 +1169 2 3 -130 +129 3 @@ -19213,7 +19192,7 @@ 170 347 -130 +129 348 @@ -19234,12 +19213,12 @@ 1 2 -1171 +1169 2 3 -130 +129 3 @@ -19254,7 +19233,7 @@ 170 347 -130 +129 348 @@ -19275,7 +19254,7 @@ 1 2 -1327 +1325 2 @@ -19285,12 +19264,12 @@ 5 180 -130 +129 211 2870 -130 +129 @@ -19306,7 +19285,7 @@ 1 2 -1314 +1312 2 @@ -19316,12 +19295,12 @@ 5 180 -130 +129 211 1886 -130 +129 @@ -19331,23 +19310,23 @@ params -4645049 +4589800 id -4627983 +4572935 function -3043935 +3007660 index -701 +693 type_id -1856848 +1834606 @@ -19361,12 +19340,12 @@ 1 2 -4627314 +4572273 2 69 -669 +661 @@ -19382,7 +19361,7 @@ 1 2 -4627983 +4572935 @@ -19398,12 +19377,12 @@ 1 2 -4612936 +4558064 2 4 -15047 +14870 @@ -19419,22 +19398,22 @@ 1 2 -2166673 +2140887 2 3 -475124 +469349 3 4 -244460 +241595 4 65 -157676 +155828 @@ -19450,22 +19429,22 @@ 1 2 -2166673 +2140887 2 3 -475124 +469349 3 4 -244460 +241595 4 65 -157676 +155828 @@ -19481,22 +19460,22 @@ 1 2 -2283256 +2255896 2 3 -470978 +465458 3 5 -254331 +251350 5 20 -35369 +34954 @@ -19512,12 +19491,12 @@ 1 2 -350 +346 4 5 -142 +140 6 @@ -19536,7 +19515,7 @@ 14377 -277376 +277321 43 @@ -19553,12 +19532,12 @@ 1 2 -350 +346 4 5 -142 +140 6 @@ -19577,7 +19556,7 @@ 14377 -277548 +277493 43 @@ -19594,12 +19573,12 @@ 1 2 -350 +346 2 3 -142 +140 4 @@ -19618,7 +19597,7 @@ 2870 -151163 +151119 43 @@ -19635,22 +19614,22 @@ 1 2 -1504765 +1486737 2 3 -186717 +184518 3 14 -139492 +137781 14 5175 -25871 +25568 @@ -19666,22 +19645,22 @@ 1 2 -1524627 +1506355 2 3 -179852 +177679 3 23 -139723 +138074 23 4690 -12645 +12497 @@ -19697,12 +19676,12 @@ 1 2 -1745157 +1724311 2 65 -111690 +110294 @@ -19712,15 +19691,15 @@ overrides -159058 +158806 new -124549 +124352 old -15465 +15440 @@ -19734,12 +19713,12 @@ 1 2 -90046 +89904 2 3 -34496 +34441 3 @@ -19760,37 +19739,37 @@ 1 2 -8126 +8113 2 3 -2016 +2013 3 4 -871 +870 4 5 -1262 +1260 5 10 -1229 +1227 10 43 -1164 +1162 44 218 -793 +792 @@ -19800,19 +19779,19 @@ membervariables -310308 +308142 id -305691 +300035 type_id -132923 +56417 name -53224 +94717 @@ -19826,12 +19805,12 @@ 1 2 -301227 +292000 2 -7 -4463 +5 +8035 @@ -19847,7 +19826,7 @@ 1 2 -305691 +300035 @@ -19863,22 +19842,27 @@ 1 2 -108071 +40463 2 3 -12272 +7041 3 -9 -10056 +6 +4586 -9 -1712 -2522 +6 +423 +4235 + + +460 +3062 +90 @@ -19894,17 +19878,22 @@ 1 2 -115123 +44789 2 3 -9091 +5326 3 -266 -8708 +9 +4462 + + +9 +1352 +1838 @@ -19920,32 +19909,22 @@ 1 2 -28098 +63303 2 3 -8170 +16272 3 -4 -5373 - - -4 -6 -4014 - - -6 -15 -4090 +5 +8288 -15 -1967 -3476 +5 +1294 +6853 @@ -19961,32 +19940,17 @@ 1 2 -34294 +75353 2 3 -6854 +12998 3 -4 -3695 - - -4 -7 -4299 - - -7 -242 -3992 - - -262 -605 -87 +421 +6366 @@ -20167,19 +20131,19 @@ localvariables -521293 +520470 id -521215 +520392 type_id -47528 +47453 name -75238 +75119 @@ -20193,12 +20157,12 @@ 1 2 -521137 +520314 2 3 -78 +77 @@ -20214,7 +20178,7 @@ 1 2 -521215 +520392 @@ -20230,32 +20194,32 @@ 1 2 -26473 +26432 2 3 -6759 +6749 3 4 -2856 +2851 4 6 -4059 +4053 6 13 -3806 +3800 13 3196 -3565 +3559 4920 @@ -20276,22 +20240,22 @@ 1 2 -35699 +35643 2 3 -4873 +4865 3 5 -4268 +4261 5 1158 -2687 +2682 @@ -20307,32 +20271,32 @@ 1 2 -42960 +42892 2 3 -12914 +12894 3 4 -5087 +5079 4 7 -6720 +6710 7 31 -5705 +5696 31 6112 -1847 +1844 @@ -20348,17 +20312,17 @@ 1 2 -63735 +63634 2 3 -6389 +6379 3 819 -5113 +5105 @@ -20368,11 +20332,11 @@ autoderivation -19512 +19481 var -19512 +19481 derivation_type @@ -20390,7 +20354,7 @@ 1 2 -19512 +19481 @@ -20436,31 +20400,31 @@ enumconstants -93839 +93691 id -93839 +93691 parent -8009 +7996 index -7579 +7567 type_id -7866 +7853 name -72902 +72787 location -75869 +75749 @@ -20474,7 +20438,7 @@ 1 2 -93839 +93691 @@ -20490,7 +20454,7 @@ 1 2 -93839 +93691 @@ -20506,7 +20470,7 @@ 1 2 -93839 +93691 @@ -20522,7 +20486,7 @@ 1 2 -93839 +93691 @@ -20538,7 +20502,7 @@ 1 2 -93839 +93691 @@ -20554,47 +20518,47 @@ 1 2 -1594 +1591 2 3 -819 +818 3 4 -2452 +2448 4 5 -579 +578 5 6 -579 +578 6 9 -728 +727 9 16 -611 +610 16 392 -605 +604 426 1166 -39 +38 @@ -20610,42 +20574,42 @@ 1 2 -1594 +1591 2 3 -832 +831 3 4 -2498 +2494 4 5 -572 +571 5 6 -585 +584 6 9 -702 +701 9 17 -624 +623 17 1166 -598 +597 @@ -20661,12 +20625,12 @@ 1 2 -7267 +7255 2 3 -741 +740 @@ -20682,42 +20646,42 @@ 1 2 -1594 +1591 2 3 -832 +831 3 4 -2498 +2494 4 5 -572 +571 5 6 -585 +584 6 9 -702 +701 9 17 -624 +623 17 1166 -598 +597 @@ -20733,42 +20697,42 @@ 1 2 -1633 +1630 2 3 -832 +831 3 4 -2452 +2448 4 5 -579 +578 5 6 -559 +558 6 9 -702 +701 9 16 -611 +610 16 427 -605 +604 466 @@ -20789,47 +20753,47 @@ 1 2 -2609 +2604 2 3 -930 +928 3 4 -923 +922 4 7 -572 +571 7 10 -689 +688 10 11 -351 +350 11 12 -553 +552 12 30 -598 +597 30 1253 -351 +350 @@ -20845,47 +20809,47 @@ 1 2 -2609 +2604 2 3 -930 +928 3 4 -923 +922 4 7 -572 +571 7 9 -676 +675 9 11 -364 +363 11 12 -553 +552 12 29 -598 +597 29 1232 -351 +350 @@ -20901,47 +20865,47 @@ 1 2 -2609 +2604 2 3 -930 +928 3 4 -923 +922 4 7 -572 +571 7 9 -676 +675 9 11 -364 +363 11 12 -553 +552 12 28 -598 +597 28 1210 -351 +350 @@ -20957,47 +20921,47 @@ 1 2 -2609 +2604 2 3 -930 +928 3 4 -923 +922 4 7 -572 +571 7 10 -689 +688 10 11 -351 +350 11 12 -553 +552 12 28 -598 +597 28 674 -351 +350 @@ -21013,47 +20977,47 @@ 1 2 -2609 +2604 2 3 -930 +928 3 4 -923 +922 4 7 -572 +571 7 10 -689 +688 10 11 -351 +350 11 12 -553 +552 12 28 -598 +597 28 774 -351 +350 @@ -21069,42 +21033,42 @@ 1 2 -1594 +1591 2 3 -800 +799 3 4 -2426 +2422 4 5 -559 +558 5 6 -559 +558 6 9 -702 +701 9 16 -598 +597 16 470 -592 +591 479 @@ -21125,7 +21089,7 @@ 1 2 -7859 +7847 137 @@ -21146,42 +21110,42 @@ 1 2 -1594 +1591 2 3 -813 +811 3 4 -2472 +2468 4 5 -553 +552 5 6 -566 +565 6 9 -676 +675 9 17 -611 +610 17 1166 -579 +578 @@ -21197,42 +21161,42 @@ 1 2 -1594 +1591 2 3 -813 +811 3 4 -2472 +2468 4 5 -553 +552 5 6 -566 +565 6 9 -676 +675 9 17 -611 +610 17 1166 -579 +578 @@ -21248,47 +21212,47 @@ 1 2 -1633 +1630 2 3 -813 +811 3 4 -2426 +2422 4 5 -559 +558 5 6 -540 +539 6 9 -676 +675 9 16 -598 +597 16 470 -592 +591 621 1166 -26 +25 @@ -21304,17 +21268,17 @@ 1 2 -65543 +65440 2 3 -6838 +6827 3 239 -520 +519 @@ -21330,17 +21294,17 @@ 1 2 -66188 +66083 2 3 -6193 +6184 3 239 -520 +519 @@ -21356,12 +21320,12 @@ 1 2 -67879 +67772 2 13 -5022 +5014 @@ -21377,17 +21341,17 @@ 1 2 -61145 +61049 2 3 -11236 +11218 3 239 -520 +519 @@ -21403,12 +21367,12 @@ 1 2 -70430 +70318 2 23 -2472 +2468 @@ -21424,12 +21388,12 @@ 1 2 -70579 +70468 2 229 -5289 +5281 @@ -21445,12 +21409,12 @@ 1 2 -70690 +70578 2 229 -5178 +5170 @@ -21466,12 +21430,12 @@ 1 2 -72271 +72157 2 17 -3597 +3592 @@ -21487,12 +21451,12 @@ 1 2 -65648 +65544 2 3 -9967 +9951 3 @@ -21513,12 +21477,12 @@ 1 2 -75700 +75580 2 27 -169 +168 @@ -21528,23 +21492,23 @@ builtintypes -515 +509 id -515 +509 name -515 +509 kind -515 +509 size -76 +75 sign @@ -21566,7 +21530,7 @@ 1 2 -515 +509 @@ -21582,7 +21546,7 @@ 1 2 -515 +509 @@ -21598,7 +21562,7 @@ 1 2 -515 +509 @@ -21614,7 +21578,7 @@ 1 2 -515 +509 @@ -21630,7 +21594,7 @@ 1 2 -515 +509 @@ -21646,7 +21610,7 @@ 1 2 -515 +509 @@ -21662,7 +21626,7 @@ 1 2 -515 +509 @@ -21678,7 +21642,7 @@ 1 2 -515 +509 @@ -21694,7 +21658,7 @@ 1 2 -515 +509 @@ -21710,7 +21674,7 @@ 1 2 -515 +509 @@ -21726,7 +21690,7 @@ 1 2 -515 +509 @@ -21742,7 +21706,7 @@ 1 2 -515 +509 @@ -21758,7 +21722,7 @@ 1 2 -515 +509 @@ -21774,7 +21738,7 @@ 1 2 -515 +509 @@ -21790,7 +21754,7 @@ 1 2 -515 +509 @@ -22240,23 +22204,23 @@ derivedtypes -4463123 +4408457 id -4463123 +4408457 name -2202887 +2176199 kind -87 +86 type_id -2610563 +2578132 @@ -22270,7 +22234,7 @@ 1 2 -4463123 +4408457 @@ -22286,7 +22250,7 @@ 1 2 -4463123 +4408457 @@ -22302,7 +22266,7 @@ 1 2 -4463123 +4408457 @@ -22318,17 +22282,17 @@ 1 2 -1593501 +1573891 2 3 -493889 +488328 3 -45177 -115496 +45171 +113980 @@ -22344,7 +22308,7 @@ 1 2 -2202855 +2176167 2 @@ -22365,17 +22329,17 @@ 1 2 -1593743 +1574130 2 3 -493659 +488100 3 -45159 -115485 +45153 +113969 @@ -22409,23 +22373,23 @@ 10 -45229 -45230 +45223 +45224 10 -61034 -61035 +61016 +61017 10 -97001 -97002 +96858 +96859 10 -170398 -170399 +170348 +170349 10 @@ -22465,18 +22429,18 @@ 10 -40954 -40955 +40934 +40935 10 -48341 -48342 +48321 +48322 10 -92928 -92929 +92888 +92889 10 @@ -22511,23 +22475,23 @@ 10 -45229 -45230 +45223 +45224 10 -61034 -61035 +61016 +61017 10 -96670 -96671 +96527 +96528 10 -170398 -170399 +170348 +170349 10 @@ -22544,22 +22508,22 @@ 1 2 -1541056 +1521486 2 3 -369487 +365026 3 4 -628085 +620527 4 202 -71934 +71091 @@ -22575,22 +22539,22 @@ 1 2 -1542273 +1522689 2 3 -369334 +364874 3 4 -627021 +619476 4 198 -71934 +71091 @@ -22606,22 +22570,22 @@ 1 2 -1542591 +1523003 2 3 -370617 +366143 3 4 -626977 +619433 4 7 -70377 +69552 @@ -22631,11 +22595,11 @@ pointerishsize -3375893 +3335520 id -3375893 +3335520 size @@ -22657,7 +22621,7 @@ 1 2 -3375893 +3335520 @@ -22673,7 +22637,7 @@ 1 2 -3375893 +3335520 @@ -22692,8 +22656,8 @@ 10 -307794 -307795 +307720 +307721 10 @@ -22724,8 +22688,8 @@ 12 -307815 -307816 +307741 +307742 10 @@ -22752,23 +22716,23 @@ arraysizes -17196 +16995 id -17196 +16995 num_elements -2160 +2135 bytesize -2511 +2482 alignment -76 +75 @@ -22782,7 +22746,7 @@ 1 2 -17196 +16995 @@ -22798,7 +22762,7 @@ 1 2 -17196 +16995 @@ -22814,7 +22778,7 @@ 1 2 -17196 +16995 @@ -22830,37 +22794,37 @@ 1 2 -164 +162 2 3 -1272 +1257 3 4 -76 +75 4 5 -175 +173 5 13 -164 +162 13 25 -164 +162 38 116 -142 +140 @@ -22876,22 +22840,22 @@ 1 2 -1590 +1571 2 3 -219 +216 3 4 -120 +119 4 6 -164 +162 6 @@ -22912,22 +22876,22 @@ 1 2 -1590 +1571 2 3 -241 +238 3 4 -142 +140 4 7 -164 +162 7 @@ -22948,37 +22912,37 @@ 1 2 -153 +151 2 3 -1403 +1387 3 4 -109 +108 4 6 -208 +205 6 9 -197 +195 9 18 -208 +205 21 56 -197 +195 59 @@ -22999,17 +22963,17 @@ 1 2 -1908 +1885 2 3 -350 +346 3 6 -219 +216 6 @@ -23030,17 +22994,17 @@ 1 2 -1952 +1929 2 3 -285 +281 3 5 -230 +227 5 @@ -23188,15 +23152,15 @@ typedefbase -1819702 +1798090 id -1819702 +1798090 type_id -847375 +837313 @@ -23210,7 +23174,7 @@ 1 2 -1819702 +1798090 @@ -23226,22 +23190,22 @@ 1 2 -656643 +648849 2 3 -87913 +86937 3 6 -69598 +68695 6 5503 -33219 +32830 @@ -23251,19 +23215,19 @@ decltypes -47005 +46454 id -47005 +46454 expr -43441 +42932 base_type -8631 +8530 parentheses_would_change_meaning @@ -23281,7 +23245,7 @@ 1 2 -47005 +46454 @@ -23297,7 +23261,7 @@ 1 2 -47005 +46454 @@ -23313,7 +23277,7 @@ 1 2 -47005 +46454 @@ -23329,12 +23293,12 @@ 1 2 -40162 +39691 2 4 -3279 +3240 @@ -23350,12 +23314,12 @@ 1 2 -40162 +39691 2 4 -3279 +3240 @@ -23371,7 +23335,7 @@ 1 2 -43441 +42932 @@ -23387,17 +23351,17 @@ 1 2 -5823 +5755 2 3 -2522 +2492 3 274 -285 +281 @@ -23413,17 +23377,17 @@ 1 2 -2314 +2286 2 3 -5702 +5636 3 2451 -614 +606 @@ -23439,7 +23403,7 @@ 1 2 -8631 +8530 @@ -23512,19 +23476,19 @@ usertypes -4193942 +4144306 id -4193942 +4144306 name -879411 +868886 kind -120 +119 @@ -23538,7 +23502,7 @@ 1 2 -4193942 +4144306 @@ -23554,7 +23518,7 @@ 1 2 -4193942 +4144306 @@ -23570,22 +23534,22 @@ 1 2 -577471 +570463 2 3 -194800 +192539 3 7 -69313 +68500 7 -32744 -37826 +32725 +37382 @@ -23601,12 +23565,12 @@ 1 2 -826768 +816860 2 10 -52642 +52025 @@ -23645,8 +23609,8 @@ 10 -16789 -16790 +16782 +16783 10 @@ -23665,13 +23629,13 @@ 10 -95209 -95210 +95191 +95192 10 -149132 -149133 +149113 +149114 10 @@ -23731,8 +23695,8 @@ 10 -55460 -55461 +55440 +55441 10 @@ -23743,19 +23707,19 @@ usertypesize -1386604 +1370156 id -1386604 +1370156 size -1480 +1463 alignment -87 +86 @@ -23769,7 +23733,7 @@ 1 2 -1386604 +1370156 @@ -23785,7 +23749,7 @@ 1 2 -1386604 +1370156 @@ -23801,12 +23765,12 @@ 1 2 -427 +422 2 3 -197 +195 3 @@ -23816,37 +23780,37 @@ 4 5 -87 +86 5 8 -120 +119 8 12 -109 +108 12 17 -120 +119 19 38 -120 +119 42 261 -120 +119 284 -99380 -109 +99362 +108 @@ -23862,17 +23826,17 @@ 1 2 -1217 +1203 2 3 -175 +173 3 6 -87 +86 @@ -23921,8 +23885,8 @@ 10 -113881 -113882 +113863 +113864 10 @@ -23979,26 +23943,26 @@ usertype_final -1314 +1312 id -1314 +1312 usertype_uuid -4834 +4826 id -4834 +4826 uuid -4834 +4826 @@ -24012,7 +23976,7 @@ 1 2 -4834 +4826 @@ -24028,7 +23992,7 @@ 1 2 -4834 +4826 @@ -24038,15 +24002,15 @@ mangled_name -4190663 +4141065 id -4190663 +4141065 mangled_name -483689 +478020 @@ -24060,7 +24024,7 @@ 1 2 -4190663 +4141065 @@ -24076,32 +24040,32 @@ 1 2 -292091 +288667 2 3 -62294 +61563 3 4 -33340 +32949 4 7 -36970 +36537 7 24 -37069 +36634 24 8580 -21923 +21666 @@ -24111,59 +24075,59 @@ is_pod_class -589228 +582213 id -589228 +582213 is_standard_layout_class -1159208 +1145425 id -1159208 +1145425 is_complete -1365097 +1348901 id -1365097 +1348901 is_class_template -225355 +222714 id -225355 +222714 class_instantiation -1157815 +1144049 to -1156247 +1142499 from -68030 +67232 @@ -24177,12 +24141,12 @@ 1 2 -1154766 +1141036 2 4 -1480 +1463 @@ -24198,47 +24162,47 @@ 1 2 -19960 +19726 2 3 -11998 +11857 3 4 -6854 +6774 4 5 -4617 +4563 5 7 -5637 +5571 7 11 -6053 +5982 11 20 -5198 +5137 20 84 -5110 +5050 84 4845 -2599 +2568 @@ -24248,19 +24212,19 @@ class_template_argument -3036083 +3000322 type_id -1392844 +1376323 index -1228 +1213 arg_type -860931 +850742 @@ -24274,27 +24238,27 @@ 1 2 -567118 +560264 2 3 -433744 +428660 3 4 -244987 +242126 4 7 -122811 +121372 7 113 -24182 +23899 @@ -24310,22 +24274,22 @@ 1 2 -593351 +586190 2 3 -445973 +440746 3 4 -258443 +255425 4 113 -95075 +93960 @@ -24346,31 +24310,31 @@ 2 3 -778 +769 3 26 -98 +97 29 64 -98 +97 69 435 -98 +97 616 9358 -98 +97 13712 -123925 +123907 43 @@ -24392,31 +24356,31 @@ 2 3 -778 +769 3 14 -109 +108 14 26 -98 +97 29 148 -98 +97 198 3602 -98 +97 -11970 -41382 +11971 +41372 32 @@ -24433,27 +24397,27 @@ 1 2 -522294 +516183 2 3 -187441 +185136 3 4 -56711 +56047 4 11 -67393 +66603 11 -11851 -27089 +11852 +26771 @@ -24469,17 +24433,17 @@ 1 2 -746476 +737629 2 3 -95546 +94426 3 22 -18907 +18685 @@ -24489,19 +24453,19 @@ class_template_argument_value -345798 +342536 type_id -223842 +221229 index -153 +151 arg_value -328239 +325172 @@ -24515,17 +24479,17 @@ 1 2 -201479 +199129 2 3 -13709 +13548 3 14 -8653 +8551 @@ -24541,22 +24505,22 @@ 1 2 -189854 +187640 2 3 -16922 +16724 3 37 -16790 +16594 44 171 -274 +270 @@ -24615,8 +24579,8 @@ 10 -9812 -9813 +9813 +9814 10 @@ -24661,13 +24625,13 @@ 10 -1582 -1583 +1597 +1598 10 -6332 -6333 +6347 +6348 10 @@ -24676,8 +24640,8 @@ 10 -12052 -12053 +12094 +12095 10 @@ -24694,12 +24658,12 @@ 1 2 -310999 +308123 2 4 -17240 +17049 @@ -24715,7 +24679,7 @@ 1 2 -328239 +325172 @@ -24725,15 +24689,15 @@ is_proxy_class_for -46380 +45836 id -46380 +45836 templ_param_id -46380 +45836 @@ -24747,7 +24711,7 @@ 1 2 -46380 +45836 @@ -24763,7 +24727,7 @@ 1 2 -46380 +45836 @@ -24773,23 +24737,23 @@ type_mentions -1677532 +1674881 id -1677532 +1674881 type_id -67209 +67096 location -1647024 +1644422 kind -13 +12 @@ -24803,7 +24767,7 @@ 1 2 -1677532 +1674881 @@ -24819,7 +24783,7 @@ 1 2 -1677532 +1674881 @@ -24835,7 +24799,7 @@ 1 2 -1677532 +1674881 @@ -24851,37 +24815,37 @@ 1 2 -30071 +30024 2 3 -12309 +12283 3 4 -3636 +3631 4 7 -6070 +6054 7 13 -5139 +5138 13 35 -5191 +5183 35 9490 -4788 +4781 @@ -24897,37 +24861,37 @@ 1 2 -30071 +30024 2 3 -12309 +12283 3 4 -3636 +3631 4 7 -6070 +6054 7 13 -5139 +5138 13 35 -5191 +5183 35 9490 -4788 +4781 @@ -24943,12 +24907,12 @@ 1 2 -65966 +65856 2 3 -1242 +1240 @@ -24964,12 +24928,12 @@ 1 2 -1616855 +1614300 2 5 -30169 +30121 @@ -24985,12 +24949,12 @@ 1 2 -1616855 +1614300 2 5 -30169 +30121 @@ -25006,7 +24970,7 @@ 1 2 -1647024 +1644422 @@ -25046,8 +25010,8 @@ 6 -10314 -10315 +10313 +10314 6 @@ -25079,26 +25043,26 @@ is_function_template -983786 +972255 id -983786 +972255 function_instantiation -708332 +700030 to -708332 +700030 from -129337 +127821 @@ -25112,7 +25076,7 @@ 1 2 -708332 +700030 @@ -25128,37 +25092,37 @@ 1 2 -61010 +60295 2 3 -30839 +30478 3 4 -7348 +7261 4 5 -8817 +8714 5 10 -10002 +9884 10 71 -9706 +9592 71 653 -1612 +1593 @@ -25168,19 +25132,19 @@ function_template_argument -1910587 +1888193 function_id -1054394 +1042035 index -219 +216 arg_type -338461 +334493 @@ -25194,22 +25158,22 @@ 1 2 -583601 +576761 2 3 -291016 +287605 3 4 -127768 +126271 4 21 -52006 +51397 @@ -25225,22 +25189,22 @@ 1 2 -598023 +591014 2 3 -288702 +285318 3 4 -110945 +109644 4 21 -56722 +56057 @@ -25478,27 +25442,27 @@ 1 2 -226134 +223483 2 3 -45119 +44590 3 6 -27670 +27346 6 19 -25608 +25308 19 2030 -13928 +13765 @@ -25514,12 +25478,12 @@ 1 2 -314837 +311147 2 12 -23623 +23346 @@ -25529,19 +25493,19 @@ function_template_argument_value -198069 +197655 function_id -107084 +105829 index -153 +151 arg_value -170607 +170363 @@ -25555,12 +25519,12 @@ 1 2 -101567 +100377 2 14 -5516 +5451 @@ -25576,17 +25540,17 @@ 1 2 -84963 +83967 2 3 -16176 +15987 3 -113 -5944 +119 +5874 @@ -25671,33 +25635,33 @@ 10 -157 -158 +169 +170 10 -405 -406 +408 +409 10 -973 -974 +1024 +1025 10 -2523 -2524 +2547 +2548 10 -4858 -4859 +4912 +4913 10 -6595 -6596 +6613 +6614 10 @@ -25714,17 +25678,17 @@ 1 2 -143649 +143569 2 3 -26453 +26294 3 4 -504 +498 @@ -25740,7 +25704,7 @@ 1 2 -170607 +170363 @@ -25750,26 +25714,26 @@ is_variable_template -17810 +17602 id -17810 +17602 variable_instantiation -35808 +35388 to -35808 +35388 from -6470 +6394 @@ -25783,7 +25747,7 @@ 1 2 -35808 +35388 @@ -25799,37 +25763,37 @@ 1 2 -2237 +2211 2 3 -1908 +1885 3 4 -361 +357 4 5 -734 +726 5 9 -537 +531 9 21 -493 +487 24 288 -197 +195 @@ -25839,11 +25803,11 @@ variable_template_argument -5484 +5476 variable_id -845 +844 index @@ -25851,7 +25815,7 @@ arg_type -4203 +4196 @@ -25865,7 +25829,7 @@ 1 2 -683 +682 2 @@ -25875,7 +25839,7 @@ 3 5 -39 +38 @@ -25896,12 +25860,12 @@ 2 3 -130 +129 3 4 -65 +64 4 @@ -25916,12 +25880,12 @@ 8 13 -65 +64 13 85 -65 +64 202 @@ -26014,7 +25978,7 @@ 1 2 -3480 +3475 2 @@ -26024,7 +25988,7 @@ 3 11 -247 +246 @@ -26040,7 +26004,7 @@ 1 2 -3988 +3982 2 @@ -26063,7 +26027,7 @@ index -13 +12 arg_value @@ -26081,7 +26045,7 @@ 1 2 -13 +12 2 @@ -26102,7 +26066,7 @@ 3 4 -13 +12 15 @@ -26191,15 +26155,15 @@ routinetypes -430487 +421539 id -430487 +421539 return_type -177571 +173397 @@ -26213,7 +26177,7 @@ 1 2 -430487 +421539 @@ -26229,22 +26193,22 @@ 1 2 -143112 +139917 2 3 -18128 +17580 3 -9 -13325 +10 +13342 -9 +10 8267 -3005 +2557 @@ -26254,19 +26218,19 @@ routinetypeargs -719859 +704387 routine -351852 +344519 index -350 +346 type_id -205570 +202391 @@ -26280,27 +26244,27 @@ 1 2 -161931 +158418 2 3 -95952 +94112 3 4 -53937 +53066 4 6 -32331 +31421 6 33 -7699 +7500 @@ -26316,22 +26280,22 @@ 1 2 -186750 +182632 2 3 -96709 +94925 3 4 -47663 +46563 4 22 -20728 +20398 @@ -26347,7 +26311,7 @@ 1 2 -120 +119 2 @@ -26365,43 +26329,43 @@ 21 -52 -74 +51 +72 21 -93 -115 +90 +111 21 -139 -199 +134 +193 21 -269 -364 +262 +356 21 -473 -703 +464 +693 21 -1449 -3651 +1438 +3592 21 -8568 -17318 +8487 +17171 21 -32082 -32083 +31786 +31787 10 @@ -26418,7 +26382,7 @@ 1 2 -120 +119 2 @@ -26436,18 +26400,18 @@ 21 -33 -37 +32 +36 21 -38 -42 +37 +41 21 -44 -83 +43 +82 21 @@ -26466,13 +26430,13 @@ 21 -2679 -6045 +2669 +6025 21 -13491 -13492 +13431 +13432 10 @@ -26489,27 +26453,27 @@ 1 2 -122416 +120526 2 3 -40842 +40265 3 4 -13215 +12963 4 7 -16637 +16420 7 -1349 -12458 +1325 +12215 @@ -26525,17 +26489,17 @@ 1 2 -154112 +151709 2 3 -39438 +38835 3 33 -12020 +11846 @@ -26545,19 +26509,19 @@ ptrtomembers -12634 +12486 id -12634 +12486 type_id -9398 +9288 class_id -6361 +6286 @@ -26571,7 +26535,7 @@ 1 2 -12634 +12486 @@ -26587,7 +26551,7 @@ 1 2 -12634 +12486 @@ -26603,12 +26567,12 @@ 1 2 -9037 +8931 2 111 -361 +357 @@ -26624,12 +26588,12 @@ 1 2 -9037 +8931 2 111 -361 +357 @@ -26645,17 +26609,17 @@ 1 2 -5341 +5278 2 3 -515 +509 8 65 -504 +498 @@ -26671,17 +26635,17 @@ 1 2 -5341 +5278 2 3 -515 +509 8 65 -504 +498 @@ -26691,15 +26655,15 @@ specifiers -504 +498 id -504 +498 str -504 +498 @@ -26713,7 +26677,7 @@ 1 2 -504 +498 @@ -26729,7 +26693,7 @@ 1 2 -504 +498 @@ -26739,15 +26703,15 @@ typespecifiers -1333215 +1316038 type_id -1326328 +1309231 spec_id -76 +75 @@ -26761,12 +26725,12 @@ 1 2 -1319440 +1302424 2 3 -6887 +6806 @@ -26810,8 +26774,8 @@ 10 -96536 -96537 +96393 +96394 10 @@ -26822,15 +26786,15 @@ funspecifiers -11122577 +11898581 func_id -3417865 +3610802 spec_id -175 +173 @@ -26844,27 +26808,27 @@ 1 2 -342321 +332055 2 3 -421977 +428379 3 4 -853879 +865569 4 5 -1680922 +1867415 5 8 -118764 +117383 @@ -26928,8 +26892,8 @@ 10 -27095 -27096 +28391 +28392 10 @@ -26938,23 +26902,23 @@ 10 -139439 -139440 +160563 +160564 10 -222376 -222377 +240969 +240970 10 -250677 -250678 +271992 +271993 10 -284037 -284038 +305333 +305334 10 @@ -26965,15 +26929,15 @@ varspecifiers -1112009 +1110252 var_id -924798 +923337 spec_id -65 +64 @@ -26987,17 +26951,17 @@ 1 2 -786189 +784946 2 3 -91660 +91515 3 5 -46949 +46874 @@ -27068,11 +27032,11 @@ attributes -413727 +414234 id -413727 +414234 kind @@ -27088,7 +27052,7 @@ location -90509 +90620 @@ -27102,7 +27066,7 @@ 1 2 -413727 +414234 @@ -27118,7 +27082,7 @@ 1 2 -413727 +414234 @@ -27134,7 +27098,7 @@ 1 2 -413727 +414234 @@ -27150,7 +27114,7 @@ 1 2 -413727 +414234 @@ -27468,32 +27432,32 @@ 1 2 -26730 +26763 2 3 -5313 +5319 3 4 -29996 +30032 4 8 -7387 +7396 8 9 -17697 +17719 9 73 -3384 +3388 @@ -27509,7 +27473,7 @@ 1 2 -90509 +90620 @@ -27525,22 +27489,22 @@ 1 2 -28415 +28450 2 3 -4680 +4685 3 4 -49670 +49730 4 9 -7364 +7373 9 @@ -27561,7 +27525,7 @@ 1 2 -90509 +90620 @@ -27571,11 +27535,11 @@ attribute_args -152614 +152801 id -152614 +152801 kind @@ -27583,7 +27547,7 @@ attribute -151315 +151500 index @@ -27591,7 +27555,7 @@ location -57361 +57431 @@ -27605,7 +27569,7 @@ 1 2 -152614 +152801 @@ -27621,7 +27585,7 @@ 1 2 -152614 +152801 @@ -27637,7 +27601,7 @@ 1 2 -152614 +152801 @@ -27653,7 +27617,7 @@ 1 2 -152614 +152801 @@ -27753,12 +27717,12 @@ 1 2 -150537 +150721 2 5 -778 +779 @@ -27774,12 +27738,12 @@ 1 2 -150825 +151010 2 3 -489 +490 @@ -27795,12 +27759,12 @@ 1 2 -150537 +150721 2 5 -778 +779 @@ -27816,12 +27780,12 @@ 1 2 -150542 +150726 2 5 -773 +774 @@ -27951,27 +27915,27 @@ 1 2 -27295 +27328 2 3 -8428 +8439 3 5 -2886 +2889 5 6 -17600 +17621 6 37 -1150 +1152 @@ -27987,12 +27951,12 @@ 1 2 -51566 +51629 2 3 -5795 +5802 @@ -28008,27 +27972,27 @@ 1 2 -27280 +27314 2 3 -8445 +8455 3 5 -2884 +2888 5 6 -17600 +17621 6 37 -1150 +1152 @@ -28044,7 +28008,7 @@ 1 2 -57356 +57427 3 @@ -28059,15 +28023,15 @@ attribute_arg_value -152590 +152776 arg -152590 +152776 value -2187 +2190 @@ -28081,7 +28045,7 @@ 1 2 -152590 +152776 @@ -28097,7 +28061,7 @@ 1 2 -1730 +1732 2 @@ -28228,15 +28192,15 @@ typeattributes -19324 +19097 type_id -17942 +17732 spec_id -19324 +19097 @@ -28250,12 +28214,12 @@ 1 2 -17240 +17038 2 34 -701 +693 @@ -28271,7 +28235,7 @@ 1 2 -19324 +19097 @@ -28281,15 +28245,15 @@ funcattributes -304396 +300785 func_id -164245 +162277 spec_id -304396 +300785 @@ -28303,22 +28267,22 @@ 1 2 -89690 +88595 2 3 -12579 +12432 3 4 -59969 +59266 4 14 -2007 +1983 @@ -28334,7 +28298,7 @@ 1 2 -304396 +300785 @@ -28402,15 +28366,15 @@ stmtattributes -6 +986 stmt_id -6 +986 spec_id -6 +986 @@ -28424,7 +28388,7 @@ 1 2 -6 +986 @@ -28440,7 +28404,7 @@ 1 2 -6 +986 @@ -28450,15 +28414,15 @@ unspecifiedtype -9115641 +9002061 type_id -9115641 +9002061 unspecified_type_id -5012847 +4949385 @@ -28472,7 +28436,7 @@ 1 2 -9115641 +9002061 @@ -28488,17 +28452,17 @@ 1 2 -2736095 +2701086 2 3 -1962057 +1937281 3 7950 -314695 +311017 @@ -28508,19 +28472,19 @@ member -4921797 +5094949 parent -814507 +804764 index -2676 +2644 child -4906234 +5079548 @@ -28533,48 +28497,43 @@ 1 -2 -42322 - - -2 3 -223787 +70343 3 4 -204627 +381479 4 5 -86926 +94416 5 7 -65902 +68793 7 9 -61614 +59396 9 15 -62052 +63850 15 47 -61186 +60469 47 245 -6086 +6015 @@ -28589,48 +28548,43 @@ 1 -2 -41664 - - -2 3 -223611 +69812 3 4 -199385 +375930 4 5 -89734 +97841 5 7 -66373 +68685 7 9 -61690 +59461 9 15 -62974 +64772 15 42 -61274 +60555 42 281 -7797 +7706 @@ -28646,62 +28600,62 @@ 1 2 -493 +487 2 5 -241 +238 5 10 -230 +227 10 64 -208 +205 65 137 -208 +205 144 213 -208 +205 219 295 -208 +205 299 -390 -208 +393 +216 -392 -629 -208 +393 +649 +205 -648 -3431 -208 +649 +3628 +205 -3625 -22436 -208 +3644 +31598 +205 -30800 -73591 -43 +65753 +73573 +32 @@ -28717,62 +28671,62 @@ 1 2 -482 +476 2 5 -197 +195 5 9 -208 +205 9 22 -208 +205 25 132 -208 +205 132 199 -208 +205 199 279 -208 +205 279 -362 -208 +366 +205 -365 +382 480 -208 +205 -487 +489 1630 -208 +205 1771 -8138 -208 +8155 +205 -8900 -74537 -120 +8939 +74519 +119 @@ -28788,7 +28742,7 @@ 1 2 -4906234 +5079548 @@ -28804,12 +28758,12 @@ 1 2 -4890880 +5064362 2 7 -15354 +15185 @@ -28819,15 +28773,15 @@ enclosingfunction -125081 +123615 child -125081 +123615 parent -71407 +70570 @@ -28841,7 +28795,7 @@ 1 2 -125081 +123615 @@ -28857,27 +28811,27 @@ 1 2 -38341 +37892 2 3 -21079 +20832 3 4 -6536 +6459 4 7 -5373 +5310 7 45 -76 +75 @@ -28887,15 +28841,15 @@ derivations -390270 +385706 derivation -390270 +385706 sub -364453 +360192 index @@ -28903,11 +28857,11 @@ super -235708 +232945 location -86981 +85961 @@ -28921,7 +28875,7 @@ 1 2 -390270 +385706 @@ -28937,7 +28891,7 @@ 1 2 -390270 +385706 @@ -28953,7 +28907,7 @@ 1 2 -390270 +385706 @@ -28969,7 +28923,7 @@ 1 2 -390270 +385706 @@ -28985,12 +28939,12 @@ 1 2 -341883 +337886 2 7 -22570 +22306 @@ -29006,12 +28960,12 @@ 1 2 -351501 +347392 2 7 -12952 +12800 @@ -29027,12 +28981,12 @@ 1 2 -341893 +337897 2 7 -22559 +22295 @@ -29048,12 +29002,12 @@ 1 2 -351490 +347381 2 7 -12963 +12811 @@ -29092,8 +29046,8 @@ 10 -34120 -34121 +34121 +34122 10 @@ -29133,8 +29087,8 @@ 10 -33231 -33232 +33232 +33233 10 @@ -29233,12 +29187,12 @@ 1 2 -220924 +218324 2 1142 -14783 +14621 @@ -29254,12 +29208,12 @@ 1 2 -220935 +218335 2 1142 -14772 +14610 @@ -29275,12 +29229,12 @@ 1 2 -235259 +232501 2 4 -449 +444 @@ -29296,12 +29250,12 @@ 1 2 -228349 +225673 2 439 -7359 +7272 @@ -29317,22 +29271,22 @@ 1 2 -66352 +65574 2 3 -8389 +8291 3 7 -6613 +6535 7 795 -5626 +5560 @@ -29348,22 +29302,22 @@ 1 2 -68589 +67785 2 3 -6371 +6297 3 8 -7040 +6958 8 795 -4979 +4920 @@ -29379,7 +29333,7 @@ 1 2 -86959 +85940 2 @@ -29400,22 +29354,22 @@ 1 2 -69291 +68479 2 3 -8203 +8107 3 9 -6525 +6449 9 795 -2961 +2926 @@ -29425,11 +29379,11 @@ derspecifiers -392650 +388058 der_id -390237 +385674 spec_id @@ -29447,12 +29401,12 @@ 1 2 -387824 +383289 2 3 -2412 +2384 @@ -29481,8 +29435,8 @@ 10 -34332 -34333 +34333 +34334 10 @@ -29493,15 +29447,15 @@ direct_base_offsets -310560 +306931 der_id -310560 +306931 offset -197 +195 @@ -29515,7 +29469,7 @@ 1 2 -310560 +306931 @@ -29589,8 +29543,8 @@ 10 -27927 -27928 +27928 +27929 10 @@ -29601,19 +29555,19 @@ virtual_base_offsets -6339 +6264 sub -3509 +3468 super -482 +476 offset -241 +238 @@ -29627,22 +29581,22 @@ 1 2 -2763 +2731 2 4 -307 +303 4 7 -252 +249 7 11 -186 +184 @@ -29658,17 +29612,17 @@ 1 2 -2961 +2926 2 4 -296 +292 4 8 -252 +249 @@ -29684,7 +29638,7 @@ 1 2 -76 +75 2 @@ -29699,7 +29653,7 @@ 4 5 -87 +86 5 @@ -29745,12 +29699,12 @@ 1 2 -274 +270 2 3 -76 +75 4 @@ -29852,7 +29806,7 @@ 1 2 -76 +75 2 @@ -29892,23 +29846,23 @@ frienddecls -240347 +237444 id -240347 +237444 type_id -27286 +26966 decl_id -49045 +48405 location -7304 +7218 @@ -29922,7 +29876,7 @@ 1 2 -240347 +237444 @@ -29938,7 +29892,7 @@ 1 2 -240347 +237444 @@ -29954,7 +29908,7 @@ 1 2 -240347 +237444 @@ -29970,42 +29924,42 @@ 1 2 -6218 +6145 2 3 -10232 +10112 3 5 -1985 +1961 5 6 -910 +899 6 8 -2314 +2286 8 19 -2116 +2091 21 43 -2105 +2081 43 162 -1403 +1387 @@ -30021,42 +29975,42 @@ 1 2 -6218 +6145 2 3 -10232 +10112 3 5 -1985 +1961 5 6 -910 +899 6 8 -2314 +2286 8 19 -2116 +2091 21 43 -2105 +2081 43 162 -1403 +1387 @@ -30072,12 +30026,12 @@ 1 2 -25707 +25405 2 31 -1579 +1560 @@ -30093,27 +30047,27 @@ 1 2 -33691 +33242 2 3 -4990 +4931 3 7 -4024 +3966 7 23 -3805 +3761 23 394 -2533 +2503 @@ -30129,27 +30083,27 @@ 1 2 -33691 +33242 2 3 -4990 +4931 3 7 -4024 +3966 7 23 -3805 +3761 23 394 -2533 +2503 @@ -30165,12 +30119,12 @@ 1 2 -48508 +47874 2 46 -537 +531 @@ -30186,17 +30140,17 @@ 1 2 -6240 +6167 2 3 -943 +932 3 -21137 -120 +21129 +119 @@ -30212,12 +30166,12 @@ 1 2 -6865 +6785 2 2097 -438 +433 @@ -30233,17 +30187,17 @@ 1 2 -6251 +6178 2 3 -932 +921 3 -3836 -120 +3830 +119 @@ -30253,19 +30207,19 @@ comments -1580341 +1561817 id -1580341 +1561817 contents -784182 +774990 location -1580341 +1561817 @@ -30279,7 +30233,7 @@ 1 2 -1580341 +1561817 @@ -30295,7 +30249,7 @@ 1 2 -1580341 +1561817 @@ -30311,17 +30265,17 @@ 1 2 -663959 +656176 2 3 -75103 +74223 3 10738 -45119 +44590 @@ -30337,17 +30291,17 @@ 1 2 -663959 +656176 2 3 -75103 +74223 3 10738 -45119 +44590 @@ -30363,7 +30317,7 @@ 1 2 -1580341 +1561817 @@ -30379,7 +30333,7 @@ 1 2 -1580341 +1561817 @@ -30389,15 +30343,15 @@ commentbinding -713311 +704994 id -618433 +611185 element -684533 +676553 @@ -30411,17 +30365,17 @@ 1 2 -557093 +550520 2 3 -49045 +48514 3 97 -12294 +12150 @@ -30437,12 +30391,12 @@ 1 2 -655755 +648112 2 3 -28778 +28440 @@ -30452,15 +30406,15 @@ exprconv -6443797 +6470964 converted -6443503 +6470955 conversion -6443797 +6470964 @@ -30474,12 +30428,12 @@ 1 2 -6443210 +6470947 2 4 -293 +8 @@ -30495,7 +30449,7 @@ 1 2 -6443797 +6470964 @@ -30505,30 +30459,30 @@ compgenerated -6707808 +6859342 id -6707808 +6859342 synthetic_destructor_call -59596 +58919 element -46380 +45858 i -307 +303 destructor_call -49451 +48893 @@ -30542,17 +30496,17 @@ 1 2 -36937 +36526 2 3 -6766 +6687 3 29 -2676 +2644 @@ -30568,17 +30522,17 @@ 1 2 -36937 +36526 2 3 -6766 +6687 3 29 -2676 +2644 @@ -30594,7 +30548,7 @@ 1 2 -230 +227 2 @@ -30612,8 +30566,8 @@ 21 -4229 -4230 +4231 +4232 10 @@ -30630,7 +30584,7 @@ 1 2 -230 +227 2 @@ -30648,8 +30602,8 @@ 21 -3563 -3564 +3565 +3566 10 @@ -30666,17 +30620,17 @@ 1 2 -43605 +43116 2 3 -3619 +3576 3 26 -2226 +2200 @@ -30692,7 +30646,7 @@ 1 2 -49451 +48893 @@ -30702,15 +30656,15 @@ namespaces -7688 +7597 id -7688 +7597 name -4134 +4086 @@ -30724,7 +30678,7 @@ 1 2 -7688 +7597 @@ -30740,17 +30694,17 @@ 1 2 -3476 +3435 2 3 -416 +411 3 139 -241 +238 @@ -30760,26 +30714,26 @@ namespace_inline -153 +151 id -153 +151 namespacembrs -1603361 +1584090 parentid -7161 +7077 memberid -1603361 +1584090 @@ -30793,67 +30747,67 @@ 1 2 -734 +726 2 3 -800 +791 3 4 -350 +346 4 5 -526 +520 5 7 -559 +552 7 12 -581 +574 12 19 -537 +531 19 34 -548 +541 36 52 -581 +574 52 105 -537 +531 105 230 -548 +541 231 744 -537 +531 778 -39485 -318 +39452 +314 @@ -30869,7 +30823,7 @@ 1 2 -1603361 +1584090 @@ -30879,19 +30833,19 @@ exprparents -13453475 +13432189 expr_id -13453286 +13432000 child_index -3123 +3118 parent_id -9530420 +9515340 @@ -30905,7 +30859,7 @@ 1 2 -13453279 +13431994 2 @@ -30926,12 +30880,12 @@ 1 2 -13453104 +13431818 2 4 -182 +181 @@ -30952,12 +30906,12 @@ 2 3 -644 +643 3 4 -1652 +1649 4 @@ -30967,16 +30921,16 @@ 46 56 -234 +233 56 3654 -234 +233 6420 -1188857 +1188854 45 @@ -30998,12 +30952,12 @@ 2 3 -644 +643 3 4 -1652 +1649 4 @@ -31013,16 +30967,16 @@ 31 41 -234 +233 41 3639 -234 +233 6405 -1188870 +1188867 45 @@ -31039,17 +30993,17 @@ 1 2 -6759115 +6748421 2 3 -2187726 +2184263 3 1681 -583578 +582655 @@ -31065,17 +31019,17 @@ 1 2 -6759135 +6748441 2 3 -2187707 +2184243 3 480 -583578 +582655 @@ -31085,11 +31039,11 @@ expr_isload -5007373 +5009424 expr_id -5007373 +5009424 @@ -31169,11 +31123,11 @@ iscall -2320215 +2293539 caller -2320215 +2293539 kind @@ -31191,7 +31145,7 @@ 1 2 -2320215 +2293539 @@ -31210,13 +31164,13 @@ 10 -6428 -6429 +6427 +6428 10 -203744 -203745 +203793 +203794 10 @@ -31227,11 +31181,11 @@ numtemplatearguments -164695 +162776 expr_id -164695 +162776 num @@ -31249,7 +31203,7 @@ 1 2 -164695 +162776 @@ -31278,8 +31232,8 @@ 10 -14304 -14305 +14305 +14306 10 @@ -31338,23 +31292,23 @@ namequalifiers -1114410 +1119060 id -1114410 +1119060 qualifiableelement -1114410 +1119060 qualifyingelement -38861 +38800 location -504702 +504119 @@ -31368,7 +31322,7 @@ 1 2 -1114410 +1119060 @@ -31384,7 +31338,7 @@ 1 2 -1114410 +1119060 @@ -31400,7 +31354,7 @@ 1 2 -1114410 +1119060 @@ -31416,7 +31370,7 @@ 1 2 -1114410 +1119060 @@ -31432,7 +31386,7 @@ 1 2 -1114410 +1119060 @@ -31448,7 +31402,7 @@ 1 2 -1114410 +1119060 @@ -31464,32 +31418,32 @@ 1 2 -18920 +18890 2 3 -8119 +8035 3 4 -5029 +4975 4 11 -3018 +3079 11 -129 -2927 +121 +2910 -132 -24941 -845 +124 +24963 +909 @@ -31505,32 +31459,32 @@ 1 2 -18920 +18890 2 3 -8119 +8035 3 4 -5029 +4975 4 11 -3018 +3079 11 -129 -2927 +121 +2910 -132 -24941 -845 +124 +24963 +909 @@ -31546,27 +31500,27 @@ 1 2 -24788 +24749 2 3 -4749 +4670 3 4 -3760 +3709 4 11 -2966 +3027 11 -16728 -2595 +16750 +2643 @@ -31582,22 +31536,22 @@ 1 2 -383621 +380150 2 3 -56714 +56638 3 7 -38757 +41762 7 381 -25608 +25568 @@ -31613,22 +31567,22 @@ 1 2 -383621 +380150 2 3 -56714 +56638 3 7 -38757 +41762 7 381 -25608 +25568 @@ -31644,17 +31598,17 @@ 1 2 -447844 +444298 2 3 -44535 +44477 3 190 -12322 +15343 @@ -31664,15 +31618,15 @@ varbind -5434586 +5425985 expr -5434462 +5425862 var -1532794 +1530372 @@ -31686,7 +31640,7 @@ 1 2 -5434339 +5425738 2 @@ -31707,32 +31661,32 @@ 1 2 -679961 +678893 2 3 -308897 +308409 3 4 -232741 +232367 4 5 -92818 +92671 5 9 -133059 +132849 9 6150 -85316 +85181 @@ -31742,15 +31696,15 @@ funbind -2416551 +2412732 expr -2119690 +2116341 fun -434031 +433346 @@ -31764,12 +31718,12 @@ 1 2 -1823070 +1820189 2 3 -296444 +295975 3 @@ -31790,32 +31744,32 @@ 1 2 -252052 +251653 2 3 -75583 +75463 3 4 -31230 +31180 4 7 -33904 +33850 7 37 -33429 +33376 37 6664 -7833 +7821 @@ -31825,15 +31779,15 @@ expr_allocator -30335 +29979 expr -30335 +29979 func -120 +119 form @@ -31851,7 +31805,7 @@ 1 2 -30335 +29979 @@ -31867,7 +31821,7 @@ 1 2 -30335 +29979 @@ -31934,7 +31888,7 @@ 1 2 -120 +119 @@ -31976,15 +31930,15 @@ expr_deallocator -33307 +32917 expr -33307 +32917 func -131 +130 form @@ -32002,7 +31956,7 @@ 1 2 -33307 +32917 @@ -32018,7 +31972,7 @@ 1 2 -33307 +32917 @@ -32085,7 +32039,7 @@ 1 2 -131 +130 @@ -32148,15 +32102,15 @@ expr_cond_guard -154261 +154485 cond -154261 +154485 guard -154261 +154485 @@ -32170,7 +32124,7 @@ 1 2 -154261 +154485 @@ -32186,7 +32140,7 @@ 1 2 -154261 +154485 @@ -32196,15 +32150,15 @@ expr_cond_true -154261 +154485 cond -154261 +154485 true -154261 +154485 @@ -32218,7 +32172,7 @@ 1 2 -154261 +154485 @@ -32234,7 +32188,7 @@ 1 2 -154261 +154485 @@ -32244,15 +32198,15 @@ expr_cond_false -154261 +154485 cond -154261 +154485 false -154261 +154485 @@ -32266,7 +32220,7 @@ 1 2 -154261 +154485 @@ -32282,7 +32236,7 @@ 1 2 -154261 +154485 @@ -32292,15 +32246,15 @@ values -8774612 +8774622 id -8774612 +8774622 str -651636 +651637 @@ -32314,7 +32268,7 @@ 1 2 -8774612 +8774622 @@ -32339,8 +32293,8 @@ 3 -4040431 -45954 +4040441 +45955 @@ -32350,11 +32304,11 @@ valuetext -4778492 +4778502 id -4778492 +4778502 text @@ -32372,7 +32326,7 @@ 1 2 -4778492 +4778502 @@ -32413,15 +32367,15 @@ valuebind -9496109 +9496119 val -8768402 +8768412 expr -9496109 +9496119 @@ -32435,7 +32389,7 @@ 1 2 -8041454 +8041464 2 @@ -32461,7 +32415,7 @@ 1 2 -9496109 +9496119 @@ -32471,19 +32425,19 @@ fieldoffsets -251147 +250750 id -251147 +250750 byteoffset -8998 +8983 bitoffset -52 +51 @@ -32497,7 +32451,7 @@ 1 2 -251147 +250750 @@ -32513,7 +32467,7 @@ 1 2 -251147 +250750 @@ -32529,27 +32483,27 @@ 1 2 -6115 +6106 2 3 -780 +779 3 6 -748 +747 6 17 -676 +675 17 11719 -676 +675 @@ -32565,12 +32519,12 @@ 1 2 -8555 +8542 2 9 -442 +441 @@ -32682,11 +32636,11 @@ bitfield -13779 +13845 id -13779 +13845 bits @@ -32708,7 +32662,7 @@ 1 2 -13779 +13845 @@ -32724,7 +32678,7 @@ 1 2 -13779 +13845 @@ -32779,11 +32733,11 @@ 37 -75 +94 4 -93 +97 152 4 @@ -32861,11 +32815,11 @@ 37 -75 +94 4 -93 +97 152 4 @@ -32898,23 +32852,23 @@ initialisers -1664806 +1662175 init -1664806 +1662175 var -642772 +641756 expr -1664806 +1662175 location -318682 +318179 @@ -32928,7 +32882,7 @@ 1 2 -1664806 +1662175 @@ -32944,7 +32898,7 @@ 1 2 -1664806 +1662175 @@ -32960,7 +32914,7 @@ 1 2 -1664806 +1662175 @@ -32976,22 +32930,22 @@ 1 2 -556212 +555333 2 16 -28705 +28660 16 17 -49050 +48973 17 53 -8802 +8789 @@ -33007,22 +32961,22 @@ 1 2 -556212 +555333 2 16 -28705 +28660 16 17 -49050 +48973 17 53 -8802 +8789 @@ -33038,12 +32992,12 @@ 1 2 -642758 +641743 2 3 -13 +12 @@ -33059,7 +33013,7 @@ 1 2 -1664806 +1662175 @@ -33075,7 +33029,7 @@ 1 2 -1664806 +1662175 @@ -33091,7 +33045,7 @@ 1 2 -1664806 +1662175 @@ -33107,27 +33061,27 @@ 1 2 -246092 +245703 2 3 -23728 +23690 3 7 -24248 +24210 7 65 -24086 +24048 67 109109 -527 +526 @@ -33143,22 +33097,22 @@ 1 2 -268675 +268251 2 3 -24970 +24931 3 22 -23923 +23885 22 12503 -1112 +1110 @@ -33174,27 +33128,27 @@ 1 2 -246092 +245703 2 3 -23728 +23690 3 7 -24248 +24210 7 65 -24086 +24048 67 109109 -527 +526 @@ -33204,15 +33158,15 @@ expr_ancestor -66077 +65325 exp -65375 +64631 ancestor -47093 +46563 @@ -33226,12 +33180,12 @@ 1 2 -64739 +64002 2 4 -636 +628 @@ -33247,17 +33201,17 @@ 1 2 -34930 +34543 2 3 -9706 +9592 3 29 -2456 +2427 @@ -33267,19 +33221,19 @@ exprs -18434101 +18461258 id -18434101 +18461258 kind -1096 +1094 location -3623249 +3585917 @@ -33293,7 +33247,7 @@ 1 2 -18434101 +18461258 @@ -33309,7 +33263,7 @@ 1 2 -18434101 +18461258 @@ -33325,67 +33279,67 @@ 2 14 -87 +86 15 50 -87 +86 50 90 -87 +86 90 223 -87 +86 306 -471 -87 +472 +86 484 715 -87 +86 866 2036 -87 +86 2167 2960 -87 +86 3202 4443 -87 +86 -4717 -6425 -87 +4720 +6423 +86 -6722 +6723 13439 -87 +86 17876 -114329 -87 +100489 +86 -192871 -428312 -43 +114342 +428357 +54 @@ -33401,67 +33355,67 @@ 1 4 -98 +97 4 14 -98 +97 14 24 -87 +86 24 38 -87 +86 38 134 -87 +86 144 259 -87 +86 270 481 -87 +86 481 1076 -87 +86 1099 1408 -87 +86 1427 2051 -87 +86 2060 4561 -87 +86 5889 -60114 -87 +59193 +86 -72772 -118610 -21 +60309 +118611 +32 @@ -33477,37 +33431,37 @@ 1 2 -1680483 +1649719 2 3 -738624 +725837 3 4 -319926 +318788 4 5 -276890 +272431 5 9 -301720 +311028 9 -53 -272120 +45 +269006 -53 -144478 -33483 +45 +143462 +39106 @@ -33523,17 +33477,17 @@ 1 2 -2586676 +2542158 2 3 -807411 +786154 3 30 -229161 +257604 @@ -33543,15 +33497,15 @@ expr_types -18573385 +18609954 id -18430284 +18457486 typeid -1322456 +1280368 value_category @@ -33569,12 +33523,12 @@ 1 2 -18288641 +18306730 2 4 -141642 +150755 @@ -33590,7 +33544,7 @@ 1 2 -18430284 +18457486 @@ -33606,42 +33560,42 @@ 1 2 -513839 +468861 2 3 -251951 +252672 3 4 -108499 +107476 4 5 -86038 +88617 5 8 -114147 +114110 8 -14 -106075 +13 +96724 -14 -45 -99747 +13 +36 +97331 -45 -126297 -42158 +36 +126306 +54572 @@ -33657,17 +33611,17 @@ 1 2 -1170932 +1115749 2 3 -143123 +155026 3 4 -8400 +9592 @@ -33681,18 +33635,18 @@ 12 -5447 -5448 +7302 +7303 10 -370443 -370444 +383285 +383286 10 -1304589 -1304590 +1312333 +1312334 10 @@ -33707,18 +33661,18 @@ 12 -1453 -1454 +1649 +1650 10 -30955 -30956 +32129 +32130 10 -102756 -102757 +100424 +100425 10 @@ -33729,15 +33683,15 @@ new_allocated_type -32134 +31757 expr -32134 +31757 type_id -16516 +16323 @@ -33751,7 +33705,7 @@ 1 2 -32134 +31757 @@ -33767,22 +33721,22 @@ 1 2 -10342 +10220 2 3 -3717 +3674 3 5 -1403 +1387 5 107 -1052 +1040 @@ -33792,15 +33746,15 @@ new_array_allocated_type -5296 +5287 expr -5296 +5287 type_id -2277 +2273 @@ -33814,7 +33768,7 @@ 1 2 -5296 +5287 @@ -33835,7 +33789,7 @@ 2 3 -2016 +2013 3 @@ -33845,7 +33799,7 @@ 8 15 -52 +51 @@ -34392,15 +34346,15 @@ condition_decl_bind -7008 +6947 expr -7008 +6947 decl -7008 +6947 @@ -34414,7 +34368,7 @@ 1 2 -7008 +6947 @@ -34430,7 +34384,7 @@ 1 2 -7008 +6947 @@ -34440,15 +34394,15 @@ typeid_bind -4419 +4368 expr -4419 +4368 type_id -2346 +2319 @@ -34462,7 +34416,7 @@ 1 2 -4419 +4368 @@ -34478,17 +34432,17 @@ 1 2 -1173 +1159 2 3 -899 +888 3 6 -208 +205 6 @@ -34503,15 +34457,15 @@ uuidof_bind -845 +844 expr -845 +844 type_id -644 +643 @@ -34525,7 +34479,7 @@ 1 2 -845 +844 @@ -34561,15 +34515,15 @@ sizeof_bind -156887 +157116 expr -156887 +157116 type_id -2700 +2704 @@ -34583,7 +34537,7 @@ 1 2 -156887 +157116 @@ -34599,12 +34553,12 @@ 1 2 -1061 +1063 2 3 -355 +356 3 @@ -34619,7 +34573,7 @@ 9 32 -128 +129 34 @@ -34697,11 +34651,11 @@ lambdas -12680 +12660 expr -12680 +12660 default_capture @@ -34709,7 +34663,7 @@ has_explicit_return_type -13 +12 @@ -34723,7 +34677,7 @@ 1 2 -12680 +12660 @@ -34739,7 +34693,7 @@ 1 2 -12680 +12660 @@ -34818,7 +34772,7 @@ 3 4 -13 +12 @@ -34828,15 +34782,15 @@ lambda_capture -21652 +21618 id -21652 +21618 lambda -10169 +10153 index @@ -34844,19 +34798,19 @@ field -21652 +21618 captured_by_reference -13 +12 is_implicit -13 +12 location -13871 +13849 @@ -34870,7 +34824,7 @@ 1 2 -21652 +21618 @@ -34886,7 +34840,7 @@ 1 2 -21652 +21618 @@ -34902,7 +34856,7 @@ 1 2 -21652 +21618 @@ -34918,7 +34872,7 @@ 1 2 -21652 +21618 @@ -34934,7 +34888,7 @@ 1 2 -21652 +21618 @@ -34950,7 +34904,7 @@ 1 2 -21652 +21618 @@ -34966,27 +34920,27 @@ 1 2 -5139 +5131 2 3 -2348 +2345 3 4 -1249 +1247 4 6 -910 +909 6 18 -520 +519 @@ -35002,27 +34956,27 @@ 1 2 -5139 +5131 2 3 -2348 +2345 3 4 -1249 +1247 4 6 -910 +909 6 18 -520 +519 @@ -35038,27 +34992,27 @@ 1 2 -5139 +5131 2 3 -2348 +2345 3 4 -1249 +1247 4 6 -910 +909 6 18 -520 +519 @@ -35074,7 +35028,7 @@ 1 2 -9707 +9691 2 @@ -35095,7 +35049,7 @@ 1 2 -10149 +10133 2 @@ -35116,22 +35070,22 @@ 1 2 -5614 +5606 2 3 -2472 +2468 3 4 -1027 +1026 4 7 -813 +811 7 @@ -35440,7 +35394,7 @@ 1 2 -26 +25 2 @@ -35461,7 +35415,7 @@ 1 2 -65 +64 2 @@ -35578,7 +35532,7 @@ 1 2 -21652 +21618 @@ -35594,7 +35548,7 @@ 1 2 -21652 +21618 @@ -35610,7 +35564,7 @@ 1 2 -21652 +21618 @@ -35626,7 +35580,7 @@ 1 2 -21652 +21618 @@ -35642,7 +35596,7 @@ 1 2 -21652 +21618 @@ -35658,7 +35612,7 @@ 1 2 -21652 +21618 @@ -35758,7 +35712,7 @@ 2 3 -13 +12 @@ -35879,7 +35833,7 @@ 2 3 -13 +12 @@ -35916,17 +35870,17 @@ 1 2 -12505 +12485 2 6 -1041 +1039 6 68 -325 +324 @@ -35942,12 +35896,12 @@ 1 2 -12947 +12926 2 68 -923 +922 @@ -35963,12 +35917,12 @@ 1 2 -13337 +13316 2 8 -533 +532 @@ -35984,17 +35938,17 @@ 1 2 -12505 +12485 2 6 -1041 +1039 6 68 -325 +324 @@ -36010,7 +35964,7 @@ 1 2 -13851 +13829 2 @@ -36031,7 +35985,7 @@ 1 2 -13871 +13849 @@ -36157,19 +36111,19 @@ stmts -4688994 +4651977 id -4688994 +4651977 kind -208 +116 location -1194106 +2016407 @@ -36183,7 +36137,7 @@ 1 2 -4688994 +4651977 @@ -36199,7 +36153,7 @@ 1 2 -4688994 +4651977 @@ -36213,99 +36167,94 @@ 12 -2 -3 -10 - - -47 -48 -10 +26 +27 +6 -355 -356 -10 +553 +554 +6 -502 -503 -10 +828 +829 +6 -735 -736 -10 +1443 +1444 +6 -1638 -1639 -10 +1582 +1583 +6 -1835 -1836 -10 +1908 +1909 +6 -2235 -2236 -10 +2445 +2446 +6 -2266 -2267 -10 +3327 +3328 +6 -2748 -2749 -10 +3570 +3571 +6 -2826 -2827 -10 +4942 +4943 +6 -3119 -3120 -10 +15732 +15733 +6 -3441 -3442 -10 +15997 +15998 +6 -4772 -4773 -10 +20983 +20984 +6 -30477 -30478 -10 +68504 +68505 +6 -55902 -55903 -10 +87453 +87454 +6 -90766 -90767 -10 +109229 +109230 +6 -103053 -103054 -10 +182456 +182457 +6 -120825 -120826 -10 +195155 +195156 +6 @@ -36319,99 +36268,94 @@ 12 -2 -3 -10 - - -42 -43 -10 +26 +27 +6 -106 -107 -10 +414 +415 +6 -112 -113 -10 +785 +786 +6 -180 -181 -10 +1053 +1054 +6 -254 -255 -10 +1285 +1286 +6 -300 -301 -10 +1329 +1330 +6 -662 -663 -10 +1370 +1371 +6 -663 -664 -10 +2027 +2028 +6 -1002 -1003 -10 +2301 +2302 +6 -1033 -1034 -10 +2430 +2431 +6 -1412 -1413 -10 +6908 +6909 +6 -1954 -1955 -10 +8367 +8368 +6 -2676 -2677 -10 +10976 +10977 +6 -10189 -10190 -10 +36004 +36005 +6 -10259 -10260 -10 +42618 +42619 +6 -22314 -22315 -10 +45224 +45225 +6 -26695 -26696 -10 +80548 +80549 +6 -32139 -32140 -10 +96139 +96140 +6 @@ -36427,32 +36371,17 @@ 1 2 -678008 +1715650 2 -3 -181585 - - -3 4 -107907 +176807 4 -6 -102105 - - -6 -22 -101535 - - -22 -5041 -22965 +1671 +123949 @@ -36468,12 +36397,12 @@ 1 2 -1170515 +1952279 2 -9 -23590 +10 +64128 @@ -36579,15 +36508,15 @@ if_then -523910 +524673 if_stmt -523910 +524673 then_id -523910 +524673 @@ -36601,7 +36530,7 @@ 1 2 -523910 +524673 @@ -36617,7 +36546,7 @@ 1 2 -523910 +524673 @@ -36627,15 +36556,15 @@ if_else -148099 +148314 if_stmt -148099 +148314 else_id -148099 +148314 @@ -36649,7 +36578,7 @@ 1 2 -148099 +148314 @@ -36665,7 +36594,7 @@ 1 2 -148099 +148314 @@ -36771,15 +36700,15 @@ while_body -30993 +30641 while_stmt -30993 +30641 body_id -30993 +30641 @@ -36793,7 +36722,7 @@ 1 2 -30993 +30641 @@ -36809,7 +36738,7 @@ 1 2 -30993 +30641 @@ -36819,15 +36748,15 @@ do_body -149713 +149931 do_stmt -149713 +149931 body_id -149713 +149931 @@ -36841,7 +36770,7 @@ 1 2 -149713 +149931 @@ -36857,7 +36786,7 @@ 1 2 -149713 +149931 @@ -36867,19 +36796,19 @@ switch_case -271389 +271721 switch_stmt -53243 +53308 index -263 +264 case_id -271389 +271721 @@ -36893,17 +36822,17 @@ 1 5 -4054 +4059 5 6 -47130 +47188 6 163 -2057 +2060 @@ -36919,17 +36848,17 @@ 1 5 -4054 +4059 5 6 -47130 +47188 6 163 -2057 +2060 @@ -37037,7 +36966,7 @@ 1 2 -271389 +271721 @@ -37053,7 +36982,7 @@ 1 2 -271389 +271721 @@ -37063,15 +36992,15 @@ switch_body -53243 +53308 switch_stmt -53243 +53308 body_id -53243 +53308 @@ -37085,7 +37014,7 @@ 1 2 -53243 +53308 @@ -37101,7 +37030,7 @@ 1 2 -53243 +53308 @@ -37111,15 +37040,15 @@ for_initialization -29714 +29667 for_stmt -29714 +29667 init_id -29714 +29667 @@ -37133,7 +37062,7 @@ 1 2 -29714 +29667 @@ -37149,7 +37078,7 @@ 1 2 -29714 +29667 @@ -37159,15 +37088,15 @@ for_condition -31555 +31505 for_stmt -31555 +31505 condition_id -31555 +31505 @@ -37181,7 +37110,7 @@ 1 2 -31555 +31505 @@ -37197,7 +37126,7 @@ 1 2 -31555 +31505 @@ -37207,15 +37136,15 @@ for_update -29453 +29407 for_stmt -29453 +29407 update_id -29453 +29407 @@ -37229,7 +37158,7 @@ 1 2 -29453 +29407 @@ -37245,7 +37174,7 @@ 1 2 -29453 +29407 @@ -37255,15 +37184,15 @@ for_body -32153 +32103 for_stmt -32153 +32103 body_id -32153 +32103 @@ -37277,7 +37206,7 @@ 1 2 -32153 +32103 @@ -37293,7 +37222,7 @@ 1 2 -32153 +32103 @@ -37303,19 +37232,19 @@ stmtparents -4119868 +4113351 id -4119868 +4113351 index -12635 +12615 parent -1741423 +1738665 @@ -37329,7 +37258,7 @@ 1 2 -4119868 +4113351 @@ -37345,7 +37274,7 @@ 1 2 -4119868 +4113351 @@ -37361,12 +37290,12 @@ 1 2 -3968 +3962 2 3 -1080 +1078 3 @@ -37376,37 +37305,37 @@ 4 5 -1476 +1474 7 8 -1034 +1032 8 12 -819 +818 12 29 -1112 +1110 29 37 -897 +896 37 74 -962 +961 74 -192181 -767 +192180 +766 @@ -37422,12 +37351,12 @@ 1 2 -3968 +3962 2 3 -1080 +1078 3 @@ -37437,37 +37366,37 @@ 4 5 -1476 +1474 7 8 -1034 +1032 8 12 -819 +818 12 29 -1112 +1110 29 37 -897 +896 37 74 -962 +961 74 -192181 -767 +192180 +766 @@ -37483,32 +37412,32 @@ 1 2 -991897 +990323 2 3 -382684 +382079 3 4 -108381 +108209 4 6 -114022 +113841 6 17 -131784 +131575 17 1943 -12654 +12634 @@ -37524,32 +37453,32 @@ 1 2 -991897 +990323 2 3 -382684 +382079 3 4 -108381 +108209 4 6 -114022 +113841 6 17 -131784 +131575 17 1943 -12654 +12634 @@ -37559,30 +37488,30 @@ ishandler -21646 +21612 block -21646 +21612 stmt_decl_bind -532224 +531383 stmt -525353 +524523 num -52 +51 decl -532224 +531383 @@ -37596,12 +37525,12 @@ 1 2 -519914 +519092 2 9 -5439 +5430 @@ -37617,12 +37546,12 @@ 1 2 -519894 +519073 2 9 -5458 +5450 @@ -37740,7 +37669,7 @@ 1 2 -532224 +531383 @@ -37756,7 +37685,7 @@ 1 2 -532224 +531383 @@ -37766,11 +37695,11 @@ stmt_decl_entry_bind -497397 +498005 stmt -453686 +454241 num @@ -37778,7 +37707,7 @@ decl_entry -473430 +474016 @@ -37792,12 +37721,12 @@ 1 2 -422156 +422673 2 274 -31529 +31568 @@ -37813,12 +37742,12 @@ 1 2 -422156 +422673 2 15 -31529 +31568 @@ -37901,12 +37830,12 @@ 1 2 -461765 +462337 2 17 -11665 +11679 @@ -37922,7 +37851,7 @@ 1 2 -473350 +473936 2 @@ -37937,15 +37866,15 @@ blockscope -1325099 +1309621 block -1325099 +1309621 enclosing -1186944 +1173021 @@ -37959,7 +37888,7 @@ 1 2 -1325099 +1309621 @@ -37975,12 +37904,12 @@ 1 2 -1106598 +1093573 2 509 -80346 +79447 @@ -37990,19 +37919,19 @@ jumpinfo -350608 +351037 id -350608 +351037 str -5907 +5914 target -81478 +81577 @@ -38016,7 +37945,7 @@ 1 2 -350608 +351037 @@ -38032,7 +37961,7 @@ 1 2 -350608 +351037 @@ -38048,7 +37977,7 @@ 2 3 -3208 +3212 3 @@ -38058,12 +37987,12 @@ 4 5 -685 +686 5 7 -486 +487 7 @@ -38073,7 +38002,7 @@ 15 181398 -271 +272 @@ -38089,17 +38018,17 @@ 1 2 -4697 +4703 2 3 -673 +674 3 12 -455 +456 12 @@ -38120,37 +38049,37 @@ 1 2 -253 +254 2 3 -19854 +19879 3 4 -7094 +7102 4 5 -3568 +3572 5 6 -38400 +38447 6 7 -10566 +10579 7 166 -1740 +1742 @@ -38166,7 +38095,7 @@ 1 2 -81478 +81577 @@ -38176,19 +38105,19 @@ preprocdirects -1323630 +1308115 id -1323630 +1308115 kind -142 +140 location -1317312 +1301872 @@ -38202,7 +38131,7 @@ 1 2 -1323630 +1308115 @@ -38218,7 +38147,7 @@ 1 2 -1323630 +1308115 @@ -38386,12 +38315,12 @@ 1 2 -1316983 +1301546 2 235 -329 +325 @@ -38407,7 +38336,7 @@ 1 2 -1317312 +1301872 @@ -38417,15 +38346,15 @@ preprocpair -378809 +374369 begin -300514 +296991 elseelifend -378809 +374369 @@ -38439,17 +38368,17 @@ 1 2 -238626 +235829 2 3 -54551 +53911 3 53 -7337 +7251 @@ -38465,7 +38394,7 @@ 1 2 -378809 +374369 @@ -38475,41 +38404,41 @@ preproctrue -166571 +164618 branch -166571 +164618 preprocfalse -119126 +117730 branch -119126 +117730 preproctext -965438 +954122 id -965438 +954122 head -463575 +458142 body -175586 +173528 @@ -38523,7 +38452,7 @@ 1 2 -965438 +954122 @@ -38539,7 +38468,7 @@ 1 2 -965438 +954122 @@ -38555,22 +38484,22 @@ 1 2 -345973 +341918 2 3 -78174 +77258 3 19 -34777 +34369 19 752 -4650 +4595 @@ -38586,12 +38515,12 @@ 1 2 -441893 +436714 2 38 -21682 +21428 @@ -38607,12 +38536,12 @@ 1 2 -165013 +163079 2 64816 -10572 +10448 @@ -38628,12 +38557,12 @@ 1 2 -166494 +164542 2 21810 -9091 +8985 @@ -38643,15 +38572,15 @@ includes -290852 +287443 id -290852 +287443 included -54606 +53966 @@ -38665,7 +38594,7 @@ 1 2 -290852 +287443 @@ -38681,37 +38610,37 @@ 1 2 -26891 +26576 2 3 -8960 +8855 3 4 -4617 +4563 4 6 -4847 +4790 6 11 -4189 +4140 11 41 -4112 +4064 41 763 -987 +975 @@ -38721,15 +38650,15 @@ link_targets -581 +574 id -581 +574 binary -581 +574 @@ -38743,7 +38672,7 @@ 1 2 -581 +574 @@ -38759,7 +38688,7 @@ 1 2 -581 +574 @@ -38769,15 +38698,15 @@ link_parent -18153711 +18584884 element -4992722 +5164827 link_target -581 +574 @@ -38791,32 +38720,32 @@ 1 2 -1493469 +1543684 2 3 -1883246 +1943264 3 4 -718850 +754223 4 6 -400876 +422385 6 29 -398156 +402680 29 45 -98124 +98589 @@ -38832,66 +38761,66 @@ 2 3 -87 +86 5 -558 +559 43 -2664 -6144 +2834 +6256 43 -6546 -8476 +6663 +8713 43 -10150 -12964 +10268 +13146 43 -13109 -20155 +13433 +20518 43 -25133 -27051 +25549 +27566 43 -27154 -32620 +27680 +33162 43 -33899 -39247 +34917 +40444 43 -41489 -42581 +42525 +46022 43 -46593 -56498 +47794 +58086 43 -56635 -133788 +58594 +139377 43 -370736 -370737 +388296 +388297 10 From 08af0803ff66b434883d3277e22561915aaac260 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Tue, 20 Oct 2020 17:34:46 -0400 Subject: [PATCH 35/53] Add examples to QLDoc comment --- cpp/ql/src/semmle/code/cpp/exprs/Cast.qll | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/cpp/ql/src/semmle/code/cpp/exprs/Cast.qll b/cpp/ql/src/semmle/code/cpp/exprs/Cast.qll index e7121a05a558..ebe88ddf71c7 100644 --- a/cpp/ql/src/semmle/code/cpp/exprs/Cast.qll +++ b/cpp/ql/src/semmle/code/cpp/exprs/Cast.qll @@ -843,16 +843,17 @@ class ArrayToPointerConversion extends Conversion, @array_to_pointer { /** * A node representing a temporary object created as part of an expression. * - * This is most commonly seen in the following cases (from [class.temporary]/2): - * - when binding a reference to a prvalue - * - when performing member access on a class prvalue - * - when performing an array-to-pointer conversion or subscripting on an array prvalue - * - when initializing an object of type std::initializer_list from a braced-init-list - * - for certain unevaluated operands - * - when a prvalue that has type other than cv void appears as a discarded-value expression - * - * This node will only exist if the object is of class type, and even then only if either the - * object's initialization or destruction is non-trivial. + * This is most commonly seen in the following cases: + * ```c++ + * // when binding a reference to a prvalue + * const std::string& r = std::string("text"); + * + * // when performing member access on a class prvalue + * strlen(std::string("text").c_str()); + * + * // when a prvalue of a type with a destructor is discarded + * s.substr(0, 5); // Return value is discarded but requires destruction + * ``` */ class TemporaryObjectExpr extends Conversion, @temp_init { /** Gets a textual representation of this conversion. */ From 98e0ae48654e9104ec8fc8ff75699704cac4f2b4 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Tue, 20 Oct 2020 17:35:12 -0400 Subject: [PATCH 36/53] Add tests for member accesses on temporary objects --- .../library-tests/ir/ir/PrintAST.expected | 111 +++++++++++++++++- .../ir/ir/aliased_ssa_consistency.expected | 8 +- .../aliased_ssa_consistency_unsound.expected | 8 +- cpp/ql/test/library-tests/ir/ir/ir.cpp | 12 ++ .../ir/ir/raw_consistency.expected | 1 + .../test/library-tests/ir/ir/raw_ir.expected | 60 ++++++++++ .../ir/ir/unaliased_ssa_consistency.expected | 1 + ...unaliased_ssa_consistency_unsound.expected | 1 + 8 files changed, 182 insertions(+), 20 deletions(-) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index d38f195e4b59..3396f02d9149 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -6010,10 +6010,13 @@ ir.cpp: # 715| Type = [TemplateParameter] V # 715| body: [BlockStmt] { ... } # 716| 0: [ReturnStmt] return ... -# 716| 0: [Literal] 0 +# 716| 0: [TemporaryObjectExpr] temporary object # 716| Type = [TemplateParameter] T -# 716| Value = [Literal] 0 -# 716| ValueCategory = prvalue +# 716| ValueCategory = prvalue(load) +# 716| expr: [Literal] 0 +# 716| Type = [TemplateParameter] T +# 716| Value = [Literal] 0 +# 716| ValueCategory = prvalue # 715| [MemberFunction,TemplateFunction] long Outer::Func(U, V) # 715| params: # 715| 0: [Parameter] x @@ -10524,6 +10527,14 @@ ir.cpp: # 1322| Type = [IntPointerType] int * # 1322| ValueCategory = prvalue(load) # 1323| 1: [ReturnStmt] return ... +# 1326| [FunctionTemplateInstantiation,TopLevelFunction] Point defaultConstruct() +# 1326| params: +# 1326| body: [BlockStmt] { ... } +# 1327| 0: [ReturnStmt] return ... +# 1327| 0: [Literal] 0 +# 1327| Type = [Struct] Point +# 1327| Value = [Literal] 0 +# 1327| ValueCategory = prvalue # 1326| [FunctionTemplateInstantiation,TopLevelFunction] String defaultConstruct() # 1326| params: # 1326| body: [BlockStmt] { ... } @@ -10535,10 +10546,13 @@ ir.cpp: # 1326| params: # 1326| body: [BlockStmt] { ... } # 1327| 0: [ReturnStmt] return ... -# 1327| 0: [Literal] 0 +# 1327| 0: [TemporaryObjectExpr] temporary object # 1327| Type = [TemplateParameter] T -# 1327| Value = [Literal] 0 -# 1327| ValueCategory = prvalue +# 1327| ValueCategory = prvalue(load) +# 1327| expr: [Literal] 0 +# 1327| Type = [TemplateParameter] T +# 1327| Value = [Literal] 0 +# 1327| ValueCategory = prvalue # 1326| [FunctionTemplateInstantiation,TopLevelFunction] copy_constructor defaultConstruct() # 1326| params: # 1326| body: [BlockStmt] { ... } @@ -10596,6 +10610,10 @@ ir.cpp: # 1351| params: # 1353| [MemberFunction] void destructor_only::method() # 1353| params: +# 1357| [FunctionTemplateInstantiation,TopLevelFunction] void acceptRef(Point const&) +# 1357| params: +# 1357| 0: [Parameter] v +# 1357| Type = [LValueReferenceType] const Point & # 1357| [FunctionTemplateInstantiation,TopLevelFunction] void acceptRef(String const&) # 1357| params: # 1357| 0: [Parameter] v @@ -10612,6 +10630,10 @@ ir.cpp: # 1357| params: # 1357| 0: [Parameter] v # 1357| Type = [LValueReferenceType] const destructor_only & +# 1360| [FunctionTemplateInstantiation,TopLevelFunction] void acceptValue(Point) +# 1360| params: +# 1360| 0: [Parameter] v +# 1360| Type = [Struct] Point # 1360| [FunctionTemplateInstantiation,TopLevelFunction] void acceptValue(String) # 1360| params: # 1360| 0: [Parameter] v @@ -10628,6 +10650,8 @@ ir.cpp: # 1360| params: # 1360| 0: [Parameter] v # 1360| Type = [Class] destructor_only +# 1363| [FunctionTemplateInstantiation,TopLevelFunction] Point returnValue() +# 1363| params: # 1363| [FunctionTemplateInstantiation,TopLevelFunction] String returnValue() # 1363| params: # 1363| [TemplateFunction,TopLevelFunction] T returnValue() @@ -10962,6 +10986,81 @@ ir.cpp: # 1401| Type = [Class] copy_constructor # 1401| ValueCategory = prvalue # 1402| 9: [ReturnStmt] return ... +# 1404| [TopLevelFunction] void temporary_point() +# 1404| params: +# 1404| body: [BlockStmt] { ... } +# 1405| 0: [DeclStmt] declaration +# 1405| 0: [VariableDeclarationEntry] definition of p +# 1405| Type = [Struct] Point +# 1405| init: [Initializer] initializer for p +# 1405| expr: [FunctionCall] call to returnValue +# 1405| Type = [Struct] Point +# 1405| ValueCategory = prvalue +# 1406| 1: [DeclStmt] declaration +# 1406| 0: [VariableDeclarationEntry] definition of rp +# 1406| Type = [LValueReferenceType] const Point & +# 1406| init: [Initializer] initializer for rp +# 1406| expr: [ReferenceToExpr] (reference to) +# 1406| Type = [LValueReferenceType] const Point & +# 1406| ValueCategory = prvalue +# 1406| expr: [CStyleCast] (const Point)... +# 1406| Conversion = [GlvalueConversion] glvalue conversion +# 1406| Type = [SpecifiedType] const Point +# 1406| ValueCategory = lvalue +# 1406| expr: [TemporaryObjectExpr] temporary object +# 1406| Type = [Struct] Point +# 1406| ValueCategory = lvalue +# 1406| expr: [FunctionCall] call to returnValue +# 1406| Type = [Struct] Point +# 1406| ValueCategory = prvalue +# 1408| 2: [ExprStmt] ExprStmt +# 1408| 0: [FunctionCall] call to acceptRef +# 1408| Type = [VoidType] void +# 1408| ValueCategory = prvalue +# 1408| 0: [ReferenceToExpr] (reference to) +# 1408| Type = [LValueReferenceType] const Point & +# 1408| ValueCategory = prvalue +# 1408| expr: [CStyleCast] (const Point)... +# 1408| Conversion = [GlvalueConversion] glvalue conversion +# 1408| Type = [SpecifiedType] const Point +# 1408| ValueCategory = lvalue +# 1408| expr: [VariableAccess] p +# 1408| Type = [Struct] Point +# 1408| ValueCategory = lvalue +# 1409| 3: [ExprStmt] ExprStmt +# 1409| 0: [FunctionCall] call to acceptValue +# 1409| Type = [VoidType] void +# 1409| ValueCategory = prvalue +# 1409| 0: [VariableAccess] p +# 1409| Type = [Struct] Point +# 1409| ValueCategory = prvalue(load) +# 1410| 4: [ExprStmt] ExprStmt +# 1410| 0: [ValueFieldAccess] x +# 1410| Type = [IntType] int +# 1410| Value = [ValueFieldAccess] 0 +# 1410| ValueCategory = prvalue +# 1410| -1: [TemporaryObjectExpr] temporary object +# 1410| Type = [Struct] Point +# 1410| ValueCategory = prvalue(load) +# 1410| expr: [Literal] 0 +# 1410| Type = [Struct] Point +# 1410| Value = [Literal] 0 +# 1410| ValueCategory = prvalue +# 1411| 5: [DeclStmt] declaration +# 1411| 0: [VariableDeclarationEntry] definition of y +# 1411| Type = [IntType] int +# 1411| init: [Initializer] initializer for y +# 1411| expr: [ValueFieldAccess] y +# 1411| Type = [IntType] int +# 1411| ValueCategory = prvalue +# 1411| -1: [FunctionCall] call to returnValue +# 1411| Type = [Struct] Point +# 1411| ValueCategory = prvalue +# 1413| 6: [ExprStmt] ExprStmt +# 1413| 0: [FunctionCall] call to defaultConstruct +# 1413| Type = [Struct] Point +# 1413| ValueCategory = prvalue +# 1414| 7: [ReturnStmt] return ... perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| params: diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected index 136f7a44a647..0e695dfeae5d 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected @@ -22,14 +22,8 @@ wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer -| ir.cpp:1401:45:1401:45 | FieldAddress: y | FieldAddress instruction 'FieldAddress: y' has an object address operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | +| ir.cpp:1411:34:1411:34 | FieldAddress: y | FieldAddress instruction 'FieldAddress: y' has an object address operand that is not an address, in function '$@'. | ir.cpp:1404:6:1404:20 | void temporary_point() | void temporary_point() | thisArgumentIsNonPointer -| ir.cpp:1373:14:1373:18 | Call: call to c_str | Call instruction 'Call: call to c_str' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1365:6:1365:21 | void temporary_string() | void temporary_string() | -| ir.cpp:1374:27:1374:31 | Call: call to c_str | Call instruction 'Call: call to c_str' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1365:6:1365:21 | void temporary_string() | void temporary_string() | -| ir.cpp:1385:23:1385:28 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1379:6:1379:30 | void temporary_destructor_only() | void temporary_destructor_only() | -| ir.cpp:1386:36:1386:41 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1379:6:1379:30 | void temporary_destructor_only() | void temporary_destructor_only() | -| ir.cpp:1397:24:1397:29 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | -| ir.cpp:1398:37:1398:42 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected index 136f7a44a647..0e695dfeae5d 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected @@ -22,14 +22,8 @@ wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer -| ir.cpp:1401:45:1401:45 | FieldAddress: y | FieldAddress instruction 'FieldAddress: y' has an object address operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | +| ir.cpp:1411:34:1411:34 | FieldAddress: y | FieldAddress instruction 'FieldAddress: y' has an object address operand that is not an address, in function '$@'. | ir.cpp:1404:6:1404:20 | void temporary_point() | void temporary_point() | thisArgumentIsNonPointer -| ir.cpp:1373:14:1373:18 | Call: call to c_str | Call instruction 'Call: call to c_str' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1365:6:1365:21 | void temporary_string() | void temporary_string() | -| ir.cpp:1374:27:1374:31 | Call: call to c_str | Call instruction 'Call: call to c_str' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1365:6:1365:21 | void temporary_string() | void temporary_string() | -| ir.cpp:1385:23:1385:28 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1379:6:1379:30 | void temporary_destructor_only() | void temporary_destructor_only() | -| ir.cpp:1386:36:1386:41 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1379:6:1379:30 | void temporary_destructor_only() | void temporary_destructor_only() | -| ir.cpp:1397:24:1397:29 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | -| ir.cpp:1398:37:1398:42 | Call: call to method | Call instruction 'Call: call to method' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:1391:6:1391:31 | void temporary_copy_constructor() | void temporary_copy_constructor() | missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index 8762c2ad9951..c5417f5c6e48 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -1401,4 +1401,16 @@ void temporary_copy_constructor() { int y = returnValue().y; } +void temporary_point() { + Point p = returnValue(); // No temporary + const Point& rp = returnValue(); // Binding a reference variable to a temporary + + acceptRef(p); // No temporary + acceptValue(p); + Point().x; + int y = returnValue().y; + + defaultConstruct(); +} + // semmle-extractor-options: -std=c++17 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index 31e5b01229ce..0e695dfeae5d 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -22,6 +22,7 @@ wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer +| ir.cpp:1411:34:1411:34 | FieldAddress: y | FieldAddress instruction 'FieldAddress: y' has an object address operand that is not an address, in function '$@'. | ir.cpp:1404:6:1404:20 | void temporary_point() | void temporary_point() | thisArgumentIsNonPointer missingCanonicalLanguageType multipleCanonicalLanguageTypes diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index dca8b4097bfd..c208239bf7ef 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -7441,6 +7441,19 @@ ir.cpp: # 1320| v1320_10(void) = AliasedUse : ~m? # 1320| v1320_11(void) = ExitFunction : +# 1326| Point defaultConstruct() +# 1326| Block 0 +# 1326| v1326_1(void) = EnterFunction : +# 1326| mu1326_2(unknown) = AliasedDefinition : +# 1326| mu1326_3(unknown) = InitializeNonLocal : +# 1327| r1327_1(glval) = VariableAddress[#return] : +# 1327| r1327_2(Point) = Constant[0] : +# 1327| mu1327_3(Point) = Store[#return] : &:r1327_1, r1327_2 +# 1326| r1326_4(glval) = VariableAddress[#return] : +# 1326| v1326_5(void) = ReturnValue : &:r1326_4, ~m? +# 1326| v1326_6(void) = AliasedUse : ~m? +# 1326| v1326_7(void) = ExitFunction : + # 1326| String defaultConstruct() # 1326| Block 0 # 1326| v1326_1(void) = EnterFunction : @@ -7746,6 +7759,53 @@ ir.cpp: # 1391| v1391_5(void) = AliasedUse : ~m? # 1391| v1391_6(void) = ExitFunction : +# 1404| void temporary_point() +# 1404| Block 0 +# 1404| v1404_1(void) = EnterFunction : +# 1404| mu1404_2(unknown) = AliasedDefinition : +# 1404| mu1404_3(unknown) = InitializeNonLocal : +# 1405| r1405_1(glval) = VariableAddress[p] : +# 1405| r1405_2(glval) = FunctionAddress[returnValue] : +# 1405| r1405_3(Point) = Call[returnValue] : func:r1405_2 +# 1405| mu1405_4(unknown) = ^CallSideEffect : ~m? +# 1405| mu1405_5(Point) = Store[p] : &:r1405_1, r1405_3 +# 1406| r1406_1(glval) = VariableAddress[rp] : +# 1406| r1406_2(glval) = VariableAddress[#temp1406:23] : +# 1406| r1406_3(glval) = FunctionAddress[returnValue] : +# 1406| r1406_4(Point) = Call[returnValue] : func:r1406_3 +# 1406| mu1406_5(unknown) = ^CallSideEffect : ~m? +# 1406| mu1406_6(Point) = Store[#temp1406:23] : &:r1406_2, r1406_4 +# 1406| r1406_7(glval) = Convert : r1406_2 +# 1406| r1406_8(Point &) = CopyValue : r1406_7 +# 1406| mu1406_9(Point &) = Store[rp] : &:r1406_1, r1406_8 +# 1408| r1408_1(glval) = FunctionAddress[acceptRef] : +# 1408| r1408_2(glval) = VariableAddress[p] : +# 1408| r1408_3(glval) = Convert : r1408_2 +# 1408| r1408_4(Point &) = CopyValue : r1408_3 +# 1408| v1408_5(void) = Call[acceptRef] : func:r1408_1, 0:r1408_4 +# 1408| mu1408_6(unknown) = ^CallSideEffect : ~m? +# 1408| v1408_7(void) = ^BufferReadSideEffect[0] : &:r1408_4, ~m? +# 1408| mu1408_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r1408_4 +# 1409| r1409_1(glval) = FunctionAddress[acceptValue] : +# 1409| r1409_2(glval) = VariableAddress[p] : +# 1409| r1409_3(Point) = Load[p] : &:r1409_2, ~m? +# 1409| v1409_4(void) = Call[acceptValue] : func:r1409_1, 0:r1409_3 +# 1409| mu1409_5(unknown) = ^CallSideEffect : ~m? +# 1410| r1410_1(int) = Constant[0] : +# 1411| r1411_1(glval) = VariableAddress[y] : +# 1411| r1411_2(glval) = FunctionAddress[returnValue] : +# 1411| r1411_3(Point) = Call[returnValue] : func:r1411_2 +# 1411| mu1411_4(unknown) = ^CallSideEffect : ~m? +# 1411| r1411_5(glval) = FieldAddress[y] : r1411_3 +# 1411| mu1411_6(int) = Store[y] : &:r1411_1, r1411_5 +# 1413| r1413_1(glval) = FunctionAddress[defaultConstruct] : +# 1413| r1413_2(Point) = Call[defaultConstruct] : func:r1413_1 +# 1413| mu1413_3(unknown) = ^CallSideEffect : ~m? +# 1414| v1414_1(void) = NoOp : +# 1404| v1404_4(void) = ReturnVoid : +# 1404| v1404_5(void) = AliasedUse : ~m? +# 1404| v1404_6(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected index 31e5b01229ce..0e695dfeae5d 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected @@ -22,6 +22,7 @@ wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer +| ir.cpp:1411:34:1411:34 | FieldAddress: y | FieldAddress instruction 'FieldAddress: y' has an object address operand that is not an address, in function '$@'. | ir.cpp:1404:6:1404:20 | void temporary_point() | void temporary_point() | thisArgumentIsNonPointer missingCanonicalLanguageType multipleCanonicalLanguageTypes diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected index 31e5b01229ce..0e695dfeae5d 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected @@ -22,6 +22,7 @@ wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer +| ir.cpp:1411:34:1411:34 | FieldAddress: y | FieldAddress instruction 'FieldAddress: y' has an object address operand that is not an address, in function '$@'. | ir.cpp:1404:6:1404:20 | void temporary_point() | void temporary_point() | thisArgumentIsNonPointer missingCanonicalLanguageType multipleCanonicalLanguageTypes From ee18db7b361e875d1b550a8557d99b4271460662 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Wed, 21 Oct 2020 13:32:15 -0400 Subject: [PATCH 37/53] Fix IR for member accesses on prvalues This fixes the IR generation for member accesses where the qualifier is a prvalue that is _not_ the load of a `TemporaryObjectExpr`. We synthesize a temporary variable during IR generation instead. It fits into the IR construction code at the same spot as `TranslatedLoad`, since it's basically the opposite of `TranslatedLoad` (prvalue->glvalue instead of vice versa). Note that array prvalues require special treatment. This fixes some consistency errors in the `syntax-zoo`. It introduces three new ones in `dataflow-ir-consistency.expected`, but those are along the same lines as tons of existing failures. --- .../raw/internal/TranslatedElement.qll | 83 +++++++++++---- .../raw/internal/TranslatedExpr.qll | 98 ++++++++++++++--- .../library-tests/ir/ir/PrintAST.expected | 100 ++++++++++++++++++ .../ir/ir/aliased_ssa_consistency.expected | 1 - .../aliased_ssa_consistency_unsound.expected | 1 - cpp/ql/test/library-tests/ir/ir/ir.cpp | 13 +++ .../ir/ir/raw_consistency.expected | 1 - .../test/library-tests/ir/ir/raw_ir.expected | 67 +++++++++++- .../ir/ir/unaliased_ssa_consistency.expected | 1 - ...unaliased_ssa_consistency_unsound.expected | 1 - .../aliased_ssa_consistency.expected | 1 - .../dataflow-ir-consistency.expected | 3 + .../syntax-zoo/raw_consistency.expected | 8 -- .../unaliased_ssa_consistency.expected | 1 - 14 files changed, 326 insertions(+), 53 deletions(-) diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll index 3721a9a062be..9594160fa0a7 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll @@ -227,6 +227,49 @@ private predicate usedAsCondition(Expr expr) { ) } +/** + * Holds if `expr` is the result of a field access whose qualifier was a prvalue and whose result is + * a prvalue. These accesses are not marked as having loads, but we do need a load in the IR. + */ +private predicate isPRValueFieldAccessWithImplicitLoad(Expr expr) { + expr instanceof ValueFieldAccess and + expr.isPRValueCategory() and + // No need to do a load if we're replacing the result with a constant anyway. + not isIRConstant(expr) and + // Model an array prvalue as the address of the array, just like an array glvalue. + not expr.getUnspecifiedType() instanceof ArrayType +} + +/** + * Holds if `expr` is a prvalue of class type that is used directly as the qualifier for a member + * access, or is used after undergoing a prvalue adjustment conversion. + */ +private predicate isClassPRValueForMemberAccessQualifier(Expr expr) { + exists(Expr qualifier | + exists(FieldAccess access | qualifier = access.getQualifier().getFullyConverted()) + or + exists(Call call | qualifier = call.getQualifier().getFullyConverted()) + | + // The qualifier is a prvalue of class type. + qualifier.getUnspecifiedType() instanceof Class and + qualifier.isPRValueCategory() and + ( + expr = qualifier and not expr instanceof PrvalueAdjustmentConversion + or + // If the qualifier is a prvalue adjustment conversion, the actual object with be provided by + // the operand of that conversion. For example: + // ```c++ + // std::string("s").c_str(); + // ``` + // The object for the qualifier is a prvalue(load) of type `std::string`, but the actual + // fully-converted qualifier of the call to `c_str()` is a prvalue adjustment conversion that + // converts the type to `const std::string` to match the type of the `this` pointer of the + // member function. + expr = qualifier.(PrvalueAdjustmentConversion).getExpr() + ) + ) +} + /** * Holds if `expr` has an lvalue-to-rvalue conversion that should be ignored * when generating IR. This occurs for conversion from an lvalue of function type @@ -249,30 +292,9 @@ predicate ignoreLoad(Expr expr) { or // The extractor represents the qualifier of a field access or member function call as a load of // the temporary object if the original qualifier was a prvalue. For IR purposes, we always want - // to use the address of the temporary object as the base of a field access or the `this` + // to use the address of the temporary object as the qualifier of a field access or the `this` // argument to a member function call. - exists(Expr qualifier | - exists(FieldAccess access | qualifier = access.getQualifier().getFullyConverted()) - or - exists(Call call | qualifier = call.getQualifier().getFullyConverted()) - | - // The qualifier has a class type. - qualifier.getUnspecifiedType() instanceof Class and - ( - expr = qualifier - or - // If the qualifier is a prvalue adjustment conversion, the load will be on the operand of - // that conversion. For example: - // ```c++ - // std::string("s").c_str(); - // ``` - // The temporary object for the qualifier is a prvalue(load) of type `std::string`, but the - // actual fully converted qualifier of the call to `c_str()` is a prvalue adjustment - // conversion that converts the type to `const std::string` to match the type of the `this` - // pointer of the member function. - expr = qualifier.(PrvalueAdjustmentConversion).getExpr() - ) - ) + isClassPRValueForMemberAccessQualifier(expr) ) } @@ -308,6 +330,8 @@ predicate hasTranslatedLoad(Expr expr) { expr.hasLValueToRValueConversion() or needsLoadForParentExpr(expr) + or + isPRValueFieldAccessWithImplicitLoad(expr) ) and not ignoreExpr(expr) and not isNativeCondition(expr) and @@ -315,6 +339,16 @@ predicate hasTranslatedLoad(Expr expr) { not ignoreLoad(expr) } +/** + * Holds if `expr` should have a `TranslatedSyntheticTemporaryObject` on it. + */ +predicate hasTranslatedSyntheticTemporaryObject(Expr expr) { + not ignoreExpr(expr) and + isClassPRValueForMemberAccessQualifier(expr) and + // If it's a load, we'll just ignore the load in `ignoreLoad()`. + not expr.hasLValueToRValueConversion() +} + /** * Holds if the specified `DeclarationEntry` needs an IR translation. An IR translation is only * necessary for automatic local variables, or for static local variables with dynamic @@ -345,6 +379,9 @@ newtype TTranslatedElement = // A separate element to handle the lvalue-to-rvalue conversion step of an // expression. TTranslatedLoad(Expr expr) { hasTranslatedLoad(expr) } or + // A temporary object that we had to synthesize ourselves, so that we could do a field access or + // method call on a prvalue. + TTranslatedSyntheticTemporaryObject(Expr expr) { hasTranslatedSyntheticTemporaryObject(expr) } or // For expressions that would not otherwise generate an instruction. TTranslatedResultCopy(Expr expr) { not ignoreExpr(expr) and diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll index fe7ddec688e4..9d67c8095e28 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll @@ -110,9 +110,10 @@ abstract class TranslatedCoreExpr extends TranslatedExpr { } final override predicate producesExprResult() { - // If there's no load, then this is the only TranslatedExpr for this + // If there's no load or temp object, then this is the only TranslatedExpr for this // expression. not hasTranslatedLoad(expr) and + not hasTranslatedSyntheticTemporaryObject(expr) and // If there's a result copy, then this expression's result is the copy. not exprNeedsCopyIfNotLoaded(expr) } @@ -246,19 +247,35 @@ class TranslatedConditionValue extends TranslatedCoreExpr, ConditionContext, private TranslatedCondition getCondition() { result = getTranslatedCondition(expr) } } +/** + * The IR translation of a node synthesized to adjust the value category of its operand. + * One of: + * - `TranslatedLoad` - Convert from glvalue to prvalue by loading from the location. + * - `TranslatedSyntheticTemporaryObject` - Convert from prvalue to glvalue by storing to a + * temporary variable. + */ +abstract class TranslatedValueCategoryAdjustment extends TranslatedExpr { + final override Instruction getFirstInstruction() { result = getOperand().getFirstInstruction() } + + final override TranslatedElement getChild(int id) { id = 0 and result = getOperand() } + + final override predicate producesExprResult() { + // A temp object always produces the result of the expression. + any() + } + + final TranslatedCoreExpr getOperand() { result.getExpr() = expr } +} + /** * IR translation of an implicit lvalue-to-rvalue conversion on the result of * an expression. */ -class TranslatedLoad extends TranslatedExpr, TTranslatedLoad { +class TranslatedLoad extends TranslatedValueCategoryAdjustment, TTranslatedLoad { TranslatedLoad() { this = TTranslatedLoad(expr) } override string toString() { result = "Load of " + expr.toString() } - override Instruction getFirstInstruction() { result = getOperand().getFirstInstruction() } - - override TranslatedElement getChild(int id) { id = 0 and result = getOperand() } - override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = LoadTag() and opcode instanceof Opcode::Load and @@ -286,18 +303,75 @@ class TranslatedLoad extends TranslatedExpr, TTranslatedLoad { result = getOperand().getResult() ) } +} - final override predicate producesExprResult() { - // A load always produces the result of the expression. - any() +/** + * The IR translation of a temporary object synthesized by the IR to hold a class prvalue on which + * a member access is going to be performed. This differs from `TranslatedTemporaryObjectExpr` in + * that instances of `TranslatedSyntheticTemporaryObject` are synthesized during IR construction, + * whereas `TranslatedTemporaryObjectExpr` instances are created from `TemporaryObjectExpr` nodes + * from the AST. + */ +class TranslatedSyntheticTemporaryObject extends TranslatedValueCategoryAdjustment, + TTranslatedSyntheticTemporaryObject { + TranslatedSyntheticTemporaryObject() { this = TTranslatedSyntheticTemporaryObject(expr) } + + override string toString() { result = "Temporary materialization of " + expr.toString() } + + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { + tag = InitializerVariableAddressTag() and + opcode instanceof Opcode::VariableAddress and + resultType = getTypeForGLValue(expr.getType()) + or + tag = InitializerStoreTag() and + opcode instanceof Opcode::Store and + resultType = getTypeForPRValue(expr.getType()) } - TranslatedCoreExpr getOperand() { result.getExpr() = expr } + override predicate isResultGLValue() { any() } + + override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + tag = InitializerVariableAddressTag() and + result = getInstruction(InitializerStoreTag()) and + kind instanceof GotoEdge + or + tag = InitializerStoreTag() and + result = getParent().getChildSuccessor(this) and + kind instanceof GotoEdge + } + + override Instruction getChildSuccessor(TranslatedElement child) { + child = getOperand() and result = getInstruction(InitializerVariableAddressTag()) + } + + override Instruction getResult() { result = getInstruction(InitializerVariableAddressTag()) } + + override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { + tag = InitializerStoreTag() and + ( + operandTag instanceof AddressOperandTag and + result = getInstruction(InitializerVariableAddressTag()) + or + operandTag instanceof StoreValueOperandTag and + result = getOperand().getResult() + ) + } + + final override predicate hasTempVariable(TempVariableTag tag, CppType type) { + tag = TempObjectTempVar() and + type = getTypeForPRValue(expr.getType()) + } + + final override IRVariable getInstructionVariable(InstructionTag tag) { + tag = InitializerVariableAddressTag() and + result = getIRTempVariable(expr, TempObjectTempVar()) + } } /** - * IR translation of an implicit lvalue-to-rvalue conversion on the result of - * an expression. + * IR translation of an expression that simply returns its result. We generate an otherwise useless + * `CopyValue` instruction for these expressions so that there is at least one instruction + * associated with the expression. */ class TranslatedResultCopy extends TranslatedExpr, TTranslatedResultCopy { TranslatedResultCopy() { this = TTranslatedResultCopy(expr) } diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 3396f02d9149..cad0619a71d4 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -10656,6 +10656,8 @@ ir.cpp: # 1363| params: # 1363| [TemplateFunction,TopLevelFunction] T returnValue() # 1363| params: +# 1363| [FunctionTemplateInstantiation,TopLevelFunction] UnusualFields returnValue() +# 1363| params: # 1363| [FunctionTemplateInstantiation,TopLevelFunction] copy_constructor returnValue() # 1363| params: # 1363| [FunctionTemplateInstantiation,TopLevelFunction] destructor_only returnValue() @@ -11061,6 +11063,104 @@ ir.cpp: # 1413| Type = [Struct] Point # 1413| ValueCategory = prvalue # 1414| 7: [ReturnStmt] return ... +# 1416| [CopyAssignmentOperator] UnusualFields& UnusualFields::operator=(UnusualFields const&) +# 1416| params: +#-----| 0: [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const UnusualFields & +# 1416| [Constructor] void UnusualFields::UnusualFields() +# 1416| params: +# 1416| [CopyConstructor] void UnusualFields::UnusualFields(UnusualFields const&) +# 1416| params: +#-----| 0: [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const UnusualFields & +# 1416| [MoveConstructor] void UnusualFields::UnusualFields(UnusualFields&&) +# 1416| params: +#-----| 0: [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] UnusualFields && +# 1421| [TopLevelFunction] void temporary_unusual_fields() +# 1421| params: +# 1421| body: [BlockStmt] { ... } +# 1422| 0: [DeclStmt] declaration +# 1422| 0: [VariableDeclarationEntry] definition of rx +# 1422| Type = [LValueReferenceType] const int & +# 1422| init: [Initializer] initializer for rx +# 1422| expr: [ReferenceToExpr] (reference to) +# 1422| Type = [LValueReferenceType] const int & +# 1422| ValueCategory = prvalue +# 1422| expr: [CStyleCast] (const int)... +# 1422| Conversion = [GlvalueConversion] glvalue conversion +# 1422| Type = [SpecifiedType] const int +# 1422| ValueCategory = lvalue +# 1422| expr: [ReferenceDereferenceExpr] (reference dereference) +# 1422| Type = [IntType] int +# 1422| ValueCategory = lvalue +# 1422| expr: [ValueFieldAccess] r +# 1422| Type = [LValueReferenceType] int & +# 1422| ValueCategory = prvalue +# 1422| -1: [FunctionCall] call to returnValue +# 1422| Type = [Struct] UnusualFields +# 1422| ValueCategory = prvalue +# 1423| 1: [DeclStmt] declaration +# 1423| 0: [VariableDeclarationEntry] definition of x +# 1423| Type = [IntType] int +# 1423| init: [Initializer] initializer for x +# 1423| expr: [ReferenceDereferenceExpr] (reference dereference) +# 1423| Type = [IntType] int +# 1423| ValueCategory = prvalue(load) +# 1423| expr: [ValueFieldAccess] r +# 1423| Type = [LValueReferenceType] int & +# 1423| ValueCategory = prvalue +# 1423| -1: [FunctionCall] call to returnValue +# 1423| Type = [Struct] UnusualFields +# 1423| ValueCategory = prvalue +# 1425| 2: [DeclStmt] declaration +# 1425| 0: [VariableDeclarationEntry] definition of rf +# 1425| Type = [LValueReferenceType] const float & +# 1425| init: [Initializer] initializer for rf +# 1425| expr: [ReferenceToExpr] (reference to) +# 1425| Type = [LValueReferenceType] const float & +# 1425| ValueCategory = prvalue +# 1425| expr: [CStyleCast] (const float)... +# 1425| Conversion = [GlvalueConversion] glvalue conversion +# 1425| Type = [SpecifiedType] const float +# 1425| ValueCategory = lvalue +# 1425| expr: [ArrayExpr] access to array +# 1425| Type = [FloatType] float +# 1425| ValueCategory = lvalue +# 1425| 0: [ArrayToPointerConversion] array to pointer conversion +# 1425| Type = [PointerType] float * +# 1425| ValueCategory = prvalue +# 1425| expr: [ValueFieldAccess] a +# 1425| Type = [ArrayType] float[10] +# 1425| ValueCategory = prvalue +# 1425| -1: [FunctionCall] call to returnValue +# 1425| Type = [Struct] UnusualFields +# 1425| ValueCategory = prvalue +# 1425| 1: [Literal] 3 +# 1425| Type = [IntType] int +# 1425| Value = [Literal] 3 +# 1425| ValueCategory = prvalue +# 1426| 3: [DeclStmt] declaration +# 1426| 0: [VariableDeclarationEntry] definition of f +# 1426| Type = [FloatType] float +# 1426| init: [Initializer] initializer for f +# 1426| expr: [ArrayExpr] access to array +# 1426| Type = [FloatType] float +# 1426| ValueCategory = prvalue(load) +# 1426| 0: [ArrayToPointerConversion] array to pointer conversion +# 1426| Type = [PointerType] float * +# 1426| ValueCategory = prvalue +# 1426| expr: [ValueFieldAccess] a +# 1426| Type = [ArrayType] float[10] +# 1426| ValueCategory = prvalue +# 1426| -1: [FunctionCall] call to returnValue +# 1426| Type = [Struct] UnusualFields +# 1426| ValueCategory = prvalue +# 1426| 1: [Literal] 5 +# 1426| Type = [IntType] int +# 1426| Value = [Literal] 5 +# 1426| ValueCategory = prvalue +# 1427| 4: [ReturnStmt] return ... perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| params: diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected index 0e695dfeae5d..31e5b01229ce 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected @@ -22,7 +22,6 @@ wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer -| ir.cpp:1411:34:1411:34 | FieldAddress: y | FieldAddress instruction 'FieldAddress: y' has an object address operand that is not an address, in function '$@'. | ir.cpp:1404:6:1404:20 | void temporary_point() | void temporary_point() | thisArgumentIsNonPointer missingCanonicalLanguageType multipleCanonicalLanguageTypes diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected index 0e695dfeae5d..31e5b01229ce 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected @@ -22,7 +22,6 @@ wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer -| ir.cpp:1411:34:1411:34 | FieldAddress: y | FieldAddress instruction 'FieldAddress: y' has an object address operand that is not an address, in function '$@'. | ir.cpp:1404:6:1404:20 | void temporary_point() | void temporary_point() | thisArgumentIsNonPointer missingCanonicalLanguageType multipleCanonicalLanguageTypes diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index c5417f5c6e48..2afe0f64b00b 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -1413,4 +1413,17 @@ void temporary_point() { defaultConstruct(); } +struct UnusualFields { + int& r; + float a[10]; +}; + +void temporary_unusual_fields() { + const int& rx = returnValue().r; + int x = returnValue().r; + + const float& rf = returnValue().a[3]; + float f = returnValue().a[5]; +} + // semmle-extractor-options: -std=c++17 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index 0e695dfeae5d..31e5b01229ce 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -22,7 +22,6 @@ wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer -| ir.cpp:1411:34:1411:34 | FieldAddress: y | FieldAddress instruction 'FieldAddress: y' has an object address operand that is not an address, in function '$@'. | ir.cpp:1404:6:1404:20 | void temporary_point() | void temporary_point() | thisArgumentIsNonPointer missingCanonicalLanguageType multipleCanonicalLanguageTypes diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index c208239bf7ef..cefba3ffa8fd 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -7753,7 +7753,8 @@ ir.cpp: # 1401| mu1401_5(unknown) = ^CallSideEffect : ~m? # 1401| mu1401_6(copy_constructor) = Store[#temp1401:13] : &:r1401_2, r1401_4 # 1401| r1401_7(glval) = FieldAddress[y] : r1401_2 -# 1401| mu1401_8(int) = Store[y] : &:r1401_1, r1401_7 +# 1401| r1401_8(int) = Load[?] : &:r1401_7, ~m? +# 1401| mu1401_9(int) = Store[y] : &:r1401_1, r1401_8 # 1402| v1402_1(void) = NoOp : # 1391| v1391_4(void) = ReturnVoid : # 1391| v1391_5(void) = AliasedUse : ~m? @@ -7796,8 +7797,11 @@ ir.cpp: # 1411| r1411_2(glval) = FunctionAddress[returnValue] : # 1411| r1411_3(Point) = Call[returnValue] : func:r1411_2 # 1411| mu1411_4(unknown) = ^CallSideEffect : ~m? -# 1411| r1411_5(glval) = FieldAddress[y] : r1411_3 -# 1411| mu1411_6(int) = Store[y] : &:r1411_1, r1411_5 +# 1411| r1411_5(glval) = VariableAddress[#temp1411:13] : +# 1411| mu1411_6(Point) = Store[#temp1411:13] : &:r1411_5, r1411_3 +# 1411| r1411_7(glval) = FieldAddress[y] : r1411_5 +# 1411| r1411_8(int) = Load[?] : &:r1411_7, ~m? +# 1411| mu1411_9(int) = Store[y] : &:r1411_1, r1411_8 # 1413| r1413_1(glval) = FunctionAddress[defaultConstruct] : # 1413| r1413_2(Point) = Call[defaultConstruct] : func:r1413_1 # 1413| mu1413_3(unknown) = ^CallSideEffect : ~m? @@ -7806,6 +7810,63 @@ ir.cpp: # 1404| v1404_5(void) = AliasedUse : ~m? # 1404| v1404_6(void) = ExitFunction : +# 1421| void temporary_unusual_fields() +# 1421| Block 0 +# 1421| v1421_1(void) = EnterFunction : +# 1421| mu1421_2(unknown) = AliasedDefinition : +# 1421| mu1421_3(unknown) = InitializeNonLocal : +# 1422| r1422_1(glval) = VariableAddress[rx] : +# 1422| r1422_2(glval) = FunctionAddress[returnValue] : +# 1422| r1422_3(UnusualFields) = Call[returnValue] : func:r1422_2 +# 1422| mu1422_4(unknown) = ^CallSideEffect : ~m? +# 1422| r1422_5(glval) = VariableAddress[#temp1422:21] : +# 1422| mu1422_6(UnusualFields) = Store[#temp1422:21] : &:r1422_5, r1422_3 +# 1422| r1422_7(glval) = FieldAddress[r] : r1422_5 +# 1422| r1422_8(int &) = Load[?] : &:r1422_7, ~m? +# 1422| r1422_9(glval) = CopyValue : r1422_8 +# 1422| r1422_10(glval) = Convert : r1422_9 +# 1422| r1422_11(int &) = CopyValue : r1422_10 +# 1422| mu1422_12(int &) = Store[rx] : &:r1422_1, r1422_11 +# 1423| r1423_1(glval) = VariableAddress[x] : +# 1423| r1423_2(glval) = FunctionAddress[returnValue] : +# 1423| r1423_3(UnusualFields) = Call[returnValue] : func:r1423_2 +# 1423| mu1423_4(unknown) = ^CallSideEffect : ~m? +# 1423| r1423_5(glval) = VariableAddress[#temp1423:13] : +# 1423| mu1423_6(UnusualFields) = Store[#temp1423:13] : &:r1423_5, r1423_3 +# 1423| r1423_7(glval) = FieldAddress[r] : r1423_5 +# 1423| r1423_8(int &) = Load[?] : &:r1423_7, ~m? +# 1423| r1423_9(int) = Load[?] : &:r1423_8, ~m? +# 1423| mu1423_10(int) = Store[x] : &:r1423_1, r1423_9 +# 1425| r1425_1(glval) = VariableAddress[rf] : +# 1425| r1425_2(glval) = FunctionAddress[returnValue] : +# 1425| r1425_3(UnusualFields) = Call[returnValue] : func:r1425_2 +# 1425| mu1425_4(unknown) = ^CallSideEffect : ~m? +# 1425| r1425_5(glval) = VariableAddress[#temp1425:23] : +# 1425| mu1425_6(UnusualFields) = Store[#temp1425:23] : &:r1425_5, r1425_3 +# 1425| r1425_7(glval) = FieldAddress[a] : r1425_5 +# 1425| r1425_8(float *) = Convert : r1425_7 +# 1425| r1425_9(int) = Constant[3] : +# 1425| r1425_10(glval) = PointerAdd[4] : r1425_8, r1425_9 +# 1425| r1425_11(glval) = Convert : r1425_10 +# 1425| r1425_12(float &) = CopyValue : r1425_11 +# 1425| mu1425_13(float &) = Store[rf] : &:r1425_1, r1425_12 +# 1426| r1426_1(glval) = VariableAddress[f] : +# 1426| r1426_2(glval) = FunctionAddress[returnValue] : +# 1426| r1426_3(UnusualFields) = Call[returnValue] : func:r1426_2 +# 1426| mu1426_4(unknown) = ^CallSideEffect : ~m? +# 1426| r1426_5(glval) = VariableAddress[#temp1426:15] : +# 1426| mu1426_6(UnusualFields) = Store[#temp1426:15] : &:r1426_5, r1426_3 +# 1426| r1426_7(glval) = FieldAddress[a] : r1426_5 +# 1426| r1426_8(float *) = Convert : r1426_7 +# 1426| r1426_9(int) = Constant[5] : +# 1426| r1426_10(glval) = PointerAdd[4] : r1426_8, r1426_9 +# 1426| r1426_11(float) = Load[?] : &:r1426_10, ~m? +# 1426| mu1426_12(float) = Store[f] : &:r1426_1, r1426_11 +# 1427| v1427_1(void) = NoOp : +# 1421| v1421_4(void) = ReturnVoid : +# 1421| v1421_5(void) = AliasedUse : ~m? +# 1421| v1421_6(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected index 0e695dfeae5d..31e5b01229ce 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected @@ -22,7 +22,6 @@ wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer -| ir.cpp:1411:34:1411:34 | FieldAddress: y | FieldAddress instruction 'FieldAddress: y' has an object address operand that is not an address, in function '$@'. | ir.cpp:1404:6:1404:20 | void temporary_point() | void temporary_point() | thisArgumentIsNonPointer missingCanonicalLanguageType multipleCanonicalLanguageTypes diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected index 0e695dfeae5d..31e5b01229ce 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected @@ -22,7 +22,6 @@ wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer -| ir.cpp:1411:34:1411:34 | FieldAddress: y | FieldAddress instruction 'FieldAddress: y' has an object address operand that is not an address, in function '$@'. | ir.cpp:1404:6:1404:20 | void temporary_point() | void temporary_point() | thisArgumentIsNonPointer missingCanonicalLanguageType multipleCanonicalLanguageTypes diff --git a/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected index 1fc131a4d79d..fcfef712b56c 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected @@ -13,7 +13,6 @@ instructionWithoutSuccessor | condition_decls.cpp:41:22:41:23 | Chi: call to BoxedInt | Instruction 'Chi: call to BoxedInt' has no successors in function '$@'. | condition_decls.cpp:40:6:40:20 | void while_decl_bind(int) | void while_decl_bind(int) | | condition_decls.cpp:48:52:48:53 | Chi: call to BoxedInt | Instruction 'Chi: call to BoxedInt' has no successors in function '$@'. | condition_decls.cpp:47:6:47:18 | void for_decl_bind(int) | void for_decl_bind(int) | | misc.c:171:10:171:13 | Uninitialized: definition of str2 | Instruction 'Uninitialized: definition of str2' has no successors in function '$@'. | misc.c:168:6:168:8 | void vla() | void vla() | -| misc.c:219:47:219:48 | InitializeIndirection: sp | Instruction 'InitializeIndirection: sp' has no successors in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) | | ms_try_except.cpp:3:9:3:9 | Uninitialized: definition of x | Instruction 'Uninitialized: definition of x' has no successors in function '$@'. | ms_try_except.cpp:2:6:2:18 | void ms_try_except(int) | void ms_try_except(int) | | ms_try_mix.cpp:11:12:11:15 | Chi: call to C | Instruction 'Chi: call to C' has no successors in function '$@'. | ms_try_mix.cpp:10:6:10:18 | void ms_except_mix(int) | void ms_except_mix(int) | | ms_try_mix.cpp:28:12:28:15 | Chi: call to C | Instruction 'Chi: call to C' has no successors in function '$@'. | ms_try_mix.cpp:27:6:27:19 | void ms_finally_mix(int) | void ms_finally_mix(int) | diff --git a/cpp/ql/test/library-tests/syntax-zoo/dataflow-ir-consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/dataflow-ir-consistency.expected index 20f8815f2be7..25a9cf7a016d 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/dataflow-ir-consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/dataflow-ir-consistency.expected @@ -1558,6 +1558,9 @@ postWithInFlow | misc.c:158:14:158:18 | Chi | PostUpdateNode should not be the target of local flow. | | misc.c:160:31:160:33 | Chi | PostUpdateNode should not be the target of local flow. | | misc.c:160:31:160:33 | Chi | PostUpdateNode should not be the target of local flow. | +| misc.c:220:3:223:3 | Chi | PostUpdateNode should not be the target of local flow. | +| misc.c:221:10:221:10 | Chi | PostUpdateNode should not be the target of local flow. | +| misc.c:222:10:222:10 | Chi | PostUpdateNode should not be the target of local flow. | | range_analysis.c:102:5:102:15 | Chi | PostUpdateNode should not be the target of local flow. | | static_init_templates.cpp:3:2:3:8 | Chi | PostUpdateNode should not be the target of local flow. | | static_init_templates.cpp:21:2:21:12 | Chi | PostUpdateNode should not be the target of local flow. | diff --git a/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected index 71badee0d5db..d6612e5bfade 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected @@ -4,9 +4,6 @@ missingOperand | condition_decls.cpp:41:9:41:23 | CopyValue: (condition decl) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | condition_decls.cpp:40:6:40:20 | void while_decl_bind(int) | void while_decl_bind(int) | | condition_decls.cpp:48:39:48:53 | CopyValue: (condition decl) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | condition_decls.cpp:47:6:47:18 | void for_decl_bind(int) | void for_decl_bind(int) | | misc.c:125:5:125:11 | CopyValue: (statement expression) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | misc.c:97:6:97:10 | void misc3() | void misc3() | -| misc.c:220:3:223:3 | Store: ... = ... | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) | -| misc.c:220:9:223:3 | FieldAddress: {...} | Instruction 'FieldAddress' is missing an expected operand with tag 'Unary' in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) | -| misc.c:220:9:223:3 | FieldAddress: {...} | Instruction 'FieldAddress' is missing an expected operand with tag 'Unary' in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) | | try_catch.cpp:23:5:23:18 | CopyValue: (statement expression) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | try_catch.cpp:19:6:19:23 | void throw_from_nonstmt(int) | void throw_from_nonstmt(int) | unexpectedOperand duplicateOperand @@ -34,9 +31,6 @@ instructionWithoutSuccessor | misc.c:174:17:174:22 | CallSideEffect: call to getInt | Instruction 'CallSideEffect: call to getInt' has no successors in function '$@'. | misc.c:168:6:168:8 | void vla() | void vla() | | misc.c:174:30:174:35 | CallSideEffect: call to getInt | Instruction 'CallSideEffect: call to getInt' has no successors in function '$@'. | misc.c:168:6:168:8 | void vla() | void vla() | | misc.c:174:55:174:60 | Store: (char ****)... | Instruction 'Store: (char ****)...' has no successors in function '$@'. | misc.c:168:6:168:8 | void vla() | void vla() | -| misc.c:219:47:219:48 | InitializeIndirection: sp | Instruction 'InitializeIndirection: sp' has no successors in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) | -| misc.c:221:10:221:10 | Store: 1 | Instruction 'Store: 1' has no successors in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) | -| misc.c:222:10:222:10 | Store: 2 | Instruction 'Store: 2' has no successors in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) | | ms_try_except.cpp:3:9:3:9 | Uninitialized: definition of x | Instruction 'Uninitialized: definition of x' has no successors in function '$@'. | ms_try_except.cpp:2:6:2:18 | void ms_try_except(int) | void ms_try_except(int) | | ms_try_except.cpp:7:13:7:17 | Store: ... = ... | Instruction 'Store: ... = ...' has no successors in function '$@'. | ms_try_except.cpp:2:6:2:18 | void ms_try_except(int) | void ms_try_except(int) | | ms_try_except.cpp:9:19:9:19 | Load: j | Instruction 'Load: j' has no successors in function '$@'. | ms_try_except.cpp:2:6:2:18 | void ms_try_except(int) | void ms_try_except(int) | @@ -150,8 +144,6 @@ wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer -| misc.c:220:9:223:3 | FieldAddress: {...} | FieldAddress instruction 'FieldAddress: {...}' has an object address operand that is not an address, in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) | -| misc.c:220:9:223:3 | FieldAddress: {...} | FieldAddress instruction 'FieldAddress: {...}' has an object address operand that is not an address, in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) | thisArgumentIsNonPointer | pmcallexpr.cpp:8:2:8:15 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | array_delete.cpp:5:6:5:6 | void f() | void f() | | pointer_to_member.cpp:23:5:23:54 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) | diff --git a/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected index 08cff6136b13..56e9f2e881a3 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected @@ -13,7 +13,6 @@ instructionWithoutSuccessor | condition_decls.cpp:41:22:41:23 | IndirectMayWriteSideEffect: call to BoxedInt | Instruction 'IndirectMayWriteSideEffect: call to BoxedInt' has no successors in function '$@'. | condition_decls.cpp:40:6:40:20 | void while_decl_bind(int) | void while_decl_bind(int) | | condition_decls.cpp:48:52:48:53 | IndirectMayWriteSideEffect: call to BoxedInt | Instruction 'IndirectMayWriteSideEffect: call to BoxedInt' has no successors in function '$@'. | condition_decls.cpp:47:6:47:18 | void for_decl_bind(int) | void for_decl_bind(int) | | misc.c:171:10:171:13 | Uninitialized: definition of str2 | Instruction 'Uninitialized: definition of str2' has no successors in function '$@'. | misc.c:168:6:168:8 | void vla() | void vla() | -| misc.c:219:47:219:48 | InitializeIndirection: sp | Instruction 'InitializeIndirection: sp' has no successors in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) | | ms_try_except.cpp:3:9:3:9 | Uninitialized: definition of x | Instruction 'Uninitialized: definition of x' has no successors in function '$@'. | ms_try_except.cpp:2:6:2:18 | void ms_try_except(int) | void ms_try_except(int) | | ms_try_mix.cpp:11:12:11:15 | IndirectMayWriteSideEffect: call to C | Instruction 'IndirectMayWriteSideEffect: call to C' has no successors in function '$@'. | ms_try_mix.cpp:10:6:10:18 | void ms_except_mix(int) | void ms_except_mix(int) | | ms_try_mix.cpp:28:12:28:15 | IndirectMayWriteSideEffect: call to C | Instruction 'IndirectMayWriteSideEffect: call to C' has no successors in function '$@'. | ms_try_mix.cpp:27:6:27:19 | void ms_finally_mix(int) | void ms_finally_mix(int) | From 5259f86e32c16b8a01ce01966e41effe263a7420 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Wed, 21 Oct 2020 18:06:34 -0400 Subject: [PATCH 38/53] Accept diff (needs further investigation, though) --- .../test/library-tests/dataflow/taint-tests/test_diff.expected | 2 +- cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/test_diff.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/test_diff.expected index 81c9b778a446..2933e025fd62 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/test_diff.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/test_diff.expected @@ -26,7 +26,7 @@ | map.cpp:79:9:79:13 | map.cpp:66:37:66:42 | IR only | | map.cpp:80:9:80:14 | map.cpp:66:37:66:42 | IR only | | map.cpp:87:34:87:38 | map.cpp:87:17:87:22 | AST only | -| map.cpp:90:34:90:38 | map.cpp:90:24:90:29 | IR only | +| map.cpp:91:34:91:39 | map.cpp:91:24:91:29 | AST only | | map.cpp:108:7:108:54 | map.cpp:108:39:108:44 | IR only | | map.cpp:111:7:111:48 | map.cpp:111:34:111:39 | IR only | | map.cpp:155:12:155:16 | map.cpp:108:39:108:44 | IR only | diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected index a61c5d7b9dd1..4096b5e6532b 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected @@ -68,8 +68,6 @@ | map.cpp:80:9:80:14 | second | map.cpp:66:37:66:42 | call to source | | map.cpp:81:7:81:7 | l | map.cpp:66:37:66:42 | call to source | | map.cpp:89:7:89:32 | call to pair | map.cpp:89:24:89:29 | call to source | -| map.cpp:90:34:90:38 | first | map.cpp:90:24:90:29 | call to source | -| map.cpp:91:34:91:39 | second | map.cpp:91:24:91:29 | call to source | | map.cpp:108:7:108:54 | call to iterator | map.cpp:108:39:108:44 | call to source | | map.cpp:110:10:110:15 | call to insert | map.cpp:110:62:110:67 | call to source | | map.cpp:111:7:111:48 | call to iterator | map.cpp:111:34:111:39 | call to source | From f7eeadadd95438d64fba66a5034bfcb6954f0695 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Wed, 21 Oct 2020 18:37:49 -0400 Subject: [PATCH 39/53] Accept more diffs --- .../library-tests/ptr_to_member/segfault/exprs.expected | 7 +++++++ cpp/ql/test/library-tests/question_mark_colon/cfg.expected | 1 - 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/cpp/ql/test/library-tests/ptr_to_member/segfault/exprs.expected b/cpp/ql/test/library-tests/ptr_to_member/segfault/exprs.expected index e5539a762ab0..d808cf89139c 100644 --- a/cpp/ql/test/library-tests/ptr_to_member/segfault/exprs.expected +++ b/cpp/ql/test/library-tests/ptr_to_member/segfault/exprs.expected @@ -10,6 +10,9 @@ | segfault.cpp:25:58:25:64 | 0 | segfault.cpp:12:8:12:12 | index | | segfault.cpp:25:58:25:64 | 0 | segfault.cpp:12:8:12:12 | index | | segfault.cpp:25:58:25:64 | 0 | segfault.cpp:12:8:12:12 | index | +| segfault.cpp:25:58:25:64 | temporary object | segfault.cpp:12:8:12:12 | index | +| segfault.cpp:25:58:25:64 | temporary object | segfault.cpp:12:8:12:12 | index | +| segfault.cpp:25:58:25:64 | temporary object | segfault.cpp:12:8:12:12 | index | | segfault.cpp:29:23:29:44 | 0 | file://:0:0:0:0 | ..:: * | | segfault.cpp:29:23:29:44 | 0 | file://:0:0:0:0 | ..:: * | | segfault.cpp:29:23:29:44 | constructor init of field second | file://:0:0:0:0 | ..:: * | @@ -23,10 +26,14 @@ | segfault.cpp:35:9:35:56 | call to S | file://:0:0:0:0 | void | | segfault.cpp:35:9:35:56 | new | file://:0:0:0:0 | S<..(*)(..)> * | | segfault.cpp:35:24:35:46 | 0 | segfault.cpp:9:8:9:28 | piecewise_construct_t | +| segfault.cpp:35:24:35:46 | temporary object | segfault.cpp:9:8:9:28 | piecewise_construct_t | | segfault.cpp:35:49:35:55 | 0 | segfault.cpp:15:7:15:11 | tuple | +| segfault.cpp:35:49:35:55 | temporary object | segfault.cpp:15:7:15:11 | tuple | | segfault.cpp:40:5:40:5 | x | file://:0:0:0:0 | S * | | segfault.cpp:40:5:40:54 | ... = ... | file://:0:0:0:0 | S * | | segfault.cpp:40:9:40:54 | call to S | file://:0:0:0:0 | void | | segfault.cpp:40:9:40:54 | new | file://:0:0:0:0 | S * | | segfault.cpp:40:22:40:44 | 0 | segfault.cpp:9:8:9:28 | piecewise_construct_t | +| segfault.cpp:40:22:40:44 | temporary object | segfault.cpp:9:8:9:28 | piecewise_construct_t | | segfault.cpp:40:47:40:53 | 0 | segfault.cpp:15:7:15:11 | tuple | +| segfault.cpp:40:47:40:53 | temporary object | segfault.cpp:15:7:15:11 | tuple | diff --git a/cpp/ql/test/library-tests/question_mark_colon/cfg.expected b/cpp/ql/test/library-tests/question_mark_colon/cfg.expected index 9fa6fa1b53b9..82cda5c6f84c 100644 --- a/cpp/ql/test/library-tests/question_mark_colon/cfg.expected +++ b/cpp/ql/test/library-tests/question_mark_colon/cfg.expected @@ -1,4 +1,3 @@ -| 0 | 1 | file://:0:0:0:0 | temporary object | None | | 2 | 1 | question_mark_colon.c:2:7:2:7 | f | None | | 4 | 1 | question_mark_colon.c:4:14:8:1 | { ... } | declaration | | 4 | 17 | question_mark_colon.c:4:6:4:6 | g | None | From b62bda6c3ab24f968f9153e603742f1bfd2456fb Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Thu, 22 Oct 2020 12:55:30 -0400 Subject: [PATCH 40/53] Fix regression due to primary instructions for side effects not being computed correctly in the presence of synthetic temporary objects. --- .../raw/internal/TranslatedCall.qll | 16 +++++++++++++--- .../raw/internal/TranslatedExpr.qll | 5 +++-- .../dataflow/taint-tests/test_diff.expected | 3 +-- .../dataflow/taint-tests/test_ir.expected | 3 +++ 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll index 821bf94709a8..576743154f1d 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll @@ -8,6 +8,16 @@ private import TranslatedElement private import TranslatedExpr private import TranslatedFunction +/** + * Gets the `CallInstruction` from the `TranslatedCallExpr` for the specified expression. + */ +private CallInstruction getTranslatedCallInstruction(Call call) { + exists(TranslatedCallExpr translatedCall | + translatedCall.getExpr() = call and + result = translatedCall.getInstruction(CallTag()) + ) +} + /** * The IR translation of a call to a function. The call may be from an actual * call in the source code, or could be a call that is part of the translation @@ -388,7 +398,7 @@ class TranslatedAllocationSideEffects extends TranslatedSideEffects, tag = OnlyInstructionTag() and if expr instanceof NewOrNewArrayExpr then result = getTranslatedAllocatorCall(expr).getInstruction(CallTag()) - else result = getTranslatedExpr(expr).getInstruction(CallTag()) + else result = getTranslatedCallInstruction(expr) } } @@ -409,7 +419,7 @@ class TranslatedCallSideEffects extends TranslatedSideEffects, TTranslatedCallSi override Instruction getPrimaryInstructionForSideEffect(InstructionTag tag) { tag = OnlyInstructionTag() and - result = getTranslatedExpr(expr).getInstruction(CallTag()) + result = getTranslatedCallInstruction(expr) } } @@ -599,7 +609,7 @@ class TranslatedSideEffect extends TranslatedElement, TTranslatedArgumentSideEff override Instruction getPrimaryInstructionForSideEffect(InstructionTag tag) { tag = OnlyInstructionTag() and - result = getTranslatedExpr(call).getInstruction(CallTag()) + result = getTranslatedCallInstruction(call) } final override int getInstructionIndex(InstructionTag tag) { diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll index 9d67c8095e28..25695da4a592 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll @@ -15,8 +15,9 @@ private import TranslatedStmt import TranslatedCall /** - * Gets the TranslatedExpr for the specified expression. If `expr` is a load, - * the result is the TranslatedExpr for the load portion. + * Gets the TranslatedExpr for the specified expression. If `expr` is a load or synthesized + * temporary object, the result is the TranslatedExpr for the load or synthetic temporary object + * portion. */ TranslatedExpr getTranslatedExpr(Expr expr) { result.getExpr() = expr and diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/test_diff.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/test_diff.expected index 2933e025fd62..5b3a0e755088 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/test_diff.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/test_diff.expected @@ -25,8 +25,7 @@ | map.cpp:76:9:76:13 | map.cpp:66:37:66:42 | IR only | | map.cpp:79:9:79:13 | map.cpp:66:37:66:42 | IR only | | map.cpp:80:9:80:14 | map.cpp:66:37:66:42 | IR only | -| map.cpp:87:34:87:38 | map.cpp:87:17:87:22 | AST only | -| map.cpp:91:34:91:39 | map.cpp:91:24:91:29 | AST only | +| map.cpp:90:34:90:38 | map.cpp:90:24:90:29 | IR only | | map.cpp:108:7:108:54 | map.cpp:108:39:108:44 | IR only | | map.cpp:111:7:111:48 | map.cpp:111:34:111:39 | IR only | | map.cpp:155:12:155:16 | map.cpp:108:39:108:44 | IR only | diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected index 4096b5e6532b..b6621bedc700 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected @@ -67,7 +67,10 @@ | map.cpp:79:9:79:13 | first | map.cpp:66:37:66:42 | call to source | | map.cpp:80:9:80:14 | second | map.cpp:66:37:66:42 | call to source | | map.cpp:81:7:81:7 | l | map.cpp:66:37:66:42 | call to source | +| map.cpp:87:34:87:38 | first | map.cpp:87:17:87:22 | call to source | | map.cpp:89:7:89:32 | call to pair | map.cpp:89:24:89:29 | call to source | +| map.cpp:90:34:90:38 | first | map.cpp:90:24:90:29 | call to source | +| map.cpp:91:34:91:39 | second | map.cpp:91:24:91:29 | call to source | | map.cpp:108:7:108:54 | call to iterator | map.cpp:108:39:108:44 | call to source | | map.cpp:110:10:110:15 | call to insert | map.cpp:110:62:110:67 | call to source | | map.cpp:111:7:111:48 | call to iterator | map.cpp:111:34:111:39 | call to source | From 99072483b81d6e5f31c2e47211da6a3e141a2517 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Thu, 22 Oct 2020 12:55:40 -0400 Subject: [PATCH 41/53] Fix PR feedback --- cpp/ql/src/semmle/code/cpp/models/implementations/StdPair.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/StdPair.qll b/cpp/ql/src/semmle/code/cpp/models/implementations/StdPair.qll index b75963d9c69d..0f2e37ec2db5 100644 --- a/cpp/ql/src/semmle/code/cpp/models/implementations/StdPair.qll +++ b/cpp/ql/src/semmle/code/cpp/models/implementations/StdPair.qll @@ -20,7 +20,7 @@ class StdPairCopyishConstructor extends Constructor, TaintFunction { StdPairCopyishConstructor() { this.getDeclaringType() instanceof StdPairClass and this.getNumberOfParameters() = 1 and - this.getParameter(0).getUnspecifiedType().(ReferenceType).getBaseType().getUnspecifiedType() + this.getParameter(0).getUnspecifiedType().(ReferenceType).getBaseType() instanceof StdPairClass } From bace0dca6d03602f19cee691264ea4e7e9045bf7 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Fri, 23 Oct 2020 12:04:09 -0400 Subject: [PATCH 42/53] Handle more cases that require synthesizing temporary objects - Parens around qualifier expressions - Inheritance conversions involving class prvalues --- .../raw/internal/TranslatedElement.qll | 124 ++++++++++++++---- .../raw/internal/TranslatedExpr.qll | 12 +- .../dataflow/taint-tests/test_diff.expected | 4 +- .../dataflow/taint-tests/test_ir.expected | 4 + .../library-tests/ir/ir/PrintAST.expected | 112 ++++++++++++++++ cpp/ql/test/library-tests/ir/ir/ir.cpp | 21 +++ .../test/library-tests/ir/ir/raw_ir.expected | 54 ++++++++ 7 files changed, 298 insertions(+), 33 deletions(-) diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll index 9594160fa0a7..9a1b21f9a791 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll @@ -227,6 +227,24 @@ private predicate usedAsCondition(Expr expr) { ) } +/** + * Holds if `conv` is an `InheritanceConversion` that requires a `TranslatedLoad`, despite not being + * marked as having an lvalue-to-rvalue conversion. + * + * This is necessary for an `InheritanceConversion` that is originally modeled as a + * prvalue-to-prvalue conversion, since we transform it into a glvalue-to-glvalue conversion. If it + * is actually consumed as a prvalue, such as on the right hand side of an assignment, we need to + * load the resulting glvalue. + */ +private predicate isInheritanceConversionWithImplicitLoad(InheritanceConversion conv) { + // Must have originally been a prvalue-to-prvalue conversion. + isClassPRValue(conv.getExpr()) and + not conv.hasLValueToRValueConversion() and + // Exclude that case where this will be consumed as a glvalue, such as when used as the qualifier + // of a field access. + not isPRValueConversionOnGLValue(conv) +} + /** * Holds if `expr` is the result of a field access whose qualifier was a prvalue and whose result is * a prvalue. These accesses are not marked as having loads, but we do need a load in the IR. @@ -241,35 +259,93 @@ private predicate isPRValueFieldAccessWithImplicitLoad(Expr expr) { } /** - * Holds if `expr` is a prvalue of class type that is used directly as the qualifier for a member - * access, or is used after undergoing a prvalue adjustment conversion. + * Holds if `expr` is a prvalue of class type. + * + * This same test is used in several places. + */ +pragma[inline] +private predicate isClassPRValue(Expr expr) { + expr.isPRValueCategory() and + expr.getUnspecifiedType() instanceof Class +} + +/** + * Holds if `expr` is consumed as a glvalue by its parent. If `expr` is actually a prvalue, it will + * have any lvalue-to-rvalue conversion ignored. If it does not have an lvalue-to-rvalue conversion, + * it will be materialized into a temporary object. */ -private predicate isClassPRValueForMemberAccessQualifier(Expr expr) { - exists(Expr qualifier | - exists(FieldAccess access | qualifier = access.getQualifier().getFullyConverted()) +private predicate consumedAsGLValue(Expr expr) { + isClassPRValue(expr) and + ( + // Qualifier of a field access. + expr = any(FieldAccess a).getQualifier().getFullyConverted() or - exists(Call call | qualifier = call.getQualifier().getFullyConverted()) - | - // The qualifier is a prvalue of class type. - qualifier.getUnspecifiedType() instanceof Class and - qualifier.isPRValueCategory() and + // Qualifier of a member function call. + expr = any(Call c).getQualifier().getFullyConverted() + or + // The operand of an inheritance conversion. + expr = any(InheritanceConversion c).getExpr() + ) +} + +/** + * Holds if `expr` is a conversion that is originally a prvalue-to-prvalue conversion, but which is + * applied to a prvalue that will actually be consumed as a glvalue. + */ +predicate isPRValueConversionOnGLValue(Conversion conv) { + exists(Expr consumed | + consumedAsGLValue(consumed) and + isClassPRValue(conv.getExpr()) and + ( + // Example: The conversion of `std::string` to `const std::string` when evaluating + // `std::string("foo").c_str()`. + conv instanceof PrvalueAdjustmentConversion + or + // Parentheses are transparent. + conv instanceof ParenthesisExpr + or + // Example: The base class conversion in `f().m()`, when `m` is member function of a base + // class of the return type of `f()`. + conv instanceof InheritanceConversion + ) and ( - expr = qualifier and not expr instanceof PrvalueAdjustmentConversion + // Base case: The conversion is consumed directly. + conv = consumed or - // If the qualifier is a prvalue adjustment conversion, the actual object with be provided by - // the operand of that conversion. For example: - // ```c++ - // std::string("s").c_str(); - // ``` - // The object for the qualifier is a prvalue(load) of type `std::string`, but the actual - // fully-converted qualifier of the call to `c_str()` is a prvalue adjustment conversion that - // converts the type to `const std::string` to match the type of the `this` pointer of the - // member function. - expr = qualifier.(PrvalueAdjustmentConversion).getExpr() + // Recursive case: The conversion is the operand of another prvalue conversion. + isPRValueConversionOnGLValue(conv.getConversion()) ) ) } +/** + * Holds if `expr` is a prvalue of class type that is used in a context that requires a glvalue. + * + * Any conversions between `expr` and the ancestor that consumes the glvalue will also be treated + * as glvalues, but are not part of this relation. + * + * For example: + * ```c++ + * std::string("s").c_str(); + * ``` + * The object for the qualifier is a prvalue(load) of type `std::string`, but the actual + * fully-converted qualifier of the call to `c_str()` is a prvalue adjustment conversion that + * converts the type to `const std::string` to match the type of the `this` pointer of the + * member function. In this case, `mustTransformToGLValue()` will hold for the temporary + * `std::string` object, but not the prvalue adjustment on top of it. + * `isPRValueConversionOnGLValue()` would hold for the prvalue adjustment. + */ +private predicate mustTransformToGLValue(Expr expr) { + not isPRValueConversionOnGLValue(expr) and + ( + // The expression is the fully converted qualifier, with no prvalue adjustments on top. + consumedAsGLValue(expr) + or + // The expression has conversions on top, but they are all prvalue adjustments. + isPRValueConversionOnGLValue(expr.getConversion()) + ) +} + /** * Holds if `expr` has an lvalue-to-rvalue conversion that should be ignored * when generating IR. This occurs for conversion from an lvalue of function type @@ -294,7 +370,7 @@ predicate ignoreLoad(Expr expr) { // the temporary object if the original qualifier was a prvalue. For IR purposes, we always want // to use the address of the temporary object as the qualifier of a field access or the `this` // argument to a member function call. - isClassPRValueForMemberAccessQualifier(expr) + mustTransformToGLValue(expr) ) } @@ -332,6 +408,8 @@ predicate hasTranslatedLoad(Expr expr) { needsLoadForParentExpr(expr) or isPRValueFieldAccessWithImplicitLoad(expr) + or + isInheritanceConversionWithImplicitLoad(expr) ) and not ignoreExpr(expr) and not isNativeCondition(expr) and @@ -344,7 +422,7 @@ predicate hasTranslatedLoad(Expr expr) { */ predicate hasTranslatedSyntheticTemporaryObject(Expr expr) { not ignoreExpr(expr) and - isClassPRValueForMemberAccessQualifier(expr) and + mustTransformToGLValue(expr) and // If it's a load, we'll just ignore the load in `ignoreLoad()`. not expr.hasLValueToRValueConversion() } diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll index 25695da4a592..a9f408bf161e 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll @@ -108,6 +108,10 @@ abstract class TranslatedCoreExpr extends TranslatedExpr { // If this TranslatedExpr doesn't produce the result, then it must represent // a glvalue that is then loaded by a TranslatedLoad. hasTranslatedLoad(expr) + or + // The expression should be treated as a glvalue because its operand was forced to be a glvalue, + // such as for the qualifier of a member access. + isPRValueConversionOnGLValue(expr) } final override predicate producesExprResult() { @@ -1072,14 +1076,6 @@ class TranslatedSimpleConversion extends TranslatedSingleInstructionConversion { } override Opcode getOpcode() { result instanceof Opcode::Convert } - - override predicate isResultGLValue() { - super.isResultGLValue() - or - // If this is a prvalue adjustment, the result is a treated as a glvalue if the source was also - // treated as a glvalue. See the comment in `ignoreLoad()` for more details. - expr instanceof PrvalueAdjustmentConversion and ignoreLoad(expr.getExpr()) - } } /** diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/test_diff.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/test_diff.expected index 5b3a0e755088..04e34ad845c9 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/test_diff.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/test_diff.expected @@ -106,8 +106,8 @@ | string.cpp:363:11:363:16 | string.cpp:358:18:358:23 | AST only | | string.cpp:382:8:382:14 | string.cpp:374:18:374:23 | IR only | | string.cpp:383:13:383:15 | string.cpp:374:18:374:23 | IR only | -| string.cpp:396:8:396:8 | string.cpp:389:18:389:23 | AST only | -| string.cpp:397:8:397:8 | string.cpp:389:18:389:23 | AST only | +| string.cpp:396:8:396:15 | string.cpp:389:18:389:23 | IR only | +| string.cpp:397:8:397:15 | string.cpp:389:18:389:23 | IR only | | string.cpp:399:8:399:8 | string.cpp:389:18:389:23 | AST only | | string.cpp:401:8:401:8 | string.cpp:389:18:389:23 | AST only | | string.cpp:404:8:404:11 | string.cpp:389:18:389:23 | IR only | diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected index b6621bedc700..8b74d7fecc8b 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected @@ -362,6 +362,10 @@ | string.cpp:382:8:382:14 | (reference dereference) | string.cpp:374:18:374:23 | call to source | | string.cpp:383:13:383:13 | call to operator[] | string.cpp:374:18:374:23 | call to source | | string.cpp:383:13:383:15 | (reference dereference) | string.cpp:374:18:374:23 | call to source | +| string.cpp:396:8:396:8 | call to operator* | string.cpp:389:18:389:23 | call to source | +| string.cpp:396:8:396:15 | (reference dereference) | string.cpp:389:18:389:23 | call to source | +| string.cpp:397:8:397:8 | call to operator* | string.cpp:389:18:389:23 | call to source | +| string.cpp:397:8:397:15 | (reference dereference) | string.cpp:389:18:389:23 | call to source | | string.cpp:404:8:404:8 | call to operator* | string.cpp:389:18:389:23 | call to source | | string.cpp:404:8:404:11 | (reference dereference) | string.cpp:389:18:389:23 | call to source | | string.cpp:407:8:407:8 | call to operator* | string.cpp:389:18:389:23 | call to source | diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index cad0619a71d4..79100eb8be6e 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -10650,6 +10650,10 @@ ir.cpp: # 1360| params: # 1360| 0: [Parameter] v # 1360| Type = [Class] destructor_only +# 1363| [FunctionTemplateInstantiation,TopLevelFunction] POD_Derived returnValue() +# 1363| params: +# 1363| [FunctionTemplateInstantiation,TopLevelFunction] POD_Middle returnValue() +# 1363| params: # 1363| [FunctionTemplateInstantiation,TopLevelFunction] Point returnValue() # 1363| params: # 1363| [FunctionTemplateInstantiation,TopLevelFunction] String returnValue() @@ -11161,6 +11165,114 @@ ir.cpp: # 1426| Value = [Literal] 5 # 1426| ValueCategory = prvalue # 1427| 4: [ReturnStmt] return ... +# 1429| [CopyAssignmentOperator] POD_Base& POD_Base::operator=(POD_Base const&) +# 1429| params: +#-----| 0: [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const POD_Base & +# 1429| [MoveAssignmentOperator] POD_Base& POD_Base::operator=(POD_Base&&) +# 1429| params: +#-----| 0: [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] POD_Base && +# 1432| [ConstMemberFunction] float POD_Base::f() const +# 1432| params: +# 1435| [CopyAssignmentOperator] POD_Middle& POD_Middle::operator=(POD_Middle const&) +# 1435| params: +#-----| 0: [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const POD_Middle & +# 1435| [MoveAssignmentOperator] POD_Middle& POD_Middle::operator=(POD_Middle&&) +# 1435| params: +#-----| 0: [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] POD_Middle && +# 1435| [Constructor] void POD_Middle::POD_Middle() +# 1435| params: +# 1439| [CopyAssignmentOperator] POD_Derived& POD_Derived::operator=(POD_Derived const&) +# 1439| params: +#-----| 0: [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const POD_Derived & +# 1439| [MoveAssignmentOperator] POD_Derived& POD_Derived::operator=(POD_Derived&&) +# 1439| params: +#-----| 0: [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] POD_Derived && +# 1439| [Constructor] void POD_Derived::POD_Derived() +# 1439| params: +# 1443| [TopLevelFunction] void temporary_hierarchy() +# 1443| params: +# 1443| body: [BlockStmt] { ... } +# 1444| 0: [DeclStmt] declaration +# 1444| 0: [VariableDeclarationEntry] definition of b +# 1444| Type = [Struct] POD_Base +# 1444| init: [Initializer] initializer for b +# 1444| expr: [CStyleCast] (POD_Base)... +# 1444| Conversion = [BaseClassConversion] base class conversion +# 1444| Type = [Struct] POD_Base +# 1444| ValueCategory = prvalue +# 1444| expr: [FunctionCall] call to returnValue +# 1444| Type = [Struct] POD_Middle +# 1444| ValueCategory = prvalue +# 1445| 1: [ExprStmt] ExprStmt +# 1445| 0: [AssignExpr] ... = ... +# 1445| Type = [Struct] POD_Base +# 1445| ValueCategory = lvalue +# 1445| 0: [VariableAccess] b +# 1445| Type = [Struct] POD_Base +# 1445| ValueCategory = lvalue +# 1445| 1: [CStyleCast] (POD_Base)... +# 1445| Conversion = [BaseClassConversion] base class conversion +# 1445| Type = [Struct] POD_Base +# 1445| ValueCategory = prvalue(load) +# 1445| expr: [CStyleCast] (POD_Middle)... +# 1445| Conversion = [BaseClassConversion] base class conversion +# 1445| Type = [Struct] POD_Middle +# 1445| ValueCategory = lvalue +# 1445| expr: [TemporaryObjectExpr] temporary object +# 1445| Type = [Struct] POD_Derived +# 1445| ValueCategory = lvalue +# 1445| expr: [ParenthesisExpr] (...) +# 1445| Type = [Struct] POD_Derived +# 1445| ValueCategory = prvalue +# 1445| expr: [FunctionCall] call to returnValue +# 1445| Type = [Struct] POD_Derived +# 1445| ValueCategory = prvalue +# 1446| 2: [DeclStmt] declaration +# 1446| 0: [VariableDeclarationEntry] definition of x +# 1446| Type = [IntType] int +# 1446| init: [Initializer] initializer for x +# 1446| expr: [ValueFieldAccess] x +# 1446| Type = [IntType] int +# 1446| ValueCategory = prvalue +# 1446| -1: [CStyleCast] (POD_Base)... +# 1446| Conversion = [BaseClassConversion] base class conversion +# 1446| Type = [Struct] POD_Base +# 1446| ValueCategory = prvalue +# 1446| expr: [CStyleCast] (POD_Middle)... +# 1446| Conversion = [BaseClassConversion] base class conversion +# 1446| Type = [Struct] POD_Middle +# 1446| ValueCategory = prvalue +# 1446| expr: [FunctionCall] call to returnValue +# 1446| Type = [Struct] POD_Derived +# 1446| ValueCategory = prvalue +# 1447| 3: [DeclStmt] declaration +# 1447| 0: [VariableDeclarationEntry] definition of f +# 1447| Type = [FloatType] float +# 1447| init: [Initializer] initializer for f +# 1447| expr: [FunctionCall] call to f +# 1447| Type = [FloatType] float +# 1447| ValueCategory = prvalue +# 1447| -1: [CStyleCast] (const POD_Base)... +# 1447| Conversion = [BaseClassConversion] base class conversion +# 1447| Type = [SpecifiedType] const POD_Base +# 1447| ValueCategory = prvalue +# 1447| expr: [CStyleCast] (POD_Middle)... +# 1447| Conversion = [BaseClassConversion] base class conversion +# 1447| Type = [Struct] POD_Middle +# 1447| ValueCategory = prvalue +# 1447| expr: [ParenthesisExpr] (...) +# 1447| Type = [Struct] POD_Derived +# 1447| ValueCategory = prvalue +# 1447| expr: [FunctionCall] call to returnValue +# 1447| Type = [Struct] POD_Derived +# 1447| ValueCategory = prvalue +# 1448| 4: [ReturnStmt] return ... perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| params: diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index 2afe0f64b00b..4b96d225958a 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -1426,4 +1426,25 @@ void temporary_unusual_fields() { float f = returnValue().a[5]; } +struct POD_Base { + int x; + + float f() const; +}; + +struct POD_Middle : POD_Base { + int y; +}; + +struct POD_Derived : POD_Middle { + int z; +}; + +void temporary_hierarchy() { + POD_Base b = returnValue(); + b = (returnValue()); // Multiple conversions plus parens + int x = returnValue().x; + float f = (returnValue()).f(); +} + // semmle-extractor-options: -std=c++17 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index cefba3ffa8fd..3dd07f115360 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -7867,6 +7867,60 @@ ir.cpp: # 1421| v1421_5(void) = AliasedUse : ~m? # 1421| v1421_6(void) = ExitFunction : +# 1443| void temporary_hierarchy() +# 1443| Block 0 +# 1443| v1443_1(void) = EnterFunction : +# 1443| mu1443_2(unknown) = AliasedDefinition : +# 1443| mu1443_3(unknown) = InitializeNonLocal : +# 1444| r1444_1(glval) = VariableAddress[b] : +# 1444| r1444_2(glval) = FunctionAddress[returnValue] : +# 1444| r1444_3(POD_Middle) = Call[returnValue] : func:r1444_2 +# 1444| mu1444_4(unknown) = ^CallSideEffect : ~m? +# 1444| r1444_5(glval) = VariableAddress[#temp1444:18] : +# 1444| mu1444_6(POD_Middle) = Store[#temp1444:18] : &:r1444_5, r1444_3 +# 1444| r1444_7(glval) = ConvertToNonVirtualBase[POD_Middle : POD_Base] : r1444_5 +# 1444| r1444_8(POD_Base) = Load[?] : &:r1444_7, ~m? +# 1444| mu1444_9(POD_Base) = Store[b] : &:r1444_1, r1444_8 +# 1445| r1445_1(glval) = VariableAddress[#temp1445:9] : +# 1445| r1445_2(glval) = FunctionAddress[returnValue] : +# 1445| r1445_3(POD_Derived) = Call[returnValue] : func:r1445_2 +# 1445| mu1445_4(unknown) = ^CallSideEffect : ~m? +# 1445| mu1445_5(POD_Derived) = Store[#temp1445:9] : &:r1445_1, r1445_3 +# 1445| r1445_6(glval) = ConvertToNonVirtualBase[POD_Derived : POD_Middle] : r1445_1 +# 1445| r1445_7(glval) = ConvertToNonVirtualBase[POD_Middle : POD_Base] : r1445_6 +# 1445| r1445_8(POD_Base) = Load[?] : &:r1445_7, ~m? +# 1445| r1445_9(glval) = VariableAddress[b] : +# 1445| mu1445_10(POD_Base) = Store[b] : &:r1445_9, r1445_8 +# 1446| r1446_1(glval) = VariableAddress[x] : +# 1446| r1446_2(glval) = FunctionAddress[returnValue] : +# 1446| r1446_3(POD_Derived) = Call[returnValue] : func:r1446_2 +# 1446| mu1446_4(unknown) = ^CallSideEffect : ~m? +# 1446| r1446_5(glval) = VariableAddress[#temp1446:13] : +# 1446| mu1446_6(POD_Derived) = Store[#temp1446:13] : &:r1446_5, r1446_3 +# 1446| r1446_7(glval) = ConvertToNonVirtualBase[POD_Derived : POD_Middle] : r1446_5 +# 1446| r1446_8(glval) = ConvertToNonVirtualBase[POD_Middle : POD_Base] : r1446_7 +# 1446| r1446_9(glval) = FieldAddress[x] : r1446_8 +# 1446| r1446_10(int) = Load[?] : &:r1446_9, ~m? +# 1446| mu1446_11(int) = Store[x] : &:r1446_1, r1446_10 +# 1447| r1447_1(glval) = VariableAddress[f] : +# 1447| r1447_2(glval) = FunctionAddress[returnValue] : +# 1447| r1447_3(POD_Derived) = Call[returnValue] : func:r1447_2 +# 1447| mu1447_4(unknown) = ^CallSideEffect : ~m? +# 1447| r1447_5(glval) = VariableAddress[#temp1447:16] : +# 1447| mu1447_6(POD_Derived) = Store[#temp1447:16] : &:r1447_5, r1447_3 +# 1447| r1447_7(glval) = ConvertToNonVirtualBase[POD_Derived : POD_Middle] : r1447_5 +# 1447| r1447_8(glval) = ConvertToNonVirtualBase[POD_Middle : POD_Base] : r1447_7 +# 1447| r1447_9(glval) = FunctionAddress[f] : +# 1447| r1447_10(float) = Call[f] : func:r1447_9, this:r1447_8 +# 1447| mu1447_11(unknown) = ^CallSideEffect : ~m? +# 1447| v1447_12(void) = ^BufferReadSideEffect[-1] : &:r1447_8, ~m? +# 1447| mu1447_13(POD_Base) = ^IndirectMayWriteSideEffect[-1] : &:r1447_8 +# 1447| mu1447_14(float) = Store[f] : &:r1447_1, r1447_10 +# 1448| v1448_1(void) = NoOp : +# 1443| v1443_4(void) = ReturnVoid : +# 1443| v1443_5(void) = AliasedUse : ~m? +# 1443| v1443_6(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 From 35abcae5d38579cc466178a5110b07ba248d082f Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Fri, 23 Oct 2020 13:43:29 -0400 Subject: [PATCH 43/53] Fix formatting --- cpp/ql/src/semmle/code/cpp/models/implementations/StdPair.qll | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/StdPair.qll b/cpp/ql/src/semmle/code/cpp/models/implementations/StdPair.qll index 0f2e37ec2db5..a2adb88a9a3c 100644 --- a/cpp/ql/src/semmle/code/cpp/models/implementations/StdPair.qll +++ b/cpp/ql/src/semmle/code/cpp/models/implementations/StdPair.qll @@ -20,8 +20,7 @@ class StdPairCopyishConstructor extends Constructor, TaintFunction { StdPairCopyishConstructor() { this.getDeclaringType() instanceof StdPairClass and this.getNumberOfParameters() = 1 and - this.getParameter(0).getUnspecifiedType().(ReferenceType).getBaseType() - instanceof StdPairClass + this.getParameter(0).getUnspecifiedType().(ReferenceType).getBaseType() instanceof StdPairClass } override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { From 1e96404ee06e0b8c4bb0e38dedd8930fb20becd9 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Fri, 23 Oct 2020 13:46:27 -0400 Subject: [PATCH 44/53] Revert bad changes to `basic_string` --- .../dataflow/DefaultTaintTracking/stl.cpp | 8 +- .../DefaultTaintTracking/tainted.expected | 133 +++++++++--------- 2 files changed, 66 insertions(+), 75 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/stl.cpp b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/stl.cpp index c971a1bd87b0..3454e6ac9472 100644 --- a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/stl.cpp +++ b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/stl.cpp @@ -16,15 +16,9 @@ namespace std template, class Allocator = allocator > class basic_string { - private: - const char* p; - public: explicit basic_string(const Allocator& a = Allocator()); - basic_string(const charT* s, const Allocator& a = Allocator()) : - p(s) - { - } + basic_string(const charT* s, const Allocator& a = Allocator()); const charT* c_str() const; }; diff --git a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/tainted.expected b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/tainted.expected index d7ece0605812..52d87bb82792 100644 --- a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/tainted.expected +++ b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/tainted.expected @@ -90,7 +90,6 @@ | defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:8:88:32 | (reference dereference) | | defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:18:88:23 | call to getenv | | defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:18:88:30 | (reference to) | -| defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:18:88:30 | temporary object | | defaulttainttracking.cpp:88:18:88:23 | call to getenv | shared.h:5:23:5:31 | sinkparam | | defaulttainttracking.cpp:97:27:97:32 | call to getenv | defaulttainttracking.cpp:91:42:91:44 | arg | | defaulttainttracking.cpp:97:27:97:32 | call to getenv | defaulttainttracking.cpp:92:12:92:14 | arg | @@ -173,73 +172,71 @@ | globals.cpp:13:15:13:20 | call to getenv | globals.cpp:13:15:13:20 | call to getenv | | globals.cpp:23:15:23:20 | call to getenv | globals.cpp:16:15:16:21 | global2 | | globals.cpp:23:15:23:20 | call to getenv | globals.cpp:23:15:23:20 | call to getenv | -| stl.cpp:68:25:68:30 | call to getenv | shared.h:5:23:5:31 | sinkparam | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:24:29:24:29 | s | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:25:6:25:6 | s | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:49:78:49:104 | (unnamed parameter 0) | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:49:114:49:118 | (unnamed parameter 1) | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:68:25:68:30 | call to getenv | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:70:36:70:36 | s | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:74:8:74:8 | a | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:74:12:74:17 | call to source | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:76:16:76:21 | call to source | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:76:16:76:23 | (const char *)... | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:76:16:76:24 | call to basic_string | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:78:7:78:7 | (const char *)... | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:78:7:78:7 | a | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:88:16:88:21 | call to source | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:88:16:88:23 | (const char *)... | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:88:16:88:24 | call to basic_string | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:91:6:91:6 | call to operator<< | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:91:6:91:17 | (reference dereference) | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:91:9:91:14 | call to source | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:91:9:91:16 | (const char *)... | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:92:15:92:15 | call to operator<< | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:92:15:92:26 | (reference dereference) | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:92:18:92:23 | call to source | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:92:18:92:25 | (const char *)... | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:6:93:6 | call to operator<< | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:6:93:19 | (reference dereference) | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:6:93:19 | (reference to) | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:9:93:14 | call to source | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:9:93:16 | (const char *)... | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:18:93:18 | call to operator<< | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:18:93:26 | (reference dereference) | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:97:7:97:9 | (const stringstream)... | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:97:7:97:9 | (reference to) | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:97:7:97:9 | ss2 | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:99:7:99:9 | (const stringstream)... | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:99:7:99:9 | (reference to) | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:99:7:99:9 | ss4 | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:102:7:102:9 | (const basic_stringstream, allocator>)... | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:102:7:102:9 | ss2 | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:104:7:104:9 | (const basic_stringstream, allocator>)... | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:104:7:104:9 | ss4 | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:124:10:124:15 | call to source | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:131:16:131:28 | call to basic_string | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:131:17:131:26 | call to user_input | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:131:17:131:28 | (const char *)... | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:134:9:134:13 | path2 | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:135:10:135:19 | call to user_input | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:135:10:135:21 | (const char *)... | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:135:10:135:21 | call to basic_string | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:135:10:135:21 | temporary object | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:136:7:136:11 | (const basic_string, allocator>)... | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:136:7:136:11 | path2 | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:138:15:138:24 | call to user_input | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:138:15:138:26 | (const char *)... | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:138:15:138:27 | call to basic_string | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:144:14:144:15 | cs | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:144:19:144:24 | call to source | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:144:19:144:26 | (const char *)... | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:147:17:147:18 | cs | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:147:17:147:19 | call to basic_string | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:149:7:149:8 | cs | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:155:14:155:15 | cs | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:155:19:155:24 | call to source | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:155:19:155:26 | (const char *)... | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:158:17:158:18 | cs | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:158:17:158:19 | call to basic_string | +| stl.cpp:62:25:62:30 | call to getenv | shared.h:5:23:5:31 | sinkparam | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:21:29:21:29 | s | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:43:78:43:104 | (unnamed parameter 0) | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:43:114:43:118 | (unnamed parameter 1) | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:62:25:62:30 | call to getenv | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:64:36:64:36 | s | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:68:8:68:8 | a | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:68:12:68:17 | call to source | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:70:16:70:21 | call to source | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:70:16:70:23 | (const char *)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:70:16:70:24 | call to basic_string | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:72:7:72:7 | (const char *)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:72:7:72:7 | a | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:82:16:82:21 | call to source | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:82:16:82:23 | (const char *)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:82:16:82:24 | call to basic_string | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:85:6:85:6 | call to operator<< | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:85:6:85:17 | (reference dereference) | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:85:9:85:14 | call to source | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:85:9:85:16 | (const char *)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:86:15:86:15 | call to operator<< | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:86:15:86:26 | (reference dereference) | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:86:18:86:23 | call to source | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:86:18:86:25 | (const char *)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:6:87:6 | call to operator<< | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:6:87:19 | (reference dereference) | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:6:87:19 | (reference to) | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:9:87:14 | call to source | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:9:87:16 | (const char *)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:18:87:18 | call to operator<< | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:18:87:26 | (reference dereference) | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | (const stringstream)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | (reference to) | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | ss2 | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | (const stringstream)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | (reference to) | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | ss4 | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:96:7:96:9 | (const basic_stringstream, allocator>)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:96:7:96:9 | ss2 | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:98:7:98:9 | (const basic_stringstream, allocator>)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:98:7:98:9 | ss4 | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:118:10:118:15 | call to source | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:125:16:125:28 | call to basic_string | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:125:17:125:26 | call to user_input | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:125:17:125:28 | (const char *)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:128:9:128:13 | path2 | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:19 | call to user_input | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | (const char *)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | call to basic_string | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:130:7:130:11 | (const basic_string, allocator>)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:130:7:130:11 | path2 | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:132:15:132:24 | call to user_input | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:132:15:132:26 | (const char *)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:132:15:132:27 | call to basic_string | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:138:14:138:15 | cs | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:138:19:138:24 | call to source | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:138:19:138:26 | (const char *)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:141:17:141:18 | cs | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:141:17:141:19 | call to basic_string | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:143:7:143:8 | cs | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:149:14:149:15 | cs | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:149:19:149:24 | call to source | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:149:19:149:26 | (const char *)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:152:17:152:18 | cs | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:152:17:152:19 | call to basic_string | | test_diff.cpp:92:10:92:13 | argv | shared.h:5:23:5:31 | sinkparam | | test_diff.cpp:92:10:92:13 | argv | test_diff.cpp:92:10:92:13 | argv | | test_diff.cpp:92:10:92:13 | argv | test_diff.cpp:92:10:92:16 | (const char *)... | From 4d2f658ece18215d6155c9f12b2f3031be6eb434 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Fri, 23 Oct 2020 17:44:07 -0400 Subject: [PATCH 45/53] Don't treat allocator argument as a string input --- .../cpp/models/implementations/StdString.qll | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/StdString.qll b/cpp/ql/src/semmle/code/cpp/models/implementations/StdString.qll index b8a000b963ea..d2b52a65058e 100644 --- a/cpp/ql/src/semmle/code/cpp/models/implementations/StdString.qll +++ b/cpp/ql/src/semmle/code/cpp/models/implementations/StdString.qll @@ -30,10 +30,19 @@ class StdStringConstructor extends Constructor, TaintFunction { * character). */ int getAStringParameterIndex() { - getParameter(result).getType() instanceof PointerType or // e.g. `std::basic_string::CharT *` - getParameter(result).getType() instanceof ReferenceType or // e.g. `std::basic_string &` - getParameter(result).getUnspecifiedType() = - getDeclaringType().getTemplateArgument(0).(Type).getUnspecifiedType() // i.e. `std::basic_string::CharT` + exists(Type paramType | paramType = getParameter(result).getUnspecifiedType() | + // e.g. `std::basic_string::CharT *` + paramType instanceof PointerType + or + // e.g. `std::basic_string &`, avoiding `const Allocator&` + paramType instanceof ReferenceType and + not paramType.(ReferenceType).getBaseType() = + getDeclaringType().getTemplateArgument(2).(Type).getUnspecifiedType() + or + // i.e. `std::basic_string::CharT` + getParameter(result).getUnspecifiedType() = + getDeclaringType().getTemplateArgument(0).(Type).getUnspecifiedType() + ) } /** From 86668058dccf8620ed57af40b2abbb2aadfa4da5 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Fri, 23 Oct 2020 17:45:01 -0400 Subject: [PATCH 46/53] Avoid ODR violation in test code --- .../dataflow/DefaultTaintTracking/defaulttainttracking.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/defaulttainttracking.cpp b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/defaulttainttracking.cpp index cd8b0daf6f30..7df2f4fed970 100644 --- a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/defaulttainttracking.cpp +++ b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/defaulttainttracking.cpp @@ -9,7 +9,7 @@ -int main(int argc, char *argv[]) { +int main() { From 3fce971f2dd2d59ba58a258ed6ae0e0e236f00c1 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Fri, 23 Oct 2020 17:48:37 -0400 Subject: [PATCH 47/53] Fix taint propagation to qualifier objects and update test expectations --- .../cpp/ir/dataflow/DefaultTaintTracking.qll | 106 +++++++++++------- .../dataflow/DefaultTaintTracking/stl.cpp | 16 +-- .../DefaultTaintTracking/tainted.expected | 31 +++++ .../DefaultTaintTracking/test_diff.expected | 101 +++++++++++------ 4 files changed, 171 insertions(+), 83 deletions(-) diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/DefaultTaintTracking.qll b/cpp/ql/src/semmle/code/cpp/ir/dataflow/DefaultTaintTracking.qll index d735c8422480..5129078545c2 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/dataflow/DefaultTaintTracking.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/dataflow/DefaultTaintTracking.qll @@ -83,7 +83,7 @@ private class DefaultTaintTrackingCfg extends DataFlow::Configuration { override predicate isSink(DataFlow::Node sink) { exists(adjustedSink(sink)) } override predicate isAdditionalFlowStep(DataFlow::Node n1, DataFlow::Node n2) { - instructionTaintStep(n1.asInstruction(), n2.asInstruction()) + commonTaintStep(n1, n2) } override predicate isBarrier(DataFlow::Node node) { nodeIsBarrier(node) } @@ -101,7 +101,7 @@ private class ToGlobalVarTaintTrackingCfg extends DataFlow::Configuration { } override predicate isAdditionalFlowStep(DataFlow::Node n1, DataFlow::Node n2) { - instructionTaintStep(n1.asInstruction(), n2.asInstruction()) + commonTaintStep(n1, n2) or writesVariable(n1.asInstruction(), n2.asVariable().(GlobalOrNamespaceVariable)) or @@ -125,7 +125,7 @@ private class FromGlobalVarTaintTrackingCfg extends DataFlow2::Configuration { override predicate isSink(DataFlow::Node sink) { exists(adjustedSink(sink)) } override predicate isAdditionalFlowStep(DataFlow::Node n1, DataFlow::Node n2) { - instructionTaintStep(n1.asInstruction(), n2.asInstruction()) + commonTaintStep(n1, n2) or // Additional step for flow out of variables. There is no flow _into_ // variables in this configuration, so this step only serves to take flow @@ -215,19 +215,62 @@ private predicate nodeIsBarrierIn(DataFlow::Node node) { } cached -private predicate instructionTaintStep(Instruction i1, Instruction i2) { +private predicate commonTaintStep(DataFlow::Node fromNode, DataFlow::Node toNode) { + instructionToInstructionTaintStep(fromNode.asInstruction(), toNode.asInstruction()) + or + operandToInstructionTaintStep(fromNode.asOperand(), toNode.asInstruction()) + or + operandToOperandTaintStep(fromNode.asOperand(), toNode.asOperand()) +} + +private predicate operandToOperandTaintStep(Operand fromOperand, Operand toOperand) { + exists(ReadSideEffectInstruction readInstr | + fromOperand = readInstr.getArgumentOperand() and + toOperand = readInstr.getSideEffectOperand() + ) +} + +private predicate operandToInstructionTaintStep(Operand fromOperand, Instruction toInstr) { // Expressions computed from tainted data are also tainted - exists(CallInstruction call, int argIndex | call = i2 | + exists(CallInstruction call, int argIndex | call = toInstr | isPureFunction(call.getStaticCallTarget().getName()) and - i1 = getACallArgumentOrIndirection(call, argIndex) and - forall(Instruction arg | arg = call.getAnArgument() | - arg = getACallArgumentOrIndirection(call, argIndex) or predictableInstruction(arg) + fromOperand = getACallArgumentOrIndirection(call, argIndex) and + forall(Operand argOperand | argOperand = call.getAnArgumentOperand() | + argOperand = getACallArgumentOrIndirection(call, argIndex) or + predictableInstruction(argOperand.getAnyDef()) ) and // flow through `strlen` tends to cause dubious results, if the length is // bounded. not call.getStaticCallTarget().getName() = "strlen" ) or + // Flow from argument to return value + toInstr = + any(CallInstruction call | + exists(int indexIn | + modelTaintToReturnValue(call.getStaticCallTarget(), indexIn) and + fromOperand = getACallArgumentOrIndirection(call, indexIn) and + not predictableOnlyFlow(call.getStaticCallTarget().getName()) + ) + ) + or + // Flow from input argument to output argument + // TODO: This won't work in practice as long as all aliased memory is tracked + // together in a single virtual variable. + // TODO: Will this work on the test for `TaintedPath.ql`, where the output arg + // is a pointer addition expression? + toInstr = + any(WriteSideEffectInstruction outInstr | + exists(CallInstruction call, int indexIn, int indexOut | + modelTaintToParameter(call.getStaticCallTarget(), indexIn, indexOut) and + fromOperand = getACallArgumentOrIndirection(call, indexIn) and + outInstr.getIndex() = indexOut and + outInstr.getPrimaryInstruction() = call + ) + ) +} + +private predicate instructionToInstructionTaintStep(Instruction i1, Instruction i2) { // Flow through pointer dereference i2.(LoadInstruction).getSourceAddress() = i1 or @@ -291,31 +334,6 @@ private predicate instructionTaintStep(Instruction i1, Instruction i2) { read.getAnOperand().(SideEffectOperand).getAnyDef() = i1 and read.getArgumentDef() = i2 ) - or - // Flow from argument to return value - i2 = - any(CallInstruction call | - exists(int indexIn | - modelTaintToReturnValue(call.getStaticCallTarget(), indexIn) and - i1 = getACallArgumentOrIndirection(call, indexIn) and - not predictableOnlyFlow(call.getStaticCallTarget().getName()) - ) - ) - or - // Flow from input argument to output argument - // TODO: This won't work in practice as long as all aliased memory is tracked - // together in a single virtual variable. - // TODO: Will this work on the test for `TaintedPath.ql`, where the output arg - // is a pointer addition expression? - i2 = - any(WriteSideEffectInstruction outNode | - exists(CallInstruction call, int indexIn, int indexOut | - modelTaintToParameter(call.getStaticCallTarget(), indexIn, indexOut) and - i1 = getACallArgumentOrIndirection(call, indexIn) and - outNode.getIndex() = indexOut and - outNode.getPrimaryInstruction() = call - ) - ) } pragma[noinline] @@ -331,15 +349,25 @@ private InitializeParameterInstruction getInitializeParameter(IRFunction f, Para } /** - * Get an instruction that goes into argument `argumentIndex` of `call`. This + * Returns the index of the side effect instruction corresponding to the specified function output, + * if one exists. + */ +private int getWriteSideEffectIndex(FunctionOutput output) { + output.isParameterDeref(result) + or + output.isQualifierObject() and result = -1 +} + +/** + * Get an operand that goes into argument `argumentIndex` of `call`. This * can be either directly or through one pointer indirection. */ -private Instruction getACallArgumentOrIndirection(CallInstruction call, int argumentIndex) { - result = call.getPositionalArgument(argumentIndex) +private Operand getACallArgumentOrIndirection(CallInstruction call, int argumentIndex) { + result = call.getPositionalArgumentOperand(argumentIndex) or exists(ReadSideEffectInstruction readSE | // TODO: why are read side effect operands imprecise? - result = readSE.getSideEffectOperand().getAnyDef() and + result = readSE.getSideEffectOperand() and readSE.getPrimaryInstruction() = call and readSE.getIndex() = argumentIndex ) @@ -353,7 +381,7 @@ private predicate modelTaintToParameter(Function f, int parameterIn, int paramet f.(TaintFunction).hasTaintFlow(modelIn, modelOut) ) and (modelIn.isParameter(parameterIn) or modelIn.isParameterDeref(parameterIn)) and - modelOut.isParameterDeref(parameterOut) + parameterOut = getWriteSideEffectIndex(modelOut) ) } @@ -542,7 +570,7 @@ module TaintedWithPath { } override predicate isAdditionalFlowStep(DataFlow::Node n1, DataFlow::Node n2) { - instructionTaintStep(n1.asInstruction(), n2.asInstruction()) + commonTaintStep(n1, n2) or exists(TaintTrackingConfiguration cfg | cfg.taintThroughGlobals() | writesVariable(n1.asInstruction(), n2.asVariable().(GlobalOrNamespaceVariable)) diff --git a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/stl.cpp b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/stl.cpp index 3454e6ac9472..ae5d2941f258 100644 --- a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/stl.cpp +++ b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/stl.cpp @@ -71,9 +71,9 @@ void test_string() sink(a); // tainted sink(b); - sink(c); // tainted [NOT DETECTED] + sink(c); // tainted sink(b.c_str()); - sink(c.c_str()); // tainted [NOT DETECTED] + sink(c.c_str()); // tainted } void test_stringstream() @@ -91,12 +91,12 @@ void test_stringstream() sink(ss2); // tainted sink(ss3); // tainted [NOT DETECTED] sink(ss4); // tainted - sink(ss5); // tainted [NOT DETECTED] + sink(ss5); // tainted sink(ss1.str()); sink(ss2.str()); // tainted sink(ss3.str()); // tainted [NOT DETECTED] sink(ss4.str()); // tainted - sink(ss5.str()); // tainted [NOT DETECTED] + sink(ss5.str()); // tainted } void test_stringstream_int(int source) @@ -123,14 +123,14 @@ void sink(const char *filename, const char *mode); void test_strings2() { string path1 = user_input(); - sink(path1.c_str(), "r"); // tainted [NOT DETECTED] + sink(path1.c_str(), "r"); // tainted string path2; path2 = user_input(); sink(path2.c_str(), "r"); // tainted string path3(user_input()); - sink(path3.c_str(), "r"); // tainted [NOT DETECTED] + sink(path3.c_str(), "r"); // tainted } void test_string3() @@ -141,7 +141,7 @@ void test_string3() std::string ss(cs); sink(cs); // tainted - sink(ss); // tainted [NOT DETECTED] + sink(ss); // tainted } void test_string4() @@ -155,5 +155,5 @@ void test_string4() cs = ss.c_str(); sink(cs); // tainted [NOT DETECTED] - sink(ss); // tainted [NOT DETECTED] + sink(ss); // tainted } diff --git a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/tainted.expected b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/tainted.expected index 52d87bb82792..092c4ee284d7 100644 --- a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/tainted.expected +++ b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/tainted.expected @@ -90,6 +90,7 @@ | defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:8:88:32 | (reference dereference) | | defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:18:88:23 | call to getenv | | defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:18:88:30 | (reference to) | +| defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:18:88:30 | temporary object | | defaulttainttracking.cpp:88:18:88:23 | call to getenv | shared.h:5:23:5:31 | sinkparam | | defaulttainttracking.cpp:97:27:97:32 | call to getenv | defaulttainttracking.cpp:91:42:91:44 | arg | | defaulttainttracking.cpp:97:27:97:32 | call to getenv | defaulttainttracking.cpp:92:12:92:14 | arg | @@ -176,7 +177,9 @@ | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:21:29:21:29 | s | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:43:78:43:104 | (unnamed parameter 0) | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:43:114:43:118 | (unnamed parameter 1) | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:44:176:44:178 | str | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:62:25:62:30 | call to getenv | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:63:30:63:30 | s | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:64:36:64:36 | s | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:68:8:68:8 | a | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:68:12:68:17 | call to source | @@ -185,6 +188,11 @@ | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:70:16:70:24 | call to basic_string | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:72:7:72:7 | (const char *)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:72:7:72:7 | a | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:74:7:74:7 | (const string)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:74:7:74:7 | (reference to) | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:74:7:74:7 | c | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:76:7:76:7 | (const basic_string, allocator>)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:76:7:76:7 | c | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:82:16:82:21 | call to source | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:82:16:82:23 | (const char *)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:82:16:82:24 | call to basic_string | @@ -203,40 +211,63 @@ | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:9:87:16 | (const char *)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:18:87:18 | call to operator<< | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:18:87:26 | (reference dereference) | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:6:88:6 | call to operator<< | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:6:88:10 | (reference dereference) | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:9:88:9 | (const basic_string, allocator>)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:9:88:9 | (reference to) | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:9:88:9 | t | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | (const stringstream)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | (reference to) | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | ss2 | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | (const stringstream)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | (reference to) | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | ss4 | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:94:7:94:9 | (const stringstream)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:94:7:94:9 | (reference to) | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:94:7:94:9 | ss5 | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:96:7:96:9 | (const basic_stringstream, allocator>)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:96:7:96:9 | ss2 | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:98:7:98:9 | (const basic_stringstream, allocator>)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:98:7:98:9 | ss4 | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:99:7:99:9 | (const basic_stringstream, allocator>)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:99:7:99:9 | ss5 | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:118:10:118:15 | call to source | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:125:16:125:28 | call to basic_string | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:125:17:125:26 | call to user_input | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:125:17:125:28 | (const char *)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:126:7:126:11 | (const basic_string, allocator>)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:126:7:126:11 | path1 | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:128:9:128:13 | path2 | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:19 | call to user_input | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | (const char *)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | call to basic_string | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | temporary object | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:130:7:130:11 | (const basic_string, allocator>)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:130:7:130:11 | path2 | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:132:15:132:24 | call to user_input | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:132:15:132:26 | (const char *)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:132:15:132:27 | call to basic_string | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:133:7:133:11 | (const basic_string, allocator>)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:133:7:133:11 | path3 | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:138:14:138:15 | cs | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:138:19:138:24 | call to source | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:138:19:138:26 | (const char *)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:141:17:141:18 | cs | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:141:17:141:19 | call to basic_string | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:143:7:143:8 | cs | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:144:7:144:8 | (const string)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:144:7:144:8 | (reference to) | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:144:7:144:8 | ss | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:149:14:149:15 | cs | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:149:19:149:24 | call to source | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:149:19:149:26 | (const char *)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:152:17:152:18 | cs | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:152:17:152:19 | call to basic_string | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:155:7:155:8 | (const basic_string, allocator>)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:155:7:155:8 | ss | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:158:7:158:8 | (const string)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:158:7:158:8 | (reference to) | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:158:7:158:8 | ss | | test_diff.cpp:92:10:92:13 | argv | shared.h:5:23:5:31 | sinkparam | | test_diff.cpp:92:10:92:13 | argv | test_diff.cpp:92:10:92:13 | argv | | test_diff.cpp:92:10:92:13 | argv | test_diff.cpp:92:10:92:16 | (const char *)... | diff --git a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/test_diff.expected b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/test_diff.expected index 57fd14463888..9caba51452ee 100644 --- a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/test_diff.expected +++ b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/test_diff.expected @@ -39,42 +39,71 @@ | defaulttainttracking.cpp:208:27:208:32 | call to getenv | defaulttainttracking.cpp:208:23:208:23 | x | AST only | | globals.cpp:13:15:13:20 | call to getenv | globals.cpp:13:5:13:11 | global1 | AST only | | globals.cpp:23:15:23:20 | call to getenv | globals.cpp:23:5:23:11 | global2 | AST only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:49:78:49:104 | (unnamed parameter 0) | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:68:7:68:12 | source | AST only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:70:36:70:36 | s | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:76:16:76:24 | call to basic_string | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:88:16:88:24 | call to basic_string | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:91:6:91:6 | call to operator<< | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:91:6:91:17 | (reference dereference) | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:92:15:92:15 | call to operator<< | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:92:15:92:26 | (reference dereference) | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:6:93:6 | call to operator<< | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:6:93:19 | (reference dereference) | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:6:93:19 | (reference to) | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:9:93:16 | (const char *)... | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:18:93:18 | call to operator<< | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:93:18:93:26 | (reference dereference) | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:97:7:97:9 | (const stringstream)... | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:97:7:97:9 | (reference to) | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:97:7:97:9 | ss2 | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:99:7:99:9 | (const stringstream)... | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:99:7:99:9 | (reference to) | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:99:7:99:9 | ss4 | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:102:7:102:9 | (const basic_stringstream, allocator>)... | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:102:7:102:9 | ss2 | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:104:7:104:9 | (const basic_stringstream, allocator>)... | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:104:7:104:9 | ss4 | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:123:7:123:16 | user_input | AST only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:131:16:131:28 | call to basic_string | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:134:9:134:13 | path2 | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:135:10:135:21 | call to basic_string | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:135:10:135:21 | temporary object | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:136:7:136:11 | (const basic_string, allocator>)... | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:136:7:136:11 | path2 | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:138:15:138:27 | call to basic_string | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:147:17:147:19 | call to basic_string | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:158:17:158:19 | call to basic_string | IR only | -| stl.cpp:68:25:68:30 | call to getenv | stl.cpp:163:7:163:8 | cs | AST only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:43:78:43:104 | (unnamed parameter 0) | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:44:176:44:178 | str | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:62:7:62:12 | source | AST only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:63:30:63:30 | s | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:64:36:64:36 | s | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:70:16:70:24 | call to basic_string | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:74:7:74:7 | (const string)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:74:7:74:7 | (reference to) | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:74:7:74:7 | c | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:76:7:76:7 | (const basic_string, allocator>)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:76:7:76:7 | c | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:82:16:82:24 | call to basic_string | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:85:6:85:6 | call to operator<< | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:85:6:85:17 | (reference dereference) | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:86:15:86:15 | call to operator<< | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:86:15:86:26 | (reference dereference) | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:6:87:6 | call to operator<< | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:6:87:19 | (reference dereference) | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:6:87:19 | (reference to) | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:9:87:16 | (const char *)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:18:87:18 | call to operator<< | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:18:87:26 | (reference dereference) | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:6:88:6 | call to operator<< | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:6:88:10 | (reference dereference) | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:9:88:9 | (const basic_string, allocator>)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:9:88:9 | (reference to) | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:9:88:9 | t | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | (const stringstream)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | (reference to) | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | ss2 | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | (const stringstream)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | (reference to) | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | ss4 | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:94:7:94:9 | (const stringstream)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:94:7:94:9 | (reference to) | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:94:7:94:9 | ss5 | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:96:7:96:9 | (const basic_stringstream, allocator>)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:96:7:96:9 | ss2 | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:98:7:98:9 | (const basic_stringstream, allocator>)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:98:7:98:9 | ss4 | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:99:7:99:9 | (const basic_stringstream, allocator>)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:99:7:99:9 | ss5 | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:117:7:117:16 | user_input | AST only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:125:16:125:28 | call to basic_string | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:126:7:126:11 | (const basic_string, allocator>)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:126:7:126:11 | path1 | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:128:9:128:13 | path2 | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | call to basic_string | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | temporary object | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:130:7:130:11 | (const basic_string, allocator>)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:130:7:130:11 | path2 | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:132:15:132:27 | call to basic_string | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:133:7:133:11 | (const basic_string, allocator>)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:133:7:133:11 | path3 | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:141:17:141:19 | call to basic_string | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:144:7:144:8 | (const string)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:144:7:144:8 | (reference to) | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:144:7:144:8 | ss | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:152:17:152:19 | call to basic_string | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:155:7:155:8 | (const basic_string, allocator>)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:155:7:155:8 | ss | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:157:7:157:8 | cs | AST only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:158:7:158:8 | (const string)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:158:7:158:8 | (reference to) | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:158:7:158:8 | ss | IR only | | test_diff.cpp:104:12:104:15 | argv | test_diff.cpp:104:11:104:20 | (...) | IR only | | test_diff.cpp:108:10:108:13 | argv | test_diff.cpp:36:24:36:24 | p | AST only | | test_diff.cpp:111:10:111:13 | argv | shared.h:5:23:5:31 | sinkparam | AST only | From 5a6cd4aca9a6ffe61b39b8742ac32fd730b4d545 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Wed, 28 Oct 2020 14:47:42 -0400 Subject: [PATCH 48/53] Fix test expectations for new nodes and edges in path queries --- .../CWE/CWE-079/semmle/CgiXss/CgiXss.expected | 12 ++++++++++++ .../UncontrolledProcessOperation.expected | 12 ++++++++++++ ...UncontrolledFormatStringThroughGlobalVar.expected | 3 +++ 3 files changed, 27 insertions(+) diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-079/semmle/CgiXss/CgiXss.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-079/semmle/CgiXss/CgiXss.expected index 20bb97a9f663..6f08104489ec 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-079/semmle/CgiXss/CgiXss.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-079/semmle/CgiXss/CgiXss.expected @@ -1,20 +1,30 @@ edges +| search.c:14:24:14:28 | *query | search.c:17:8:17:12 | (const char *)... | +| search.c:14:24:14:28 | *query | search.c:17:8:17:12 | query | | search.c:14:24:14:28 | query | search.c:17:8:17:12 | (const char *)... | | search.c:14:24:14:28 | query | search.c:17:8:17:12 | query | | search.c:14:24:14:28 | query | search.c:17:8:17:12 | query | +| search.c:22:24:22:28 | *query | search.c:23:39:23:43 | query | +| search.c:22:24:22:28 | *query | search.c:23:39:23:43 | query | | search.c:22:24:22:28 | query | search.c:23:39:23:43 | query | | search.c:22:24:22:28 | query | search.c:23:39:23:43 | query | +| search.c:41:21:41:26 | call to getenv | search.c:14:24:14:28 | *query | +| search.c:41:21:41:26 | call to getenv | search.c:14:24:14:28 | *query | | search.c:41:21:41:26 | call to getenv | search.c:14:24:14:28 | query | | search.c:41:21:41:26 | call to getenv | search.c:14:24:14:28 | query | +| search.c:41:21:41:26 | call to getenv | search.c:22:24:22:28 | *query | +| search.c:41:21:41:26 | call to getenv | search.c:22:24:22:28 | *query | | search.c:41:21:41:26 | call to getenv | search.c:22:24:22:28 | query | | search.c:41:21:41:26 | call to getenv | search.c:22:24:22:28 | query | nodes +| search.c:14:24:14:28 | *query | semmle.label | *query | | search.c:14:24:14:28 | query | semmle.label | query | | search.c:17:8:17:12 | (const char *)... | semmle.label | (const char *)... | | search.c:17:8:17:12 | (const char *)... | semmle.label | (const char *)... | | search.c:17:8:17:12 | query | semmle.label | query | | search.c:17:8:17:12 | query | semmle.label | query | | search.c:17:8:17:12 | query | semmle.label | query | +| search.c:22:24:22:28 | *query | semmle.label | *query | | search.c:22:24:22:28 | query | semmle.label | query | | search.c:23:39:23:43 | query | semmle.label | query | | search.c:23:39:23:43 | query | semmle.label | query | @@ -22,7 +32,9 @@ nodes | search.c:41:21:41:26 | call to getenv | semmle.label | call to getenv | | search.c:41:21:41:26 | call to getenv | semmle.label | call to getenv | | search.c:45:5:45:15 | Argument 0 | semmle.label | Argument 0 | +| search.c:45:17:45:25 | Argument 0 indirection | semmle.label | Argument 0 indirection | | search.c:47:5:47:15 | Argument 0 | semmle.label | Argument 0 | +| search.c:47:17:47:25 | Argument 0 indirection | semmle.label | Argument 0 indirection | #select | search.c:17:8:17:12 | query | search.c:41:21:41:26 | call to getenv | search.c:17:8:17:12 | query | Cross-site scripting vulnerability due to $@. | search.c:41:21:41:26 | call to getenv | this query data | | search.c:23:39:23:43 | query | search.c:41:21:41:26 | call to getenv | search.c:23:39:23:43 | query | Cross-site scripting vulnerability due to $@. | search.c:41:21:41:26 | call to getenv | this query data | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-114/semmle/UncontrolledProcessOperation/UncontrolledProcessOperation.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-114/semmle/UncontrolledProcessOperation/UncontrolledProcessOperation.expected index 94c1e3383fee..0c2778abaf4f 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-114/semmle/UncontrolledProcessOperation/UncontrolledProcessOperation.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-114/semmle/UncontrolledProcessOperation/UncontrolledProcessOperation.expected @@ -1,11 +1,19 @@ edges +| test.cpp:24:30:24:36 | *command | test.cpp:26:10:26:16 | command | +| test.cpp:24:30:24:36 | *command | test.cpp:26:10:26:16 | command | | test.cpp:24:30:24:36 | command | test.cpp:26:10:26:16 | command | | test.cpp:24:30:24:36 | command | test.cpp:26:10:26:16 | command | +| test.cpp:29:30:29:36 | *command | test.cpp:31:10:31:16 | command | +| test.cpp:29:30:29:36 | *command | test.cpp:31:10:31:16 | command | | test.cpp:29:30:29:36 | command | test.cpp:31:10:31:16 | command | | test.cpp:29:30:29:36 | command | test.cpp:31:10:31:16 | command | +| test.cpp:42:18:42:23 | call to getenv | test.cpp:24:30:24:36 | *command | | test.cpp:42:18:42:23 | call to getenv | test.cpp:24:30:24:36 | command | +| test.cpp:42:18:42:34 | (const char *)... | test.cpp:24:30:24:36 | *command | | test.cpp:42:18:42:34 | (const char *)... | test.cpp:24:30:24:36 | command | +| test.cpp:43:18:43:23 | call to getenv | test.cpp:29:30:29:36 | *command | | test.cpp:43:18:43:23 | call to getenv | test.cpp:29:30:29:36 | command | +| test.cpp:43:18:43:34 | (const char *)... | test.cpp:29:30:29:36 | *command | | test.cpp:43:18:43:34 | (const char *)... | test.cpp:29:30:29:36 | command | | test.cpp:56:12:56:17 | buffer | test.cpp:62:10:62:15 | (const char *)... | | test.cpp:56:12:56:17 | buffer | test.cpp:62:10:62:15 | buffer | @@ -24,10 +32,12 @@ edges | test.cpp:76:12:76:17 | fgets output argument | test.cpp:79:10:79:13 | (const char *)... | | test.cpp:76:12:76:17 | fgets output argument | test.cpp:79:10:79:13 | data | nodes +| test.cpp:24:30:24:36 | *command | semmle.label | *command | | test.cpp:24:30:24:36 | command | semmle.label | command | | test.cpp:26:10:26:16 | command | semmle.label | command | | test.cpp:26:10:26:16 | command | semmle.label | command | | test.cpp:26:10:26:16 | command | semmle.label | command | +| test.cpp:29:30:29:36 | *command | semmle.label | *command | | test.cpp:29:30:29:36 | command | semmle.label | command | | test.cpp:31:10:31:16 | command | semmle.label | command | | test.cpp:31:10:31:16 | command | semmle.label | command | @@ -35,9 +45,11 @@ nodes | test.cpp:42:7:42:16 | Argument 0 | semmle.label | Argument 0 | | test.cpp:42:18:42:23 | call to getenv | semmle.label | call to getenv | | test.cpp:42:18:42:34 | (const char *)... | semmle.label | (const char *)... | +| test.cpp:42:18:42:34 | Argument 0 indirection | semmle.label | Argument 0 indirection | | test.cpp:43:7:43:16 | Argument 0 | semmle.label | Argument 0 | | test.cpp:43:18:43:23 | call to getenv | semmle.label | call to getenv | | test.cpp:43:18:43:34 | (const char *)... | semmle.label | (const char *)... | +| test.cpp:43:18:43:34 | Argument 0 indirection | semmle.label | Argument 0 indirection | | test.cpp:56:12:56:17 | buffer | semmle.label | buffer | | test.cpp:56:12:56:17 | fgets output argument | semmle.label | fgets output argument | | test.cpp:62:10:62:15 | (const char *)... | semmle.label | (const char *)... | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/globalVars/UncontrolledFormatStringThroughGlobalVar.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/globalVars/UncontrolledFormatStringThroughGlobalVar.expected index 00f98ac48be7..826a659755d6 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/globalVars/UncontrolledFormatStringThroughGlobalVar.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/globalVars/UncontrolledFormatStringThroughGlobalVar.expected @@ -19,6 +19,8 @@ edges | globalVars.c:12:2:12:15 | Store | globalVars.c:8:7:8:10 | copy | | globalVars.c:15:21:15:23 | val | globalVars.c:16:2:16:12 | Store | | globalVars.c:16:2:16:12 | Store | globalVars.c:9:7:9:11 | copy2 | +| globalVars.c:24:11:24:14 | argv | globalVars.c:11:22:11:25 | *argv | +| globalVars.c:24:11:24:14 | argv | globalVars.c:11:22:11:25 | *argv | | globalVars.c:24:11:24:14 | argv | globalVars.c:11:22:11:25 | argv | | globalVars.c:24:11:24:14 | argv | globalVars.c:11:22:11:25 | argv | | globalVars.c:27:9:27:12 | copy | globalVars.c:27:9:27:12 | (const char *)... | @@ -37,6 +39,7 @@ nodes | globalVars.c:15:21:15:23 | val | semmle.label | val | | globalVars.c:16:2:16:12 | Store | semmle.label | Store | | globalVars.c:24:2:24:9 | Argument 0 | semmle.label | Argument 0 | +| globalVars.c:24:11:24:14 | Argument 0 indirection | semmle.label | Argument 0 indirection | | globalVars.c:24:11:24:14 | argv | semmle.label | argv | | globalVars.c:24:11:24:14 | argv | semmle.label | argv | | globalVars.c:27:9:27:12 | (const char *)... | semmle.label | (const char *)... | From c49e33f9cdc18bc5ac78ade14697aea3f74e0efd Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Wed, 28 Oct 2020 16:59:13 -0400 Subject: [PATCH 49/53] Fixup after merge --- .../dataflow/taint-tests/localTaint.expected | 255 +++++++++--------- 1 file changed, 130 insertions(+), 125 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected index 1fe54c31ff7a..b231bb9b41f9 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected @@ -262,6 +262,10 @@ | file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | | | file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | | | file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | | | format.cpp:16:21:16:21 | s | format.cpp:22:22:22:22 | s | | | format.cpp:16:31:16:31 | n | format.cpp:22:25:22:25 | n | | | format.cpp:16:46:16:51 | format | format.cpp:22:28:22:33 | format | | @@ -3179,131 +3183,132 @@ | stl.h:95:69:95:69 | x | stl.h:96:42:96:42 | x | | | stl.h:96:42:96:42 | ref arg x | stl.h:95:69:95:69 | x | | | stl.h:96:42:96:42 | ref arg x | stl.h:95:69:95:69 | x | | -| stl.h:241:30:241:40 | call to allocator | stl.h:241:21:241:41 | noexcept(...) | TAINT | -| stl.h:241:30:241:40 | call to allocator | stl.h:241:21:241:41 | noexcept(...) | TAINT | -| stl.h:241:30:241:40 | call to allocator | stl.h:241:21:241:41 | noexcept(...) | TAINT | -| stl.h:241:30:241:40 | call to allocator | stl.h:241:21:241:41 | noexcept(...) | TAINT | -| stl.h:241:30:241:40 | call to allocator | stl.h:241:21:241:41 | noexcept(...) | TAINT | -| stl.h:241:53:241:63 | 0 | stl.h:241:46:241:64 | (no string representation) | TAINT | -| stl.h:334:9:334:9 | Unknown literal | stl.h:334:9:334:9 | constructor init of field first | TAINT | -| stl.h:334:9:334:9 | Unknown literal | stl.h:334:9:334:9 | constructor init of field first | TAINT | -| stl.h:334:9:334:9 | Unknown literal | stl.h:334:9:334:9 | constructor init of field first | TAINT | -| stl.h:334:9:334:9 | Unknown literal | stl.h:334:9:334:9 | constructor init of field first | TAINT | -| stl.h:334:9:334:9 | Unknown literal | stl.h:334:9:334:9 | constructor init of field first | TAINT | -| stl.h:334:9:334:9 | Unknown literal | stl.h:334:9:334:9 | constructor init of field second | TAINT | -| stl.h:334:9:334:9 | Unknown literal | stl.h:334:9:334:9 | constructor init of field second | TAINT | -| stl.h:334:9:334:9 | Unknown literal | stl.h:334:9:334:9 | constructor init of field second | TAINT | -| stl.h:334:9:334:9 | Unknown literal | stl.h:334:9:334:9 | constructor init of field second | TAINT | -| stl.h:334:9:334:9 | Unknown literal | stl.h:334:9:334:9 | constructor init of field second | TAINT | -| stl.h:334:9:334:9 | constructor init of field first [post-this] | stl.h:334:9:334:9 | constructor init of field second [pre-this] | | -| stl.h:334:9:334:9 | constructor init of field first [post-this] | stl.h:334:9:334:9 | constructor init of field second [pre-this] | | -| stl.h:334:9:334:9 | constructor init of field first [post-this] | stl.h:334:9:334:9 | constructor init of field second [pre-this] | | -| stl.h:334:9:334:9 | constructor init of field first [post-this] | stl.h:334:9:334:9 | constructor init of field second [pre-this] | | -| stl.h:334:9:334:9 | constructor init of field first [post-this] | stl.h:334:9:334:9 | constructor init of field second [pre-this] | | -| stl.h:334:9:334:9 | constructor init of field first [pre-this] | stl.h:334:9:334:9 | constructor init of field second [pre-this] | | -| stl.h:334:9:334:9 | constructor init of field first [pre-this] | stl.h:334:9:334:9 | constructor init of field second [pre-this] | | -| stl.h:334:9:334:9 | constructor init of field first [pre-this] | stl.h:334:9:334:9 | constructor init of field second [pre-this] | | -| stl.h:334:9:334:9 | constructor init of field first [pre-this] | stl.h:334:9:334:9 | constructor init of field second [pre-this] | | -| stl.h:334:9:334:9 | constructor init of field first [pre-this] | stl.h:334:9:334:9 | constructor init of field second [pre-this] | | -| stl.h:334:9:334:9 | this | stl.h:334:9:334:9 | constructor init of field first [pre-this] | | -| stl.h:334:9:334:9 | this | stl.h:334:9:334:9 | constructor init of field first [pre-this] | | -| stl.h:334:9:334:9 | this | stl.h:334:9:334:9 | constructor init of field first [pre-this] | | -| stl.h:334:9:334:9 | this | stl.h:334:9:334:9 | constructor init of field first [pre-this] | | -| stl.h:334:9:334:9 | this | stl.h:334:9:334:9 | constructor init of field first [pre-this] | | -| stl.h:341:3:341:3 | this | stl.h:341:36:341:43 | constructor init of field first [pre-this] | | -| stl.h:341:3:341:3 | this | stl.h:341:36:341:43 | constructor init of field first [pre-this] | | -| stl.h:341:3:341:3 | this | stl.h:341:36:341:43 | constructor init of field first [pre-this] | | -| stl.h:341:3:341:3 | this | stl.h:341:36:341:43 | constructor init of field first [pre-this] | | -| stl.h:341:3:341:3 | this | stl.h:341:36:341:43 | constructor init of field first [pre-this] | | -| stl.h:341:3:341:6 | this | stl.h:341:36:341:43 | constructor init of field first [pre-this] | | -| stl.h:341:18:341:18 | x | stl.h:341:42:341:42 | x | | -| stl.h:341:18:341:18 | x | stl.h:341:42:341:42 | x | | -| stl.h:341:18:341:18 | x | stl.h:341:42:341:42 | x | | -| stl.h:341:18:341:18 | x | stl.h:341:42:341:42 | x | | -| stl.h:341:18:341:18 | x | stl.h:341:42:341:42 | x | | -| stl.h:341:18:341:18 | x | stl.h:341:42:341:42 | x | | -| stl.h:341:31:341:31 | y | stl.h:341:53:341:53 | y | | -| stl.h:341:31:341:31 | y | stl.h:341:53:341:53 | y | | -| stl.h:341:31:341:31 | y | stl.h:341:53:341:53 | y | | -| stl.h:341:31:341:31 | y | stl.h:341:53:341:53 | y | | -| stl.h:341:31:341:31 | y | stl.h:341:53:341:53 | y | | -| stl.h:341:31:341:31 | y | stl.h:341:53:341:53 | y | | -| stl.h:341:36:341:43 | call to unknown function | stl.h:341:36:341:43 | constructor init of field first | TAINT | -| stl.h:341:36:341:43 | constructor init of field first [post-this] | stl.h:341:46:341:54 | constructor init of field second [pre-this] | | -| stl.h:341:36:341:43 | constructor init of field first [post-this] | stl.h:341:46:341:54 | constructor init of field second [pre-this] | | -| stl.h:341:36:341:43 | constructor init of field first [post-this] | stl.h:341:46:341:54 | constructor init of field second [pre-this] | | -| stl.h:341:36:341:43 | constructor init of field first [post-this] | stl.h:341:46:341:54 | constructor init of field second [pre-this] | | -| stl.h:341:36:341:43 | constructor init of field first [post-this] | stl.h:341:46:341:54 | constructor init of field second [pre-this] | | -| stl.h:341:36:341:43 | constructor init of field first [post-this] | stl.h:341:46:341:54 | constructor init of field second [pre-this] | | -| stl.h:341:36:341:43 | constructor init of field first [pre-this] | stl.h:341:46:341:54 | constructor init of field second [pre-this] | | -| stl.h:341:36:341:43 | constructor init of field first [pre-this] | stl.h:341:46:341:54 | constructor init of field second [pre-this] | | -| stl.h:341:36:341:43 | constructor init of field first [pre-this] | stl.h:341:46:341:54 | constructor init of field second [pre-this] | | -| stl.h:341:36:341:43 | constructor init of field first [pre-this] | stl.h:341:46:341:54 | constructor init of field second [pre-this] | | -| stl.h:341:36:341:43 | constructor init of field first [pre-this] | stl.h:341:46:341:54 | constructor init of field second [pre-this] | | -| stl.h:341:36:341:43 | constructor init of field first [pre-this] | stl.h:341:46:341:54 | constructor init of field second [pre-this] | | -| stl.h:341:42:341:42 | x | stl.h:341:36:341:43 | constructor init of field first | TAINT | -| stl.h:341:42:341:42 | x | stl.h:341:36:341:43 | constructor init of field first | TAINT | -| stl.h:341:42:341:42 | x | stl.h:341:36:341:43 | constructor init of field first | TAINT | -| stl.h:341:42:341:42 | x | stl.h:341:36:341:43 | constructor init of field first | TAINT | -| stl.h:341:42:341:42 | x | stl.h:341:36:341:43 | constructor init of field first | TAINT | -| stl.h:341:46:341:54 | call to unknown function | stl.h:341:46:341:54 | constructor init of field second | TAINT | -| stl.h:341:53:341:53 | y | stl.h:341:46:341:54 | constructor init of field second | TAINT | -| stl.h:341:53:341:53 | y | stl.h:341:46:341:54 | constructor init of field second | TAINT | -| stl.h:341:53:341:53 | y | stl.h:341:46:341:54 | constructor init of field second | TAINT | -| stl.h:341:53:341:53 | y | stl.h:341:46:341:54 | constructor init of field second | TAINT | -| stl.h:341:53:341:53 | y | stl.h:341:46:341:54 | constructor init of field second | TAINT | -| stl.h:347:87:347:87 | x | stl.h:347:87:347:87 | x | | -| stl.h:347:87:347:87 | x | stl.h:347:87:347:87 | x | | -| stl.h:347:87:347:87 | x | stl.h:347:87:347:87 | x | | -| stl.h:347:87:347:87 | x | stl.h:347:87:347:87 | x | | -| stl.h:347:87:347:87 | x | stl.h:347:87:347:87 | x | | -| stl.h:347:87:347:87 | x | stl.h:347:87:347:87 | x | | -| stl.h:347:87:347:87 | x | stl.h:347:87:347:87 | x | | -| stl.h:347:87:347:87 | x | stl.h:348:58:348:58 | x | | -| stl.h:347:87:347:87 | x | stl.h:348:58:348:58 | x | | -| stl.h:347:87:347:87 | x | stl.h:348:58:348:58 | x | | -| stl.h:347:87:347:87 | x | stl.h:348:58:348:58 | x | | -| stl.h:347:87:347:87 | x | stl.h:348:58:348:58 | x | | -| stl.h:347:87:347:87 | x | stl.h:348:58:348:58 | x | | -| stl.h:347:87:347:87 | x | stl.h:348:58:348:58 | x | | -| stl.h:347:95:347:95 | y | stl.h:347:95:347:95 | y | | -| stl.h:347:95:347:95 | y | stl.h:347:95:347:95 | y | | -| stl.h:347:95:347:95 | y | stl.h:347:95:347:95 | y | | -| stl.h:347:95:347:95 | y | stl.h:347:95:347:95 | y | | -| stl.h:347:95:347:95 | y | stl.h:347:95:347:95 | y | | -| stl.h:347:95:347:95 | y | stl.h:347:95:347:95 | y | | -| stl.h:347:95:347:95 | y | stl.h:347:95:347:95 | y | | -| stl.h:347:95:347:95 | y | stl.h:348:79:348:79 | y | | -| stl.h:347:95:347:95 | y | stl.h:348:79:348:79 | y | | -| stl.h:347:95:347:95 | y | stl.h:348:79:348:79 | y | | -| stl.h:347:95:347:95 | y | stl.h:348:79:348:79 | y | | -| stl.h:347:95:347:95 | y | stl.h:348:79:348:79 | y | | -| stl.h:347:95:347:95 | y | stl.h:348:79:348:79 | y | | -| stl.h:347:95:347:95 | y | stl.h:348:79:348:79 | y | | -| stl.h:348:58:348:58 | x | stl.h:348:41:348:56 | call to forward | | -| stl.h:348:58:348:58 | x | stl.h:348:41:348:56 | call to forward | | -| stl.h:348:58:348:58 | x | stl.h:348:41:348:56 | call to forward | | -| stl.h:348:58:348:58 | x | stl.h:348:41:348:56 | call to forward | | -| stl.h:348:58:348:58 | x | stl.h:348:41:348:56 | call to forward | | -| stl.h:348:58:348:58 | x | stl.h:348:41:348:56 | call to forward | | -| stl.h:348:62:348:77 | call to forward | stl.h:348:3:348:82 | call to pair | TAINT | -| stl.h:348:62:348:77 | call to forward | stl.h:348:3:348:82 | call to pair | TAINT | -| stl.h:348:62:348:77 | call to forward | stl.h:348:3:348:82 | call to pair | TAINT | -| stl.h:348:62:348:77 | call to forward | stl.h:348:3:348:82 | call to pair | TAINT | -| stl.h:348:62:348:77 | call to forward | stl.h:348:3:348:82 | call to pair | TAINT | -| stl.h:348:62:348:77 | call to forward | stl.h:348:3:348:82 | call to pair | TAINT | -| stl.h:348:79:348:79 | y | stl.h:348:3:348:82 | call to pair | TAINT | -| stl.h:348:79:348:79 | y | stl.h:348:3:348:82 | call to pair | TAINT | -| stl.h:348:79:348:79 | y | stl.h:348:3:348:82 | call to pair | TAINT | -| stl.h:348:79:348:79 | y | stl.h:348:3:348:82 | call to pair | TAINT | -| stl.h:348:79:348:79 | y | stl.h:348:3:348:82 | call to pair | TAINT | -| stl.h:348:79:348:79 | y | stl.h:348:3:348:82 | call to pair | TAINT | -| stl.h:348:79:348:79 | y | stl.h:348:62:348:77 | call to forward | | -| stl.h:348:79:348:79 | y | stl.h:348:62:348:77 | call to forward | | -| stl.h:348:79:348:79 | y | stl.h:348:62:348:77 | call to forward | | -| stl.h:348:79:348:79 | y | stl.h:348:62:348:77 | call to forward | | -| stl.h:348:79:348:79 | y | stl.h:348:62:348:77 | call to forward | | -| stl.h:348:79:348:79 | y | stl.h:348:62:348:77 | call to forward | | +| stl.h:292:30:292:40 | call to allocator | stl.h:292:21:292:41 | noexcept(...) | TAINT | +| stl.h:292:30:292:40 | call to allocator | stl.h:292:21:292:41 | noexcept(...) | TAINT | +| stl.h:292:30:292:40 | call to allocator | stl.h:292:21:292:41 | noexcept(...) | TAINT | +| stl.h:292:30:292:40 | call to allocator | stl.h:292:21:292:41 | noexcept(...) | TAINT | +| stl.h:292:30:292:40 | call to allocator | stl.h:292:21:292:41 | noexcept(...) | TAINT | +| stl.h:292:30:292:40 | call to allocator | stl.h:292:21:292:41 | noexcept(...) | TAINT | +| stl.h:292:53:292:63 | 0 | stl.h:292:46:292:64 | (no string representation) | TAINT | +| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field first | TAINT | +| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field first | TAINT | +| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field first | TAINT | +| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field first | TAINT | +| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field first | TAINT | +| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field second | TAINT | +| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field second | TAINT | +| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field second | TAINT | +| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field second | TAINT | +| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field second | TAINT | +| stl.h:385:9:385:9 | constructor init of field first [post-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | | +| stl.h:385:9:385:9 | constructor init of field first [post-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | | +| stl.h:385:9:385:9 | constructor init of field first [post-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | | +| stl.h:385:9:385:9 | constructor init of field first [post-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | | +| stl.h:385:9:385:9 | constructor init of field first [post-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | | +| stl.h:385:9:385:9 | constructor init of field first [pre-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | | +| stl.h:385:9:385:9 | constructor init of field first [pre-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | | +| stl.h:385:9:385:9 | constructor init of field first [pre-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | | +| stl.h:385:9:385:9 | constructor init of field first [pre-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | | +| stl.h:385:9:385:9 | constructor init of field first [pre-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | | +| stl.h:385:9:385:9 | this | stl.h:385:9:385:9 | constructor init of field first [pre-this] | | +| stl.h:385:9:385:9 | this | stl.h:385:9:385:9 | constructor init of field first [pre-this] | | +| stl.h:385:9:385:9 | this | stl.h:385:9:385:9 | constructor init of field first [pre-this] | | +| stl.h:385:9:385:9 | this | stl.h:385:9:385:9 | constructor init of field first [pre-this] | | +| stl.h:385:9:385:9 | this | stl.h:385:9:385:9 | constructor init of field first [pre-this] | | +| stl.h:392:3:392:3 | this | stl.h:392:36:392:43 | constructor init of field first [pre-this] | | +| stl.h:392:3:392:3 | this | stl.h:392:36:392:43 | constructor init of field first [pre-this] | | +| stl.h:392:3:392:3 | this | stl.h:392:36:392:43 | constructor init of field first [pre-this] | | +| stl.h:392:3:392:3 | this | stl.h:392:36:392:43 | constructor init of field first [pre-this] | | +| stl.h:392:3:392:3 | this | stl.h:392:36:392:43 | constructor init of field first [pre-this] | | +| stl.h:392:3:392:6 | this | stl.h:392:36:392:43 | constructor init of field first [pre-this] | | +| stl.h:392:18:392:18 | x | stl.h:392:42:392:42 | x | | +| stl.h:392:18:392:18 | x | stl.h:392:42:392:42 | x | | +| stl.h:392:18:392:18 | x | stl.h:392:42:392:42 | x | | +| stl.h:392:18:392:18 | x | stl.h:392:42:392:42 | x | | +| stl.h:392:18:392:18 | x | stl.h:392:42:392:42 | x | | +| stl.h:392:18:392:18 | x | stl.h:392:42:392:42 | x | | +| stl.h:392:31:392:31 | y | stl.h:392:53:392:53 | y | | +| stl.h:392:31:392:31 | y | stl.h:392:53:392:53 | y | | +| stl.h:392:31:392:31 | y | stl.h:392:53:392:53 | y | | +| stl.h:392:31:392:31 | y | stl.h:392:53:392:53 | y | | +| stl.h:392:31:392:31 | y | stl.h:392:53:392:53 | y | | +| stl.h:392:31:392:31 | y | stl.h:392:53:392:53 | y | | +| stl.h:392:36:392:43 | call to unknown function | stl.h:392:36:392:43 | constructor init of field first | TAINT | +| stl.h:392:36:392:43 | constructor init of field first [post-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | | +| stl.h:392:36:392:43 | constructor init of field first [post-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | | +| stl.h:392:36:392:43 | constructor init of field first [post-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | | +| stl.h:392:36:392:43 | constructor init of field first [post-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | | +| stl.h:392:36:392:43 | constructor init of field first [post-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | | +| stl.h:392:36:392:43 | constructor init of field first [post-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | | +| stl.h:392:36:392:43 | constructor init of field first [pre-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | | +| stl.h:392:36:392:43 | constructor init of field first [pre-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | | +| stl.h:392:36:392:43 | constructor init of field first [pre-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | | +| stl.h:392:36:392:43 | constructor init of field first [pre-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | | +| stl.h:392:36:392:43 | constructor init of field first [pre-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | | +| stl.h:392:36:392:43 | constructor init of field first [pre-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | | +| stl.h:392:42:392:42 | x | stl.h:392:36:392:43 | constructor init of field first | TAINT | +| stl.h:392:42:392:42 | x | stl.h:392:36:392:43 | constructor init of field first | TAINT | +| stl.h:392:42:392:42 | x | stl.h:392:36:392:43 | constructor init of field first | TAINT | +| stl.h:392:42:392:42 | x | stl.h:392:36:392:43 | constructor init of field first | TAINT | +| stl.h:392:42:392:42 | x | stl.h:392:36:392:43 | constructor init of field first | TAINT | +| stl.h:392:46:392:54 | call to unknown function | stl.h:392:46:392:54 | constructor init of field second | TAINT | +| stl.h:392:53:392:53 | y | stl.h:392:46:392:54 | constructor init of field second | TAINT | +| stl.h:392:53:392:53 | y | stl.h:392:46:392:54 | constructor init of field second | TAINT | +| stl.h:392:53:392:53 | y | stl.h:392:46:392:54 | constructor init of field second | TAINT | +| stl.h:392:53:392:53 | y | stl.h:392:46:392:54 | constructor init of field second | TAINT | +| stl.h:392:53:392:53 | y | stl.h:392:46:392:54 | constructor init of field second | TAINT | +| stl.h:398:87:398:87 | x | stl.h:398:87:398:87 | x | | +| stl.h:398:87:398:87 | x | stl.h:398:87:398:87 | x | | +| stl.h:398:87:398:87 | x | stl.h:398:87:398:87 | x | | +| stl.h:398:87:398:87 | x | stl.h:398:87:398:87 | x | | +| stl.h:398:87:398:87 | x | stl.h:398:87:398:87 | x | | +| stl.h:398:87:398:87 | x | stl.h:398:87:398:87 | x | | +| stl.h:398:87:398:87 | x | stl.h:398:87:398:87 | x | | +| stl.h:398:87:398:87 | x | stl.h:399:58:399:58 | x | | +| stl.h:398:87:398:87 | x | stl.h:399:58:399:58 | x | | +| stl.h:398:87:398:87 | x | stl.h:399:58:399:58 | x | | +| stl.h:398:87:398:87 | x | stl.h:399:58:399:58 | x | | +| stl.h:398:87:398:87 | x | stl.h:399:58:399:58 | x | | +| stl.h:398:87:398:87 | x | stl.h:399:58:399:58 | x | | +| stl.h:398:87:398:87 | x | stl.h:399:58:399:58 | x | | +| stl.h:398:95:398:95 | y | stl.h:398:95:398:95 | y | | +| stl.h:398:95:398:95 | y | stl.h:398:95:398:95 | y | | +| stl.h:398:95:398:95 | y | stl.h:398:95:398:95 | y | | +| stl.h:398:95:398:95 | y | stl.h:398:95:398:95 | y | | +| stl.h:398:95:398:95 | y | stl.h:398:95:398:95 | y | | +| stl.h:398:95:398:95 | y | stl.h:398:95:398:95 | y | | +| stl.h:398:95:398:95 | y | stl.h:398:95:398:95 | y | | +| stl.h:398:95:398:95 | y | stl.h:399:79:399:79 | y | | +| stl.h:398:95:398:95 | y | stl.h:399:79:399:79 | y | | +| stl.h:398:95:398:95 | y | stl.h:399:79:399:79 | y | | +| stl.h:398:95:398:95 | y | stl.h:399:79:399:79 | y | | +| stl.h:398:95:398:95 | y | stl.h:399:79:399:79 | y | | +| stl.h:398:95:398:95 | y | stl.h:399:79:399:79 | y | | +| stl.h:398:95:398:95 | y | stl.h:399:79:399:79 | y | | +| stl.h:399:58:399:58 | x | stl.h:399:41:399:56 | call to forward | | +| stl.h:399:58:399:58 | x | stl.h:399:41:399:56 | call to forward | | +| stl.h:399:58:399:58 | x | stl.h:399:41:399:56 | call to forward | | +| stl.h:399:58:399:58 | x | stl.h:399:41:399:56 | call to forward | | +| stl.h:399:58:399:58 | x | stl.h:399:41:399:56 | call to forward | | +| stl.h:399:58:399:58 | x | stl.h:399:41:399:56 | call to forward | | +| stl.h:399:62:399:77 | call to forward | stl.h:399:3:399:82 | call to pair | TAINT | +| stl.h:399:62:399:77 | call to forward | stl.h:399:3:399:82 | call to pair | TAINT | +| stl.h:399:62:399:77 | call to forward | stl.h:399:3:399:82 | call to pair | TAINT | +| stl.h:399:62:399:77 | call to forward | stl.h:399:3:399:82 | call to pair | TAINT | +| stl.h:399:62:399:77 | call to forward | stl.h:399:3:399:82 | call to pair | TAINT | +| stl.h:399:62:399:77 | call to forward | stl.h:399:3:399:82 | call to pair | TAINT | +| stl.h:399:79:399:79 | y | stl.h:399:3:399:82 | call to pair | TAINT | +| stl.h:399:79:399:79 | y | stl.h:399:3:399:82 | call to pair | TAINT | +| stl.h:399:79:399:79 | y | stl.h:399:3:399:82 | call to pair | TAINT | +| stl.h:399:79:399:79 | y | stl.h:399:3:399:82 | call to pair | TAINT | +| stl.h:399:79:399:79 | y | stl.h:399:3:399:82 | call to pair | TAINT | +| stl.h:399:79:399:79 | y | stl.h:399:3:399:82 | call to pair | TAINT | +| stl.h:399:79:399:79 | y | stl.h:399:62:399:77 | call to forward | | +| stl.h:399:79:399:79 | y | stl.h:399:62:399:77 | call to forward | | +| stl.h:399:79:399:79 | y | stl.h:399:62:399:77 | call to forward | | +| stl.h:399:79:399:79 | y | stl.h:399:62:399:77 | call to forward | | +| stl.h:399:79:399:79 | y | stl.h:399:62:399:77 | call to forward | | +| stl.h:399:79:399:79 | y | stl.h:399:62:399:77 | call to forward | | | string.cpp:25:12:25:17 | call to source | string.cpp:29:7:29:7 | a | | | string.cpp:26:16:26:20 | 123 | string.cpp:26:16:26:21 | call to basic_string | TAINT | | string.cpp:26:16:26:21 | call to basic_string | string.cpp:30:7:30:7 | b | | From be180aac25f3bbba354a7251d540dba841da2dfa Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Fri, 30 Oct 2020 12:52:58 -0400 Subject: [PATCH 50/53] Fixup after merge --- .../library-tests/ir/ir/PrintAST.expected | 780 +++++++++++++++++- 1 file changed, 769 insertions(+), 11 deletions(-) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 2d0ec4533f86..174600da96da 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -6012,11 +6012,11 @@ ir.cpp: # 716| getStmt(0): [ReturnStmt] return ... # 716| getExpr(): [Literal] 0 # 716| Type = [TemplateParameter] T +# 716| Value = [Literal] 0 +# 716| ValueCategory = prvalue +# 716| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 716| Type = [TemplateParameter] T # 716| ValueCategory = prvalue(load) -# 716| expr: [Literal] 0 -# 716| Type = [TemplateParameter] T -# 716| Value = [Literal] 0 -# 716| ValueCategory = prvalue # 715| [MemberFunction,TemplateFunction] long Outer::Func(U, V) # 715| : # 715| getParameter(0): [Parameter] x @@ -6697,6 +6697,9 @@ ir.cpp: # 809| Conversion = [GlvalueConversion] glvalue conversion # 809| Type = [SpecifiedType] const Base # 809| ValueCategory = lvalue +# 809| getExpr(): [TemporaryObjectExpr] temporary object +# 809| Type = [Struct,VirtualBaseClass] Base +# 809| ValueCategory = lvalue # 809| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 809| Type = [Struct,VirtualBaseClass] Base # 809| ValueCategory = lvalue @@ -6727,6 +6730,9 @@ ir.cpp: # 810| Conversion = [GlvalueConversion] glvalue conversion # 810| Type = [SpecifiedType] const Base # 810| ValueCategory = lvalue +# 810| getExpr(): [TemporaryObjectExpr] temporary object +# 810| Type = [Struct,VirtualBaseClass] Base +# 810| ValueCategory = lvalue # 810| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 810| Type = [Struct,VirtualBaseClass] Base # 810| ValueCategory = lvalue @@ -6931,6 +6937,9 @@ ir.cpp: # 823| Conversion = [GlvalueConversion] glvalue conversion # 823| Type = [SpecifiedType] const Base # 823| ValueCategory = lvalue +# 823| getExpr(): [TemporaryObjectExpr] temporary object +# 823| Type = [Struct,VirtualBaseClass] Base +# 823| ValueCategory = lvalue # 823| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 823| Type = [Struct,VirtualBaseClass] Base # 823| ValueCategory = lvalue @@ -6965,6 +6974,9 @@ ir.cpp: # 824| Conversion = [GlvalueConversion] glvalue conversion # 824| Type = [SpecifiedType] const Base # 824| ValueCategory = lvalue +# 824| getExpr(): [TemporaryObjectExpr] temporary object +# 824| Type = [Struct,VirtualBaseClass] Base +# 824| ValueCategory = lvalue # 824| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 824| Type = [Struct,VirtualBaseClass] Base # 824| ValueCategory = lvalue @@ -7251,16 +7263,16 @@ ir.cpp: # 850| getDeclarationEntry(0): [VariableDeclarationEntry] definition of b # 850| Type = [Struct] PolymorphicBase # 850| getVariable().getInitializer(): [Initializer] initializer for b -#-----| getExpr(): [ConstructorCall] call to PolymorphicBase -#-----| Type = [VoidType] void -#-----| ValueCategory = prvalue +# 850| getExpr(): [ConstructorCall] call to PolymorphicBase +# 850| Type = [VoidType] void +# 850| ValueCategory = prvalue # 851| getStmt(1): [DeclStmt] declaration # 851| getDeclarationEntry(0): [VariableDeclarationEntry] definition of d # 851| Type = [Struct] PolymorphicDerived # 851| getVariable().getInitializer(): [Initializer] initializer for d -#-----| getExpr(): [ConstructorCall] call to PolymorphicDerived -#-----| Type = [VoidType] void -#-----| ValueCategory = prvalue +# 851| getExpr(): [ConstructorCall] call to PolymorphicDerived +# 851| Type = [VoidType] void +# 851| ValueCategory = prvalue # 853| getStmt(2): [DeclStmt] declaration # 853| getDeclarationEntry(0): [VariableDeclarationEntry] definition of pb # 853| Type = [PointerType] PolymorphicBase * @@ -9680,7 +9692,7 @@ ir.cpp: # 1178| getEntryPoint(): [BlockStmt] { ... } # 1179| getStmt(0): [ReturnStmt] return ... # 1179| getExpr(): [ConstructorCall] call to String -# 1179| Type = [Struct] String +# 1179| Type = [VoidType] void # 1179| ValueCategory = prvalue # 1179| getArgument(0): foo # 1179| Type = [ArrayType] const char[4] @@ -10558,6 +10570,752 @@ ir.cpp: # 1322| Type = [VoidPointerType] void * # 1322| ValueCategory = prvalue # 1323| getStmt(1): [ReturnStmt] return ... +# 1326| [FunctionTemplateInstantiation,TopLevelFunction] Point defaultConstruct() +# 1326| : +# 1326| getEntryPoint(): [BlockStmt] { ... } +# 1327| getStmt(0): [ReturnStmt] return ... +# 1327| getExpr(): [Literal] 0 +# 1327| Type = [Struct] Point +# 1327| Value = [Literal] 0 +# 1327| ValueCategory = prvalue +# 1326| [FunctionTemplateInstantiation,TopLevelFunction] String defaultConstruct() +# 1326| : +# 1326| getEntryPoint(): [BlockStmt] { ... } +# 1327| getStmt(0): [ReturnStmt] return ... +# 1327| getExpr(): [ConstructorCall] call to String +# 1327| Type = [VoidType] void +# 1327| ValueCategory = prvalue +# 1326| [TemplateFunction,TopLevelFunction] T defaultConstruct() +# 1326| : +# 1326| getEntryPoint(): [BlockStmt] { ... } +# 1327| getStmt(0): [ReturnStmt] return ... +# 1327| getExpr(): [Literal] 0 +# 1327| Type = [TemplateParameter] T +# 1327| Value = [Literal] 0 +# 1327| ValueCategory = prvalue +# 1327| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1327| Type = [TemplateParameter] T +# 1327| ValueCategory = prvalue(load) +# 1326| [FunctionTemplateInstantiation,TopLevelFunction] copy_constructor defaultConstruct() +# 1326| : +# 1326| getEntryPoint(): [BlockStmt] { ... } +# 1327| getStmt(0): [ReturnStmt] return ... +# 1327| getExpr(): [ConstructorCall] call to copy_constructor +# 1327| Type = [VoidType] void +# 1327| ValueCategory = prvalue +# 1326| [FunctionTemplateInstantiation,TopLevelFunction] destructor_only defaultConstruct() +# 1326| : +# 1326| getEntryPoint(): [BlockStmt] { ... } +# 1327| getStmt(0): [ReturnStmt] return ... +# 1327| getExpr(): [Literal] 0 +# 1327| Type = [Class] destructor_only +# 1327| Value = [Literal] 0 +# 1327| ValueCategory = prvalue +# 1330| [CopyAssignmentOperator] constructor_only& constructor_only::operator=(constructor_only const&) +# 1330| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const constructor_only & +# 1330| [MoveAssignmentOperator] constructor_only& constructor_only::operator=(constructor_only&&) +# 1330| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] constructor_only && +# 1330| [CopyConstructor] void constructor_only::constructor_only(constructor_only const&) +# 1330| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const constructor_only & +# 1330| [MoveConstructor] void constructor_only::constructor_only(constructor_only&&) +# 1330| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] constructor_only && +# 1335| [ConversionConstructor] void constructor_only::constructor_only(int) +# 1335| : +# 1335| getParameter(0): [Parameter] x +# 1335| Type = [IntType] int +# 1338| [CopyAssignmentOperator] copy_constructor& copy_constructor::operator=(copy_constructor const&) +# 1338| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const copy_constructor & +# 1343| [Constructor] void copy_constructor::copy_constructor() +# 1343| : +# 1344| [CopyConstructor] void copy_constructor::copy_constructor(copy_constructor const&) +# 1344| : +# 1344| getParameter(0): [Parameter] (unnamed parameter 0) +# 1344| Type = [LValueReferenceType] const copy_constructor & +# 1346| [MemberFunction] void copy_constructor::method() +# 1346| : +# 1349| [CopyAssignmentOperator] destructor_only& destructor_only::operator=(destructor_only const&) +# 1349| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const destructor_only & +# 1349| [Constructor] void destructor_only::destructor_only() +# 1349| : +# 1351| [Destructor] void destructor_only::~destructor_only() +# 1351| : +# 1353| [MemberFunction] void destructor_only::method() +# 1353| : +# 1357| [FunctionTemplateInstantiation,TopLevelFunction] void acceptRef(Point const&) +# 1357| : +# 1357| getParameter(0): [Parameter] v +# 1357| Type = [LValueReferenceType] const Point & +# 1357| [FunctionTemplateInstantiation,TopLevelFunction] void acceptRef(String const&) +# 1357| : +# 1357| getParameter(0): [Parameter] v +# 1357| Type = [LValueReferenceType] const String & +# 1357| [TemplateFunction,TopLevelFunction] void acceptRef(T const&) +# 1357| : +# 1357| getParameter(0): [Parameter] v +# 1357| Type = [LValueReferenceType] const T & +# 1357| [FunctionTemplateInstantiation,TopLevelFunction] void acceptRef(copy_constructor const&) +# 1357| : +# 1357| getParameter(0): [Parameter] v +# 1357| Type = [LValueReferenceType] const copy_constructor & +# 1357| [FunctionTemplateInstantiation,TopLevelFunction] void acceptRef(destructor_only const&) +# 1357| : +# 1357| getParameter(0): [Parameter] v +# 1357| Type = [LValueReferenceType] const destructor_only & +# 1360| [FunctionTemplateInstantiation,TopLevelFunction] void acceptValue(Point) +# 1360| : +# 1360| getParameter(0): [Parameter] v +# 1360| Type = [Struct] Point +# 1360| [FunctionTemplateInstantiation,TopLevelFunction] void acceptValue(String) +# 1360| : +# 1360| getParameter(0): [Parameter] v +# 1360| Type = [Struct] String +# 1360| [TemplateFunction,TopLevelFunction] void acceptValue(T) +# 1360| : +# 1360| getParameter(0): [Parameter] v +# 1360| Type = [TemplateParameter] T +# 1360| [FunctionTemplateInstantiation,TopLevelFunction] void acceptValue(copy_constructor) +# 1360| : +# 1360| getParameter(0): [Parameter] v +# 1360| Type = [Class] copy_constructor +# 1360| [FunctionTemplateInstantiation,TopLevelFunction] void acceptValue(destructor_only) +# 1360| : +# 1360| getParameter(0): [Parameter] v +# 1360| Type = [Class] destructor_only +# 1363| [FunctionTemplateInstantiation,TopLevelFunction] POD_Derived returnValue() +# 1363| : +# 1363| [FunctionTemplateInstantiation,TopLevelFunction] POD_Middle returnValue() +# 1363| : +# 1363| [FunctionTemplateInstantiation,TopLevelFunction] Point returnValue() +# 1363| : +# 1363| [FunctionTemplateInstantiation,TopLevelFunction] String returnValue() +# 1363| : +# 1363| [TemplateFunction,TopLevelFunction] T returnValue() +# 1363| : +# 1363| [FunctionTemplateInstantiation,TopLevelFunction] UnusualFields returnValue() +# 1363| : +# 1363| [FunctionTemplateInstantiation,TopLevelFunction] copy_constructor returnValue() +# 1363| : +# 1363| [FunctionTemplateInstantiation,TopLevelFunction] destructor_only returnValue() +# 1363| : +# 1365| [TopLevelFunction] void temporary_string() +# 1365| : +# 1365| getEntryPoint(): [BlockStmt] { ... } +# 1366| getStmt(0): [DeclStmt] declaration +# 1366| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s +# 1366| Type = [Struct] String +# 1366| getVariable().getInitializer(): [Initializer] initializer for s +# 1366| getExpr(): [FunctionCall] call to returnValue +# 1366| Type = [Struct] String +# 1366| ValueCategory = prvalue +# 1367| getStmt(1): [DeclStmt] declaration +# 1367| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rs +# 1367| Type = [LValueReferenceType] const String & +# 1367| getVariable().getInitializer(): [Initializer] initializer for rs +# 1367| getExpr(): [FunctionCall] call to returnValue +# 1367| Type = [Struct] String +# 1367| ValueCategory = prvalue +# 1367| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1367| Type = [LValueReferenceType] const String & +# 1367| ValueCategory = prvalue +# 1367| getExpr(): [CStyleCast] (const String)... +# 1367| Conversion = [GlvalueConversion] glvalue conversion +# 1367| Type = [SpecifiedType] const String +# 1367| ValueCategory = lvalue +# 1367| getExpr(): [TemporaryObjectExpr] temporary object +# 1367| Type = [Struct] String +# 1367| ValueCategory = lvalue +# 1369| getStmt(2): [ExprStmt] ExprStmt +# 1369| getExpr(): [FunctionCall] call to acceptRef +# 1369| Type = [VoidType] void +# 1369| ValueCategory = prvalue +# 1369| getArgument(0): [VariableAccess] s +# 1369| Type = [Struct] String +# 1369| ValueCategory = lvalue +# 1369| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 1369| Type = [LValueReferenceType] const String & +# 1369| ValueCategory = prvalue +# 1369| getExpr(): [CStyleCast] (const String)... +# 1369| Conversion = [GlvalueConversion] glvalue conversion +# 1369| Type = [SpecifiedType] const String +# 1369| ValueCategory = lvalue +# 1370| getStmt(3): [ExprStmt] ExprStmt +# 1370| getExpr(): [FunctionCall] call to acceptRef +# 1370| Type = [VoidType] void +# 1370| ValueCategory = prvalue +# 1370| getArgument(0): [ConstructorCall] call to String +# 1370| Type = [VoidType] void +# 1370| ValueCategory = prvalue +# 1370| getArgument(0): foo +# 1370| Type = [ArrayType] const char[4] +# 1370| Value = [StringLiteral] "foo" +# 1370| ValueCategory = lvalue +# 1370| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 1370| Type = [PointerType] const char * +# 1370| ValueCategory = prvalue +# 1370| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 1370| Type = [LValueReferenceType] const String & +# 1370| ValueCategory = prvalue +# 1370| getExpr(): [TemporaryObjectExpr] temporary object +# 1370| Type = [SpecifiedType] const String +# 1370| ValueCategory = lvalue +# 1371| getStmt(4): [ExprStmt] ExprStmt +# 1371| getExpr(): [FunctionCall] call to acceptValue +# 1371| Type = [VoidType] void +# 1371| ValueCategory = prvalue +# 1371| getArgument(0): [ConstructorCall] call to String +# 1371| Type = [VoidType] void +# 1371| ValueCategory = prvalue +# 1371| getArgument(0): [VariableAccess] s +# 1371| Type = [Struct] String +# 1371| ValueCategory = lvalue +# 1371| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 1371| Type = [LValueReferenceType] const String & +# 1371| ValueCategory = prvalue +# 1371| getExpr(): [CStyleCast] (const String)... +# 1371| Conversion = [GlvalueConversion] glvalue conversion +# 1371| Type = [SpecifiedType] const String +# 1371| ValueCategory = lvalue +# 1371| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1371| Type = [Struct] String +# 1371| ValueCategory = lvalue +# 1372| getStmt(5): [ExprStmt] ExprStmt +# 1372| getExpr(): [FunctionCall] call to acceptValue +# 1372| Type = [VoidType] void +# 1372| ValueCategory = prvalue +# 1372| getArgument(0): [ConstructorCall] call to String +# 1372| Type = [VoidType] void +# 1372| ValueCategory = prvalue +# 1372| getArgument(0): foo +# 1372| Type = [ArrayType] const char[4] +# 1372| Value = [StringLiteral] "foo" +# 1372| ValueCategory = lvalue +# 1372| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 1372| Type = [PointerType] const char * +# 1372| ValueCategory = prvalue +# 1372| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1372| Type = [Struct] String +# 1372| ValueCategory = lvalue +# 1373| getStmt(6): [ExprStmt] ExprStmt +# 1373| getExpr(): [FunctionCall] call to c_str +# 1373| Type = [PointerType] const char * +# 1373| ValueCategory = prvalue +# 1373| getQualifier(): [ConstructorCall] call to String +# 1373| Type = [VoidType] void +# 1373| ValueCategory = prvalue +# 1373| getQualifier().getFullyConverted(): [CStyleCast] (const String)... +# 1373| Conversion = [PrvalueAdjustmentConversion] prvalue adjustment conversion +# 1373| Type = [SpecifiedType] const String +# 1373| ValueCategory = prvalue +# 1373| getExpr(): [TemporaryObjectExpr] temporary object +# 1373| Type = [Struct] String +# 1373| ValueCategory = prvalue(load) +# 1374| getStmt(7): [ExprStmt] ExprStmt +# 1374| getExpr(): [FunctionCall] call to c_str +# 1374| Type = [PointerType] const char * +# 1374| ValueCategory = prvalue +# 1374| getQualifier(): [FunctionCall] call to returnValue +# 1374| Type = [Struct] String +# 1374| ValueCategory = prvalue +# 1374| getQualifier().getFullyConverted(): [CStyleCast] (const String)... +# 1374| Conversion = [PrvalueAdjustmentConversion] prvalue adjustment conversion +# 1374| Type = [SpecifiedType] const String +# 1374| ValueCategory = prvalue +# 1374| getExpr(): [TemporaryObjectExpr] temporary object +# 1374| Type = [Struct] String +# 1374| ValueCategory = prvalue(load) +# 1376| getStmt(8): [ExprStmt] ExprStmt +# 1376| getExpr(): [FunctionCall] call to defaultConstruct +# 1376| Type = [Struct] String +# 1376| ValueCategory = prvalue +# 1376| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1376| Type = [Struct] String +# 1376| ValueCategory = prvalue(load) +# 1377| getStmt(9): [ReturnStmt] return ... +# 1379| [TopLevelFunction] void temporary_destructor_only() +# 1379| : +# 1379| getEntryPoint(): [BlockStmt] { ... } +# 1380| getStmt(0): [DeclStmt] declaration +# 1380| getDeclarationEntry(0): [VariableDeclarationEntry] definition of d +# 1380| Type = [Class] destructor_only +# 1380| getVariable().getInitializer(): [Initializer] initializer for d +# 1380| getExpr(): [FunctionCall] call to returnValue +# 1380| Type = [Class] destructor_only +# 1380| ValueCategory = prvalue +# 1381| getStmt(1): [DeclStmt] declaration +# 1381| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rd +# 1381| Type = [LValueReferenceType] const destructor_only & +# 1381| getVariable().getInitializer(): [Initializer] initializer for rd +# 1381| getExpr(): [FunctionCall] call to returnValue +# 1381| Type = [Class] destructor_only +# 1381| ValueCategory = prvalue +# 1381| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1381| Type = [LValueReferenceType] const destructor_only & +# 1381| ValueCategory = prvalue +# 1381| getExpr(): [CStyleCast] (const destructor_only)... +# 1381| Conversion = [GlvalueConversion] glvalue conversion +# 1381| Type = [SpecifiedType] const destructor_only +# 1381| ValueCategory = lvalue +# 1381| getExpr(): [TemporaryObjectExpr] temporary object +# 1381| Type = [Class] destructor_only +# 1381| ValueCategory = lvalue +# 1382| getStmt(2): [DeclStmt] declaration +# 1382| getDeclarationEntry(0): [VariableDeclarationEntry] definition of d2 +# 1382| Type = [Class] destructor_only +# 1383| getStmt(3): [ExprStmt] ExprStmt +# 1383| getExpr(): [FunctionCall] call to acceptRef +# 1383| Type = [VoidType] void +# 1383| ValueCategory = prvalue +# 1383| getArgument(0): [VariableAccess] d +# 1383| Type = [Class] destructor_only +# 1383| ValueCategory = lvalue +# 1383| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 1383| Type = [LValueReferenceType] const destructor_only & +# 1383| ValueCategory = prvalue +# 1383| getExpr(): [CStyleCast] (const destructor_only)... +# 1383| Conversion = [GlvalueConversion] glvalue conversion +# 1383| Type = [SpecifiedType] const destructor_only +# 1383| ValueCategory = lvalue +# 1384| getStmt(4): [ExprStmt] ExprStmt +# 1384| getExpr(): [FunctionCall] call to acceptValue +# 1384| Type = [VoidType] void +# 1384| ValueCategory = prvalue +# 1384| getArgument(0): [VariableAccess] d +# 1384| Type = [Class] destructor_only +# 1384| ValueCategory = prvalue(load) +# 1384| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1384| Type = [Class] destructor_only +# 1384| ValueCategory = lvalue +# 1385| getStmt(5): [ExprStmt] ExprStmt +# 1385| getExpr(): [FunctionCall] call to method +# 1385| Type = [VoidType] void +# 1385| ValueCategory = prvalue +# 1385| getQualifier(): [Literal] 0 +# 1385| Type = [Class] destructor_only +# 1385| Value = [Literal] 0 +# 1385| ValueCategory = prvalue +# 1385| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1385| Type = [Class] destructor_only +# 1385| ValueCategory = prvalue(load) +# 1386| getStmt(6): [ExprStmt] ExprStmt +# 1386| getExpr(): [FunctionCall] call to method +# 1386| Type = [VoidType] void +# 1386| ValueCategory = prvalue +# 1386| getQualifier(): [FunctionCall] call to returnValue +# 1386| Type = [Class] destructor_only +# 1386| ValueCategory = prvalue +# 1386| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1386| Type = [Class] destructor_only +# 1386| ValueCategory = prvalue(load) +# 1388| getStmt(7): [ExprStmt] ExprStmt +# 1388| getExpr(): [FunctionCall] call to defaultConstruct +# 1388| Type = [Class] destructor_only +# 1388| ValueCategory = prvalue +# 1388| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1388| Type = [Class] destructor_only +# 1388| ValueCategory = prvalue(load) +# 1389| getStmt(8): [ReturnStmt] return ... +# 1391| [TopLevelFunction] void temporary_copy_constructor() +# 1391| : +# 1391| getEntryPoint(): [BlockStmt] { ... } +# 1392| getStmt(0): [DeclStmt] declaration +# 1392| getDeclarationEntry(0): [VariableDeclarationEntry] definition of d +# 1392| Type = [Class] copy_constructor +# 1392| getVariable().getInitializer(): [Initializer] initializer for d +# 1392| getExpr(): [FunctionCall] call to returnValue +# 1392| Type = [Class] copy_constructor +# 1392| ValueCategory = prvalue +# 1393| getStmt(1): [DeclStmt] declaration +# 1393| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rd +# 1393| Type = [LValueReferenceType] const copy_constructor & +# 1393| getVariable().getInitializer(): [Initializer] initializer for rd +# 1393| getExpr(): [FunctionCall] call to returnValue +# 1393| Type = [Class] copy_constructor +# 1393| ValueCategory = prvalue +# 1393| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1393| Type = [LValueReferenceType] const copy_constructor & +# 1393| ValueCategory = prvalue +# 1393| getExpr(): [CStyleCast] (const copy_constructor)... +# 1393| Conversion = [GlvalueConversion] glvalue conversion +# 1393| Type = [SpecifiedType] const copy_constructor +# 1393| ValueCategory = lvalue +# 1393| getExpr(): [TemporaryObjectExpr] temporary object +# 1393| Type = [Class] copy_constructor +# 1393| ValueCategory = lvalue +# 1394| getStmt(2): [DeclStmt] declaration +# 1394| getDeclarationEntry(0): [VariableDeclarationEntry] definition of d2 +# 1394| Type = [Class] copy_constructor +# 1394| getVariable().getInitializer(): [Initializer] initializer for d2 +# 1394| getExpr(): [ConstructorCall] call to copy_constructor +# 1394| Type = [VoidType] void +# 1394| ValueCategory = prvalue +# 1395| getStmt(3): [ExprStmt] ExprStmt +# 1395| getExpr(): [FunctionCall] call to acceptRef +# 1395| Type = [VoidType] void +# 1395| ValueCategory = prvalue +# 1395| getArgument(0): [VariableAccess] d +# 1395| Type = [Class] copy_constructor +# 1395| ValueCategory = lvalue +# 1395| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 1395| Type = [LValueReferenceType] const copy_constructor & +# 1395| ValueCategory = prvalue +# 1395| getExpr(): [CStyleCast] (const copy_constructor)... +# 1395| Conversion = [GlvalueConversion] glvalue conversion +# 1395| Type = [SpecifiedType] const copy_constructor +# 1395| ValueCategory = lvalue +# 1396| getStmt(4): [ExprStmt] ExprStmt +# 1396| getExpr(): [FunctionCall] call to acceptValue +# 1396| Type = [VoidType] void +# 1396| ValueCategory = prvalue +# 1396| getArgument(0): [ConstructorCall] call to copy_constructor +# 1396| Type = [VoidType] void +# 1396| ValueCategory = prvalue +# 1396| getArgument(0): [VariableAccess] d +# 1396| Type = [Class] copy_constructor +# 1396| ValueCategory = lvalue +# 1396| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 1396| Type = [LValueReferenceType] const copy_constructor & +# 1396| ValueCategory = prvalue +# 1396| getExpr(): [CStyleCast] (const copy_constructor)... +# 1396| Conversion = [GlvalueConversion] glvalue conversion +# 1396| Type = [SpecifiedType] const copy_constructor +# 1396| ValueCategory = lvalue +# 1396| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1396| Type = [Class] copy_constructor +# 1396| ValueCategory = lvalue +# 1397| getStmt(5): [ExprStmt] ExprStmt +# 1397| getExpr(): [FunctionCall] call to method +# 1397| Type = [VoidType] void +# 1397| ValueCategory = prvalue +# 1397| getQualifier(): [ConstructorCall] call to copy_constructor +# 1397| Type = [VoidType] void +# 1397| ValueCategory = prvalue +# 1397| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1397| Type = [Class] copy_constructor +# 1397| ValueCategory = prvalue(load) +# 1398| getStmt(6): [ExprStmt] ExprStmt +# 1398| getExpr(): [FunctionCall] call to method +# 1398| Type = [VoidType] void +# 1398| ValueCategory = prvalue +# 1398| getQualifier(): [FunctionCall] call to returnValue +# 1398| Type = [Class] copy_constructor +# 1398| ValueCategory = prvalue +# 1398| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1398| Type = [Class] copy_constructor +# 1398| ValueCategory = prvalue(load) +# 1399| getStmt(7): [ExprStmt] ExprStmt +# 1399| getExpr(): [FunctionCall] call to defaultConstruct +# 1399| Type = [Class] copy_constructor +# 1399| ValueCategory = prvalue +# 1399| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1399| Type = [Class] copy_constructor +# 1399| ValueCategory = prvalue(load) +# 1401| getStmt(8): [DeclStmt] declaration +# 1401| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y +# 1401| Type = [IntType] int +# 1401| getVariable().getInitializer(): [Initializer] initializer for y +# 1401| getExpr(): [ValueFieldAccess] y +# 1401| Type = [IntType] int +# 1401| ValueCategory = prvalue +# 1401| getQualifier(): [FunctionCall] call to returnValue +# 1401| Type = [Class] copy_constructor +# 1401| ValueCategory = prvalue +# 1401| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1401| Type = [Class] copy_constructor +# 1401| ValueCategory = prvalue(load) +# 1402| getStmt(9): [ReturnStmt] return ... +# 1404| [TopLevelFunction] void temporary_point() +# 1404| : +# 1404| getEntryPoint(): [BlockStmt] { ... } +# 1405| getStmt(0): [DeclStmt] declaration +# 1405| getDeclarationEntry(0): [VariableDeclarationEntry] definition of p +# 1405| Type = [Struct] Point +# 1405| getVariable().getInitializer(): [Initializer] initializer for p +# 1405| getExpr(): [FunctionCall] call to returnValue +# 1405| Type = [Struct] Point +# 1405| ValueCategory = prvalue +# 1406| getStmt(1): [DeclStmt] declaration +# 1406| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rp +# 1406| Type = [LValueReferenceType] const Point & +# 1406| getVariable().getInitializer(): [Initializer] initializer for rp +# 1406| getExpr(): [FunctionCall] call to returnValue +# 1406| Type = [Struct] Point +# 1406| ValueCategory = prvalue +# 1406| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1406| Type = [LValueReferenceType] const Point & +# 1406| ValueCategory = prvalue +# 1406| getExpr(): [CStyleCast] (const Point)... +# 1406| Conversion = [GlvalueConversion] glvalue conversion +# 1406| Type = [SpecifiedType] const Point +# 1406| ValueCategory = lvalue +# 1406| getExpr(): [TemporaryObjectExpr] temporary object +# 1406| Type = [Struct] Point +# 1406| ValueCategory = lvalue +# 1408| getStmt(2): [ExprStmt] ExprStmt +# 1408| getExpr(): [FunctionCall] call to acceptRef +# 1408| Type = [VoidType] void +# 1408| ValueCategory = prvalue +# 1408| getArgument(0): [VariableAccess] p +# 1408| Type = [Struct] Point +# 1408| ValueCategory = lvalue +# 1408| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 1408| Type = [LValueReferenceType] const Point & +# 1408| ValueCategory = prvalue +# 1408| getExpr(): [CStyleCast] (const Point)... +# 1408| Conversion = [GlvalueConversion] glvalue conversion +# 1408| Type = [SpecifiedType] const Point +# 1408| ValueCategory = lvalue +# 1409| getStmt(3): [ExprStmt] ExprStmt +# 1409| getExpr(): [FunctionCall] call to acceptValue +# 1409| Type = [VoidType] void +# 1409| ValueCategory = prvalue +# 1409| getArgument(0): [VariableAccess] p +# 1409| Type = [Struct] Point +# 1409| ValueCategory = prvalue(load) +# 1410| getStmt(4): [ExprStmt] ExprStmt +# 1410| getExpr(): [ValueFieldAccess] x +# 1410| Type = [IntType] int +# 1410| Value = [ValueFieldAccess] 0 +# 1410| ValueCategory = prvalue +# 1410| getQualifier(): [Literal] 0 +# 1410| Type = [Struct] Point +# 1410| Value = [Literal] 0 +# 1410| ValueCategory = prvalue +# 1410| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1410| Type = [Struct] Point +# 1410| ValueCategory = prvalue(load) +# 1411| getStmt(5): [DeclStmt] declaration +# 1411| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y +# 1411| Type = [IntType] int +# 1411| getVariable().getInitializer(): [Initializer] initializer for y +# 1411| getExpr(): [ValueFieldAccess] y +# 1411| Type = [IntType] int +# 1411| ValueCategory = prvalue +# 1411| getQualifier(): [FunctionCall] call to returnValue +# 1411| Type = [Struct] Point +# 1411| ValueCategory = prvalue +# 1413| getStmt(6): [ExprStmt] ExprStmt +# 1413| getExpr(): [FunctionCall] call to defaultConstruct +# 1413| Type = [Struct] Point +# 1413| ValueCategory = prvalue +# 1414| getStmt(7): [ReturnStmt] return ... +# 1416| [CopyAssignmentOperator] UnusualFields& UnusualFields::operator=(UnusualFields const&) +# 1416| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const UnusualFields & +# 1416| [Constructor] void UnusualFields::UnusualFields() +# 1416| : +# 1416| [CopyConstructor] void UnusualFields::UnusualFields(UnusualFields const&) +# 1416| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const UnusualFields & +# 1416| [MoveConstructor] void UnusualFields::UnusualFields(UnusualFields&&) +# 1416| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] UnusualFields && +# 1421| [TopLevelFunction] void temporary_unusual_fields() +# 1421| : +# 1421| getEntryPoint(): [BlockStmt] { ... } +# 1422| getStmt(0): [DeclStmt] declaration +# 1422| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rx +# 1422| Type = [LValueReferenceType] const int & +# 1422| getVariable().getInitializer(): [Initializer] initializer for rx +# 1422| getExpr(): [ValueFieldAccess] r +# 1422| Type = [LValueReferenceType] int & +# 1422| ValueCategory = prvalue +# 1422| getQualifier(): [FunctionCall] call to returnValue +# 1422| Type = [Struct] UnusualFields +# 1422| ValueCategory = prvalue +# 1422| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1422| Type = [LValueReferenceType] const int & +# 1422| ValueCategory = prvalue +# 1422| getExpr(): [CStyleCast] (const int)... +# 1422| Conversion = [GlvalueConversion] glvalue conversion +# 1422| Type = [SpecifiedType] const int +# 1422| ValueCategory = lvalue +# 1422| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1422| Type = [IntType] int +# 1422| ValueCategory = lvalue +# 1423| getStmt(1): [DeclStmt] declaration +# 1423| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x +# 1423| Type = [IntType] int +# 1423| getVariable().getInitializer(): [Initializer] initializer for x +# 1423| getExpr(): [ValueFieldAccess] r +# 1423| Type = [LValueReferenceType] int & +# 1423| ValueCategory = prvalue +# 1423| getQualifier(): [FunctionCall] call to returnValue +# 1423| Type = [Struct] UnusualFields +# 1423| ValueCategory = prvalue +# 1423| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1423| Type = [IntType] int +# 1423| ValueCategory = prvalue(load) +# 1425| getStmt(2): [DeclStmt] declaration +# 1425| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rf +# 1425| Type = [LValueReferenceType] const float & +# 1425| getVariable().getInitializer(): [Initializer] initializer for rf +# 1425| getExpr(): [ArrayExpr] access to array +# 1425| Type = [FloatType] float +# 1425| ValueCategory = lvalue +# 1425| getArrayBase(): [ValueFieldAccess] a +# 1425| Type = [ArrayType] float[10] +# 1425| ValueCategory = prvalue +# 1425| getQualifier(): [FunctionCall] call to returnValue +# 1425| Type = [Struct] UnusualFields +# 1425| ValueCategory = prvalue +# 1425| getArrayOffset(): [Literal] 3 +# 1425| Type = [IntType] int +# 1425| Value = [Literal] 3 +# 1425| ValueCategory = prvalue +# 1425| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 1425| Type = [PointerType] float * +# 1425| ValueCategory = prvalue +# 1425| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1425| Type = [LValueReferenceType] const float & +# 1425| ValueCategory = prvalue +# 1425| getExpr(): [CStyleCast] (const float)... +# 1425| Conversion = [GlvalueConversion] glvalue conversion +# 1425| Type = [SpecifiedType] const float +# 1425| ValueCategory = lvalue +# 1426| getStmt(3): [DeclStmt] declaration +# 1426| getDeclarationEntry(0): [VariableDeclarationEntry] definition of f +# 1426| Type = [FloatType] float +# 1426| getVariable().getInitializer(): [Initializer] initializer for f +# 1426| getExpr(): [ArrayExpr] access to array +# 1426| Type = [FloatType] float +# 1426| ValueCategory = prvalue(load) +# 1426| getArrayBase(): [ValueFieldAccess] a +# 1426| Type = [ArrayType] float[10] +# 1426| ValueCategory = prvalue +# 1426| getQualifier(): [FunctionCall] call to returnValue +# 1426| Type = [Struct] UnusualFields +# 1426| ValueCategory = prvalue +# 1426| getArrayOffset(): [Literal] 5 +# 1426| Type = [IntType] int +# 1426| Value = [Literal] 5 +# 1426| ValueCategory = prvalue +# 1426| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 1426| Type = [PointerType] float * +# 1426| ValueCategory = prvalue +# 1427| getStmt(4): [ReturnStmt] return ... +# 1429| [CopyAssignmentOperator] POD_Base& POD_Base::operator=(POD_Base const&) +# 1429| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const POD_Base & +# 1429| [MoveAssignmentOperator] POD_Base& POD_Base::operator=(POD_Base&&) +# 1429| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] POD_Base && +# 1432| [ConstMemberFunction] float POD_Base::f() const +# 1432| : +# 1435| [CopyAssignmentOperator] POD_Middle& POD_Middle::operator=(POD_Middle const&) +# 1435| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const POD_Middle & +# 1435| [MoveAssignmentOperator] POD_Middle& POD_Middle::operator=(POD_Middle&&) +# 1435| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] POD_Middle && +# 1435| [Constructor] void POD_Middle::POD_Middle() +# 1435| : +# 1439| [CopyAssignmentOperator] POD_Derived& POD_Derived::operator=(POD_Derived const&) +# 1439| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const POD_Derived & +# 1439| [MoveAssignmentOperator] POD_Derived& POD_Derived::operator=(POD_Derived&&) +# 1439| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] POD_Derived && +# 1439| [Constructor] void POD_Derived::POD_Derived() +# 1439| : +# 1443| [TopLevelFunction] void temporary_hierarchy() +# 1443| : +# 1443| getEntryPoint(): [BlockStmt] { ... } +# 1444| getStmt(0): [DeclStmt] declaration +# 1444| getDeclarationEntry(0): [VariableDeclarationEntry] definition of b +# 1444| Type = [Struct] POD_Base +# 1444| getVariable().getInitializer(): [Initializer] initializer for b +# 1444| getExpr(): [FunctionCall] call to returnValue +# 1444| Type = [Struct] POD_Middle +# 1444| ValueCategory = prvalue +# 1444| getExpr().getFullyConverted(): [CStyleCast] (POD_Base)... +# 1444| Conversion = [BaseClassConversion] base class conversion +# 1444| Type = [Struct] POD_Base +# 1444| ValueCategory = prvalue +# 1445| getStmt(1): [ExprStmt] ExprStmt +# 1445| getExpr(): [AssignExpr] ... = ... +# 1445| Type = [Struct] POD_Base +# 1445| ValueCategory = lvalue +# 1445| getLValue(): [VariableAccess] b +# 1445| Type = [Struct] POD_Base +# 1445| ValueCategory = lvalue +# 1445| getRValue(): [FunctionCall] call to returnValue +# 1445| Type = [Struct] POD_Derived +# 1445| ValueCategory = prvalue +# 1445| getRValue().getFullyConverted(): [CStyleCast] (POD_Base)... +# 1445| Conversion = [BaseClassConversion] base class conversion +# 1445| Type = [Struct] POD_Base +# 1445| ValueCategory = prvalue(load) +# 1445| getExpr(): [CStyleCast] (POD_Middle)... +# 1445| Conversion = [BaseClassConversion] base class conversion +# 1445| Type = [Struct] POD_Middle +# 1445| ValueCategory = lvalue +# 1445| getExpr(): [TemporaryObjectExpr] temporary object +# 1445| Type = [Struct] POD_Derived +# 1445| ValueCategory = lvalue +# 1445| getExpr(): [ParenthesisExpr] (...) +# 1445| Type = [Struct] POD_Derived +# 1445| ValueCategory = prvalue +# 1446| getStmt(2): [DeclStmt] declaration +# 1446| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x +# 1446| Type = [IntType] int +# 1446| getVariable().getInitializer(): [Initializer] initializer for x +# 1446| getExpr(): [ValueFieldAccess] x +# 1446| Type = [IntType] int +# 1446| ValueCategory = prvalue +# 1446| getQualifier(): [FunctionCall] call to returnValue +# 1446| Type = [Struct] POD_Derived +# 1446| ValueCategory = prvalue +# 1446| getQualifier().getFullyConverted(): [CStyleCast] (POD_Base)... +# 1446| Conversion = [BaseClassConversion] base class conversion +# 1446| Type = [Struct] POD_Base +# 1446| ValueCategory = prvalue +# 1446| getExpr(): [CStyleCast] (POD_Middle)... +# 1446| Conversion = [BaseClassConversion] base class conversion +# 1446| Type = [Struct] POD_Middle +# 1446| ValueCategory = prvalue +# 1447| getStmt(3): [DeclStmt] declaration +# 1447| getDeclarationEntry(0): [VariableDeclarationEntry] definition of f +# 1447| Type = [FloatType] float +# 1447| getVariable().getInitializer(): [Initializer] initializer for f +# 1447| getExpr(): [FunctionCall] call to f +# 1447| Type = [FloatType] float +# 1447| ValueCategory = prvalue +# 1447| getQualifier(): [FunctionCall] call to returnValue +# 1447| Type = [Struct] POD_Derived +# 1447| ValueCategory = prvalue +# 1447| getQualifier().getFullyConverted(): [CStyleCast] (const POD_Base)... +# 1447| Conversion = [BaseClassConversion] base class conversion +# 1447| Type = [SpecifiedType] const POD_Base +# 1447| ValueCategory = prvalue +# 1447| getExpr(): [CStyleCast] (POD_Middle)... +# 1447| Conversion = [BaseClassConversion] base class conversion +# 1447| Type = [Struct] POD_Middle +# 1447| ValueCategory = prvalue +# 1447| getExpr(): [ParenthesisExpr] (...) +# 1447| Type = [Struct] POD_Derived +# 1447| ValueCategory = prvalue +# 1448| getStmt(4): [ReturnStmt] return ... perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| : From 69dee154f3aa9efd1bf5f71b3965a3f07254e898 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Sat, 31 Oct 2020 09:03:51 -0400 Subject: [PATCH 51/53] Fix PR feedback --- .../library-tests/ir/ir/PrintAST.expected | 3 ++ .../test/library-tests/ir/ir/raw_ir.expected | 37 ++++++++++--------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 174600da96da..44d379e46fef 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -6035,6 +6035,9 @@ ir.cpp: # 716| Type = [LongType] long # 716| Value = [Literal] 0 # 716| ValueCategory = prvalue +# 716| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 716| Type = [LongType] long +# 716| ValueCategory = prvalue(load) # 720| [TopLevelFunction] double CallNestedTemplateFunc() # 720| : # 720| getEntryPoint(): [BlockStmt] { ... } diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 546b77fa383e..a080bfc3b9d2 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -3824,23 +3824,26 @@ ir.cpp: # 715| long Outer::Func(void*, char) # 715| Block 0 -# 715| v715_1(void) = EnterFunction : -# 715| mu715_2(unknown) = AliasedDefinition : -# 715| mu715_3(unknown) = InitializeNonLocal : -# 715| r715_4(glval) = VariableAddress[x] : -# 715| mu715_5(void *) = InitializeParameter[x] : &:r715_4 -# 715| r715_6(void *) = Load[x] : &:r715_4, ~m? -# 715| mu715_7(unknown) = InitializeIndirection[x] : &:r715_6 -# 715| r715_8(glval) = VariableAddress[y] : -# 715| mu715_9(char) = InitializeParameter[y] : &:r715_8 -# 716| r716_1(glval) = VariableAddress[#return] : -# 716| r716_2(long) = Constant[0] : -# 716| mu716_3(long) = Store[#return] : &:r716_1, r716_2 -# 715| v715_10(void) = ReturnIndirection[x] : &:r715_6, ~m? -# 715| r715_11(glval) = VariableAddress[#return] : -# 715| v715_12(void) = ReturnValue : &:r715_11, ~m? -# 715| v715_13(void) = AliasedUse : ~m? -# 715| v715_14(void) = ExitFunction : +# 715| v715_1(void) = EnterFunction : +# 715| mu715_2(unknown) = AliasedDefinition : +# 715| mu715_3(unknown) = InitializeNonLocal : +# 715| r715_4(glval) = VariableAddress[x] : +# 715| mu715_5(void *) = InitializeParameter[x] : &:r715_4 +# 715| r715_6(void *) = Load[x] : &:r715_4, ~m? +# 715| mu715_7(unknown) = InitializeIndirection[x] : &:r715_6 +# 715| r715_8(glval) = VariableAddress[y] : +# 715| mu715_9(char) = InitializeParameter[y] : &:r715_8 +# 716| r716_1(glval) = VariableAddress[#return] : +# 716| r716_2(glval) = VariableAddress[#temp716:12] : +# 716| r716_3(long) = Constant[0] : +# 716| mu716_4(long) = Store[#temp716:12] : &:r716_2, r716_3 +# 716| r716_5(long) = Load[#temp716:12] : &:r716_2, ~m? +# 716| mu716_6(long) = Store[#return] : &:r716_1, r716_5 +# 715| v715_10(void) = ReturnIndirection[x] : &:r715_6, ~m? +# 715| r715_11(glval) = VariableAddress[#return] : +# 715| v715_12(void) = ReturnValue : &:r715_11, ~m? +# 715| v715_13(void) = AliasedUse : ~m? +# 715| v715_14(void) = ExitFunction : # 720| double CallNestedTemplateFunc() # 720| Block 0 From 0d1fbd1bdcbf3fe450b18ff0869ea56e90de9b33 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Mon, 2 Nov 2020 18:03:40 -0500 Subject: [PATCH 52/53] Fix annotations --- cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp index 0f3a371c67c9..cf02b3fa967d 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp @@ -84,10 +84,10 @@ void test_pair() sink(make_pair("123", "456").first); sink(make_pair("123", "456").second); sink(make_pair(source(), "456")); // tainted [NOT DETECTED] - sink(make_pair(source(), "456").first); // tainted [NOT DETECTED] + sink(make_pair(source(), "456").first); // tainted sink(make_pair(source(), "456").second); sink(make_pair("123", source())); // tainted - sink(make_pair("123", source()).first); // [FALSE POSITIVE] + sink(make_pair("123", source()).first); sink(make_pair("123", source()).second); // tainted std::pair, char *> m; From 4cc9110dbd6ff61122da039ee65dac6c94075457 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Tue, 3 Nov 2020 13:39:33 -0500 Subject: [PATCH 53/53] Fix test expectation --- cpp/ql/test/library-tests/question_mark_colon/cfg.expected | 1 + 1 file changed, 1 insertion(+) diff --git a/cpp/ql/test/library-tests/question_mark_colon/cfg.expected b/cpp/ql/test/library-tests/question_mark_colon/cfg.expected index 82cda5c6f84c..9fa6fa1b53b9 100644 --- a/cpp/ql/test/library-tests/question_mark_colon/cfg.expected +++ b/cpp/ql/test/library-tests/question_mark_colon/cfg.expected @@ -1,3 +1,4 @@ +| 0 | 1 | file://:0:0:0:0 | temporary object | None | | 2 | 1 | question_mark_colon.c:2:7:2:7 | f | None | | 4 | 1 | question_mark_colon.c:4:14:8:1 | { ... } | declaration | | 4 | 17 | question_mark_colon.c:4:6:4:6 | g | None |