C++/C#: Blob -> Opaque

This commit is contained in:
Dave Bartolomeo
2019-10-18 12:51:25 -07:00
parent 6e61b1dcd0
commit 8ec15933f5
9 changed files with 71 additions and 71 deletions

View File

@@ -28,8 +28,8 @@ private newtype TIRType =
TIRFunctionAddressType(int byteSize) {
Language::hasFunctionAddressType(byteSize)
} or
TIRBlobType(Language::BlobTypeTag tag, int byteSize) {
Language::hasBlobType(tag, byteSize)
TIROpaqueType(Language::OpaqueTypeTag tag, int byteSize) {
Language::hasOpaqueType(tag, byteSize)
}
/**
@@ -118,7 +118,7 @@ private class IRSizedType extends IRType {
this = TIRFloatingPointType(byteSize) or
this = TIRAddressType(byteSize) or
this = TIRFunctionAddressType(byteSize) or
this = TIRBlobType(_, byteSize)
this = TIROpaqueType(_, byteSize)
}
final override int getByteSize() { result = byteSize }
@@ -212,30 +212,30 @@ class IRFunctionAddressType extends IRSizedType, TIRFunctionAddressType {
* A type with known size that does not fit any of the other kinds of type. Used to represent
* classes, structs, unions, fixed-size arrays, pointers-to-member, and more.
*/
class IRBlobType extends IRSizedType, TIRBlobType {
Language::BlobTypeTag tag;
class IROpaqueType extends IRSizedType, TIROpaqueType {
Language::OpaqueTypeTag tag;
IRBlobType() {
this = TIRBlobType(tag, byteSize)
IROpaqueType() {
this = TIROpaqueType(tag, byteSize)
}
final override string toString() {
result = "blob" + byteSize.toString() + "{" + tag.toString() + "}"
result = "opaque" + byteSize.toString() + "{" + tag.toString() + "}"
}
final override string getIdentityString() {
result = "blob" + byteSize.toString() + "{" + Language::getBlobTagIdentityString(tag) + "}"
result = "opaque" + byteSize.toString() + "{" + Language::getOpaqueTagIdentityString(tag) + "}"
}
final override Language::LanguageType getCanonicalLanguageType() {
result = Language::getCanonicalBlobType(tag, byteSize)
result = Language::getCanonicalOpaqueType(tag, byteSize)
}
/**
* Gets the "tag" that differentiates this type from other incompatible blob types that have the
* Gets the "tag" that differentiates this type from other incompatible opaque types that have the
* same size.
*/
final Language::BlobTypeTag getTag() { result = tag }
final Language::OpaqueTypeTag getTag() { result = tag }
}
module IRTypeSanity {

View File

@@ -304,9 +304,9 @@ private module Cached {
}
cached
predicate needsUnknownBlobType(int byteSize) {
predicate needsUnknownOpaqueType(int byteSize) {
exists(TranslatedElement element |
element.needsUnknownBlobType(byteSize)
element.needsUnknownOpaqueType(byteSize)
)
}

View File

@@ -616,7 +616,7 @@ abstract class TranslatedElement extends TTranslatedElement {
*/
int getInstructionResultSize(InstructionTag tag) { none() }
predicate needsUnknownBlobType(int byteSize) { none() }
predicate needsUnknownOpaqueType(int byteSize) { none() }
/**
* If the instruction specified by `tag` is a `StringConstantInstruction`,

View File

@@ -205,7 +205,7 @@ class TranslatedStringLiteralInitialization extends TranslatedDirectInitializati
// space in the target array.
tag = ZeroPadStringConstantTag() and
opcode instanceof Opcode::Constant and
resultType = getUnknownBlobType(elementCount * getElementType().getSize())
resultType = getUnknownOpaqueType(elementCount * getElementType().getSize())
or
// The index of the first element to be zero initialized.
tag = ZeroPadStringElementIndexTag() and
@@ -220,7 +220,7 @@ class TranslatedStringLiteralInitialization extends TranslatedDirectInitializati
// Store the constant zero into the remainder of the string.
tag = ZeroPadStringStoreTag() and
opcode instanceof Opcode::Store and
resultType = getUnknownBlobType(elementCount * getElementType().getSize())
resultType = getUnknownOpaqueType(elementCount * getElementType().getSize())
)
)
}
@@ -314,7 +314,7 @@ class TranslatedStringLiteralInitialization extends TranslatedDirectInitializati
)
}
override predicate needsUnknownBlobType(int byteSize) {
override predicate needsUnknownOpaqueType(int byteSize) {
exists(int elementCount |
zeroInitRange(_, elementCount) and
byteSize = elementCount * getElementType().getSize()
@@ -704,7 +704,7 @@ class TranslatedElementValueInitialization extends TranslatedElementInitializati
override int getElementIndex() { result = elementIndex }
override predicate needsUnknownBlobType(int byteSize) {
override predicate needsUnknownOpaqueType(int byteSize) {
elementCount != 0 and byteSize = elementCount * getElementType().getSize()
}
@@ -720,7 +720,7 @@ class TranslatedElementValueInitialization extends TranslatedElementInitializati
if elementCount = 1 then
result = getTypeForPRValue(getElementType())
else
result = getUnknownBlobType(elementCount * getElementType().getSize())
result = getUnknownOpaqueType(elementCount * getElementType().getSize())
}
}

View File

@@ -119,7 +119,7 @@ predicate hasFunctionAddressType(int byteSize) {
byteSize = getTypeSize(any(FunctionPointerIshType type))
}
private predicate isBlobType(Type type) {
private predicate isOpaqueType(Type type) {
(
exists(type.getSize()) and // Only include complete types
(
@@ -132,12 +132,12 @@ private predicate isBlobType(Type type) {
}
/**
* Holds if an `IRBlobType` with the specified `tag` and `byteSize` should exist.
* Holds if an `IROpaqueType` with the specified `tag` and `byteSize` should exist.
*/
predicate hasBlobType(Type tag, int byteSize) {
isBlobType(tag) and byteSize = getTypeSize(tag)
predicate hasOpaqueType(Type tag, int byteSize) {
isOpaqueType(tag) and byteSize = getTypeSize(tag)
or
tag instanceof UnknownType and IRConstruction::needsUnknownBlobType(byteSize)
tag instanceof UnknownType and IRConstruction::needsUnknownOpaqueType(byteSize)
}
/**
@@ -147,11 +147,11 @@ private IRType getIRTypeForPRValue(Type type) {
exists(Type unspecifiedType |
unspecifiedType = type.getUnspecifiedType() |
(
isBlobType(unspecifiedType) and
exists(IRBlobType blobType |
blobType = result |
blobType.getByteSize() = getTypeSize(type) and
blobType.getTag() = unspecifiedType
isOpaqueType(unspecifiedType) and
exists(IROpaqueType opaqueType |
opaqueType = result |
opaqueType.getByteSize() = getTypeSize(type) and
opaqueType.getTag() = unspecifiedType
)
) or
unspecifiedType instanceof BoolType and result.(IRBooleanType).getByteSize() = type.getSize() or
@@ -174,8 +174,8 @@ private newtype TCppType =
TGLValueAddressType(Type type) {
any()
} or
TUnknownBlobType(int byteSize) {
IRConstruction::needsUnknownBlobType(byteSize)
TUnknownOpaqueType(int byteSize) {
IRConstruction::needsUnknownOpaqueType(byteSize)
} or
TUnknownType()
@@ -253,18 +253,18 @@ private class CppPRValueType extends CppWrappedType, TPRValueType {
* occur in certain cases during IR construction, such as the type of a zero-initialized segment of
* a partially-initialized array.
*/
private class CppUnknownBlobType extends CppType, TUnknownBlobType {
private class CppUnknownOpaqueType extends CppType, TUnknownOpaqueType {
int byteSize;
CppUnknownBlobType() {
this = TUnknownBlobType(byteSize)
CppUnknownOpaqueType() {
this = TUnknownOpaqueType(byteSize)
}
override final string toString() {
result = "unknown[" + byteSize.toString() + "]"
}
override final IRBlobType getIRType() {
override final IROpaqueType getIRType() {
result.getByteSize() = byteSize
}
@@ -397,9 +397,9 @@ CppFunctionGLValueType getFunctionGLValueType() {
}
/**
* Gets the `CppType` that represents a blob of unknown type with size `byteSize`.
* Gets the `CppType` that represents a opaque of unknown type with size `byteSize`.
*/
CppUnknownBlobType getUnknownBlobType(int byteSize) {
CppUnknownOpaqueType getUnknownOpaqueType(int byteSize) {
result.getByteSize() = byteSize
}
@@ -512,22 +512,22 @@ CppPRValueType getCanonicalVoidType() {
}
/**
* Gets the `CppType` that is the canonical type for an `IRBlobType` with the specified `tag` and
* Gets the `CppType` that is the canonical type for an `IROpaqueType` with the specified `tag` and
* `byteSize`.
*/
CppType getCanonicalBlobType(Type tag, int byteSize) {
isBlobType(tag) and
CppType getCanonicalOpaqueType(Type tag, int byteSize) {
isOpaqueType(tag) and
result = TPRValueType(tag.getUnspecifiedType()) and
getTypeSize(tag) = byteSize
or
tag instanceof UnknownType and result = getUnknownBlobType(byteSize)
tag instanceof UnknownType and result = getUnknownOpaqueType(byteSize)
}
/**
* Gets a string that uniquely identifies an `IRBlobType` tag. This may be different from the usual
* Gets a string that uniquely identifies an `IROpaqueType` tag. This may be different from the usual
* `toString()` of the tag in order to ensure uniqueness.
*/
string getBlobTagIdentityString(Type tag) {
hasBlobType(tag, _) and
string getOpaqueTagIdentityString(Type tag) {
hasOpaqueType(tag, _) and
result = getTypeIdentityString(tag)
}

View File

@@ -7,7 +7,7 @@ import CppType
class LanguageType = CppType;
class BlobTypeTag = Cpp::Type;
class OpaqueTypeTag = Cpp::Type;
class Function = Cpp::Function;

View File

@@ -28,8 +28,8 @@ private newtype TIRType =
TIRFunctionAddressType(int byteSize) {
Language::hasFunctionAddressType(byteSize)
} or
TIRBlobType(Language::BlobTypeTag tag, int byteSize) {
Language::hasBlobType(tag, byteSize)
TIROpaqueType(Language::OpaqueTypeTag tag, int byteSize) {
Language::hasOpaqueType(tag, byteSize)
}
/**
@@ -118,7 +118,7 @@ private class IRSizedType extends IRType {
this = TIRFloatingPointType(byteSize) or
this = TIRAddressType(byteSize) or
this = TIRFunctionAddressType(byteSize) or
this = TIRBlobType(_, byteSize)
this = TIROpaqueType(_, byteSize)
}
final override int getByteSize() { result = byteSize }
@@ -212,30 +212,30 @@ class IRFunctionAddressType extends IRSizedType, TIRFunctionAddressType {
* A type with known size that does not fit any of the other kinds of type. Used to represent
* classes, structs, unions, fixed-size arrays, pointers-to-member, and more.
*/
class IRBlobType extends IRSizedType, TIRBlobType {
Language::BlobTypeTag tag;
class IROpaqueType extends IRSizedType, TIROpaqueType {
Language::OpaqueTypeTag tag;
IRBlobType() {
this = TIRBlobType(tag, byteSize)
IROpaqueType() {
this = TIROpaqueType(tag, byteSize)
}
final override string toString() {
result = "blob" + byteSize.toString() + "{" + tag.toString() + "}"
result = "opaque" + byteSize.toString() + "{" + tag.toString() + "}"
}
final override string getIdentityString() {
result = "blob" + byteSize.toString() + "{" + Language::getBlobTagIdentityString(tag) + "}"
result = "opaque" + byteSize.toString() + "{" + Language::getOpaqueTagIdentityString(tag) + "}"
}
final override Language::LanguageType getCanonicalLanguageType() {
result = Language::getCanonicalBlobType(tag, byteSize)
result = Language::getCanonicalOpaqueType(tag, byteSize)
}
/**
* Gets the "tag" that differentiates this type from other incompatible blob types that have the
* Gets the "tag" that differentiates this type from other incompatible opaque types that have the
* same size.
*/
final Language::BlobTypeTag getTag() { result = tag }
final Language::OpaqueTypeTag getTag() { result = tag }
}
module IRTypeSanity {

View File

@@ -108,17 +108,17 @@ private int getContentSize(ValueOrRefType type) {
)
}
private predicate isBlobType(ValueOrRefType type) {
private predicate isOpaqueType(ValueOrRefType type) {
type instanceof Struct or
type instanceof NullableType or
type instanceof DecimalType
}
/**
* Holds if an `IRBlobType` with the specified `tag` and `byteSize` should exist.
* Holds if an `IROpaqueType` with the specified `tag` and `byteSize` should exist.
*/
predicate hasBlobType(Type tag, int byteSize) {
isBlobType(tag) and byteSize = getTypeSize(tag)
predicate hasOpaqueType(Type tag, int byteSize) {
isOpaqueType(tag) and byteSize = getTypeSize(tag)
}
private Type getRepresentationType(Type type) {
@@ -135,10 +135,10 @@ private Type getRepresentationType(Type type) {
private IRType getIRTypeForPRValue(Type type) {
exists(Type repType |
repType = getRepresentationType(type) |
exists(IRBlobType blobType |
blobType = result |
blobType.getByteSize() = getTypeSize(repType) and
blobType.getTag() = repType
exists(IROpaqueType opaqueType |
opaqueType = result |
opaqueType.getByteSize() = getTypeSize(repType) and
opaqueType.getTag() = repType
)
or
result.(IRBooleanType).getByteSize() = repType.(BoolType).getSize()
@@ -159,7 +159,7 @@ private IRType getIRTypeForPRValue(Type type) {
)
}
string getBlobTagIdentityString(Type tag) {
string getOpaqueTagIdentityString(Type tag) {
result = tag.getQualifiedName()
}
@@ -412,11 +412,11 @@ CSharpPRValueType getCanonicalVoidType() {
}
/**
* Gets the `CSharpType` that is the canonical type for an `IRBlobType` with the specified `tag` and
* Gets the `CSharpType` that is the canonical type for an `IROpaqueType` with the specified `tag` and
* `byteSize`.
*/
CSharpPRValueType getCanonicalBlobType(Type tag, int byteSize) {
isBlobType(tag) and
CSharpPRValueType getCanonicalOpaqueType(Type tag, int byteSize) {
isOpaqueType(tag) and
result = TPRValueType(tag) and
getTypeSize(tag) = byteSize
}

View File

@@ -3,7 +3,7 @@ private import IRUtilities
import CSharpType
class LanguageType = CSharpType;
class BlobTypeTag = CSharp::ValueOrRefType;
class OpaqueTypeTag = CSharp::ValueOrRefType;
class Function = CSharp::Callable;