mirror of
https://github.com/revng/revng
synced 2026-06-21 14:07:57 +00:00
Do not recompute type sizes unnecessarily
This commit is contained in:
committed by
Pietro Fezzardi
parent
051d0198b5
commit
31bd61ba2b
@@ -461,11 +461,12 @@ std::set<uint64_t> model::Binary::collectAllTypeSizes() const {
|
||||
// support (which includes all the pointers sizes).
|
||||
std::set<uint64_t> ByteSizes = { 1, 2, 4, 8, 10, 12, 16 };
|
||||
|
||||
VerifyHelper SizeCache;
|
||||
for (const model::UpcastableTypeDefinition &Type : this->TypeDefinitions()) {
|
||||
// This takes care of all the type definitions, meaning we don't have to
|
||||
// look at defined types anymore.
|
||||
if (uint64_t ByteSize = Type->size().value_or(0))
|
||||
ByteSizes.insert(ByteSize);
|
||||
if (std::optional<uint64_t> MaybeSize = Type->size(SizeCache))
|
||||
ByteSizes.insert(MaybeSize.value());
|
||||
|
||||
for (const model::Type *Edge : Type->edges()) {
|
||||
// Since primitives, pointers and defined types are already taken care of,
|
||||
@@ -480,8 +481,8 @@ std::set<uint64_t> model::Binary::collectAllTypeSizes() const {
|
||||
Edge = Pointer->PointeeType().get();
|
||||
|
||||
} else if (const auto *Array = llvm::dyn_cast<model::ArrayType>(Edge)) {
|
||||
if (uint64_t ByteSize = Edge->trySize().value_or(0))
|
||||
ByteSizes.insert(ByteSize);
|
||||
if (std::optional<uint64_t> MaybeSize = Edge->trySize(SizeCache))
|
||||
ByteSizes.insert(MaybeSize.value());
|
||||
|
||||
// Keep going deeper on an array in case it's a nested one.
|
||||
Edge = Array->ElementType().get();
|
||||
@@ -495,10 +496,9 @@ std::set<uint64_t> model::Binary::collectAllTypeSizes() const {
|
||||
if (const auto *RFT = Type->getRawFunction()) {
|
||||
uint64_t ReturnTypeSize = 0;
|
||||
for (const auto &RV : RFT->ReturnValues()) {
|
||||
uint64_t ByteSize = RV.Type()->trySize().value_or(0);
|
||||
revng_assert(ByteSize);
|
||||
ByteSizes.insert(ByteSize);
|
||||
ReturnTypeSize += ByteSize;
|
||||
std::optional<uint64_t> MaybeSize = RV.Type()->trySize(SizeCache);
|
||||
revng_assert(MaybeSize.has_value());
|
||||
ReturnTypeSize += MaybeSize.value();
|
||||
}
|
||||
|
||||
if (ReturnTypeSize)
|
||||
|
||||
Reference in New Issue
Block a user