Skip to content

Commit 05ae04d

Browse files
author
AndreiDiaconu1
committed
Synced files
1 parent 66948b4 commit 05ae04d

File tree

2 files changed

+31
-8
lines changed

2 files changed

+31
-8
lines changed

csharp/ql/src/semmle/code/csharp/ir/implementation/Opcode.qll

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ private newtype TOpcode =
5858
TUnmodeledUse() or
5959
TAliasedDefinition() or
6060
TPhi() or
61+
TBuiltIn() or
6162
TVarArgsStart() or
6263
TVarArgsEnd() or
6364
TVarArg() or
@@ -117,7 +118,7 @@ abstract class CatchOpcode extends Opcode {}
117118

118119
abstract class OpcodeWithCondition extends Opcode {}
119120

120-
abstract class BuiltInOpcode extends Opcode {}
121+
abstract class BuiltInOperationOpcode extends Opcode {}
121122

122123
abstract class SideEffectOpcode extends Opcode {}
123124

@@ -207,10 +208,11 @@ module Opcode {
207208
class UnmodeledUse extends Opcode, TUnmodeledUse { override final string toString() { result = "UnmodeledUse" } }
208209
class AliasedDefinition extends Opcode, TAliasedDefinition { override final string toString() { result = "AliasedDefinition" } }
209210
class Phi extends Opcode, TPhi { override final string toString() { result = "Phi" } }
210-
class VarArgsStart extends BuiltInOpcode, TVarArgsStart { override final string toString() { result = "VarArgsStart" } }
211-
class VarArgsEnd extends BuiltInOpcode, TVarArgsEnd { override final string toString() { result = "VarArgsEnd" } }
212-
class VarArg extends BuiltInOpcode, TVarArg { override final string toString() { result = "VarArg" } }
213-
class VarArgCopy extends BuiltInOpcode, TVarArgCopy { override final string toString() { result = "VarArgCopy" } }
211+
class BuiltIn extends BuiltInOperationOpcode, TBuiltIn { override final string toString() { result = "BuiltIn" } }
212+
class VarArgsStart extends BuiltInOperationOpcode, TVarArgsStart { override final string toString() { result = "VarArgsStart" } }
213+
class VarArgsEnd extends BuiltInOperationOpcode, TVarArgsEnd { override final string toString() { result = "VarArgsEnd" } }
214+
class VarArg extends BuiltInOperationOpcode, TVarArg { override final string toString() { result = "VarArg" } }
215+
class VarArgCopy extends BuiltInOperationOpcode, TVarArgCopy { override final string toString() { result = "VarArgCopy" } }
214216
class CallSideEffect extends MayWriteSideEffectOpcode, TCallSideEffect { override final string toString() { result = "CallSideEffect" } }
215217
class CallReadSideEffect extends ReadSideEffectOpcode, TCallReadSideEffect { override final string toString() { result = "CallReadSideEffect" } }
216218
class IndirectReadSideEffect extends ReadSideEffectOpcode, MemoryAccessOpcode, TIndirectReadSideEffect { override final string toString() { result = "IndirectReadSideEffect" } }

csharp/ql/src/semmle/code/csharp/ir/implementation/raw/Instruction.qll

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ module InstructionSanity {
7171
operand.getOperandTag() = tag) and
7272
not expectsOperand(instr, tag) and
7373
not (instr instanceof CallInstruction and tag instanceof ArgumentOperandTag) and
74-
not (instr instanceof BuiltInInstruction and tag instanceof PositionalArgumentOperandTag) and
74+
not (instr instanceof BuiltInOperationInstruction and tag instanceof PositionalArgumentOperandTag) and
7575
not (instr instanceof InlineAsmInstruction and tag instanceof AsmOperandTag)
7676
}
7777

@@ -1831,8 +1831,29 @@ class UnreachedInstruction extends Instruction {
18311831
* An instruction representing a built-in operation. This is used to represent
18321832
* operations such as access to variable argument lists.
18331833
*/
1834-
class BuiltInInstruction extends Instruction {
1834+
class BuiltInOperationInstruction extends Instruction {
1835+
Language::BuiltInOperation operation;
1836+
1837+
BuiltInOperationInstruction() {
1838+
getOpcode() instanceof BuiltInOperationOpcode and
1839+
operation = Construction::getInstructionBuiltInOperation(this)
1840+
}
1841+
1842+
final Language::BuiltInOperation getBuiltInOperation() {
1843+
result = operation
1844+
}
1845+
}
1846+
1847+
/**
1848+
* An instruction representing a built-in operation that does not have a specific opcode. The
1849+
* actual operation is specified by the `getBuiltInOperation()` predicate.
1850+
*/
1851+
class BuiltInInstruction extends BuiltInOperationInstruction {
18351852
BuiltInInstruction() {
1836-
getOpcode() instanceof BuiltInOpcode
1853+
getOpcode() instanceof Opcode::BuiltIn
1854+
}
1855+
1856+
override final string getImmediateString() {
1857+
result = getBuiltInOperation().toString()
18371858
}
18381859
}

0 commit comments

Comments
 (0)