More stringently verify expected alignment of fields in hidl compound types.
Bug: 33846034
Test: make
Change-Id: Iaadddeabe04e0c721aa9398a1bb748fd6adcac51
diff --git a/ArrayType.cpp b/ArrayType.cpp
index b47ba3b..8b75c94 100644
--- a/ArrayType.cpp
+++ b/ArrayType.cpp
@@ -504,6 +504,10 @@
return mElementType->isJavaCompatible();
}
+bool ArrayType::containsPointer() const {
+ return mElementType->containsPointer();
+}
+
void ArrayType::getAlignmentAndSize(size_t *align, size_t *size) const {
mElementType->getAlignmentAndSize(align, size);
diff --git a/ArrayType.h b/ArrayType.h
index a0c2a08..ae58d28 100644
--- a/ArrayType.h
+++ b/ArrayType.h
@@ -125,6 +125,7 @@
status_t emitVtsTypeDeclarations(Formatter &out) const override;
bool isJavaCompatible() const override;
+ bool containsPointer() const override;
void getAlignmentAndSize(size_t *align, size_t *size) const override;
diff --git a/CompoundType.cpp b/CompoundType.cpp
index 332bada..25f0f8b 100644
--- a/CompoundType.cpp
+++ b/CompoundType.cpp
@@ -345,7 +345,7 @@
Scope::emitTypeDeclarations(out);
- if (!isJavaCompatible()) {
+ if (containsPointer()) {
for (const auto &field : *mFields) {
out << field->type().getCppStackType()
<< " "
@@ -387,7 +387,9 @@
<< ", \"wrong offset\");\n";
}
- offset += fieldSize;
+ if (mStyle == STYLE_STRUCT) {
+ offset += fieldSize;
+ }
}
if (pass == 0) {
@@ -1049,8 +1051,23 @@
return true;
}
+bool CompoundType::containsPointer() const {
+ if (Scope::containsPointer()) {
+ return true;
+ }
+
+ for (const auto &field : *mFields) {
+ if (field->type().containsPointer()) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
void CompoundType::getAlignmentAndSize(size_t *align, size_t *size) const {
*align = 1;
+ *size = 0;
size_t offset = 0;
for (const auto &field : *mFields) {
@@ -1066,20 +1083,26 @@
offset += fieldAlign - pad;
}
- offset += fieldSize;
+ if (mStyle == STYLE_STRUCT) {
+ offset += fieldSize;
+ } else {
+ *size = std::max(*size, fieldSize);
+ }
if (fieldAlign > (*align)) {
*align = fieldAlign;
}
}
- // Final padding to account for the structure's alignment.
- size_t pad = offset % (*align);
- if (pad > 0) {
- offset += (*align) - pad;
+ if (mStyle == STYLE_STRUCT) {
+ *size = offset;
}
- *size = offset;
+ // Final padding to account for the structure's alignment.
+ size_t pad = (*size) % (*align);
+ if (pad > 0) {
+ (*size) += (*align) - pad;
+ }
if (*size == 0) {
// An empty struct still occupies a byte of space in C++.
diff --git a/CompoundType.h b/CompoundType.h
index f761933..aa395ba 100644
--- a/CompoundType.h
+++ b/CompoundType.h
@@ -128,6 +128,7 @@
status_t emitVtsAttributeType(Formatter &out) const override;
bool isJavaCompatible() const override;
+ bool containsPointer() const override;
void getAlignmentAndSize(size_t *align, size_t *size) const;
diff --git a/FmqType.cpp b/FmqType.cpp
index 221a47a..989f613 100644
--- a/FmqType.cpp
+++ b/FmqType.cpp
@@ -137,6 +137,12 @@
return false;
}
+void FmqType::getAlignmentAndSize(
+ size_t *align, size_t *size) const {
+ *align = 8; // MQDescriptor<>
+ *size = 32;
+}
+
bool FmqType::needsEmbeddedReadWrite() const {
return true;
}
diff --git a/FmqType.h b/FmqType.h
index d243e55..d0ce997 100644
--- a/FmqType.h
+++ b/FmqType.h
@@ -56,6 +56,8 @@
bool isJavaCompatible() const override;
+ void getAlignmentAndSize(size_t *align, size_t *size) const override;
+
bool needsEmbeddedReadWrite() const override;
bool resultNeedsDeref() const override;
bool isCompatibleElementType(Type *elementType) const override;
diff --git a/HandleType.cpp b/HandleType.cpp
index 5c8059e..10c5f57 100644
--- a/HandleType.cpp
+++ b/HandleType.cpp
@@ -160,7 +160,8 @@
}
void HandleType::getAlignmentAndSize(size_t *align, size_t *size) const {
- *align = *size = 8;
+ *align = 8; // hidl_handle
+ *size = 16;
}
status_t HandleType::emitVtsTypeDeclarations(Formatter &out) const {
diff --git a/MemoryType.cpp b/MemoryType.cpp
index 3243cd4..614f368 100644
--- a/MemoryType.cpp
+++ b/MemoryType.cpp
@@ -141,7 +141,8 @@
}
void MemoryType::getAlignmentAndSize(size_t *align, size_t *size) const {
- *align = *size = 8;
+ *align = 8; // hidl_memory
+ *size = 40;
}
status_t MemoryType::emitVtsTypeDeclarations(Formatter &out) const {
diff --git a/PointerType.cpp b/PointerType.cpp
index 8349cfd..058141f 100644
--- a/PointerType.cpp
+++ b/PointerType.cpp
@@ -66,8 +66,8 @@
return false;
}
-void PointerType::getAlignmentAndSize(size_t *align, size_t *size) const {
- *align = *size = 0; // this object should only be used in passthrough mode
+bool PointerType::containsPointer() const {
+ return true;
}
status_t PointerType::emitVtsTypeDeclarations(Formatter &out) const {
diff --git a/PointerType.h b/PointerType.h
index cd0f839..415ba9f 100644
--- a/PointerType.h
+++ b/PointerType.h
@@ -49,8 +49,7 @@
bool resultNeedsDeref() const override;
bool isJavaCompatible() const override;
-
- void getAlignmentAndSize(size_t *align, size_t *size) const override;
+ bool containsPointer() const override;
status_t emitVtsTypeDeclarations(Formatter &out) const override;
};
diff --git a/RefType.cpp b/RefType.cpp
index 34aa224..f2a3f7d 100644
--- a/RefType.cpp
+++ b/RefType.cpp
@@ -245,5 +245,9 @@
return false;
}
+bool RefType::containsPointer() const {
+ return true;
+}
+
} // namespace android
diff --git a/RefType.h b/RefType.h
index 3c91316..8fd2668 100644
--- a/RefType.h
+++ b/RefType.h
@@ -70,6 +70,7 @@
bool resultNeedsDeref() const override;
bool isJavaCompatible() const override;
+ bool containsPointer() const override;
private:
DISALLOW_COPY_AND_ASSIGN(RefType);
diff --git a/Scope.cpp b/Scope.cpp
index df8651b..aad55c9 100644
--- a/Scope.cpp
+++ b/Scope.cpp
@@ -180,6 +180,16 @@
return true;
}
+bool Scope::containsPointer() const {
+ for (const auto &type : mTypes) {
+ if (type->containsPointer()) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
void Scope::appendToExportedTypesVector(
std::vector<const Type *> *exportedTypes) const {
forEachType([&](Type *type) {
diff --git a/Scope.h b/Scope.h
index 0b34182..de53974 100644
--- a/Scope.h
+++ b/Scope.h
@@ -65,6 +65,7 @@
status_t emitVtsTypeDeclarations(Formatter &out) const override;
bool isJavaCompatible() const override;
+ bool containsPointer() const override;
void appendToExportedTypesVector(
std::vector<const Type *> *exportedTypes) const override;
diff --git a/Type.cpp b/Type.cpp
index 585afc9..8ad1ce5 100644
--- a/Type.cpp
+++ b/Type.cpp
@@ -450,8 +450,13 @@
return true;
}
-void Type::getAlignmentAndSize(size_t *, size_t *) const {
- CHECK(!"Should not be here");
+void Type::getAlignmentAndSize(
+ size_t * /* align */, size_t * /* size */) const {
+ CHECK(!"Should not be here.");
+}
+
+bool Type::containsPointer() const {
+ return false;
}
void Type::appendToExportedTypesVector(
diff --git a/Type.h b/Type.h
index ce2a03a..80401a1 100644
--- a/Type.h
+++ b/Type.h
@@ -215,7 +215,7 @@
// Returns true iff this type is supported through the Java backend.
virtual bool isJavaCompatible() const;
-
+ virtual bool containsPointer() const;
virtual void getAlignmentAndSize(size_t *align, size_t *size) const;
void setAnnotations(std::vector<Annotation *> *annotations);
diff --git a/VectorType.cpp b/VectorType.cpp
index b6267c6..6a0542e 100644
--- a/VectorType.cpp
+++ b/VectorType.cpp
@@ -736,6 +736,10 @@
return true;
}
+bool VectorType::containsPointer() const {
+ return mElementType->containsPointer();
+}
+
void VectorType::getAlignmentAndSize(size_t *align, size_t *size) const {
*align = 8; // hidl_vec<T>
*size = 16;
diff --git a/VectorType.h b/VectorType.h
index c267ba9..73ce814 100644
--- a/VectorType.h
+++ b/VectorType.h
@@ -121,6 +121,7 @@
bool resultNeedsDeref() const override;
bool isJavaCompatible() const override;
+ bool containsPointer() const override;
void getAlignmentAndSize(size_t *align, size_t *size) const override;