dc808f3fcb
When we are writing a snapshot, canonicalize all entries within CompressedStackMaps payloads. We do this by creating a global table of stack map information (bit counts + bit payload) that we store in the isolate object store, and then for each existing CSM, we replace it with an alternate version that refers to the global table. This gets back some of the canonicalization we lost when we moved from individual StackMap objects to per-Code CompressedStackMaps objects. Here, we also represent the global table as a CompressedStackMaps object. This means that there are three types of CompressedStackMaps: * The original version that directly contains all entry information. * The version where each entry is just the PC offset delta and an offset into the global table payload. * A version representing the global table where the entries are like the original version except they don't contain a PC offset delta. ----- The impact on AOT snapshot size when compiling the Flutter Gallery in release mode: armv7: Total size -0.88% (Isolate RO: -5.05%, Isolate snapshot: +0.00%) armv8: Total size -1.04% (Isolate RO: -5.28%, Isolate snapshot: +0.00%) ----- Bug: https://github.com/dart-lang/sdk/issues/35274 Change-Id: I1ce0f8b3cc58e2f11584f3c218e0fdf8984b799b Cq-Include-Trybots: luci.dart.try:vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-debug-simarm_x64-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/120667 Commit-Queue: Teagan Strickland <sstrickl@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com>
52 lines
1.3 KiB
C++
52 lines
1.3 KiB
C++
// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
#ifndef RUNTIME_VM_PROGRAM_VISITOR_H_
|
|
#define RUNTIME_VM_PROGRAM_VISITOR_H_
|
|
|
|
#include "vm/allocation.h"
|
|
|
|
namespace dart {
|
|
|
|
class Function;
|
|
class Class;
|
|
|
|
template <typename T>
|
|
class Visitor : public ValueObject {
|
|
public:
|
|
virtual ~Visitor() {}
|
|
virtual void Visit(const T& obj) = 0;
|
|
};
|
|
|
|
typedef Visitor<Function> FunctionVisitor;
|
|
typedef Visitor<Class> ClassVisitor;
|
|
|
|
class ProgramVisitor : public AllStatic {
|
|
public:
|
|
static void VisitFunctions(FunctionVisitor* visitor);
|
|
static void VisitClasses(ClassVisitor* visitor);
|
|
|
|
static void Dedup();
|
|
|
|
private:
|
|
#if !defined(DART_PRECOMPILED_RUNTIME)
|
|
static void BindStaticCalls();
|
|
static void ShareMegamorphicBuckets();
|
|
static void NormalizeAndDedupCompressedStackMaps();
|
|
static void DedupPcDescriptors();
|
|
static void DedupDeoptEntries();
|
|
#if defined(DART_PRECOMPILER)
|
|
static void DedupCatchEntryMovesMaps();
|
|
#endif
|
|
static void DedupCodeSourceMaps();
|
|
static void DedupLists();
|
|
static void DedupInstructions();
|
|
static void DedupInstructionsWithSameMetadata();
|
|
#endif // !defined(DART_PRECOMPILED_RUNTIME)
|
|
};
|
|
|
|
} // namespace dart
|
|
|
|
#endif // RUNTIME_VM_PROGRAM_VISITOR_H_
|